From d02603dc201f80cd9d2a1f4b1a16110b1e04222b Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 21 Aug 2015 16:42:14 +0100 Subject: 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. --- gas/ecoff.c | 50 ++++++++++++++++++++------------------------------ 1 file changed, 20 insertions(+), 30 deletions(-) (limited to 'gas/ecoff.c') 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; -- cgit v1.1