diff options
author | Nick Clifton <nickc@redhat.com> | 2015-08-21 16:42:14 +0100 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2015-08-21 16:42:14 +0100 |
commit | d02603dc201f80cd9d2a1f4b1a16110b1e04222b (patch) | |
tree | b55476923d8bde556b6b3421345bde8e4562ad97 | |
parent | 40045d91812b25c88c8275b8c08d27c234b68ba8 (diff) | |
download | gdb-d02603dc201f80cd9d2a1f4b1a16110b1e04222b.zip gdb-d02603dc201f80cd9d2a1f4b1a16110b1e04222b.tar.gz gdb-d02603dc201f80cd9d2a1f4b1a16110b1e04222b.tar.bz2 |
Allow symbol and label names to be enclosed in double quotes.
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, 900 insertions, 911 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 5714982..3bcd8e6 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -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 @@ -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. @@ -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); diff --git a/gas/config/obj-aout.c b/gas/config/obj-aout.c index 5500ac9..401b3a7 100644 --- a/gas/config/obj-aout.c +++ b/gas/config/obj-aout.c @@ -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 == ',') { diff --git a/gas/config/obj-coff-seh.c b/gas/config/obj-coff-seh.c index 2ffefa8..ec53585 100644 --- a/gas/config/obj-coff-seh.c +++ b/gas/config/obj-coff-seh.c @@ -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)) diff --git a/gas/config/obj-coff.c b/gas/config/obj-coff.c index 449cb4f..c0a3f1f 100644 --- a/gas/config/obj-coff.c +++ b/gas/config/obj-coff.c @@ -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 (§ion_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; diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index 08ae853..031fafb 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -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; } diff --git a/gas/config/obj-evax.c b/gas/config/obj-evax.c index b3702ef..b712e13 100644 --- a/gas/config/obj-evax.c +++ b/gas/config/obj-evax.c @@ -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 == ',') diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c index 10e8dbf..d0a4053 100644 --- a/gas/config/obj-macho.c +++ b/gas/config/obj-macho.c @@ -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 diff --git a/gas/config/obj-som.c b/gas/config/obj-som.c index b085b89..1b87de5 100644 --- a/gas/config/obj-som.c +++ b/gas/config/obj-som.c @@ -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 == ',') { diff --git a/gas/config/tc-alpha.c b/gas/config/tc-alpha.c index a19fbc5..5762e41 100644 --- a/gas/config/tc-alpha.c +++ b/gas/config/tc-alpha.c @@ -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 (); } @@ -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; diff --git a/gas/config/tc-arc.c b/gas/config/tc-arc.c index df3ed1f..4806ed8 100644 --- a/gas/config/tc-arc.c +++ b/gas/config/tc-arc.c @@ -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) diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index e54b81b..68581cb 100644 --- a/gas/config/tc-arm.c +++ b/gas/config/tc-arm.c @@ -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 (); diff --git a/gas/config/tc-dlx.c b/gas/config/tc-dlx.c index a0a6021..955a457 100644 --- a/gas/config/tc-dlx.c +++ b/gas/config/tc-dlx.c @@ -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; diff --git a/gas/config/tc-h8300.c b/gas/config/tc-h8300.c index 9609f2b..04aa283 100644 --- a/gas/config/tc-h8300.c +++ b/gas/config/tc-h8300.c @@ -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; diff --git a/gas/config/tc-hppa.c b/gas/config/tc-hppa.c index 06e222d..da17a29 100644 --- a/gas/config/tc-hppa.c +++ b/gas/config/tc-hppa.c @@ -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++; } diff --git a/gas/config/tc-i370.c b/gas/config/tc-i370.c index 6993f79..ba82b2c 100644 --- a/gas/config/tc-i370.c +++ b/gas/config/tc-i370.c @@ -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 != ',') { diff --git a/gas/config/tc-i386-intel.c b/gas/config/tc-i386-intel.c index 2bdcf35..cff0ae7 100644 --- a/gas/config/tc-i386-intel.c +++ b/gas/config/tc-i386-intel.c @@ -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; } diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 6c910ed..13f1d27 100644 --- a/gas/config/tc-i386.c +++ b/gas/config/tc-i386.c @@ -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 (®_string); symbolP = symbol_find (reg_string); if (symbolP && S_GET_SEGMENT (symbolP) == reg_section) { diff --git a/gas/config/tc-i960.c b/gas/config/tc-i960.c index 6321791..e27d816 100644 --- a/gas/config/tc-i960.c +++ b/gas/config/tc-i960.c @@ -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 (); } diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c index d11570a..ea7dcc6 100644 --- a/gas/config/tc-ia64.c +++ b/gas/config/tc-ia64.c @@ -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(¬es, 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 != ',') { diff --git a/gas/config/tc-iq2000.c b/gas/config/tc-iq2000.c index bddd940..2d55da1 100644 --- a/gas/config/tc-iq2000.c +++ b/gas/config/tc-iq2000.c @@ -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; } diff --git a/gas/config/tc-m32r.c b/gas/config/tc-m32r.c index 38da4b5..4a14bf1 100644 --- a/gas/config/tc-m32r.c +++ b/gas/config/tc-m32r.c @@ -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.")); diff --git a/gas/config/tc-m68hc11.c b/gas/config/tc-m68hc11.c index a2aa424..43cf6b6 100644 --- a/gas/config/tc-m68hc11.c +++ b/gas/config/tc-m68hc11.c @@ -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 (); diff --git a/gas/config/tc-m68k.c b/gas/config/tc-m68k.c index acfe349..b8f051e 100644 --- a/gas/config/tc-m68k.c +++ b/gas/config/tc-m68k.c @@ -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++ == ','); diff --git a/gas/config/tc-microblaze.c b/gas/config/tc-microblaze.c index 3309e59..b43925b 100644 --- a/gas/config/tc-microblaze.c +++ b/gas/config/tc-microblaze.c @@ -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 (); diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 74b7fb4..d951dfc 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -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 (§ion_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]) { diff --git a/gas/config/tc-mmix.c b/gas/config/tc-mmix.c index c5128cd..8d6ca3c 100644 --- a/gas/config/tc-mmix.c +++ b/gas/config/tc-mmix.c @@ -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++; diff --git a/gas/config/tc-mn10200.c b/gas/config/tc-mn10200.c index ebf7f94..4d4f482 100644 --- a/gas/config/tc-mn10200.c +++ b/gas/config/tc-mn10200.c @@ -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: } } } - diff --git a/gas/config/tc-mn10300.c b/gas/config/tc-mn10300.c index 1d37b29..0d13622 100644 --- a/gas/config/tc-mn10300.c +++ b/gas/config/tc-mn10300.c @@ -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 { diff --git a/gas/config/tc-nios2.c b/gas/config/tc-nios2.c index 42bb115..8dd7604 100644 --- a/gas/config/tc-nios2.c +++ b/gas/config/tc-nios2.c @@ -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 diff --git a/gas/config/tc-ppc.c b/gas/config/tc-ppc.c index 8cff4dc..6e48f7a 100644 --- a/gas/config/tc-ppc.c +++ b/gas/config/tc-ppc.c @@ -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 (§ion_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); diff --git a/gas/config/tc-s390.c b/gas/config/tc-s390.c index 3250127..8d459b6 100644 --- a/gas/config/tc-s390.c +++ b/gas/config/tc-s390.c @@ -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) { diff --git a/gas/config/tc-score.c b/gas/config/tc-score.c index dd2703f..49ed5f2 100644 --- a/gas/config/tc-score.c +++ b/gas/config/tc-score.c @@ -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) { diff --git a/gas/config/tc-score7.c b/gas/config/tc-score7.c index 19241ba..e8af055 100644 --- a/gas/config/tc-score7.c +++ b/gas/config/tc-score7.c @@ -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. */ diff --git a/gas/config/tc-sparc.c b/gas/config/tc-sparc.c index edadfb8..6e7a3ef 100644 --- a/gas/config/tc-sparc.c +++ b/gas/config/tc-sparc.c @@ -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 (®name); 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 (®name); } + 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 (); } diff --git a/gas/config/tc-tic4x.c b/gas/config/tc-tic4x.c index c27c8d1..a4ca8b7 100644 --- a/gas/config/tc-tic4x.c +++ b/gas/config/tc-tic4x.c @@ -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 (§ion_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 (§ion_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; } diff --git a/gas/config/tc-tic54x.c b/gas/config/tc-tic54x.c index 5edd045..2637d10 100644 --- a/gas/config/tc-tic54x.c +++ b/gas/config/tc-tic54x.c @@ -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 (§ion_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 (§ion_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; diff --git a/gas/config/tc-tic6x.c b/gas/config/tc-tic6x.c index 1dd2e92..64d39be 100644 --- a/gas/config/tc-tic6x.c +++ b/gas/config/tc-tic6x.c @@ -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 != ',') { diff --git a/gas/config/tc-tilegx.c b/gas/config/tc-tilegx.c index efc3856..d1e8967 100644 --- a/gas/config/tc-tilegx.c +++ b/gas/config/tc-tilegx.c @@ -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 (®name); + 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; diff --git a/gas/config/tc-tilepro.c b/gas/config/tc-tilepro.c index 7f76de1..e7c7c64 100644 --- a/gas/config/tc-tilepro.c +++ b/gas/config/tc-tilepro.c @@ -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 (®name); 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; diff --git a/gas/config/tc-v850.c b/gas/config/tc-v850.c index e6f35b8..f42e767 100644 --- a/gas/config/tc-v850.c +++ b/gas/config/tc-v850.c @@ -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); diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index b8b1e7d..d707da8 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -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); diff --git a/gas/config/tc-z80.c b/gas/config/tc-z80.c index 4931a48..87ed179 100644 --- a/gas/config/tc-z80.c +++ b/gas/config/tc-z80.c @@ -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; } } diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index c2f2f86..fa3221e 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -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 diff --git a/gas/dw2gencfi.c b/gas/dw2gencfi.c index 87f135b..89bdc9a 100644 --- a/gas/dw2gencfi.c +++ b/gas/dw2gencfi.c @@ -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 (); diff --git a/gas/dwarf2dbg.c b/gas/dwarf2dbg.c index 07aa646..5bb6be0 100644 --- a/gas/dwarf2dbg.c +++ b/gas/dwarf2dbg.c @@ -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 (); diff --git a/gas/ecoff.c b/gas/ecoff.c index 32dd81f..3477cb0 100644 --- a/gas/ecoff.c +++ b/gas/ecoff.c @@ -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 (); } @@ -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; @@ -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 @@ -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); @@ -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) @@ -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 */ diff --git a/gas/stabs.c b/gas/stabs.c index a7de9af..9e055c4 100644 --- a/gas/stabs.c +++ b/gas/stabs.c @@ -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; diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index f949d02..2951966 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -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 diff --git a/gas/testsuite/gas/all/byte.d b/gas/testsuite/gas/all/byte.d index 9e23fea..62f3699 100644 --- a/gas/testsuite/gas/all/byte.d +++ b/gas/testsuite/gas/all/byte.d @@ -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: *-*-* diff --git a/gas/testsuite/gas/all/gas.exp b/gas/testsuite/gas/all/gas.exp index 67be050..0af9bd0 100644 --- a/gas/testsuite/gas/all/gas.exp +++ b/gas/testsuite/gas/all/gas.exp @@ -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 index 0000000..cf7a9ae --- /dev/null +++ b/gas/testsuite/gas/all/quoted-sym-names.d @@ -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 index 0000000..b4b6171 --- /dev/null +++ b/gas/testsuite/gas/all/quoted-sym-names.s @@ -0,0 +1,4 @@ + .text + .globl "test-a" +"test-a": + .word 0 diff --git a/gas/testsuite/gas/ia64/group-1.d b/gas/testsuite/gas/ia64/group-1.d index 3ae3c80..b4eab14 100644 --- a/gas/testsuite/gas/ia64/group-1.d +++ b/gas/testsuite/gas/ia64/group-1.d @@ -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: #... |