More fallout from "Allow symbol and label names to be enclosed in double quotes"

Some of the TC_START_LABEL implementations need to adjust the end of
the symbol, when a colon doesn't mean a label definition.  That means
they need access to nul_char both the restore the NUL location (it may
be a quote rather than a colon) and to store the new nul_char.  Others
need adjusting to step over a potential trailing quote.

	PR gas/18581
	* config/tc-aarch64.h (TC_START_LABEL): Redefine.
	* config/tc-arm.c (tc_start_label_without_colon): Delete params.
	Use input_line_pointer directly.
	* config/tc-arm.h (TC_START_LABEL): Redefine.
	(TC_START_LABEL_WITHOUT_COLON): Redefine.
	(tc_start_label_without_colon): Update prototype.
	* config/tc-bfin.c (bfin_start_label): Delete ptr param.  Check
	for NUL instead.
	* config/tc-bfin.h (bfin_start_label): Update prototype.
	(TC_START_LABEL): Redefine.
	* config/tc-d30v.h (TC_START_LABEL): Redefine.
	* config/tc-fr30.c (restore_colon): Rewrite.
	(fr30_is_colon_insn): Add nul_char param.  Return int.  Bump
	i_l_p over quote.  Update restore_colon calls.
	* config/tc-fr30.h (TC_START_LABEL): Redefine.
	(fr30_is_colon_insn): Update prototype.
	* config/tc-m32c.c (restore_colon, m32c_is_colon_insn): As above.
	* config/tc-m32c.h (TC_START_LABEL): Redefine.
	(m32c_is_colon_insn): Update prototype.
	* config/tc-m32r.h (TC_START_LABEL): Redefine.
	* config/tc-mep.h (TC_START_LABEL): Redefine.
	* config/tc-nds32.h (TC_START_LABEL): Redefine.
	* config/tc-tic54x.c (tic54x_start_label): Replace params with
	nul_char and next_char.  Step over trailing quote.
	* config/tc-tic54x.h (TC_START_LABEL_WITHOUT_COLON): Redefine.
	(tic54x_start_label): Update prototype.
	* read.c (TC_START_LABEL): Redefine.  Update invocation.
	(TC_START_LABEL_WITHOUT_COLON): Update invocation.
	* config/tc-nios2.c (s_nios2_set): Save initial input_line_pointer
	and restore if calling s_set.  Don't restore delim again.
This commit is contained in:
Alan Modra 2015-08-27 22:50:38 +09:30
parent f5cdf4989e
commit 2e57ce7b14
18 changed files with 134 additions and 92 deletions

View File

@ -1,3 +1,37 @@
2015-08-27 Alan Modra <amodra@gmail.com>
PR gas/18581
* config/tc-aarch64.h (TC_START_LABEL): Redefine.
* config/tc-arm.c (tc_start_label_without_colon): Delete params.
Use input_line_pointer directly.
* config/tc-arm.h (TC_START_LABEL): Redefine.
(TC_START_LABEL_WITHOUT_COLON): Redefine.
(tc_start_label_without_colon): Update prototype.
* config/tc-bfin.c (bfin_start_label): Delete ptr param. Check
for NUL instead.
* config/tc-bfin.h (bfin_start_label): Update prototype.
(TC_START_LABEL): Redefine.
* config/tc-d30v.h (TC_START_LABEL): Redefine.
* config/tc-fr30.c (restore_colon): Rewrite.
(fr30_is_colon_insn): Add nul_char param. Return int. Bump
i_l_p over quote. Update restore_colon calls.
* config/tc-fr30.h (TC_START_LABEL): Redefine.
(fr30_is_colon_insn): Update prototype.
* config/tc-m32c.c (restore_colon, m32c_is_colon_insn): As above.
* config/tc-m32c.h (TC_START_LABEL): Redefine.
(m32c_is_colon_insn): Update prototype.
* config/tc-m32r.h (TC_START_LABEL): Redefine.
* config/tc-mep.h (TC_START_LABEL): Redefine.
* config/tc-nds32.h (TC_START_LABEL): Redefine.
* config/tc-tic54x.c (tic54x_start_label): Replace params with
nul_char and next_char. Step over trailing quote.
* config/tc-tic54x.h (TC_START_LABEL_WITHOUT_COLON): Redefine.
(tic54x_start_label): Update prototype.
* read.c (TC_START_LABEL): Redefine. Update invocation.
(TC_START_LABEL_WITHOUT_COLON): Update invocation.
* config/tc-nios2.c (s_nios2_set): Save initial input_line_pointer
and restore if calling s_set. Don't restore delim again.
2015-08-26 Alan Modra <amodra@gmail.com>
PR gas/18581

