aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Meissner <meissner@gcc.gnu.org>1993-04-07 13:17:34 +0000
committerMichael Meissner <meissner@gcc.gnu.org>1993-04-07 13:17:34 +0000
commit84ab931b38ea576576927b27e9b56be80dcfb486 (patch)
tree3a9f3cc9d20b7babd97e60b877e3ac708b18b73c
parent3c01f863eea2afde658d0c0e328880e5e5ad0eec (diff)
downloadgcc-84ab931b38ea576576927b27e9b56be80dcfb486.zip
gcc-84ab931b38ea576576927b27e9b56be80dcfb486.tar.gz
gcc-84ab931b38ea576576927b27e9b56be80dcfb486.tar.bz2
Add -fpic support back in.
From-SVN: r4040
-rw-r--r--gcc/config/i386/osfrose.h54
1 files changed, 40 insertions, 14 deletions
diff --git a/gcc/config/i386/osfrose.h b/gcc/config/i386/osfrose.h
index 736824f4..3e39289 100644
--- a/gcc/config/i386/osfrose.h
+++ b/gcc/config/i386/osfrose.h
@@ -85,11 +85,13 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
#define CC1_SPEC "\
%{gline:%{!g:%{!g0:%{!g1:%{!g2: -g1}}}}} \
%{pic-none: -mno-half-pic} \
+%{fpic: -mno-half-pic} \
+%{fPIC: -mno-half-pic} \
%{pic-lib: -mhalf-pic} \
%{pic-extern: -mhalf-pic} \
%{pic-calls: -mhalf-pic} \
%{pic-names*: -mhalf-pic} \
-%{!pic-*: -mhalf-pic}"
+%{!pic-*: %{!fpic: %{!fPIC: -mhalf-pic}}}"
#undef ASM_SPEC
#define ASM_SPEC ""
@@ -152,11 +154,14 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
`high' expressions and `const' arithmetic expressions, in
addition to `const_int' and `const_double' expressions. */
+#define CONSTANT_ADDRESS_P_ORIG(X) \
+ (GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \
+ || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST \
+ || GET_CODE (X) == HIGH)
+
#undef CONSTANT_ADDRESS_P
#define CONSTANT_ADDRESS_P(X) \
- ((GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF \
- || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST \
- || GET_CODE (X) == HIGH) && (!HALF_PIC_P () || !HALF_PIC_ADDRESS_P (X)))
+ ((CONSTANT_ADDRESS_P_ORIG (X)) && (!HALF_PIC_P () || !HALF_PIC_ADDRESS_P (X)))
/* Nonzero if the constant value X is a legitimate general operand.
It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE. */
@@ -173,29 +178,50 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
The MODE argument is the machine mode for the MEM expression
that wants to use this address. */
+#define GO_IF_LEGITIMATE_ADDRESS_ORIG(MODE, X, ADDR) \
+{ \
+ if (CONSTANT_ADDRESS_P (X) \
+ && (! flag_pic || LEGITIMATE_PIC_OPERAND_P (X))) \
+ goto ADDR; \
+ GO_IF_INDEXING (X, ADDR); \
+ if (GET_CODE (X) == PLUS && CONSTANT_ADDRESS_P (XEXP (X, 1))) \
+ { \
+ rtx x0 = XEXP (X, 0); \
+ if (! flag_pic || ! SYMBOLIC_CONST (XEXP (X, 1))) \
+ { GO_IF_INDEXING (x0, ADDR); } \
+ else if (x0 == pic_offset_table_rtx) \
+ goto ADDR; \
+ else if (GET_CODE (x0) == PLUS) \
+ { \
+ if (XEXP (x0, 0) == pic_offset_table_rtx) \
+ { GO_IF_INDEXABLE_BASE (XEXP (x0, 1), ADDR); } \
+ if (XEXP (x0, 1) == pic_offset_table_rtx) \
+ { GO_IF_INDEXABLE_BASE (XEXP (x0, 0), ADDR); } \
+ } \
+ } \
+}
+
#undef GO_IF_LEGITIMATE_ADDRESS
#define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR) \
{ \
- if (CONSTANT_P (X)) \
+ if (! HALF_PIC_P ()) \
{ \
- if (! HALF_PIC_P () || ! HALF_PIC_ADDRESS_P (X)) \
- goto ADDR; \
+ GO_IF_LEGITIMATE_ADDRESS_ORIG(MODE, X, ADDR); \
} \
else \
{ \
- GO_IF_INDEXING (X, ADDR); \
+ if (CONSTANT_P (X) && ! HALF_PIC_ADDRESS_P (X)) \
+ goto ADDR; \
\
+ GO_IF_INDEXING (X, ADDR); \
if (GET_CODE (X) == PLUS) \
{ \
rtx x1 = XEXP (X, 1); \
\
- if (CONSTANT_P (x1)) \
+ if (CONSTANT_P (x1) && ! HALF_PIC_ADDRESS_P (x1)) \
{ \
- if (! HALF_PIC_P () || ! HALF_PIC_ADDRESS_P (x1)) \
- { \
- rtx x0 = XEXP (X, 0); \
- GO_IF_INDEXING (x0, ADDR); \
- } \
+ rtx x0 = XEXP (X, 0); \
+ GO_IF_INDEXING (x0, ADDR); \
} \
} \
} \