aboutsummaryrefslogtreecommitdiff
path: root/gcc/varasm.c
diff options
context:
space:
mode:
authorJozef Lawrynowicz <jozef.l@mittosystems.com>2020-11-23 11:43:39 +0000
committerJozef Lawrynowicz <jozef.l@mittosystems.com>2020-11-23 11:43:39 +0000
commitb510765dedfec573c756cb1fcfcb5b0c3830c5e9 (patch)
treefc1c04fa396e7abcbd4fb88b6cf1d8b1fd091794 /gcc/varasm.c
parent4a8c54359a593e4e53192303159144dd70bfced1 (diff)
downloadgcc-b510765dedfec573c756cb1fcfcb5b0c3830c5e9.zip
gcc-b510765dedfec573c756cb1fcfcb5b0c3830c5e9.tar.gz
gcc-b510765dedfec573c756cb1fcfcb5b0c3830c5e9.tar.bz2
Fix "noinit" attribute being ignored for -O0 and -fdata-sections
Variables with the "noinit" attribute are ignored at -O0 because they are treated like a regular bss variable and placed in the .bss section. With -fdata-sections they are ignored because they are not handled in resolve_unique_section. gcc/ChangeLog: * tree.h (DECL_NOINIT_P): Define. * varasm.c (DECL_NOINIT_P): Check DECL_NOINIT_P before using unnamed bss/lcomm sections for bss_initializer variables. (default_elf_select_section): Use DECL_NOINIT_P instead of looking up attribute for .noinit section selection. (default_unique_section): Check DECL_NOINIT_P for .noinit section selection. gcc/testsuite/ChangeLog: * gcc.c-torture/execute/noinit-attribute.c: Don't override optimization options set by torture test harness. * lib/target-supports.exp (check_effective_target_noinit): Adjust comment formatting.
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r--gcc/varasm.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c
index ada9994..da7d0d7 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -1241,6 +1241,7 @@ get_variable_section (tree decl, bool prefer_noswitch_p)
if (ADDR_SPACE_GENERIC_P (as)
&& !DECL_THREAD_LOCAL_P (decl)
+ && !DECL_NOINIT_P (decl)
&& !(prefer_noswitch_p && targetm.have_switchable_bss_sections)
&& bss_initializer_p (decl))
{
@@ -7042,13 +7043,11 @@ default_elf_select_section (tree decl, int reloc,
sname = ".tdata";
break;
case SECCAT_BSS:
- if (DECL_P (decl)
- && lookup_attribute ("noinit", DECL_ATTRIBUTES (decl)) != NULL_TREE)
+ if (DECL_P (decl) && DECL_NOINIT_P (decl))
{
sname = ".noinit";
break;
}
-
if (bss_section)
return bss_section;
sname = ".bss";
@@ -7111,6 +7110,11 @@ default_unique_section (tree decl, int reloc)
prefix = one_only ? ".s" : ".sdata";
break;
case SECCAT_BSS:
+ if (DECL_P (decl) && DECL_NOINIT_P (decl))
+ {
+ prefix = one_only ? ".n" : ".noinit";
+ break;
+ }
prefix = one_only ? ".b" : ".bss";
break;
case SECCAT_SBSS: