bfd/
authorAlan Modra <amodra@gmail.com>
Thu, 24 Nov 2005 06:02:08 +0000 (06:02 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 24 Nov 2005 06:02:08 +0000 (06:02 +0000)
* elf-bfd.h (_bfd_generic_match_sections_by_type): Don't define.
* libbfd-in.h (_bfd_generic_match_sections_by_type): Delete.
* libbfd.c (_bfd_generic_match_sections_by_type): Delete.
* targets.c (bfd_match_sections_by_type): Don't define.
(BFD_JUMP_TABLE_LINK): Remove _bfd_generic_match_sections_by_type.
* coff-rs6000.c (rs6000coff_vec, pmac_xcoff_vec): Likewise.
* coff64-rs6000.c (rs6000coff64_vec, aix5coff64_vec): Likewise.
* bfd-in2.h: Regenerate.
* libbfd.h: Regenerate.
ld/
* ldlang.c (lang_output_section_find_by_flags): Add match_type param.
Run two passes, first using match_type, second without.
* ldlang.h (lang_match_sec_type_func): New typedef.
(lang_output_section_find_by_flags): Update prototype.
bfd_match_sections_by_type and lang_output_section_find_by_flags.
* emultempl/pe.em (place_orphan): Likewise.

14 files changed:
bfd/ChangeLog
bfd/bfd-in2.h
bfd/coff-rs6000.c
bfd/coff64-rs6000.c
bfd/elf-bfd.h
bfd/libbfd-in.h
bfd/libbfd.c
bfd/libbfd.h
bfd/targets.c
ld/ChangeLog
ld/emultempl/elf32.em
ld/emultempl/pe.em
ld/ldlang.c
ld/ldlang.h

index 6b78c6bc0026d07fd391c9fc83d37cc44e65072f..dcd3be60bfec6ed9c650ac19bfc8133ce2a2619c 100644 (file)
@@ -1,3 +1,15 @@
+2005-11-24  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf-bfd.h (_bfd_generic_match_sections_by_type): Don't define.
+       * libbfd-in.h (_bfd_generic_match_sections_by_type): Delete.
+       * libbfd.c (_bfd_generic_match_sections_by_type): Delete.
+       * targets.c (bfd_match_sections_by_type): Don't define.
+       (BFD_JUMP_TABLE_LINK): Remove _bfd_generic_match_sections_by_type.
+       * coff-rs6000.c (rs6000coff_vec, pmac_xcoff_vec): Likewise.
+       * coff64-rs6000.c (rs6000coff64_vec, aix5coff64_vec): Likewise.
+       * bfd-in2.h: Regenerate.
+       * libbfd.h: Regenerate.
+
 2005-11-23  Daniel Jacobowitz  <dan@codesourcery.com>
            Thiemo Seufer <ths@networkno.de>
 
index d8570866fca717a0d4fd9575ef78150c51be70e5..81fb66627dfd9240e3f21a9315bfa4a850a6c03e 100644 (file)
@@ -4945,7 +4945,6 @@ typedef struct bfd_target
   NAME##_bfd_link_split_section, \
   NAME##_bfd_gc_sections, \
   NAME##_bfd_merge_sections, \
-  _bfd_generic_match_sections_by_type, \
   NAME##_bfd_is_group_section, \
   NAME##_bfd_discard_group, \
   NAME##_section_already_linked \
@@ -4985,12 +4984,6 @@ typedef struct bfd_target
   /* Attempt to merge SEC_MERGE sections.  */
   bfd_boolean (*_bfd_merge_sections) (bfd *, struct bfd_link_info *);
 
-#define bfd_match_sections_by_type(abfd, asec, bbfd, bsec) \
-  BFD_SEND (abfd, _bfd_match_sections_by_type, (abfd, asec, bbfd, bsec))
-  /* Return TRUE if 2 section types are compatible.  */
-  bfd_boolean (*_bfd_match_sections_by_type)
-    (bfd *, const asection *, bfd *, const asection *);
-
   /* Is this section a member of a group?  */
   bfd_boolean (*_bfd_is_group_section) (bfd *, const struct bfd_section *);
 
index 8e54c6a135a36a81c0cd7f9128c9c356d7f1fbc4..220edf8809c6cae3a253c1fd57c09a3bdbb93f20 100644 (file)
@@ -4196,7 +4196,6 @@ const bfd_target rs6000coff_vec =
     _bfd_generic_link_split_section,
     bfd_generic_gc_sections,
     bfd_generic_merge_sections,
-    _bfd_generic_match_sections_by_type,
     bfd_generic_is_group_section,
     bfd_generic_discard_group,
     _bfd_generic_section_already_linked,
@@ -4447,7 +4446,6 @@ const bfd_target pmac_xcoff_vec =
     _bfd_generic_link_split_section,
     bfd_generic_gc_sections,
     bfd_generic_merge_sections,
-    _bfd_generic_match_sections_by_type,
     bfd_generic_is_group_section,
     bfd_generic_discard_group,
     _bfd_generic_section_already_linked,
index 77a6eecbc205528f07e8ec95fbab0a2e0c7b94e6..e0aa87ef6775387bda7512e1afce03e246130ea0 100644 (file)
@@ -2743,7 +2743,6 @@ const bfd_target rs6000coff64_vec =
     _bfd_generic_link_split_section,
     bfd_generic_gc_sections,
     bfd_generic_merge_sections,
-    _bfd_generic_match_sections_by_type,
     bfd_generic_is_group_section,
     bfd_generic_discard_group,
     _bfd_generic_section_already_linked,
@@ -2995,7 +2994,6 @@ const bfd_target aix5coff64_vec =
     _bfd_generic_link_split_section,
     bfd_generic_gc_sections,
     bfd_generic_merge_sections,
-    _bfd_generic_match_sections_by_type,
     bfd_generic_is_group_section,
     bfd_generic_discard_group,
     _bfd_generic_section_already_linked,
index be1c65fb54d4d6872d6ab916b91c115fd3fec178..f957283e1da59d77b86ccbf009f72730fb1a767b 100644 (file)
@@ -1476,8 +1476,6 @@ extern bfd_boolean _bfd_elf_merge_sections
   (bfd *, struct bfd_link_info *);
 extern bfd_boolean _bfd_elf_match_sections_by_type
   (bfd *, const asection *, bfd *, const asection *);
-#define _bfd_generic_match_sections_by_type \
-  _bfd_elf_match_sections_by_type
 extern bfd_boolean bfd_elf_is_group_section
   (bfd *, const struct bfd_section *);
 extern void _bfd_elf_section_already_linked
index f81452ffe3cb882fa2b6fec4594d4b4447c6f7d2..e3468c1a9950cf391a13f0b32bef59cda76177f7 100644 (file)
@@ -402,8 +402,6 @@ extern bfd_boolean _bfd_generic_set_section_contents
   ((bfd_boolean (*) (bfd *, struct bfd_section *)) bfd_false)
 #define _bfd_nolink_section_already_linked \
   ((void (*) (bfd *, struct bfd_section *)) bfd_void)
-extern bfd_boolean _bfd_generic_match_sections_by_type
-  (bfd *, const asection *, bfd *, const asection *);
 
 /* Routines to use for BFD_JUMP_TABLE_DYNAMIC for targets which do not
    have dynamic symbols or relocs.  Use BFD_JUMP_TABLE_DYNAMIC
index 34e32ac111257aa1dd8599b244edebd8e5104433..57cfabcd460e478ba524ffc5f964b056e34ea702 100644 (file)
@@ -1034,15 +1034,6 @@ _bfd_generic_find_line (bfd *abfd ATTRIBUTE_UNUSED,
   return FALSE;
 }
 
-bfd_boolean
-_bfd_generic_match_sections_by_type (bfd *abfd ATTRIBUTE_UNUSED,
-                                    const asection *asec ATTRIBUTE_UNUSED,
-                                    bfd *bbfd ATTRIBUTE_UNUSED,
-                                    const asection *bsec ATTRIBUTE_UNUSED)
-{
-  return TRUE;
-}
-
 bfd_boolean
 _bfd_generic_init_private_section_data (bfd *ibfd ATTRIBUTE_UNUSED,
                                        asection *isec ATTRIBUTE_UNUSED,
index e05252c949be41c37a3a7b5618b7cee7049d9d8b..8b01aaa92d39af1ee86579e30085989b25b5f12b 100644 (file)
@@ -407,8 +407,6 @@ extern bfd_boolean _bfd_generic_set_section_contents
   ((bfd_boolean (*) (bfd *, struct bfd_section *)) bfd_false)
 #define _bfd_nolink_section_already_linked \
   ((void (*) (bfd *, struct bfd_section *)) bfd_void)
-extern bfd_boolean _bfd_generic_match_sections_by_type
-  (bfd *, const asection *, bfd *, const asection *);
 
 /* Routines to use for BFD_JUMP_TABLE_DYNAMIC for targets which do not
    have dynamic symbols or relocs.  Use BFD_JUMP_TABLE_DYNAMIC
index 8f5795c24a46a31005be3acbd23dee4a32733eb2..c0372a1d02a4671cbacffb398ecdf8f87f439bdb 100644 (file)
@@ -434,7 +434,6 @@ BFD_JUMP_TABLE macros.
 .  NAME##_bfd_link_split_section, \
 .  NAME##_bfd_gc_sections, \
 .  NAME##_bfd_merge_sections, \
-.  _bfd_generic_match_sections_by_type, \
 .  NAME##_bfd_is_group_section, \
 .  NAME##_bfd_discard_group, \
 .  NAME##_section_already_linked \
@@ -474,12 +473,6 @@ BFD_JUMP_TABLE macros.
 .  {* Attempt to merge SEC_MERGE sections.  *}
 .  bfd_boolean (*_bfd_merge_sections) (bfd *, struct bfd_link_info *);
 .
-.#define bfd_match_sections_by_type(abfd, asec, bbfd, bsec) \
-.  BFD_SEND (abfd, _bfd_match_sections_by_type, (abfd, asec, bbfd, bsec))
-.  {* Return TRUE if 2 section types are compatible.  *}
-.  bfd_boolean (*_bfd_match_sections_by_type)
-.    (bfd *, const asection *, bfd *, const asection *);
-.
 .  {* Is this section a member of a group?  *}
 .  bfd_boolean (*_bfd_is_group_section) (bfd *, const struct bfd_section *);
 .
index 977af6f3350fa9c13f8f0543274c7b10c0b919e2..8fd73dbc086e6f2826ef33656945b6886922c7a1 100644 (file)
@@ -1,3 +1,12 @@
+2005-11-24  Alan Modra  <amodra@bigpond.net.au>
+
+       * ldlang.c (lang_output_section_find_by_flags): Add match_type param.
+       Run two passes, first using match_type, second without.
+       * ldlang.h (lang_match_sec_type_func): New typedef.
+       (lang_output_section_find_by_flags): Update prototype.
+       bfd_match_sections_by_type and lang_output_section_find_by_flags.
+       * emultempl/pe.em (place_orphan): Likewise.
+
 2005-11-24  Alan Modra  <amodra@bigpond.net.au>
 
        * ldlang.c (lang_insert_orphan): Skip first assignment to dot
index d7d2f0e20a579585e2d2b1c825fd1888d415739a..55e1663e324041bc1c10cc568f05cff35216165c 100644 (file)
@@ -1362,9 +1362,9 @@ gld${EMULATION_NAME}_place_orphan (asection *s)
       if (os != NULL
          && (os->bfd_section == NULL
              || os->bfd_section->flags == 0
-             || (bfd_match_sections_by_type (output_bfd,
-                                             os->bfd_section,
-                                             s->owner, s)
+             || (_bfd_elf_match_sections_by_type (output_bfd,
+                                                  os->bfd_section,
+                                                  s->owner, s)
                  && ((s->flags ^ os->bfd_section->flags)
                      & (SEC_LOAD | SEC_ALLOC)) == 0)))
        {
@@ -1443,7 +1443,8 @@ gld${EMULATION_NAME}_place_orphan (asection *s)
        }
       after = place->os;
       if (after == NULL)
-       after = lang_output_section_find_by_flags (s, &place->os);
+       after = lang_output_section_find_by_flags
+         (s, &place->os, _bfd_elf_match_sections_by_type);
       if (after == NULL)
        /* *ABS* is always the first output section statement.  */
        after = &lang_output_section_statement.head->output_section_statement;
index bcd7e32be32a15a8477f26daa9853c3b35c34952..5afa8da00fef8588a5286cdde1f8aa2ac958ffc7 100644 (file)
@@ -1621,7 +1621,7 @@ gld_${EMULATION_NAME}_place_orphan (asection *s)
            place->os = lang_output_section_find (place->name);
          after = place->os;
          if (after == NULL)
-           after = lang_output_section_find_by_flags (s, &place->os);
+           after = lang_output_section_find_by_flags (s, &place->os, NULL);
          if (after == NULL)
            /* *ABS* is always the first output section statement.  */
            after = (&lang_output_section_statement.head
index 119fb7aefcfec4bcc5202825a6637efd6ba8501b..0e72ab851e56d8a7c907d8bc13b7091bfcdcb957 100644 (file)
@@ -1147,7 +1147,8 @@ lang_output_section_statement_lookup (const char *const name)
 
 lang_output_section_statement_type *
 lang_output_section_find_by_flags (const asection *sec,
-                                  lang_output_section_statement_type **exact)
+                                  lang_output_section_statement_type **exact,
+                                  lang_match_sec_type_func match_type)
 {
   lang_output_section_statement_type *first, *look, *found;
   flagword flags;
@@ -1165,9 +1166,8 @@ lang_output_section_find_by_flags (const asection *sec,
       if (look->bfd_section != NULL)
        {
          flags = look->bfd_section->flags;
-         if (!bfd_match_sections_by_type (output_bfd,
-                                          look->bfd_section,
-                                          sec->owner, sec))
+         if (match_type && !match_type (output_bfd, look->bfd_section,
+                                        sec->owner, sec))
            continue;
        }
       flags ^= sec->flags;
@@ -1177,7 +1177,8 @@ lang_output_section_find_by_flags (const asection *sec,
     }
   if (found != NULL)
     {
-      *exact = found;
+      if (exact != NULL)
+       *exact = found;
       return found;
     }
 
@@ -1190,9 +1191,8 @@ lang_output_section_find_by_flags (const asection *sec,
          if (look->bfd_section != NULL)
            {
              flags = look->bfd_section->flags;
-             if (!bfd_match_sections_by_type (output_bfd,
-                                              look->bfd_section,
-                                              sec->owner, sec))
+             if (match_type && !match_type (output_bfd, look->bfd_section,
+                                            sec->owner, sec))
                continue;
            }
          flags ^= sec->flags;
@@ -1200,10 +1200,8 @@ lang_output_section_find_by_flags (const asection *sec,
                         | SEC_CODE | SEC_SMALL_DATA | SEC_THREAD_LOCAL)))
            found = look;
        }
-      return found;
     }
