On 12/11/18 9:03 AM, H.J. Lu wrote: > On Mon, Dec 3, 2018 at 5:45 AM H.J. Lu <hjl.to...@gmail.com> wrote: >> On Mon, Jun 18, 2018 at 2:20 AM Richard Biener >> <richard.guent...@gmail.com> wrote: >>> On Fri, Jun 15, 2018 at 2:59 PM H.J. Lu <hongjiu...@intel.com> wrote: >>>> Currently GCC inserts ENDBR instruction at entries of all non-static >>>> functions, unless LTO compilation is used. Marking all functions, >>>> which are not called indirectly with nocf_check attribute, is not >>>> ideal since 99% of functions in a program may be of this kind. >>>> >>>> This patch adds -mmanual-endbr and cf_check function attribute. They >>>> can be used together with -fcf-protection such that ENDBR instruction >>>> is inserted only at entries of functions with cf_check attribute. It >>>> can limit number of ENDBR instructions to reduce program size. >>>> >>>> OK for trubk? >>> I wonder if the linker could assist with ENDBR creation by >>> redirecting all non-direct call relocs to a linker-generated >>> stub with ENBR and a direct branch? >>> >> The goal of this patch is to add as few as ENDBR as possible >> to reduce program size as much as possible. Also there is no >> relocation for indirect branch via register. >> > Hi Honza, Jakub, Jeff, Richard, > > Here is the rebased patch. Can you guys take a look? > > Thanks. > > > -- H.J. > > > 0001-i386-Add-mmanual-endbr-and-cf_check-function-attribu.patch > > From 5934c6be6495b2d6f278646e25f9e684f6610e2b Mon Sep 17 00:00:00 2001 > From: "H.J. Lu" <hjl.to...@gmail.com> > Date: Thu, 14 Jun 2018 09:19:27 -0700 > Subject: [PATCH] i386; Add -mmanual-endbr and cf_check function attribute > > Currently GCC inserts ENDBR instruction at entries of all non-static > functions, unless LTO compilation is used. Marking all functions, > which are not called indirectly with nocf_check attribute, is not > ideal since 99% of functions in a program may be of this kind. > > This patch adds -mmanual-endbr and cf_check function attribute. They > can be used together with -fcf-protection such that ENDBR instruction > is inserted only at entries of functions with cf_check attribute. It > can limit number of ENDBR instructions to reduce program size. > > gcc/ > > * config/i386/i386.c (rest_of_insert_endbranch): Insert ENDBR > at the function entry only when -mmanual-endbr isn't used or > there is cf_check function attribute. > (ix86_attribute_table): Add cf_check. > * config/i386/i386.opt: Add -mmanual-endbr. > * doc/extend.texi: Document cf_check attribute. > * doc/invoke.texi: Document -mmanual-endbr. > > gcc/testsuite/ > > * gcc.target/i386/cf_check-1.c: New test. > * gcc.target/i386/cf_check-2.c: Likewise. > * gcc.target/i386/cf_check-3.c: Likewise. > * gcc.target/i386/cf_check-4.c: Likewise. > * gcc.target/i386/cf_check-5.c: Likewise. OK.
Though I'm not sure how valuable this is in practice. Yea, it saves some space at the start of functions, but I find myself wondering more and more if we should be pushing folks towards LTO for a variety of reasons. jeff