stormy16.h (ASM_OUTPUT_MI_THUNK): Call stormy16_asm_output_mi_thunk.

* config/stormy16/stormy16.h (ASM_OUTPUT_MI_THUNK): Call
	stormy16_asm_output_mi_thunk.
	* config/stormy16/stormy16.c (stormy16_asm_output_mi_thunk): New
	function.
	* config/stormy16/stormy16-protos.h
	(stormy16_asm_output_mi_thunk): New prototype.

From-SVN: r46762
This commit is contained in:
Geoffrey Keating 2001-11-04 07:37:48 +00:00 committed by Geoffrey Keating
parent cb3f834fb6
commit 52560c7b98
4 changed files with 56 additions and 6 deletions

View File

@ -1,3 +1,12 @@
2001-11-03 Geoffrey Keating <geoffk@redhat.com>
* config/stormy16/stormy16.h (ASM_OUTPUT_MI_THUNK): Call
stormy16_asm_output_mi_thunk.
* config/stormy16/stormy16.c (stormy16_asm_output_mi_thunk): New
function.
* config/stormy16/stormy16-protos.h
(stormy16_asm_output_mi_thunk): New prototype.
2001-11-04 Joseph S. Myers <jsm28@cam.ac.uk>
* ChangeLog.2, ChangeLog.4, ChangeLog.5, ChangeLog,

View File

@ -46,6 +46,7 @@ extern void stormy16_expand_builtin_va_start PARAMS ((int, tree, rtx));
extern rtx stormy16_expand_builtin_va_arg PARAMS ((tree, tree));
extern void stormy16_initialize_trampoline PARAMS ((rtx, rtx, rtx));
extern rtx stormy16_function_value PARAMS ((tree, tree));
extern void stormy16_asm_output_mi_thunk PARAMS ((FILE *, tree, int, tree));
#endif
#ifdef RTX_CODE

View File

@ -1335,6 +1335,51 @@ stormy16_function_value (valtype, func)
return gen_rtx_REG (mode, RETURN_VALUE_REGNUM);
}
/* A C compound statement that outputs the assembler code for a thunk function,
used to implement C++ virtual function calls with multiple inheritance. The
thunk acts as a wrapper around a virtual function, adjusting the implicit
object parameter before handing control off to the real function.
First, emit code to add the integer DELTA to the location that contains the
incoming first argument. Assume that this argument contains a pointer, and
is the one used to pass the `this' pointer in C++. This is the incoming
argument *before* the function prologue, e.g. `%o0' on a sparc. The
addition must preserve the values of all other incoming arguments.
After the addition, emit code to jump to FUNCTION, which is a
`FUNCTION_DECL'. This is a direct pure jump, not a call, and does not touch
the return address. Hence returning from FUNCTION will return to whoever
called the current `thunk'.
The effect must be as if @var{function} had been called directly
with the adjusted first argument. This macro is responsible for
emitting all of the code for a thunk function;
TARGET_ASM_FUNCTION_PROLOGUE and TARGET_ASM_FUNCTION_EPILOGUE are
not invoked.
The THUNK_FNDECL is redundant. (DELTA and FUNCTION have already been
extracted from it.) It might possibly be useful on some targets, but
probably not. */
void
stormy16_asm_output_mi_thunk (file, thunk_fndecl, delta, function)
FILE *file;
tree thunk_fndecl ATTRIBUTE_UNUSED;
int delta;
tree function;
{
int regnum = FIRST_ARGUMENT_REGISTER;
/* There might be a hidden first argument for a returned structure. */
if (aggregate_value_p (TREE_TYPE (TREE_TYPE (function))))
regnum += 1;
fprintf (file, "\tadd %s,#0x%x\n", reg_names[regnum], (delta) & 0xFFFF);
fputs ("\tjmpf ", file);
assemble_name (file, XSTR (XEXP (DECL_RTL (function), 0), 0));
putc ('\n', file);
}
/* Mark functions with SYMBOL_REF_FLAG. */
void

View File

@ -2435,12 +2435,7 @@ typedef int CUMULATIVE_ARGS;
FUNCTION instead of jumping to it. The generic approach does not support
varargs. */
#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION) \
{ \
fprintf (FILE, "\tadd r2,#0x%x\n", (DELTA) & 0xFFFF); \
fputs ("\tjmpf ", FILE); \
assemble_name (FILE, XSTR (XEXP (DECL_RTL (function), 0), 0)); \
putc ('\n', FILE); \
}
stormy16_asm_output_mi_thunk (FILE, THUNK_FNDECL, DELTA, FUNCTION)
/* Generating Code for Profiling. */