aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2004-08-21 06:49:16 +0000
committerMike Stump <mrs@gcc.gnu.org>2004-08-21 06:49:16 +0000
commit828a4fe4cc7aeea47ec46e2fd3f1e24311e82e7b (patch)
tree5b9f618d9d0e30a5bb0b28e8547795314514cf27
parent85b776dff75bd79d649d4125d116fa89bfd10b9e (diff)
downloadgcc-828a4fe4cc7aeea47ec46e2fd3f1e24311e82e7b.zip
gcc-828a4fe4cc7aeea47ec46e2fd3f1e24311e82e7b.tar.gz
gcc-828a4fe4cc7aeea47ec46e2fd3f1e24311e82e7b.tar.bz2
darwin.c (machopic_indirect_data_reference): Mark stubs as defined.
* config/darwin.c (machopic_indirect_data_reference): Mark stubs as defined. * config/386/386.c (darwin_local_data_pic): Add. (legitimate_constant_p): Reorder so that PLUS handling runs before darwin_local_data_pic to match the ordering in legitimate_pic_address_disp_p and so that MINUS runs after darwin_local_data_pic as otherwise the darwin_local_data_pic logic can be skipped, which would be very bad. (legitimate_pic_address_disp_p): Move from from here to darwin_local_data_pic so it can be reused. From-SVN: r86355
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/config/darwin.c3
-rw-r--r--gcc/config/i386/i386.c49
3 files changed, 50 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3af5733..90413bd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2004-08-20 Mike Stump <mrs@apple.com>
+
+ * config/darwin.c (machopic_indirect_data_reference): Mark
+ stubs as defined.
+ * config/386/386.c (darwin_local_data_pic): Add.
+ (legitimate_constant_p): Reorder so that PLUS handling runs
+ before darwin_local_data_pic to match the ordering in
+ legitimate_pic_address_disp_p and so that MINUS runs after
+ darwin_local_data_pic as otherwise the darwin_local_data_pic
+ logic can be skipped, which would be very bad.
+ (legitimate_pic_address_disp_p): Move from from here to
+ darwin_local_data_pic so it can be reused.
+
2004-08-21 Alan Modra <amodra@bigpond.net.au>
* config/rs6000/linux64.h (DOT_SYMBOLS): Define.
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index d34dcfe..44c8539 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -455,13 +455,14 @@ machopic_indirect_data_reference (rtx orig, rtx reg)
return orig;
}
- ptr_ref = (gen_rtx_SYMBOL_REF
+ ptr_ref = (gen_rtx_SYMBOL_REF
(Pmode,
machopic_indirection_name (orig, /*stub_p=*/false)));
SYMBOL_REF_DECL (ptr_ref) = SYMBOL_REF_DECL (orig);
ptr_ref = gen_const_mem (Pmode, ptr_ref);
+ machopic_define_symbol (ptr_ref);
return ptr_ref;
}
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 9ae3972..0213239 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -4791,6 +4791,28 @@ ix86_find_base_term (rtx x)
return term;
}
+
+/* Allow {LABEL | SYMBOL}_REF - SYMBOL_REF-FOR-PICBASE for Mach-O as
+ this is used for to form addresses to local data when -fPIC is in
+ use. */
+
+static bool
+darwin_local_data_pic (rtx disp)
+{
+ if (GET_CODE (disp) == MINUS)
+ {
+ if (GET_CODE (XEXP (disp, 0)) == LABEL_REF
+ || GET_CODE (XEXP (disp, 0)) == SYMBOL_REF)
+ if (GET_CODE (XEXP (disp, 1)) == SYMBOL_REF)
+ {
+ const char *sym_name = XSTR (XEXP (disp, 1), 0);
+ if (! strcmp (sym_name, "<pic base>"))
+ return true;
+ }
+ }
+
+ return false;
+}
/* Determine if a given RTX is a valid constant. We already know this
satisfies CONSTANT_P. */
@@ -4817,8 +4839,17 @@ legitimate_constant_p (rtx x)
&& tls_symbolic_operand (XEXP (inner, 0), Pmode))
return false;
- if (GET_CODE (inner) == PLUS
- || GET_CODE (inner) == MINUS)
+ if (GET_CODE (inner) == PLUS)
+ {
+ if (GET_CODE (XEXP (inner, 1)) != CONST_INT)
+ return false;
+ inner = XEXP (inner, 0);
+ }
+
+ if (TARGET_MACHO && darwin_local_data_pic (inner))
+ return true;
+
+ if (GET_CODE (inner) == MINUS)
{
if (GET_CODE (XEXP (inner, 1)) != CONST_INT)
return false;
@@ -4966,18 +4997,8 @@ legitimate_pic_address_disp_p (rtx disp)
saw_plus = true;
}
- /* Allow {LABEL | SYMBOL}_REF - SYMBOL_REF-FOR-PICBASE for Mach-O. */
- if (TARGET_MACHO && GET_CODE (disp) == MINUS)
- {
- if (GET_CODE (XEXP (disp, 0)) == LABEL_REF
- || GET_CODE (XEXP (disp, 0)) == SYMBOL_REF)
- if (GET_CODE (XEXP (disp, 1)) == SYMBOL_REF)
- {
- const char *sym_name = XSTR (XEXP (disp, 1), 0);
- if (! strcmp (sym_name, "<pic base>"))
- return 1;
- }
- }
+ if (TARGET_MACHO && darwin_local_data_pic (disp))
+ return 1;
if (GET_CODE (disp) != UNSPEC)
return 0;