aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilip Blundell <pb@nexus.co.uk>1999-05-22 09:40:04 +0000
committerNick Clifton <nickc@gcc.gnu.org>1999-05-22 09:40:04 +0000
commit13bd191d0e2519240def60469da8764e4917ccff (patch)
treed2e677b7e6bf7df0b630f8662371d0031a538237
parented4e4c744119bc235110c121e12d79494404a8c6 (diff)
downloadgcc-13bd191d0e2519240def60469da8764e4917ccff.zip
gcc-13bd191d0e2519240def60469da8764e4917ccff.tar.gz
gcc-13bd191d0e2519240def60469da8764e4917ccff.tar.bz2
Apply patch from Philip Blundell <pb@nexus.co.uk> to fix PIC support for
constant tables. From-SVN: r27100
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/config/arm/arm.c5
-rw-r--r--gcc/config/arm/arm.h37
-rw-r--r--gcc/config/arm/arm.md4
4 files changed, 44 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9e3bfd3..963fdc3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+Thu May 13 09:35:51 1999 Philip Blundell <pb@nexus.co.uk>
+
+ 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 <pb@nexus.co.uk>
* 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 5034343..b60f552 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 e88bda9..ac2dc05 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 17ffedb..acc5d34 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 \"\";
")