-
-  if (sec->flags & (SEC_READONLY | SEC_THREAD_LOCAL))
+  else if (sec->flags & (SEC_READONLY | SEC_THREAD_LOCAL))
     {
       /* .rodata can go after .text, .sdata2 after .rodata.  */
       for (look = first; look; look = look->next)
@@ -1212,9 +1210,8 @@ lang_output_section_find_by_flags (const asection *sec,
          if (look->bfd_section != NULL)
            {
              flags = look->bfd_section->flags;
-             if (!bfd_match_sections_by_type (output_bfd,
-                                              look->bfd_section,
-                                              sec->owner, sec))
+             if (match_type && !match_type (output_bfd, look->bfd_section,
+                                            sec->owner, sec))
                continue;
            }
          flags ^= sec->flags;
@@ -1223,10 +1220,8 @@ lang_output_section_find_by_flags (const asection *sec,
              && !(look->flags & (SEC_SMALL_DATA | SEC_THREAD_LOCAL)))
            found = look;
        }
-      return found;
     }
-
-  if (sec->flags & SEC_SMALL_DATA)
+  else if (sec->flags & SEC_SMALL_DATA)
     {
       /* .sdata goes after .data, .sbss after .sdata.  */
       for (look = first; look; look = look->next)
@@ -1235,9 +1230,8 @@ lang_output_section_find_by_flags (const asection *sec,
          if (look->bfd_section != NULL)
            {
              flags = look->bfd_section->flags;
-             if (!bfd_match_sections_by_type (output_bfd,
-                                              look->bfd_section,
-                                              sec->owner, sec))
+             if (match_type && !match_type (output_bfd, look->bfd_section,
+                                            sec->owner, sec))
                continue;
            }
          flags ^= sec->flags;
@@ -1247,10 +1241,8 @@ lang_output_section_find_by_flags (const asection *sec,
                  && !(sec->flags & SEC_HAS_CONTENTS)))
            found = look;
        }
-      return found;
     }
-
-  if (sec->flags & SEC_HAS_CONTENTS)
+  else if (sec->flags & SEC_HAS_CONTENTS)
     {
       /* .data goes after .rodata.  */
       for (look = first; look; look = look->next)
@@ -1259,9 +1251,8 @@ lang_output_section_find_by_flags (const asection *sec,
          if (look->bfd_section != NULL)
            {
              flags = look->bfd_section->flags;
-             if (!bfd_match_sections_by_type (output_bfd,
-                                              look->bfd_section,
-                                              sec->owner, sec))
+             if (match_type && !match_type (output_bfd, look->bfd_section,
+                                            sec->owner, sec))
                continue;
            }
          flags ^= sec->flags;
@@ -1269,27 +1260,30 @@ lang_output_section_find_by_flags (const asection *sec,
                         | SEC_SMALL_DATA | SEC_THREAD_LOCAL)))
            found = look;
        }
-      return found;
     }
-
-  /* .bss goes last.  */
-  for (look = first; look; look = look->next)
+  else
     {
-      flags = look->flags;
-      if (look->bfd_section != NULL)
+      /* .bss goes last.  */
+      for (look = first; look; look = look->next)
        {
-         flags = look->bfd_section->flags;
-         if (!bfd_match_sections_by_type (output_bfd,
-                                          look->bfd_section,
-                                          sec->owner, sec))
-           continue;
+         flags = look->flags;
+         if (look->bfd_section != NULL)
+           {
+             flags = look->bfd_section->flags;
+             if (match_type && !match_type (output_bfd, look->bfd_section,
+                                            sec->owner, sec))
+               continue;
+           }
+         flags ^= sec->flags;
+         if (!(flags & SEC_ALLOC))
+           found = look;
        }
-      flags ^= sec->flags;
-      if (!(flags & SEC_ALLOC))
-       found = look;
     }
 
