public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* RFC: New gas directive: .attach_to_group
@ 2020-09-29 15:12 Nick Clifton
  2020-09-29 16:53 ` Fangrui Song
  0 siblings, 1 reply; 7+ messages in thread
From: Nick Clifton @ 2020-09-29 15:12 UTC (permalink / raw)
  To: binutils

[-- Attachment #1: Type: text/plain, Size: 1595 bytes --]

Hi Guys,

  I am planning on applying the attached patch, but I wondered if anyone
  had any comments or thoughts first.

  The patch adds a new gas directive: ".attach_to_group <name>" which
  can be used to attach the current section to a named group.  I need
  this functionality for the annobin plugin for gcc.  The plugin creates
  new note sections and it wants to place them into section groups with
  their associated code section.  (So the .annobin.text section is
  grouped with the .text section, the .annobin.text.hot section is
  grouped with the .text.hot section and so on).  The problem is that
  the compiler creates the .section directives for (most of) these code
  sections, and it does not add a group section to their declaration.
  So I need a way to retroactively add a section to a group.  Hence the
  new directive.

  Tested with a wide variety of different configurations and no
  problems.

  Thoughts ?

Cheers
  Nick

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

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: attach-to-group.patch --]
[-- Type: text/x-patch, Size: 6484 bytes --]

diff --git a/gas/NEWS b/gas/NEWS
index 7ae58506ec..0ef33ab60e 100644
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -1,4 +1,7 @@
 -*- text -*-
+* Add a .attach-to_group directive which allows a section to added to a group
+  even after the section has been created.
+
 * Add support for Intel TDX instructions.
 
 * Add support for Intel Key Locker instructions.
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index b1c99020a3..5f61204bce 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 b88c1f9997..c0baa94536 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/elf.exp b/gas/testsuite/gas/elf/elf.exp
index 135ade24ec..5ce9691b38 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*-*-* { }
--- /dev/null	2020-09-29 09:19:37.528268715 +0100
+++ current/gas/testsuite/gas/elf/attach-1.s	2020-09-29 14:30:06.242727518 +0100
@@ -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
--- /dev/null	2020-09-29 09:19:37.528268715 +0100
+++ current/gas/testsuite/gas/elf/attach-1.d	2020-09-29 15:53:50.914680109 +0100
@@ -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
+   \[    .\]   [P|\.text]
+   \[    .\]   foo
+#pass
+
--- /dev/null	2020-09-29 09:19:37.528268715 +0100
+++ current/gas/testsuite/gas/elf/attach-2.d	2020-09-29 14:56:01.546024741 +0100
@@ -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
+
--- /dev/null	2020-09-29 09:19:37.528268715 +0100
+++ current/gas/testsuite/gas/elf/attach-2.s	2020-09-29 14:53:25.041006132 +0100
@@ -0,0 +1,9 @@
+	.section bar
+	.nop
+	.attach_to_group foo.group
+	
+	.section foo, "G", %note , foo.group
+	.word 0
+
+	.section bar
+	.nop
--- /dev/null	2020-09-29 09:19:37.528268715 +0100
+++ current/gas/testsuite/gas/elf/attach-err.d	2020-09-29 14:48:14.501953361 +0100
@@ -0,0 +1,3 @@
+#name: Errors generated by .attach_to_group
+#source: attach-err.s
+#error_output: attach-err.err
--- /dev/null	2020-09-29 09:19:37.528268715 +0100
+++ current/gas/testsuite/gas/elf/attach-err.err	2020-09-29 15:54:35.415401125 +0100
@@ -0,0 +1,4 @@
+.*: Assembler messages:
+.*:4: Warning: section [P|\.text] already has a group \(does\.not\.exist\)
+.*:5: Error: missing name
+.*:5: Warning: group name not parseable
--- /dev/null	2020-09-29 09:19:37.528268715 +0100
+++ current/gas/testsuite/gas/elf/attach-err.s	2020-09-29 14:45:34.540949111 +0100
@@ -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.  */

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2020-10-01  3:48 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-29 15:12 RFC: New gas directive: .attach_to_group Nick Clifton
2020-09-29 16:53 ` Fangrui Song
2020-09-30  9:33   ` Nick Clifton
     [not found]   ` <3609c590-8750-a021-92fb-05ff0ba7ca7d@redhat.com>
2020-09-30 13:43     ` [PATCH] elf: Also check linked-to section for SHT_NOTE section H.J. Lu
2020-09-30 14:01       ` Nick Clifton
2020-09-30 14:03         ` H.J. Lu
2020-10-01  3:41           ` Fangrui Song

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).