View File

@ -91,8 +91,8 @@ void aarch64_copy_symbol_attributes (symbolS *, symbolS *);
(aarch64_copy_symbol_attributes (DEST, SRC))
#endif
#define TC_START_LABEL(C,S,STR) ((C) == ':' \
|| ((C) == '/' && aarch64_data_in_code ()))
#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \
(NEXT_CHAR == ':' || (NEXT_CHAR == '/' && aarch64_data_in_code ()))
#define tc_canonicalize_symbol_name(str) aarch64_canonicalize_symbol_name (str);
#define obj_adjust_symtab() aarch64_adjust_symtab ()

View File

@ -3311,13 +3311,13 @@ add_to_lit_pool (unsigned int nbytes)
}
bfd_boolean
tc_start_label_without_colon (char unused1 ATTRIBUTE_UNUSED, const char * rest)
tc_start_label_without_colon (void)
{
bfd_boolean ret = TRUE;
if (codecomposer_syntax && asmfunc_state == WAITING_ASMFUNC_NAME)
{
const char *label = rest;
const char *label = input_line_pointer;
while (!is_end_of_line[(int) label[-1]])
--label;

View File

@ -104,8 +104,9 @@ extern int arm_optimize_expr (expressionS *, operatorT, expressionS *);
#define md_start_line_hook() arm_start_line_hook ()
#define TC_START_LABEL_WITHOUT_COLON(c, l) tc_start_label_without_colon (c, l)
extern bfd_boolean tc_start_label_without_colon (char, const char *);
#define TC_START_LABEL_WITHOUT_COLON(NUL_CHAR, NEXT_CHAR) \
tc_start_label_without_colon ()
extern bfd_boolean tc_start_label_without_colon (void);
#define tc_frob_label(S) arm_frob_label (S)
@ -179,7 +180,8 @@ void arm_copy_symbol_attributes (symbolS *, symbolS *);
(arm_copy_symbol_attributes (DEST, SRC))
#endif
#define TC_START_LABEL(C,S,STR) (C == ':' || (C == '/' && arm_data_in_code ()))
#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \
(NEXT_CHAR == ':' || (NEXT_CHAR == '/' && arm_data_in_code ()))
#define tc_canonicalize_symbol_name(str) arm_canonicalize_symbol_name (str);
#define obj_adjust_symtab() arm_adjust_symtab ()

View File

@ -1970,9 +1970,9 @@ bfin_eol_in_insn (char *line)
}
bfd_boolean
bfin_start_label (char *s, char *ptr)
bfin_start_label (char *s)
{
while (s != ptr)
while (*s != 0)
{
if (*s == '(' || *s == '[')
return FALSE;

View File

@ -38,7 +38,7 @@
#define WORKING_DOT_WORD
extern bfd_boolean bfin_start_label (char *, char *);
extern bfd_boolean bfin_start_label (char *);
#define md_number_to_chars number_to_chars_littleendian
#define md_convert_frag(b,s,f) as_fatal ("bfin convert_frag\n");
@ -58,7 +58,8 @@ extern bfd_boolean bfin_eol_in_insn (char *);
#define DOUBLESLASH_LINE_COMMENTS
#define TC_START_LABEL(c, s, ptr) (c == ':' && bfin_start_label (s, ptr))
#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \
(NEXT_CHAR == ':' && bfin_start_label (STR))
#define tc_fix_adjustable(FIX) bfin_fix_adjustable (FIX)
extern bfd_boolean bfin_fix_adjustable (struct fix *);

View File

@ -46,7 +46,8 @@ extern long md_pcrel_from_section (struct fix *, segT);
int d30v_cleanup (int);
#define md_cleanup() d30v_cleanup (FALSE)
#define TC_START_LABEL(ch, s, ptr) (ch == ':' && d30v_cleanup (FALSE))
#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \
(NEXT_CHAR == ':' && d30v_cleanup (FALSE))
void d30v_start_line (void);
#define md_start_line_hook() d30v_start_line ()

View File

@ -324,19 +324,16 @@ md_atof (int type, char * litP, int * sizeP)
}
/* Worker function for fr30_is_colon_insn(). */
static char
restore_colon (int advance_i_l_p_by)
static int
restore_colon (char *next_i_l_p, char *nul_char)
{
char c;
/* Restore the colon, and advance input_line_pointer to
the end of the new symbol. */
* input_line_pointer = ':';
input_line_pointer += advance_i_l_p_by;
c = * input_line_pointer;
* input_line_pointer = 0;
return c;
*input_line_pointer = *nul_char;
input_line_pointer = next_i_l_p;
*nul_char = *next_i_l_p;
*next_i_l_p = 0;
return 1;
}
/* Determines if the symbol starting at START and ending in
@ -344,13 +341,16 @@ restore_colon (int advance_i_l_p_by)
(but which has now been replaced bu a NUL) is in fact an
LDI:8, LDI:20, LDI:32, CALL:D. JMP:D, RET:D or Bcc:D instruction.
If it is, then it restores the colon, advances INPUT_LINE_POINTER
to the real end of the instruction/symbol, and returns the character
that really terminated the symbol. Otherwise it returns 0. */
char
fr30_is_colon_insn (char * start)
to the real end of the instruction/symbol, saves the char there to
NUL_CHAR and pokes a NUL, and returns 1. Otherwise it returns 0. */
int
fr30_is_colon_insn (char *start, char *nul_char)
{
char * i_l_p = input_line_pointer;
if (*nul_char == '"')
++i_l_p;
/* Check to see if the symbol parsed so far is 'ldi'. */
if ( (start[0] != 'l' && start[0] != 'L')
|| (start[1] != 'd' && start[1] != 'D')
@ -384,7 +384,7 @@ fr30_is_colon_insn (char * start)
break;
if (len == -1)
return restore_colon (1);
return restore_colon (i_l_p + 1, nul_char);
}
}
@ -394,15 +394,17 @@ fr30_is_colon_insn (char * start)
/* Check to see if the text following the colon is '8'. */
if (i_l_p[1] == '8' && (i_l_p[2] == ' ' || i_l_p[2] == '\t'))
return restore_colon (2);
return restore_colon (i_l_p + 2, nul_char);
/* Check to see if the text following the colon is '20'. */
else if (i_l_p[1] == '2' && i_l_p[2] =='0' && (i_l_p[3] == ' ' || i_l_p[3] == '\t'))
return restore_colon (3);
else if (i_l_p[1] == '2' && i_l_p[2] =='0'
&& (i_l_p[3] == ' ' || i_l_p[3] == '\t'))
return restore_colon (i_l_p + 3, nul_char);
/* Check to see if the text following the colon is '32'. */
else if (i_l_p[1] == '3' && i_l_p[2] =='2' && (i_l_p[3] == ' ' || i_l_p[3] == '\t'))
return restore_colon (3);
else if (i_l_p[1] == '3' && i_l_p[2] =='2'
&& (i_l_p[3] == ' ' || i_l_p[3] == '\t'))
return restore_colon (i_l_p + 3, nul_char);
return 0;
}

View File

@ -58,8 +58,8 @@ extern const struct relax_type md_relax_table[];
/* We need a special version of the TC_START_LABEL macro so that we
allow the LDI:8, LDI:20, LDI:32 and delay slot instructions to be
parsed as such. We need to be able to change the contents of
the local variable 'c' which is passed to this macro as 'character'. */
#define TC_START_LABEL(character, s, i_l_p) \
((character) != ':' ? 0 : (character = fr30_is_colon_insn (s)) ? 0 : ((character = ':'), 1))
extern char fr30_is_colon_insn (char *);
parsed as such. We need to be able to change the contents of the
var storing what was at the NUL delimiter. */
#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \
(NEXT_CHAR == ':' && !fr30_is_colon_insn (STR, &NUL_CHAR))
extern int fr30_is_colon_insn (char *, char *);

View File

@ -1247,19 +1247,16 @@ m32c_fix_adjustable (fixS * fixP)
}
/* Worker function for m32c_is_colon_insn(). */
static char
restore_colon (int advance_i_l_p_by)
static int
restore_colon (char *next_i_l_p, char *nul_char)
{
char c;
/* Restore the colon, and advance input_line_pointer to
the end of the new symbol. */
* input_line_pointer = ':';
input_line_pointer += advance_i_l_p_by;
c = * input_line_pointer;
* input_line_pointer = 0;
return c;
*input_line_pointer = *nul_char;
input_line_pointer = next_i_l_p;
*nul_char = *next_i_l_p;
*next_i_l_p = 0;
return 1;
}
/* Determines if the symbol starting at START and ending in
@ -1267,28 +1264,31 @@ restore_colon (int advance_i_l_p_by)
(but which has now been replaced bu a NUL) is in fact an
:Z, :S, :Q, or :G suffix.
If it is, then it restores the colon, advances INPUT_LINE_POINTER
to the real end of the instruction/symbol, and returns the character
that really terminated the symbol. Otherwise it returns 0. */
char
m32c_is_colon_insn (char *start ATTRIBUTE_UNUSED)
to the real end of the instruction/symbol, saves the char there to
NUL_CHAR and pokes a NUL, and returns 1. Otherwise it returns 0. */
int
m32c_is_colon_insn (char *start ATTRIBUTE_UNUSED, char *nul_char)
{
char * i_l_p = input_line_pointer;
if (*nul_char == '"')
++i_l_p;
/* Check to see if the text following the colon is 'G' */
if (TOLOWER (i_l_p[1]) == 'g' && (i_l_p[2] == ' ' || i_l_p[2] == '\t'))
return restore_colon (2);
return restore_colon (i_l_p + 2, nul_char);
/* Check to see if the text following the colon is 'Q' */
if (TOLOWER (i_l_p[1]) == 'q' && (i_l_p[2] == ' ' || i_l_p[2] == '\t'))
return restore_colon (2);
return restore_colon (i_l_p + 2, nul_char);
/* Check to see if the text following the colon is 'S' */
if (TOLOWER (i_l_p[1]) == 's' && (i_l_p[2] == ' ' || i_l_p[2] == '\t'))
return restore_colon (2);
return restore_colon (i_l_p + 2, nul_char);
/* Check to see if the text following the colon is 'Z' */
if (TOLOWER (i_l_p[1]) == 'z' && (i_l_p[2] == ' ' || i_l_p[2] == '\t'))
return restore_colon (2);
return restore_colon (i_l_p + 2, nul_char);
return 0;
}

