aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog11
-rw-r--r--gas/config/obj-elf.c53
-rw-r--r--gas/config/obj-elf.h5
-rw-r--r--gas/config/tc-arm.c2
-rw-r--r--gas/testsuite/ChangeLog14
-rw-r--r--gas/testsuite/gas/elf/elf.exp1
-rw-r--r--gas/testsuite/gas/elf/group0a.d2
-rw-r--r--gas/testsuite/gas/elf/group0b.d2
-rw-r--r--gas/testsuite/gas/elf/group0c.d7
-rw-r--r--gas/testsuite/gas/elf/group1a.d2
-rw-r--r--gas/testsuite/gas/elf/group1b.d2
-rw-r--r--gas/testsuite/gas/elf/groupautoa.d2
-rw-r--r--gas/testsuite/gas/elf/groupautob.d2
-rw-r--r--gas/testsuite/gas/elf/section4.d2
-rw-r--r--gas/testsuite/gas/ia64/group-1.d12
15 files changed, 82 insertions, 37 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 817adc4..b3fb625 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,14 @@
+2010-10-23 Mark Mitchell <mark@codesourcery.com>
+
+ * config/obj-elf.c (elf_adjust_symtab): New. Move group section
+ processing here from elf_frob_file. Ensure that group signature
+ symbols have the name of the group.
+ (elf_frob_file): Move group section processing to
+ elf_adjust_symtab.
+ * config/obj-elf.h (elf_adjust_symtab): Declare.
+ (obj_adjust_symtab): Define.
+ * config/tc-arm.c (arm_adjust_symtab): Call elf_adjust_symtab.
+
2010-10-22 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
* config/tc-sparc.h [TE_SOLARIS] (ELF_TARGET_FORMAT): Define as
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index 43820f5..9f73616 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -2081,32 +2081,29 @@ static void free_section_idx (const char *key ATTRIBUTE_UNUSED, void *val)
}
void
-elf_frob_file (void)
+elf_adjust_symtab (void)
{
struct group_list list;
unsigned int i;
- bfd_map_over_sections (stdoutput, adjust_stab_sections, NULL);
-
/* Go find section groups. */
list.num_group = 0;
list.head = NULL;
list.elt_count = NULL;
- list.indexes = hash_new ();
+ list.indexes = hash_new ();
bfd_map_over_sections (stdoutput, build_group_lists, &list);
-
+
/* Make the SHT_GROUP sections that describe each section group. We
can't set up the section contents here yet, because elf section
indices have yet to be calculated. elf.c:set_group_contents does
the rest of the work. */
- for (i = 0; i < list.num_group; i++)
+ for (i = 0; i < list.num_group; i++)
{
const char *group_name = elf_group_name (list.head[i]);
const char *sec_name;
asection *s;
flagword flags;
struct symbol *sy;
- int has_sym;
bfd_size_type size;
flags = SEC_READONLY | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_GROUP;
@@ -2122,17 +2119,7 @@ elf_frob_file (void)
}
}
- sec_name = group_name;
- sy = symbol_find_exact (group_name);
- has_sym = 0;
- if (sy != NULL
- && (sy == symbol_lastP
- || (sy->sy_next != NULL
- && sy->sy_next->sy_previous == sy)))
- {
- has_sym = 1;
- sec_name = ".group";
- }
+ sec_name = ".group";
s = subseg_force_new (sec_name, 0);
if (s == NULL
|| !bfd_set_section_flags (stdoutput, s, flags)
@@ -2145,8 +2132,20 @@ elf_frob_file (void)
/* Pass a pointer to the first section in this group. */
elf_next_in_group (s) = list.head[i];
- if (has_sym)
- elf_group_id (s) = sy->bsym;
+ /* Make sure that the signature symbol for the group has the
+ name of the group. */
+ sy = symbol_find_exact (group_name);
+ if (!sy
+ || (sy != symbol_lastP
+ && (sy->sy_next == NULL
+ || sy->sy_next->sy_previous != sy)))
+ {
+ /* Create the symbol now. */
+ sy = symbol_new (group_name, now_seg, (valueT) 0, frag_now);
+ symbol_get_obj (sy)->local = 1;
+ symbol_table_insert (sy);
+ }
+ elf_group_id (s) = symbol_get_bfdsym (sy);
size = 4 * (list.elt_count[i] + 1);
bfd_set_section_size (stdoutput, s, size);
@@ -2155,15 +2154,21 @@ elf_frob_file (void)
frag_wane (frag_now);
}
-#ifdef elf_tc_final_processing
- elf_tc_final_processing ();
-#endif
-
/* Cleanup hash. */
hash_traverse (list.indexes, free_section_idx);
hash_die (list.indexes);
}
+void
+elf_frob_file (void)
+{
+ bfd_map_over_sections (stdoutput, adjust_stab_sections, NULL);
+
+#ifdef elf_tc_final_processing
+ elf_tc_final_processing ();
+#endif
+}
+
/* It removes any unneeded versioned symbols from the symbol table. */
void
diff --git a/gas/config/obj-elf.h b/gas/config/obj-elf.h
index c734aab..ccfa8d2 100644
--- a/gas/config/obj-elf.h
+++ b/gas/config/obj-elf.h
@@ -197,6 +197,11 @@ void elf_copy_symbol_attributes (symbolS *, symbolS *);
(elf_copy_symbol_attributes (DEST, SRC))
#endif
+void elf_adjust_symtab (void);
+#ifndef obj_adjust_symtab
+#define obj_adjust_symtab elf_adjust_symtab
+#endif
+
#ifndef SEPARATE_STAB_SECTIONS
/* Avoid ifndef each separate macro setting by wrapping the whole of the
stab group on the assumption that whoever sets SEPARATE_STAB_SECTIONS
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 69ff36a..8dd342b 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -21957,6 +21957,8 @@ arm_adjust_symtab (void)
/* Remove any overlapping mapping symbols generated by alignment frags. */
bfd_map_over_sections (stdoutput, check_mapping_symbols, (char *) 0);
+ /* Now do generic ELF adjustments. */
+ elf_adjust_symtab ();
#endif
}
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index f980f33..e2cf0c2 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,17 @@
+2010-10-23 Mark Mitchell <mark@codesourcery.com>
+
+ * gas/elf/elf.exp: Add group0c test.
+ * gas/elf/group0c.d: New.
+ * gas/elf/group0a.d: Expect ".group" for the name of group
+ sections.
+ * gas/elf/group0b.d: Likewise.
+ * gas/elf/group1a.d: Likewise.
+ * gas/elf/group1b.d: Likewise.
+ * gas/elf/groupautoa.d: Likewise.
+ * gas/elf/groupautob.d: Likewise.
+ * gas/elf/section4.d: Likewise.
+ * gas/ia64/group-1.d: Likewise. Adjust hard-coded constants.
+
2010-10-22 Nick Clifton <nickc@redhat.com>
* gas/all/fwdexp.d: Also look for f8ffffff.
diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp
index 4aa2b2e..5236913 100644
--- a/gas/testsuite/gas/elf/elf.exp
+++ b/gas/testsuite/gas/elf/elf.exp
@@ -104,6 +104,7 @@ if { ([istarget "*-*-*elf*"]
}
run_dump_test "group0a"
run_dump_test "group0b"
+ run_dump_test "group0c"
run_dump_test "group1a"
run_dump_test "group1b"
run_dump_test "groupautoa"
diff --git a/gas/testsuite/gas/elf/group0a.d b/gas/testsuite/gas/elf/group0a.d
index 8aedc0c..e6b9366 100644
--- a/gas/testsuite/gas/elf/group0a.d
+++ b/gas/testsuite/gas/elf/group0a.d
@@ -3,7 +3,7 @@
#source: group0.s
#...
-[ ]*\[.*\][ ]+\.foo_group[ ]+GROUP.*
+[ ]*\[.*\][ ]+\.group[ ]+GROUP.*
#...
[ ]*\[.*\][ ]+\.foo[ ]+PROGBITS.*[ ]+AXG[ ]+.*
[ ]*\[.*\][ ]+\.bar[ ]+PROGBITS.*[ ]+AG[ ]+.*
diff --git a/gas/testsuite/gas/elf/group0b.d b/gas/testsuite/gas/elf/group0b.d
index 803b8ec..fc74ea6 100644
--- a/gas/testsuite/gas/elf/group0b.d
+++ b/gas/testsuite/gas/elf/group0b.d
@@ -3,7 +3,7 @@
#source: group0.s
#...
-COMDAT group section \[ 1\] `.foo_group' \[.foo_group\] contains 2 sections:
+COMDAT group section \[ 1\] `\.group' \[.foo_group\] contains 2 sections:
[ ]+\[Index\][ ]+Name
[ ]+\[.*\][ ]+.foo
[ ]+\[.*\][ ]+.bar
diff --git a/gas/testsuite/gas/elf/group0c.d b/gas/testsuite/gas/elf/group0c.d
new file mode 100644
index 0000000..dd3ce90
--- /dev/null
+++ b/gas/testsuite/gas/elf/group0c.d
@@ -0,0 +1,7 @@
+#readelf: -sW
+#name: group section name
+#source: group0.s
+
+#...
+.*NOTYPE[ ]+LOCAL[ ]+DEFAULT[ ]+[0-9]+[ ]+\.foo_group
+#pass
diff --git a/gas/testsuite/gas/elf/group1a.d b/gas/testsuite/gas/elf/group1a.d
index a5b3298..27da751 100644
--- a/gas/testsuite/gas/elf/group1a.d
+++ b/gas/testsuite/gas/elf/group1a.d
@@ -3,7 +3,7 @@
#source: group1.s
#...
-[ ]*\[.*\][ ]+\.foo_group[ ]+GROUP.*
+[ ]*\[.*\][ ]+\.group[ ]+GROUP.*
#...
[ ]*\[.*\][ ]+\.text[ ]+PROGBITS.*[ ]+AX[ ]+.*
#...
diff --git a/gas/testsuite/gas/elf/group1b.d b/gas/testsuite/gas/elf/group1b.d
index 704752b..405e203 100644
--- a/gas/testsuite/gas/elf/group1b.d
+++ b/gas/testsuite/gas/elf/group1b.d
@@ -3,7 +3,7 @@
#source: group1.s
#...
-COMDAT group section \[ 1\] `.foo_group' \[.foo_group\] contains 1 sections:
+COMDAT group section \[ 1\] `\.group' \[.foo_group\] contains 1 sections:
[ ]+\[Index\][ ]+Name
[ ]+\[.*\][ ]+.text
#pass
diff --git a/gas/testsuite/gas/elf/groupautoa.d b/gas/testsuite/gas/elf/groupautoa.d
index a34c35c..57ef2b7 100644
--- a/gas/testsuite/gas/elf/groupautoa.d
+++ b/gas/testsuite/gas/elf/groupautoa.d
@@ -3,7 +3,7 @@
#source: groupauto.s
#...
-[ ]*\[.*\][ ]+some_group[ ]+GROUP.*
+[ ]*\[.*\][ ]+\.group[ ]+GROUP.*
#...
[ ]*\[.*\][ ]+\.text[ ]+PROGBITS.*[ ]+AX[ ]+.*
#...
diff --git a/gas/testsuite/gas/elf/groupautob.d b/gas/testsuite/gas/elf/groupautob.d
index 0ff1007..1bd2110 100644
--- a/gas/testsuite/gas/elf/groupautob.d
+++ b/gas/testsuite/gas/elf/groupautob.d
@@ -3,7 +3,7 @@
#source: groupauto.s
#...
-COMDAT group section \[ 1\] `some_group' \[some_group\] contains 2 sections:
+COMDAT group section \[ 1\] `\.group' \[some_group\] contains 2 sections:
[ ]+\[Index\][ ]+Name
[ ]+\[.*\][ ]+.text
[ ]+\[.*\][ ]+.note.bar
diff --git a/gas/testsuite/gas/elf/section4.d b/gas/testsuite/gas/elf/section4.d
index 5cda69b..f5bab79 100644
--- a/gas/testsuite/gas/elf/section4.d
+++ b/gas/testsuite/gas/elf/section4.d
@@ -2,7 +2,7 @@
#name: label arithmetic with multiple same-name sections
#...
-[ ]*\[.*\][ ]+foo[ ]+GROUP.*
+[ ]*\[.*\][ ]+\.group[ ]+GROUP.*
#...
[ ]*\[.*\][ ]+\.text[ ]+PROGBITS.*
#...
diff --git a/gas/testsuite/gas/ia64/group-1.d b/gas/testsuite/gas/ia64/group-1.d
index eef78d9..3c824a7 100644
--- a/gas/testsuite/gas/ia64/group-1.d
+++ b/gas/testsuite/gas/ia64/group-1.d
@@ -8,7 +8,7 @@ Section Headers:
Size EntSize Flags Link Info Align
\[ 0\] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
- \[ 1\] \._foo GROUP 0000000000000000 00000040
+ \[ 1\] \.group GROUP 0000000000000000 00000040
0000000000000008 0000000000000004 7 6 4
\[ 2\] \.text PROGBITS 0000000000000000 00000050
0000000000000000 0000000000000000 AX 0 0 16
@@ -19,14 +19,14 @@ Section Headers:
\[ 5\] \.text PROGBITS 0000000000000000 00000050
0000000000000010 0000000000000000 AXG 0 0 16
\[ 6\] \.shstrtab STRTAB 0000000000000000 00000060
- 0000000000000032 0000000000000000 0 0 1
+ 0000000000000033 0000000000000000 0 0 1
\[ 7\] \.symtab SYMTAB 0000000000000000 000002d8
- 00000000000000a8 0000000000000018 8 7 8
- \[ 8\] \.strtab STRTAB 0000000000000000 00000380
- 0000000000000006 0000000000000000 0 0 1
+ 00000000000000c0 0000000000000018 8 8 8
+ \[ 8\] \.strtab STRTAB 0000000000000000 00000398
+ 000000000000000c 0000000000000000 0 0 1
Key to Flags:
#...
-COMDAT group section \[ 1\] `\._foo' \[\._foo\] contains 1 sections:
+COMDAT group section \[ 1\] `\.group' \[\._foo\] contains 1 sections:
\[Index\] Name
\[ 5\] \.text