Add new directive to GAS: .attach_to_group.

* 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.
This commit is contained in:
Nick Clifton
2020-10-01 16:34:05 +01:00
parent 1f22ee1f72
commit 642f545a93
11 changed files with 108 additions and 1 deletions

@ -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

@ -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)
{

@ -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:

@ -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

@ -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

@ -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

@ -0,0 +1,9 @@
.section bar
.nop
.attach_to_group foo.group
.section foo, "G", %note , foo.group
.word 0
.section bar
.nop

@ -0,0 +1,3 @@
#name: Errors generated by .attach_to_group
#source: attach-err.s
#error_output: 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

@ -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. */

@ -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*-*-* { }