From: Philip Blundell Date: Sat, 22 May 1999 09:40:04 +0000 (+0000) Subject: Apply patch from Philip Blundell to fix PIC support for X-Git-Tag: releases/libgcj-2.95.0~408 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=13bd191d0e2519240def60469da8764e4917ccff;p=thirdparty%2Fgcc.git Apply patch from Philip Blundell to fix PIC support for constant tables. From-SVN: r27100 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9e3bfd320736..963fdc3997ce 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +Thu May 13 09:35:51 1999 Philip Blundell + + Based on patch by Scott Bambrough and Pat Beirne: + * config/arm/arm.c (making_const_table): New variable. + * config/arm/arm.h (making_const_table): Declare. + (OUTPUT_INT_ADDR_CONST): Mark symbols as position independent if + appropriate. + * config/arm/arm.md (consttable_4, consttable_8, consttable_end): + Keep track of when we are building the constant table. + Tue May 18 17:44:22 1999 Philip Blundell * config/arm/arm.c (arm_override_options): Fix erroneous warning diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 50343430c9b7..b60f55240ed6 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -70,6 +70,9 @@ static void emit_sfm PROTO ((int, int)); static enum arm_cond_code get_arm_condition_code PROTO ((rtx)); static int const_ok_for_op RTX_CODE_PROTO ((Hint, Rcode)); +/* True if we are currently building a constant table. */ +int making_const_table; + /* Define the information needed to generate branch insns. This is stored from the compare operation. */ rtx arm_compare_op0, arm_compare_op1; @@ -277,7 +280,7 @@ arm_override_options () if (ptr->string != NULL && ptr->string[0] != '\0') { - struct processors * sel; + const struct processors * sel; for (sel = ptr->processors; sel->name != NULL; sel ++) if (streq (ptr->string, sel->name)) diff --git a/gcc/config/arm/arm.h b/gcc/config/arm/arm.h index e88bda921d6a..ac2dc05bbc0a 100644 --- a/gcc/config/arm/arm.h +++ b/gcc/config/arm/arm.h @@ -1800,7 +1800,11 @@ extern int arm_pic_register; (! symbol_mentioned_p (X) \ && (! CONSTANT_POOL_ADDRESS_P (X) \ || ! symbol_mentioned_p (get_pool_constant (X)))) - + +/* We need to know when we are making a constant pool; this determines + whether data needs to be in the GOT or can be referenced via a GOT + offset. */ +extern int making_const_table; /* Condition code information. */ @@ -2019,20 +2023,33 @@ extern struct rtx_def *arm_compare_op0, *arm_compare_op1; GET_CODE (X) == POST_DEC ? "-" : "", \ GET_MODE_SIZE (output_memory_reference_mode)); \ } \ - else output_addr_const(STREAM, X); \ + else output_addr_const (STREAM, X); \ + \ + /* Mark symbols as position independent. We only do this in the \ + .text segment, not in the .data segment. */ \ + if (NEED_PLT_GOT && flag_pic && making_const_table && \ + (GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == LABEL_REF)) \ + { \ + if (GET_CODE (X) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (X)) \ + fprintf (STREAM, "(GOTOFF)"); \ + else if (GET_CODE (X) == LABEL_REF) \ + fprintf (STREAM, "(GOTOFF)"); \ + else \ + fprintf (STREAM, "(GOT)"); \ + } \ } /* Handles PIC addr specially */ -#define OUTPUT_INT_ADDR_CONST(STREAM,X) \ +#define OUTPUT_INT_ADDR_CONST(STREAM,X) \ { \ - if (flag_pic && GET_CODE(X) == CONST && is_pic(X)) \ + if (flag_pic && GET_CODE (X) == CONST && is_pic (X)) \ { \ - output_addr_const(STREAM, XEXP (XEXP (XEXP (X, 0), 0), 0)); \ - fputs(" - (", STREAM); \ - output_addr_const(STREAM, XEXP (XEXP (XEXP (X, 0), 1), 0)); \ - fputs(")", STREAM); \ + output_addr_const (STREAM, XEXP (XEXP (XEXP (X, 0), 0), 0)); \ + fputs (" - (", STREAM); \ + output_addr_const (STREAM, XEXP (XEXP (XEXP (X, 0), 1), 0)); \ + fputs (")", STREAM); \ } \ - else output_addr_const(STREAM, X); \ + else output_addr_const (STREAM, X); \ } /* Output code to add DELTA to the first argument, and then jump to FUNCTION. @@ -2042,7 +2059,7 @@ do { \ int mi_delta = (DELTA); \ char *mi_op = mi_delta < 0 ? "sub" : "add"; \ int shift = 0; \ - int this_regno = (aggregate_value_p (TREE_TYPE (TREE_TYPE (FUNCTION))) \ + int this_regno = (aggregate_value_p (TREE_TYPE (TREE_TYPE (FUNCTION)))\ ? 1 : 0); \ if (mi_delta < 0) mi_delta = -mi_delta; \ while (mi_delta != 0) \ diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 17ffedba1d28..acc5d34eb499 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -6216,6 +6216,7 @@ "" "* { + making_const_table = TRUE; switch (GET_MODE_CLASS (GET_MODE (operands[0]))) { case MODE_FLOAT: @@ -6238,6 +6239,7 @@ "" "* { + making_const_table = TRUE; switch (GET_MODE_CLASS (GET_MODE (operands[0]))) { case MODE_FLOAT: @@ -6259,7 +6261,7 @@ [(unspec_volatile [(const_int 0)] 4)] "" "* - /* Nothing to do (currently). */ + making_const_table = FALSE; return \"\"; ")