This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, i386, Pointer Bounds Checker 30/x] Size relocation
- From: Ilya Enkovich <enkovich dot gnu at gmail dot com>
- To: Uros Bizjak <ubizjak at gmail dot com>
- Cc: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Thu, 2 Oct 2014 12:23:30 +0400
- Subject: Re: [PATCH, i386, Pointer Bounds Checker 30/x] Size relocation
- Authentication-results: sourceware.org; auth=none
- References: <CAFULd4avH2BWgAvDJhvU1TwRpDSdAUAwBLdRR3Qd8VTeF8rx_g at mail dot gmail dot com> <CAMbmDYbmV5hmUME1WEeEVQZ13dpRAt5a3VRompfZi8YxhZ35_A at mail dot gmail dot com> <CAFULd4Ym34U=-yfP_RszZ6CG-J2xgoPjBbs3Ezbh=1OTQOjkAw at mail dot gmail dot com> <20140917183534 dot GD3628 at msticlxl57 dot ims dot intel dot com> <CAFULd4YZi7S4+=7_N2vv0XFXiJ4Cj=hOymOAsOYmSSnJF2__AQ at mail dot gmail dot com> <20140918140033 dot GB50194 at msticlxl57 dot ims dot intel dot com> <CAMbmDYYBG2SQLVUZemMhM2zBv+OgrZ0wiq8CN4waDe-cvN10sw at mail dot gmail dot com> <CAFULd4aEaucEqrNEe2EWQp6mmFMLUYXXC9567x4H7YP605-UYw at mail dot gmail dot com> <CAMbmDYYG5K6oimAxBM89e84X+zitgSq9CnDNU=+EhdRjwc8qkw at mail dot gmail dot com> <CAFULd4ad_CqdKVT6J4wKC3LSR2pkLvnhLS2KFMc+Qfs4oJNM3w at mail dot gmail dot com>
On 01 Oct 19:57, Uros Bizjak wrote:
> On Wed, Oct 1, 2014 at 7:02 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
> > 2014-10-01 19:17 GMT+04:00 Uros Bizjak <ubizjak@gmail.com>:
> >> On Wed, Oct 1, 2014 at 4:10 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
> >>
> >>>> +;; Return true if size of VALUE can be stored in a sign
> >>>> +;; extended immediate field.
> >>>> +(define_predicate "x86_64_immediate_size_operand"
> >>>> + (match_code "symbol_ref")
> >>>> +{
> >>>> + if (!TARGET_64BIT)
> >>>> + return true;
> >>>> +
> >>>> + /* For 64 bit target we may assume size of object fits
> >>>> + immediate only when code model guarantees that. */
> >>>> + return (ix86_cmodel == CM_SMALL || ix86_cmodel == CM_KERNEL);
> >>>> +})
> >>>> +
> >>>
> >>> This predicate causes bootstrap error:
> >>> predicates.md:362:38: error: unused parameter 'op' [-Werror=unused-parameter]
> >>
> >> Huh? How is this predicate different from e.g.
> >>
> >> (define_predicate "compare_operator"
> >> (match_code "compare"))
> >>
> >> ?
> >>
> >> Can you please show generated code from gcc/insn-preds.c?
> >>
> >> Uros.
> >
> > It is different because it has a code block which is used to generate
> > additional function. Here is what generated for the predicate:
> >
> > static inline int
> > x86_64_immediate_size_operand_1 (rtx op, enum machine_mode mode
> > ATTRIBUTE_UNUSED)
> > {
> > if (!TARGET_64BIT)
> > return true;
> >
> > /* For 64 bit target we may assume size of object fits
> > immediate only when code model guarantees that. */
> > return (ix86_cmodel == CM_SMALL || ix86_cmodel == CM_KERNEL);
> > }
> >
> > int
> > x86_64_immediate_size_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED)
> > {
> > return ((GET_CODE (op) == SYMBOL_REF) && (
> > (x86_64_immediate_size_operand_1 (op, mode)))) && (
> > (mode == VOIDmode || GET_MODE (op) == mode));
> > }
>
> Well,
>
> --cut here--
> (define_predicate "x86_64_immediate_size_operand"
> (and (match_code "symbol_ref")
> (ior (not (match_test "TARGET_64BIT"))
> (and (match_test ("ix86_cmodel == CM_SMALL"))
> (match_test ("ix86_cmodel == CM_KERNEL"))))))
> --cut here--
>
> Uros.
Thanks for a workaround. Below is a modified version passing bootstrap.
Ilya
--
2014-10-01 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.
(x86_64_immediate_size_operand): New.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 65990b1..1901023 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
@@ -18789,6 +18790,21 @@
"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"
+{
+ if (x86_64_immediate_size_operand (operands[1], VOIDmode))
+ return "mov{l}\t{%1@SIZE, %k0|%k0, %1@SIZE}";
+ else
+ return "movabs{q}\t{%1@SIZE, %0|%0, %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 fea7754..1875339 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")
@@ -336,6 +340,14 @@
return false;
})
+;; Return true if size of VALUE can be stored in a sign
+;; extended immediate field.
+(define_predicate "x86_64_immediate_size_operand"
+ (and (match_code "symbol_ref")
+ (ior (not (match_test "TARGET_64BIT"))
+ (ior (match_test ("ix86_cmodel == CM_SMALL"))
+ (match_test ("ix86_cmodel == CM_KERNEL"))))))
+
;; Return true if OP is general operand representable on x86_64.
(define_predicate "x86_64_general_operand"
(if_then_else (match_test "TARGET_64BIT")