From: Nick Clifton Date: Thu, 1 Oct 2020 15:34:05 +0000 (+0100) Subject: Add new directive to GAS: .attach_to_group. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=642f545a93326f570ef4718e9a26c29285943f27;p=binutils-gdb.git 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. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index f12a18a72d1..6662b1c6ade 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,18 @@ +2020-10-01 Nick Clifton + + * 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 PR gas/26685 diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index cd457abe5eb..45de821495e 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 b88c1f99979..c0baa945360 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 00000000000..053783ea1a0 --- /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 00000000000..aa69fffdaa0 --- /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 00000000000..4aa52116357 --- /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 00000000000..4a5663f3872 --- /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 00000000000..3028d725e5b --- /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 00000000000..73854671989 --- /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 00000000000..40597e99d07 --- /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 135ade24ec9..5ce9691b389 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*-*-* { }