aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2007-03-21 05:21:31 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2007-03-21 05:21:31 +0000
commit9f2966203fa776ec02ce2963ca1c6aeb1473234b (patch)
tree6cfa6c062bc3b71e9372d7e6b1838f9a254fee6f /gcc
parent22d33984e2a3df1ee5821564d8c4f47ff106c198 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/config/arm/arm.c34
-rw-r--r--gcc/config/arm/elf.h3
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