On 11/13/2017 02:44 PM, Tsimbalist, Igor V wrote: > New patch is attached. The difference is that all newly introduced macro > are removed except of _Unwind_Frames_Extra macro. They are replaced > with new parameters and local variables. > > Igor > > > 0008-Add-Intel-CET-support-for-EH-in-libgcc.patch > > > From 47fe033b2a23397be50455b7661ad499c42209be Mon Sep 17 00:00:00 2001 > From: Igor Tsimbalist <igor.v.tsimbal...@intel.com> > Date: Wed, 19 Jul 2017 03:04:46 +0300 > Subject: [PATCH 08/22] Add Intel CET support for EH in libgcc. > > Control-flow Enforcement Technology (CET), published by Intel, > introduces the Shadow Stack feature, which ensures a return from a > function is done to exactly the same location from where the function > was called. When EH is present the control-flow transfer may skip some > stack frames and the shadow stack has to be adjusted not to signal a > violation of a control-flow transfer. It's done by counting a number > of skiping frames and adjasting shadow stack pointer by this number. > > Having new semantic of the 'ret' instruction if CET is supported in HW > the 'ret' instruction cannot be generated in ix86_expand_epilogue when > we are returning after EH is processed. Added a code in > ix86_expand_epilogue to adjust Shadow Stack pointer and to generate an > indirect jump instead of 'ret'. As sp register is used during this > adjustment thus the argument in pro_epilogue_adjust_stack is changed > to update cfa_reg based on whether control-flow instrumentation is set. > Without updating the cfa_reg field there is an assert later in dwarf2 > pass related to mismatch the stack register and cfa_reg value. > > gcc/ > * config/i386/i386.c (ix86_expand_epilogue): Change simple > return to indirect jump for EH return. Change explicit 'false' > argument in pro_epilogue_adjust_stack with a value of > flag_cf_protection. > * config/i386/i386.md (simple_return_indirect_internal): Remove > SImode restriction to support 64-bit. > > libgcc/ > * config/i386/linux-unwind.h: Include > config/i386/shadow-stack-unwind.h. > * config/i386/shadow-stack-unwind.h: New file. > * unwind-dw2.c: (uw_install_context): Add a frame parameter and > pass it to _Unwind_Frames_Extra. > * unwind-generic.h (_Unwind_Frames_Extra): New. > * unwind.inc (_Unwind_RaiseException_Phase2): Add frames_p > parameter. Add local variable frames to count number of frames. > (_Unwind_ForcedUnwind_Phase2): Likewise. > (_Unwind_RaiseException): Add local variable frames to count > number of frames, pass it to _Unwind_RaiseException_Phase2 and > uw_install_context. > (_Unwind_ForcedUnwind): Likewise. > (_Unwind_Resume): Likewise. > (_Unwind_Resume_or_Rethrow): Likewise. This version looks much better :-)
OK. jeff