From: "H.J. Lu" <hjl.tools@gmail.com>
To: Nick Clifton <nickc@redhat.com>
Cc: Binutils <binutils@sourceware.org>, Alan Modra <amodra@gmail.com>
Subject: V3 [PATCH] gas: Generate a new section for SHF_GNU_RETAIN
Date: Tue, 8 Dec 2020 16:05:43 -0800 [thread overview]
Message-ID: <CAMe9rOo7JaoOo=kbn469unrdTkPLRiUB3WGB6GQSd41vYFFb5A@mail.gmail.com> (raw)
In-Reply-To: <865690a0-b109-5b40-b0d6-0e3ddfecf77b@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 1314 bytes --]
On Tue, Dec 8, 2020 at 9:08 AM Nick Clifton <nickc@redhat.com> wrote:
>
> Hi H.J.
>
> > Can you take a look at this
> >
> > https://sourceware.org/pipermail/binutils/2020-December/114407.html
>
> I am tending towards approving this patch, although I would like to
> see if Alan has any comments.
>
> I did notice however that the patch does introduce some new failures:
>
> GAS REGRESSION: SHF_GNU_RETAIN sections 27
>
> This was for:
> m32r-elf
> mipsisa32el-linux
> tx39-elf
> mips64el-openbsd
> mipsel-linux-gnu
> mips-sgi-irix6
> mips64-linux
> rx-elf .
> s390-linux
> score-elf
> mips-elf
> mips64-openbsd
> nds32le-elf
BTW, there are many extra failures for some targets. Should we
xfail them if no one will fix them?
> The mips failures appear to be because of MIPS special sections, eg:
>
> regexp_diff match failure
> regexp "^ \[..\] .bss[ ]+NOBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 WAR.*$"
> line " [ 4] .reginfo MIPS_REGINFO 00000000 00003c 000018 01 0 0 4"
> regexp_diff match failure
>
> I have not checked the others, but I suspect that they will be similar.
>
You are right. Just some extra sections. Here is the updated patch
with the adjusted testcase.
Alan, does this patch look OK to you?
Thanks.
--
H.J.
[-- Attachment #2: 0001-gas-Generate-a-new-section-for-SHF_GNU_RETAIN.patch --]
[-- Type: text/x-patch, Size: 7961 bytes --]
From d7ba245135934068e70fff46aa6a3f8f1f8737dd Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Thu, 24 Sep 2020 05:45:50 -0700
Subject: [PATCH] gas: Generate a new section for SHF_GNU_RETAIN
For
.globl foo2
.section .data.foo,"aR"
.align 4
.type foo2, @object
.size foo2, 4
foo2:
.long 2
.globl foo1
.section .data.foo
.align 4
.type foo1, @object
.size foo1, 4
foo1:
.long 1
generate a new section if the SHF_GNU_RETAIN bit doesn't match.
* config/obj-elf.c (SEC_ASSEMBLER_SHF_MASK): New.
(get_section_by_match): Also check if SEC_ASSEMBLER_SHF_MASK of
sh_flags matches. Rename info to sh_info.
(obj_elf_change_section): Don't check previous SHF_GNU_RETAIN.
Rename info to sh_info.
(obj_elf_section): Rename info to sh_info. Set sh_flags for
SHF_GNU_RETAIN.
* config/obj-elf.h (elf_section_match): Rename info to sh_info.
Add sh_flags.
* testsuite/gas/elf/elf.exp: Run section27.
* testsuite/gas/elf/section24b.d: Updated.
* testsuite/gas/elf/section27.d: New file.
* testsuite/gas/elf/section27.s: Likewise.
---
gas/config/obj-elf.c | 35 +++++++++++++++---------------
gas/config/obj-elf.h | 3 ++-
gas/testsuite/gas/elf/elf.exp | 1 +
gas/testsuite/gas/elf/section24b.d | 10 ++++++---
gas/testsuite/gas/elf/section27.d | 19 ++++++++++++++++
gas/testsuite/gas/elf/section27.s | 34 +++++++++++++++++++++++++++++
6 files changed, 81 insertions(+), 21 deletions(-)
create mode 100644 gas/testsuite/gas/elf/section27.d
create mode 100644 gas/testsuite/gas/elf/section27.s
diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c
index 54d42d9ecb..5d3b1a0edc 100644
--- a/gas/config/obj-elf.c
+++ b/gas/config/obj-elf.c
@@ -519,6 +519,9 @@ struct section_stack
static struct section_stack *section_stack;
+/* ELF section flags for unique sections. */
+#define SEC_ASSEMBLER_SHF_MASK SHF_GNU_RETAIN
+
/* Return TRUE iff SEC matches the section info INF. */
static bfd_boolean
@@ -529,9 +532,12 @@ get_section_by_match (bfd *abfd ATTRIBUTE_UNUSED, asection *sec, void *inf)
const char *group_name = elf_group_name (sec);
const char *linked_to_symbol_name
= sec->map_head.linked_to_symbol_name;
- unsigned int info = elf_section_data (sec)->this_hdr.sh_info;
+ unsigned int sh_info = elf_section_data (sec)->this_hdr.sh_info;
+ bfd_vma sh_flags = (elf_section_data (sec)->this_hdr.sh_flags
+ & SEC_ASSEMBLER_SHF_MASK);
- return (info == match->info
+ return (sh_info == match->sh_info
+ && sh_flags == match->sh_flags
&& ((bfd_section_flags (sec) & SEC_ASSEMBLER_SECTION_ID)
== (match->flags & SEC_ASSEMBLER_SECTION_ID))
&& sec->section_id == match->section_id
@@ -740,7 +746,7 @@ obj_elf_change_section (const char *name,
type = bfd_elf_get_default_section_type (flags);
elf_section_type (sec) = type;
elf_section_flags (sec) = attr;
- elf_section_data (sec)->this_hdr.sh_info = match_p->info;
+ elf_section_data (sec)->this_hdr.sh_info = match_p->sh_info;
/* Prevent SEC_HAS_CONTENTS from being inadvertently set. */
if (type == SHT_NOBITS)
@@ -806,17 +812,9 @@ obj_elf_change_section (const char *name,
as_bad (_("changed section attributes for %s"), name);
}
else
- {
- /* Don't overwrite a previously set SHF_GNU_RETAIN flag for the
- section. The entire section must be marked retained. */
- if ((elf_tdata (stdoutput)->has_gnu_osabi & elf_gnu_osabi_retain)
- && ((elf_section_flags (old_sec) & SHF_GNU_RETAIN)))
- attr |= SHF_GNU_RETAIN;
-
- /* FIXME: Maybe we should consider removing a previously set
- processor or application specific attribute as suspicious ? */
- elf_section_flags (sec) = attr;
- }
+ /* FIXME: Maybe we should consider removing a previously set
+ processor or application specific attribute as suspicious? */
+ elf_section_flags (sec) = attr;
if ((flags & SEC_MERGE) && old_sec->entsize != (unsigned) entsize)
as_bad (_("changed section entity size for %s"), name);
@@ -1322,18 +1320,21 @@ obj_elf_section (int push)
if (ISDIGIT (* input_line_pointer))
{
char *t = input_line_pointer;
- match.info = strtoul (input_line_pointer,
+ match.sh_info = strtoul (input_line_pointer,
&input_line_pointer, 0);
- if (match.info == (unsigned int) -1)
+ if (match.sh_info == (unsigned int) -1)
{
as_warn (_("unsupported mbind section info: %s"), t);
- match.info = 0;
+ match.sh_info = 0;
}
}
else
input_line_pointer = save;
}
+ if ((gnu_attr & SHF_GNU_RETAIN) != 0)
+ match.sh_flags |= SHF_GNU_RETAIN;
+
if (*input_line_pointer == ',')
{
char *save = input_line_pointer;
diff --git a/gas/config/obj-elf.h b/gas/config/obj-elf.h
index 4f29572eef..c714ba7a70 100644
--- a/gas/config/obj-elf.h
+++ b/gas/config/obj-elf.h
@@ -106,8 +106,9 @@ struct elf_section_match
{
const char * group_name;
const char * linked_to_symbol_name;
- unsigned int info;
unsigned int section_id;
+ unsigned int sh_info; /* ELF section information. */
+ bfd_vma sh_flags; /* ELF section flags. */
flagword flags;
};
diff --git a/gas/testsuite/gas/elf/elf.exp b/gas/testsuite/gas/elf/elf.exp
index 25c40a2810..80dec4effc 100644
--- a/gas/testsuite/gas/elf/elf.exp
+++ b/gas/testsuite/gas/elf/elf.exp
@@ -268,6 +268,7 @@ if { [is_elf_format] } then {
run_dump_test "section24b"
run_dump_test "section25"
run_dump_test "section26"
+ run_dump_test "section27"
run_dump_test "sh-link-zero"
run_dump_test "dwarf2-1" $dump_opts
run_dump_test "dwarf2-2" $dump_opts
diff --git a/gas/testsuite/gas/elf/section24b.d b/gas/testsuite/gas/elf/section24b.d
index 451ec21635..03dd2916ef 100644
--- a/gas/testsuite/gas/elf/section24b.d
+++ b/gas/testsuite/gas/elf/section24b.d
@@ -3,8 +3,12 @@
#source: section24.s
#readelf: -S --wide
-#failif
#...
- \[..\] .(text|data|bss|rodata)[ ]+PROGBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 [^R] .*
+ \[..\] .text[ ]+PROGBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +AX .*
+#...
+ \[..\] .data[ ]+PROGBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +WA .*
+#...
+ \[..\] .bss[ ]+NOBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +WA .*
+#...
+ \[..\] .rodata[ ]+PROGBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 +A .*
#pass
-
diff --git a/gas/testsuite/gas/elf/section27.d b/gas/testsuite/gas/elf/section27.d
new file mode 100644
index 0000000000..da0734fe84
--- /dev/null
+++ b/gas/testsuite/gas/elf/section27.d
@@ -0,0 +1,19 @@
+#readelf: -h -S --wide
+#name: SHF_GNU_RETAIN sections 27
+#notarget: ![supports_gnu_osabi]
+
+#...
+ +OS/ABI: +UNIX - (GNU|FreeBSD)
+#...
+ \[..\] .text[ ]+PROGBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 AX.*
+#...
+ \[..\] .data[ ]+PROGBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 WA.*
+#...
+ \[..\] .bss[ ]+NOBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 WA.*
+#...
+ \[..\] .bss[ ]+NOBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 WAR.*
+#...
+ \[..\] .data[ ]+PROGBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 WAR.*
+#...
+ \[..\] .text[ ]+PROGBITS[ ]+[0-9a-f]+ [0-9a-f]+ [0-9a-f]+ 00 AXR.*
+#pass
diff --git a/gas/testsuite/gas/elf/section27.s b/gas/testsuite/gas/elf/section27.s
new file mode 100644
index 0000000000..78e410ff95
--- /dev/null
+++ b/gas/testsuite/gas/elf/section27.s
@@ -0,0 +1,34 @@
+ .section .bss,"aw"
+ .global discard0
+ .type discard0, %object
+discard0:
+ .zero 2
+
+ .section .data,"aw"
+ .global discard1
+ .type discard1, %object
+discard1:
+ .word 1
+
+ .text
+ .global discard2
+ .type discard2, %function
+discard2:
+ .word 0
+
+ .section .bss,"awR",%nobits
+ .global retain0
+ .type retain0, %object
+retain0:
+ .zero 2
+
+ .section .data,"awR",%progbits
+ .type retain1, %object
+retain1:
+ .word 1
+
+ .section .text,"axR",%progbits
+ .global retain2
+ .type retain2, %function
+retain2:
+ .word 0
--
2.29.2
next prev parent reply other threads:[~2020-12-09 0:06 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-04 13:52 H.J. Lu
2020-12-04 15:29 ` Jozef Lawrynowicz
2020-12-04 16:43 ` V2 " H.J. Lu
2020-12-08 12:33 ` H.J. Lu
2020-12-08 17:08 ` Nick Clifton
2020-12-09 0:05 ` H.J. Lu [this message]
2020-12-09 0:37 ` V3 " Alan Modra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CAMe9rOo7JaoOo=kbn469unrdTkPLRiUB3WGB6GQSd41vYFFb5A@mail.gmail.com' \
--to=hjl.tools@gmail.com \
--cc=amodra@gmail.com \
--cc=binutils@sourceware.org \
--cc=nickc@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).