diff options
author | Mark Mitchell <mark@codesourcery.com> | 2007-03-21 05:21:31 +0000 |
---|---|---|
committer | Mark Mitchell <mmitchel@gcc.gnu.org> | 2007-03-21 05:21:31 +0000 |
commit | 9f2966203fa776ec02ce2963ca1c6aeb1473234b (patch) | |
tree | 6cfa6c062bc3b71e9372d7e6b1838f9a254fee6f /gcc | |
parent | 22d33984e2a3df1ee5821564d8c4f47ff106c198 (diff) | |
download | gcc-9f2966203fa776ec02ce2963ca1c6aeb1473234b.zip gcc-9f2966203fa776ec02ce2963ca1c6aeb1473234b.tar.gz gcc-9f2966203fa776ec02ce2963ca1c6aeb1473234b.tar.bz2 |
elf.h (TARGET_ASM_DESTRUCTOR): Define.
* config/arm/elf.h (TARGET_ASM_DESTRUCTOR): Define.
* config/arm/arm.c (arm_elf_asm_cdtor): New function.
(arm_elf_asm_constructor): Use it.
(arm_elf_asm_destructor): New function.
From-SVN: r123103
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 34 | ||||
-rw-r--r-- | gcc/config/arm/elf.h | 3 |
3 files changed, 37 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index df9c1ec..a3db8db 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-03-20 Mark Mitchell <mark@codesourcery.com> + + * config/arm/elf.h (TARGET_ASM_DESTRUCTOR): Define. + * config/arm/arm.c (arm_elf_asm_cdtor): New function. + (arm_elf_asm_constructor): Use it. + (arm_elf_asm_destructor): New function. + 2007-03-20 Bernd Schmidt <bernd.schmidt@analog.com> * jump.c (mark_jump_label): Treat SEQUENCE specially. diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index cab9ead..c6b06da 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -150,6 +150,7 @@ static int arm_arg_partial_bytes (CUMULATIVE_ARGS *, enum machine_mode, #ifdef OBJECT_FORMAT_ELF static void arm_elf_asm_constructor (rtx, int); +static void arm_elf_asm_destructor (rtx, int); #endif #ifndef ARM_PE static void arm_encode_section_info (tree, rtx, int); @@ -12048,17 +12049,16 @@ arm_assemble_integer (rtx x, unsigned int size, int aligned_p) return default_assemble_integer (x, size, aligned_p); } - -/* Add a function to the list of static constructors. */ - static void -arm_elf_asm_constructor (rtx symbol, int priority) +arm_elf_asm_cdtor (rtx symbol, int priority, bool is_ctor) { section *s; if (!TARGET_AAPCS_BASED) { - default_named_section_asm_out_constructor (symbol, priority); + (is_ctor ? + default_named_section_asm_out_constructor + : default_named_section_asm_out_destructor) (symbol, priority); return; } @@ -12066,11 +12066,15 @@ arm_elf_asm_constructor (rtx symbol, int priority) if (priority != DEFAULT_INIT_PRIORITY) { char buf[18]; - sprintf (buf, ".init_array.%.5u", priority); + sprintf (buf, "%s.%.5u", + is_ctor ? ".init_array" : ".fini_array", + priority); s = get_section (buf, SECTION_WRITE, NULL_TREE); } - else + else if (is_ctor) s = ctors_section; + else + s = dtors_section; switch_to_section (s); assemble_align (POINTER_SIZE); @@ -12078,6 +12082,22 @@ arm_elf_asm_constructor (rtx symbol, int priority) output_addr_const (asm_out_file, symbol); fputs ("(target1)\n", asm_out_file); } + +/* Add a function to the list of static constructors. */ + +static void +arm_elf_asm_constructor (rtx symbol, int priority) +{ + arm_elf_asm_cdtor (symbol, priority, /*is_ctor=*/true); +} + +/* Add a function to the list of static destructors. */ + +static void +arm_elf_asm_destructor (rtx symbol, int priority) +{ + arm_elf_asm_cdtor (symbol, priority, /*is_ctor=*/false); +} #endif /* A finite state machine takes care of noticing whether or not instructions diff --git a/gcc/config/arm/elf.h b/gcc/config/arm/elf.h index 41bc774..89584ce 100644 --- a/gcc/config/arm/elf.h +++ b/gcc/config/arm/elf.h @@ -127,6 +127,9 @@ #undef TARGET_ASM_CONSTRUCTOR #define TARGET_ASM_CONSTRUCTOR arm_elf_asm_constructor +#undef TARGET_ASM_DESTRUCTOR +#define TARGET_ASM_DESTRUCTOR arm_elf_asm_destructor + /* For PIC code we need to explicitly specify (PLT) and (GOT) relocs. */ #define NEED_PLT_RELOC flag_pic #define NEED_GOT_RELOC flag_pic |