-  return found;
+  if (found || !match_type)
+    return found;
+
+  return lang_output_section_find_by_flags (sec, NULL, NULL);
 }
 
 /* Find the last output section before given output statement.
index 1613541288a47281d0c9a5611c75d82f08795050..cf5b01ff3d08ae5cb068430d2951be80239507d2 100644 (file)
@@ -304,6 +304,9 @@ typedef void (*walk_wild_section_handler_t) (lang_wild_statement_type *,
                                             callback_t callback,
                                             void *data);
 
+typedef bfd_boolean (*lang_match_sec_type_func) (bfd *, const asection *,
+                                                bfd *, const asection *);
+
 struct lang_wild_statement_struct
 {
   lang_statement_header_type header;
@@ -521,7 +524,8 @@ extern void ldlang_add_file
 extern lang_output_section_statement_type *lang_output_section_find
   (const char * const);
 extern lang_output_section_statement_type *lang_output_section_find_by_flags
-  (const asection *, lang_output_section_statement_type **exact);
+  (const asection *, lang_output_section_statement_type **,
+   lang_match_sec_type_func);
 extern lang_output_section_statement_type *lang_insert_orphan
   (asection *, const char *, lang_output_section_statement_type *,
    struct orphan_save *, etree_type *, lang_statement_list_type *);