------- Comment #9 from dtemirbulatov at gmail dot com 2007-05-16 22:47 ------- This patch fixes both testcases
--- gcc/varasm.c.orig 2007-05-16 21:32:11.000000000 +0400 +++ gcc/varasm.c 2007-05-16 21:36:14.000000000 +0400 @@ -5762,12 +5762,14 @@ categorize_decl_for_section (tree decl, be read-only or not, but whether the dynamic link will have to do something. If so, we wish to segregate the data in order to minimize cache misses inside the dynamic linker. */ - if (reloc & targetm.asm_out.reloc_rw_mask ()) + if (reloc & targetm.asm_out.reloc_rw_mask () + && !lookup_attribute ("section", DECL_ATTRIBUTES (decl))) ret = reloc == 1 ? SECCAT_DATA_REL_LOCAL : SECCAT_DATA_REL; else ret = SECCAT_DATA; } - else if (reloc & targetm.asm_out.reloc_rw_mask ()) + else if (reloc & targetm.asm_out.reloc_rw_mask () + && !lookup_attribute ("section", DECL_ATTRIBUTES (decl))) ret = reloc == 1 ? SECCAT_DATA_REL_RO_LOCAL : SECCAT_DATA_REL_RO; else if (reloc || flag_merge_constants < 2) /* C and C++ don't allow different variables to share the same , bootstraped and tested on i686-pc-linux-gnu with no new regressions, tested 4.2 version with gdb-sim on following architectures arm-elf, arm-none-eabi, mips-elf, mipsisa64-elf, powerpc-eabisim, sh-elf, powerpc-unknown-eabispe with no new regressions -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31490