Allow symbol and label names to be enclosed in double quotes.
authorNick Clifton <nickc@redhat.com>
Fri, 21 Aug 2015 15:42:14 +0000 (16:42 +0100)
committerNick Clifton <nickc@redhat.com>
Fri, 21 Aug 2015 15:42:14 +0000 (16:42 +0100)
gas PR gas/18581
* expr.c (get_symbol_end): Rename to get_symbol_name.  Add a
return parameter pointing to the start of the symbol.  Allow
symbol names enclosed in double quotes.
(restore_line_pointer): New function.  Replace the NUL character
inserted into the input stream with the given character.  If the
character was a double quote, advance the input pointer.
* expr.h (get_symbol_end): Delete.
(get_symbol_name): Add prototype.
(restore_line_pointer): Prototype.
* read.h (SKIP_WHITESPACE_AFTER_NAME): New macro.
* doc/as.texinfo (Symbol Intro): Document that symbol names can
now be enclosed in double quotes.
* cond.c (s_ifdef): Replace get_symbol_end with get_symbol_name.
Use restore_line_pointer to replace the NUL in the input stream.
Use SKIP_WHITESPACE_AFTER_NAME to skip past the end of a symbol.
Check for the use of double quoted symbol names.
* expr.c: Likewise.
* config/obj-aout.c: Likewise.
* config/obj-coff-seh.c: Likewise.
* config/obj-coff.c: Likewise.
* config/obj-elf.c: Likewise.
* config/obj-evax.c: Likewise.
* config/obj-macho.c: Likewise.
* config/obj-som.c: Likewise.
* config/tc-alpha.c: Likewise.
* config/tc-arc.c: Likewise.
* config/tc-arm.c: Likewise.
* config/tc-dlx.c: Likewise.
* config/tc-h8300.c: Likewise.
* config/tc-hppa.c: Likewise.
* config/tc-i370.c: Likewise.
* config/tc-i386-intel.c: Likewise.
* config/tc-i386.c: Likewise.
* config/tc-i960.c: Likewise.
* config/tc-ia64.c: Likewise.
* config/tc-iq2000.c: Likewise.
* config/tc-m32r.c: Likewise.
* config/tc-m68hc11.c: Likewise.
* config/tc-m68k.c: Likewise.
* config/tc-microblaze.c: Likewise.
* config/tc-mips.c: Likewise.
* config/tc-mmix.c: Likewise.
* config/tc-mn10200.c: Likewise.
* config/tc-mn10300.c: Likewise.
* config/tc-nios2.c: Likewise.
* config/tc-ppc.c: Likewise.
* config/tc-s390.c: Likewise.
* config/tc-score.c: Likewise.
* config/tc-score7.c: Likewise.
* config/tc-sparc.c: Likewise.
* config/tc-tic4x.c: Likewise.
* config/tc-tic54x.c: Likewise.
* config/tc-tic6x.c: Likewise.
* config/tc-tilegx.c: Likewise.
* config/tc-tilepro.c: Likewise.
* config/tc-v850.c: Likewise.
* config/tc-xtensa.c: Likewise.
* config/tc-z80.c: Likewise.
* dw2gencfi.c: Likewise.
* dwarf2dbgc.: Likewise.
* ecoff.c: Likewise.
* read.c: Likewise.
* stabs.c: Likewise.

tests PR gas/18581
* gas/all/byte.d: Disable this test.  Quoted expressions
are now allowed in .byte directives.
* gas/all/quoted-sym-names.s: New test.
* gas/all/quoted-sym-names.d: Expected output.
* gas/all/gas.exp: Run the new test.

59 files changed:
gas/ChangeLog
gas/NEWS
gas/cond.c
gas/config/obj-aout.c
gas/config/obj-coff-seh.c
gas/config/obj-coff.c
gas/config/obj-elf.c
gas/config/obj-evax.c
gas/config/obj-macho.c
gas/config/obj-som.c
gas/config/tc-alpha.c
gas/config/tc-arc.c
gas/config/tc-arm.c
gas/config/tc-dlx.c
gas/config/tc-h8300.c
gas/config/tc-hppa.c
gas/config/tc-i370.c
gas/config/tc-i386-intel.c
gas/config/tc-i386.c
gas/config/tc-i960.c
gas/config/tc-ia64.c
gas/config/tc-iq2000.c
gas/config/tc-m32r.c
gas/config/tc-m68hc11.c
gas/config/tc-m68k.c
gas/config/tc-microblaze.c
gas/config/tc-mips.c
gas/config/tc-mmix.c
gas/config/tc-mn10200.c
gas/config/tc-mn10300.c
gas/config/tc-nios2.c
gas/config/tc-ppc.c
gas/config/tc-s390.c
gas/config/tc-score.c
gas/config/tc-score7.c
gas/config/tc-sparc.c
gas/config/tc-tic4x.c
gas/config/tc-tic54x.c
gas/config/tc-tic6x.c
gas/config/tc-tilegx.c
gas/config/tc-tilepro.c
gas/config/tc-v850.c
gas/config/tc-xtensa.c
gas/config/tc-z80.c
gas/doc/as.texinfo
gas/dw2gencfi.c
gas/dwarf2dbg.c
gas/ecoff.c
gas/expr.c
gas/expr.h
gas/read.c
gas/read.h
gas/stabs.c
gas/testsuite/ChangeLog
gas/testsuite/gas/all/byte.d
gas/testsuite/gas/all/gas.exp
gas/testsuite/gas/all/quoted-sym-names.d [new file with mode: 0644]
gas/testsuite/gas/all/quoted-sym-names.s [new file with mode: 0644]
gas/testsuite/gas/ia64/group-1.d

index 57149821779a3afbd43fc0666825fb83c35a5069..3bcd8e6d5279c38a2c005c0a638907abbf432c17 100644 (file)
@@ -1,3 +1,70 @@
+2015-08-21  Nick Clifton  <nickc@redhat.com>
+
+       PR gas/18581
+       * expr.c (get_symbol_end): Rename to get_symbol_name.  Add a
+       return parameter pointing to the start of the symbol.  Allow
+       symbol names enclosed in double quotes.
+       (restore_line_pointer): New function.  Replace the NUL character
+       inserted into the input stream with the given character.  If the
+       character was a double quote, advance the input pointer.
+       * expr.h (get_symbol_end): Delete.
+       (get_symbol_name): Add prototype.
+       (restore_line_pointer): Prototype.
+       * read.h (SKIP_WHITESPACE_AFTER_NAME): New macro.
+       * doc/as.texinfo (Symbol Intro): Document that symbol names can
+       now be enclosed in double quotes.
+       * cond.c (s_ifdef): Replace get_symbol_end with get_symbol_name.
+       Use restore_line_pointer to replace the NUL in the input stream.
+       Use SKIP_WHITESPACE_AFTER_NAME to skip past the end of a symbol.
+       Check for the use of double quoted symbol names.
+       * expr.c: Likewise.
+       * config/obj-aout.c: Likewise.
+       * config/obj-coff-seh.c: Likewise.
+       * config/obj-coff.c: Likewise.
+       * config/obj-elf.c: Likewise.
+       * config/obj-evax.c: Likewise.
+       * config/obj-macho.c: Likewise.
+       * config/obj-som.c: Likewise.
+       * config/tc-alpha.c: Likewise.
+       * config/tc-arc.c: Likewise.
+       * config/tc-arm.c: Likewise.
+       * config/tc-dlx.c: Likewise.
+       * config/tc-h8300.c: Likewise.
+       * config/tc-hppa.c: Likewise.
+       * config/tc-i370.c: Likewise.
+       * config/tc-i386-intel.c: Likewise.
+       * config/tc-i386.c: Likewise.
+       * config/tc-i960.c: Likewise.
+       * config/tc-ia64.c: Likewise.
+       * config/tc-iq2000.c: Likewise.
+       * config/tc-m32r.c: Likewise.
+       * config/tc-m68hc11.c: Likewise.
+       * config/tc-m68k.c: Likewise.
+       * config/tc-microblaze.c: Likewise.
+       * config/tc-mips.c: Likewise.
+       * config/tc-mmix.c: Likewise.
+       * config/tc-mn10200.c: Likewise.
+       * config/tc-mn10300.c: Likewise.
+       * config/tc-nios2.c: Likewise.
+       * config/tc-ppc.c: Likewise.
+       * config/tc-s390.c: Likewise.
+       * config/tc-score.c: Likewise.
+       * config/tc-score7.c: Likewise.
+       * config/tc-sparc.c: Likewise.
+       * config/tc-tic4x.c: Likewise.
+       * config/tc-tic54x.c: Likewise.
+       * config/tc-tic6x.c: Likewise.
+       * config/tc-tilegx.c: Likewise.
+       * config/tc-tilepro.c: Likewise.
+       * config/tc-v850.c: Likewise.
+       * config/tc-xtensa.c: Likewise.
+       * config/tc-z80.c: Likewise.
+       * dw2gencfi.c: Likewise.
+       * dwarf2dbgc.: Likewise.
+       * ecoff.c: Likewise.
+       * read.c: Likewise.
+       * stabs.c: Likewise.
+
 2015-08-19  Jiong Wang  <jiong.wang@arm.com>
 
        * config/tc-aarch64.c (reloc_table): New relocation types support for
index 02a8d00943b87088f0b82b739a3cbd3a51436ed4..13a1911df406222c7d0df9c3192ab004f3ecea46 100644 (file)
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -2,6 +2,10 @@
 
 Changes in 2.26:
 
+* Symbol and label names can now be enclosed in double quotes (") which allows
+  them to contain characters that are not part of valid symbol names in high
+  level languages.
+
 * Added the correctly spelled -march=armv6kz, for ARMv6KZ support.  The
   previous spelling, -march=armv6zk, is still accepted.
 
index 26499763efebde2c296100a4f132ebe3c79b2c5a..e3b30f040207dc4e4010f9f7d656db77ae3e559a 100644 (file)
@@ -77,7 +77,7 @@ s_ifdef (int test_defined)
   SKIP_WHITESPACE ();
   name = input_line_pointer;
 
-  if (!is_name_beginner (*name))
+  if (!is_name_beginner (*name) && *name != '"')
     {
       as_bad (_("invalid identifier for \".ifdef\""));
       obstack_1grow (&cond_obstack, 0);
@@ -85,9 +85,9 @@ s_ifdef (int test_defined)
       return;
     }
 
-  c = get_symbol_end ();
+  c = get_symbol_name (& name);
   symbolP = symbol_find (name);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   initialize_cframe (&cframe);
 
index 5500ac9bc3acdfdbc9665b96950d009fbac94c72..401b3a73cf48941315fa49877466f19a8375716d 100644 (file)
@@ -152,10 +152,9 @@ obj_aout_weak (int ignore ATTRIBUTE_UNUSED)
 
   do
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       symbolP = symbol_find_or_make (name);
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
       SKIP_WHITESPACE ();
       S_SET_WEAK (symbolP);
       if (c == ',')
@@ -182,10 +181,9 @@ obj_aout_type (int ignore ATTRIBUTE_UNUSED)
   int c;
   symbolS *sym;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   sym = symbol_find_or_make (name);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
   SKIP_WHITESPACE ();
   if (*input_line_pointer == ',')
     {
index 2ffefa86ec54a55ccd6656f479563767fe175c64..ec5358571e7816b5dde628f167693b7ab27a5614 100644 (file)
@@ -329,8 +329,7 @@ obj_coff_seh_handler (int what ATTRIBUTE_UNUSED)
 
   if (*input_line_pointer == '@')
     {
-      symbol_name = input_line_pointer;
-      name_end = get_symbol_end ();
+      name_end = get_symbol_name (&symbol_name);
 
       seh_ctx_cur->handler.X_op = O_constant;
       seh_ctx_cur->handler.X_add_number = 0;
@@ -343,7 +342,7 @@ obj_coff_seh_handler (int what ATTRIBUTE_UNUSED)
       else
        as_bad (_("unknown constant value '%s' for handler"), symbol_name);
 
-      *input_line_pointer = name_end;
+      (void) restore_line_pointer (name_end);
     }
   else
     expression (&seh_ctx_cur->handler);
@@ -359,8 +358,7 @@ obj_coff_seh_handler (int what ATTRIBUTE_UNUSED)
     {
       do
        {
-         symbol_name = input_line_pointer;
-         name_end = get_symbol_end ();
+         name_end = get_symbol_name (&symbol_name);
 
          if (strcasecmp (symbol_name, "@unwind") == 0)
            seh_ctx_cur->handler_flags |= UNW_FLAG_UHANDLER;
@@ -369,7 +367,7 @@ obj_coff_seh_handler (int what ATTRIBUTE_UNUSED)
          else
            as_bad (_(".seh_handler constant '%s' unknown"), symbol_name);
 
-         *input_line_pointer = name_end;
+         (void) restore_line_pointer (name_end);
        }
       while (skip_whitespace_and_comma (0));
     }
@@ -454,10 +452,9 @@ obj_coff_seh_proc (int what ATTRIBUTE_UNUSED)
 
   SKIP_WHITESPACE ();
 
-  symbol_name = input_line_pointer;
-  name_end = get_symbol_end ();
+  name_end = get_symbol_name (&symbol_name);
   seh_ctx_cur->func_name = xstrdup (symbol_name);
-  *input_line_pointer = name_end;
+  (void) restore_line_pointer (name_end);
 
   demand_empty_rest_of_line ();
 
@@ -549,14 +546,13 @@ seh_x64_read_reg (const char *directive, int kind)
   SKIP_WHITESPACE ();
   if (*input_line_pointer == '%')
     ++input_line_pointer;
-  symbol_name = input_line_pointer;
-  name_end = get_symbol_end ();
+  name_end = get_symbol_name (& symbol_name);
 
   for (i = 0; i < 16; i++)
     if (! strcasecmp (regs[i], symbol_name))
       break;
 
-  *input_line_pointer = name_end;
+  (void) restore_line_pointer (name_end);
 
   /* Error if register not found, or EAX used as a frame pointer.  */
   if (i == 16 || (kind == 0 && i == 0))
index 449cb4fa5717aa569416364879f518d27db27ffb..c0a3f1fbc52be3fd2b255e7a547c68433c03e1bc 100644 (file)
@@ -603,8 +603,7 @@ obj_coff_def (int what ATTRIBUTE_UNUSED)
 
   SKIP_WHITESPACES ();
 
-  symbol_name = input_line_pointer;
-  name_end = get_symbol_end ();
+  name_end = get_symbol_name (&symbol_name);
   symbol_name_length = strlen (symbol_name);
   symbol_name_copy = xmalloc (symbol_name_length + 1);
   strcpy (symbol_name_copy, symbol_name);
@@ -620,7 +619,7 @@ obj_coff_def (int what ATTRIBUTE_UNUSED)
   if (S_IS_STRING (def_symbol_in_progress))
     SF_SET_STRING (def_symbol_in_progress);
 
-  *input_line_pointer = name_end;
+  (void) restore_line_pointer (name_end);
 
   demand_empty_rest_of_line ();
 }
@@ -973,8 +972,7 @@ obj_coff_tag (int ignore ATTRIBUTE_UNUSED)
     }
 
   S_SET_NUMBER_AUXILIARY (def_symbol_in_progress, 1);
-  symbol_name = input_line_pointer;
-  name_end = get_symbol_end ();
+  name_end = get_symbol_name (&symbol_name);
 
 #ifdef tc_canonicalize_symbol_name
   symbol_name = tc_canonicalize_symbol_name (symbol_name);
@@ -988,8 +986,8 @@ obj_coff_tag (int ignore ATTRIBUTE_UNUSED)
     as_warn (_("tag not found for .tag %s"), symbol_name);
 
   SF_SET_TAGGED (def_symbol_in_progress);
-  *input_line_pointer = name_end;
 
+  (void) restore_line_pointer (name_end);
   demand_empty_rest_of_line ();
 }
 
@@ -1024,11 +1022,11 @@ obj_coff_val (int ignore ATTRIBUTE_UNUSED)
 
   if (is_name_beginner (*input_line_pointer))
     {
-      char *symbol_name = input_line_pointer;
-      char name_end = get_symbol_end ();
+      char *symbol_name;
+      char name_end = get_symbol_name (&symbol_name);
 
 #ifdef tc_canonicalize_symbol_name
-  symbol_name = tc_canonicalize_symbol_name (symbol_name);
+      symbol_name = tc_canonicalize_symbol_name (symbol_name);
 #endif
       if (streq (symbol_name, "."))
        {
@@ -1059,7 +1057,7 @@ obj_coff_val (int ignore ATTRIBUTE_UNUSED)
        }
       /* Otherwise, it is the name of a non debug symbol and its value
          will be calculated later.  */
-      *input_line_pointer = name_end;
+      (void) restore_line_pointer (name_end);
     }
   else
     {
@@ -1170,8 +1168,7 @@ obj_coff_weak (int ignore ATTRIBUTE_UNUSED)
 
   do
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       if (*name == 0)
        {
          as_warn (_("badly formed .weak directive ignored"));
@@ -1181,7 +1178,7 @@ obj_coff_weak (int ignore ATTRIBUTE_UNUSED)
       c = 0;
       symbolP = symbol_find_or_make (name);
       *input_line_pointer = c;
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
       S_SET_WEAK (symbolP);
 
       if (c == ',')
@@ -1564,15 +1561,11 @@ obj_coff_section (int ignore ATTRIBUTE_UNUSED)
       return;
     }
 
-  section_name = input_line_pointer;
-  c = get_symbol_end ();
-
+  c = get_symbol_name (&section_name);
   name = xmalloc (input_line_pointer - section_name + 1);
   strcpy (name, section_name);
-
   *input_line_pointer = c;
-
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
 
   exp = 0;
   flags = SEC_NO_FLAGS;
index 08ae85384e8426663fc21f5539d99eed22c03dc1..031fafb91b406872c83da9041721b627b35f7032 100644 (file)
@@ -406,11 +406,10 @@ get_sym_from_input_line_and_check (void)
   char c;
   symbolS *sym;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (& name);
   sym = symbol_find_or_make (name);
   *input_line_pointer = c;
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
 
   /* There is no symbol name if input_line_pointer has not moved.  */
   if (name == input_line_pointer)
@@ -1043,9 +1042,9 @@ obj_elf_section (int push)
                }
              else if (c == '@' || c == '%')
                {
-                 beg = ++input_line_pointer;
-                 c = get_symbol_end ();
-                 *input_line_pointer = c;
+                 ++input_line_pointer;
+                 c = get_symbol_name (& beg);
+                 (void) restore_line_pointer (c);
                  type = obj_elf_section_type (beg, input_line_pointer - beg, TRUE);
                }
              else
@@ -1125,9 +1124,9 @@ obj_elf_section (int push)
                  ignore_rest_of_line ();
                  return;
                }
-             beg = ++input_line_pointer;
-             c = get_symbol_end ();
-             *input_line_pointer = c;
+             ++input_line_pointer;
+             c = get_symbol_name (& beg);
+             (void) restore_line_pointer (c);
 
              attr |= obj_elf_section_word (beg, input_line_pointer - beg, & type);
 
@@ -1319,19 +1318,18 @@ obj_elf_symver (int ignore ATTRIBUTE_UNUSED)
 
   ++input_line_pointer;
   SKIP_WHITESPACE ();
-  name = input_line_pointer;
 
   /* Temporarily include '@' in symbol names.  */
   old_lexat = lex_type[(unsigned char) '@'];
   lex_type[(unsigned char) '@'] |= LEX_NAME;
-  c = get_symbol_end ();
+  c = get_symbol_name (& name);
   lex_type[(unsigned char) '@'] = old_lexat;
 
   if (symbol_get_obj (sym)->versioned_name == NULL)
     {
       symbol_get_obj (sym)->versioned_name = xstrdup (name);
 
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
 
       if (strchr (symbol_get_obj (sym)->versioned_name,
                  ELF_VER_CHR) == NULL)
@@ -1354,7 +1352,7 @@ obj_elf_symver (int ignore ATTRIBUTE_UNUSED)
          return;
        }
 
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
     }
 
   demand_empty_rest_of_line ();
@@ -1374,8 +1372,7 @@ obj_elf_vtable_inherit (int ignore ATTRIBUTE_UNUSED)
   if (*input_line_pointer == '#')
     ++input_line_pointer;
 
