unix.h (ASM_OUTPUT_MI_THUNK): Define.
authorStan Cox <coxs@gnu.org>
Fri, 17 May 1996 17:49:21 +0000 (17:49 +0000)
committerStan Cox <coxs@gnu.org>
Fri, 17 May 1996 17:49:21 +0000 (17:49 +0000)
{att.h,bsd.h,sun386.h} (ASM_OUTPUT_MI_THUNK): Delete.

From-SVN: r12010

gcc/config/i386/att.h
gcc/config/i386/bsd.h
gcc/config/i386/sun386.h
gcc/config/i386/unix.h

index 3612cd2acfac8c4d9e08a3c647e0b204428c2aa4..ef095b7a67fbbe010afa6280f64fdb307c3713d3 100644 (file)
@@ -93,14 +93,3 @@ do                                                           \
 #define ASM_OUTPUT_LABELREF(FILE,NAME) \
   fprintf (FILE, "%s", NAME)
 
-/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
-   Used for C++ multiple inheritance.  */
-
-#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION)          \
-do {                                                                      \
-  fprintf (FILE, "\taddl $%d,%s\n\tjmp ", DELTA,                          \
-        i386_regparm > 0 ? "%eax" : "4(%esp)");                           \
-  assemble_name (FILE, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (FUNCTION))); \
-  fprintf (FILE, "\n");                                                           \
-} while (0)
-
index 4f8bdfe1459b517ecff45da08ebc793cedc142c1..6bf7399dc31203049b9d92268ea20f7db1aec160 100644 (file)
@@ -123,18 +123,6 @@ Boston, MA 02111-1307, USA.  */
 #define ASM_OUTPUT_LABELREF(FILE,NAME) fprintf (FILE, "_%s", NAME)
 #endif /* not NO_UNDERSCORES */
 
-/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
-   Used for C++ multiple inheritance.  */
-
-#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION)          \
-do {                                                                      \
-  fprintf (FILE, "\taddl $%d,%s\n\tjmp ", DELTA,                          \
-        i386_regparm > 0 ? "%eax" : "4(%esp)");                           \
-  assemble_name (FILE, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (FUNCTION))); \
-  fprintf (FILE, "\n");                                                           \
-} while (0)
-
-
 /* Sequent has some changes in the format of DBX symbols.  */
 #define DBX_NO_XREFS 1
 
index 0046e7403247a914703d3aac0aa50bd3723d876a..6e2680789bdbc94768c2594469754d3e0de6ac5f 100644 (file)
@@ -141,14 +141,3 @@ do                                                         \
 
 #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)     \
   fprintf (FILE, ".%s%d:\n", PREFIX, NUM)
-
-/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
-   Used for C++ multiple inheritance.  */
-
-#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION)          \
-do {                                                                      \
-  fprintf (FILE, "\taddl $%d,%s\n\tjmp ", DELTA,                          \
-        i386_regparm > 0 ? "%eax" : "4(%esp)");                           \
-  assemble_name (FILE, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (FUNCTION))); \
-  fprintf (FILE, "\n");                                                           \
-} while (0)
index f38fe270d89ec2294edc8aa323f72193ee39f423..237ff9a64236d0863470b1121ab88db112369d88 100644 (file)
@@ -146,3 +146,44 @@ Boston, MA 02111-1307, USA.  */
 #define FUNCTION_VALUE_REGNO_P(N) \
   ((N) == 0 || ((N)== FIRST_FLOAT_REG && TARGET_FLOAT_RETURNS_IN_80387))
 
+/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
+   Used for C++ multiple inheritance.  */
+#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION)         \
+do {                                                                     \
+  tree parm;                                                             \
+                                                                         \
+  if (i386_regparm > 0)                                                          \
+    parm = TYPE_ARG_TYPES (TREE_TYPE (function));                        \
+  else                                                                   \
+    parm = NULL_TREE;                                                    \
+  for (; parm; parm = TREE_CHAIN (parm))                                 \
+    if (TREE_VALUE (parm) == void_type_node)                             \
+      break;                                                             \
+  fprintf (FILE, "\taddl $%d,%s\n", DELTA, parm ? "%eax" : "4(%esp)");   \
+                                                                         \
+  if (flag_pic)                                                                  \
+    {                                                                    \
+      rtx xops[2];                                                       \
+      xops[0] = pic_offset_table_rtx;                                    \
+      xops[1] = (rtx) gen_label_rtx ();                                          \
+                                                                         \
+      if (i386_regparm > 2)                                              \
+       abort ();                                                         \
+      output_asm_insn ("push%L0 %0", xops);                              \
+      output_asm_insn (AS1 (call,%P1), xops);                            \
+      ASM_OUTPUT_INTERNAL_LABEL (FILE, "L", CODE_LABEL_NUMBER (xops[1])); \
+      output_asm_insn (AS1 (pop%L0,%0), xops);                           \
+      output_asm_insn ("addl $_GLOBAL_OFFSET_TABLE_+[.-%P1],%0", xops);          \
+      fprintf (FILE, "\tmovl ");                                         \
+      assemble_name                                                      \
+       (FILE, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (FUNCTION)));      \
+      fprintf (FILE, "@GOT(%%ebx),%%ecx\n\tpopl %%ebx\n\tjmp *%%ecx\n");  \
+    }                                                                    \
+  else                                                                   \
+    {                                                                    \
+      fprintf (FILE, "\tjmp ");                                                  \
+      assemble_name                                                      \
+       (FILE, IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (FUNCTION)));      \
+      fprintf (FILE, "\n");                                              \
+    }                                                                    \
+} while (0)