From: Joerg Sonnenberger Date: Fri, 1 Sep 2017 16:26:00 +0000 (-0600) Subject: varasm.c (bss_initializer_p): Do not put constants into .bss X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2ec399d8a6c9c26d69b73faf77c694fa3915dcec;p=gcc.git varasm.c (bss_initializer_p): Do not put constants into .bss * 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. * gcc.target/i386/const-in-bss.c: New test. From-SVN: r251602 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e71380e5c9d..f9d9eb74a3a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-09-01 Joerg Sonnenberger + Jeff Law + + * 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 PR target/82012 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fe6e4301bff..e82751438d6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -5,6 +5,8 @@ 2017-09-01 Jeff Law + * 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 00000000000..c70aa0bcb4e --- /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 e5393377a43..d38d2c2721b 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;