-  cname = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (& cname);
   csym = symbol_find (cname);
 
   /* GCFIXME: should check that we don't have two .vtable_inherits for
@@ -1391,7 +1388,7 @@ obj_elf_vtable_inherit (int ignore ATTRIBUTE_UNUSED)
 
   *input_line_pointer = c;
 
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
   if (*input_line_pointer != ',')
     {
       as_bad (_("expected comma after name in .vtable_inherit"));
@@ -1414,10 +1411,9 @@ obj_elf_vtable_inherit (int ignore ATTRIBUTE_UNUSED)
     }
   else
     {
-      pname = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (& pname);
       psym = symbol_find_or_make (pname);
-      *input_line_pointer = c;
+      restore_line_pointer (c);
     }
 
   demand_empty_rest_of_line ();
@@ -1767,15 +1763,15 @@ obj_elf_version (int ignore ATTRIBUTE_UNUSED)
 static void
 obj_elf_size (int ignore ATTRIBUTE_UNUSED)
 {
-  char *name = input_line_pointer;
-  char c = get_symbol_end ();
+  char *name;
+  char c = get_symbol_name (&name);
   char *p;
   expressionS exp;
   symbolS *sym;
 
   p = input_line_pointer;
   *p = c;
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
   if (*input_line_pointer != ',')
     {
       *p = 0;
@@ -1847,7 +1843,7 @@ obj_elf_type_name (char *cp)
       *input_line_pointer = '\0';
     }
   else
-    *cp = get_symbol_end ();
+    *cp = get_symbol_name (&p);
 
   return p;
 }
index b3702efb97fb5cff0e308bbbff8c12df95e742e6..b712e1333c9cb9db6f689295cbd94f0047817caa 100644 (file)
@@ -60,10 +60,9 @@ s_evax_weak (int ignore ATTRIBUTE_UNUSED)
 
   do
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       symbolP = symbol_find_or_make (name);
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
       SKIP_WHITESPACE ();
       S_SET_WEAK (symbolP);
       if (c == ',')
index 10e8dbf27f1b7e291fd7e92859f1619013596d7e..d0a405326bdcbf07970cea04b645531ccd9924b2 100644 (file)
@@ -475,8 +475,7 @@ obj_mach_o_zerofill (int ignore ATTRIBUTE_UNUSED)
 
       input_line_pointer++; /* Skip ',' */
       SKIP_WHITESPACE ();
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       /* Just after name is now '\0'.  */
       p = input_line_pointer;
       *p = c;
@@ -488,7 +487,7 @@ obj_mach_o_zerofill (int ignore ATTRIBUTE_UNUSED)
          goto done;
        }
 
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
       if (*input_line_pointer == ',')
        input_line_pointer++;
 
@@ -1133,12 +1132,11 @@ obj_mach_o_sym_qual (int ntype)
 
   do
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       symbolP = symbol_find_or_make (name);
       obj_mach_o_set_symbol_qualifier (symbolP, ntype);
       *input_line_pointer = c;
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
       c = *input_line_pointer;
       if (c == ',')
        {
@@ -1184,8 +1182,8 @@ obj_mach_o_indirect_symbol (int arg ATTRIBUTE_UNUSED)
       case BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS:
         {
           obj_mach_o_indirect_sym *isym;
-         char *name = input_line_pointer;
-         char c = get_symbol_end ();
+         char *name;
+         char c = get_symbol_name (&name);
          symbolS *sym = symbol_find_or_make (name);
          unsigned int elsize =
                        bfd_mach_o_section_get_entry_size (stdoutput, sec);
@@ -1195,11 +1193,11 @@ obj_mach_o_indirect_symbol (int arg ATTRIBUTE_UNUSED)
              as_bad (_("attempt to add an indirect_symbol to a stub or"
                        " reference section with a zero-sized element at %s"),
                        name);
-             *input_line_pointer = c;
+             (void) restore_line_pointer (c);
              ignore_rest_of_line ();
              return;
-         }
-         *input_line_pointer = c;
+           }
+         (void) restore_line_pointer (c);
 
          /* The indirect symbols are validated after the symbol table is
             frozen, we must make sure that if a local symbol is used as an
index b085b89455ea0a488ef712d770edb4fe0f7a831f..1b87de5487ea9674cbaef7980779c4bc13525af5 100644 (file)
@@ -302,11 +302,10 @@ obj_som_weak (int ignore ATTRIBUTE_UNUSED)
 
   do
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       symbolP = symbol_find_or_make (name);
       *input_line_pointer = c;
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
       S_SET_WEAK (symbolP);
       if (c == ',')
        {
index a19fbc5a931a8a7f8bb066b92ba93cf669505aae..5762e41d85a52319510bde83aa4a7c4453969589 100644 (file)
@@ -921,8 +921,7 @@ tokenize_arguments (char *str,
 
          ++input_line_pointer;
          SKIP_WHITESPACE ();
-         p = input_line_pointer;
-         c = get_symbol_end ();
+         c = get_symbol_name (&p);
 
          /* Parse !relocation_type.  */
          len = input_line_pointer - p;
@@ -943,7 +942,7 @@ tokenize_arguments (char *str,
            }
 
          *input_line_pointer = c;
-         SKIP_WHITESPACE ();
+         SKIP_WHITESPACE_AFTER_NAME ();
          if (*input_line_pointer != '!')
            {
              if (r->require_seq)
@@ -3494,14 +3493,13 @@ s_alpha_comm (int ignore ATTRIBUTE_UNUSED)
   int log_align = 0;
 #endif
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
 
   /* Just after name is now '\0'.  */
   p = input_line_pointer;
   *p = c;
 
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
 
   /* Alpha OSF/1 compiler doesn't provide the comma, gcc does.  */
   if (*input_line_pointer == ',')
@@ -3714,15 +3712,15 @@ s_alpha_ent (int dummy ATTRIBUTE_UNUSED)
   else
     {
       char *name, name_end;
-      name = input_line_pointer;
-      name_end = get_symbol_end ();
+
+      name_end = get_symbol_name (&name);
       /* CFI_EMIT_eh_frame is the default.  */
       all_cfi_sections = CFI_EMIT_eh_frame;
 
       if (! is_name_beginner (*name))
        {
          as_warn (_(".ent directive has no name"));
-         *input_line_pointer = name_end;
+         (void) restore_line_pointer (name_end);
        }
       else
        {
@@ -3748,7 +3746,7 @@ s_alpha_ent (int dummy ATTRIBUTE_UNUSED)
          /* The .ent directive is sometimes followed by a number.  Not sure
             what it really means, but ignore it.  */
          *input_line_pointer = name_end;
-         SKIP_WHITESPACE ();
+         SKIP_WHITESPACE_AFTER_NAME ();
          if (*input_line_pointer == ',')
            {
              input_line_pointer++;
@@ -3769,13 +3767,12 @@ s_alpha_end (int dummy ATTRIBUTE_UNUSED)
   else
     {
       char *name, name_end;
-      name = input_line_pointer;
-      name_end = get_symbol_end ();
+
+      name_end = get_symbol_name (&name);
 
       if (! is_name_beginner (*name))
        {
          as_warn (_(".end directive has no name"));
-         *input_line_pointer = name_end;
        }
       else
        {
@@ -3803,9 +3800,9 @@ s_alpha_end (int dummy ATTRIBUTE_UNUSED)
            }
 
          cur_frame_data = NULL;
-
-         *input_line_pointer = name_end;
        }
+
+      (void) restore_line_pointer (name_end);
       demand_empty_rest_of_line ();
     }
 }
@@ -4130,19 +4127,20 @@ s_alpha_usepv (int unused ATTRIBUTE_UNUSED)
   symbolS *sym;
   int other;
 
-  name = input_line_pointer;
-  name_end = get_symbol_end ();
+  name_end = get_symbol_name (&name);
 
   if (! is_name_beginner (*name))
     {
       as_bad (_(".usepv directive has no name"));
-      *input_line_pointer = name_end;
+      (void) restore_line_pointer (name_end);
       ignore_rest_of_line ();
       return;
     }
 
   sym = symbol_find_or_make (name);
-  *input_line_pointer++ = name_end;
+  name_end = restore_line_pointer (name_end);
+  if (! is_end_of_line[(unsigned char) name_end])
+    input_line_pointer++;
 
   if (name_end != ',')
     {
@@ -4152,8 +4150,8 @@ s_alpha_usepv (int unused ATTRIBUTE_UNUSED)
     }
 
   SKIP_WHITESPACE ();
-  which = input_line_pointer;
-  which_end = get_symbol_end ();
+
+  which_end = get_symbol_name (&which);
 
   if (strcmp (which, "no") == 0)
     other = STO_ALPHA_NOPV;
@@ -4165,7 +4163,7 @@ s_alpha_usepv (int unused ATTRIBUTE_UNUSED)
       other = 0;
     }
 
-  *input_line_pointer = which_end;
+  (void) restore_line_pointer (which_end);
   demand_empty_rest_of_line ();
 
   S_SET_OTHER (sym, other | (S_GET_OTHER (sym) & ~STO_ALPHA_STD_GPLOAD));
@@ -4319,15 +4317,15 @@ s_alpha_section (int secid)
              char c;
 
              SKIP_WHITESPACE ();
-             beg = input_line_pointer;
-             c = get_symbol_end ();
+             c = get_symbol_name (&beg);
              *input_line_pointer = c;
 
              vms_flags |= s_alpha_section_word (beg, input_line_pointer - beg);
 
-             SKIP_WHITESPACE ();
+             SKIP_WHITESPACE_AFTER_NAME ();
            }
          while (*input_line_pointer++ == ',');
+
          --input_line_pointer;
         }
 
@@ -4411,13 +4409,12 @@ s_alpha_handler (int is_data)
   else
     {
       char *name, name_end;
-      name = input_line_pointer;
-      name_end = get_symbol_end ();
+
+      name_end = get_symbol_name (&name);
 
       if (! is_name_beginner (*name))
        {
          as_warn (_(".handler directive has no name"));
-         *input_line_pointer = name_end;
        }
       else
        {
@@ -4426,9 +4423,11 @@ s_alpha_handler (int is_data)
          sym = symbol_find_or_make (name);
          symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
          alpha_evax_proc->handler = sym;
-         *input_line_pointer = name_end;
        }
-      }
+
+      (void) restore_line_pointer (name_end);
+    }
+
   demand_empty_rest_of_line ();
 }
 
@@ -4547,8 +4546,7 @@ s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
     }
 
   SKIP_WHITESPACE ();
-  name = input_line_pointer;
-  name_end = get_symbol_end ();
+  name_end = get_symbol_name (&name);
 
   if (strncmp (name, "stack", 5) == 0)
     alpha_evax_proc->pdsckind = PDSC_S_K_KIND_FP_STACK;
@@ -4561,12 +4559,13 @@ s_alpha_pdesc (int ignore ATTRIBUTE_UNUSED)
 
   else
     {
+      (void) restore_line_pointer (name_end);
       as_fatal (_("unknown procedure kind"));
       demand_empty_rest_of_line ();
       return;
     }
 
-  *input_line_pointer = name_end;
+  (void) restore_line_pointer (name_end);
   demand_empty_rest_of_line ();
 
 #ifdef md_flush_pending_output
@@ -4804,10 +4803,11 @@ s_alpha_fmask (int ignore ATTRIBUTE_UNUSED)
 static void
 s_alpha_end (int ignore ATTRIBUTE_UNUSED)
 {
+  char *name;
   char c;
 
-  c = get_symbol_end ();
-  *input_line_pointer = c;
+  c = get_symbol_name (&name);
+  (void) restore_line_pointer (c);
   demand_empty_rest_of_line ();
   alpha_evax_proc = NULL;
 }
@@ -4938,12 +4938,11 @@ s_alpha_proc (int is_static ATTRIBUTE_UNUSED)
 
   /* Takes ".proc name,nargs".  */
   SKIP_WHITESPACE ();
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   p = input_line_pointer;
   symbolP = symbol_find_or_make (name);
   *p = c;
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
   if (*input_line_pointer != ',')
     {
       *p = 0;
@@ -4973,9 +4972,8 @@ s_alpha_set (int x ATTRIBUTE_UNUSED)
   int yesno = 1;
 
   SKIP_WHITESPACE ();
-  name = input_line_pointer;
-  ch = get_symbol_end ();
 
+  ch = get_symbol_name (&name);
   s = name;
   if (s[0] == 'n' && s[1] == 'o')
     {
@@ -4995,7 +4993,7 @@ s_alpha_set (int x ATTRIBUTE_UNUSED)
   else
     as_warn (_("Tried to .set unrecognized mode `%s'"), name);
 
-  *input_line_pointer = ch;
+  (void) restore_line_pointer (ch);
   demand_empty_rest_of_line ();
 }
 
@@ -5130,8 +5128,8 @@ s_alpha_arch (int ignored ATTRIBUTE_UNUSED)
   const struct cpu_type *p;
 
   SKIP_WHITESPACE ();
-  name = input_line_pointer;
-  ch = get_symbol_end ();
+
+  ch = get_symbol_name (&name);
 
   for (p = cpu_types; p->name; ++p)
     if (strcmp (name, p->name) == 0)
@@ -5142,7 +5140,7 @@ s_alpha_arch (int ignored ATTRIBUTE_UNUSED)
   as_warn (_("Unknown CPU identifier `%s'"), name);
 
 found:
-  *input_line_pointer = ch;
+  (void) restore_line_pointer (ch);
   demand_empty_rest_of_line ();
 }
 \f
@@ -6334,8 +6332,8 @@ tc_get_register (int frame ATTRIBUTE_UNUSED)
   SKIP_WHITESPACE ();
   if (*input_line_pointer == '$')
     {
-      char *s = input_line_pointer;
-      char c = get_symbol_end ();
+      char *s;
+      char c = get_symbol_name (&s);
       symbolS *sym = md_undefined_symbol (s);
 
       *strchr (s, '\0') = c;
index df3ed1f0d22358ad89b87feb995e11a94cc95adc..4806ed82ed849a5fa500f3c66e58d98a60766162 100644 (file)
@@ -410,8 +410,7 @@ arc_extoper (int opertype)
   segT old_sec;
   int old_subsec;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   name = xstrdup (name);
 
   p = name;
@@ -423,7 +422,7 @@ arc_extoper (int opertype)
 
   /* just after name is now '\0'  */
   p = input_line_pointer;
-  *p = c;
+  (void) restore_line_pointer (c);
   SKIP_WHITESPACE ();
 
   if (*input_line_pointer != ',')
@@ -653,15 +652,14 @@ arc_extinst (int ignore ATTRIBUTE_UNUSED)
   segT old_sec;
   int old_subsec;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   name = xstrdup (name);
   strcpy (syntax, name);
   name_len = strlen (name);
 
   /* just after name is now '\0'  */
   p = input_line_pointer;
-  *p = c;
+  (void) restore_line_pointer (c);
 
   SKIP_WHITESPACE ();
 
@@ -849,11 +847,10 @@ arc_common (int localScope)
   int align, size;
   symbolS *symbolP;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   /* just after name is now '\0'  */
   p = input_line_pointer;
-  *p = c;
+  (void) restore_line_pointer (c);
   SKIP_WHITESPACE ();
 
   if (*input_line_pointer != ',')
@@ -959,10 +956,9 @@ arc_option (int ignore ATTRIBUTE_UNUSED)
   char c;
   char *cpu;
 
-  cpu = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&cpu);
   mach = arc_get_mach (cpu);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   /* If an instruction has already been seen, it's too late.  */
   if (cpu_tables_init_p)
index e54b81be3f74797872e41f780335e4c81b2e359a..68581cbee42d0269d5571f61cf75da24295eb241 100644 (file)
@@ -2868,10 +2868,9 @@ s_thumb_set (int equiv)
   /* Especial apologies for the random logic:
      This just grew, and could be parsed much more simply!
      Dean - in haste.  */
-  name     = input_line_pointer;
-  delim            = get_symbol_end ();
+  delim            = get_symbol_name (& name);
   end_name  = input_line_pointer;
-  *end_name = delim;
+  (void) restore_line_pointer (delim);
 
   if (*input_line_pointer != ',')
     {
@@ -2951,8 +2950,7 @@ s_syntax (int unused ATTRIBUTE_UNUSED)
 {
   char *name, delim;
 
-  name = input_line_pointer;
-  delim = get_symbol_end ();
+  delim = get_symbol_name (& name);
 
   if (!strcasecmp (name, "unified"))
     unified_syntax = TRUE;
@@ -2963,7 +2961,7 @@ s_syntax (int unused ATTRIBUTE_UNUSED)
       as_bad (_("unrecognized syntax mode \"%s\""), name);
       return;
     }
-  *input_line_pointer = delim;
+  (void) restore_line_pointer (delim);
   demand_empty_rest_of_line ();
 }
 
@@ -3880,9 +3878,10 @@ s_arm_unwind_personality (int ignored ATTRIBUTE_UNUSED)
   if (unwind.personality_routine || unwind.personality_index != -1)
     as_bad (_("duplicate .personality directive"));
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (& name);
   p = input_line_pointer;
+  if (c == '"')
+    ++ input_line_pointer;
   unwind.personality_routine = symbol_find_or_make (name);
   *p = c;
   demand_empty_rest_of_line ();
index a0a6021b0e137d5f8c05a60ca348f47a591d8f53..955a457212a34b6d4d3a11dfbb526e9d53a8f0e3 100644 (file)
@@ -230,11 +230,10 @@ s_proc (int end_p)
          return;
        }
 
-      name = input_line_pointer;
-      delim1 = get_symbol_end ();
+      delim1 = get_symbol_name (&name);
       name = xstrdup (name);
       *input_line_pointer = delim1;
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
 
       if (*input_line_pointer != ',')
        {
@@ -257,10 +256,9 @@ s_proc (int end_p)
        {
          ++input_line_pointer;
          SKIP_WHITESPACE ();
-         label = input_line_pointer;
-         delim2 = get_symbol_end ();
+         delim2 = get_symbol_name (&label);
          label = xstrdup (label);
-         *input_line_pointer = delim2;
+         (void) restore_line_pointer (delim2);
        }
 
       current_name = name;
index 9609f2b0c96868bd7d39d3b237d881ec22297d49..04aa2834706f861547652cb8034b62e3c27f40c8 100644 (file)
@@ -384,7 +384,7 @@ parse_reg (char *src, op_type *mode, unsigned int *reg, int direction)
   char *end;
   int len;
 
-  /* Cribbed from get_symbol_end.  */
+  /* Cribbed from get_symbol_name.  */
   if (!is_name_beginner (*src) || *src == '\001')
     return 0;
   end = src + 1;
index 06e222db0a90193d5269f61dd237b86a80ae3976..da17a29da29af0b4ddf8d4801e0b74cd756e7a87 100644 (file)
@@ -5894,33 +5894,28 @@ pa_try (int begin ATTRIBUTE_UNUSED)
 static void
 pa_call_args (struct call_desc *call_desc)
 {
-  char *name, c, *p;
+  char *name, c;
   unsigned int temp, arg_reloc;
 
   while (!is_end_of_statement ())
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       /* Process a source argument.  */
       if ((strncasecmp (name, "argw", 4) == 0))
        {
          temp = atoi (name + 4);
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
          input_line_pointer++;
-         name = input_line_pointer;
-         c = get_symbol_end ();
+         c = get_symbol_name (&name);
          arg_reloc = pa_build_arg_reloc (name);
          call_desc->arg_reloc |= pa_align_arg_reloc (temp, arg_reloc);
        }
       /* Process a return value.  */
       else if ((strncasecmp (name, "rtnval", 6) == 0))
        {
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
          input_line_pointer++;
-         name = input_line_pointer;
-         c = get_symbol_end ();
+         c = get_symbol_name (&name);
          arg_reloc = pa_build_arg_reloc (name);
          call_desc->arg_reloc |= (arg_reloc & 0x3);
        }
@@ -5928,8 +5923,8 @@ pa_call_args (struct call_desc *call_desc)
        {
          as_bad (_("Invalid .CALL argument: %s"), name);
        }
-      p = input_line_pointer;
-      *p = c;
+
+      (void) restore_line_pointer (c);
       if (!is_end_of_statement ())
        input_line_pointer++;
     }
@@ -6064,7 +6059,7 @@ pa_build_unwind_subspace (struct call_info *call_info)
 static void
 pa_callinfo (int unused ATTRIBUTE_UNUSED)
 {
-  char *name, c, *p;
+  char *name, c;
   int temp;
 
 #ifdef OBJ_SOM
@@ -6083,13 +6078,11 @@ pa_callinfo (int unused ATTRIBUTE_UNUSED)
   /* Iterate over the .CALLINFO arguments.  */
   while (!is_end_of_statement ())
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       /* Frame size specification.  */
       if ((strncasecmp (name, "frame", 5) == 0))
        {
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
          input_line_pointer++;
          temp = get_absolute_expression ();
          if ((temp & 0x3) != 0)
@@ -6100,13 +6093,11 @@ pa_callinfo (int unused ATTRIBUTE_UNUSED)
 
          /* callinfo is in bytes and unwind_desc is in 8 byte units.  */
          last_call_info->ci_unwind.descriptor.frame_size = temp / 8;
-
        }
       /* Entry register (GR, GR and SR) specifications.  */
       else if ((strncasecmp (name, "entry_gr", 8) == 0))
        {
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
          input_line_pointer++;
          temp = get_absolute_expression ();
          /* The HP assembler accepts 19 as the high bound for ENTRY_GR
@@ -6118,8 +6109,7 @@ pa_callinfo (int unused ATTRIBUTE_UNUSED)
        }
       else if ((strncasecmp (name, "entry_fr", 8) == 0))
        {
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
          input_line_pointer++;
          temp = get_absolute_expression ();
          /* Similarly the HP assembler takes 31 as the high bound even
@@ -6130,53 +6120,46 @@ pa_callinfo (int unused ATTRIBUTE_UNUSED)
        }
       else if ((strncasecmp (name, "entry_sr", 8) == 0))
        {
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
          input_line_pointer++;
          temp = get_absolute_expression ();
          if (temp != 3)
            as_bad (_("Value for ENTRY_SR must be 3\n"));
        }
       /* Note whether or not this function performs any calls.  */
-      else if ((strncasecmp (name, "calls", 5) == 0) ||
-              (strncasecmp (name, "caller", 6) == 0))
+      else if ((strncasecmp (name, "calls", 5) == 0)
+              || (strncasecmp (name, "caller", 6) == 0))
        {
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
        }
       else if ((strncasecmp (name, "no_calls", 8) == 0))
        {
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
        }
       /* Should RP be saved into the stack.  */
       else if ((strncasecmp (name, "save_rp", 7) == 0))
        {
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
          last_call_info->ci_unwind.descriptor.save_rp = 1;
        }
       /* Likewise for SP.  */
       else if ((strncasecmp (name, "save_sp", 7) == 0))
        {
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
          last_call_info->ci_unwind.descriptor.save_sp = 1;
        }
       /* Is this an unwindable procedure.  If so mark it so
         in the unwind descriptor.  */
       else if ((strncasecmp (name, "no_unwind", 9) == 0))
        {
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
          last_call_info->ci_unwind.descriptor.cannot_unwind = 1;
        }
       /* Is this an interrupt routine.  If so mark it in the
         unwind descriptor.  */
       else if ((strncasecmp (name, "hpux_int", 7) == 0))
        {
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
          last_call_info->ci_unwind.descriptor.hpux_interrupt_marker = 1;
        }
       /* Is this a millicode routine.  "millicode" isn't in my
@@ -6185,15 +6168,15 @@ pa_callinfo (int unused ATTRIBUTE_UNUSED)
         to drop the information, so we'll accept it too.  */
       else if ((strncasecmp (name, "millicode", 9) == 0))
        {
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
          last_call_info->ci_unwind.descriptor.millicode = 1;
        }
       else
        {
          as_bad (_("Invalid .CALLINFO argument: %s"), name);
-         *input_line_pointer = c;
+         (void) restore_line_pointer (c);
        }
+
       if (!is_end_of_statement ())
        input_line_pointer++;
     }
@@ -6554,7 +6537,7 @@ pa_exit (int unused ATTRIBUTE_UNUSED)
 static void
 pa_type_args (symbolS *symbolP, int is_export)
 {
-  char *name, c, *p;
+  char *name, c;
   unsigned int temp, arg_reloc;
   pa_symbol_type type = SYMBOL_TYPE_UNKNOWN;
   asymbol *bfdsym = symbol_get_bfdsym (symbolP);
@@ -6651,60 +6634,56 @@ pa_type_args (symbolS *symbolP, int is_export)
     {
       if (*input_line_pointer == ',')
        input_line_pointer++;
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       /* Argument sources.  */
       if ((strncasecmp (name, "argw", 4) == 0))
        {
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
          input_line_pointer++;
          temp = atoi (name + 4);
-         name = input_line_pointer;
-         c = get_symbol_end ();
+         c = get_symbol_name (&name);
          arg_reloc = pa_align_arg_reloc (temp, pa_build_arg_reloc (name));
 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
          symbol_arg_reloc_info (symbolP) |= arg_reloc;
 #else
          (void) arg_reloc;
 #endif
-         *input_line_pointer = c;
+         (void) restore_line_pointer (c);
        }
       /* The return value.  */
       else if ((strncasecmp (name, "rtnval", 6)) == 0)
        {
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
          input_line_pointer++;
-         name = input_line_pointer;
-         c = get_symbol_end ();
+         c = get_symbol_name (&name);
          arg_reloc = pa_build_arg_reloc (name);
 #if defined (OBJ_SOM) || defined (ELF_ARG_RELOC)
          symbol_arg_reloc_info (symbolP) |= arg_reloc;
 #else
          (void) arg_reloc;
 #endif
-         *input_line_pointer = c;
+         (void) restore_line_pointer (c);
        }
       /* Privilege level.  */
       else if ((strncasecmp (name, "priv_lev", 8)) == 0)
        {
-         p = input_line_pointer;
-         *p = c;
+         char *priv;
+
+         (void) restore_line_pointer (c);
          input_line_pointer++;
          temp = atoi (input_line_pointer);
 #ifdef OBJ_SOM
          ((obj_symbol_type *) bfdsym)->tc_data.ap.hppa_priv_level = temp;
 #endif
-         c = get_symbol_end ();
-         *input_line_pointer = c;
+         c = get_symbol_name (&priv);
+         (void) restore_line_pointer (c);
        }
       else
        {
          as_bad (_("Undefined .EXPORT/.IMPORT argument (ignored): %s"), name);
-         p = input_line_pointer;
-         *p = c;
+         (void) restore_line_pointer (c);
        }
+
       if (!is_end_of_statement ())
        input_line_pointer++;
     }
@@ -6717,17 +6696,15 @@ pa_type_args (symbolS *symbolP, int is_export)
 static void
 pa_export (int unused ATTRIBUTE_UNUSED)
 {
-  char *name, c, *p;
+  char *name, c;
   symbolS *symbol;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   /* Make sure the given symbol exists.  */
   if ((symbol = symbol_find_or_make (name)) == NULL)
     {
       as_bad (_("Cannot define export symbol: %s\n"), name);
-      p = input_line_pointer;
-      *p = c;
+      restore_line_pointer (c);
       input_line_pointer++;
     }
   else
@@ -6739,8 +6716,7 @@ pa_export (int unused ATTRIBUTE_UNUSED)
         set BSF_GLOBAL when we get back.  */
       S_SET_EXTERNAL (symbol);
       symbol_get_bfdsym (symbol)->flags |= BSF_GLOBAL;
-      p = input_line_pointer;
-      *p = c;
+      (void) restore_line_pointer (c);
       if (!is_end_of_statement ())
        {
          input_line_pointer++;
@@ -6758,11 +6734,10 @@ pa_export (int unused ATTRIBUTE_UNUSED)
 static void
 pa_import (int unused ATTRIBUTE_UNUSED)
 {
-  char *name, c, *p;
+  char *name, c;
   symbolS *symbol;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
 
   symbol = symbol_find (name);
   /* Ugh.  We might be importing a symbol defined earlier in the file,
@@ -6771,8 +6746,7 @@ pa_import (int unused ATTRIBUTE_UNUSED)
   if (symbol == NULL || !S_IS_DEFINED (symbol))
     {
       symbol = symbol_find_or_make (name);
-      p = input_line_pointer;
-      *p = c;
+      (void) restore_line_pointer (c);
 
       if (!is_end_of_statement ())
        {
@@ -6809,16 +6783,14 @@ pa_import (int unused ATTRIBUTE_UNUSED)
 static void
 pa_label (int unused ATTRIBUTE_UNUSED)
 {
-  char *name, c, *p;
+  char *name, c;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
 
   if (strlen (name) > 0)
     {
       colon (name);
-      p = input_line_pointer;
-      *p = c;
+      (void) restore_line_pointer (c);
     }
   else
     {
@@ -6907,24 +6879,21 @@ pa_origin (int unused ATTRIBUTE_UNUSED)
 static void
 pa_param (int unused ATTRIBUTE_UNUSED)
 {
-  char *name, c, *p;
+  char *name, c;
   symbolS *symbol;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
 
   if ((symbol = symbol_find_or_make (name)) == NULL)
     {
       as_bad (_("Cannot define static symbol: %s\n"), name);
-      p = input_line_pointer;
-      *p = c;
+      (void) restore_line_pointer (c);
       input_line_pointer++;
     }
   else
     {
       S_CLEAR_EXTERNAL (symbol);
-      p = input_line_pointer;
-      *p = c;
+      (void) restore_line_pointer (c);
       if (!is_end_of_statement ())
        {
          input_line_pointer++;
@@ -7161,39 +7130,38 @@ pa_parse_space_stmt (char *space_name, int create_flag)
          while (!is_end_of_statement ())
            {
              input_line_pointer++;
-             name = input_line_pointer;
-             c = get_symbol_end ();
+             c = get_symbol_name (&name);
              if ((strncasecmp (name, "spnum", 5) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer++;
                  spnum = get_absolute_expression ();
                }
              else if ((strncasecmp (name, "sort", 4) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer++;
                  sort = get_absolute_expression ();
                }
              else if ((strncasecmp (name, "unloadable", 10) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  loadable = FALSE;
                }
              else if ((strncasecmp (name, "notdefined", 10) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  defined = FALSE;
                }
              else if ((strncasecmp (name, "private", 7) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  private = TRUE;
                }
              else
                {
                  as_bad (_("Invalid .SPACE argument"));
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  if (!is_end_of_statement ())
                    input_line_pointer++;
                }
@@ -7331,11 +7299,10 @@ pa_space (int unused ATTRIBUTE_UNUSED)
       /* Not a number, attempt to create a new space.  */
       print_errors = 1;
       input_line_pointer = save_s;
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       space_name = xmalloc (strlen (name) + 1);
       strcpy (space_name, name);
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
 
       sd_chain = pa_parse_space_stmt (space_name, 1);
       current_space = sd_chain;
@@ -7357,8 +7324,7 @@ pa_spnum (int unused ATTRIBUTE_UNUSED)
   char *p;
   sd_chain_struct *space;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   space = is_defined_space (name);
   if (space)
     {
@@ -7368,7 +7334,7 @@ pa_spnum (int unused ATTRIBUTE_UNUSED)
   else
     as_warn (_("Undefined space: '%s' Assuming space number = 0."), name);
 
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
   demand_empty_rest_of_line ();
 }
 
@@ -7398,11 +7364,10 @@ pa_subspace (int create_new)
     }
   else
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       ss_name = xmalloc (strlen (name) + 1);
       strcpy (ss_name, name);
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
 
       /* Load default values.  */
       sort = 0;
@@ -7466,17 +7431,16 @@ pa_subspace (int create_new)
          input_line_pointer++;
          while (!is_end_of_statement ())
            {
-             name = input_line_pointer;
-             c = get_symbol_end ();
+             c = get_symbol_name (&name);
              if ((strncasecmp (name, "quad", 4) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer++;
                  quadrant = get_absolute_expression ();
                }
              else if ((strncasecmp (name, "align", 5) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer++;
                  alignment = get_absolute_expression ();
                  if (exact_log2 (alignment) == -1)
@@ -7487,50 +7451,51 @@ pa_subspace (int create_new)
                }
              else if ((strncasecmp (name, "access", 6) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer++;
                  access_ctr = get_absolute_expression ();
                }
              else if ((strncasecmp (name, "sort", 4) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer++;
                  sort = get_absolute_expression ();
                }
              else if ((strncasecmp (name, "code_only", 9) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  code_only = 1;
                }
              else if ((strncasecmp (name, "unloadable", 10) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  loadable = 0;
                }
              else if ((strncasecmp (name, "comdat", 6) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  comdat = 1;
                }
              else if ((strncasecmp (name, "common", 6) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  common = 1;
                }
              else if ((strncasecmp (name, "dup_comm", 8) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  dup_common = 1;
                }
              else if ((strncasecmp (name, "zero", 4) == 0))
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  zero = 1;
                }
              else if ((strncasecmp (name, "first", 5) == 0))
                as_bad (_("FIRST not supported as a .SUBSPACE argument"));
              else
                as_bad (_("Invalid .SUBSPACE argument"));
+
              if (!is_end_of_statement ())
                input_line_pointer++;
            }
index 6993f7900d996652ae8f9688e386bb100d0b165e..ba82b2ca9fec3f2093f0f93ba354bca21694141b 100644 (file)
@@ -269,11 +269,11 @@ register_name (expressionS *expressionP)
     reg_number = get_single_number ();
   else
     {
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT, name);
 
       /* Put back the delimiting char.  */
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
     }
 
   /* If numeric, make sure its not out of bounds.  */
@@ -1033,12 +1033,11 @@ i370_elf_lcomm (int unused ATTRIBUTE_UNUSED)
   char *pfrag;
   int align2;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
 
   /* Just after name is now '\0'.  */
   p = input_line_pointer;
-  *p = c;
+  (void) restore_line_pointer (c);
   SKIP_WHITESPACE ();
   if (*input_line_pointer != ',')
     {
index 2bdcf3520f4c0bb1fce825ecb73f06baa42ea8c0..cff0ae7878cc55f1d05d67a44769d75fc729c7c7 100644 (file)
@@ -168,13 +168,18 @@ operatorT i386_operator (const char *name, unsigned int operands, char *pc)
   for (j = 0; i386_types[j].name; ++j)
     if (strcasecmp (i386_types[j].name, name) == 0)
       break;
+
   if (i386_types[j].name && *pc == ' ')
     {
-      char *pname = ++input_line_pointer;
-      char c = get_symbol_end ();
+      char *pname;
+      char c;
+
+      ++input_line_pointer;
+      c = get_symbol_name (&pname);
 
       if (strcasecmp (pname, "ptr") == 0)
        {
+         /* FIXME: What if c == '"' ?  */
          pname[-1] = *pc;
          *pc = c;
          if (intel_syntax > 0 || operands != 1)
@@ -182,7 +187,7 @@ operatorT i386_operator (const char *name, unsigned int operands, char *pc)
          return i386_types[j].op;
        }
 
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
       input_line_pointer = pname - 1;
     }
 
index 6c910ed11ca22e3b32a171acd05f44c8e62bdd4e..13f1d276b6f2db41e0df96b011ba6a4a1798440b 100644 (file)
@@ -2198,8 +2198,8 @@ set_intel_syntax (int syntax_flag)
   SKIP_WHITESPACE ();
   if (!is_end_of_line[(unsigned char) *input_line_pointer])
     {
-      char *string = input_line_pointer;
-      int e = get_symbol_end ();
+      char *string;
+      int e = get_symbol_name (&string);
 
       if (strcmp (string, "prefix") == 0)
        ask_naked_reg = 1;
@@ -2207,7 +2207,7 @@ set_intel_syntax (int syntax_flag)
        ask_naked_reg = -1;
       else
        as_bad (_("bad argument to syntax directive."));
-      *input_line_pointer = e;
+      (void) restore_line_pointer (e);
     }
   demand_empty_rest_of_line ();
 
@@ -2259,8 +2259,8 @@ set_check (int what)
 
   if (!is_end_of_line[(unsigned char) *input_line_pointer])
     {
-      char *string = input_line_pointer;
-      int e = get_symbol_end ();
+      char *string;
+      int e = get_symbol_name (&string);
 
       if (strcmp (string, "none") == 0)
        *kind = check_none;
@@ -2270,7 +2270,7 @@ set_check (int what)
        *kind = check_error;
       else
        as_bad (_("bad argument to %s_check directive."), str);
-      *input_line_pointer = e;
+      (void) restore_line_pointer (e);
     }
   else
     as_bad (_("missing argument for %s_check directive"), str);
@@ -2324,8 +2324,8 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
 
   if (!is_end_of_line[(unsigned char) *input_line_pointer])
     {
-      char *string = input_line_pointer;
-      int e = get_symbol_end ();
+      char *string;
+      int e = get_symbol_name (&string);
       unsigned int j;
       i386_cpu_flags flags;
 
@@ -2385,7 +2385,7 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
                  cpu_arch_flags = flags;
                  cpu_arch_isa_flags = flags;
                }
-             *input_line_pointer = e;
+             (void) restore_line_pointer (e);
              demand_empty_rest_of_line ();
              return;
            }
@@ -2402,8 +2402,11 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
   if (*input_line_pointer == ','
       && !is_end_of_line[(unsigned char) input_line_pointer[1]])
     {
-      char *string = ++input_line_pointer;
-      int e = get_symbol_end ();
+      char *string;
+      char e;
+
+      ++input_line_pointer;
+      e = get_symbol_name (&string);
 
       if (strcmp (string, "nojumps") == 0)
        no_cond_jump_promotion = 1;
@@ -2412,7 +2415,7 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED)
       else
        as_bad (_("no such architecture modifier: `%s'"), string);
 
-      *input_line_pointer = e;
+      (void) restore_line_pointer (e);
     }
 
   demand_empty_rest_of_line ();
@@ -3967,14 +3970,14 @@ parse_operands (char *l, const char *mnemonic)
       /* Skip optional white space before operand.  */
       if (is_space_char (*l))
        ++l;
-      if (!is_operand_char (*l) && *l != END_OF_INSN)
+      if (!is_operand_char (*l) && *l != END_OF_INSN && *l != '"')
        {
          as_bad (_("invalid character %s before operand %d"),
                  output_invalid (*l),
                  i.operands + 1);
          return NULL;
        }
-      token_start = l; /* after white space */
+      token_start = l; /* After white space.  */
       paren_not_balanced = 0;
       while (paren_not_balanced || *l != ',')
        {
@@ -3993,7 +3996,7 @@ parse_operands (char *l, const char *mnemonic)
              else
                break;  /* we are done */
            }
-         else if (!is_operand_char (*l) && !is_space_char (*l))
+         else if (!is_operand_char (*l) && !is_space_char (*l) && *l != '"')
            {
              as_bad (_("invalid character %s in operand %d"),
                      output_invalid (*l),
@@ -8637,6 +8640,7 @@ i386_att_operand (char *operand_string)
     }
   else if (is_digit_char (*op_string)
           || is_identifier_char (*op_string)
+          || *op_string == '"'
           || *op_string == '(')
     {
       /* This is a memory reference of some sort.  */
@@ -9471,7 +9475,7 @@ parse_register (char *reg_string, char **end_op)
       symbolS *symbolP;
 
       input_line_pointer = reg_string;
-      c = get_symbol_end ();
+      c = get_symbol_name (&reg_string);
       symbolP = symbol_find (reg_string);
       if (symbolP && S_GET_SEGMENT (symbolP) == reg_section)
        {
index 6321791aa44ffcfbed65334b3e5bffb1f462983a..e27d816d06bdbcfa20b0b95f427d6c1414625235 100644 (file)
@@ -2335,8 +2335,7 @@ s_endian (int ignore ATTRIBUTE_UNUSED)
   char *name;
   char c;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   if (strcasecmp (name, "little") == 0)
     ;
   else if (strcasecmp (name, "big") == 0)
@@ -2344,7 +2343,7 @@ s_endian (int ignore ATTRIBUTE_UNUSED)
   else
     as_warn (_("ignoring unrecognized .endian type `%s'"), name);
 
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   demand_empty_rest_of_line ();
 }
index d11570a9f1c7af0f913c8971afced2c7fdb8ee1e..ea7dcc649b81b566e52c29963d9a2e5f57ed498f 100644 (file)
@@ -1084,19 +1084,18 @@ obj_elf_vms_common (int ignore ATTRIBUTE_UNUSED)
       return;
     }
 
-  sym_name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&sym_name);
 
   if (input_line_pointer == sym_name)
     {
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
       as_bad (_("expected symbol name"));
       ignore_rest_of_line ();
       return;
     }
 
   symbolP = symbol_find_or_make (sym_name);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   if ((S_IS_DEFINED (symbolP) || symbol_equated_p (symbolP))
       && !S_IS_COMMON (symbolP))
@@ -3167,12 +3166,11 @@ dot_radix (int dummy ATTRIBUTE_UNUSED)
 
   if (is_it_end_of_statement ())
     return;
-  radix = input_line_pointer;
-  ch = get_symbol_end ();
+  ch = get_symbol_name (&radix);
   ia64_canonicalize_symbol_name (radix);
   if (strcasecmp (radix, "C"))
     as_bad (_("Radix `%s' unsupported or invalid"), radix);
-  *input_line_pointer = ch;
+  (void) restore_line_pointer (ch);
   demand_empty_rest_of_line ();
 }
 
@@ -3279,11 +3277,12 @@ add_unwind_entry (unw_rec_list *ptr, int sep)
 
   if (sep == ',')
     {
+      char *name;
       /* Parse a tag permitted for the current directive.  */
       int ch;
 
       SKIP_WHITESPACE ();
-      ch = get_symbol_end ();
+      ch = get_symbol_name (&name);
       /* FIXME: For now, just issue a warning that this isn't implemented.  */
       {
        static int warned;
@@ -3294,7 +3293,7 @@ add_unwind_entry (unw_rec_list *ptr, int sep)
            as_warn (_("Tags on unwind pseudo-ops aren't supported, yet"));
          }
       }
-      *input_line_pointer = ch;
+      (void) restore_line_pointer (ch);
     }
   if (sep != NOT_A_CHAR)
     demand_empty_rest_of_line ();
@@ -4232,16 +4231,16 @@ static void
 dot_personality (int dummy ATTRIBUTE_UNUSED)
 {
   char *name, *p, c;
+
   if (!in_procedure ("personality"))
     return;
   SKIP_WHITESPACE ();
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   p = input_line_pointer;
   unwind.personality_routine = symbol_find_or_make (name);
   unwind.force_unwind_entry = 1;
   *p = c;
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
   demand_empty_rest_of_line ();
 }
 
@@ -4271,8 +4270,7 @@ dot_proc (int dummy ATTRIBUTE_UNUSED)
   while (1)
     {
       SKIP_WHITESPACE ();
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       p = input_line_pointer;
       if (!*name)
        as_bad (_("Empty argument of .proc"));
@@ -4295,7 +4293,7 @@ dot_proc (int dummy ATTRIBUTE_UNUSED)
          symbol_get_bfdsym (sym)->flags |= BSF_FUNCTION;
        }
       *p = c;
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
       if (*input_line_pointer != ',')
        break;
       ++input_line_pointer;
@@ -4529,8 +4527,7 @@ dot_endp (int dummy ATTRIBUTE_UNUSED)
       char *name, *p, c;
 
       SKIP_WHITESPACE ();
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       p = input_line_pointer;
       if (!*name)
        (md.unwind_check == unwind_check_warning
@@ -4552,7 +4549,7 @@ dot_endp (int dummy ATTRIBUTE_UNUSED)
            as_warn (_("`%s' was not specified with previous .proc"), name);
        }
       *p = c;
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
       if (*input_line_pointer != ',')
        break;
       ++input_line_pointer;
@@ -4638,12 +4635,11 @@ dot_rot (int type)
   drpp = &md.dynreg[type];
   while (1)
     {
-      start = input_line_pointer;
-      ch = get_symbol_end ();
+      ch = get_symbol_name (&start);
       len = strlen (ia64_canonicalize_symbol_name (start));
       *input_line_pointer = ch;
 
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
       if (*input_line_pointer != '[')
        {
          as_bad (_("Expected '['"));
@@ -4769,8 +4765,7 @@ dot_psr (int dummy ATTRIBUTE_UNUSED)
 
   while (1)
     {
-      option = input_line_pointer;
-      ch = get_symbol_end ();
+      ch = get_symbol_name (&option);
       if (strcmp (option, "lsb") == 0)
        md.flags &= ~EF_IA_64_BE;
       else if (strcmp (option, "msb") == 0)
@@ -4783,7 +4778,7 @@ dot_psr (int dummy ATTRIBUTE_UNUSED)
        as_bad (_("Unknown psr option `%s'"), option);
       *input_line_pointer = ch;
 
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
       if (*input_line_pointer != ',')
        break;
 
@@ -4806,36 +4801,21 @@ cross_section (int ref, void (*builder) (int), int ua)
   char *start, *end;
   int saved_auto_align;
   unsigned int section_count;
+  char *name;
+  char c;
 
   SKIP_WHITESPACE ();
   start = input_line_pointer;
-  if (*start == '"')
-    {
-      int len;
-      char *name;
-
-      name = demand_copy_C_string (&len);
-      obstack_free(&notes, name);
-      if (!name)
-       {
-         ignore_rest_of_line ();
-         return;
-       }
-    }
-  else
+  c = get_symbol_name (&name);
+  if (input_line_pointer == start)
     {
-      char c = get_symbol_end ();
-
-      if (input_line_pointer == start)
-       {
-         as_bad (_("Missing section name"));
-         ignore_rest_of_line ();
-         return;
-       }
-      *input_line_pointer = c;
+      as_bad (_("Missing section name"));
+      ignore_rest_of_line ();
+      return;
     }
+  * input_line_pointer = c;
+  SKIP_WHITESPACE_AFTER_NAME ();
   end = input_line_pointer;
-  SKIP_WHITESPACE ();
   if (*input_line_pointer != ',')
     {
       as_bad (_("Comma expected after section name"));
@@ -5068,8 +5048,11 @@ dot_pred_rel (int type)
        }
       else if (*input_line_pointer == '@')
        {
-         char *form = ++input_line_pointer;
-         char c = get_symbol_end();
+         char *form;
+         char c;
+
+         ++input_line_pointer;
+         c = get_symbol_name (&form);
 
          if (strcmp (form, "mutex") == 0)
            type = 'm';
@@ -5077,7 +5060,7 @@ dot_pred_rel (int type)
            type = 'c';
          else if (strcmp (form, "imply") == 0)
            type = 'i';
-         *input_line_pointer = c;
+         (void) restore_line_pointer (c);
        }
       else
        {
@@ -5215,8 +5198,7 @@ dot_entry (int dummy ATTRIBUTE_UNUSED)
 
   do
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       symbolP = symbol_find_or_make (name);
 
       err = hash_insert (md.entry_hash, S_GET_NAME (symbolP), (void *) symbolP);
@@ -5225,7 +5207,7 @@ dot_entry (int dummy ATTRIBUTE_UNUSED)
                  name, err);
 
       *input_line_pointer = c;
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
       c = *input_line_pointer;
       if (c == ',')
        {
@@ -7748,8 +7730,7 @@ ia64_unrecognized_line (int ch)
           recognize labels.  */
        if (is_name_beginner (*input_line_pointer))
          {
-           s = input_line_pointer;
-           c = get_symbol_end ();
+           c = get_symbol_name (&s);
          }
        else if (LOCAL_LABELS_FB
                 && ISDIGIT (*input_line_pointer))
@@ -10720,12 +10701,11 @@ md_assemble (char *str)
 
   /* extract the opcode (mnemonic):  */
 
-  mnemonic = input_line_pointer;
-  ch = get_symbol_end ();
+  ch = get_symbol_name (&mnemonic);
   pdesc = (struct pseudo_opcode *) hash_find (md.pseudo_hash, mnemonic);
   if (pdesc)
     {
-      *input_line_pointer = ch;
+      (void) restore_line_pointer (ch);
       (*pdesc->handler) (pdesc->arg);
       goto done;
     }
@@ -10733,7 +10713,7 @@ md_assemble (char *str)
   /* Find the instruction descriptor matching the arguments.  */
 
   idesc = ia64_find_opcode (mnemonic);
-  *input_line_pointer = ch;
+  (void) restore_line_pointer (ch);
   if (!idesc)
     {
       as_bad (_("Unknown opcode `%s'"), mnemonic);
@@ -11805,8 +11785,7 @@ dot_alias (int section)
   struct hash_control *ahash, *nhash;
   const char *kind;
 
-  name = input_line_pointer;
-  delim = get_symbol_end ();
+  delim = get_symbol_name (&name);
   end_name = input_line_pointer;
   *end_name = delim;
 
@@ -11817,7 +11796,7 @@ dot_alias (int section)
       return;
     }
 
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
 
   if (*input_line_pointer != ',')
     {
index bddd940a113a946b536fea9d0f2800e72b7e7d85..2d55da120909b99ff64ff41eda9b5b5fe7b171da 100644 (file)
@@ -796,10 +796,9 @@ get_symbol (void)
   char *name;
   symbolS *p;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   p = (symbolS *) symbol_find_or_make (name);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
   return p;
 }
 
index 38da4b5068178e82ab9c02db8e8e1f824b93dc09..4a14bf1dfb43028e02c60d02d6aa26957e5ed8d5 100644 (file)
@@ -567,13 +567,10 @@ debug_sym (int ignore ATTRIBUTE_UNUSED)
 {
   char *name;
   char delim;
-  char *end_name;
   symbolS *symbolP;
   sym_linkS *lnk;
 
-  name = input_line_pointer;
-  delim = get_symbol_end ();
-  end_name = input_line_pointer;
+  delim = get_symbol_name (&name);
 
   if ((symbolP = symbol_find (name)) == NULL
       && (symbolP = md_undefined_symbol (name)) == NULL)
@@ -595,7 +592,7 @@ debug_sym (int ignore ATTRIBUTE_UNUSED)
       symbol_get_obj (symbolP)->local = 1;
     }
 
-  *end_name = delim;
+  (void) restore_line_pointer (delim);
   demand_empty_rest_of_line ();
 }
 
@@ -1480,13 +1477,12 @@ m32r_scomm (int ignore ATTRIBUTE_UNUSED)
   offsetT align;
   int align2;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
 
   /* Just after name is now '\0'.  */
   p = input_line_pointer;
   *p = c;
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
   if (*input_line_pointer != ',')
     {
       as_bad (_("Expected comma after symbol-name: rest of line ignored."));
index a2aa4240e7919ff8aed9a0cd5eee6e7b1daeb895..43cf6b692981a9c2d6b4f3b1b8bd4afe0c246b4d 100644 (file)
@@ -3760,10 +3760,9 @@ s_m68hc11_mark_symbol (int mark)
 
   do
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       symbolP = symbol_find_or_make (name);
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
 
       SKIP_WHITESPACE ();
 
index acfe3499d886bf333e88e09a94ba763a38bea911..b8f051ee57a26e96820051c6b5ea70b4df7d3d99 100644 (file)
@@ -5703,7 +5703,7 @@ mri_chip (void)
   int i;
 
   s = input_line_pointer;
-  /* We can't use get_symbol_end since the processor names are not proper
+  /* We can't use get_symbol_name since the processor names are not proper
      symbols.  */
   while (is_part_of_name (c = *input_line_pointer++))
     ;
@@ -5731,7 +5731,7 @@ mri_chip (void)
     {
       ++input_line_pointer;
       s = input_line_pointer;
-      /* We can't use get_symbol_end since the processor names are not
+      /* We can't use get_symbol_name since the processor names are not
         proper symbols.  */
       while (is_part_of_name (c = *input_line_pointer++))
        ;
@@ -5896,8 +5896,7 @@ s_opt (int ignore ATTRIBUTE_UNUSED)
          t = 0;
        }
 
-      s = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&s);
 
       for (i = 0, o = opt_table; i < OPTCOUNT; i++, o++)
        {
@@ -5907,14 +5906,14 @@ s_opt (int ignore ATTRIBUTE_UNUSED)
                {
                  /* Restore input_line_pointer now in case the option
                     takes arguments.  */
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  (*o->pfn) (o->arg, t);
                }
              else if (o->pvar != NULL)
                {
                  if (! t && o->arg == o->notarg)
                    as_bad (_("option `%s' may not be negated"), s);
-                 *input_line_pointer = c;
+                 restore_line_pointer (c);
                  *o->pvar = t ? o->arg : o->notarg;
                }
              else
@@ -5925,7 +5924,7 @@ s_opt (int ignore ATTRIBUTE_UNUSED)
       if (i >= OPTCOUNT)
        {
          as_bad (_("option `%s' not recognized"), s);
-         *input_line_pointer = c;
+         restore_line_pointer (c);
        }
     }
   while (*input_line_pointer++ == ',');
index 3309e59823d76402b6526a1ba407ff8c6694f6a3..b43925bea7db103be9af65f6a4b74b21c9b51cb2 100644 (file)
@@ -179,12 +179,11 @@ microblaze_s_lcomm (int xxx ATTRIBUTE_UNUSED)
   segT current_seg = now_seg;
   subsegT current_subseg = now_subseg;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
 
   /* Just after name is now '\0'.  */
   p = input_line_pointer;
-  *p = c;
+  (void) restore_line_pointer (c);
   SKIP_WHITESPACE ();
   if (*input_line_pointer != ',')
     {
@@ -315,7 +314,8 @@ microblaze_s_bss (int localvar)
 static void
 microblaze_s_func (int end_p ATTRIBUTE_UNUSED)
 {
-  *input_line_pointer = get_symbol_end ();
+  char *name;
+  restore_line_pointer (get_symbol_name (&name));
   s_func (1);
 }
 
@@ -329,11 +329,10 @@ microblaze_s_weakext (int ignore ATTRIBUTE_UNUSED)
   symbolS *symbolP;
   expressionS exp;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   symbolP = symbol_find_or_make (name);
   S_SET_WEAK (symbolP);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   SKIP_WHITESPACE ();
 
index 74b7fb40ad553e0ac4c9e181f901eb91a951c565..d951dfc2bc43fa3d9cca935a47e785a0d67be057 100644 (file)
@@ -15134,10 +15134,9 @@ get_symbol (void)
   char *name;
   symbolS *p;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   p = (symbolS *) symbol_find_or_make (name);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
   return p;
 }
 
@@ -15280,28 +15279,34 @@ s_change_sec (int sec)
 void
 s_change_section (int ignore ATTRIBUTE_UNUSED)
 {
+  char *saved_ilp;
   char *section_name;
-  char c;
+  char c, endc;
   char next_c = 0;
   int section_type;
   int section_flag;
   int section_entry_size;
   int section_alignment;
 
-  section_name = input_line_pointer;
-  c = get_symbol_end ();
+  saved_ilp = input_line_pointer;
+  endc = get_symbol_name (&section_name);
+  c = (endc == '"' ? input_line_pointer[1] : endc);
   if (c)
-    next_c = *(input_line_pointer + 1);
+    next_c = input_line_pointer [(endc == '"' ? 2 : 1)];
 
   /* Do we have .section Name<,"flags">?  */
   if (c != ',' || (c == ',' && next_c == '"'))
     {
-      /* just after name is now '\0'.  */
-      *input_line_pointer = c;
-      input_line_pointer = section_name;
+      /* Just after name is now '\0'.  */
+      (void) restore_line_pointer (endc);
+      input_line_pointer = saved_ilp;
       obj_elf_section (ignore);
       return;
     }
+
+  section_name = xstrdup (section_name);
+  c = restore_line_pointer (endc);
+
   input_line_pointer++;
 
   /* Do we have .section Name<,type><,flag><,entry_size><,alignment>  */
@@ -15309,23 +15314,25 @@ s_change_section (int ignore ATTRIBUTE_UNUSED)
     section_type = get_absolute_expression ();
   else
     section_type = 0;
+
   if (*input_line_pointer++ == ',')
     section_flag = get_absolute_expression ();
   else
     section_flag = 0;
+
   if (*input_line_pointer++ == ',')
     section_entry_size = get_absolute_expression ();
   else
     section_entry_size = 0;
+
   if (*input_line_pointer++ == ',')
     section_alignment = get_absolute_expression ();
   else
     section_alignment = 0;
+
   /* FIXME: really ignore?  */
   (void) section_alignment;
 
-  section_name = xstrdup (section_name);
-
   /* When using the generic form of .section (as implemented by obj-elf.c),
      there's no way to set the section type to SHT_MIPS_DWARF.  Users have
      traditionally had to fall back on the more common @progbits instead.
@@ -15404,13 +15411,12 @@ s_mips_globl (int x ATTRIBUTE_UNUSED)
 
   do
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       symbolP = symbol_find_or_make (name);
       S_SET_EXTERNAL (symbolP);
 
       *input_line_pointer = c;
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
 
       /* On Irix 5, every global symbol that is not explicitly labelled as
          being a function is apparently labelled as being an object.  */
@@ -15422,12 +15428,11 @@ s_mips_globl (int x ATTRIBUTE_UNUSED)
          char *secname;
          asection *sec;
 
-         secname = input_line_pointer;
-         c = get_symbol_end ();
+         c = get_symbol_name (&secname);
          sec = bfd_get_section_by_name (stdoutput, secname);
          if (sec == NULL)
            as_bad (_("%s: no such section"), secname);
-         *input_line_pointer = c;
+         (void) restore_line_pointer (c);
 
          if (sec != NULL && (sec->flags & SEC_CODE) != 0)
            flag = BSF_FUNCTION;
@@ -15455,8 +15460,7 @@ s_option (int x ATTRIBUTE_UNUSED)
   char *opt;
   char c;
 
-  opt = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&opt);
 
   if (*opt == 'O')
     {
@@ -15488,7 +15492,7 @@ s_option (int x ATTRIBUTE_UNUSED)
   else
     as_warn (_("unrecognized option \"%s\""), opt);
 
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
   demand_empty_rest_of_line ();
 }
 
@@ -16425,13 +16429,12 @@ s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
   symbolS *symbolP;
   expressionS exp;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   symbolP = symbol_find_or_make (name);
   S_SET_WEAK (symbolP);
   *input_line_pointer = c;
 
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
 
   if (! is_end_of_line[(unsigned char) *input_line_pointer])
     {
index c5128cd1b6461edcbbb77a549c696d66ae516768..8d6ca3c8a5dbcaf37ba4223f126537d8ebb32a9e 100644 (file)
@@ -587,8 +587,10 @@ get_putget_operands (struct mmix_opcode *insn, char *operands,
            p++;
          sregp = p;
          input_line_pointer = sregp;
-         c = get_symbol_end ();
+         c = get_symbol_name (&sregp);
          sregend = input_line_pointer;
+         if (c == '"')
+           ++ input_line_pointer;
        }
     }
   else
@@ -596,10 +598,10 @@ get_putget_operands (struct mmix_opcode *insn, char *operands,
       expp_sreg = &exp[0];
       expp_reg = &exp[1];
 
-      sregp = p;
-      c = get_symbol_end ();
-      sregend = p = input_line_pointer;
-      *p = c;
+      c = get_symbol_name (&sregp);
+      sregend = input_line_pointer;
+      restore_line_pointer (c);
+      p = input_line_pointer;
 
       /* Skip whitespace */
       while (*p == ' ' || *p == '\t')
@@ -1939,10 +1941,8 @@ s_prefix (int unused ATTRIBUTE_UNUSED)
 
   SKIP_WHITESPACE ();
 
-  p = input_line_pointer;
-
-  c = get_symbol_end ();
-
+  c = get_symbol_name (&p);
+  
   /* Reseting prefix?  */
   if (*p == ':' && p[1] == 0)
     mmix_current_prefix = NULL;
@@ -1961,7 +1961,7 @@ s_prefix (int unused ATTRIBUTE_UNUSED)
       mmix_current_prefix = p;
     }
 
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   mmix_handle_rest_of_empty_line ();
 }
@@ -2057,13 +2057,15 @@ s_greg (int unused ATTRIBUTE_UNUSED)
 {
   char *p;
   char c;
-  p = input_line_pointer;
 
   /* This will skip over what can be a symbol and zero out the next
      character, which we assume is a ',' or other meaningful delimiter.
      What comes after that is the initializer expression for the
      register.  */
-  c = get_symbol_end ();
+  c = get_symbol_name (&p);
+
+  if (c == '"')
+    c = * ++ input_line_pointer;
 
   if (! is_end_of_line[(unsigned char) c])
     input_line_pointer++;
index ebf7f94191b0c6572134154159619010d70a539f..4d4f4827c37f556483ce9c2b52e4adff24f9873d 100644 (file)
@@ -181,13 +181,12 @@ data_register_name (expressionS *expressionP)
   char c;
 
   /* Find the spelling of the operand.  */
-  start = name = input_line_pointer;
-
-  c = get_symbol_end ();
+  start = input_line_pointer;
+  c = get_symbol_name (&name);
   reg_number = reg_name_search (data_registers, DATA_REG_NAME_CNT, name);
 
   /* Put back the delimiting char.  */
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   /* Look to see if it's in the register table.  */
   if (reg_number >= 0)
@@ -226,13 +225,12 @@ address_register_name (expressionS *expressionP)
   char c;
 
   /* Find the spelling of the operand.  */
-  start = name = input_line_pointer;
-
-  c = get_symbol_end ();
+  start = input_line_pointer;
+  c = get_symbol_name (&name);
   reg_number = reg_name_search (address_registers, ADDRESS_REG_NAME_CNT, name);
 
   /* Put back the delimiting char.  */
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   /* Look to see if it's in the register table.  */
   if (reg_number >= 0)
@@ -271,13 +269,12 @@ other_register_name (expressionS *expressionP)
   char c;
 
   /* Find the spelling of the operand.  */
-  start = name = input_line_pointer;
-
-  c = get_symbol_end ();
+  start = input_line_pointer;
+  c = get_symbol_name (&name);
   reg_number = reg_name_search (other_registers, OTHER_REG_NAME_CNT, name);
 
   /* Put back the delimiting char.  */
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   /* Look to see if it's in the register table.  */
   if (reg_number >= 0)
@@ -980,32 +977,31 @@ md_assemble (char *str)
            }
          else if (operand->flags & MN10200_OPERAND_PSW)
            {
-             char *start = input_line_pointer;
-             char c = get_symbol_end ();
+             char *start;
+             char c = get_symbol_name (&start);
 
              if (strcmp (start, "psw") != 0)
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer = hold;
                  str = hold;
                  goto error;
                }
-             *input_line_pointer = c;
+             (void) restore_line_pointer (c);
              goto keep_going;
            }
          else if (operand->flags & MN10200_OPERAND_MDR)
            {
-             char *start = input_line_pointer;
-             char c = get_symbol_end ();
+             char *start;
+             char c = get_symbol_name (&start);
 
+             (void) restore_line_pointer (c);
              if (strcmp (start, "mdr") != 0)
                {
-                 *input_line_pointer = c;
                  input_line_pointer = hold;
                  str = hold;
                  goto error;
                }
-             *input_line_pointer = c;
              goto keep_going;
            }
          else if (data_register_name (&ex))
@@ -1337,4 +1333,3 @@ keep_going:
        }
     }
 }
-
index 1d37b294755ea1c2409876c1da1b966c13a6c8ca..0d13622296f24730c08ce0d218ab25e73926fe05 100644 (file)
@@ -337,13 +337,13 @@ get_register_name (expressionS *           expressionP,
   char c;
 
   /* Find the spelling of the operand.  */
-  start = name = input_line_pointer;
+  start = input_line_pointer;
 
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   reg_number = reg_name_search (table, table_length, name);
 
   /* Put back the delimiting char.  */
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   /* Look to see if it's in the register table.  */
   if (reg_number >= 0)
@@ -409,13 +409,13 @@ other_register_name (expressionS *expressionP)
   char c;
 
   /* Find the spelling of the operand.  */
-  start = name = input_line_pointer;
+  start = input_line_pointer;
 
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   reg_number = reg_name_search (other_registers, ARRAY_SIZE (other_registers), name);
 
   /* Put back the delimiting char.  */
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   /* Look to see if it's in the register table.  */
   if (reg_number == 0
@@ -1346,17 +1346,17 @@ md_assemble (char *str)
            }
          else if (operand->flags & MN10300_OPERAND_SP)
            {
-             char *start = input_line_pointer;
-             char c = get_symbol_end ();
+             char *start;
+             char c = get_symbol_name (&start);
 
              if (strcasecmp (start, "sp") != 0)
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer = hold;
                  str = hold;
                  goto error;
                }
-             *input_line_pointer = c;
+             (void) restore_line_pointer (c);
              goto keep_going;
            }
          else if (operand->flags & MN10300_OPERAND_RREG)
@@ -1397,92 +1397,94 @@ md_assemble (char *str)
            }
          else if (operand->flags & MN10300_OPERAND_FPCR)
            {
-             char *start = input_line_pointer;
-             char c = get_symbol_end ();
+             char *start;
+             char c = get_symbol_name (&start);
 
              if (strcasecmp (start, "fpcr") != 0)
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer = hold;
                  str = hold;
                  goto error;
                }
-             *input_line_pointer = c;
+             (void) restore_line_pointer (c);
              goto keep_going;
            }
          else if (operand->flags & MN10300_OPERAND_USP)
            {
-             char *start = input_line_pointer;
-             char c = get_symbol_end ();
+             char *start;
+             char c = get_symbol_name (&start);
 
              if (strcasecmp (start, "usp") != 0)
                {
+             (void) restore_line_pointer (c);
                  *input_line_pointer = c;
                  input_line_pointer = hold;
                  str = hold;
                  goto error;
                }
+             (void) restore_line_pointer (c);
              *input_line_pointer = c;
              goto keep_going;
            }
          else if (operand->flags & MN10300_OPERAND_SSP)
            {
-             char *start = input_line_pointer;
-             char c = get_symbol_end ();
+             char *start;
+             char c = get_symbol_name (&start);
 
              if (strcasecmp (start, "ssp") != 0)
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer = hold;
                  str = hold;
                  goto error;
                }
-             *input_line_pointer = c;
+             (void) restore_line_pointer (c);
              goto keep_going;
            }
          else if (operand->flags & MN10300_OPERAND_MSP)
            {
-             char *start = input_line_pointer;
-             char c = get_symbol_end ();
+             char *start;
+             char c = get_symbol_name (&start);
 
              if (strcasecmp (start, "msp") != 0)
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer = hold;
                  str = hold;
                  goto error;
                }
-             *input_line_pointer = c;
+             (void) restore_line_pointer (c);
              goto keep_going;
            }
          else if (operand->flags & MN10300_OPERAND_PC)
            {
-             char *start = input_line_pointer;
-             char c = get_symbol_end ();
+             char *start;
+             char c = get_symbol_name (&start);
 
              if (strcasecmp (start, "pc") != 0)
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer = hold;
                  str = hold;
                  goto error;
                }
-             *input_line_pointer = c;
+             (void) restore_line_pointer (c);
              goto keep_going;
            }
          else if (operand->flags & MN10300_OPERAND_EPSW)
            {
-             char *start = input_line_pointer;
-             char c = get_symbol_end ();
+             char *start;
+             char c = get_symbol_name (&start);
 
              if (strcasecmp (start, "epsw") != 0)
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer = hold;
                  str = hold;
                  goto error;
                }
-             *input_line_pointer = c;
+             (void) restore_line_pointer (c);
              goto keep_going;
            }
          else if (operand->flags & MN10300_OPERAND_PLUS)
@@ -1498,32 +1500,32 @@ md_assemble (char *str)
            }
          else if (operand->flags & MN10300_OPERAND_PSW)
            {
-             char *start = input_line_pointer;
-             char c = get_symbol_end ();
+             char *start;
+             char c = get_symbol_name (&start);
 
              if (strcasecmp (start, "psw") != 0)
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer = hold;
                  str = hold;
                  goto error;
                }
