gas/
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 30 Apr 2004 16:47:46 +0000 (16:47 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 30 Apr 2004 16:47:46 +0000 (16:47 +0000)
2004-04-30  H.J. Lu  <hongjiu.lu@intel.com>

* config/obj-elf.c (get_section): New function.
(obj_elf_change_section): Support multiple sections with same
name.

gas/testsuite/

2004-04-30  H.J. Lu  <hongjiu.lu@intel.com>

* gas/elf/elf.exp: Remove group1, add group1a and group1b for
section group.

* gas/elf/group1a.d: New file.
* gas/elf/group1b.d: Likewise.

* gas/elf/group1.e: Removed.

gas/ChangeLog
gas/config/obj-elf.c
gas/testsuite/ChangeLog
gas/testsuite/gas/elf/elf.exp
gas/testsuite/gas/elf/group1.e [deleted file]
gas/testsuite/gas/elf/group1a.d [new file with mode: 0644]
gas/testsuite/gas/elf/group1b.d [new file with mode: 0644]

index 53570b9152fd05d89c3b8e910ec8e265356d4e5d..0d1b4ecc82c3d1afe8170937039279895393af31 100644 (file)
@@ -1,3 +1,9 @@
+2004-04-30  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * config/obj-elf.c (get_section): New function.
+       (obj_elf_change_section): Support multiple sections with same
+       name.
+
 2004-04-30  Nick Clifton  <nickc@redhat.com>
 
        * config/tc-arm.c (create_register_alias): Fix typo checking for
index e5f3ce3e013f65a0127f9c5e3f1d4b9abddac19a..3c7f011ed213893ff3905fe666ad08da7a4a2769 100644 (file)
@@ -469,6 +469,34 @@ struct section_stack
 
 static struct section_stack *section_stack;
 
+struct section_group
+{
+  const char *name;
+  const char *group_name;
+  asection *section;
+};
+
+static void
+get_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
+{
+  struct section_group *group = inf;
+  const char *group_name = elf_group_name (sec);
+  
+  /* Check if we have found the section we are looking for.  */
+  if (group->section)
+    return;
+
+  if ((sec->name == group->name
+       || (sec->name != NULL
+          && group->name != NULL
+          && strcmp (sec->name, group->name) == 0))
+      && (group_name == group->group_name
+         || (group_name != NULL
+             && group->group_name != NULL
+             && strcmp (group_name, group->group_name) == 0)))
+    group->section = sec;
+}
+
 /* Handle the .section pseudo-op.  This code supports two different
    syntaxes.
 
@@ -496,10 +524,10 @@ obj_elf_change_section (const char *name,
                        int linkonce,
                        int push)
 {
-  asection *old_sec;
   segT sec;
   flagword flags;
   const struct bfd_elf_special_section *ssect;
+  struct section_group group;
 
 #ifdef md_flush_pending_output
   md_flush_pending_output ();
@@ -520,8 +548,19 @@ obj_elf_change_section (const char *name,
   previous_section = now_seg;
   previous_subsection = now_subseg;
 
-  old_sec = bfd_get_section_by_name (stdoutput, name);
-  sec = subseg_new (name, 0);
+  group.name = name;
+  group.group_name = group_name;
+  group.section = NULL;
+  bfd_map_over_sections (stdoutput, get_section, &group);
+
+  if (group.section)
+    {
+      sec = group.section;
+      subseg_set (sec, 0);
+    }
+  else
+    sec = subseg_force_new (name, 0);
+
   ssect = _bfd_elf_get_sec_type_attr (stdoutput, name);
 
   if (ssect != NULL)
@@ -532,7 +571,7 @@ obj_elf_change_section (const char *name,
        type = ssect->type;
       else if (type != ssect->type)
        {
-         if (old_sec == NULL
+         if (group.section == NULL
              /* FIXME: gcc, as of 2002-10-22, will emit
 
                 .section .init_array,"aw",@progbits
@@ -556,7 +595,7 @@ obj_elf_change_section (const char *name,
            }
        }
 
-      if (old_sec == NULL && (attr & ~ssect->attr) != 0)
+      if (group.section == NULL && (attr & ~ssect->attr) != 0)
        {
          /* As a GNU extension, we permit a .note section to be
             allocatable.  If the linker sees an allocatable .note
@@ -582,12 +621,13 @@ obj_elf_change_section (const char *name,
            override = TRUE;
          else
            {
-             as_warn (_("setting incorrect section attributes for %s"),
-                      name);
+             if (group_name == NULL)
+               as_warn (_("setting incorrect section attributes for %s"),
+                        name);
              override = TRUE;
            }
        }
-      if (!override && old_sec == NULL)
+      if (!override && group.section == NULL)
        attr |= ssect->attr;
     }
 
@@ -609,7 +649,10 @@ obj_elf_change_section (const char *name,
   flags = md_elf_section_flags (flags, attr, type);
 #endif
 
-  if (old_sec == NULL)
+  if (linkonce)
+    flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
+
+  if (group.section == NULL)
     {
       symbolS *secsym;
 
@@ -617,8 +660,6 @@ obj_elf_change_section (const char *name,
       if (type == SHT_NOBITS)
        seg_info (sec)->bss = 1;
 
-      if (linkonce)
-       flags |= SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
       bfd_set_section_flags (stdoutput, sec, flags);
       if (flags & SEC_MERGE)
        sec->entsize = entsize;
@@ -636,18 +677,15 @@ obj_elf_change_section (const char *name,
       /* If section attributes are specified the second time we see a
         particular section, then check that they are the same as we
         saw the first time.  */
-      if (((old_sec->flags ^ flags)
+      if (((group.section->flags ^ flags)
           & (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_CODE
              | SEC_EXCLUDE | SEC_SORT_ENTRIES | SEC_MERGE | SEC_STRINGS
              | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD
              | SEC_THREAD_LOCAL)))
        as_warn (_("ignoring changed section attributes for %s"), name);
-      if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned) entsize)
+      if ((flags & SEC_MERGE)
+         && group.section->entsize != (unsigned) entsize)
        as_warn (_("ignoring changed section entity size for %s"), name);
-      if ((attr & SHF_GROUP) != 0
-         && (elf_group_name (old_sec) == NULL
-             || strcmp (elf_group_name (old_sec), group_name) != 0))
-       as_warn (_("ignoring new section group for %s"), name);
     }
 
 #ifdef md_elf_section_change_hook
index 70b65bc4b45072faf9bf27c5a38cf179255c3112..c7286720db00fa7026a561cf3bb6beea77b29a65 100644 (file)
@@ -1,3 +1,13 @@
+2004-04-30  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * gas/elf/elf.exp: Remove group1, add group1a and group1b for
+       section group.
+
+       * gas/elf/group1a.d: New file.
+       * gas/elf/group1b.d: Likewise.
+
+       * gas/elf/group1.e: Removed.
+
 2004-04-30  Nick Clifton  <nickc@redhat.com>
 
        * gas/arm/reg-alias.s: New file: Test case sensitive register
index e087fba0b4c5b0ea5ba3503634337833e3bdb650..4680dcebdb453e517615cac7a683eff890b3d9b7 100644 (file)
@@ -50,7 +50,8 @@ if { ([istarget "*-*-elf*"]
     run_dump_test "ehopt0"
     run_dump_test "group0a" 
     run_dump_test "group0b" 
-    run_list_test "group1" "" "" ""
+    run_dump_test "group1a" 
+    run_dump_test "group1b" 
     run_dump_test "section0" 
     run_dump_test "section1" 
     run_list_test "section2" "$target_machine" "-al" ""
diff --git a/gas/testsuite/gas/elf/group1.e b/gas/testsuite/gas/elf/group1.e
deleted file mode 100644 (file)
index d4c4003..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-
-Symbol table '.symtab' contains 4 entries:
-   Num:    Value[      ]* Size Type    Bind   Vis      Ndx Name
-     0: 0+0     0 NOTYPE  LOCAL  DEFAULT  UND 
-     1: 0+0     0 SECTION LOCAL  DEFAULT    1 
-     2: 0+0     0 SECTION LOCAL  DEFAULT    2 
-     3: 0+0     0 SECTION LOCAL  DEFAULT    3 
diff --git a/gas/testsuite/gas/elf/group1a.d b/gas/testsuite/gas/elf/group1a.d
new file mode 100644 (file)
index 0000000..2db4033
--- /dev/null
@@ -0,0 +1,10 @@
+#readelf: -SW
+#name: group section with multiple sections of same name
+#source: group1.s
+
+#...
+[      ]*\[.*\][       ]+\.text[       ]+PROGBITS.*[   ]+AX[   ]+.*
+#...
+[      ]*\[.*\][       ]+\.text[       ]+PROGBITS.*[   ]+AXG[  ]+.*
+[      ]*\[.*\][       ]+\.foo_group[  ]+GROUP.*
+#pass
diff --git a/gas/testsuite/gas/elf/group1b.d b/gas/testsuite/gas/elf/group1b.d
new file mode 100644 (file)
index 0000000..c7e84e8
--- /dev/null
@@ -0,0 +1,9 @@
+#readelf: -g
+#name: group section with multiple sections of same name
+#source: group1.s
+
+#...
+COMDAT group section `.foo_group' \[.foo_group\] contains 1 sections:
+[      ]+\[Index\][    ]+Name
+[      ]+\[.*\][       ]+.text
+#pass