PR fix for debug symbols referring to other symbols, then same name defined
authorKen Raeburn <raeburn@cygnus>
Wed, 5 May 1993 20:32:12 +0000 (20:32 +0000)
committerKen Raeburn <raeburn@cygnus>
Wed, 5 May 1993 20:32:12 +0000 (20:32 +0000)
as common.
(crawl_symbols): Don't clear sy_forward field.
(yank_symbols): Merge symbols only if sy_forward is null.

gas/config/obj-coffbfd.c

index d643442..36e9fdc 100644 (file)
@@ -497,7 +497,6 @@ DEFUN (fill_section, (abfd, h, file_cursor),
            }
          know (s->s_paddr == paddr);
 
-         s->s_flags = STYP_REG;
          if (strcmp (s->s_name, ".text") == 0)
            s->s_flags |= STYP_TEXT;
          else if (strcmp (s->s_name, ".data") == 0)
@@ -669,8 +668,6 @@ DEFUN (symbol_to_chars, (abfd, where, symbolP),
 }
 
 
-
-
 void
 obj_symbol_new_hook (symbolP)
      symbolS *symbolP;
@@ -961,29 +958,24 @@ DEFUN_VOID (obj_coff_endef)
       break;
     }                          /* switch on storage class */
 
-  /* 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.  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 merge the debug
-       symbol into the definition.  For debug first, the
-       lineno entry MUST point to the definition
-       function or else it will point off into space
-       when crawl_symbols() merges the debug
-       symbol into the real symbol.  Therefor, let's
-       presume the debug symbol is a real function
-       reference. */
-
-  /* FIXME-SOON If for some reason the definition
-       label/symbol is never seen, this will probably
-       leave an undefined symbol at link time. */
+  /* 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.  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
+     merge the debug symbol into the definition.  For debug first, the
+     lineno entry MUST point to the definition function or else it
+     will point off into space when crawl_symbols() merges the debug
+     symbol into the real symbol.  Therefor, let's presume the debug
+     symbol is a real function reference. */
+
+  /* FIXME-SOON If for some reason the definition label/symbol is
+     never seen, this will probably leave an undefined symbol at link
+     time. */
 
   if (S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_EFCN
       || S_GET_STORAGE_CLASS (def_symbol_in_progress) == C_LABEL
@@ -994,22 +986,19 @@ DEFUN_VOID (obj_coff_endef)
       || (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)))
     {
-
-      symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP, &symbol_lastP);
-
+      symbol_append (def_symbol_in_progress, symbol_lastP, &symbol_rootP,
+                    &symbol_lastP);
     }
   else
     {
-      /* This symbol already exists, merge the
-                  newly created symbol into the old one.
-                  This is not mandatory. The linker can
-                  handle duplicate symbols correctly. But I
-                  guess that it save a *lot* of space if
-                  the assembly file defines a lot of
-                  symbols. [loic] */
+      /* This symbol already exists, merge the newly created symbol
+        into the This is not mandatory. The linker can handle
+        duplicate symbols correctly. But I guess that it save a *lot*
+        of space if the assembly file defines a lot of
+        symbols. [loic] */
 
-      /* The debug entry (def_symbol_in_progress)
-                  is merged into the previous definition. */
+      /* The debug entry (def_symbol_in_progress) is merged into the
+        previous definition.  */
 
       c_symbol_merge (def_symbol_in_progress, symbolP);
       /* FIXME-SOON Should *def_symbol_in_progress be free'd? xoxorich. */
@@ -1018,13 +1007,16 @@ DEFUN_VOID (obj_coff_endef)
       if (SF_GET_FUNCTION (def_symbol_in_progress)
          || SF_GET_TAG (def_symbol_in_progress))
        {
-         /* For functions, and tags, the symbol *must* be where the debug symbol
-                          appears.  Move the existing symbol to the current place. */
+         /* For functions, and tags, the symbol *must* be where the
+            debug symbol appears.  Move the existing symbol to the
+            current place. */
          /* If it already is at the end of the symbol list, do nothing */
          if (def_symbol_in_progress != symbol_lastP)
            {
-             symbol_remove (def_symbol_in_progress, &symbol_rootP, &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);
            }                   /* if not already in place */
        }                       /* if function */
     }                          /* normal or mergable */
