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: Uros Bizjak <ubizjak at gmail dot com>
- To: Ilya Enkovich <enkovich dot gnu at gmail dot com>
- Cc: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>, "Enkovich, Ilya" <ilya dot enkovich at intel dot com>, Jan Hubicka <hubicka at ucw dot cz>
- Date: Thu, 18 Sep 2014 19:27:55 +0200
- 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>
On Thu, Sep 18, 2014 at 4:00 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
> On 17 Sep 20:51, Uros Bizjak wrote:
>> On Wed, Sep 17, 2014 at 8:35 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
>> > 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.
>>
>> You put early return for !TARGET_64BITS. Please see
>> x86_64_immediate_operand predicate.
>>
>> So,
>>
>> /* Here comes comment. */
>> (define_predicate "x86_64_immediate_size_operand"
>> (match_code "symbol_ref")
>> {
>> if (!TARGET_64BIT)
>> return true;
>>
>> /* Comment here explaining these conditions. */
>> return (ix86_cmodel == CM_SMALL || ix86_cmodel == CM_KERNEL);
>> }
>>
>> And then in the pattern itself:
>>
>> 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}";
>>
>> Uros.
>
> Here is a version with check in a form you suggest.
>
> Thanks,
> Ilya
> --
> 2014-09-18 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.
OK.
We are always on the safe side now, movl is an optimization exception.
I wonder if we can also add something like
|| (ix86_cmodel == CM_MEDIUM && !SYMBOL_REF_FAR_ADDR_P (op)));
as is the case with x86_64_immediate_operand, but I am not sure that
object size is guaranteed to fit in 31bits. Maybe Honza (CC'd) can
confirm this.
Uros.
> diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
> index 2c367b2..db22b06 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,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 cd542b7..da01c9a 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,19 @@
> return false;
> })
>
> +;; 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);
> +})
> +
> ;; Return true if OP is general operand representable on x86_64.
> (define_predicate "x86_64_general_operand"
> (if_then_else (match_test "TARGET_64BIT")
- References:
- Re: [PATCH, i386, Pointer Bounds Checker 30/x] Size relocation
- Re: [PATCH, i386, Pointer Bounds Checker 30/x] Size relocation
- Re: [PATCH, i386, Pointer Bounds Checker 30/x] Size relocation
- Re: [PATCH, i386, Pointer Bounds Checker 30/x] Size relocation
- Re: [PATCH, i386, Pointer Bounds Checker 30/x] Size relocation
- Re: [PATCH, i386, Pointer Bounds Checker 30/x] Size relocation