aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2009-09-22 08:11:53 -0700
committerRichard Henderson <rth@gcc.gnu.org>2009-09-22 08:11:53 -0700
commit672f0baaec5def33eb97a0936844a4f18b417e87 (patch)
tree01db6de858fc7d7920a29d31b3265148fe4ab3d2
parent2d7b663adf5e348d6a83fb742668d50d5509c401 (diff)
downloadgcc-672f0baaec5def33eb97a0936844a4f18b417e87.zip
gcc-672f0baaec5def33eb97a0936844a4f18b417e87.tar.gz
gcc-672f0baaec5def33eb97a0936844a4f18b417e87.tar.bz2
arc.h (TRAMPOLINE_ALIGNMENT): New.
* config/arc/arc.h (TRAMPOLINE_ALIGNMENT): New. (TRAMPOLINE_TEMPLATE): Merge with ... (INITIALIZE_TRAMPOLINE): ... this and move ... * config/arc/arc.c (arc_trampoline_init): ... here. (TARGET_TRAMPOLINE_INIT): New. From-SVN: r151985
-rw-r--r--gcc/ChangeLog20
-rw-r--r--gcc/config/arc/arc.c41
-rw-r--r--gcc/config/arc/arc.h33
3 files changed, 55 insertions, 39 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 999f019..a852c4a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -35,14 +35,20 @@
targetm.asm_out.trampoline_template. Make the memory block const
and set its size.
- * config/alpha/alpha.c (alpha_trampoline_init): Rename from
- alpha_initialize_trampoline. Make static. Merge VMS parameter
- differences into the TARGET_ABI_OPEN_VMS code block.
+ * config/alpha/alpha.c (alpha_trampoline_init): Rename from
+ alpha_initialize_trampoline. Make static. Merge VMS parameter
+ differences into the TARGET_ABI_OPEN_VMS code block.
+ (TARGET_TRAMPOLINE_INIT): New.
+ * config/alpha/alpha.h (TRAMPOLINE_TEMPLATE): Remove.
+ (TRAMPOLINE_SECTION, INITIALIZE_TRAMPOLINE): Remove.
+ * config/alpha/vms.h (TRAMPOLINE_SIZE, TRAMPOLINE_ALIGNMENT): Remove.
+ (INITIALIZE_TRAMPOLINE): Remove.
+
+ * config/arc/arc.h (TRAMPOLINE_ALIGNMENT): New.
+ (TRAMPOLINE_TEMPLATE): Merge with ...
+ (INITIALIZE_TRAMPOLINE): ... this and move ...
+ * config/arc/arc.c (arc_trampoline_init): ... here.
(TARGET_TRAMPOLINE_INIT): New.
- * config/alpha/alpha.h (TRAMPOLINE_TEMPLATE): Remove.
- (TRAMPOLINE_SECTION, INITIALIZE_TRAMPOLINE): Remove.
- * config/alpha/vms.h (TRAMPOLINE_SIZE, TRAMPOLINE_ALIGNMENT): Remove.
- (INITIALIZE_TRAMPOLINE): Remove.
2009-09-22 Richard Guenther <rguenther@suse.de>
diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
index f53c898..9239a34 100644
--- a/gcc/config/arc/arc.c
+++ b/gcc/config/arc/arc.c
@@ -94,6 +94,8 @@ static void arc_external_libcall (rtx);
static bool arc_return_in_memory (const_tree, const_tree);
static bool arc_pass_by_reference (CUMULATIVE_ARGS *, enum machine_mode,
const_tree, bool);
+static void arc_trampoline_init (rtx, tree, rtx);
+
/* ARC specific attributs. */
@@ -151,6 +153,9 @@ static const struct attribute_spec arc_attribute_table[] =
#undef TARGET_EXPAND_BUILTIN_VA_START
#define TARGET_EXPAND_BUILTIN_VA_START arc_va_start
+#undef TARGET_TRAMPOLINE_INIT
+#define TARGET_TRAMPOLINE_INIT arc_trampoline_init
+
struct gcc_target targetm = TARGET_INITIALIZER;
/* Implement TARGET_HANDLE_OPTION. */
@@ -2343,3 +2348,39 @@ arc_pass_by_reference (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED,
return size > 8;
}
+
+/* Trampolines. */
+/* ??? This doesn't work yet because GCC will use as the address of a nested
+ function the address of the trampoline. We need to use that address
+ right shifted by 2. It looks like we'll need PSImode after all. :-(
+
+ ??? The above comment sounds like it's doable via
+ TARGET_TRAMPOLINE_ADJUST_ADDRESS; no PSImode needed.
+
+ On the ARC, the trampoline is quite simple as we have 32-bit immediate
+ constants.
+
+ mov r24,STATIC
+ j.nd FUNCTION
+*/
+
+static void
+arc_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
+{
+ rtx fnaddr = XEXP (DECL_RTX (fndecl), 0);
+ rtx mem;
+
+ mem = adjust_address (m_tramp, SImode, 0);
+ emit_move_insn (mem, GEN_INT (0x631f7c00));
+
+ mem = adjust_address (m_tramp, SImode, 4);
+ emit_move_insn (mem, chain_value);
+
+ mem = adjust_address (m_tramp, SImode, 8);
+ emit_move_insn (mem, GEN_INT (0x381f0000));
+
+ mem = adjust_address (m_tramp, SImode, 12);
+ emit_move_insn (mem, fnaddr);
+
+ emit_insn (gen_flush_icache (m_tramp));
+}
diff --git a/gcc/config/arc/arc.h b/gcc/config/arc/arc.h
index e19048d..5127a12 100644
--- a/gcc/config/arc/arc.h
+++ b/gcc/config/arc/arc.h
@@ -657,39 +657,8 @@ arc_eligible_for_epilogue_delay (TRIAL, SLOTS_FILLED)
for profiling a function entry. */
#define FUNCTION_PROFILER(FILE, LABELNO)
-/* Trampolines. */
-/* ??? This doesn't work yet because GCC will use as the address of a nested
- function the address of the trampoline. We need to use that address
- right shifted by 2. It looks like we'll need PSImode after all. :-( */
-
-/* Output assembler code for a block containing the constant parts
- of a trampoline, leaving space for the variable parts. */
-/* On the ARC, the trampoline is quite simple as we have 32-bit immediate
- constants.
-
- mov r24,STATIC
- j.nd FUNCTION
-*/
-#define TRAMPOLINE_TEMPLATE(FILE) \
-do { \
- assemble_aligned_integer (UNITS_PER_WORD, GEN_INT (0x631f7c00)); \
- assemble_aligned_integer (UNITS_PER_WORD, const0_rtx); \
- assemble_aligned_integer (UNITS_PER_WORD, GEN_INT (0x381f0000)); \
- assemble_aligned_integer (UNITS_PER_WORD, const0_rtx); \
-} while (0)
-
-/* Length in units of the trampoline for entering a nested function. */
+#define TRAMPOLINE_ALIGNMENT 32
#define TRAMPOLINE_SIZE 16
-
-/* Emit RTL insns to initialize the variable parts of a trampoline.
- FNADDR is an RTX for the address of the function's pure code.
- CXT is an RTX for the static chain value for the function. */
-#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
-do { \
- emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 4)), CXT); \
- emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 12)), FNADDR); \
- emit_insn (gen_flush_icache (validize_mem (gen_rtx_MEM (SImode, TRAMP)))); \
-} while (0)
/* Addressing modes, and classification of registers for them. */