]> git.ipfire.org Git - thirdparty/gcc.git/commit
Add generic part for Intel CET enabling. The spec is available at
authoritsimbal <itsimbal@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Oct 2017 13:09:38 +0000 (13:09 +0000)
committeritsimbal <itsimbal@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Oct 2017 13:09:38 +0000 (13:09 +0000)
commit3c0f15b4cebccdbb6388a8df5933e69c9b773149
tree07ee35844abbf2889c4ed953d998c4fe78bf9dd9
parent3ebb1bac73fedb02994e61b48f1d7e4facf7e17c
Add generic part for Intel CET enabling. The spec is available at

https://software.intel.com/sites/default/files/managed/4d/2a/control-flow-enforcement-technology-preview.pdf

A proposal is to introduce a target independent flag
-fcf-protection=[none|branch|return|full] with a semantic to
instrument a code to control validness or integrity of control-flow
transfers using jump and call instructions. The main goal is to detect
and block a possible malware execution through transfer the execution
to unknown target address. Implementation could be either software or
target based. Any target platforms can provide their implementation
for instrumentation under this option.

The compiler should instrument any control-flow transfer points in a
program (ex. call/jmp/ret) as well as any landing pads, which are
targets of control-flow transfers.

A new 'nocf_check' attribute is introduced to provide hand tuning
support. The attribute directs the compiler to skip a call to a
function and a function's landing pad from instrumentation. The
attribute can be used for function and pointer to function types,
otherwise it will be ignored.

Currently all platforms except i386 will report the error and do no
instrumentation. i386 will provide the implementation based on a
specification published by Intel for a new technology called
Control-flow Enforcement Technology (CET).

gcc/c-family/
* c-attribs.c (handle_nocf_check_attribute): New function.
(c_common_attribute_table): Add 'nocf_check' handling.

gcc/c/
* gimple-parser.c: Add second argument NULL to
gimple_build_call_from_tree.

gcc/
* attrib.c (comp_type_attributes): Check nocf_check attribute.
* cfgexpand.c (expand_call_stmt): Set REG_CALL_NOCF_CHECK for
call insn.
* combine.c (distribute_notes): Add REG_CALL_NOCF_CHECK handling.
* common.opt: Add fcf-protection flag.
* emit-rtl.c (try_split): Add REG_CALL_NOCF_CHECK handling.
* flag-types.h: Add enum cf_protection_level.
* gimple.c (gimple_build_call_from_tree): Add second parameter.
Add 'nocf_check' attribute propagation to gimple call.
* gimple.h (gf_mask): Add GF_CALL_NOCF_CHECK.
(gimple_build_call_from_tree): Update prototype.
(gimple_call_nocf_check_p): New function.
(gimple_call_set_nocf_check): Likewise.
* gimplify.c: Add second argument to gimple_build_call_from_tree.
* ipa-icf.c: Add nocf_check attribute in statement hash.
* recog.c (peep2_attempt): Add REG_CALL_NOCF_CHECK handling.
* reg-notes.def: Add REG_NOTE (CALL_NOCF_CHECK).
* toplev.c (process_options): Add flag_cf_protection handling.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@253936 138bc75d-0d04-0410-961f-82ee72b054a4
16 files changed:
gcc/ChangeLog
gcc/attribs.c
gcc/c-family/c-attribs.c
gcc/c/gimple-parser.c
gcc/cfgexpand.c
gcc/combine.c
gcc/common.opt
gcc/emit-rtl.c
gcc/flag-types.h
gcc/gimple.c
gcc/gimple.h
gcc/gimplify.c
gcc/ipa-icf.c
gcc/recog.c
gcc/reg-notes.def
gcc/toplev.c