From d266da75aef5134e076ab4716d793807a3d8457a Mon Sep 17 00:00:00 2001 From: Michael Meissner Date: Tue, 25 Jun 1996 18:51:50 +0000 Subject: [PATCH] V.4 PIC changes From-SVN: r12331 --- gcc/config/rs6000/eabi-ci.asm | 3 --- gcc/config/rs6000/rs6000.c | 36 +++++++++++++++++++++++++++++++++++ gcc/config/rs6000/rs6000.h | 4 ++-- gcc/config/rs6000/rs6000.md | 9 +++------ 4 files changed, 41 insertions(+), 11 deletions(-) diff --git a/gcc/config/rs6000/eabi-ci.asm b/gcc/config/rs6000/eabi-ci.asm index 872a9e66565..6b753ca1239 100644 --- a/gcc/config/rs6000/eabi-ci.asm +++ b/gcc/config/rs6000/eabi-ci.asm @@ -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__ diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index cbbf1cb0d5e..5a097d69449 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -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. */ diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 2cea3e73ec7..f157f0ec01b 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -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 (); diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 2c3f4eddd44..be5c4f354c4 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -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")]) -- 2.30.2