V.4 PIC changes

From-SVN: r12331
This commit is contained in:
Michael Meissner 1996-06-25 18:51:50 +00:00
parent 24f3076729
commit d266da75ae
4 changed files with 41 additions and 11 deletions

View File

@ -44,10 +44,7 @@
.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__

View File

@ -2047,6 +2047,42 @@ ccr_bit (op, scc_p)
abort ();
}
}
/* 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);
}
}
}
/* Print an operand. Recognize special options, documented below. */

View 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 ();

View File

@ -4953,10 +4953,7 @@
"
{
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)
@ -7179,7 +7176,7 @@
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")])
@ -7249,7 +7246,7 @@
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")])