1999-09-11 Donn Terry <donn@interix.com>
authorIan Lance Taylor <ian@airs.com>
Sun, 12 Sep 1999 02:55:58 +0000 (02:55 +0000)
committerIan Lance Taylor <ian@airs.com>
Sun, 12 Sep 1999 02:55:58 +0000 (02:55 +0000)
* config/obj-coff.c (obj_coff_endef): Don't merge labels, or
symbols which do not have a constant value, or tags with
non-tags.  Remove the symbol from the list before adding it at the
end.

gas/ChangeLog
gas/config/obj-coff.c

index a2515b3..a0b15a6 100644 (file)
@@ -5,6 +5,11 @@
 
 1999-09-11  Donn Terry  <donn@interix.com>
 
+       * config/obj-coff.c (obj_coff_endef): Don't merge labels, or
+       symbols which do not have a constant value, or tags with
+       non-tags.  Remove the symbol from the list before adding it at the
+       end.
+
        * config/obj-coff.c (obj_coff_endef) [BFD_ASSEMBLER]: Handle .ef
        C_FCN symbol differently if TE_PE.
        (obj_coff_line) [BFD_ASSEMBLER]: Always use the line number which
index 6be9133..4207ea0 100644 (file)
@@ -727,7 +727,10 @@ obj_coff_endef (ignore)
 
   /* Now that we have built a debug symbol, try to find if we should
      merge with an existing symbol or not.  If a symbol is C_EFCN or
-     SEG_ABSOLUTE or untagged SEG_DEBUG it never merges. */
+     absolute_section or untagged SEG_DEBUG it never merges.  We also
+     don't merge labels, which are in a different namespace, nor
+     symbols which have not yet been defined since they are typically
+     unique, nor do we merge tags with non-tags.  */
 
   /* Two cases for functions.  Either debug followed by definition or
      definition followed by debug.  For definition first, we will
@@ -742,16 +745,24 @@ obj_coff_endef (ignore)
      time. */
 
   if (S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_EFCN
+      || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_LABEL
       || (!strcmp (bfd_get_section_name (stdoutput,
                                         S_GET_SEGMENT (def_symbol_in_progress)),
                   "*DEBUG*")
          && !SF_GET_TAG (def_symbol_in_progress))
       || S_GET_SEGMENT (def_symbol_in_progress) == absolute_section
-      || (symbolP = symbol_find_base (S_GET_NAME (def_symbol_in_progress), DO_NOT_STRIP)) == NULL)
+      || ! symbol_constant_p (def_symbol_in_progress)
+      || (symbolP = symbol_find_base (S_GET_NAME (def_symbol_in_progress),
+                                      DO_NOT_STRIP)) == NULL
+      || SF_GET_TAG (def_symbol_in_progress) != SF_GET_TAG (symbolP))
     {
+      /* If it already is at the end of the symbol list, do nothing */
       if (def_symbol_in_progress != symbol_lastP)
-       symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP,
-                      &symbol_lastP);
+        {
+         symbol_remove (def_symbol_in_progress, &symbol_rootP, &symbol_lastP);
+         symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP,
+                        &symbol_lastP);
+        }
     }
   else
     {