[PATCH, i386, Pointer Bounds Checker 30/x] Size relocation

Ilya Enkovich enkovich.gnu@gmail.com
Wed Sep 17 18:35:00 GMT 2014


On 16 Sep 12:22, Uros Bizjak wrote:
> On Tue, Sep 16, 2014 at 11:37 AM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
> > 2014-09-16 13:08 GMT+04:00 Uros Bizjak <ubizjak@gmail.com>:
> >>
> >> Can x86_64_immediate_operand predicate be used here?
> >
> > I think it cannot be used because of TLS symbols not counting as immediate.
> 
> OK, please introduce a new predicate, similar to
> x86_64_immediate_operand, perhaps x86_64_immediate_size_operand, so we
> can add some comments there. This will also help to macroize the insn,
> x86_64_immediate_operand has !TARGET_64BIT shortcut for this case.
> 
> Uros.

I don't see how new predicate would help to macroize insn.  Single template may look as following patch.

Thanks,
Ilya
--
2014-09-17  Ilya Enkovich  <ilya.enkovich@intel.com>

	* config/i386/i386.md (UNSPEC_SIZEOF): New.
	(move_size_reloc_<mode>): New.
	* config/i386/predicates.md (symbol_operand): New.


diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 2c367b2..628a58b 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
@@ -18554,6 +18555,24 @@
   "bndstx\t{%2, %3|%3, %2}"
   [(set_attr "type" "mpxst")])
 
+(define_insn "move_size_reloc_<mode>"
+  [(set (match_operand:SWI48 0 "register_operand" "=r")
+       (unspec:SWI48
+        [(match_operand:SWI48 1 "symbol_operand")]
+        UNSPEC_SIZEOF))]
+  "TARGET_MPX"
+{
+  /* We have to use movabs in case object's size may exceed
+     31 bits.  */
+  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" "<MODE>")])
+
 (include "mmx.md")
 (include "sse.md")
 (include "sync.md")
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
index cd542b7..3e2d471 100644
--- a/gcc/config/i386/predicates.md
+++ b/gcc/config/i386/predicates.md
@@ -124,6 +124,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")



More information about the Gcc-patches mailing list