Hello, attached patch fixes inconsistent handling of section flags when using the section attribute, i.e.:
__attribute__((section("writable1"))) int foo1; __attribute__((section("readonly1"))) const int foo1c; __attribute__((section("writable2"))) int foo2 = 42; __attribute__((section("readonly2"))) const int foo2c = 42; should give section attributes of "aw", "a", "aw", "a" in that order. Currently, "foo1c" is classified as BSS though and therefore put into a writable section. Joerg
diff --git a/gcc/varasm.c b/gcc/varasm.c index 45611a9a858..eaf78b28bc1 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -969,11 +969,17 @@ decode_reg_name (const char *name) } -/* Return true if DECL's initializer is suitable for a BSS section. */ +/* + * Return true if DECL's initializer is suitable for a BSS section. + * If there is an explicit section name attribute, assume that it is not + * for a BSS section, independent of the name. + */ bool bss_initializer_p (const_tree decl) { + if (DECL_SECTION_NAME (decl) != NULL) + return false; return (DECL_INITIAL (decl) == NULL /* In LTO we have no errors in program; error_mark_node is used to mark offlined constructors. */ @@ -6460,7 +6466,7 @@ 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) != NULL && ! 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 @@ -6504,6 +6510,7 @@ categorize_decl_for_section (const_tree decl, int reloc) no concept of a read-only thread-local-data section. */ if (ret == SECCAT_BSS || (flag_zero_initialized_in_bss + && DECL_INITIAL(decl) != NULL && initializer_zerop (DECL_INITIAL (decl)))) ret = SECCAT_TBSS; else