+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
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;
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))
(! 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;
\f
/* Condition code information. */
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.
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) \