-             *input_line_pointer = c;
+             (void) restore_line_pointer (c);
              goto keep_going;
            }
          else if (operand->flags & MN10300_OPERAND_MDR)
            {
-             char *start = input_line_pointer;
-             char c = get_symbol_end ();
+             char *start;
+             char c = get_symbol_name (&start);
 
              if (strcasecmp (start, "mdr") != 0)
                {
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer = hold;
                  str = hold;
                  goto error;
                }
-             *input_line_pointer = c;
+             (void) restore_line_pointer (c);
              goto keep_going;
            }
          else if (operand->flags & MN10300_OPERAND_REG_LIST)
@@ -1554,57 +1556,56 @@ md_assemble (char *str)
                  if (*input_line_pointer == ',')
                    input_line_pointer++;
 
-                 start = input_line_pointer;
-                 c = get_symbol_end ();
+                 c = get_symbol_name (&start);
 
                  if (strcasecmp (start, "d2") == 0)
                    {
                      value |= 0x80;
-                     *input_line_pointer = c;
+                     (void) restore_line_pointer (c);
                    }
                  else if (strcasecmp (start, "d3") == 0)
                    {
                      value |= 0x40;
-                     *input_line_pointer = c;
+                     (void) restore_line_pointer (c);
                    }
                  else if (strcasecmp (start, "a2") == 0)
                    {
                      value |= 0x20;
-                     *input_line_pointer = c;
+                     (void) restore_line_pointer (c);
                    }
                  else if (strcasecmp (start, "a3") == 0)
                    {
                      value |= 0x10;
-                     *input_line_pointer = c;
+                     (void) restore_line_pointer (c);
                    }
                  else if (strcasecmp (start, "other") == 0)
                    {
                      value |= 0x08;
-                     *input_line_pointer = c;
+                     (void) restore_line_pointer (c);
                    }
                  else if (HAVE_AM33
                           && strcasecmp (start, "exreg0") == 0)
                    {
                      value |= 0x04;
-                     *input_line_pointer = c;
+                     (void) restore_line_pointer (c);
                    }
                  else if (HAVE_AM33
                           && strcasecmp (start, "exreg1") == 0)
                    {
                      value |= 0x02;
-                     *input_line_pointer = c;
+                     (void) restore_line_pointer (c);
                    }
                  else if (HAVE_AM33
                           && strcasecmp (start, "exother") == 0)
                    {
                      value |= 0x01;
-                     *input_line_pointer = c;
+                     (void) restore_line_pointer (c);
                    }
                  else if (HAVE_AM33
                           && strcasecmp (start, "all") == 0)
                    {
                      value |= 0xff;
-                     *input_line_pointer = c;
+                     (void) restore_line_pointer (c);
                    }
                  else
                    {
index 42bb115c1548d399461d9d7fc3a07b5ec6055e4f..8dd760464d0695af6480f15c0c6426ec84f0650b 100644 (file)
@@ -566,10 +566,11 @@ s_nios2_sdata (int ignore ATTRIBUTE_UNUSED)
 static void
 s_nios2_set (int equiv)
 {
-  char *directive = input_line_pointer;
-  char delim = get_symbol_end ();
+  char *directive;
+  char delim = get_symbol_name (&directive);
   char *endline = input_line_pointer;
-  *endline = delim;
+
+  (void) restore_line_pointer (delim);
 
   /* We only want to handle ".set XXX" if the
      user has tried ".set XXX, YYY" they are not
index 8cff4dc6d5dabff4340ffe1ee397c8f93d383c42..6e48f7a487f2c23dcb2d0a5e8a82787115aa2fc6 100644 (file)
@@ -860,7 +860,7 @@ register_name (expressionS *expressionP)
   else if (!reg_names_p || !ISALPHA (name[0]))
     return FALSE;
 
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT, name);
 
   /* Put back the delimiting char.  */
@@ -2142,13 +2142,12 @@ ppc_elf_lcomm (int xxx ATTRIBUTE_UNUSED)
   char *pfrag;
   int align2;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
 
-  /* just after name is now '\0'.  */
+  /* Just after name is now '\0'.  */
   p = input_line_pointer;
   *p = c;
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
   if (*input_line_pointer != ',')
     {
       as_bad (_("expected comma after symbol-name: rest of line ignored."));
@@ -2238,8 +2237,8 @@ ppc_elf_lcomm (int xxx ATTRIBUTE_UNUSED)
 static void
 ppc_elf_localentry (int ignore ATTRIBUTE_UNUSED)
 {
-  char *name = input_line_pointer;
-  char c = get_symbol_end ();
+  char *name;
+  char c = get_symbol_name (&name);
   char *p;
   expressionS exp;
   symbolS *sym;
@@ -2248,7 +2247,7 @@ ppc_elf_localentry (int ignore ATTRIBUTE_UNUSED)
 
   p = input_line_pointer;
   *p = c;
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
   if (*input_line_pointer != ',')
     {
       *p = 0;
@@ -2491,8 +2490,7 @@ parse_toc_entry (enum toc_size_qualifier *toc_kind)
   SKIP_WHITESPACE ();
 
   /* Find the spelling of the operand.  */
-  toc_spec = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&toc_spec);
 
   if (strcmp (toc_spec, "toc") == 0)
     {
@@ -2521,7 +2519,7 @@ parse_toc_entry (enum toc_size_qualifier *toc_kind)
   /* Now find the ']'.  */
   *input_line_pointer = c;
 
-  SKIP_WHITESPACE ();       /* leading whitespace could be there.  */
+  SKIP_WHITESPACE_AFTER_NAME ();       /* leading whitespace could be there.  */
   c = *input_line_pointer++; /* input_line_pointer->past char in c.  */
 
   if (c != ']')
@@ -3630,10 +3628,9 @@ ppc_comm (int lcomm)
   symbolS *sym;
   char *pfrag;
 
-  name = input_line_pointer;
-  endc = get_symbol_end ();
+  endc = get_symbol_name (&name);
   end_name = input_line_pointer;
-  *end_name = endc;
+  (void) restore_line_pointer (endc);
 
   if (*input_line_pointer != ',')
     {
@@ -3684,12 +3681,11 @@ ppc_comm (int lcomm)
        }
       ++input_line_pointer;
 
-      lcomm_name = input_line_pointer;
-      lcomm_endc = get_symbol_end ();
+      lcomm_endc = get_symbol_name (&lcomm_name);
 
       lcomm_sym = symbol_find_or_make (lcomm_name);
 
-      *input_line_pointer = lcomm_endc;
+      (void) restore_line_pointer (lcomm_endc);
 
       /* The fourth argument to .lcomm is the alignment.  */
       if (*input_line_pointer != ',')
@@ -3792,12 +3788,11 @@ ppc_csect (int ignore ATTRIBUTE_UNUSED)
   symbolS *sym;
   offsetT align;
 
-  name = input_line_pointer;
-  endc = get_symbol_end ();
+  endc = get_symbol_name (&name);
 
   sym = symbol_find_or_make (name);
 
-  *input_line_pointer = endc;
+  (void) restore_line_pointer (endc);
 
   if (S_GET_NAME (sym)[0] == '\0')
     {
@@ -3965,15 +3960,14 @@ ppc_dwsect (int ignore ATTRIBUTE_UNUSED)
   /* Parse opt-label.  */
   if (*input_line_pointer == ',')
     {
-      const char *label;
+      char *label;
       char c;
 
       ++input_line_pointer;
 
-      label = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&label);
       opt_label = symbol_find_or_make (label);
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
     }
   else
     opt_label = NULL;
@@ -4103,8 +4097,7 @@ ppc_named_section (int ignore ATTRIBUTE_UNUSED)
   char c;
   symbolS *sym;
 
-  user_name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&user_name);
 
   if (strcmp (user_name, ".text") == 0)
     real_name = ".text[PR]";
@@ -4113,12 +4106,12 @@ ppc_named_section (int ignore ATTRIBUTE_UNUSED)
   else
     {
       as_bad (_("the XCOFF file format does not support arbitrary sections"));
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
       ignore_rest_of_line ();
       return;
     }
 
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   sym = symbol_find_or_make (real_name);
 
@@ -4135,12 +4128,11 @@ ppc_extern (int ignore ATTRIBUTE_UNUSED)
   char *name;
   char endc;
 
-  name = input_line_pointer;
-  endc = get_symbol_end ();
+  endc = get_symbol_name (&name);
 
   (void) symbol_find_or_make (name);
 
-  *input_line_pointer = endc;
+  (void) restore_line_pointer (endc);
 
   demand_empty_rest_of_line ();
 }
@@ -4154,12 +4146,11 @@ ppc_lglobl (int ignore ATTRIBUTE_UNUSED)
   char endc;
   symbolS *sym;
 
-  name = input_line_pointer;
-  endc = get_symbol_end ();
+  endc = get_symbol_name (&name);
 
   sym = symbol_find_or_make (name);
 
-  *input_line_pointer = endc;
+  (void) restore_line_pointer (endc);
 
   symbol_get_tc (sym)->output = 1;
 
@@ -4192,14 +4183,13 @@ ppc_ref (int ignore ATTRIBUTE_UNUSED)
 
   do
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
 
       fix_at_start (symbol_get_frag (ppc_current_csect), 0,
                    symbol_find_or_make (name), 0, FALSE, BFD_RELOC_NONE);
 
       *input_line_pointer = c;
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
       c = *input_line_pointer;
       if (c == ',')
        {
@@ -4229,12 +4219,11 @@ ppc_rename (int ignore ATTRIBUTE_UNUSED)
   symbolS *sym;
   int len;
 
-  name = input_line_pointer;
-  endc = get_symbol_end ();
+  endc = get_symbol_name (&name);
 
   sym = symbol_find_or_make (name);
 
-  *input_line_pointer = endc;
+  (void) restore_line_pointer (endc);
 
   if (*input_line_pointer != ',')
     {
@@ -4393,8 +4382,7 @@ ppc_function (int ignore ATTRIBUTE_UNUSED)
   symbolS *ext_sym;
   symbolS *lab_sym;
 
-  name = input_line_pointer;
-  endc = get_symbol_end ();
+  endc = get_symbol_name (&name);
 
   /* Ignore any [PR] suffix.  */
   name = ppc_canonicalize_symbol_name (name);
@@ -4405,7 +4393,7 @@ ppc_function (int ignore ATTRIBUTE_UNUSED)
 
   ext_sym = symbol_find_or_make (name);
 
-  *input_line_pointer = endc;
+  (void) restore_line_pointer (endc);
 
   if (*input_line_pointer != ',')
     {
@@ -4415,12 +4403,11 @@ ppc_function (int ignore ATTRIBUTE_UNUSED)
     }
   ++input_line_pointer;
 
-  name = input_line_pointer;
-  endc = get_symbol_end ();
+  endc = get_symbol_name (&name);
 
   lab_sym = symbol_find_or_make (name);
 
-  *input_line_pointer = endc;
+  (void) restore_line_pointer (endc);
 
   if (ext_sym != lab_sym)
     {
@@ -4599,12 +4586,11 @@ ppc_bs (int ignore ATTRIBUTE_UNUSED)
   if (ppc_current_block != NULL)
     as_bad (_("nested .bs blocks"));
 
-  name = input_line_pointer;
-  endc = get_symbol_end ();
+  endc = get_symbol_name (&name);
 
   csect = symbol_find_or_make (name);
 
-  *input_line_pointer = endc;
+  (void) restore_line_pointer (endc);
 
   sym = symbol_make (".bs");
   S_SET_SEGMENT (sym, now_seg);
@@ -4881,12 +4867,11 @@ ppc_tc (int ignore ATTRIBUTE_UNUSED)
        return;
       }
 
-    name = input_line_pointer;
-    endc = get_symbol_end ();
+    endc = get_symbol_name (&name);
 
     sym = symbol_find_or_make (name);
 
-    *input_line_pointer = endc;
+    (void) restore_line_pointer (endc);
 
     if (S_IS_DEFINED (sym))
       {
@@ -4952,6 +4937,7 @@ ppc_tc (int ignore ATTRIBUTE_UNUSED)
 static void
 ppc_machine (int ignore ATTRIBUTE_UNUSED)
 {
+  char c;
   char *cpu_string;
 #define MAX_HISTORY 100
   static ppc_cpu_t *cpu_history;
@@ -4959,19 +4945,9 @@ ppc_machine (int ignore ATTRIBUTE_UNUSED)
 
   SKIP_WHITESPACE ();
 
-  if (*input_line_pointer == '"')
-    {
-      int len;
-      cpu_string = demand_copy_C_string (&len);
-    }
-  else
-    {
-      char c;
-      cpu_string = input_line_pointer;
-      c = get_symbol_end ();
-      cpu_string = xstrdup (cpu_string);
-      *input_line_pointer = c;
-    }
+  c = get_symbol_name (&cpu_string);
+  cpu_string = xstrdup (cpu_string);
+  (void) restore_line_pointer (c);
 
   if (cpu_string != NULL)
     {
@@ -5210,8 +5186,7 @@ ppc_znop (int ignore ATTRIBUTE_UNUSED)
   char *name;
 
   /* Strip out the symbol name.  */
-  symbol_name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&symbol_name);
 
   name = xmalloc (input_line_pointer - symbol_name + 1);
   strcpy (name, symbol_name);
@@ -5220,7 +5195,7 @@ ppc_znop (int ignore ATTRIBUTE_UNUSED)
 
   *input_line_pointer = c;
 
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
 
   /* Look up the opcode in the hash table.  */
   opcode = (const struct powerpc_opcode *) hash_find (ppc_hash, "nop");
@@ -5256,13 +5231,12 @@ ppc_pe_comm (int lcomm)
   symbolS *symbolP;
   offsetT align;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
 
   /* just after name is now '\0'.  */
   p = input_line_pointer;
   *p = c;
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
   if (*input_line_pointer != ',')
     {
       as_bad (_("expected comma after symbol-name: rest of line ignored."));
@@ -5387,15 +5361,14 @@ ppc_pe_section (int ignore ATTRIBUTE_UNUSED)
   segT sec;
   int align;
 
-  section_name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&section_name);
 
   name = xmalloc (input_line_pointer - section_name + 1);
   strcpy (name, section_name);
 
   *input_line_pointer = c;
 
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
 
   exp = 0;
   flags = SEC_NO_FLAGS;
@@ -5543,12 +5516,11 @@ ppc_pe_function (int ignore ATTRIBUTE_UNUSED)
   char endc;
   symbolS *ext_sym;
 
-  name = input_line_pointer;
-  endc = get_symbol_end ();
+  endc = get_symbol_name (&name);
 
   ext_sym = symbol_find_or_make (name);
 
-  *input_line_pointer = endc;
+  (void) restore_line_pointer (endc);
 
   S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
   SF_SET_FUNCTION (ext_sym);
index 325012794478d552f9638be043c03f431ede025f..8d459b6ca0280224c9883547ad15d04d4980b734 100644 (file)
@@ -168,11 +168,11 @@ register_name (expressionS *expressionP)
   else
     return FALSE;
 
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   reg_number = reg_name_search (name);
 
   /* Put back the delimiting char.  */
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   /* Look to see if it's in the register table.  */
   if (reg_number >= 0)
@@ -1793,10 +1793,9 @@ s390_machine (int ignore ATTRIBUTE_UNUSED)
   else
     {
       char c;
-      cpu_string = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&cpu_string);
       cpu_string = xstrdup (cpu_string);
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
     }
 
   if (cpu_string != NULL)
@@ -1848,19 +1847,13 @@ s390_machinemode (int ignore ATTRIBUTE_UNUSED)
 
   SKIP_WHITESPACE ();
 
-  if (*input_line_pointer == '"')
-    {
-      int len;
-      mode_string = demand_copy_C_string (&len);
-    }
-  else
-    {
-      char c;
-      mode_string = input_line_pointer;
-      c = get_symbol_end ();
-      mode_string = xstrdup (mode_string);
-      *input_line_pointer = c;
-    }
+  {
+    char c;
+
+    c = get_symbol_name (&mode_string);
+    mode_string = xstrdup (mode_string);
+    (void) restore_line_pointer (c);
+  }
 
   if (mode_string != NULL)
     {
index dd2703f2ddd6ad7e986214f95a3d27f00fee34a1..49ed5f21d0cdb66f699ad423066c8c9e4dc94987 100644 (file)
@@ -5619,10 +5619,9 @@ s3_get_symbol (void)
   char *name;
   symbolS *p;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   p = (symbolS *) symbol_find_or_make (name);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
   return p;
 }
 
@@ -6095,10 +6094,9 @@ s3_s_score_lcomm (int bytes_p)
   segT bss_seg = bss_section;
   int needs_align = 0;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   p = input_line_pointer;
-  *p = c;
+  (void) restore_line_pointer (c);
 
   if (name == p)
     {
index 19241bacce6069461c8735775129472d9a4e3fe6..e8af0559e215e05828f94caa1de8b372a77440e3 100644 (file)
@@ -5471,10 +5471,9 @@ s7_get_symbol (void)
   char *name;
   symbolS *p;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   p = (symbolS *) symbol_find_or_make (name);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
   return p;
 }
 
@@ -5954,8 +5953,7 @@ s7_s_score_lcomm (int bytes_p)
   segT bss_seg = bss_section;
   int needs_align = 0;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   p = input_line_pointer;
   *p = c;
 
@@ -5966,7 +5964,7 @@ s7_s_score_lcomm (int bytes_p)
       return;
     }
 
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
 
   /* Accept an optional comma after the name.  The comma used to be
      required, but Irix 5 cc does not generate it.  */
index edadfb81c2fdc12debe4bff0e70092fda240924f..6e7a3ef14f6e578c434ba3be0a9482fa512064a7 100644 (file)
@@ -3975,11 +3975,10 @@ s_reserve (int ignore ATTRIBUTE_UNUSED)
   int temp;
   symbolS *symbolP;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   p = input_line_pointer;
   *p = c;
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
 
   if (*input_line_pointer != ',')
     {
@@ -4117,12 +4116,11 @@ s_common (int ignore ATTRIBUTE_UNUSED)
   offsetT temp, size;
   symbolS *symbolP;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   /* Just after name is now '\0'.  */
   p = input_line_pointer;
   *p = c;
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
   if (*input_line_pointer != ',')
     {
       as_bad (_("Expected comma after symbol-name"));
@@ -4388,7 +4386,7 @@ s_register (int ignore ATTRIBUTE_UNUSED)
   char c;
   int reg;
   int flags;
-  const char *regname;
+  char *regname;
 
   if (input_line_pointer[0] != '%'
       || input_line_pointer[1] != 'g'
@@ -4402,8 +4400,7 @@ s_register (int ignore ATTRIBUTE_UNUSED)
   if (*input_line_pointer == '#')
     {
       ++input_line_pointer;
-      regname = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&regname);
       if (strcmp (regname, "scratch") && strcmp (regname, "ignore"))
        as_bad (_("register syntax is .register %%g[2367],{#scratch|symbolname|#ignore}"));
       if (regname[0] == 'i')
@@ -4413,9 +4410,9 @@ s_register (int ignore ATTRIBUTE_UNUSED)
     }
   else
     {
-      regname = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&regname);
     }
+
   if (sparc_arch_size == 64)
     {
       if (globals[reg])
@@ -4462,7 +4459,7 @@ s_register (int ignore ATTRIBUTE_UNUSED)
        }
     }
 
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   demand_empty_rest_of_line ();
 }
index c27c8d1172aab9e6157ffd9aed73b725dc09a7af..a4ca8b702d7fdde9064ad9bc02bbcf1abc7c5170 100644 (file)
@@ -727,8 +727,7 @@ tic4x_asg (int x ATTRIBUTE_UNUSED)
       return;
     }
   *input_line_pointer++ = '\0';
-  name = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
+  c = get_symbol_name (&name); /* Get terminator.  */
   tmp = xmalloc (strlen (str) + 1);
   strcpy (tmp, str);
   str = tmp;
@@ -739,7 +738,7 @@ tic4x_asg (int x ATTRIBUTE_UNUSED)
     hash_replace (tic4x_asg_hash, name, (void *) str);
   else
     hash_insert (tic4x_asg_hash, name, (void *) str);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
   demand_empty_rest_of_line ();
 }
 
@@ -759,8 +758,9 @@ tic4x_bss (int x ATTRIBUTE_UNUSED)
   current_subseg = now_subseg; /* Save current subseg.  */
 
   SKIP_WHITESPACE ();
-  name = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
+  c = get_symbol_name (&name); /* Get terminator.  */
+  if (c == '"')
+    c = * ++ input_line_pointer;
   if (c != ',')
     {
       as_bad (_(".bss size argument missing\n"));
@@ -807,11 +807,10 @@ tic4x_globl (int ignore ATTRIBUTE_UNUSED)
 
   do
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       symbolP = symbol_find_or_make (name);
       *input_line_pointer = c;
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
       S_SET_STORAGE_CLASS (symbolP, C_EXT);
       S_SET_EXTERNAL (symbolP);
       if (c == ',')
@@ -939,10 +938,9 @@ tic4x_eval (int x ATTRIBUTE_UNUSED)
       as_bad (_("Symbol missing\n"));
       return;
     }
-  name = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
+  c = get_symbol_name (&name); /* Get terminator.  */
   tic4x_insert_sym (name, value);
-  *input_line_pointer++ = c;
+  (void) restore_line_pointer (c);
   demand_empty_rest_of_line ();
 }
 
@@ -967,8 +965,9 @@ tic4x_sect (int x ATTRIBUTE_UNUSED)
   SKIP_WHITESPACE ();
   if (*input_line_pointer == '"')
     input_line_pointer++;
-  section_name = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
+  c = get_symbol_name (&section_name); /* Get terminator.  */
+  if (c == '"')
+    c = * ++ input_line_pointer;
   input_line_pointer++;                /* Skip null symbol terminator.  */
   name = xmalloc (input_line_pointer - section_name + 1);
   strcpy (name, section_name);
@@ -980,13 +979,16 @@ tic4x_sect (int x ATTRIBUTE_UNUSED)
      Volker Kuhlmann  <v.kuhlmann@elec.canterbury.ac.nz>.  */
   if (c == ':')
     {
-      c = get_symbol_end ();   /* Get terminator.  */
+      char *subname;
+      c = get_symbol_name (&subname);  /* Get terminator.  */
+      if (c == '"')
+       c = * ++ input_line_pointer;
       input_line_pointer++;    /* Skip null symbol terminator.  */
       as_warn (_(".sect: subsection name ignored"));
     }
 
   /* We might still have a '"' to discard, but the character after a
-     symbol name will be overwritten with a \0 by get_symbol_end()
+     symbol name will be overwritten with a \0 by get_symbol_name()
      [VK].  */
 
   if (c == ',')
@@ -1014,7 +1016,7 @@ tic4x_sect (int x ATTRIBUTE_UNUSED)
                 bfd_errmsg (bfd_get_error ()));
     }
 
