aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2015-08-21 16:42:14 +0100
committerNick Clifton <nickc@redhat.com>2015-08-21 16:42:14 +0100
commitd02603dc201f80cd9d2a1f4b1a16110b1e04222b (patch)
treeb55476923d8bde556b6b3421345bde8e4562ad97 /gas
parent40045d91812b25c88c8275b8c08d27c234b68ba8 (diff)
downloadfsf-binutils-gdb-d02603dc201f80cd9d2a1f4b1a16110b1e04222b.zip
fsf-binutils-gdb-d02603dc201f80cd9d2a1f4b1a16110b1e04222b.tar.gz
fsf-binutils-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.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog67
-rw-r--r--gas/NEWS4
-rw-r--r--gas/cond.c6
-rw-r--r--gas/config/obj-aout.c10
-rw-r--r--gas/config/obj-coff-seh.c20
-rw-r--r--gas/config/obj-coff.c31
-rw-r--r--gas/config/obj-elf.c42
-rw-r--r--gas/config/obj-evax.c5
-rw-r--r--gas/config/obj-macho.c20
-rw-r--r--gas/config/obj-som.c5
-rw-r--r--gas/config/tc-alpha.c90
-rw-r--r--gas/config/tc-arc.c20
-rw-r--r--gas/config/tc-arm.c15
-rw-r--r--gas/config/tc-dlx.c10
-rw-r--r--gas/config/tc-h8300.c2
-rw-r--r--gas/config/tc-hppa.c193
-rw-r--r--gas/config/tc-i370.c9
-rw-r--r--gas/config/tc-i386-intel.c11
-rw-r--r--gas/config/tc-i386.c36
-rw-r--r--gas/config/tc-i960.c5
-rw-r--r--gas/config/tc-ia64.c105
-rw-r--r--gas/config/tc-iq2000.c5
-rw-r--r--gas/config/tc-m32r.c12
-rw-r--r--gas/config/tc-m68hc11.c5
-rw-r--r--gas/config/tc-m68k.c13
-rw-r--r--gas/config/tc-microblaze.c13
-rw-r--r--gas/config/tc-mips.c51
-rw-r--r--gas/config/tc-mmix.c26
-rw-r--r--gas/config/tc-mn10200.c37
-rw-r--r--gas/config/tc-mn10300.c103
-rw-r--r--gas/config/tc-nios2.c7
-rw-r--r--gas/config/tc-ppc.c126
-rw-r--r--gas/config/tc-s390.c29
-rw-r--r--gas/config/tc-score.c10
-rw-r--r--gas/config/tc-score7.c10
-rw-r--r--gas/config/tc-sparc.c21
-rw-r--r--gas/config/tc-tic4x.c51
-rw-r--r--gas/config/tc-tic54x.c70
-rw-r--r--gas/config/tc-tic6x.c13
-rw-r--r--gas/config/tc-tilegx.c31
-rw-r--r--gas/config/tc-tilepro.c5
-rw-r--r--gas/config/tc-v850.c68
-rw-r--r--gas/config/tc-xtensa.c8
-rw-r--r--gas/config/tc-z80.c7
-rw-r--r--gas/doc/as.texinfo7
-rw-r--r--gas/dw2gencfi.c30
-rw-r--r--gas/dwarf2dbg.c13
-rw-r--r--gas/ecoff.c50
-rw-r--r--gas/expr.c78
-rw-r--r--gas/expr.h3
-rw-r--r--gas/read.c160
-rw-r--r--gas/read.h10
-rw-r--r--gas/stabs.c5
-rw-r--r--gas/testsuite/ChangeLog9
-rw-r--r--gas/testsuite/gas/all/byte.d5
-rw-r--r--gas/testsuite/gas/all/gas.exp2
-rw-r--r--gas/testsuite/gas/all/quoted-sym-names.d6
-rw-r--r--gas/testsuite/gas/all/quoted-sym-names.s4
-rw-r--r--gas/testsuite/gas/ia64/group-1.d2
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
diff --git a/gas/NEWS b/gas/NEWS
index 02a8d00..13a1911 100644
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -2,6 +2,10 @@
Changes in 2.26:
+* Symbol and label names can now be enclosed in double quotes (") which allows
+ them to contain characters that are not part of valid symbol names in high
+ level languages.
+
* Added the correctly spelled -march=armv6kz, for ARMv6KZ support. The
previous spelling, -march=armv6zk, is still accepted.
diff --git a/gas/cond.c b/gas/cond.c
index 2649976..e3b30f0 100644
--- a/gas/cond.c
+++ b/gas/cond.c
@@ -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 (&section_name);
name = xmalloc (input_line_pointer - section_name + 1);
strcpy (name, section_name);
-
*input_line_pointer = c;
-
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE_AFTER_NAME ();
exp = 0;
flags = SEC_NO_FLAGS;
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 (&reg_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(&notes, name);
- if (!name)
- {
- ignore_rest_of_line ();
- return;
- }
- }
- else
+ c = get_symbol_name (&name);
+ if (input_line_pointer == start)
{
- char c = get_symbol_end ();
-
- if (input_line_pointer == start)
- {
- as_bad (_("Missing section name"));
- ignore_rest_of_line ();
- return;
- }
- *input_line_pointer = c;
+ as_bad (_("Missing section name"));
+ ignore_rest_of_line ();
+ return;
}
+ * input_line_pointer = c;
+ SKIP_WHITESPACE_AFTER_NAME ();
end = input_line_pointer;
- SKIP_WHITESPACE ();
if (*input_line_pointer != ',')
{
as_bad (_("Comma expected after section name"));
@@ -5068,8 +5048,11 @@ dot_pred_rel (int type)
}
else if (*input_line_pointer == '@')
{
- char *form = ++input_line_pointer;
- char c = get_symbol_end();
+ char *form;
+ char c;
+
+ ++input_line_pointer;
+ c = get_symbol_name (&form);
if (strcmp (form, "mutex") == 0)
type = 'm';
@@ -5077,7 +5060,7 @@ dot_pred_rel (int type)
type = 'c';
else if (strcmp (form, "imply") == 0)
type = 'i';
- *input_line_pointer = c;
+ (void) restore_line_pointer (c);
}
else
{
@@ -5215,8 +5198,7 @@ dot_entry (int dummy ATTRIBUTE_UNUSED)
do
{
- name = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&name);
symbolP = symbol_find_or_make (name);
err = hash_insert (md.entry_hash, S_GET_NAME (symbolP), (void *) symbolP);
@@ -5225,7 +5207,7 @@ dot_entry (int dummy ATTRIBUTE_UNUSED)
name, err);
*input_line_pointer = c;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE_AFTER_NAME ();
c = *input_line_pointer;
if (c == ',')
{
@@ -7748,8 +7730,7 @@ ia64_unrecognized_line (int ch)
recognize labels. */
if (is_name_beginner (*input_line_pointer))
{
- s = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&s);
}
else if (LOCAL_LABELS_FB
&& ISDIGIT (*input_line_pointer))
@@ -10720,12 +10701,11 @@ md_assemble (char *str)
/* extract the opcode (mnemonic): */
- mnemonic = input_line_pointer;
- ch = get_symbol_end ();
+ ch = get_symbol_name (&mnemonic);
pdesc = (struct pseudo_opcode *) hash_find (md.pseudo_hash, mnemonic);
if (pdesc)
{
- *input_line_pointer = ch;
+ (void) restore_line_pointer (ch);
(*pdesc->handler) (pdesc->arg);
goto done;
}
@@ -10733,7 +10713,7 @@ md_assemble (char *str)
/* Find the instruction descriptor matching the arguments. */
idesc = ia64_find_opcode (mnemonic);
- *input_line_pointer = ch;
+ (void) restore_line_pointer (ch);
if (!idesc)
{
as_bad (_("Unknown opcode `%s'"), mnemonic);
@@ -11805,8 +11785,7 @@ dot_alias (int section)
struct hash_control *ahash, *nhash;
const char *kind;
- name = input_line_pointer;
- delim = get_symbol_end ();
+ delim = get_symbol_name (&name);
end_name = input_line_pointer;
*end_name = delim;
@@ -11817,7 +11796,7 @@ dot_alias (int section)
return;
}
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE_AFTER_NAME ();
if (*input_line_pointer != ',')
{
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 (&section_name);
+ c = (endc == '"' ? input_line_pointer[1] : endc);
if (c)
- next_c = *(input_line_pointer + 1);
+ next_c = input_line_pointer [(endc == '"' ? 2 : 1)];
/* Do we have .section Name<,"flags">? */
if (c != ',' || (c == ',' && next_c == '"'))
{
- /* just after name is now '\0'. */
- *input_line_pointer = c;
- input_line_pointer = section_name;
+ /* Just after name is now '\0'. */
+ (void) restore_line_pointer (endc);
+ input_line_pointer = saved_ilp;
obj_elf_section (ignore);
return;
}
+
+ section_name = xstrdup (section_name);
+ c = restore_line_pointer (endc);
+
input_line_pointer++;
/* Do we have .section Name<,type><,flag><,entry_size><,alignment> */
@@ -15309,23 +15314,25 @@ s_change_section (int ignore ATTRIBUTE_UNUSED)
section_type = get_absolute_expression ();
else
section_type = 0;
+
if (*input_line_pointer++ == ',')
section_flag = get_absolute_expression ();
else
section_flag = 0;
+
if (*input_line_pointer++ == ',')
section_entry_size = get_absolute_expression ();
else
section_entry_size = 0;
+
if (*input_line_pointer++ == ',')
section_alignment = get_absolute_expression ();
else
section_alignment = 0;
+
/* FIXME: really ignore? */
(void) section_alignment;
- section_name = xstrdup (section_name);
-
/* When using the generic form of .section (as implemented by obj-elf.c),
there's no way to set the section type to SHT_MIPS_DWARF. Users have
traditionally had to fall back on the more common @progbits instead.
@@ -15404,13 +15411,12 @@ s_mips_globl (int x ATTRIBUTE_UNUSED)
do
{
- name = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&name);
symbolP = symbol_find_or_make (name);
S_SET_EXTERNAL (symbolP);
*input_line_pointer = c;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE_AFTER_NAME ();
/* On Irix 5, every global symbol that is not explicitly labelled as
being a function is apparently labelled as being an object. */
@@ -15422,12 +15428,11 @@ s_mips_globl (int x ATTRIBUTE_UNUSED)
char *secname;
asection *sec;
- secname = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&secname);
sec = bfd_get_section_by_name (stdoutput, secname);
if (sec == NULL)
as_bad (_("%s: no such section"), secname);
- *input_line_pointer = c;
+ (void) restore_line_pointer (c);
if (sec != NULL && (sec->flags & SEC_CODE) != 0)
flag = BSF_FUNCTION;
@@ -15455,8 +15460,7 @@ s_option (int x ATTRIBUTE_UNUSED)
char *opt;
char c;
- opt = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&opt);
if (*opt == 'O')
{
@@ -15488,7 +15492,7 @@ s_option (int x ATTRIBUTE_UNUSED)
else
as_warn (_("unrecognized option \"%s\""), opt);
- *input_line_pointer = c;
+ (void) restore_line_pointer (c);
demand_empty_rest_of_line ();
}
@@ -16425,13 +16429,12 @@ s_mips_weakext (int ignore ATTRIBUTE_UNUSED)
symbolS *symbolP;
expressionS exp;
- name = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&name);
symbolP = symbol_find_or_make (name);
S_SET_WEAK (symbolP);
*input_line_pointer = c;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE_AFTER_NAME ();
if (! is_end_of_line[(unsigned char) *input_line_pointer])
{
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 (&section_name);
name = xmalloc (input_line_pointer - section_name + 1);
strcpy (name, section_name);
*input_line_pointer = c;
- SKIP_WHITESPACE ();
+ SKIP_WHITESPACE_AFTER_NAME ();
exp = 0;
flags = SEC_NO_FLAGS;
@@ -5543,12 +5516,11 @@ ppc_pe_function (int ignore ATTRIBUTE_UNUSED)
char endc;
symbolS *ext_sym;
- name = input_line_pointer;
- endc = get_symbol_end ();
+ endc = get_symbol_name (&name);
ext_sym = symbol_find_or_make (name);
- *input_line_pointer = endc;
+ (void) restore_line_pointer (endc);
S_SET_DATA_TYPE (ext_sym, DT_FCN << N_BTSHFT);
SF_SET_FUNCTION (ext_sym);
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 (&regname);
if (strcmp (regname, "scratch") && strcmp (regname, "ignore"))
as_bad (_("register syntax is .register %%g[2367],{#scratch|symbolname|#ignore}"));
if (regname[0] == 'i')
@@ -4413,9 +4410,9 @@ s_register (int ignore ATTRIBUTE_UNUSED)
}
else
{
- regname = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&regname);
}
+
if (sparc_arch_size == 64)
{
if (globals[reg])
@@ -4462,7 +4459,7 @@ s_register (int ignore ATTRIBUTE_UNUSED)
}
}
- *input_line_pointer = c;
+ (void) restore_line_pointer (c);
demand_empty_rest_of_line ();
}
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 (&section_name); /* Get terminator. */
+ if (c == '"')
+ c = * ++ input_line_pointer;
input_line_pointer++; /* Skip null symbol terminator. */
name = xmalloc (input_line_pointer - section_name + 1);
strcpy (name, section_name);
@@ -980,13 +979,16 @@ tic4x_sect (int x ATTRIBUTE_UNUSED)
Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>. */
if (c == ':')
{
- c = get_symbol_end (); /* Get terminator. */
+ char *subname;
+ c = get_symbol_name (&subname); /* Get terminator. */
+ if (c == '"')
+ c = * ++ input_line_pointer;
input_line_pointer++; /* Skip null symbol terminator. */
as_warn (_(".sect: subsection name ignored"));
}
/* We might still have a '"' to discard, but the character after a
- symbol name will be overwritten with a \0 by get_symbol_end()
+ symbol name will be overwritten with a \0 by get_symbol_name()
[VK]. */
if (c == ',')
@@ -1014,7 +1016,7 @@ tic4x_sect (int x ATTRIBUTE_UNUSED)
bfd_errmsg (bfd_get_error ()));
}
- /* If the last character overwritten by get_symbol_end() was an
+ /* If the last character overwritten by get_symbol_name() was an
end-of-line, we must restore it or the end of the line will not be
recognised and scanning extends into the next line, stopping with
an error (blame Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
@@ -1037,8 +1039,9 @@ tic4x_set (int x ATTRIBUTE_UNUSED)
char c;
char *name;
- name = input_line_pointer;
- c = get_symbol_end (); /* Get terminator. */
+ c = get_symbol_name (&name); /* Get terminator. */
+ if (c == '"')
+ c = * ++ input_line_pointer;
if (c != ',')
{
as_bad (_(".set syntax invalid\n"));
@@ -1073,8 +1076,9 @@ tic4x_usect (int x ATTRIBUTE_UNUSED)
SKIP_WHITESPACE ();
if (*input_line_pointer == '"')
input_line_pointer++;
- section_name = input_line_pointer;
- c = get_symbol_end (); /* Get terminator. */
+ c = get_symbol_name (&section_name); /* Get terminator. */
+ if (c == '"')
+ c = * ++ input_line_pointer;
input_line_pointer++; /* Skip null symbol terminator. */
name = xmalloc (input_line_pointer - section_name + 1);
strcpy (name, section_name);
@@ -1513,17 +1517,16 @@ tic4x_operand_parse (char *s, tic4x_operand_t *operand)
input_line_pointer = s;
SKIP_WHITESPACE ();
- str = input_line_pointer;
- c = get_symbol_end (); /* Get terminator. */
+ c = get_symbol_name (&str); /* Get terminator. */
new_pointer = input_line_pointer;
if (strlen (str) && (entry = hash_find (tic4x_asg_hash, str)) != NULL)
{
- *input_line_pointer = c;
+ (void) restore_line_pointer (c);
input_line_pointer = (char *) entry;
}
else
{
- *input_line_pointer = c;
+ (void) restore_line_pointer (c);
input_line_pointer = str;
}
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 (&section_name); /* Get terminator. */
name = xmalloc (input_line_pointer - section_name + 1);
strcpy (name, section_name);
-
- if (*input_line_pointer == ',')
+ c = restore_line_pointer (c);
+
+ if (c == ',')
++input_line_pointer;
- else if (c != ',')
+ else
{
as_bad (_("Missing size argument"));
ignore_rest_of_line ();
@@ -2008,17 +2005,17 @@ tic54x_message (int type)
static void
tic54x_label (int ignored ATTRIBUTE_UNUSED)
{
- char *name = input_line_pointer;
+ char *name;
symbolS *symbolP;
int c;
ILLEGAL_WITHIN_STRUCT ();
- c = get_symbol_end ();
+ c = get_symbol_name (&name);
symbolP = colon (name);
S_SET_STORAGE_CLASS (symbolP, C_STATLAB);
- *input_line_pointer = c;
+ (void) restore_line_pointer (c);
demand_empty_rest_of_line ();
}
@@ -2141,12 +2138,12 @@ tic54x_sblock (int ignore ATTRIBUTE_UNUSED)
}
else
{
- char *section_name = input_line_pointer;
+ char *section_name;
- c = get_symbol_end ();
+ c = get_symbol_name (&section_name);
name = xmalloc (strlen (section_name) + 1);
strcpy (name, section_name);
- *input_line_pointer = c;
+ (void) restore_line_pointer (c);
}
seg = bfd_get_section_by_name (stdoutput, name);
@@ -2256,12 +2253,11 @@ tic54x_var (int ignore ATTRIBUTE_UNUSED)
ignore_rest_of_line ();
return;
}
- name = input_line_pointer;
- c = get_symbol_end ();
+ c = get_symbol_name (&name);
/* .var symbols start out with a null string. */
name = strcpy (xmalloc (strlen (name) + 1), name);
hash_insert (subsym_hash[macro_level], name, empty);
- *input_line_pointer = c;
+ c = restore_line_pointer (c);
if (c == ',')
{
++input_line_pointer;
@@ -4500,8 +4496,8 @@ subsym_substitute (char *line, int forced)
if (forced)
++ptr;
- name = input_line_pointer = ptr;
- c = get_symbol_end ();
+ input_line_pointer = ptr;
+ c = get_symbol_name (&name);
/* '?' is not normally part of a symbol, but it IS part of a local
label. */
if (c == '?')
@@ -4846,7 +4842,7 @@ md_assemble (char *line)
int c;
input_line_pointer = line;
- c = get_symbol_end ();
+ c = get_symbol_name (&line);
if (cpu == VNONE)
cpu = V542;
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 (&regname);
+ pval = hash_find (main_reg_hash, regname);
if (pval == NULL)
- {
- as_bad (_("Expected register, got '%s'."), regname);
- }
+ as_bad (_("Expected register, got '%s'."), regname);
- int regno_and_flags = (int)(size_t)pval;
- int regno = EXTRACT_REGNO(regno_and_flags);
+ regno_and_flags = (int)(size_t)pval;
+ regno = EXTRACT_REGNO(regno_and_flags);
if ((regno_and_flags & NONCANONICAL_REG_NAME_FLAG)
&& require_canonical_reg_names)
- {
- as_warn (_("Found use of non-canonical register name %s; "
- "use %s instead."),
- regname,
- tilegx_register_names[regno]);
- }
+ as_warn (_("Found use of non-canonical register name %s; "
+ "use %s instead."),
+ regname, tilegx_register_names[regno]);
/* Restore the old character following the register name. */
- *input_line_pointer = terminating_char;
+ (void) restore_line_pointer (terminating_char);
/* Fill in the expression fields to indicate it's a register. */
expression->X_op = O_register;
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 (&regname);
void* pval = hash_find (main_reg_hash, regname);
@@ -998,7 +997,7 @@ parse_reg_expression (expressionS* expression)
regname, tilepro_register_names[regno]);
/* Restore the old character following the register name. */
- *input_line_pointer = terminating_char;
+ (void) restore_line_pointer (terminating_char);
/* Fill in the expression fields to indicate it's a register. */
expression->X_op = O_register;
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;
diff --git a/gas/expr.c b/gas/expr.c
index f8acd41..a523b11 100644
--- a/gas/expr.c
+++ b/gas/expr.c
@@ -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
diff --git a/gas/expr.h b/gas/expr.h
index fc6b721..cfb1e5f 100644
--- a/gas/expr.h
+++ b/gas/expr.h
@@ -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);
diff --git a/gas/read.c b/gas/read.c
index 000c75b..978cd3e 100644
--- a/gas/read.c
+++ b/gas/read.c
@@ -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)
diff --git a/gas/read.h b/gas/read.h
index d7ac6ce..fd5588d 100644
--- a/gas/read.h
+++ b/gas/read.h
@@ -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:
#...