aboutsummaryrefslogtreecommitdiff
path: root/gcc/doc
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2021-02-15 11:31:12 -0800
committerH.J. Lu <hjl.tools@gmail.com>2021-02-18 13:27:38 -0800
commit6347f4a0904fce17eedf5c071be6f3c118680290 (patch)
tree0dfd837ed13bbbe2dece0db65b7cb4c049c14dbe /gcc/doc
parent1f9db6929d926222aee0628b93f77cd20cf3adc4 (diff)
downloadgcc-6347f4a0904fce17eedf5c071be6f3c118680290.zip
gcc-6347f4a0904fce17eedf5c071be6f3c118680290.tar.gz
gcc-6347f4a0904fce17eedf5c071be6f3c118680290.tar.bz2
Add retain attribute to place symbols in SHF_GNU_RETAIN section
When building Linux kernel, ld in bninutils 2.36 with GCC 11 generates thousands of ld: warning: orphan section `.data.event_initcall_finish' from `init/main.o' being placed in section `.data.event_initcall_finish' ld: warning: orphan section `.data.event_initcall_start' from `init/main.o' being placed in section `.data.event_initcall_start' ld: warning: orphan section `.data.event_initcall_level' from `init/main.o' being placed in section `.data.event_initcall_level' Since these sections are marked with SHF_GNU_RETAIN, they are placed in separate sections. They become orphan sections since they aren't expected in the Linux kernel linker script. But orphan sections normally don't work well with the Linux kernel linker script and the resulting kernel crashed. Add the "retain" attribute to place symbols in separate SHF_GNU_RETAIN sections. Issue a warning if the configured assembler/linker doesn't support SHF_GNU_RETAIN. gcc/ PR target/99113 * varasm.c (get_section): Replace SUPPORTS_SHF_GNU_RETAIN with looking up the retain attribute. (resolve_unique_section): Likewise. (get_variable_section): Likewise. (switch_to_section): Likewise. Warn when a symbol without the retain attribute and a symbol with the retain attribute are placed in the section with the same name, instead of the used attribute. * doc/extend.texi: Document the "retain" attribute. gcc/c-family/ PR target/99113 * c-attribs.c (c_common_attribute_table): Add the "retain" attribute. (handle_retain_attribute): New function. gcc/testsuite/ PR target/99113 * c-c++-common/attr-retain-1.c: New test. * c-c++-common/attr-retain-2.c: Likewise. * c-c++-common/attr-retain-3.c: Likewise. * c-c++-common/attr-retain-4.c: Likewise. * c-c++-common/attr-retain-5.c: Likewise. * c-c++-common/attr-retain-6.c: Likewise. * c-c++-common/attr-retain-7.c: Likewise. * c-c++-common/attr-retain-8.c: Likewise. * c-c++-common/attr-retain-9.c: Likewise. * c-c++-common/pr99113.c: Likewise. * gcc.c-torture/compile/attr-retain-1.c: Likewise. * gcc.c-torture/compile/attr-retain-2.c: Likewise. * c-c++-common/attr-used.c: Don't expect SHF_GNU_RETAIN section. * c-c++-common/attr-used-2.c: Likewise. * c-c++-common/attr-used-3.c: Likewise. * c-c++-common/attr-used-4.c: Likewise. * c-c++-common/attr-used-9.c: Likewise. * gcc.c-torture/compile/attr-used-retain-1.c: Likewise. * gcc.c-torture/compile/attr-used-retain-2.c: Likewise. * c-c++-common/attr-used-5.c: Don't expect warning for the used attribute nor SHF_GNU_RETAIN section. * c-c++-common/attr-used-6.c: Likewise. * c-c++-common/attr-used-7.c: Likewise. * c-c++-common/attr-used-8.c: Likewise.
Diffstat (limited to 'gcc/doc')
-rw-r--r--gcc/doc/extend.texi8
1 files changed, 6 insertions, 2 deletions
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 6eb1d32..8bbb937 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -3913,8 +3913,10 @@ When applied to a member function of a C++ class template, the
attribute also means that the function is instantiated if the
class itself is instantiated.
+@item retain
+@cindex @code{retain} function attribute
For ELF targets that support the GNU or FreeBSD OSABIs, this attribute
-will also save the function from linker garbage collection. To support
+will save the function from linker garbage collection. To support
this behavior, functions that have not been placed in specific sections
(e.g. by the @code{section} attribute, or the @code{-ffunction-sections}
option), will be placed in new, unique sections.
@@ -7504,8 +7506,10 @@ When applied to a static data member of a C++ class template, the
attribute also means that the member is instantiated if the
class itself is instantiated.
+@item retain
+@cindex @code{retain} variable attribute
For ELF targets that support the GNU or FreeBSD OSABIs, this attribute
-will also save the variable from linker garbage collection. To support
+will save the variable from linker garbage collection. To support
this behavior, variables that have not been placed in specific sections
(e.g. by the @code{section} attribute, or the @code{-fdata-sections} option),
will be placed in new, unique sections.