-  /* If the last character overwritten by get_symbol_end() was an
+  /* If the last character overwritten by get_symbol_name() was an
      end-of-line, we must restore it or the end of the line will not be
      recognised and scanning extends into the next line, stopping with
      an error (blame Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
@@ -1037,8 +1039,9 @@ tic4x_set (int x ATTRIBUTE_UNUSED)
       char c;
       char *name;
 
-      name = input_line_pointer;
-      c = get_symbol_end ();   /* Get terminator.  */
+      c = get_symbol_name (&name);     /* Get terminator.  */
+      if (c == '"')
+       c = * ++ input_line_pointer;
       if (c != ',')
        {
          as_bad (_(".set syntax invalid\n"));
@@ -1073,8 +1076,9 @@ tic4x_usect (int x ATTRIBUTE_UNUSED)
   SKIP_WHITESPACE ();
   if (*input_line_pointer == '"')
     input_line_pointer++;
-  section_name = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
+  c = get_symbol_name (&section_name); /* Get terminator.  */
+  if (c == '"')
+    c = * ++ input_line_pointer;
   input_line_pointer++;                /* Skip null symbol terminator.  */
   name = xmalloc (input_line_pointer - section_name + 1);
   strcpy (name, section_name);
@@ -1513,17 +1517,16 @@ tic4x_operand_parse (char *s, tic4x_operand_t *operand)
   input_line_pointer = s;
   SKIP_WHITESPACE ();
 
-  str = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
+  c = get_symbol_name (&str);  /* Get terminator.  */
   new_pointer = input_line_pointer;
   if (strlen (str) && (entry = hash_find (tic4x_asg_hash, str)) != NULL)
     {
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
       input_line_pointer = (char *) entry;
     }
   else
     {
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
       input_line_pointer = str;
     }
 
index 5edd045c7e89929d1c2e86fdbcb3c5d0ff58cb28..2637d1080bcaf71287752f6d44fabc19e2dcfda8 100644 (file)
@@ -351,8 +351,8 @@ tic54x_asg (int x ATTRIBUTE_UNUSED)
       return;
     }
 
