* config/stormy16/stormy16.h (ASM_OUTPUT_MI_THUNK): Call
authorgeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 4 Nov 2001 07:37:48 +0000 (07:37 +0000)
committergeoffk <geoffk@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 4 Nov 2001 07:37:48 +0000 (07:37 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@46762 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/stormy16/stormy16-protos.h
gcc/config/stormy16/stormy16.c
gcc/config/stormy16/stormy16.h

index 0c8e9f1..d955a32 100644 (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,
index 39a8453..2e96055 100644 (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
index 6b69e5c..ef4951d 100644 (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
index 7ca09e1..e3bedf5 100644 (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)
 
 \f
 /* Generating Code for Profiling.  */