diff options
Diffstat (limited to 'gcc/config/i386/predicates.md')
-rw-r--r-- | gcc/config/i386/predicates.md | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md index ea2eb69cf37..be2141c13f2 100644 --- a/gcc/config/i386/predicates.md +++ b/gcc/config/i386/predicates.md @@ -456,6 +456,18 @@ return 0; }) +;; Test for a legitimate @GOTOFF operand. +;; +;; VxWorks does not impose a fixed gap between segments; the run-time +;; gap can be different from the object-file gap. We therefore can't +;; use @GOTOFF unless we are absolutely sure that the symbol is in the +;; same segment as the GOT. Unfortunately, the flexibility of linker +;; scripts means that we can't be sure of that in general, so assume +;; that @GOTOFF is never valid on VxWorks. +(define_predicate "gotoff_operand" + (and (match_test "!TARGET_VXWORKS_RTP") + (match_operand 0 "local_symbolic_operand"))) + ;; Test for various thread-local symbols. (define_predicate "tls_symbolic_operand" (and (match_code "symbol_ref") @@ -472,8 +484,9 @@ ;; Test for a pc-relative call operand (define_predicate "constant_call_address_operand" - (ior (match_code "symbol_ref") - (match_operand 0 "local_symbolic_operand"))) + (and (ior (match_code "symbol_ref") + (match_operand 0 "local_symbolic_operand")) + (match_test "ix86_cmodel != CM_LARGE && ix86_cmodel != CM_LARGE_PIC"))) ;; True for any non-virtual or eliminable register. Used in places where ;; instantiation of such a register may cause the pattern to not be recognized. |