diff options
author | H.J. Lu <hongjiu.lu@intel.com> | 2011-08-20 20:02:17 +0000 |
---|---|---|
committer | H.J. Lu <hjl@gcc.gnu.org> | 2011-08-20 13:02:17 -0700 |
commit | 9ce7ad7f3a7f61fd62ac81544af04f95368f597f (patch) | |
tree | 3906273c1671420742bbbcd2e6b652c9b3f19c95 /gcc/varasm.c | |
parent | 13001f33ca62776df6dddf738d6f3f8633c3f3a9 (diff) | |
download | gcc-9ce7ad7f3a7f61fd62ac81544af04f95368f597f.zip gcc-9ce7ad7f3a7f61fd62ac81544af04f95368f597f.tar.gz gcc-9ce7ad7f3a7f61fd62ac81544af04f95368f597f.tar.bz2 |
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.
From-SVN: r177933
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 ca56813..218baf3 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" |