aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gas/ChangeLog15
-rw-r--r--gas/config/obj-elf.c24
-rw-r--r--gas/doc/as.texi12
-rw-r--r--gas/testsuite/gas/elf/attach-1.d11
-rw-r--r--gas/testsuite/gas/elf/attach-1.s11
-rw-r--r--gas/testsuite/gas/elf/attach-2.d11
-rw-r--r--gas/testsuite/gas/elf/attach-2.s9
-rw-r--r--gas/testsuite/gas/elf/attach-err.d3
-rw-r--r--gas/testsuite/gas/elf/attach-err.err4
-rw-r--r--gas/testsuite/gas/elf/attach-err.s5
-rw-r--r--gas/testsuite/gas/elf/elf.exp4
11 files changed, 108 insertions, 1 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index f12a18a..6662b1c 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,18 @@
+2020-10-01 Nick Clifton <nickc@redhat.com>
+
+ * config/obj-elf (elf_pseudo_table): Add attach_to_group.
+ (obj_elf_attach_to_group): New function.
+ * doc/as.texi: Document the new directive.
+ * NEWS: Mention the new feature.
+ * testsuite/gas/elf/attach-1.s: New test.
+ * testsuite/gas/elf/attach-1.d: New test driver.
+ * testsuite/gas/elf/attach-2.s: New test.
+ * testsuite/gas/elf/attach-2.d: New test driver.
+ * testsuite/gas/elf/attach-err.s: New test.
+ * testsuite/gas/elf/attach-err.d: New test driver.
+ * testsuite/gas/elf/attach-err.err: New test error output.
+ * testsuite/gas/elf/elf.exp: Run the new tests.
+
2020-09-16 H.J. Lu <hongjiu.lu@intel.com>
PR gas/26685
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index cd457ab..45de821 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -78,9 +78,11 @@ static void obj_elf_gnu_attribute (int);
static void obj_elf_tls_common (int);
static void obj_elf_lcomm (int);
static void obj_elf_struct (int);
+static void obj_elf_attach_to_group (int);
static const pseudo_typeS elf_pseudo_table[] =
{
+ {"attach_to_group", obj_elf_attach_to_group, 0},
{"comm", obj_elf_common, 0},
{"common", obj_elf_common, 1},
{"ident", obj_elf_ident, 0},
@@ -1040,6 +1042,28 @@ obj_elf_section_name (void)
return name;
}
+static void
+obj_elf_attach_to_group (int dummy ATTRIBUTE_UNUSED)
+{
+ const char * gname = obj_elf_section_name ();
+
+ if (gname == NULL)
+ {
+ as_warn (_("group name not parseable"));
+ return;
+ }
+
+ if (elf_group_name (now_seg))
+ {
+ as_warn (_("section %s already has a group (%s)"),
+ bfd_section_name (now_seg), elf_group_name (now_seg));
+ return;
+ }
+
+ elf_group_name (now_seg) = xstrdup (gname);
+ elf_section_flags (now_seg) |= SHF_GROUP;
+}
+
void
obj_elf_section (int push)
{
diff --git a/gas/doc/as.texi b/gas/doc/as.texi
index b88c1f9..c0baa94 100644
--- a/gas/doc/as.texi
+++ b/gas/doc/as.texi
@@ -4362,6 +4362,7 @@ Some machine configurations provide additional directives.
* Altmacro:: @code{.altmacro}
* Ascii:: @code{.ascii "@var{string}"}@dots{}
* Asciz:: @code{.asciz "@var{string}"}@dots{}
+* Attach_to_group:: @code{.attach_to_group @var{name}}
* Balign:: @code{.balign [@var{abs-expr}[, @var{abs-expr}]]}
* Bundle directives:: @code{.bundle_align_mode @var{abs-expr}}, etc
* Byte:: @code{.byte @var{expressions}}
@@ -4663,6 +4664,13 @@ trailing zero byte) into consecutive addresses.
@code{.asciz} is just like @code{.ascii}, but each string is followed by
a zero byte. The ``z'' in @samp{.asciz} stands for ``zero''.
+@node Attach_to_group
+@section @code{.attach_to_group @var{name}}
+Attaches the current section to the named group. This is like declaring
+the section with the @code{G} attribute, but can be done after the section
+has been created. Note if the group section does not exist at the point that
+this directive is used then it will be created.
+
@node Balign
@section @code{.balign[wl] [@var{abs-expr}[, @var{abs-expr}[, @var{abs-expr}]]]}
@@ -6663,7 +6671,9 @@ a few exceptions to this rule however. Processor and application specific
flags can be added to an already defined section. The @code{.interp},
@code{.strtab} and @code{.symtab} sections can have the allocate flag
(@code{a}) set after they are initially defined, and the @code{.note-GNU-stack}
-section may have the executable (@code{x}) flag added.
+section may have the executable (@code{x}) flag added. Also note that the
+@code{.attach_to_group} directive can be used to add a section to a group even
+if the section was not originally declared to be part of that group.
The optional @var{type} argument may contain one of the following constants:
diff --git a/gas/testsuite/gas/elf/attach-1.d b/gas/testsuite/gas/elf/attach-1.d
new file mode 100644
index 0000000..053783e
--- /dev/null
+++ b/gas/testsuite/gas/elf/attach-1.d
@@ -0,0 +1,11 @@
+#readelf: --section-groups
+#name: Attaching a section to a group
+#source: attach-1.s
+
+#...
+group section \[ 1\] `\.group' \[foo\.group\] contains . sections:
+ \[Index\] Name
+ \[ .\] .*
+ \[ .\] foo
+#pass
+
diff --git a/gas/testsuite/gas/elf/attach-1.s b/gas/testsuite/gas/elf/attach-1.s
new file mode 100644
index 0000000..aa69fff
--- /dev/null
+++ b/gas/testsuite/gas/elf/attach-1.s
@@ -0,0 +1,11 @@
+ .text
+ .nop
+
+ .section foo, "G", %progbits , foo.group
+ .word 0
+
+ .text
+ /* This is the intended use of the .attach_to_group directive.
+ It attaches a previously defined section (.text) to a
+ previously defined group (foo.group). */
+ .attach_to_group foo.group
diff --git a/gas/testsuite/gas/elf/attach-2.d b/gas/testsuite/gas/elf/attach-2.d
new file mode 100644
index 0000000..4aa5211
--- /dev/null
+++ b/gas/testsuite/gas/elf/attach-2.d
@@ -0,0 +1,11 @@
+#readelf: --section-groups
+#name: Attaching a section to a non-existant group
+#source: attach-2.s
+
+#...
+group section \[ 1\] `\.group' \[foo\.group\] contains 2 sections:
+ \[Index\] Name
+ \[ .\] bar
+ \[ .\] foo
+#pass
+
diff --git a/gas/testsuite/gas/elf/attach-2.s b/gas/testsuite/gas/elf/attach-2.s
new file mode 100644
index 0000000..4a5663f
--- /dev/null
+++ b/gas/testsuite/gas/elf/attach-2.s
@@ -0,0 +1,9 @@
+ .section bar
+ .nop
+ .attach_to_group foo.group
+
+ .section foo, "G", %note , foo.group
+ .word 0
+
+ .section bar
+ .nop
diff --git a/gas/testsuite/gas/elf/attach-err.d b/gas/testsuite/gas/elf/attach-err.d
new file mode 100644
index 0000000..3028d72
--- /dev/null
+++ b/gas/testsuite/gas/elf/attach-err.d
@@ -0,0 +1,3 @@
+#name: Errors generated by .attach_to_group
+#source: attach-err.s
+#error_output: attach-err.err
diff --git a/gas/testsuite/gas/elf/attach-err.err b/gas/testsuite/gas/elf/attach-err.err
new file mode 100644
index 0000000..7385467
--- /dev/null
+++ b/gas/testsuite/gas/elf/attach-err.err
@@ -0,0 +1,4 @@
+.*: Assembler messages:
+.*:4: Warning: section .* already has a group \(does\.not\.exist\)
+.*:5: Error: missing name
+.*:5: Warning: group name not parseable
diff --git a/gas/testsuite/gas/elf/attach-err.s b/gas/testsuite/gas/elf/attach-err.s
new file mode 100644
index 0000000..40597e9
--- /dev/null
+++ b/gas/testsuite/gas/elf/attach-err.s
@@ -0,0 +1,5 @@
+
+ /* Test the error messages that should be generated. */
+ .attach_to_group does.not.exist /* This is OK, the group does not have to exist. */
+ .attach_to_group foo.group /* Already attached. */
+ .attach_to_group /* Missing group name. */
diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp
index 135ade2..5ce9691 100644
--- a/gas/testsuite/gas/elf/elf.exp
+++ b/gas/testsuite/gas/elf/elf.exp
@@ -139,6 +139,10 @@ if { [is_elf_format] } then {
run_dump_test "group1b"
run_dump_test "group2"
run_dump_test "group3"
+
+ run_dump_test "attach-1"
+ run_dump_test "attach-err"
+
switch -glob $target_triplet {
hppa64*-*-hpux* { }
riscv*-*-* { }