.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__
}
}
\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. */
#ifdef TARGET_SDATA
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
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 ();
"
{
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")])