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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,3 @@
#name: Errors generated by .attach_to_group
#source: attach-err.s
#error_output: attach-err.err

View File

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

View File

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

View File

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