[arm] attribute((init_priority(N))) on ARM EABI.

Paul Brook paul@codesourcery.com
Thu Nov 2 19:16:00 GMT 2006


The patch below implements attribute((init_priority(N))) on ARM EABI based 
targets. The EABI itself doesn't support constructor priorities.  However as 
this is a gcc extension it seems reasonable to have corresponding linker 
extensions to implement it.

Tested on arm-none-eabi.
This is a merge from branches/csl/sourcerygxx-4_1.
Applied to mainline.

Paul

2006-11-02  Paul Brook  <paul@codesourcery.com>

	* config/arm/arm.c (arm_elf_asm_constructor): Remove ATTRIBUTE_UNUSED
	from priority argument.  Use different section for non-default
	priority.
	* config/arm/elf.h: Remove definition of SUPPORTS_INIT_PRIORITY.

Index: gcc/config/arm/elf.h
===================================================================
--- gcc/config/arm/elf.h	(revision 118417)
+++ gcc/config/arm/elf.h	(working copy)
@@ -149,5 +149,3 @@
     }							\
   while (0)
 
-/* The EABI doesn't provide a way of implementing init_priority.  */
-#define SUPPORTS_INIT_PRIORITY (!TARGET_AAPCS_BASED)
Index: gcc/config/arm/arm.c
===================================================================
--- gcc/config/arm/arm.c	(revision 118417)
+++ gcc/config/arm/arm.c	(working copy)
@@ -11349,8 +11349,10 @@ arm_assemble_integer (rtx x, unsigned in
 /* Add a function to the list of static constructors.  */
 
 static void
-arm_elf_asm_constructor (rtx symbol, int priority ATTRIBUTE_UNUSED)
+arm_elf_asm_constructor (rtx symbol, int priority)
 {
+  section *s;
+
   if (!TARGET_AAPCS_BASED)
     {
       default_named_section_asm_out_constructor (symbol, priority);
@@ -11358,7 +11360,16 @@ arm_elf_asm_constructor (rtx symbol, int
     }
 
   /* Put these in the .init_array section, using a special relocation.  */
-  switch_to_section (ctors_section);
+  if (priority != DEFAULT_INIT_PRIORITY)
+    {
+      char buf[18];
+      sprintf (buf, ".init_array.%.5u", priority);
+      s = get_section (buf, SECTION_WRITE, NULL_TREE);
+    }
+  else
+    s = ctors_section;
+
+  switch_to_section (s);
   assemble_align (POINTER_SIZE);
   fputs ("\t.word\t", asm_out_file);
   output_addr_const (asm_out_file, symbol);



More information about the Gcc-patches mailing list