View File

@ -78,10 +78,10 @@ extern long md_pcrel_from_section (struct fix *, segT);
/* We need a special version of the TC_START_LABEL macro so that we
allow the :Z, :S, :Q and :G suffixes to be
parsed as such. We need to be able to change the contents of
the local variable 'c' which is passed to this macro as 'character'. */
#define TC_START_LABEL(character, s, i_l_p) \
((character) != ':' ? 0 : (character = m32c_is_colon_insn (s)) ? 0 : ((character = ':'), 1))
extern char m32c_is_colon_insn (char *);
parsed as such. We need to be able to change the contents of the
var storing what was at the NUL delimiter. */
#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \
(NEXT_CHAR == ':' && !m32c_is_colon_insn (STR, &NUL_CHAR))
extern int m32c_is_colon_insn (char *, char *);
#define H_TICK_HEX 1

View File

@ -100,7 +100,8 @@ extern int m32r_force_relocation (struct fix *);
/* Ensure insns at labels are aligned to 32 bit boundaries. */
int m32r_fill_insn (int);
#define TC_START_LABEL(ch, s, ptr) (ch == ':' && m32r_fill_insn (0))
#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \
(NEXT_CHAR == ':' && m32r_fill_insn (0))
#define md_cleanup() m32r_fill_insn (1)
#define md_elf_section_change_hook m32r_elf_section_change_hook

