Hi, This patch adds size relocation support for i386 target. Relocation is used to compute bounds for static objects with incomplete type.
Thanks, Ilya -- gcc/ 2014-06-11 Ilya Enkovich <ilya.enkov...@intel.com> * config/i386/i386.md (UNSPEC_SIZEOF): New. (move_size_reloc_si): New. (move_size_reloc_di): New. * config/i386/predicates.md (symbol_operand): New. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 32db2c6..5fd556b 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -79,6 +79,7 @@ UNSPEC_PLTOFF UNSPEC_MACHOPIC_OFFSET UNSPEC_PCREL + UNSPEC_SIZEOF ;; Prologue support UNSPEC_STACK_ALLOC @@ -18340,6 +18341,32 @@ "bndstx\t{%2, %3|%3, %2}" [(set_attr "type" "mpxst")]) +(define_insn "move_size_reloc_si" + [(set (match_operand:SI 0 "register_operand" "=r") + (unspec:SI + [(match_operand:SI 1 "symbol_operand")] + UNSPEC_SIZEOF))] + "TARGET_MPX" + "mov{l}\t{%1@SIZE, %0|%0, %1@SIZE}" + [(set_attr "type" "imov") + (set_attr "mode" "SI")]) + +(define_insn "move_size_reloc_di" + [(set (match_operand:DI 0 "register_operand" "=r") + (unspec:DI + [(match_operand:DI 1 "symbol_operand")] + UNSPEC_SIZEOF))] + "TARGET_64BIT && TARGET_MPX" +{ + if (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE + || ix86_cmodel == CM_MEDIUM_PIC || ix86_cmodel == CM_LARGE_PIC) + return "movabs{q}\t{%1@SIZE, %0|%0, %1@SIZE}"; + else + return "mov{l}\t{%1@SIZE, %k0|%k0, %1@SIZE}"; +} + [(set_attr "type" "imov") + (set_attr "mode" "DI")]) + (include "mmx.md") (include "sse.md") (include "sync.md") diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md index a738033..e4c5d21 100644 --- a/gcc/config/i386/predicates.md +++ b/gcc/config/i386/predicates.md @@ -119,6 +119,10 @@ (match_test "TARGET_64BIT") (match_test "REGNO (op) > BX_REG"))) +;; Return true if VALUE is symbol reference +(define_predicate "symbol_operand" + (match_code "symbol_ref")) + ;; Return true if VALUE can be stored in a sign extended immediate field. (define_predicate "x86_64_immediate_operand" (match_code "const_int,symbol_ref,label_ref,const")