V.4 PIC changes
authorMichael Meissner <meissner@gcc.gnu.org>
Tue, 25 Jun 1996 18:51:50 +0000 (18:51 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Tue, 25 Jun 1996 18:51:50 +0000 (18:51 +0000)
From-SVN: r12331

gcc/config/rs6000/eabi-ci.asm
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.h
gcc/config/rs6000/rs6000.md

index 872a9e66565dec27c5756e27f30672b25854f372..6b753ca1239f0e1fb9755f1f1815ea29a2b66ba4 100644 (file)
        .section ".got","aw"
        .globl  __GOT_START__
        .type   __GOT_START__,@object
-       .weak   _GLOBAL_OFFSET_TABLE_
-       .type   _GLOBAL_OFFSET_TABLE_,@object
 __GOT_START__:
-_GLOBAL_OFFSET_TABLE_:
 
        .section ".got1","aw"
        .globl  __GOT1_START__
index cbbf1cb0d5eb57227c72e8cb2a555ef9064283f6..5a097d6944923f431ebbf5280a08a97a77f2d2ac 100644 (file)
@@ -2047,6 +2047,42 @@ ccr_bit (op, scc_p)
       abort ();
     }
 }
+\f
+/* By generating position-independent code, when two different
+   programs (A and B) share a common library (libC.a), the text of
+   the library can be shared whether or not the library is linked at
+   the same address for both programs.  In some of these
+   environments, position-independent code requires not only the use
+   of different addressing modes, but also special code to enable the
+   use of these addressing modes.
+
+   The `FINALIZE_PIC' macro serves as a hook to emit these special
+   codes once the function is being compiled into assembly code, but
+   not before.  (It is not done before, because in the case of
+   compiling an inline function, it would lead to multiple PIC
+   prologues being included in functions which used inline functions
+   and were compiled to assembly language.)  */
+
+void
+rs6000_finalize_pic ()
+{
+  if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
+    {
+      /* If a PIC register has been created, insert the pic initialization
+        at the function beginning.  */
+      if (pic_offset_table_rtx)
+       {
+         rtx insn = get_insns ();
+         rtx init = gen_init_v4_pic (pic_offset_table_rtx);
+
+         if (GET_CODE (insn) == NOTE)
+           insn = next_nonnote_insn (insn);
+
+         emit_insn_before (init, insn);
+       }
+    }
+}
+
 \f
 /* Print an operand.  Recognize special options, documented below.  */
 
index 2cea3e73ec75be00af8146ef63f9c62259126b08..f157f0ec01bf53bd540c74139e1a5332d016b9ea 100644 (file)
@@ -1934,7 +1934,7 @@ typedef struct rs6000_args
    prologues being included in functions which used inline functions
    and were compiled to assembly language.)  */
 
-/* #define FINALIZE_PIC */
+#define FINALIZE_PIC rs6000_finalize_pic ()
 
 /* A C expression that is nonzero if X is a legitimate immediate
    operand on the target machine when generating position independent
@@ -3070,13 +3070,13 @@ extern int registers_ok_for_quad_peep ();
 extern int addrs_ok_for_quad_peep ();
 extern enum reg_class secondary_reload_class ();
 extern int ccr_bit ();
+extern void rs6000_finalize_pic ();
 extern void print_operand ();
 extern void print_operand_address ();
 extern int first_reg_to_save ();
 extern int first_fp_reg_to_save ();
 extern int rs6000_makes_calls ();
 extern rs6000_stack_t *rs6000_stack_info ();
-extern void svr4_traceback ();
 extern void output_prolog ();
 extern void output_epilog ();
 extern void output_toc ();
index 2c3f4eddd446176a9e72703768743462dc0170ca..be5c4f354c4a05f092dedd22d68f14f036ad4b00 100644 (file)
   "
 {
   if (!pic_offset_table_rtx)
-    {
-      pic_offset_table_rtx = gen_reg_rtx (SImode);
-      emit_insn (gen_init_v4_pic (pic_offset_table_rtx));
-    }
+    pic_offset_table_rtx = gen_reg_rtx (SImode);
 
   operands[2] = pic_offset_table_rtx;
   if (flag_pic > 1)
   else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS)
     output_asm_insn (\"creqv 6,6,6\", operands);
 
-  return (flag_pic) ? \"bl %z0@plt\" : \"bl %z0\";
+  return \"bl %z0\";
 }"
   [(set_attr "type" "branch")
    (set_attr "length" "4,8")])
   else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS)
     output_asm_insn (\"creqv 6,6,6\", operands);
 
-  return (flag_pic) ? \"bl %z1@plt\" : \"bl %z1\";
+  return \"bl %z1\";
 }"
   [(set_attr "type" "branch")
    (set_attr "length" "4,8")])