On Wed, Nov 4, 2020 at 6:41 AM Jozef Lawrynowicz
<joze...@mittosystems.com> wrote:
>
> On Wed, Nov 04, 2020 at 05:47:28AM -0800, H.J. Lu wrote:
> > On Tue, Nov 3, 2020 at 2:11 PM H.J. Lu <hjl.to...@gmail.com> wrote:
> > >
> > > On Tue, Nov 3, 2020 at 1:57 PM Jozef Lawrynowicz
> > > <joze...@mittosystems.com> wrote:
> > > >
> > > > On Tue, Nov 03, 2020 at 01:09:43PM -0800, H.J. Lu via Gcc-patches wrote:
> > > > > On Tue, Nov 3, 2020 at 1:00 PM H.J. Lu <hjl.to...@gmail.com> wrote:
> > > > > >
> > > > > > On Tue, Nov 3, 2020 at 12:46 PM Jozef Lawrynowicz
> > > > > > <joze...@mittosystems.com> wrote:
> > > > > > >
> > > > > > > On Tue, Nov 03, 2020 at 11:58:04AM -0800, H.J. Lu via Gcc-patches 
> > > > > > > wrote:
> > > > > > > > On Tue, Nov 3, 2020 at 10:22 AM Jozef Lawrynowicz
> > > > > > > > <joze...@mittosystems.com> wrote:
> > > > > > > > >
> > > > > > > > > On Tue, Nov 03, 2020 at 09:57:58AM -0800, H.J. Lu via 
> > > > > > > > > Gcc-patches wrote:
> > > > > > > > > > On Tue, Nov 3, 2020 at 9:41 AM Jozef Lawrynowicz
> > > > > > > > > > <joze...@mittosystems.com> wrote:
> > > > > > > > > > >
> > > > > > > > > > > The attached patch implements 
> > > > > > > > > > > TARGET_ASM_MARK_DECL_PRESERVED for ELF GNU
> > > > > > > > > > > OSABI targets, so that declarations that have the "used" 
> > > > > > > > > > > attribute
> > > > > > > > > > > applied will be saved from linker garbage collection.
> > > > > > > > > > >
> > > > > > > > > > > TARGET_ASM_MARK_DECL_PRESERVED will emit an assembler 
> > > > > > > > > > > ".retain"
> > > > > > > > > >
> > > > > > > > > > Can you use the "R" flag instead?
> > > > > > > > > >
> > > > > > > > >
> > > > > > > > > For the benefit of this mailing list, I have copied my 
> > > > > > > > > response from the
> > > > > > > > > Binutils mailing list regarding this.
> > > > > > > > > The "comm_section" example I gave is actually innacurate, but 
> > > > > > > > > you can
> > > > > > > > > see the examples of the variety of sections that would need 
> > > > > > > > > to be
> > > > > > > > > handled by doing
> > > > > > > > >
> > > > > > > > > $ git grep -A2 "define.*SECTION_ASM_OP" gcc/ | grep "\".*\."
> > > > > > > > >
> > > > > > > > > > ... snip ...
> > > > > > > > > > Secondly, for seamless integration with the "used" 
> > > > > > > > > > attribute, we must be
> > > > > > > > > > able to to mark the symbol with the used attribute applied 
> > > > > > > > > > as "retained"
> > > > > > > > > > without changing its section name. For GCC "named" 
> > > > > > > > > > sections, this is
> > > > > > > > > > straightforward, but for "unnamed" sections it is a giant 
> > > > > > > > > > mess.
> > > > > > > > > >
> > > > > > > > > > The section name for a GCC "unnamed" section is not readily 
> > > > > > > > > > available,
> > > > > > > > > > instead a string which contains the full assembly code to 
> > > > > > > > > > switch to one
> > > > > > > > > > of these text/data/bss/rodata/comm etc. sections is encoded 
> > > > > > > > > > in the
> > > > > > > > > > structure.
> > > > > > > > > >
> > > > > > > > > > Backends define the assembly code to switch to these 
> > > > > > > > > > sections (some
> > > > > > > > > > "*ASM_OP*" macro) in a variety of ways. For example, the 
> > > > > > > > > > unnamed section
> > > > > > > > > > "comm_section", might correspond to a .bss section, or emit 
> > > > > > > > > > a .comm
> > > > > > > > > > directive. I even looked at trying to parse them to extract 
> > > > > > > > > > what the
> > > > > > > > > > name of a section will be, but it would be very messy and 
> > > > > > > > > > not robust.
> > > > > > > > > >
> > > > > > > > > > Meanwhile, having a .retain <symbol_name> directive is a 
> > > > > > > > > > very simmple
> > > > > > > > > > solution, and keeps the GCC implementation really concise 
> > > > > > > > > > (patch
> > > > > > > > > > attached). The assembler will know for sure what the 
> > > > > > > > > > section containing
> > > > > > > > > > the symbol will be, and can apply the SHF_GNU_RETAIN flag 
> > > > > > > > > > directly.
> > > > > > > > > >
> > > > > > > >
> > > > > > > > Please take a look at
> > > > > > > >
> > > > > > > > https://gitlab.com/x86-gcc/gcc/-/commits/users/hjl/elf/shf_retain
> > > > > > > >
> > > > > > > > which is built in top of
> > > > > > > >
> > > > > > > > https://gcc.gnu.org/pipermail/gcc-patches/2020-February/539963.html
> > > > > > > >
> > > > > > > > I think SECTION2_RETAIN matches SHF_GNU_RETAIN well.  If you
> > > > > > > > want, you extract my flags2 change and use it for 
> > > > > > > > SHF_GNU_RETAIN.
> > > > > > >
> > > > > > > In your patch you have to make the assumption that data_section, 
> > > > > > > always
> > > > > > > corresponds to a section named .data. For just this example, c6x 
> > > > > > > (which
> > > > > > > supports the GNU ELF OSABI) does not fit the rule:
> > > > > > >
> > > > > > > > c6x/elf-common.h:#define DATA_SECTION_ASM_OP 
> > > > > > > > "\t.section\t\".fardata\",\"aw\""
> > > > > > >
> > > > > > > data_section for c6x corresponds to .fardata, not .data. So the 
> > > > > > > use of
> > > > > > > "used" on a data declaration would place it in a different 
> > > > > > > section, that
> > > > > > > if the "used" attribute was not applied.
> > > > > > >
> > > > > > > For c6x and mips, readonly_data_section does not correspond to 
> > > > > > > .rodata,
> > > > > > > so that assumption cannot be made either:
> > > > > > > > c6x/elf-common.h:#define READONLY_DATA_SECTION_ASM_OP 
> > > > > > > > "\t.section\t\".const\",\"a\",@progbits"
> > > > > > > > mips/mips.h:#define READONLY_DATA_SECTION_ASM_OP        
> > > > > > > > "\t.rdata"      /* read-only data */
> > > > > > >
> > > > > > > The same can be said for bss_section for c6x as well.
> > > > > >
> > > > > > Just add and use named_xxx_section.
> > > > > >
> > > >
> > > > I guess new macros for targets that use non-standard names in unnamed
> > > > sections could work.
> > > >
> > > >   c6x/elf-common.h:
> > > >     #define READONLY_DATA_SECTION_NAME ".const"
> > > >     #define READONLY_DATA_SECTION_ASM_OP 
> > > > "\t.section\t\".const\",\"a\",@progbits"
> > > >
> > > > > > > Furthermore, this is only considering the examples in
> > > > > > > default_elf_select_section - the less standard unnamed section 
> > > > > > > are used
> > > > > > > in many backend's implementation of select_section, and we would 
> > > > > > > need to
> > > > > > > work out what section name they correspond to to properly support
> > > > > > > SHF_GNU_RETAIN.
> > > > > > >
> > > > > > > For every unnamed section, you either have to assume what the
> > > > > > > corresponding section name is, or parse the associated assembly 
> > > > > > > output
> > > > > > > string for the section.
> > > > > >
> > > > > > My change is just  an example to show how it can be done, not a 
> > > > > > complete one.
> > > > > >
> > > > > > > Given these edge cases which must be handled for GCC to robustly 
> > > > > > > emit
> > > > > > > the "R" flag for sections containing "used" symbols, surely it is
> > > > > > > preferable to leverage the existing 
> > > > > > > TARGET_ASM_MARK_DECL_PRESERVED and
> > > > > > > emit a .retain <symname> directive, which is extremely simple and
> > > > > > > doesn't require any handling of these edge cases and non-standard
> > > > > > > backend implementations.
> > > > > >
> > > > > > It is used to update the symbol table.  Other usage is abuse.
> > > > > >
> > > >
> > > > We can't update the symbol table because there is no room left in ELF
> > > > for new symbol flags. But the least we can do is convey the requirement
> > > > for a *symbol* to be retained from the compiler to the assembler. How
> > > > the assembler communicates to the linker that a symbol or section must
> > > > be retained is between those two programs and the object file format.
> > >
> > > But you want to only want to keep one symbol, not necessarily the whole
> > > section which contains the symbol.
> > >
> > > > In this case we must use the section flag SHF_GNU_RETAIN. It is not
> > > > ideal, but this appears to be the best vehicle for communicating the
> > > > requirement to retain a symbol from the assembler to the linker.
> > > >
> > > > Theoretically if we could set an ELF symbol flag for a symbol being
> > > > "retained", then we would use a ".retain" directive. The fact we
> > > > can't actually communicate the requirement for a symbol to be retained
> > > > from the assembler to the linker, because of limitations of the object
> > > > file format, is not related to the output of the compiler (IMO).
> > > >
> > > > The following also seems like abuse to me, we can't change set/unset
> > > > other flags between .section directives for the same section, but we can
> > > > for SHF_GNU_RETAIN?
> > > >
> > > >     .text
> > > >   main:
> > > >     ...
> > > >     .section .text,"axR"
> > > >   retained_fn:
> > > >     ...
> > > >     .section .text,"ax"
> > > >   do_stuff:
> > > >     ...
> > >
> > > SHF_GNU_RETAIN has special handling.
> > >
> > > > There would be further debate about whether the assembler should create
> > > > separate sections for the about .text, or merge them into one with
> > > > logical OR of the flags. I never did make my mind up about which is
> > > > best. Merging is closest to what would happen if we could communicate
> > > > "retain" as a property of the symbol.
> > > >
> > > > >
> > > > > For
> > > > >
> > > > > [hjl@gnu-cfl-2 gcc]$ cat /tmp/x.c
> > > > > static int xyzzy __attribute__((__used__)) = 1;
> > > > > int foo[0x40000];
> > > > > [hjl@gnu-cfl-2 gcc]$
> > > > >
> > > > > foo should be removed by ld --gc-sections if it is unreferenced.  But 
> > > > > your
> > > > > patch makes it impossible.
> > > >
> > > > The same could be said if:
> > > >   static int xyzzy = 1;
> > > >   int foo[0x40000];
> > > >
> > > >   int
> > > >   main (void)
> > > >   {
> > > >     while (xxyzzy);
> > > >   }
> > > >
> > > > foo would be unnecessarily retained. If the user wants optimal operation
> > >
> > > ld --gc-sections will remove foo.  My point is there should be no .retain
> > > directive.
> > >
> > > > of garbage collection, they should use -ffunction/data-sections, the
> > > > "section" attribute on xyyzzy, or place foo in another file.
> > > >
> > > > On a related note, in relocatable output from the linker, unique section
> > > > names .text.XXXX appear to normally be unhandled in linker scripts for
> > > > ld -r, so they will not get merged into an output section, and can still
> > > > be properly garbage collected when linking the final executable file.
> > > >
> > > > Thanks,
> > > > Jozef
> >
> > Please take a look at users/hjl/elf/shf_retain branch:
> >
> > https://gitlab.com/x86-gcc/gcc/-/commits/users/hjl/elf/shf_retain
> >
> > for a complete implementation.
>
> Thanks for looking into this, however your patch changes the section
> that a declaration that has the "used" attribute applied is placed in.
>
>   $ cat tester.c
>   void __attribute__((used)) foo (void)
>   {
>     while (1);
>   }
>   $ head tester.s
>           .file   "tester.c"
>           .text
>           .section        .text.foo,"axR",@progbits
>           .globl  foo
>           .type   foo, @function
>
> The behavior of the "used" attribute changes depending on if
> SHF_GNU_RETAIN is supported:
> - Without SHF_GNU_RETAIN, "foo" is placed in the ".text" section.
> - With SHF_GNU_RETAIN, "foo" is placed in the ".text.foo" section.
>

1. SHF_GNU_RETAIN always changes the behavior no matter what
we do.
2. The "R" section flag creates a unique section, which means

.section        .text.foo,"axR",@progbits

is equivalent to

 .section        .text,"axR",@progbits

If you don't want to change the behavior, you don't need SHF_GNU_RETAIN.

-- 
H.J.

Reply via email to