mirror of git://gcc.gnu.org/git/gcc.git
Cherry-pick compiler-rt revision 337603:
When shadow stack from Intel CET is enabled, the first instruction of all
indirect branch targets must be a special instruction, ENDBR.
lib/asan/asan_interceptors.cc has
...
int res = REAL(swapcontext)(oucp, ucp);
...
REAL(swapcontext) is a function pointer to swapcontext in libc. Since
swapcontext may return via indirect branch on x86 when shadow stack is
enabled, as in this case,
int res = REAL(swapcontext)(oucp, ucp);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^ This function may be
returned via an indirect branch.
Here compiler must insert ENDBR after call, like
call *bar(%rip)
endbr64
I opened an LLVM bug:
https://bugs.llvm.org/show_bug.cgi?id=38207
to add the indirect_return attribute so that it can be used to inform
compiler to insert ENDBR after REAL(swapcontext) call. We mark
REAL(swapcontext) with the indirect_return attribute if it is available.
This fixed:
https://bugs.llvm.org/show_bug.cgi?id=38249
Reviewed By: eugenis
Differential Revision: https://reviews.llvm.org/D49608
PR target/86560
* asan/asan_interceptors.cc (swapcontext) Cherry-pick
compiler-rt revision 337603.
* sanitizer_common/sanitizer_internal_defs.h (__has_attribute):
Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@263009 138bc75d-0d04-0410-961f-82ee72b054a4
|
||
|---|---|---|
| .. | ||
| asan | ||
| builtins | ||
| include | ||
| interception | ||
| libbacktrace | ||
| lsan | ||
| sanitizer_common | ||
| tsan | ||
| ubsan | ||
| ChangeLog | ||
| HOWTO_MERGE | ||
| LICENSE.TXT | ||
| LOCAL_PATCHES | ||
| MERGE | ||
| Makefile.am | ||
| Makefile.in | ||
| README.gcc | ||
| acinclude.m4 | ||
| aclocal.m4 | ||
| config.h.in | ||
| configure | ||
| configure.ac | ||
| configure.tgt | ||
| libsanitizer.spec.in | ||
| libtool-version | ||
| merge.sh | ||
README.gcc
AddressSanitizer (http://code.google.com/p/address-sanitizer) and ThreadSanitizer (http://code.google.com/p/thread-sanitizer/) are projects initially developed by Google Inc. Both tools consist of a compiler module and a run-time library. The sources of the run-time library for these projects are hosted at http://llvm.org/svn/llvm-project/compiler-rt in the following directories: include/sanitizer lib/sanitizer_common lib/interception lib/asan lib/tsan lib/lsan lib/ubsan Trivial and urgent fixes (portability, build fixes, etc.) may go directly to the GCC tree. All non-trivial changes, functionality improvements, etc. should go through the upstream tree first and then be merged back to the GCC tree. The merges from upstream should be done with the aid of the merge.sh script; it will also update the file MERGE to contain the upstream revision we merged with.