-  name = ++input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
+  ++input_line_pointer;
+  c = get_symbol_name (&name); /* Get terminator.  */
   if (!ISALPHA (*name))
     {
       as_bad (_("symbols assigned with .asg must begin with a letter"));
@@ -367,7 +367,7 @@ tic54x_asg (int x ATTRIBUTE_UNUSED)
   strcpy (tmp, name);
   name = tmp;
   subsym_create_or_replace (name, str);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
   demand_empty_rest_of_line ();
 }
 
@@ -411,11 +411,10 @@ tic54x_eval (int x ATTRIBUTE_UNUSED)
       ignore_rest_of_line ();
       return;
     }
-  name = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
+  c = get_symbol_name (&name); /* Get terminator.  */
   tmp = xmalloc (strlen (name) + 1);
   name = strcpy (tmp, name);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   if (!ISALPHA (*name))
     {
@@ -471,8 +470,9 @@ tic54x_bss (int x ATTRIBUTE_UNUSED)
   current_seg = now_seg;       /* Save current seg.  */
   current_subseg = now_subseg; /* Save current subseg.  */
 
-  name = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
+  c = get_symbol_name (&name); /* Get terminator.  */
+  if (c == '"')
+    c = * ++ input_line_pointer;
   if (c != ',')
     {
       as_bad (_(".bss size argument missing\n"));
@@ -782,8 +782,8 @@ tic54x_endstruct (int is_union)
 static void
 tic54x_tag (int ignore ATTRIBUTE_UNUSED)
 {
-  char *name = input_line_pointer;
-  int c = get_symbol_end ();
+  char *name;
+  int c = get_symbol_name (&name);
   struct stag *stag = (struct stag *) hash_find (stag_hash, name);
 
   if (!stag)
@@ -829,7 +829,7 @@ tic54x_tag (int ignore ATTRIBUTE_UNUSED)
   if (current_stag != NULL && !current_stag->is_union)
     abs_section_offset += stag->size;
 
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
   demand_empty_rest_of_line ();
   line_label = NULL;
 }
@@ -1109,11 +1109,10 @@ tic54x_global (int type)
 
   do
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       symbolP = symbol_find_or_make (name);
+      c = restore_line_pointer (c);
 
-      *input_line_pointer = c;
       S_SET_STORAGE_CLASS (symbolP, C_EXT);
       if (c == ',')
        {
@@ -1184,13 +1183,14 @@ tic54x_sect (int arg)
       else
        {
          int c;
-         name = input_line_pointer;
-         c = get_symbol_end ();
+
+         c = get_symbol_name (&name);
           len = strlen(name);
          name = strcpy (xmalloc (len + 10), name);
-         *input_line_pointer = c;
+         (void) restore_line_pointer (c);
          demand_empty_rest_of_line ();
        }
+
       /* Make sure all named initialized sections flagged properly.  If we
          encounter instructions, we'll flag it with SEC_CODE as well.  */
       strcat (name, ",\"w\"\n");
@@ -1366,17 +1366,14 @@ tic54x_usect (int x ATTRIBUTE_UNUSED)
   current_seg = now_seg;       /* Save current seg.  */
   current_subseg = now_subseg; /* Save current subseg.  */
 
-  if (*input_line_pointer == '"')
-    input_line_pointer++;
-  section_name = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
-  input_line_pointer++;                /* Skip null symbol terminator.  */
+  c = get_symbol_name (&section_name); /* Get terminator.  */
   name = xmalloc (input_line_pointer - section_name + 1);
   strcpy (name, section_name);
-
-  if (*input_line_pointer == ',')
+  c = restore_line_pointer (c);
+  
+  if (c == ',')
     ++input_line_pointer;
-  else if (c != ',')
+  else
     {
       as_bad (_("Missing size argument"));
       ignore_rest_of_line ();
@@ -2008,17 +2005,17 @@ tic54x_message (int type)
 static void
 tic54x_label (int ignored ATTRIBUTE_UNUSED)
 {
-  char *name = input_line_pointer;
+  char *name;
   symbolS *symbolP;
   int c;
 
   ILLEGAL_WITHIN_STRUCT ();
 
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   symbolP = colon (name);
   S_SET_STORAGE_CLASS (symbolP, C_STATLAB);
 
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
   demand_empty_rest_of_line ();
 }
 
@@ -2141,12 +2138,12 @@ tic54x_sblock (int ignore ATTRIBUTE_UNUSED)
        }
       else
        {
-         char *section_name = input_line_pointer;
+         char *section_name;
 
-         c = get_symbol_end ();
+         c = get_symbol_name (&section_name);
          name = xmalloc (strlen (section_name) + 1);
          strcpy (name, section_name);
-         *input_line_pointer = c;
+         (void) restore_line_pointer (c);
        }
 
       seg = bfd_get_section_by_name (stdoutput, name);
@@ -2256,12 +2253,11 @@ tic54x_var (int ignore ATTRIBUTE_UNUSED)
          ignore_rest_of_line ();
          return;
        }
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       /* .var symbols start out with a null string.  */
       name = strcpy (xmalloc (strlen (name) + 1), name);
       hash_insert (subsym_hash[macro_level], name, empty);
-      *input_line_pointer = c;
+      c = restore_line_pointer (c);
       if (c == ',')
        {
          ++input_line_pointer;
@@ -4500,8 +4496,8 @@ subsym_substitute (char *line, int forced)
          if (forced)
            ++ptr;
 
-         name = input_line_pointer = ptr;
-         c = get_symbol_end ();
+         input_line_pointer = ptr;
+         c = get_symbol_name (&name);
          /* '?' is not normally part of a symbol, but it IS part of a local
             label.  */
          if (c == '?')
@@ -4846,7 +4842,7 @@ md_assemble (char *line)
   int c;
 
   input_line_pointer = line;
-  c = get_symbol_end ();
+  c = get_symbol_name (&line);
 
   if (cpu == VNONE)
     cpu = V542;
index 1dd2e9223c518146e7d23e073ec53809416fbaf5..64d39beecc9723f79b1d5f7cd6af78492e8dbf41 100644 (file)
@@ -471,17 +471,15 @@ s_tic6x_personalityindex (int ignored ATTRIBUTE_UNUSED)
 static void
 s_tic6x_personality (int ignored ATTRIBUTE_UNUSED)
 {
-  char *name, *p, c;
+  char *name, c;
   tic6x_unwind_info *unwind = tic6x_get_unwind ();
 
   if (unwind->personality_routine || unwind->personality_index != -1)
     as_bad (_("duplicate .personality directive"));
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
-  p = input_line_pointer;
+  c = get_symbol_name (&name);
   unwind->personality_routine = symbol_find_or_make (name);
-  *p = c;
+  (void) restore_line_pointer (c);
   demand_empty_rest_of_line ();
 }
 
@@ -570,12 +568,11 @@ s_tic6x_scomm (int ignore ATTRIBUTE_UNUSED)
   offsetT align;
   int align2;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
 
   /* Just after name is now '\0'.  */
   p = input_line_pointer;
-  *p = c;
+  (void) restore_line_pointer (c);
   SKIP_WHITESPACE ();
   if (*input_line_pointer != ',')
     {
index efc38563c3925fe27710cac7c8ebb21add483383..d1e8967aa0fee6cf6fcd74beed564b0ce4a06772 100644 (file)
@@ -1085,33 +1085,32 @@ tilegx_parse_name (char *name, expressionS *e, char *nextcharP)
 static void
 parse_reg_expression (expressionS* expression)
 {
+  char *regname;
+  char terminating_char;
+  void *pval;
+  int regno_and_flags;
+  int regno;
+
   /* Zero everything to make sure we don't miss any flags.  */
   memset (expression, 0, sizeof *expression);
 
-  char* regname = input_line_pointer;
-  char terminating_char = get_symbol_end ();
-
-  void* pval = hash_find (main_reg_hash, regname);
+  terminating_char = get_symbol_name (&regname);
 
+  pval = hash_find (main_reg_hash, regname);
   if (pval == NULL)
-    {
-      as_bad (_("Expected register, got '%s'."), regname);
-    }
+    as_bad (_("Expected register, got '%s'."), regname);
 
-  int regno_and_flags = (int)(size_t)pval;
-  int regno = EXTRACT_REGNO(regno_and_flags);
+  regno_and_flags = (int)(size_t)pval;
+  regno = EXTRACT_REGNO(regno_and_flags);
 
   if ((regno_and_flags & NONCANONICAL_REG_NAME_FLAG)
       && require_canonical_reg_names)
-    {
-      as_warn (_("Found use of non-canonical register name %s; "
-                "use %s instead."),
-              regname,
-              tilegx_register_names[regno]);
-    }
+    as_warn (_("Found use of non-canonical register name %s; "
+              "use %s instead."),
+            regname, tilegx_register_names[regno]);
 
   /* Restore the old character following the register name.  */
-  *input_line_pointer = terminating_char;
+  (void) restore_line_pointer (terminating_char);
 
   /* Fill in the expression fields to indicate it's a register.  */
   expression->X_op = O_register;
index 7f76de1b6f3122c0dc4390585061ed9320ecaa47..e7c7c642d925a80a9cc1d0ada23bc31adcf62910 100644 (file)
@@ -980,8 +980,7 @@ parse_reg_expression (expressionS* expression)
   /* Zero everything to make sure we don't miss any flags.  */
   memset (expression, 0, sizeof *expression);
 
-  char* regname = input_line_pointer;
-  char terminating_char = get_symbol_end ();
+  char terminating_char = get_symbol_name (&regname);
 
   void* pval = hash_find (main_reg_hash, regname);
 
@@ -998,7 +997,7 @@ parse_reg_expression (expressionS* expression)
               regname, tilepro_register_names[regno]);
 
   /* Restore the old character following the register name.  */
-  *input_line_pointer = terminating_char;
+  (void) restore_line_pointer (terminating_char);
 
   /* Fill in the expression fields to indicate it's a register.  */
   expression->X_op = O_register;
index e6f35b8acd3ee40d2c8a4c3d10b7306f05406e4a..f42e767dcf6907e9f2b51b10791ab70a8e647693 100644 (file)
@@ -270,8 +270,7 @@ v850_comm (int area)
   symbolS *symbolP;
   int have_align;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
 
   /* Just after name is now '\0'.  */
   p = input_line_pointer;
@@ -1005,15 +1004,14 @@ register_name (expressionS *expressionP)
   char c;
 
   /* Find the spelling of the operand.  */
-  start = name = input_line_pointer;
-
-  c = get_symbol_end ();
+  start = input_line_pointer;
+  c = get_symbol_name (&name);
 
   reg_number = reg_name_search (pre_defined_registers, REG_NAME_CNT,
                                name, FALSE);
 
   /* Put back the delimiting char.  */
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   expressionP->X_add_symbol = NULL;
   expressionP->X_op_symbol  = NULL;
@@ -1057,14 +1055,13 @@ system_register_name (expressionS *expressionP,
   char c;
 
   /* Find the spelling of the operand.  */
-  start = name = input_line_pointer;
-
-  c = get_symbol_end ();
+  start = input_line_pointer;
+  c = get_symbol_name (&name);
   reg_number = reg_name_search (system_registers, SYSREG_NAME_CNT, name,
                                accept_numbers);
 
   /* Put back the delimiting char.  */
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   if (reg_number < 0
       && accept_numbers)
@@ -1118,13 +1115,12 @@ cc_name (expressionS *expressionP,
   char c;
 
   /* Find the spelling of the operand.  */
-  start = name = input_line_pointer;
-
-  c = get_symbol_end ();
+  start = input_line_pointer;
+  c = get_symbol_name (&name);
   reg_number = reg_name_search (cc_names, CC_NAME_CNT, name, accept_numbers);
 
   /* Put back the delimiting char.  */
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   if (reg_number < 0
       && accept_numbers)
@@ -1169,13 +1165,12 @@ float_cc_name (expressionS *expressionP,
   char c;
 
   /* Find the spelling of the operand.  */
-  start = name = input_line_pointer;
-
-  c = get_symbol_end ();
+  start = input_line_pointer;
+  c = get_symbol_name (&name);
   reg_number = reg_name_search (float_cc_names, FLOAT_CC_NAME_CNT, name, accept_numbers);
 
   /* Put back the delimiting char.  */
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   if (reg_number < 0
       && accept_numbers)
@@ -1220,13 +1215,12 @@ cacheop_name (expressionS * expressionP,
   char c;
 
   /* Find the spelling of the operand.  */
-  start = name = input_line_pointer;
-
-  c = get_symbol_end ();
+  start = input_line_pointer;
+  c = get_symbol_name (&name);
   reg_number = reg_name_search (cacheop_names, CACHEOP_NAME_CNT, name, accept_numbers);
 
   /* Put back the delimiting char.  */
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   if (reg_number < 0
       && accept_numbers)
@@ -1269,13 +1263,12 @@ prefop_name (expressionS * expressionP,
   char c;
 
   /* Find the spelling of the operand.  */
-  start = name = input_line_pointer;
-
-  c = get_symbol_end ();
+  start = input_line_pointer;
+  c = get_symbol_name (&name);
   reg_number = reg_name_search (prefop_names, PREFOP_NAME_CNT, name, accept_numbers);
 
   /* Put back the delimiting char.  */
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   if (reg_number < 0
       && accept_numbers)
@@ -1317,15 +1310,14 @@ vector_register_name (expressionS *expressionP)
   char c;
 
   /* Find the spelling of the operand.  */
-  start = name = input_line_pointer;
-
-  c = get_symbol_end ();
+  start = input_line_pointer;
+  c = get_symbol_name (&name);
 
   reg_number = reg_name_search (vector_registers, VREG_NAME_CNT,
                                name, FALSE);
 
   /* Put back the delimiting char.  */
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   expressionP->X_add_symbol = NULL;
   expressionP->X_op_symbol  = NULL;
@@ -2792,18 +2784,19 @@ md_assemble (char *str)
              else if ((operand->flags & V850_OPERAND_EP) != 0)
                {
                  char *start = input_line_pointer;
-                 char c = get_symbol_end ();
+                 char *name;
+                 char c = get_symbol_name (&name);
 
-                 if (strcmp (start, "ep") != 0 && strcmp (start, "r30") != 0)
+                 if (strcmp (name, "ep") != 0 && strcmp (name, "r30") != 0)
                    {
                      /* Put things back the way we found them.  */
-                     *input_line_pointer = c;
+                     (void) restore_line_pointer (c);
                      input_line_pointer = start;
                      errmsg = _("expected EP register");
                      goto error;
                    }
 
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  str = input_line_pointer;
                  input_line_pointer = hold;
 
@@ -2850,6 +2843,7 @@ md_assemble (char *str)
              else if ((register_name (&ex)
                        && (operand->flags & V850_OPERAND_REG) == 0))
                {
+                 char *name;
                  char c;
                  int exists = 0;
 
@@ -2862,12 +2856,12 @@ md_assemble (char *str)
 
                  input_line_pointer = str;
 
-                 c = get_symbol_end ();
+                 c = get_symbol_name (&name);
 
-                 if (symbol_find (str) != NULL)
+                 if (symbol_find (name) != NULL)
                    exists = 1;
 
-                 *input_line_pointer = c;
+                 (void) restore_line_pointer (c);
                  input_line_pointer = str;
 
                  expression (&ex);
index b8b1e7d6bfe2d33f2914fbfe17f4bbc2b9a652d2..d707da8793e309b27172c72e0b5c6fa843594f0a 100644 (file)
@@ -1548,11 +1548,11 @@ xtensa_literal_pseudo (int ignored ATTRIBUTE_UNUSED)
   frag_align (2, 0, 0);
   record_alignment (now_seg, 2);
 
-  c = get_symbol_end ();
+  c = get_symbol_name (&base_name);
   /* Just after name is now '\0'.  */
   p = input_line_pointer;
   *p = c;
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
 
   if (*input_line_pointer != ',' && *input_line_pointer != ':')
     {
@@ -1562,11 +1562,11 @@ xtensa_literal_pseudo (int ignored ATTRIBUTE_UNUSED)
       xtensa_restore_emit_state (&state);
       return;
     }
-  *p = 0;
 
+  *p = 0;
   colon (base_name);
-
   *p = c;
+
   input_line_pointer++;                /* skip ',' or ':' */
 
   xtensa_elf_cons (4);
index 4931a486d29dc99f022c1d31106e5682d641dbfb..87ed1795a43bc49b5680054461076529c4fc1e74 100644 (file)
@@ -332,6 +332,7 @@ z80_start_line_hook (void)
   /* Check for <label>[:] [.](EQU|DEFL) <value>.  */
   if (is_name_beginner (*input_line_pointer))
     {
+      char *name;
       char c, *rest, *line_start;
       int len;
 
@@ -339,7 +340,7 @@ z80_start_line_hook (void)
       if (ignore_input ())
        return 0;
 
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       rest = input_line_pointer + 1;
 
       if (*rest == ':')
@@ -364,13 +365,13 @@ z80_start_line_hook (void)
            }
          input_line_pointer = rest + len - 1;
          /* Allow redefining with "DEFL" (len == 4), but not with "EQU".  */
-         equals (line_start, len == 4);
+         equals (name, len == 4);
          return 1;
        }
       else
        {
          /* Restore line and pointer.  */
-         *input_line_pointer = c;
+         (void) restore_line_pointer (c);
          input_line_pointer = line_start;
        }
     }
index c2f2f8683db224aa4dda7c091c87411bb1fc4ccd..fa3221e20be9ba89c5a8a45928e2a9defa3b58ca 100644 (file)
@@ -2740,10 +2740,15 @@ On most machines, you can also use @code{$} in symbol names; exceptions
 are noted in @ref{Machine Dependencies}.
 @end ifset
 No symbol may begin with a digit.  Case is significant.
-There is no length limit: all characters are significant.  Multibyte characters
+There is no length limit; all characters are significant.  Multibyte characters
 are supported.  Symbols are delimited by characters not in that set, or by the
 beginning of a file (since the source program must end with a newline, the end
 of a file is not a possible symbol delimiter).  @xref{Symbols}.
+
+Symbol names may also be enclosed in double quote @code{"} characters.  In such
+cases any characters are allowed, except for the NUL character.  If a double
+quote character is to be included in the symbol name it must be preceeded by a
+backslash @code{\} character.
 @cindex length of symbols
 
 @node Statements
index 87f135b6be0cf7963c9badbc1901ea713e261782..89bdc9afc6227781239f3f5377c715fa289b3392 100644 (file)
@@ -754,13 +754,12 @@ tc_parse_to_dw2regnum (expressionS *exp)
     {
       char *name, c;
 
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (& name);
 
       exp->X_op = O_constant;
       exp->X_add_number = tc_regname_to_dw2regnum (name);
 
-      *input_line_pointer = c;
+      restore_line_pointer (c);
     }
   else
 # endif
@@ -1197,13 +1196,14 @@ dot_cfi_sections (int ignored ATTRIBUTE_UNUSED)
   int sections = 0;
 
   SKIP_WHITESPACE ();
-  if (is_name_beginner (*input_line_pointer))
+  if (is_name_beginner (*input_line_pointer) || *input_line_pointer == '"')
     while (1)
       {
+       char * saved_ilp;
        char *name, c;
 
-       name = input_line_pointer;
-       c = get_symbol_end ();
+       saved_ilp = input_line_pointer;
+       c = get_symbol_name (& name);
 
        if (strncmp (name, ".eh_frame", sizeof ".eh_frame") == 0
            && name[9] != '_')
@@ -1224,23 +1224,23 @@ dot_cfi_sections (int ignored ATTRIBUTE_UNUSED)
        else
          {
            *input_line_pointer = c;
-           input_line_pointer = name;
+           input_line_pointer = saved_ilp;
            break;
          }
 
        *input_line_pointer = c;
-       SKIP_WHITESPACE ();
+       SKIP_WHITESPACE_AFTER_NAME ();
        if (*input_line_pointer == ',')
          {
            name = input_line_pointer++;
            SKIP_WHITESPACE ();
-           if (!is_name_beginner (*input_line_pointer))
+           if (!is_name_beginner (*input_line_pointer) && *input_line_pointer != '"')
              {
                input_line_pointer = name;
                break;
              }
          }
-       else if (is_name_beginner (*input_line_pointer))
+       else if (is_name_beginner (*input_line_pointer) || *input_line_pointer == '"')
          break;
       }
 
@@ -1266,20 +1266,20 @@ dot_cfi_startproc (int ignored ATTRIBUTE_UNUSED)
   cfi_new_fde (symbol_temp_new_now ());
 
   SKIP_WHITESPACE ();
-  if (is_name_beginner (*input_line_pointer))
+  if (is_name_beginner (*input_line_pointer) || *input_line_pointer == '"')
     {
+      char * saved_ilp = input_line_pointer;
       char *name, c;
 
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (& name);
 
       if (strcmp (name, "simple") == 0)
        {
          simple = 1;
-         *input_line_pointer = c;
+         restore_line_pointer (c);
        }
       else
-       input_line_pointer = name;
+       input_line_pointer = saved_ilp;
     }
   demand_empty_rest_of_line ();
 
index 07aa646acf2f1fa3bae524ef4a493bebc9a05bbb..5bb6be09d92f019a2e5b267c6ec750840ba8f166 100644 (file)
@@ -670,8 +670,7 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
       char *p, c;
       offsetT value;
 
-      p = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (& p);
 
       if (strcmp (p, "basic_block") == 0)
        {
@@ -690,7 +689,7 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
        }
       else if (strcmp (p, "is_stmt") == 0)
        {
-         *input_line_pointer = c;
+         (void) restore_line_pointer (c);
          value = get_absolute_expression ();
          if (value == 0)
            current.flags &= ~DWARF2_FLAG_IS_STMT;
@@ -704,7 +703,7 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
        }
       else if (strcmp (p, "isa") == 0)
        {
-         *input_line_pointer = c;
+         (void) restore_line_pointer (c);
          value = get_absolute_expression ();
          if (value >= 0)
            current.isa = value;
@@ -716,7 +715,7 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
        }
       else if (strcmp (p, "discriminator") == 0)
        {
-         *input_line_pointer = c;
+         (void) restore_line_pointer (c);
          value = get_absolute_expression ();
          if (value >= 0)
            current.discriminator = value;
@@ -729,11 +728,11 @@ dwarf2_directive_loc (int dummy ATTRIBUTE_UNUSED)
       else
        {
          as_bad (_("unknown .loc sub-directive `%s'"), p);
-         *input_line_pointer = c;
+         (void) restore_line_pointer (c);
          return;
        }
 
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
     }
 
   demand_empty_rest_of_line ();
index 32dd81fb563e9d7143bf6bcad54b8c7f0b4ae832..3477cb0c865b1be69ab97b533be42fe1ece089b2 100644 (file)
@@ -2434,14 +2434,13 @@ ecoff_directive_begin (int ignore ATTRIBUTE_UNUSED)
       return;
     }
 
-  name = input_line_pointer;
-  name_end = get_symbol_end ();
+  name_end = get_symbol_name (&name);
 
   (void) add_ecoff_symbol ((const char *) NULL, st_Block, sc_Text,
                           symbol_find_or_make (name),
                           (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
 
-  *input_line_pointer = name_end;
+  (void) restore_line_pointer (name_end);
 
   /* The line number follows, but we don't use it.  */
   (void) get_absolute_expression ();
@@ -2472,8 +2471,7 @@ ecoff_directive_bend (int ignore ATTRIBUTE_UNUSED)
       return;
     }
 
-  name = input_line_pointer;
-  name_end = get_symbol_end ();
+  name_end = get_symbol_name (&name);
 
   /* The value is the distance between the .bend directive and the
      corresponding symbol.  We fill in the offset when we write out
@@ -2485,7 +2483,7 @@ ecoff_directive_bend (int ignore ATTRIBUTE_UNUSED)
     (void) add_ecoff_symbol ((const char *) NULL, st_End, sc_Text, endsym,
                             (bfd_vma) 0, (symint_t) 0, (symint_t) 0);
 
-  *input_line_pointer = name_end;
+  restore_line_pointer (name_end);
 
   /* The line number follows, but we don't use it.  */
   (void) get_absolute_expression ();
@@ -2519,8 +2517,7 @@ ecoff_directive_def (int ignore ATTRIBUTE_UNUSED)
 
   SKIP_WHITESPACE ();
 
-  name = input_line_pointer;
-  name_end = get_symbol_end ();
+  name_end = get_symbol_name (&name);
 
   if (coff_sym_name != (char *) NULL)
     as_warn (_(".def pseudo-op used inside of .def/.endef; ignored"));
@@ -2544,7 +2541,7 @@ ecoff_directive_def (int ignore ATTRIBUTE_UNUSED)
       coff_sym_addend = 0;
     }
 
-  *input_line_pointer = name_end;
+  restore_line_pointer (name_end);
 
   demand_empty_rest_of_line ();
 }
@@ -2757,12 +2754,11 @@ ecoff_directive_tag (int ignore ATTRIBUTE_UNUSED)
       return;
     }
 
-  name = input_line_pointer;
-  name_end = get_symbol_end ();
+  name_end = get_symbol_name (&name);
 
   coff_tag = xstrdup (name);
 
-  *input_line_pointer = name_end;
+  (void) restore_line_pointer (name_end);
 
   demand_empty_rest_of_line ();
 }
@@ -3004,13 +3000,12 @@ ecoff_directive_end (int ignore ATTRIBUTE_UNUSED)
       return;
     }
 
-  name = input_line_pointer;
-  name_end = get_symbol_end ();
+  name_end = get_symbol_name (&name);
 
   if (name == input_line_pointer)
     {
       as_warn (_(".end directive has no name"));
-      *input_line_pointer = name_end;
+      (void) restore_line_pointer (name_end);
       demand_empty_rest_of_line ();
       return;
     }
@@ -3031,7 +3026,7 @@ ecoff_directive_end (int ignore ATTRIBUTE_UNUSED)
 
   cur_proc_ptr = (proc_t *) NULL;
 
-  *input_line_pointer = name_end;
+  (void) restore_line_pointer (name_end);
   demand_empty_rest_of_line ();
 }
 \f
@@ -3053,20 +3048,19 @@ ecoff_directive_ent (int ignore ATTRIBUTE_UNUSED)
       return;
     }
 
-  name = input_line_pointer;
-  name_end = get_symbol_end ();
+  name_end = get_symbol_name (&name);
 
   if (name == input_line_pointer)
     {
       as_warn (_(".ent directive has no name"));
-      *input_line_pointer = name_end;
+      (void) restore_line_pointer (name_end);
       demand_empty_rest_of_line ();
       return;
     }
 
   add_procedure (name);
 
-  *input_line_pointer = name_end;
+  (void) restore_line_pointer (name_end);
 
   /* The .ent directive is sometimes followed by a number.  I'm not
      really sure what the number means.  I don't see any way to store
@@ -3095,10 +3089,9 @@ ecoff_directive_extern (int ignore ATTRIBUTE_UNUSED)
   symbolS *symbolp;
   valueT size;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   symbolp = symbol_find_or_make (name);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   S_SET_EXTERNAL (symbolp);
 
@@ -3348,10 +3341,9 @@ ecoff_directive_weakext (int ignore ATTRIBUTE_UNUSED)
   symbolS *symbolP;
   expressionS exp;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   symbolP = symbol_find_or_make (name);
-  *input_line_pointer = c;
+  (void) restore_line_pointer (c);
 
   SKIP_WHITESPACE ();
 
@@ -3489,11 +3481,9 @@ ecoff_stab (segT sec ATTRIBUTE_UNUSED,
          return;
        }
 
-      name = input_line_pointer;
-      name_end = get_symbol_end ();
-
+      name_end = get_symbol_name (&name);
       sym = symbol_find_or_make (name);
-      *input_line_pointer = name_end;
+      (void) restore_line_pointer (name_end);
 
       value = 0;
       addend = 0;
index f8acd4129b46f4726ad0ce43f6fabd9cfb88ca1a..a523b111b975d7410e075b7999943c7f6d02addc 100644 (file)
@@ -1142,8 +1142,7 @@ operand (expressionS *expressionP, enum expr_mode mode)
 
              ++input_line_pointer;
              SKIP_WHITESPACE ();
-             name = input_line_pointer;
-             c = get_symbol_end ();
+             c = get_symbol_name (& name);
 
              buf = (char *) xmalloc (strlen (name) + 10);
              if (start)
@@ -1158,7 +1157,7 @@ operand (expressionS *expressionP, enum expr_mode mode)
              expressionP->X_add_number = 0;
 
              *input_line_pointer = c;
-             SKIP_WHITESPACE ();
+             SKIP_WHITESPACE_AFTER_NAME ();
              if (*input_line_pointer != ')')
                as_bad (_("syntax error in .startof. or .sizeof."));
              else
@@ -1214,13 +1213,13 @@ operand (expressionS *expressionP, enum expr_mode mode)
 #if defined(md_need_index_operator) || defined(TC_M68K)
     de_fault:
 #endif
-      if (is_name_beginner (c))        /* Here if did not begin with a digit.  */
+      if (is_name_beginner (c) || c == '"')    /* Here if did not begin with a digit.  */
        {
          /* Identifier begins here.
             This is kludged for speed, so code is repeated.  */
        isname:
-         name = --input_line_pointer;
-         c = get_symbol_end ();
+         -- input_line_pointer;
+         c = get_symbol_name (&name);
 
 #ifdef md_operator
          {
@@ -1229,15 +1228,15 @@ operand (expressionS *expressionP, enum expr_mode mode)
            switch (op)
              {
              case O_uminus:
-               *input_line_pointer = c;
+               restore_line_pointer (c);
                c = '-';
                goto unary;
              case O_bit_not:
-               *input_line_pointer = c;
+               restore_line_pointer (c);
                c = '~';
                goto unary;
              case O_logical_not:
-               *input_line_pointer = c;
+               restore_line_pointer (c);
                c = '!';
                goto unary;
              case O_illegal:
@@ -1246,9 +1245,10 @@ operand (expressionS *expressionP, enum expr_mode mode)
              default:
                break;
              }
+
            if (op != O_absent && op != O_illegal)
              {
-               *input_line_pointer = c;
+               restore_line_pointer (c);
                expr (9, expressionP, mode);
                expressionP->X_add_symbol = make_expr_symbol (expressionP);
                expressionP->X_op_symbol = NULL;
@@ -1266,7 +1266,7 @@ operand (expressionS *expressionP, enum expr_mode mode)
             entering it in the symbol table.  */
          if (md_parse_name (name, expressionP, mode, &c))
            {
-             *input_line_pointer = c;
+             restore_line_pointer (c);
              break;
            }
 #endif
@@ -1286,10 +1286,9 @@ operand (expressionS *expressionP, enum expr_mode mode)
                       || name[1] == 'T');
 
              *input_line_pointer = c;
-             SKIP_WHITESPACE ();
+             SKIP_WHITESPACE_AFTER_NAME ();
 
-             name = input_line_pointer;
-             c = get_symbol_end ();
+             c = get_symbol_name (& name);
 
              buf = (char *) xmalloc (strlen (name) + 10);
              if (start)
@@ -1304,8 +1303,7 @@ operand (expressionS *expressionP, enum expr_mode mode)
              expressionP->X_add_number = 0;
 
              *input_line_pointer = c;
-             SKIP_WHITESPACE ();
-
+             SKIP_WHITESPACE_AFTER_NAME ();
              break;
            }
 #endif
@@ -1333,7 +1331,8 @@ operand (expressionS *expressionP, enum expr_mode mode)
              expressionP->X_add_symbol = symbolP;
              expressionP->X_add_number = 0;
            }
-         *input_line_pointer = c;
+
+         restore_line_pointer (c);
        }
       else
        {
@@ -1589,8 +1588,8 @@ operatorf (int *num_chars)
 #ifdef md_operator
   if (is_name_beginner (c))
     {
-      char *name = input_line_pointer;
-      char ec = get_symbol_end ();
+      char *name;
+      char ec = get_symbol_name (& name);
 
       ret = md_operator (name, 2, &ec);
       switch (ret)
@@ -2318,19 +2317,22 @@ resolve_expression (expressionS *expressionP)
    expr.c is just a branch office read.c anyway, and putting it
    here lessens the crowd at read.c.
 
-   Assume input_line_pointer is at start of symbol name.
+   Assume input_line_pointer is at start of symbol name, or the
+    start of a double quote enclosed symbol name.
    Advance input_line_pointer past symbol name.
-   Turn that character into a '\0', returning its former value.
+   Turn that character into a '\0', returning its former value,
+    which may be the closing double quote.
    This allows a string compare (RMS wants symbol names to be strings)
-   of the symbol name.
+    of the symbol name.
    There will always be a char following symbol name, because all good
    lines end in end-of-line.  */
 
 char
-get_symbol_end (void)
+get_symbol_name (char ** ilp_return)
 {
   char c;
 
+  * ilp_return = input_line_pointer;
   /* We accept \001 in a name in case this is being called with a
      constructed string.  */
   if (is_name_beginner (c = *input_line_pointer++) || c == '\001')
@@ -2341,8 +2343,36 @@ get_symbol_end (void)
       if (is_name_ender (c))
        c = *input_line_pointer++;
     }
+  else if (c == '"')
+    {
+      bfd_boolean backslash_seen;
+
+      * ilp_return = input_line_pointer;
+      do
+       {
+         backslash_seen = c == '\\';
+         c = * input_line_pointer ++;
+       }
+      while (c != 0 && (c != '"' || backslash_seen));
+
+      if (c == 0)
+       as_warn (_("missing closing '\"'"));
+    }
   *--input_line_pointer = 0;
-  return (c);
+  return c;
+}
+
+/* Replace the NUL character pointed to by input_line_pointer
+   with C.  If C is \" then advance past it.  Return the character
+   now pointed to by input_line_pointer.  */
+
+char
+restore_line_pointer (char c)
+{
+  * input_line_pointer = c;
+  if (c == '"')
+    c = * ++ input_line_pointer;
+  return c;
 }
 
 unsigned int
index fc6b7210a9f1d7a9cc13cc16e7d788cada85fd34..cfb1e5f7bdd14d46c8d828344333f9adba342f30 100644 (file)
@@ -170,7 +170,8 @@ extern LITTLENUM_TYPE generic_bignum[];
 
 typedef char operator_rankT;
 
-extern char get_symbol_end (void);
+extern char get_symbol_name (char **);
+extern char restore_line_pointer (char);
 extern void expr_begin (void);
 extern void expr_set_precedence (void);
 extern void expr_set_rank (operatorT, operator_rankT);
index 000c75b10d9ab7fdc2fca9acf833ebacf30f5d77..978cd3e985534438ad163b22184b3d27dce8a41c 100644 (file)
@@ -741,7 +741,8 @@ single instruction is %u bytes long but .bundle_align_mode limit is %u"),
 void
 read_a_source_file (char *name)
 {
-  char c;
+  char nul_char;
+  char next_char;
   char *s;             /* String of symbol, '\0' appended.  */
   int temp;
   pseudo_typeS *pop;
@@ -828,16 +829,18 @@ read_a_source_file (char *name)
 
              if (LABELS_WITHOUT_COLONS || flag_m68k_mri)
                {
+                 next_char = * input_line_pointer;
                  /* Text at the start of a line must be a label, we
                     run down and stick a colon in.  */
-                 if (is_name_beginner (*input_line_pointer))
+                 if (is_name_beginner (next_char) || next_char == '"')
                    {
-                     char *line_start = input_line_pointer;
+                     char *line_start;
                      int mri_line_macro;
 
                      HANDLE_CONDITIONAL_ASSEMBLY (0);
 
-                     c = get_symbol_end ();
+                     nul_char = get_symbol_name (& line_start);
+                     next_char = (nul_char == '"' ? input_line_pointer[1] : nul_char);
 
                      /* In MRI mode, the EQU and MACRO pseudoops must
                         be handled specially.  */
@@ -871,8 +874,8 @@ read_a_source_file (char *name)
                         symbol in the symbol table.  */
                      if (!mri_line_macro
 #ifdef TC_START_LABEL_WITHOUT_COLON
-                         && TC_START_LABEL_WITHOUT_COLON(c,
-                                                         input_line_pointer)
+                         && TC_START_LABEL_WITHOUT_COLON (next_char,
+                                                          input_line_pointer)
 #endif
                          )
                        line_label = colon (line_start);
@@ -882,8 +885,8 @@ read_a_source_file (char *name)
                                                    (valueT) 0,
                                                    &zero_address_frag);
 
-                     *input_line_pointer = c;
-                     if (c == ':')
+                     next_char = restore_line_pointer (nul_char);
+                     if (next_char == ':')
                        input_line_pointer++;
                    }
                }
@@ -898,30 +901,32 @@ read_a_source_file (char *name)
             Each test is independent of all other tests at the (top)
             level.  */
          do
-           c = *input_line_pointer++;
-         while (c == '\t' || c == ' ' || c == '\f');
+           nul_char = next_char = *input_line_pointer++;
+         while (next_char == '\t' || next_char == ' ' || next_char == '\f');
 
          /* C is the 1st significant character.
             Input_line_pointer points after that character.  */
-         if (is_name_beginner (c))
+         if (is_name_beginner (next_char) || next_char == '"')
            {
+             char *rest;
+
              /* Want user-defined label or pseudo/opcode.  */
              HANDLE_CONDITIONAL_ASSEMBLY (1);
 
-             s = --input_line_pointer;
-             c = get_symbol_end ();    /* name's delimiter.  */
+             --input_line_pointer;
+             nul_char = get_symbol_name (& s); /* name's delimiter.  */
+             next_char = (nul_char == '"' ? input_line_pointer[1] : nul_char);
+             rest = input_line_pointer + (nul_char == '"' ? 2 : 1);
 
-             /* C is character after symbol.
-                That character's place in the input line is now '\0'.
+             /* NEXT_CHAR is character after symbol.
+                The end of symbol in the input line is now '\0'.
                 S points to the beginning of the symbol.
                   [In case of pseudo-op, s->'.'.]
-                Input_line_pointer->'\0' where c was.  */
-             if (TC_START_LABEL (c, s, input_line_pointer))
+                Input_line_pointer->'\0' where NUL_CHAR was.  */
+             if (TC_START_LABEL (next_char, s, input_line_pointer))
                {
                  if (flag_m68k_mri)
                    {
-                     char *rest = input_line_pointer + 1;
-
                      /* In MRI mode, \tsym: set 0 is permitted.  */
                      if (*rest == ':')
                        ++rest;
@@ -940,27 +945,27 @@ read_a_source_file (char *name)
                    }
 
                  line_label = colon (s);       /* User-defined label.  */
-                 /* Put ':' back for error messages' sake.  */
-                 *input_line_pointer++ = ':';
+                 restore_line_pointer (nul_char);
+                 ++ input_line_pointer;
 #ifdef tc_check_label
                  tc_check_label (line_label);
 #endif
                  /* Input_line_pointer->after ':'.  */
                  SKIP_WHITESPACE ();
                }
-             else if ((c == '=' && input_line_pointer[1] == '=')
-                      || ((c == ' ' || c == '\t')
-                          && input_line_pointer[1] == '='
-                          && input_line_pointer[2] == '='))
+             else if ((next_char == '=' && *rest == '=')
+                      || ((next_char == ' ' || next_char == '\t')
+                          && rest[0] == '='
+                          && rest[1] == '='))
                {
                  equals (s, -1);
                  demand_empty_rest_of_line ();
                }
-             else if ((c == '='
-                      || ((c == ' ' || c == '\t')
-                           && input_line_pointer[1] == '='))
+             else if ((next_char == '='
+                      || ((next_char == ' ' || next_char == '\t')
+                           && *rest == '='))
 #ifdef TC_EQUAL_IN_INSN
-                          && !TC_EQUAL_IN_INSN (c, s)
+                          && !TC_EQUAL_IN_INSN (next_char, s)
 #endif
                           )
                {
@@ -1000,7 +1005,7 @@ read_a_source_file (char *name)
                    {
                      /* PSEUDO - OP.
 
-                        WARNING: c has next char, which may be end-of-line.
+                        WARNING: next_char may be end-of-line.
                         We lookup the pseudo-op table with s+1 because we
                         already know that the pseudo-op begins with a '.'.  */
 
@@ -1045,25 +1050,25 @@ read_a_source_file (char *name)
                        {
                          char *end = input_line_pointer;
 
-                         *input_line_pointer = c;
+                         (void) restore_line_pointer (nul_char);
                          s_ignore (0);
-                         c = *--input_line_pointer;
+                         nul_char = next_char = *--input_line_pointer;
                          *input_line_pointer = '\0';
-                         if (! macro_defined || ! try_macro (c, s))
+                         if (! macro_defined || ! try_macro (next_char, s))
                            {
                              *end = '\0';
                              as_bad (_("unknown pseudo-op: `%s'"), s);
-                             *input_line_pointer++ = c;
+                             *input_line_pointer++ = nul_char;
                            }
                          continue;
                        }
 
                      /* Put it back for error messages etc.  */
-                     *input_line_pointer = c;
+                     next_char = restore_line_pointer (nul_char);
                      /* The following skip of whitespace is compulsory.
                         A well shaped space is sometimes all that separates
                         keyword from operands.  */
-                     if (c == ' ' || c == '\t')
+                     if (next_char == ' ' || next_char == '\t')
                        input_line_pointer++;
 
                      /* Input_line is restored.
@@ -1077,16 +1082,16 @@ read_a_source_file (char *name)
                    }
                  else
                    {
-                     /* WARNING: c has char, which may be end-of-line.  */
-                     /* Also: input_line_pointer->`\0` where c was.  */
-                     *input_line_pointer = c;
+                     /* WARNING: next_char may be end-of-line.  */
+                     /* Also: input_line_pointer->`\0` where nul_char was.  */
+                     (void) restore_line_pointer (nul_char);
                      input_line_pointer = _find_end_of_line (input_line_pointer, flag_m68k_mri, 1, 0);
-                     c = *input_line_pointer;
+                     next_char = nul_char = *input_line_pointer;
                      *input_line_pointer = '\0';
 
                      generate_lineno_debug ();
 
-                     if (macro_defined && try_macro (c, s))
+                     if (macro_defined && try_macro (next_char, s))
                        continue;
 
                      if (mri_pending_align)
@@ -1102,7 +1107,7 @@ read_a_source_file (char *name)
 
                      assemble_one (s); /* Assemble 1 instruction.  */
 
-                     *input_line_pointer++ = c;
+                     *input_line_pointer++ = nul_char;
 
                      /* We resume loop AFTER the end-of-line from
                         this instruction.  */
@@ -1112,17 +1117,20 @@ read_a_source_file (char *name)
            }
 
          /* Empty statement?  */
-         if (is_end_of_line[(unsigned char) c])
+         if (is_end_of_line[(unsigned char) next_char])
            continue;
 
-         if ((LOCAL_LABELS_DOLLAR || LOCAL_LABELS_FB) && ISDIGIT (c))
+         if ((LOCAL_LABELS_DOLLAR || LOCAL_LABELS_FB) && ISDIGIT (next_char))
            {
              /* local label  ("4:")  */
              char *backup = input_line_pointer;
 
              HANDLE_CONDITIONAL_ASSEMBLY (1);
 
-             temp = c - '0';
+             temp = next_char - '0';
+
+             if (nul_char == '"')
+               ++ input_line_pointer;
 
              /* Read the whole number.  */
              while (ISDIGIT (*input_line_pointer))
@@ -1156,9 +1164,9 @@ read_a_source_file (char *name)
                }
 
              input_line_pointer = backup;
-           }                   /* local label  ("4:") */
+           }
 
-         if (c && strchr (line_comment_chars, c))
+         if (next_char && strchr (line_comment_chars, next_char))
            {                   /* Its a comment.  Better say APP or NO_APP.  */
              sb sbuf;
              char *ends;
@@ -1270,7 +1278,7 @@ read_a_source_file (char *name)
          HANDLE_CONDITIONAL_ASSEMBLY (1);
 
 #ifdef tc_unrecognized_line
-         if (tc_unrecognized_line (c))
+         if (tc_unrecognized_line (next_char))
            continue;
 #endif
          input_line_pointer--;
@@ -1800,7 +1808,7 @@ s_mri_common (int small ATTRIBUTE_UNUSED)
 
   name = input_line_pointer;
   if (!ISDIGIT (*name))
-    c = get_symbol_end ();
+    c = get_symbol_name (& name);
   else
     {
       do
@@ -1823,7 +1831,7 @@ s_mri_common (int small ATTRIBUTE_UNUSED)
     }
 
   sym = symbol_find_or_make (name);
-  *input_line_pointer = c;
+  c = restore_line_pointer (c);
   if (alc != NULL)
     free (alc);
 
@@ -2343,8 +2351,7 @@ s_linkonce (int ignore ATTRIBUTE_UNUSED)
       char *s;
       char c;
 
-      s = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (& s);
       if (strcasecmp (s, "discard") == 0)
        type = LINKONCE_DISCARD;
       else if (strcasecmp (s, "one_only") == 0)
@@ -2356,7 +2363,7 @@ s_linkonce (int ignore ATTRIBUTE_UNUSED)
       else
        as_warn (_("unrecognized .linkonce type `%s'"), s);
 
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
     }
 
 #ifdef obj_handle_link_once
@@ -2850,7 +2857,7 @@ s_mri_sect (char *type ATTRIBUTE_UNUSED)
 
   name = input_line_pointer;
   if (!ISDIGIT (*name))
-    c = get_symbol_end ();
+    c = get_symbol_name (& name);
   else
     {
       do
@@ -2865,11 +2872,11 @@ s_mri_sect (char *type ATTRIBUTE_UNUSED)
 
   name = xstrdup (name);
 
-  *input_line_pointer = c;
+  c = restore_line_pointer (c);
 
   seg = subseg_new (name, 0);
 
-  if (*input_line_pointer == ',')
+  if (c == ',')
     {
       int align;
 
@@ -2924,16 +2931,15 @@ s_mri_sect (char *type ATTRIBUTE_UNUSED)
 
   SKIP_WHITESPACE ();
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (& name);
 
   name = xstrdup (name);
 
-  *input_line_pointer = c;
+  c = restore_line_pointer (c);
 
   seg = subseg_new (name, 0);
 
-  if (*input_line_pointer != ',')
+  if (c != ',')
     *type = 'C';
   else
     {
@@ -2941,8 +2947,7 @@ s_mri_sect (char *type ATTRIBUTE_UNUSED)
 
       ++input_line_pointer;
       SKIP_WHITESPACE ();
-      sectype = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (& sectype);
       if (*sectype == '\0')
        *type = 'C';
       else if (strcasecmp (sectype, "text") == 0)
@@ -2953,7 +2958,7 @@ s_mri_sect (char *type ATTRIBUTE_UNUSED)
        *type = 'R';
       else
        as_warn (_("unrecognized section type `%s'"), sectype);
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
     }
 
   if (*input_line_pointer == ',')
@@ -2962,8 +2967,7 @@ s_mri_sect (char *type ATTRIBUTE_UNUSED)
 
       ++input_line_pointer;
       SKIP_WHITESPACE ();
-      seccmd = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (& seccmd);
       if (strcasecmp (seccmd, "absolute") == 0)
        {
          as_bad (_("absolute sections are not supported"));
@@ -2975,14 +2979,14 @@ s_mri_sect (char *type ATTRIBUTE_UNUSED)
        {
          int align;
 
-         *input_line_pointer = c;
+         (void) restore_line_pointer (c);
          align = get_absolute_expression ();
          record_alignment (seg, align);
        }
       else
        {
          as_warn (_("unrecognized section command `%s'"), seccmd);
-         *input_line_pointer = c;
+         (void) restore_line_pointer (c);
        }
     }
 
@@ -3028,11 +3032,10 @@ s_purgem (int ignore ATTRIBUTE_UNUSED)
       char c;
 
       SKIP_WHITESPACE ();
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (& name);
       delete_macro (name);
       *input_line_pointer = c;
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
     }
   while (*input_line_pointer++ == ',');
 
@@ -3937,12 +3940,14 @@ cons_worker (int nbytes,        /* 1=.byte, 2=.word, 4=.long.  */
       else
 #endif
        {
+#if 0
          if (*input_line_pointer == '"')
            {
              as_bad (_("unexpected `\"' in expression"));
              ignore_rest_of_line ();
              return;
            }
+#endif
          ret = TC_PARSE_CONS_EXPRESSION (&exp, (unsigned int) nbytes);
        }
 
@@ -4046,8 +4051,7 @@ s_reloc (int ignore ATTRIBUTE_UNUSED)
 
   ++input_line_pointer;
   SKIP_WHITESPACE ();
-  r_name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (& r_name);
   if (strncasecmp (r_name, "BFD_RELOC_", 10) == 0)
     {
       unsigned int i;
@@ -4070,7 +4074,7 @@ s_reloc (int ignore ATTRIBUTE_UNUSED)
     }
 
   exp.X_op = O_absent;
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
   if (*input_line_pointer == ',')
     {
       ++input_line_pointer;
@@ -5957,11 +5961,10 @@ do_s_func (int end_p, const char *default_prefix)
          return;
        }
 
-      name = input_line_pointer;
-      delim1 = get_symbol_end ();
+      delim1 = get_symbol_name (& name);
       name = xstrdup (name);
       *input_line_pointer = delim1;
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
       if (*input_line_pointer != ',')
        {
          if (default_prefix)
@@ -5987,10 +5990,9 @@ do_s_func (int end_p, const char *default_prefix)
        {
          ++input_line_pointer;
          SKIP_WHITESPACE ();
-         label = input_line_pointer;
-         delim2 = get_symbol_end ();
+         delim2 = get_symbol_name (& label);
          label = xstrdup (label);
-         *input_line_pointer = delim2;
+         restore_line_pointer (delim2);
        }
 
       if (debug_type == DEBUG_STABS)
index d7ac6ce26abbd4e59a61f3913a03d93f64ab926a..fd5588d42e7e92a907347fabaf22571129c44f11 100644 (file)
@@ -33,6 +33,16 @@ extern char *input_line_pointer;     /* -> char we are parsing now.  */
 #define SKIP_WHITESPACE() know(*input_line_pointer != ' ' )
 #endif
 
+#define SKIP_WHITESPACE_AFTER_NAME()           \
+  do                                           \
+    {                                          \
+      if (* input_line_pointer == '"')         \
+       ++ input_line_pointer;                  \
+      if (* input_line_pointer == ' ')         \
+       ++ input_line_pointer;                  \
+    }                                          \
+  while (0)
+
 #define        LEX_NAME        (1)     /* may continue a name */
 #define LEX_BEGIN_NAME (2)     /* may begin a name */
 #define LEX_END_NAME   (4)     /* ends a name */
index a7de9afb980aa26a34c72a2202a7df906ca4a34b..9e055c4c1c6776ed7e4b2cd08df757ba1d15dc0e 100644 (file)
@@ -457,11 +457,10 @@ s_desc (ignore)
   symbolS *symbolP;
   int temp;
 
-  name = input_line_pointer;
-  c = get_symbol_end ();
+  c = get_symbol_name (&name);
   p = input_line_pointer;
   *p = c;
-  SKIP_WHITESPACE ();
+  SKIP_WHITESPACE_AFTER_NAME ();
   if (*input_line_pointer != ',')
     {
       *p = 0;
index f949d02914a0953439469e05e74187e344ec2cc6..2951966c0a26df5c58d6b83ff7391e5d5ab708db 100644 (file)
@@ -1,3 +1,12 @@
+2015-08-21  Nick Clifton  <nickc@redhat.com>
+
+       PR gas/18581
+       * gas/all/byte.d: Disable this test.  Quoted expressions
+       are now allowed in .byte directives.
+       * gas/all/quoted-sym-names.s: New test.
+       * gas/all/quoted-sym-names.d: Expected output.
+       * gas/all/gas.exp: Run the new test.
+
 2015-08-21  Alexander Fomin  <alexander.fomin@intel.com>
 
        PR binutils/18257
index 9e23feaae57aa881bd0d073fad5c142c17a5d6d2..62f369997be88a74757de8250a2891f9eaabcd9a 100644 (file)
@@ -1,5 +1,4 @@
 #name: bad byte directive
 #error-output: byte.l
-# The RX target allows quoted ASCII strings inside .byte directives
-# for compatibily with the Renesas assembler.
-#skip: rx-*-*
+# Quoted expressions are now allowed in .byte (and similar) expressions.
+#skip: *-*-*
index 67be05016b80c04025776d47098d0865ac3bd069..0af9bd03fb758032a32579fcff52a3e7d997e344 100644 (file)
@@ -434,6 +434,8 @@ if [is_elf_format] {
     run_dump_test none
 }
 
+run_dump_test quoted-sym-names
+
 load_lib gas-dg.exp
 dg-init
 dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/err-*.s $srcdir/$subdir/warn-*.s]] "" ""
diff --git a/gas/testsuite/gas/all/quoted-sym-names.d b/gas/testsuite/gas/all/quoted-sym-names.d
new file mode 100644 (file)
index 0000000..cf7a9ae
--- /dev/null
@@ -0,0 +1,6 @@
+#nm: --extern-only
+#name: quoted symbol names
+
+#...
+0+00 T test-a
+
diff --git a/gas/testsuite/gas/all/quoted-sym-names.s b/gas/testsuite/gas/all/quoted-sym-names.s
new file mode 100644 (file)
index 0000000..b4b6171
--- /dev/null
@@ -0,0 +1,4 @@
+       .text
+       .globl  "test-a"
+"test-a":
+       .word 0
index 3ae3c80f8411d0516c35c7b92bcdf7978522e7f6..b4eab14dd8b8ce78e155471d3884673e78a64e56 100644 (file)
@@ -23,7 +23,7 @@ Section Headers:
   \[ 7\] \.symtab           SYMTAB           0000000000000000  .*
        00000000000000c0  0000000000000018           8     8     8
   \[ 8\] \.strtab           STRTAB           0000000000000000  .*
-       000000000000000c  0000000000000000           0     0     1
+       000000000000000[7c]  0000000000000000           0     0     1
 Key to Flags:
 #...