+2000-12-15 Alexandre Oliva <aoliva@redhat.com>
+
+ * function.c (adjust_trampoline_addr): New function.
+ (trampoline_address): Call it instead of round_trampoline_addr().
+ * tm.texi (TRAMPOLINE_ADJUST_ADDRESS): Document it.
+
2000-12-14 Zack Weinberg <zack@wolery.stanford.edu>
* cppfiles.c (hack_vms_include_specification): Delete function
tree));
#endif
static rtx round_trampoline_addr PARAMS ((rtx));
+static rtx adjust_trampoline_addr PARAMS ((rtx));
static tree *identify_blocks_1 PARAMS ((rtx, tree *, tree *, tree *));
static void reorder_blocks_1 PARAMS ((rtx, tree, varray_type *));
static tree blocks_nreverse PARAMS ((tree));
for (link = trampoline_list; link; link = TREE_CHAIN (link))
if (TREE_PURPOSE (link) == function)
return
- round_trampoline_addr (XEXP (RTL_EXPR_RTL (TREE_VALUE (link)), 0));
+ adjust_trampoline_addr (XEXP (RTL_EXPR_RTL (TREE_VALUE (link)), 0));
for (fp = outer_function_chain; fp; fp = fp->next)
for (link = fp->x_trampoline_list; link; link = TREE_CHAIN (link))
{
tramp = fix_lexical_addr (XEXP (RTL_EXPR_RTL (TREE_VALUE (link)), 0),
function);
- return round_trampoline_addr (tramp);
+ return adjust_trampoline_addr (tramp);
}
/* None exists; we must make one. */
}
tramp = fix_lexical_addr (XEXP (tramp, 0), function);
- return round_trampoline_addr (tramp);
+ return adjust_trampoline_addr (tramp);
}
/* Given a trampoline address,
#endif
return tramp;
}
+
+/* Given a trampoline address, round it then apply any
+ platform-specific adjustments so that the result can be used for a
+ function call . */
+
+static rtx
+adjust_trampoline_addr (tramp)
+ rtx tramp;
+{
+ tramp = round_trampoline_addr (tramp);
+#ifdef TRAMPOLINE_ADJUST_ADDRESS
+ TRAMPOLINE_ADJUST_ADDRESS (tramp);
+#endif
+ return tramp;
+}
\f
/* Put all this function's BLOCK nodes including those that are chained
onto the first block into a vector, and return it.
RTX for the static chain value that should be passed to the function
when it is called.
+@findex TRAMPOLINE_ADJUST_ADDRESS
+@item TRAMPOLINE_ADJUST_ADDRESS (@var{addr})
+A C statement that should perform any machine-specific adjustment in
+the address of the trampoline. Its argument contains the address that
+was passed to @code{INITIALIZE_TRAMPOLINE}. In case the address to be
+used for a function call should be different from the address in which
+the template was stored, the different address should be assigned to
+@var{addr}. If this macro is not defined, @var{addr} will be used for
+function calls.
+
@findex ALLOCATE_TRAMPOLINE
@item ALLOCATE_TRAMPOLINE (@var{fp})
A C expression to allocate run-time space for a trampoline. The