View File

@ -97,7 +97,8 @@ extern void mep_prepare_relax_scan (fragS *, offsetT *, relax_substateT);
#define VTEXT_SECTION_NAME ".vtext"
/* Needed to process pending instructions when a label is encountered. */
#define TC_START_LABEL(ch, s, ptr) ((ch == ':') && mep_flush_pending_output ())
#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \
(NEXT_CHAR == ':' && mep_flush_pending_output ())
#define tc_unrecognized_line(c) mep_unrecognized_line (c)
extern int mep_unrecognized_line (int);

View File

@ -131,7 +131,8 @@ extern void nds32_do_align (int);
#define md_macro_start() nds32_macro_start ()
#define md_macro_end() nds32_macro_end ()
#define md_macro_info(args) nds32_macro_info (args)
#define TC_START_LABEL(C, S, STR) (C == ':' && nds32_start_label (0, 0))
#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) \
(NEXT_CHAR == ':' && nds32_start_label (0, 0))
#define tc_check_label(label) nds32_check_label (label)
#define tc_frob_label(label) nds32_frob_label (label)
#define md_end md_end

View File

@ -566,6 +566,7 @@ s_nios2_sdata (int ignore ATTRIBUTE_UNUSED)
static void
s_nios2_set (int equiv)
{
char *save = input_line_pointer;
char *directive;
char delim = get_symbol_name (&directive);
char *endline = input_line_pointer;
@ -610,8 +611,7 @@ s_nios2_set (int equiv)
/* If we fall through to here, either we have ".set XXX, YYY"
or we have ".set XXX" where XXX is unknown or we have
a syntax error. */
input_line_pointer = directive;
*endline = delim;
input_line_pointer = save;
s_set (equiv);
}

