Better error reporting on missing local labels.
authorK. Richard Pixley <rich@cygnus>
Wed, 28 Aug 1991 21:38:48 +0000 (21:38 +0000)
committerK. Richard Pixley <rich@cygnus>
Wed, 28 Aug 1991 21:38:48 +0000 (21:38 +0000)
gas/symbols.c

index 445160aa082436fc7625e3cd8128113d5d30fd8e..c20eaf51bbe923507e460360e4120098e7bdca7d 100644 (file)
@@ -5,7 +5,7 @@ This file is part of GAS, the GNU Assembler.
 
 GAS is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 1, or (at your option)
+the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
 GAS is distributed in the hope that it will be useful,
@@ -133,6 +133,32 @@ local_label_name(n, augend)
   return(symbol_name_build);
 } /* local_label_name() */
 
+/*
+ * decode name that may have been generated by local_label_name() above.  If
+ * the name wasn't generated by local_label_name(), then return it unaltered.
+ * This is used for error messages.
+ */
+
+char *decode_local_label_name(s)
+char *s;
+{
+       char *symbol_decode;
+       int label_number;
+       int label_version;
+       char *message_format = "\"%d\" (instance number %s of a local label)";
+
+       if (s[0] != 'L'
+           || s[2] != 1) {
+               return(s);
+       } /* not a local_label_name() generated name. */
+
+       label_number = s[1] - '0';
+
+       (void) sprintf(symbol_decode = obstack_alloc(&notes, strlen(s + 3) + strlen(message_format) + 10),
+               message_format, label_number, s + 3);
+
+       return(symbol_decode);
+} /* decode_local_label_name() */
 
 void local_colon (n)
 int n; /* just saw "n:" */
@@ -175,7 +201,10 @@ fragS *frag;                       /* Associated fragment */
        obstack_grow(&notes, name, name_length);
        preserved_copy_of_name = obstack_finish(&notes);
        symbolP = (symbolS *)obstack_alloc(&notes, sizeof(symbolS));
-       
+
+ /* symbol must be born in some fixed state.  This seems as good as any. */
+       memset(symbolP, 0, sizeof(symbolS));
+
 #if STRIP_UNDERSCORE
        S_SET_NAME(symbolP, (*preserved_copy_of_name == '_'
                                            ? preserved_copy_of_name + 1
@@ -186,10 +215,11 @@ fragS *frag;                      /* Associated fragment */
 
        S_SET_SEGMENT(symbolP, segment);
        S_SET_VALUE(symbolP, value);
-       symbol_clear_list_pointers(symbolP);
+/*     symbol_clear_list_pointers(symbolP); uneeded if symbol is born zeroed. */
 
        symbolP->sy_frag = frag;
-       symbolP->sy_forward = NULL; /* JF */
+       /* krm: uneeded if symbol is born zeroed.
+          symbolP->sy_forward = NULL; */ /* JF */
        symbolP->sy_number = ~0;
        symbolP->sy_name_offset = ~0;
 
@@ -309,7 +339,7 @@ void colon(sym_name)                /* just seen "x:" - rattle symbols & frags */
                           * This only used to be allowed on VMS gas, but Sun cc
                           * on the sparc also depends on it.
                           */
-                         char New_Type = SEGMENT_TO_SYMBOL_TYPE((int) now_seg);
+/*                       char New_Type = SEGMENT_TO_SYMBOL_TYPE((int) now_seg); */
                          
                          if (((!S_IS_DEBUG(symbolP) && !S_IS_DEFINED(symbolP) && S_IS_EXTERNAL(symbolP))
                               || (S_GET_SEGMENT(symbolP) == SEG_BSS))