re PR c++/16276 ([3.4 only] G++ generates local references to linkonce sections)
PR c++/16276 * output.h (default_function_rodata_section, default_no_function_rodata_section): New prototypes. * target.h (struct gcc_target): Add asm_out.function_rodata_section. * target-def.h (TARGET_ASM_FUNCTION_RODATA_SECTION): Define. (TARGET_ASM_OUT): Add it. * varasm.c (default_function_rodata_section, default_no_function_rodata_section): New functions. * final.c (final_scan_insn): Call targetm.asm_out.function_rodata_section instead of readonly_data_section. * config/darwin.h (TARGET_ASM_FUNCTION_RODATA_SECTION): Define. * config/mcore/mcore.c (TARGET_ASM_FUNCTION_RODATA_SECTION): Likewise. * config/ip2k/ip2k.c (TARGET_ASM_FUNCTION_RODATA_SECTION): Likewise. * config/rs6000/xcoff.h (TARGET_ASM_FUNCTION_RODATA_SECTION): Likewise. * config/alpha/alpha.c (TARGET_ASM_FUNCTION_RODATA_SECTION): Likewise. * config/i386/cygming.h (TARGET_ASM_FUNCTION_RODATA_SECTION): Likewise. * config/i386/i386-interix.h (TARGET_ASM_FUNCTION_RODATA_SECTION): Likewise. * config/arm/pe.h (TARGET_ASM_FUNCTION_RODATA_SECTION): Likewise. * config/avr/avr.c (TARGET_ASM_FUNCTION_RODATA_SECTION): Likewise. * doc/tm.texi (TARGET_ASM_FUNCTION_RODATA_SECTION): Document. * g++.old-deja/g++.other/comdat4.C: New test. * g++.old-deja/g++.other/comdat4-aux.cc: New. From-SVN: r85873
This commit is contained in:
parent
5cf58f28c3
commit
ab5c8549a4
19 changed files with 213 additions and 2 deletions
|
@ -1,3 +1,30 @@
|
|||
2004-08-12 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/16276
|
||||
* output.h (default_function_rodata_section,
|
||||
default_no_function_rodata_section): New prototypes.
|
||||
* target.h (struct gcc_target): Add asm_out.function_rodata_section.
|
||||
* target-def.h (TARGET_ASM_FUNCTION_RODATA_SECTION): Define.
|
||||
(TARGET_ASM_OUT): Add it.
|
||||
* varasm.c (default_function_rodata_section,
|
||||
default_no_function_rodata_section): New functions.
|
||||
* final.c (final_scan_insn): Call
|
||||
targetm.asm_out.function_rodata_section instead of
|
||||
readonly_data_section.
|
||||
* config/darwin.h (TARGET_ASM_FUNCTION_RODATA_SECTION): Define.
|
||||
* config/mcore/mcore.c (TARGET_ASM_FUNCTION_RODATA_SECTION): Likewise.
|
||||
* config/ip2k/ip2k.c (TARGET_ASM_FUNCTION_RODATA_SECTION): Likewise.
|
||||
* config/rs6000/xcoff.h (TARGET_ASM_FUNCTION_RODATA_SECTION):
|
||||
Likewise.
|
||||
* config/alpha/alpha.c (TARGET_ASM_FUNCTION_RODATA_SECTION): Likewise.
|
||||
* config/i386/cygming.h (TARGET_ASM_FUNCTION_RODATA_SECTION):
|
||||
Likewise.
|
||||
* config/i386/i386-interix.h (TARGET_ASM_FUNCTION_RODATA_SECTION):
|
||||
Likewise.
|
||||
* config/arm/pe.h (TARGET_ASM_FUNCTION_RODATA_SECTION): Likewise.
|
||||
* config/avr/avr.c (TARGET_ASM_FUNCTION_RODATA_SECTION): Likewise.
|
||||
* doc/tm.texi (TARGET_ASM_FUNCTION_RODATA_SECTION): Document.
|
||||
|
||||
2004-08-12 Paul Brook <paul@codesourcery.com>
|
||||
|
||||
* dwarf2out.h (dwarf2out_frame_finish): Conditionalize outputting eh
|
||||
|
|
|
@ -10086,6 +10086,8 @@ alpha_init_libfuncs (void)
|
|||
# define TARGET_SECTION_TYPE_FLAGS unicosmk_section_type_flags
|
||||
# undef TARGET_ASM_UNIQUE_SECTION
|
||||
# define TARGET_ASM_UNIQUE_SECTION unicosmk_unique_section
|
||||
#undef TARGET_ASM_FUNCTION_RODATA_SECTION
|
||||
#define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
|
||||
# undef TARGET_ASM_GLOBALIZE_LABEL
|
||||
# define TARGET_ASM_GLOBALIZE_LABEL hook_void_FILEptr_constcharptr
|
||||
# undef TARGET_MUST_PASS_IN_STACK
|
||||
|
|
|
@ -85,6 +85,7 @@
|
|||
#define MULTIPLE_SYMBOL_SPACES
|
||||
|
||||
#define TARGET_ASM_UNIQUE_SECTION arm_pe_unique_section
|
||||
#define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
|
||||
|
||||
#define SUPPORTS_ONE_ONLY 1
|
||||
|
||||
|
|
|
@ -233,6 +233,8 @@ int avr_case_values_threshold = 30000;
|
|||
#define TARGET_ATTRIBUTE_TABLE avr_attribute_table
|
||||
#undef TARGET_ASM_UNIQUE_SECTION
|
||||
#define TARGET_ASM_UNIQUE_SECTION avr_unique_section
|
||||
#undef TARGET_ASM_FUNCTION_RODATA_SECTION
|
||||
#define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
|
||||
#undef TARGET_INSERT_ATTRIBUTES
|
||||
#define TARGET_INSERT_ATTRIBUTES avr_insert_attributes
|
||||
#undef TARGET_SECTION_TYPE_FLAGS
|
||||
|
|
|
@ -758,7 +758,8 @@ objc_section_init (void) \
|
|||
#define TARGET_ASM_SELECT_RTX_SECTION machopic_select_rtx_section
|
||||
#undef TARGET_ASM_UNIQUE_SECTION
|
||||
#define TARGET_ASM_UNIQUE_SECTION darwin_unique_section
|
||||
|
||||
#undef TARGET_ASM_FUNCTION_RODATA_SECTION
|
||||
#define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
|
||||
|
||||
|
||||
#define ASM_DECLARE_UNRESOLVED_REFERENCE(FILE,NAME) \
|
||||
|
|
|
@ -265,6 +265,7 @@ do { \
|
|||
|
||||
extern void i386_pe_unique_section (TREE, int);
|
||||
#define TARGET_ASM_UNIQUE_SECTION i386_pe_unique_section
|
||||
#define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
|
||||
|
||||
#define SUPPORTS_ONE_ONLY 1
|
||||
|
||||
|
|
|
@ -345,6 +345,7 @@ while (0)
|
|||
|
||||
extern void i386_pe_unique_section (tree, int);
|
||||
#define TARGET_ASM_UNIQUE_SECTION i386_pe_unique_section
|
||||
#define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
|
||||
|
||||
#define SUPPORTS_ONE_ONLY 1
|
||||
#endif /* 0 */
|
||||
|
|
|
@ -101,6 +101,9 @@ const struct attribute_spec ip2k_attribute_table[];
|
|||
#undef TARGET_ASM_UNIQUE_SECTION
|
||||
#define TARGET_ASM_UNIQUE_SECTION unique_section
|
||||
|
||||
#undef TARGET_ASM_FUNCTION_RODATA_SECTION
|
||||
#define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
|
||||
|
||||
#undef TARGET_ATTRIBUTE_TABLE
|
||||
#define TARGET_ATTRIBUTE_TABLE ip2k_attribute_table
|
||||
|
||||
|
|
|
@ -172,6 +172,8 @@ static bool mcore_return_in_memory (tree, tree);
|
|||
#define TARGET_ATTRIBUTE_TABLE mcore_attribute_table
|
||||
#undef TARGET_ASM_UNIQUE_SECTION
|
||||
#define TARGET_ASM_UNIQUE_SECTION mcore_unique_section
|
||||
#undef TARGET_ASM_FUNCTION_RODATA_SECTION
|
||||
#define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
|
||||
#undef TARGET_ENCODE_SECTION_INFO
|
||||
#define TARGET_ENCODE_SECTION_INFO mcore_encode_section_info
|
||||
#undef TARGET_STRIP_NAME_ENCODING
|
||||
|
|
|
@ -172,6 +172,7 @@ toc_section (void) \
|
|||
#define TARGET_ASM_SELECT_SECTION rs6000_xcoff_select_section
|
||||
#define TARGET_ASM_SELECT_RTX_SECTION rs6000_xcoff_select_rtx_section
|
||||
#define TARGET_ASM_UNIQUE_SECTION rs6000_xcoff_unique_section
|
||||
#define TARGET_ASM_FUNCTION_RODATA_SECTION default_no_function_rodata_section
|
||||
#define TARGET_STRIP_NAME_ENCODING rs6000_xcoff_strip_name_encoding
|
||||
#define TARGET_SECTION_TYPE_FLAGS rs6000_xcoff_section_type_flags
|
||||
|
||||
|
|
|
@ -5933,6 +5933,15 @@ example, the function @code{foo} would be placed in @code{.text.foo}.
|
|||
Whatever the actual target object format, this is often good enough.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Target Hook} void TARGET_ASM_FUNCTION_RODATA_SECTION (tree @var{decl})
|
||||
Switches to a readonly data section associated with
|
||||
@samp{DECL_SECTION_NAME (@var{decl})}.
|
||||
The default version of this function switches to @code{.gnu.linkonce.r.name}
|
||||
section if function's section is @code{.gnu.linkonce.t.name}, to
|
||||
@code{.rodata.name} if function is in @code{.text.name} section
|
||||
and otherwise switches to the normal readonly data section.
|
||||
@end deftypefn
|
||||
|
||||
@deftypefn {Target Hook} void TARGET_ASM_SELECT_RTX_SECTION (enum machine_mode @var{mode}, rtx @var{x}, unsigned HOST_WIDE_INT @var{align})
|
||||
Switches to the appropriate section for output of constant pool entry
|
||||
@var{x} in @var{mode}. You can assume that @var{x} is some kind of
|
||||
|
|
|
@ -1966,7 +1966,7 @@ final_scan_insn (rtx insn, FILE *file, int optimize ATTRIBUTE_UNUSED,
|
|||
{
|
||||
int log_align;
|
||||
|
||||
readonly_data_section ();
|
||||
targetm.asm_out.function_rodata_section (current_function_decl);
|
||||
|
||||
#ifdef ADDR_VEC_ALIGN
|
||||
log_align = ADDR_VEC_ALIGN (NEXT_INSN (insn));
|
||||
|
|
|
@ -501,6 +501,8 @@ extern void default_elf_select_section_1 (tree, int,
|
|||
unsigned HOST_WIDE_INT, int);
|
||||
extern void default_unique_section (tree, int);
|
||||
extern void default_unique_section_1 (tree, int, int);
|
||||
extern void default_function_rodata_section (tree);
|
||||
extern void default_no_function_rodata_section (tree);
|
||||
extern void default_select_rtx_section (enum machine_mode, rtx,
|
||||
unsigned HOST_WIDE_INT);
|
||||
extern void default_elf_select_rtx_section (enum machine_mode, rtx,
|
||||
|
|
|
@ -87,6 +87,10 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#define TARGET_ASM_UNIQUE_SECTION default_unique_section
|
||||
#endif
|
||||
|
||||
#ifndef TARGET_ASM_FUNCTION_RODATA_SECTION
|
||||
#define TARGET_ASM_FUNCTION_RODATA_SECTION default_function_rodata_section
|
||||
#endif
|
||||
|
||||
#ifndef TARGET_ASM_SELECT_RTX_SECTION
|
||||
#define TARGET_ASM_SELECT_RTX_SECTION default_select_rtx_section
|
||||
#endif
|
||||
|
@ -212,6 +216,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
TARGET_ASM_SELECT_SECTION, \
|
||||
TARGET_ASM_SELECT_RTX_SECTION, \
|
||||
TARGET_ASM_UNIQUE_SECTION, \
|
||||
TARGET_ASM_FUNCTION_RODATA_SECTION, \
|
||||
TARGET_ASM_CONSTRUCTOR, \
|
||||
TARGET_ASM_DESTRUCTOR, \
|
||||
TARGET_ASM_OUTPUT_MI_THUNK, \
|
||||
|
|
|
@ -132,6 +132,10 @@ struct gcc_target
|
|||
for SELECT_SECTION. */
|
||||
void (* unique_section) (tree, int);
|
||||
|
||||
/* Tell assembler to switch to the readonly data section associated
|
||||
with function DECL. */
|
||||
void (* function_rodata_section) (tree);
|
||||
|
||||
/* Output a constructor for a symbol with a given priority. */
|
||||
void (* constructor) (rtx, int);
|
||||
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2004-08-12 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/16276
|
||||
* g++.old-deja/g++.other/comdat4.C: New test.
|
||||
* g++.old-deja/g++.other/comdat4-aux.cc: New.
|
||||
|
||||
2004-08-12 Ben Elliston <bje@au.ibm.com>
|
||||
|
||||
PR target/16286
|
||||
|
|
40
gcc/testsuite/g++.old-deja/g++.other/comdat4-aux.cc
Normal file
40
gcc/testsuite/g++.old-deja/g++.other/comdat4-aux.cc
Normal file
|
@ -0,0 +1,40 @@
|
|||
extern void
|
||||
bar (int x);
|
||||
|
||||
inline void
|
||||
foo (int i)
|
||||
{
|
||||
switch (i)
|
||||
{
|
||||
case 3:
|
||||
case 5:
|
||||
case 6:
|
||||
case 9:
|
||||
case 15:
|
||||
bar (1);
|
||||
break;
|
||||
case 2:
|
||||
case 4:
|
||||
case 7:
|
||||
case 10:
|
||||
case 11:
|
||||
case 12:
|
||||
bar (2);
|
||||
break;
|
||||
case 0:
|
||||
case 1:
|
||||
case 8:
|
||||
case 13:
|
||||
case 16:
|
||||
bar (3);
|
||||
break;
|
||||
case 14:
|
||||
bar (4);
|
||||
break;
|
||||
default:
|
||||
bar (5);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void *fooaddr2 = (void *) foo;
|
57
gcc/testsuite/g++.old-deja/g++.other/comdat4.C
Normal file
57
gcc/testsuite/g++.old-deja/g++.other/comdat4.C
Normal file
|
@ -0,0 +1,57 @@
|
|||
// PR c++/16276
|
||||
// { dg-do link }
|
||||
// { dg-additional-sources " comdat4-aux.cc" }
|
||||
// { dg-options "-O2" }
|
||||
|
||||
extern void
|
||||
bar (int x);
|
||||
|
||||
inline void
|
||||
foo (int i)
|
||||
{
|
||||
switch (i)
|
||||
{
|
||||
case 3:
|
||||
case 5:
|
||||
case 6:
|
||||
case 9:
|
||||
case 15:
|
||||
bar (1);
|
||||
break;
|
||||
case 2:
|
||||
case 4:
|
||||
case 7:
|
||||
case 10:
|
||||
case 11:
|
||||
case 12:
|
||||
bar (2);
|
||||
break;
|
||||
case 0:
|
||||
case 1:
|
||||
case 8:
|
||||
case 13:
|
||||
case 16:
|
||||
bar (3);
|
||||
break;
|
||||
case 14:
|
||||
bar (4);
|
||||
break;
|
||||
default:
|
||||
bar (5);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void *fooaddr = (void *) foo;
|
||||
|
||||
void
|
||||
bar (int x)
|
||||
{
|
||||
__asm __volatile ("" : : "r" (x));
|
||||
}
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
return 0;
|
||||
}
|
47
gcc/varasm.c
47
gcc/varasm.c
|
@ -547,6 +547,53 @@ function_section (tree decl)
|
|||
}
|
||||
}
|
||||
|
||||
/* Switch to read-only data section associated with function DECL. */
|
||||
|
||||
void
|
||||
default_function_rodata_section (tree decl)
|
||||
{
|
||||
if (decl != NULL_TREE && DECL_SECTION_NAME (decl))
|
||||
{
|
||||
const char *name = TREE_STRING_POINTER (DECL_SECTION_NAME (decl));
|
||||
|
||||
/* For .gnu.linkonce.t.foo we want to use .gnu.linkonce.r.foo. */
|
||||
if (DECL_ONE_ONLY (decl) && strncmp (name, ".gnu.linkonce.t.", 16) == 0)
|
||||
{
|
||||
size_t len = strlen (name) + 1;
|
||||
char *rname = alloca (len);
|
||||
|
||||
memcpy (rname, name, len);
|
||||
rname[14] = 'r';
|
||||
named_section_flags (rname, SECTION_LINKONCE);
|
||||
return;
|
||||
}
|
||||
/* For .text.foo we want to use .rodata.foo. */
|
||||
else if (flag_function_sections && flag_data_sections
|
||||
&& strncmp (name, ".text.", 6) == 0)
|
||||
{
|
||||
size_t len = strlen (name) + 1;
|
||||
char *rname = alloca (len + 2);
|
||||
|
||||
memcpy (rname, ".rodata", 7);
|
||||
memcpy (rname + 7, name + 5, len - 5);
|
||||
named_section_flags (rname, 0);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
readonly_data_section ();
|
||||
}
|
||||
|
||||
/* Switch to read-only data section associated with function DECL
|
||||
for targets where that section should be always the single
|
||||
readonly data section. */
|
||||
|
||||
void
|
||||
default_no_function_rodata_section (tree decl ATTRIBUTE_UNUSED)
|
||||
{
|
||||
readonly_data_section ();
|
||||
}
|
||||
|
||||
/* Switch to section for variable DECL. RELOC is the same as the
|
||||
argument to SELECT_SECTION. */
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue