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.