@@ -1033,7 +1025,7 @@ DEFUN_VOID (obj_coff_endef)
       && symbol_find_base (S_GET_NAME (def_symbol_in_progress), DO_NOT_STRIP) == NULL)
     {
       tag_insert (S_GET_NAME (def_symbol_in_progress), def_symbol_in_progress);
-    }                          /* If symbol is a {structure,union} tag, associate symbol to its name. */
+    }
 
   if (SF_GET_FUNCTION (def_symbol_in_progress))
     {
@@ -1041,14 +1033,12 @@ DEFUN_VOID (obj_coff_endef)
       function_lineoff
        = c_line_new (def_symbol_in_progress, 0, 0, &zero_address_frag);
 
-
-
       SF_SET_PROCESS (def_symbol_in_progress);
 
       if (symbolP == NULL)
        {
-         /* That is, if this is the first
-                      time we've seen the function... */
+         /* That is, if this is the first time we've seen the
+            function... */
          symbol_table_insert (def_symbol_in_progress);
        }                       /* definition follows debug */
     }                          /* Create the line number entry pointing to the function being defined */
@@ -1056,7 +1046,7 @@ DEFUN_VOID (obj_coff_endef)
   def_symbol_in_progress = NULL;
   demand_empty_rest_of_line ();
   return;
-}                              /* obj_coff_endef() */
+}
 
 static void
 DEFUN_VOID (obj_coff_dim)
@@ -1371,6 +1361,7 @@ DEFUN_VOID (yank_symbols)
          /* L* and C_EFCN symbols never merge. */
          if (!SF_GET_LOCAL (symbolP)
              && S_GET_STORAGE_CLASS (symbolP) != C_LABEL
+             && symbolP->sy_forward == NULL
              && (real_symbolP = symbol_find_base (S_GET_NAME (symbolP), DO_NOT_STRIP))
              && real_symbolP != symbolP)
            {
@@ -1614,26 +1605,15 @@ DEFUN (crawl_symbols, (h, abfd),
 
   block_stack = stack_init (512, sizeof (symbolS *));
   /* JF deal with forward references first... */
-  for (symbolP = symbol_rootP;
-       symbolP;
-       symbolP = symbol_next (symbolP))
-    {
-
-      if (symbolP->sy_forward)
-       {
-         S_SET_VALUE (symbolP, (S_GET_VALUE (symbolP)
-                                + S_GET_VALUE (symbolP->sy_forward)
+  for (symbolP = symbol_rootP; symbolP; symbolP = symbol_next (symbolP))
+    if (symbolP->sy_forward)
+      {
+       S_SET_VALUE (symbolP, (S_GET_VALUE (symbolP)
+                              + S_GET_VALUE (symbolP->sy_forward)
                               + symbolP->sy_forward->sy_frag->fr_address));
-
-         if (SF_GET_GET_SEGMENT (symbolP))
-           {
-             S_SET_SEGMENT (symbolP, S_GET_SEGMENT (symbolP->sy_forward));
-           }                   /* forward segment also */
-
-         symbolP->sy_forward = 0;
-       }                       /* if it has a forward reference */
-    }                          /* walk the symbol chain */
-
+       if (SF_GET_GET_SEGMENT (symbolP))
+         S_SET_SEGMENT (symbolP, S_GET_SEGMENT (symbolP->sy_forward));
+      }
 
   /* The symbol list should be ordered according to the following sequence
    * order :
@@ -1958,11 +1938,11 @@ DEFUN (change_to_section, (name, len, exp),
        {
          subseg_new (i, exp);
          return;
-
        }
     }
   /* No section, add one */
   strncpy (segment_info[i].scnhdr.s_name, name, 8);
+  segment_info[i].scnhdr.s_flags = STYP_REG;
   subseg_new (i, exp);
 }