More fallout from "Allow symbol and label names to be enclosed in double quotes"
authorAlan Modra <amodra@gmail.com>
Thu, 27 Aug 2015 13:20:38 +0000 (22:50 +0930)
committerAlan Modra <amodra@gmail.com>
Thu, 27 Aug 2015 13:49:59 +0000 (23:19 +0930)
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.

18 files changed:
gas/ChangeLog
gas/config/tc-aarch64.h
gas/config/tc-arm.c
gas/config/tc-arm.h
gas/config/tc-bfin.c
gas/config/tc-bfin.h
gas/config/tc-d30v.h
gas/config/tc-fr30.c
gas/config/tc-fr30.h
gas/config/tc-m32c.c
gas/config/tc-m32c.h
gas/config/tc-m32r.h
gas/config/tc-mep.h
gas/config/tc-nds32.h
gas/config/tc-nios2.c
gas/config/tc-tic54x.c
gas/config/tc-tic54x.h
gas/read.c

index 6730a581aed807982a14bfe190b88b15ea884c0a..2dc974236ed349f95d61eae87eb2f466e8f8ff63 100644 (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
index 86b70d676a9f0dad3f84fb14aed439fd3204714e..951a436be05bc3c629bb7b986c30ce7de278f69c 100644 (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 ()
 
index 68581cbee42d0269d5571f61cf75da24295eb241..efc522a7f56db8efe1695da50bbcbf4f25d165cd 100644 (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;
index 98038beaf1a4b66dd544d533593e542a15fb6fee..42f2d90d4e81c010ebf29232fd169ddf1dea1306 100644 (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 ()
 
index 3736d79ba342f30279216e8a614b1849f8b94282..656e51554173c702f79d552d1402d6e82f5e2632 100644 (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;
index 4c3a40e3e94d37b86da7b0b5813a0e245726ac6b..47b585bd3c12bc1ac60a5613f11b1bb3c8266d0c 100644 (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 *);
 
index 87e47eef5ca4517adf4966ce0ba2df267514da19..c28c26065d49046173dc2e91908530ff2e68a857 100644 (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 ()
 
index 6a6c67fc7ea589cc9ec08a07f52cfa2b917deaa1..c6e80e32279a7b1276c2b3126b292d2b6f072821 100644 (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;
 }
index ecec8479839a9ee07e144d5511b70491011809b7..db4d8e82b37fa6d19e9920709347d70c78834d38 100644 (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 *);
index 2c8136be594bc65f9e8d47a7b31c4ce395cca464..10eba143e75ba3643a724b8ed27704bc3bf6b895 100644 (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;
 }
index 66fffc50ab095bd33db72a9f465772f3ec581b23..3a077b656a10a76771f71143a3bf25cd7d2571e4 100644 (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
index 6f350e1019ebe0bce0e3b71b41d7e236cfe0c664..60bc57d4b12a147f39790e713d8a372a1a9f01a1 100644 (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
index 8d70ad1aa849b068c296438c0a534c0a4bfa1796..7f2d2b7e1b818c349b3e0e4d4d32fb7ef8761d0e 100644 (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);
index fb4e03b5ad016c179b89f8f17cfd6d35884f5bb8..b6c32e440893896c632da7bd02ece29519bb7494 100644 (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
index 8dd760464d0695af6480f15c0c6426ec84f0650b..5bb00ecdf1ba44fa0ecc776a0e6ae5ee5a276740 100644 (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);
 }
 
index 2637d1080bcaf71287752f6d44fabc19e2dcfda8..d8df85de0b9af9ba1e4fe0ad9371bebe3c8b6588 100644 (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])));
 }
index 0dacf2166b56c50c40186d4c72e006f00b2e5f97..9dd6f4445ee1c1b26270d7d684e58b12823f74ae 100644 (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)    \
index 978cd3e985534438ad163b22184b3d27dce8a41c..a3e83c3440c617d74dfd692abbd49c5cfee1466f 100644 (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)
                    {