diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 2 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/const-in-bss.c | 6 | ||||
-rw-r--r-- | gcc/varasm.c | 26 |
4 files changed, 29 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e71380e..f9d9eb7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-09-01 Joerg Sonnenberger <joerg@bec.de> + Jeff Law <law@redhat.com> + + * varasm.c (bss_initializer_p): Do not put constants into .bss + (categorize_decl_for_section): Handle bss_initializer_p returning + false when DECL_INITIAL is NULL. + 2017-09-01 Andreas Krebbel <krebbel@linux.vnet.ibm.com> PR target/82012 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fe6e430..e827514 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -5,6 +5,8 @@ 2017-09-01 Jeff Law <law@redhat.com> + * gcc.target/i386/const-in-bss.c: New test. + PR tree-optimization/82052 * gcc.c-torture/compile/pr82052.c: New test. diff --git a/gcc/testsuite/gcc.target/i386/const-in-bss.c b/gcc/testsuite/gcc.target/i386/const-in-bss.c new file mode 100644 index 0000000..c70aa0b --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/const-in-bss.c @@ -0,0 +1,6 @@ +/* { dg-do compile { target *-*-linux* } } */ + +__attribute__((section("readonly1"))) const int foo1c; + +/* { dg-final { scan-assembler "readonly1,\"a\"" } } */ +/* { dg-final { scan-assembler-not "readonly1,\"aw\"" } } */ diff --git a/gcc/varasm.c b/gcc/varasm.c index e539337..d38d2c2 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -976,16 +976,16 @@ decode_reg_name (const char *name) bool bss_initializer_p (const_tree decl) { - return (DECL_INITIAL (decl) == NULL - /* In LTO we have no errors in program; error_mark_node is used - to mark offlined constructors. */ - || (DECL_INITIAL (decl) == error_mark_node - && !in_lto_p) - || (flag_zero_initialized_in_bss - /* Leave constant zeroes in .rodata so they - can be shared. */ - && !TREE_READONLY (decl) - && initializer_zerop (DECL_INITIAL (decl)))); + /* Do not put constants into the .bss section, they belong in a readonly + section. */ + return (!TREE_READONLY (decl) + && (DECL_INITIAL (decl) == NULL + /* In LTO we have no errors in program; error_mark_node is used + to mark offlined constructors. */ + || (DECL_INITIAL (decl) == error_mark_node + && !in_lto_p) + || (flag_zero_initialized_in_bss + && initializer_zerop (DECL_INITIAL (decl))))); } /* Compute the alignment of variable specified by DECL. @@ -6517,7 +6517,8 @@ categorize_decl_for_section (const_tree decl, int reloc) ret = SECCAT_BSS; else if (! TREE_READONLY (decl) || TREE_SIDE_EFFECTS (decl) - || ! TREE_CONSTANT (DECL_INITIAL (decl))) + || (DECL_INITIAL (decl) + && ! TREE_CONSTANT (DECL_INITIAL (decl)))) { /* Here the reloc_rw_mask is not testing whether the section should be read-only or not, but whether the dynamic link will have to @@ -6537,7 +6538,8 @@ categorize_decl_for_section (const_tree decl, int reloc) location. -fmerge-all-constants allows even that (at the expense of not conforming). */ ret = SECCAT_RODATA; - else if (TREE_CODE (DECL_INITIAL (decl)) == STRING_CST) + else if (DECL_INITIAL (decl) + && TREE_CODE (DECL_INITIAL (decl)) == STRING_CST) ret = SECCAT_RODATA_MERGE_STR_INIT; else ret = SECCAT_RODATA_MERGE_CONST; |