diff options
author | hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-08-20 20:02:17 +0000 |
---|---|---|
committer | hjl <hjl@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-08-20 20:02:17 +0000 |
commit | ef1da8054ee3090992170a0b0e2b69983347a1af (patch) | |
tree | 3906273c1671420742bbbcd2e6b652c9b3f19c95 /gcc/varasm.c | |
parent | 61bc1860cb0921581b1e23bf22f11c02e765512e (diff) | |
download | gcc-ef1da8054ee3090992170a0b0e2b69983347a1af.tar.gz |
Use .init_arrary/.fini_array sections if possible.
2011-08-20 H.J. Lu <hongjiu.lu@intel.com>
PR other/46770
* config.gcc (tm_file): Add initfini-array.h if
.init_arrary/.fini_array are supported.
* crtstuff.c: Don't generate .ctors nor .dtors sections if
USE_INITFINI_ARRAY is defined.
* output.h (default_elf_init_array_asm_out_constructor): New.
(default_elf_fini_array_asm_out_destructor): Likewise.
* varasm.c (elf_init_array_section): Likewise.
(elf_fini_array_section): Likewise.
(get_elf_initfini_array_priority_section): Likewise.
(default_elf_init_array_asm_out_constructor): Likewise.
(default_elf_fini_array_asm_out_destructor): Likewise.
* config/initfini-array.h: New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177933 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r-- | gcc/varasm.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c index ca568136cb3..218baf3bcf2 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -7352,4 +7352,62 @@ make_debug_expr_from_rtl (const_rtx exp) return dval; } +static GTY(()) section *elf_init_array_section; +static GTY(()) section *elf_fini_array_section; + +static section * +get_elf_initfini_array_priority_section (int priority, + bool constructor_p) +{ + section *sec; + if (priority != DEFAULT_INIT_PRIORITY) + { + char buf[18]; + sprintf (buf, "%s.%.5u", + constructor_p ? ".init_array" : ".fini_array", + priority); + sec = get_section (buf, SECTION_WRITE, NULL_TREE); + } + else + { + if (constructor_p) + { + if (elf_init_array_section == NULL) + elf_init_array_section + = get_unnamed_section (0, output_section_asm_op, + "\t.section\t.init_array"); + sec = elf_init_array_section; + } + else + { + if (elf_fini_array_section == NULL) + elf_fini_array_section + = get_unnamed_section (0, output_section_asm_op, + "\t.section\t.fini_array"); + sec = elf_fini_array_section; + } + } + return sec; +} + +/* Use .init_array section for constructors. */ + +void +default_elf_init_array_asm_out_constructor (rtx symbol, int priority) +{ + section *sec = get_elf_initfini_array_priority_section (priority, + true); + assemble_addr_to_section (symbol, sec); +} + +/* Use .fini_array section for destructors. */ + +void +default_elf_fini_array_asm_out_destructor (rtx symbol, int priority) +{ + section *sec = get_elf_initfini_array_priority_section (priority, + false); + assemble_addr_to_section (symbol, sec); +} + #include "gt-varasm.h" |