On Sat, Feb 16, 2019 at 7:02 AM H.J. Lu <hjl.to...@gmail.com> wrote:
>
> On Thu, Feb 14, 2019 at 08:13:32PM -0800, H.J. Lu wrote:
> > NOTE_INSN_DELETED_LABEL is used to mark what used to be a 'code_label',
> > but was not used for other purposes than taking its address and was
> > transformed to mark that no code jumps to it.  NOTE_INSN_DELETED_LABEL
> > is generated only in 3 places:
> >
> > 1. When delete_insn sees an unused label which is an explicit label in
> > the input source code or its address is taken, it turns the label into
> > a NOTE_INSN_DELETED_LABEL note.
> > 2. When rtl_tidy_fallthru_edge deletes a tablejump, it turns the
> > tablejump into a NOTE_INSN_DELETED_LABEL note.
> > 3. ix86_init_large_pic_reg creats a NOTE_INSN_DELETED_LABEL note, .L2,
> > to initialize large model PIC register:
> >
> > L2:
> >       movabsq $_GLOBAL_OFFSET_TABLE_-.L2, %r11
> >       leaq    .L2(%rip), %rax
> >       movabsq $val@GOT, %rdx
> >       addq    %r11, %rax
> >
> > Among of them, ENDBR is needed only when the label address is taken.
> > rest_of_insert_endbranch has
> >
> >           if ((LABEL_P (insn) && LABEL_PRESERVE_P (insn))
> >               || (NOTE_P (insn)
> >                   && NOTE_KIND (insn) == NOTE_INSN_DELETED_LABEL))
> >             /* TODO.  Check /s bit also.  */
> >             {
> >               cet_eb = gen_nop_endbr ();
> >               emit_insn_after (cet_eb, insn);
> >               continue;
> >             }
> >
> > For NOTE_INSN_DELETED_LABEL, we should check if forced_labels to see
> > if its address is taken.  Also ix86_init_large_pic_reg shouldn't set
> > LABEL_PRESERVE_P (in_struct) since NOTE_INSN_DELETED_LABEL is suffcient
> > to keep the label.
> >
> > gcc/
> >
> >       PR target/89355
> >       * config/i386/i386.c (rest_of_insert_endbranch): Check
> >       forced_labels to see if the address of NOTE_INSN_DELETED_LABEL
> >       is taken.
> >       (ix86_init_large_pic_reg): Don't set LABEL_PRESERVE_P.
> >
>
> Here is the updated patch.  We should check LABEL_PRESERVE_P on
> NOTE_INSN_DELETED_LABEL to see if its address is taken.
>
> OK for trunk?
>
> Thanks.
>
> H.J.
> ---
> NOTE_INSN_DELETED_LABEL is used to mark what used to be a 'code_label',
> but was not used for other purposes than taking its address and was
> transformed to mark that no code jumps to it.  Since LABEL_PRESERVE_P is
> true only if the label address was taken, check LABEL_PRESERVE_P before
> inserting ENDBR.
>
> 2019-02-15  H.J. Lu  <hongjiu...@intel.com>
>             Hongtao Liu  <hongtao....@intel.com>
>
> gcc/
>
>         PR target/89355
>         * config/i386/i386.c (rest_of_insert_endbranch): LABEL_PRESERVE_P
>         to see if the address of NOTE_INSN_DELETED_LABEL is taken.
>         (ix86_init_large_pic_reg): Don't set LABEL_PRESERVE_P.
>
> gcc/testsuite/
>
>         PR target/89355
>         * gcc.target/i386/cet-label-3.c: New test.
>         * gcc.target/i386/cet-label-4.c: Likewise.
>         * gcc.target/i386/cet-label-5.c: Likewise.

PING:

https://gcc.gnu.org/ml/gcc-patches/2019-02/msg01327.html


-- 
H.J.

Reply via email to