View File

@ -5357,22 +5357,21 @@ tic54x_convert_frag (bfd *abfd ATTRIBUTE_UNUSED,
syntax puts the symbol *before* the pseudo (which is kinda like MRI syntax,
I guess, except I've never seen a definition of MRI syntax).
C is the character that used to be at *REST, which points to the end of the
label.
Don't allow labels to start with '.' */
int
tic54x_start_label (int c, char *rest)
tic54x_start_label (int nul_char, int next_char)
{
char *rest;
/* If within .struct/.union, no auto line labels, please. */
if (current_stag != NULL)
return 0;
/* Disallow labels starting with "." */
if (c != ':')
if (next_char != ':')
{
char *label = rest;
char *label = input_line_pointer;
while (!is_end_of_line[(int) label[-1]])
--label;
@ -5383,22 +5382,22 @@ tic54x_start_label (int c, char *rest)
}
}
if (is_end_of_line[(int) c])
if (is_end_of_line[(int) next_char])
return 1;
if (ISSPACE (c))
while (ISSPACE (c = *++rest))
;
if (c == '.')
{
/* Don't let colon () define a label for any of these... */
return (strncasecmp (rest, ".tag", 4) != 0 || !ISSPACE (rest[4]))
&& (strncasecmp (rest, ".struct", 7) != 0 || !ISSPACE (rest[7]))
&& (strncasecmp (rest, ".union", 6) != 0 || !ISSPACE (rest[6]))
&& (strncasecmp (rest, ".macro", 6) != 0 || !ISSPACE (rest[6]))
&& (strncasecmp (rest, ".set", 4) != 0 || !ISSPACE (rest[4]))
&& (strncasecmp (rest, ".equ", 4) != 0 || !ISSPACE (rest[4]));
}
rest = input_line_pointer;
if (nul_char == '"')
++rest;
while (ISSPACE (next_char))
next_char = *++rest;
if (next_char != '.')
return 1;
return 1;
/* Don't let colon () define a label for any of these... */
return ((strncasecmp (rest, ".tag", 4) != 0 || !ISSPACE (rest[4]))
&& (strncasecmp (rest, ".struct", 7) != 0 || !ISSPACE (rest[7]))
&& (strncasecmp (rest, ".union", 6) != 0 || !ISSPACE (rest[6]))
&& (strncasecmp (rest, ".macro", 6) != 0 || !ISSPACE (rest[6]))
&& (strncasecmp (rest, ".set", 4) != 0 || !ISSPACE (rest[4]))
&& (strncasecmp (rest, ".equ", 4) != 0 || !ISSPACE (rest[4])));
}

View File

@ -65,8 +65,9 @@ struct bit_info
#define TC_FRAG_INIT(FRAGP) do {(FRAGP)->tc_frag_data = 0;}while (0)
/* tell GAS whether the given token is indeed a code label */
#define TC_START_LABEL_WITHOUT_COLON(c,ptr) tic54x_start_label(c,ptr)
extern int tic54x_start_label (int, char *);
#define TC_START_LABEL_WITHOUT_COLON(NUL_CHAR, NEXT_CHAR) \
tic54x_start_label(NUL_CHAR, NEXT_CHAR)
extern int tic54x_start_label (int, int);
/* custom handling for relocations in cons expressions */
#define TC_CONS_FIX_NEW(FRAG, OFF, LEN, EXP, RELOC) \

View File

@ -41,7 +41,7 @@
#include "wchar.h"
#ifndef TC_START_LABEL
#define TC_START_LABEL(x,y,z) (x == ':')
#define TC_START_LABEL(STR, NUL_CHAR, NEXT_CHAR) (NEXT_CHAR == ':')
#endif
/* Set by the object-format or the target. */
@ -874,8 +874,7 @@ 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 (next_char,
input_line_pointer)
&& TC_START_LABEL_WITHOUT_COLON (nul_char, next_char)
#endif
)
line_label = colon (line_start);
@ -923,7 +922,7 @@ read_a_source_file (char *name)
S points to the beginning of the symbol.
[In case of pseudo-op, s->'.'.]
Input_line_pointer->'\0' where NUL_CHAR was. */
if (TC_START_LABEL (next_char, s, input_line_pointer))
if (TC_START_LABEL (s, nul_char, next_char))
{
if (flag_m68k_mri)
{