<div dir="ltr">Thank you Peter!<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 24, 2015 at 10:27 AM, Peter Collingbourne <span dir="ltr"><<a href="mailto:peter@pcc.me.uk" target="_blank">peter@pcc.me.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I've committed r240555 and will keep an eye on the bots.<br>
<br>
Peter<br>
<div class="HOEnZb"><div class="h5"><br>
On Wed, Jun 24, 2015 at 09:09:07AM -0700, Galina Kistanova wrote:<br>
> Hi Peter,<br>
><br>
> It seems this revision broke compile step on sanitizer_x86_64-freebsd<br>
> builder:<br>
><br>
> r239762:<br>
> <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lab.llvm.org-3A8011_builders_sanitizer-5Fx86-5F64-2Dfreebsd_builds_5501&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=2PhJFFhjXfgwQRLqye_ayy0_rgqicd9UMLxwsoYMTS8&e=" rel="noreferrer" target="_blank">http://lab.llvm.org:8011/builders/sanitizer_x86_64-freebsd/builds/5501</a><br>
><br>
> r 239763:<br>
> <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lab.llvm.org-3A8011_builders_sanitizer-5Fx86-5F64-2Dfreebsd_builds_5445&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=Q90Sb7wfs_sbAxve8TfFulBpKhQMJjbRFobx_0N0pWk&e=" rel="noreferrer" target="_blank">http://lab.llvm.org:8011/builders/sanitizer_x86_64-freebsd/builds/5445</a><br>
><br>
> Please have a look at this?<br>
><br>
> Thanks<br>
><br>
> Galina<br>
><br>
> On Tue, Jun 16, 2015 at 12:00 PM, Peter Collingbourne <<a href="mailto:peter@pcc.me.uk">peter@pcc.me.uk</a>><br>
> wrote:<br>
><br>
> > Anna,<br>
> ><br>
> > I couldn't immediately see the cause of the problem so I've XFAILed the<br>
> > test<br>
> > for now in r239841. I'll try to investigate more closely later.<br>
> ><br>
> > Peter<br>
> ><br>
> > On Tue, Jun 16, 2015 at 11:35:50AM -0700, Anna Zaks wrote:<br>
> > > Very exciting to see this!<br>
> > ><br>
> > > The commit has caused one test failure on darwin:<br>
> > ><br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lab.llvm.org-3A8080_green_view_All_job_clang-2Dstage1-2Dcmake-2DRA-5Fcheck_4796_console&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=CgAQR31MP1QqxyrxI6IcVwKbLcvSZWY3I9ARm-XF6aI&e=" rel="noreferrer" target="_blank">http://lab.llvm.org:8080/green/view/All/job/clang-stage1-cmake-RA_check/4796/console</a><br>
> > ><br>
> > > Failing Tests (1):<br>
> > >     SafeStack :: pthread.c<br>
> > ><br>
> > > Will you be able to investigate?<br>
> > ><br>
> > > Thanks!<br>
> > > Anna.<br>
> > > > On Jun 15, 2015, at 2:08 PM, Peter Collingbourne <<a href="mailto:peter@pcc.me.uk">peter@pcc.me.uk</a>><br>
> > wrote:<br>
> > > ><br>
> > > > Author: pcc<br>
> > > > Date: Mon Jun 15 16:08:47 2015<br>
> > > > New Revision: 239763<br>
> > > ><br>
> > > > URL: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject-3Frev-3D239763-26view-3Drev&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=-hnibrMT7EypZqCpJOrqKjGbdJYjXIhykcZBNZF1sQ8&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=239763&view=rev</a><br>
> > > > Log:<br>
> > > > Protection against stack-based memory corruption errors using<br>
> > SafeStack: compiler-rt runtime support library<br>
> > > ><br>
> > > > This patch adds runtime support for the Safe Stack protection to<br>
> > compiler-rt<br>
> > > > (see <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D6094&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=9pNDLkSbKmV-8SUWTQolEvovCSh0bOfYGXF1U2kuYYs&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/D6094</a> for the detailed description of the<br>
> > > > Safe Stack).<br>
> > > ><br>
> > > > This patch is our implementation of the safe stack on top of<br>
> > compiler-rt. The<br>
> > > > patch adds basic runtime support for the safe stack to compiler-rt that<br>
> > > > manages unsafe stack allocation/deallocation for each thread.<br>
> > > ><br>
> > > > Original patch by Volodymyr Kuznetsov and others at the Dependable<br>
> > Systems<br>
> > > > Lab at EPFL; updates and upstreaming by myself.<br>
> > > ><br>
> > > > Differential Revision: <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D6096&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=lrs2RfpW0z4F5104cjnmxrgI3whtdomC9A-4zSc-3GU&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/D6096</a><br>
> > > ><br>
> > > > Added:<br>
> > > >    compiler-rt/trunk/lib/safestack/<br>
> > > >    compiler-rt/trunk/lib/safestack/CMakeLists.txt<br>
> > > >    compiler-rt/trunk/lib/safestack/safestack.cc<br>
> > > >    compiler-rt/trunk/test/safestack/<br>
> > > >    compiler-rt/trunk/test/safestack/CMakeLists.txt<br>
> > > >    compiler-rt/trunk/test/safestack/buffer-copy-vla.c<br>
> > > >    compiler-rt/trunk/test/safestack/buffer-copy.c<br>
> > > >    compiler-rt/trunk/test/safestack/init.c<br>
> > > >    compiler-rt/trunk/test/safestack/lit.cfg<br>
> > > >    compiler-rt/trunk/test/safestack/<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lit.site.cfg.in&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=gxoAe-MA_PJRy8e9NRjztm_AuxNndWSPj-qlRH0A2jE&e=" rel="noreferrer" target="_blank">lit.site.cfg.in</a><br>
> > > >    compiler-rt/trunk/test/safestack/lto.c<br>
> > > >    compiler-rt/trunk/test/safestack/overflow.c<br>
> > > >    compiler-rt/trunk/test/safestack/pthread-cleanup.c<br>
> > > >    compiler-rt/trunk/test/safestack/pthread.c<br>
> > > >    compiler-rt/trunk/test/safestack/utils.h<br>
> > > > Modified:<br>
> > > >    compiler-rt/trunk/CMakeLists.txt<br>
> > > >    compiler-rt/trunk/cmake/config-ix.cmake<br>
> > > >    compiler-rt/trunk/lib/CMakeLists.txt<br>
> > > >    compiler-rt/trunk/test/CMakeLists.txt<br>
> > > ><br>
> > > > Modified: compiler-rt/trunk/CMakeLists.txt<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_CMakeLists.txt-3Frev-3D239763-26r1-3D239762-26r2-3D239763-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=Q87W0MlJ9YcEOFgYUL3aPoxQixjAPnDeegche8gEBXA&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/CMakeLists.txt?rev=239763&r1=239762&r2=239763&view=diff</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/CMakeLists.txt (original)<br>
> > > > +++ compiler-rt/trunk/CMakeLists.txt Mon Jun 15 16:08:47 2015<br>
> > > > @@ -207,6 +207,7 @@ append_list_if(COMPILER_RT_HAS_FNO_EXCEP<br>
> > > > append_list_if(COMPILER_RT_HAS_FOMIT_FRAME_POINTER_FLAG<br>
> > -fomit-frame-pointer SANITIZER_COMMON_CFLAGS)<br>
> > > > append_list_if(COMPILER_RT_HAS_FUNWIND_TABLES_FLAG -funwind-tables<br>
> > SANITIZER_COMMON_CFLAGS)<br>
> > > > append_list_if(COMPILER_RT_HAS_FNO_STACK_PROTECTOR_FLAG<br>
> > -fno-stack-protector SANITIZER_COMMON_CFLAGS)<br>
> > > > +append_list_if(COMPILER_RT_HAS_FNO_SANITIZE_SAFE_STACK_FLAG<br>
> > -fno-sanitize=safe-stack SANITIZER_COMMON_CFLAGS)<br>
> > > > append_list_if(COMPILER_RT_HAS_FVISIBILITY_HIDDEN_FLAG<br>
> > -fvisibility=hidden SANITIZER_COMMON_CFLAGS)<br>
> > > > append_list_if(COMPILER_RT_HAS_FNO_FUNCTION_SECTIONS_FLAG<br>
> > -fno-function-sections SANITIZER_COMMON_CFLAGS)<br>
> > > > append_list_if(COMPILER_RT_HAS_FNO_LTO_FLAG -fno-lto<br>
> > SANITIZER_COMMON_CFLAGS)<br>
> > > ><br>
> > > > Modified: compiler-rt/trunk/cmake/config-ix.cmake<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_cmake_config-2Dix.cmake-3Frev-3D239763-26r1-3D239762-26r2-3D239763-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=LYDZGEyX8wa-0QSKvw9j9hCfQt-d458L2RukjVR-fDQ&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/cmake/config-ix.cmake?rev=239763&r1=239762&r2=239763&view=diff</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/cmake/config-ix.cmake (original)<br>
> > > > +++ compiler-rt/trunk/cmake/config-ix.cmake Mon Jun 15 16:08:47 2015<br>
> > > > @@ -19,6 +19,7 @@ check_cxx_compiler_flag(-fno-exceptions<br>
> > > > check_cxx_compiler_flag(-fomit-frame-pointer<br>
> > COMPILER_RT_HAS_FOMIT_FRAME_POINTER_FLAG)<br>
> > > > check_cxx_compiler_flag(-funwind-tables<br>
> > COMPILER_RT_HAS_FUNWIND_TABLES_FLAG)<br>
> > > > check_cxx_compiler_flag(-fno-stack-protector<br>
> > COMPILER_RT_HAS_FNO_STACK_PROTECTOR_FLAG)<br>
> > > > +check_cxx_compiler_flag(-fno-sanitize=safe-stack<br>
> > COMPILER_RT_HAS_FNO_SANITIZE_SAFE_STACK_FLAG)<br>
> > > > check_cxx_compiler_flag(-fvisibility=hidden<br>
> > COMPILER_RT_HAS_FVISIBILITY_HIDDEN_FLAG)<br>
> > > > check_cxx_compiler_flag(-fno-rtti<br>
> > COMPILER_RT_HAS_FNO_RTTI_FLAG)<br>
> > > > check_cxx_compiler_flag(-ffreestanding<br>
> >  COMPILER_RT_HAS_FFREESTANDING_FLAG)<br>
> > > > @@ -256,6 +257,7 @@ filter_available_targets(PROFILE_SUPPORT<br>
> > > > filter_available_targets(TSAN_SUPPORTED_ARCH x86_64 mips64 mips64el)<br>
> > > > filter_available_targets(UBSAN_SUPPORTED_ARCH x86_64 i386 i686 arm<br>
> > aarch64 mips<br>
> > > >   mipsel mips64 mips64el powerpc64 powerpc64le)<br>
> > > > +filter_available_targets(SAFESTACK_SUPPORTED_ARCH x86_64 i386 i686)<br>
> > > ><br>
> > > > if(ANDROID)<br>
> > > >   set(OS_NAME "Android")<br>
> > > > @@ -334,3 +336,10 @@ endif()<br>
> > > > if("${LLVM_NATIVE_ARCH}" STREQUAL "Mips")<br>
> > > >   set(COMPILER_RT_HAS_MSSE3_FLAG FALSE)<br>
> > > > endif()<br>
> > > > +<br>
> > > > +if (SAFESTACK_SUPPORTED_ARCH AND<br>
> > > > +    OS_NAME MATCHES "Darwin|Linux|FreeBSD")<br>
> > > > +  set(COMPILER_RT_HAS_SAFESTACK TRUE)<br>
> > > > +else()<br>
> > > > +  set(COMPILER_RT_HAS_SAFESTACK FALSE)<br>
> > > > +endif()<br>
> > > ><br>
> > > > Modified: compiler-rt/trunk/lib/CMakeLists.txt<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_lib_CMakeLists.txt-3Frev-3D239763-26r1-3D239762-26r2-3D239763-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=WgY2PRzGe1pAPq5w_83woEtjoCKgb1pRpDMtkXjRcr8&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/CMakeLists.txt?rev=239763&r1=239762&r2=239763&view=diff</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/lib/CMakeLists.txt (original)<br>
> > > > +++ compiler-rt/trunk/lib/CMakeLists.txt Mon Jun 15 16:08:47 2015<br>
> > > > @@ -34,3 +34,6 @@ if(COMPILER_RT_HAS_TSAN)<br>
> > > >   add_subdirectory(tsan/dd)<br>
> > > > endif()<br>
> > > ><br>
> > > > +if(COMPILER_RT_HAS_SAFESTACK)<br>
> > > > +  add_subdirectory(safestack)<br>
> > > > +endif()<br>
> > > ><br>
> > > > Added: compiler-rt/trunk/lib/safestack/CMakeLists.txt<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_lib_safestack_CMakeLists.txt-3Frev-3D239763-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=f8zsBs-zIYecHfTCyem_PBvSaeqzMAAEeC0hsAP7_PI&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/safestack/CMakeLists.txt?rev=239763&view=auto</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/lib/safestack/CMakeLists.txt (added)<br>
> > > > +++ compiler-rt/trunk/lib/safestack/CMakeLists.txt Mon Jun 15 16:08:47<br>
> > 2015<br>
> > > > @@ -0,0 +1,28 @@<br>
> > > > +add_custom_target(safestack)<br>
> > > > +<br>
> > > > +set(SAFESTACK_SOURCES safestack.cc)<br>
> > > > +<br>
> > > > +include_directories(..)<br>
> > > > +<br>
> > > > +set(SAFESTACK_CFLAGS ${SANITIZER_COMMON_CFLAGS})<br>
> > > > +<br>
> > > > +if(APPLE)<br>
> > > > +  # Build universal binary on APPLE.<br>
> > > > +  add_compiler_rt_osx_static_runtime(clang_rt.safestack_osx<br>
> > > > +    ARCH ${SAFESTACK_SUPPORTED_ARCH}<br>
> > > > +    SOURCES ${SAFESTACK_SOURCES}<br>
> > > > +            $<TARGET_OBJECTS:RTInterception.osx><br>
> > > > +            $<TARGET_OBJECTS:RTSanitizerCommon.osx><br>
> > > > +    CFLAGS ${SAFESTACK_CFLAGS})<br>
> > > > +  add_dependencies(safestack clang_rt.safestack_osx)<br>
> > > > +else()<br>
> > > > +  # Otherwise, build separate libraries for each target.<br>
> > > > +  foreach(arch ${SAFESTACK_SUPPORTED_ARCH})<br>
> > > > +    add_compiler_rt_runtime(clang_rt.safestack-${arch} ${arch} STATIC<br>
> > > > +      SOURCES ${SAFESTACK_SOURCES}<br>
> > > > +              $<TARGET_OBJECTS:RTInterception.${arch}><br>
> > > > +              $<TARGET_OBJECTS:RTSanitizerCommon.${arch}><br>
> > > > +      CFLAGS ${SAFESTACK_CFLAGS})<br>
> > > > +    add_dependencies(safestack clang_rt.safestack-${arch})<br>
> > > > +  endforeach()<br>
> > > > +endif()<br>
> > > ><br>
> > > > Added: compiler-rt/trunk/lib/safestack/safestack.cc<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_lib_safestack_safestack.cc-3Frev-3D239763-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=cNtQd4Ozq13TMmGJfdZt2FP3HiAXZtO83WIty5sGzVY&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/safestack/safestack.cc?rev=239763&view=auto</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/lib/safestack/safestack.cc (added)<br>
> > > > +++ compiler-rt/trunk/lib/safestack/safestack.cc Mon Jun 15 16:08:47<br>
> > 2015<br>
> > > > @@ -0,0 +1,236 @@<br>
> > > > +//===-- safestack.cc<br>
> > ------------------------------------------------------===//<br>
> > > > +//<br>
> > > > +//                     The LLVM Compiler Infrastructure<br>
> > > > +//<br>
> > > > +// This file is distributed under the University of Illinois Open<br>
> > Source<br>
> > > > +// License. See LICENSE.TXT for details.<br>
> > > > +//<br>
> > > ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > > > +//<br>
> > > > +// This file implements the runtime support for the safe stack<br>
> > protection<br>
> > > > +// mechanism. The runtime manages allocation/deallocation of the<br>
> > unsafe stack<br>
> > > > +// for the main thread, as well as all pthreads that are<br>
> > created/destroyed<br>
> > > > +// during program execution.<br>
> > > > +//<br>
> > > ><br>
> > +//===----------------------------------------------------------------------===//<br>
> > > > +<br>
> > > > +#include <limits.h><br>
> > > > +#include <pthread.h><br>
> > > > +#include <stddef.h><br>
> > > > +#include <sys/resource.h><br>
> > > > +#include <sys/user.h><br>
> > > > +<br>
> > > > +#include "interception/interception.h"<br>
> > > > +#include "sanitizer_common/sanitizer_common.h"<br>
> > > > +<br>
> > > > +// TODO: The runtime library does not currently protect the safe<br>
> > stack. The<br>
> > > > +// protection of the (safe) stack can be provided by two alternative<br>
> > features<br>
> > > > +// that requires C library support:<br>
> > > > +//<br>
> > > > +// 1) Protection via hardware segmentation on x32 architectures: the<br>
> > (safe)<br>
> > > > +// stack segment (implicitly accessed via the %ss segment register)<br>
> > can be<br>
> > > > +// separated from the data segment (implicitly accessed via the %ds<br>
> > segment<br>
> > > > +// register). Dereferencing a pointer to the safe segment would<br>
> > result in a<br>
> > > > +// segmentation fault.<br>
> > > > +//<br>
> > > > +// 2) Protection via information hiding on 64 bit architectures: the<br>
> > location of<br>
> > > > +// the safe stack can be randomized through secure mechanisms, and<br>
> > the leakage<br>
> > > > +// of the stack pointer can be prevented. Currently, libc can leak<br>
> > the stack<br>
> > > > +// pointer in several ways (e.g. in longjmp, signal handling,<br>
> > user-level context<br>
> > > > +// switching related functions, etc.). These can be fixed in libc and<br>
> > in other<br>
> > > > +// low-level libraries, by either eliminating the escaping/dumping of<br>
> > the stack<br>
> > > > +// pointer (i.e., %rsp) when that's possible, or by using<br>
> > encryption/PTR_MANGLE<br>
> > > > +// (XOR-ing the dumped stack pointer with another secret we control<br>
> > and protect<br>
> > > > +// better). (This is already done for setjmp in glibc.) Furthermore,<br>
> > a static<br>
> > > > +// machine code level verifier can be ran after code generation to<br>
> > make sure<br>
> > > > +// that the stack pointer is never written to memory, or if it is,<br>
> > its written<br>
> > > > +// on the safe stack.<br>
> > > > +//<br>
> > > > +// Finally, while the Unsafe Stack pointer is currently stored in a<br>
> > thread local<br>
> > > > +// variable, with libc support it could be stored in the TCB (thread<br>
> > control<br>
> > > > +// block) as well, eliminating another level of indirection.<br>
> > Alternatively,<br>
> > > > +// dedicating a separate register for storing it would also be<br>
> > possible.<br>
> > > > +<br>
> > > > +/// Minimum stack alignment for the unsafe stack.<br>
> > > > +const unsigned kStackAlign = 16;<br>
> > > > +<br>
> > > > +/// Default size of the unsafe stack. This value is only used if the<br>
> > stack<br>
> > > > +/// size rlimit is set to infinity.<br>
> > > > +const unsigned kDefaultUnsafeStackSize = 0x2800000;<br>
> > > > +<br>
> > > > +// TODO: To make accessing the unsafe stack pointer faster, we plan to<br>
> > > > +// eventually store it directly in the thread control block data<br>
> > structure on<br>
> > > > +// platforms where this structure is pointed to by %fs or %gs. This<br>
> > is exactly<br>
> > > > +// the same mechanism as currently being used by the traditional stack<br>
> > > > +// protector pass to store the stack guard (see<br>
> > getStackCookieLocation()<br>
> > > > +// function above). Doing so requires changing the tcbhead_t struct<br>
> > in glibc<br>
> > > > +// on Linux and tcb struct in libc on FreeBSD.<br>
> > > > +//<br>
> > > > +// For now, store it in a thread-local variable.<br>
> > > > +extern "C" {<br>
> > > > +__attribute__((visibility(<br>
> > > > +    "default"))) __thread void *__safestack_unsafe_stack_ptr =<br>
> > nullptr;<br>
> > > > +}<br>
> > > > +<br>
> > > > +// Per-thread unsafe stack information. It's not frequently accessed,<br>
> > so there<br>
> > > > +// it can be kept out of the tcb in normal thread-local variables.<br>
> > > > +static __thread void *unsafe_stack_start = nullptr;<br>
> > > > +static __thread size_t unsafe_stack_size = 0;<br>
> > > > +static __thread size_t unsafe_stack_guard = 0;<br>
> > > > +<br>
> > > > +static inline void *unsafe_stack_alloc(size_t size, size_t guard) {<br>
> > > > +  CHECK_GE(size + guard, size);<br>
> > > > +  void *addr = MmapOrDie(size + guard, "unsafe_stack_alloc");<br>
> > > > +  MprotectNoAccess((uptr)addr, (uptr)guard);<br>
> > > > +  return (char *)addr + guard;<br>
> > > > +}<br>
> > > > +<br>
> > > > +static inline void unsafe_stack_setup(void *start, size_t size,<br>
> > size_t guard) {<br>
> > > > +  CHECK_GE((char *)start + size, (char *)start);<br>
> > > > +  CHECK_GE((char *)start + guard, (char *)start);<br>
> > > > +  void *stack_ptr = (char *)start + size;<br>
> > > > +  CHECK_EQ((((size_t)stack_ptr) & (kStackAlign - 1)), 0);<br>
> > > > +<br>
> > > > +  __safestack_unsafe_stack_ptr = stack_ptr;<br>
> > > > +  unsafe_stack_start = start;<br>
> > > > +  unsafe_stack_size = size;<br>
> > > > +  unsafe_stack_guard = guard;<br>
> > > > +}<br>
> > > > +<br>
> > > > +static void unsafe_stack_free() {<br>
> > > > +  if (unsafe_stack_start) {<br>
> > > > +    UnmapOrDie((char *)unsafe_stack_start - unsafe_stack_guard,<br>
> > > > +               unsafe_stack_size + unsafe_stack_guard);<br>
> > > > +  }<br>
> > > > +  unsafe_stack_start = nullptr;<br>
> > > > +}<br>
> > > > +<br>
> > > > +/// Thread data for the cleanup handler<br>
> > > > +static pthread_key_t thread_cleanup_key;<br>
> > > > +<br>
> > > > +/// Safe stack per-thread information passed to the thread_start<br>
> > function<br>
> > > > +struct tinfo {<br>
> > > > +  void *(*start_routine)(void *);<br>
> > > > +  void *start_routine_arg;<br>
> > > > +<br>
> > > > +  void *unsafe_stack_start;<br>
> > > > +  size_t unsafe_stack_size;<br>
> > > > +  size_t unsafe_stack_guard;<br>
> > > > +};<br>
> > > > +<br>
> > > > +/// Wrap the thread function in order to deallocate the unsafe stack<br>
> > when the<br>
> > > > +/// thread terminates by returning from its main function.<br>
> > > > +static void *thread_start(void *arg) {<br>
> > > > +  struct tinfo *tinfo = (struct tinfo *)arg;<br>
> > > > +<br>
> > > > +  void *(*start_routine)(void *) = tinfo->start_routine;<br>
> > > > +  void *start_routine_arg = tinfo->start_routine_arg;<br>
> > > > +<br>
> > > > +  // Setup the unsafe stack; this will destroy tinfo content<br>
> > > > +  unsafe_stack_setup(tinfo->unsafe_stack_start,<br>
> > tinfo->unsafe_stack_size,<br>
> > > > +                     tinfo->unsafe_stack_guard);<br>
> > > > +<br>
> > > > +  // Make sure out thread-specific destructor will be called<br>
> > > > +  // FIXME: we can do this only any other specific key is set by<br>
> > > > +  // intercepting the pthread_setspecific function itself<br>
> > > > +  pthread_setspecific(thread_cleanup_key, (void *)1);<br>
> > > > +<br>
> > > > +  return start_routine(start_routine_arg);<br>
> > > > +}<br>
> > > > +<br>
> > > > +/// Thread-specific data destructor<br>
> > > > +static void thread_cleanup_handler(void *_iter) {<br>
> > > > +  // We want to free the unsafe stack only after all other destructors<br>
> > > > +  // have already run. We force this function to be called multiple<br>
> > times.<br>
> > > > +  // User destructors that might run more then<br>
> > PTHREAD_DESTRUCTOR_ITERATIONS-1<br>
> > > > +  // times might still end up executing after the unsafe stack is<br>
> > deallocated.<br>
> > > > +  size_t iter = (size_t)_iter;<br>
> > > > +  if (iter < PTHREAD_DESTRUCTOR_ITERATIONS) {<br>
> > > > +    pthread_setspecific(thread_cleanup_key, (void *)(iter + 1));<br>
> > > > +  } else {<br>
> > > > +    // This is the last iteration<br>
> > > > +    unsafe_stack_free();<br>
> > > > +  }<br>
> > > > +}<br>
> > > > +<br>
> > > > +/// Intercept thread creation operation to allocate and setup the<br>
> > unsafe stack<br>
> > > > +INTERCEPTOR(int, pthread_create, pthread_t *thread,<br>
> > > > +            const pthread_attr_t *attr,<br>
> > > > +            void *(*start_routine)(void*), void *arg) {<br>
> > > > +<br>
> > > > +  size_t size = 0;<br>
> > > > +  size_t guard = 0;<br>
> > > > +<br>
> > > > +  if (attr != NULL) {<br>
> > > > +    pthread_attr_getstacksize(attr, &size);<br>
> > > > +    pthread_attr_getguardsize(attr, &guard);<br>
> > > > +  } else {<br>
> > > > +    // get pthread default stack size<br>
> > > > +    pthread_attr_t tmpattr;<br>
> > > > +    pthread_attr_init(&tmpattr);<br>
> > > > +    pthread_attr_getstacksize(&tmpattr, &size);<br>
> > > > +    pthread_attr_getguardsize(&tmpattr, &guard);<br>
> > > > +    pthread_attr_destroy(&tmpattr);<br>
> > > > +  }<br>
> > > > +<br>
> > > > +  CHECK_NE(size, 0);<br>
> > > > +  CHECK_EQ((size & (kStackAlign - 1)), 0);<br>
> > > > +  CHECK_EQ((guard & (PAGE_SIZE - 1)), 0);<br>
> > > > +<br>
> > > > +  void *addr = unsafe_stack_alloc(size, guard);<br>
> > > > +  struct tinfo *tinfo =<br>
> > > > +      (struct tinfo *)(((char *)addr) + size - sizeof(struct tinfo));<br>
> > > > +  tinfo->start_routine = start_routine;<br>
> > > > +  tinfo->start_routine_arg = arg;<br>
> > > > +  tinfo->unsafe_stack_start = addr;<br>
> > > > +  tinfo->unsafe_stack_size = size;<br>
> > > > +  tinfo->unsafe_stack_guard = guard;<br>
> > > > +<br>
> > > > +  return REAL(pthread_create)(thread, attr, thread_start, tinfo);<br>
> > > > +}<br>
> > > > +<br>
> > > > +extern "C" __attribute__((visibility("default")))<br>
> > > > +#if !SANITIZER_CAN_USE_PREINIT_ARRAY<br>
> > > > +// On ELF platforms, the constructor is invoked using .preinit_array<br>
> > (see below)<br>
> > > > +__attribute__((constructor(0)))<br>
> > > > +#endif<br>
> > > > +void __safestack_init() {<br>
> > > > +  // Determine the stack size for the main thread.<br>
> > > > +  size_t size = kDefaultUnsafeStackSize;<br>
> > > > +  size_t guard = 4096;<br>
> > > > +<br>
> > > > +  struct rlimit limit;<br>
> > > > +  if (getrlimit(RLIMIT_STACK, &limit) == 0 && limit.rlim_cur !=<br>
> > RLIM_INFINITY)<br>
> > > > +    size = limit.rlim_cur;<br>
> > > > +<br>
> > > > +  // Allocate unsafe stack for main thread<br>
> > > > +  void *addr = unsafe_stack_alloc(size, guard);<br>
> > > > +<br>
> > > > +  unsafe_stack_setup(addr, size, guard);<br>
> > > > +<br>
> > > > +  // Initialize pthread interceptors for thread allocation<br>
> > > > +  INTERCEPT_FUNCTION(pthread_create);<br>
> > > > +<br>
> > > > +  // Setup the cleanup handler<br>
> > > > +  pthread_key_create(&thread_cleanup_key, thread_cleanup_handler);<br>
> > > > +}<br>
> > > > +<br>
> > > > +#if SANITIZER_CAN_USE_PREINIT_ARRAY<br>
> > > > +// On ELF platforms, run safestack initialization before any other<br>
> > constructors.<br>
> > > > +// On other platforms we use the constructor attribute to arrange to<br>
> > run our<br>
> > > > +// initialization early.<br>
> > > > +extern "C" {<br>
> > > > +__attribute__((section(".preinit_array"),<br>
> > > > +               used)) void (*__safestack_preinit)(void) =<br>
> > __safestack_init;<br>
> > > > +}<br>
> > > > +#endif<br>
> > > > +<br>
> > > > +extern "C"<br>
> > > > +    __attribute__((visibility("default"))) void<br>
> > *__get_unsafe_stack_start() {<br>
> > > > +  return unsafe_stack_start;<br>
> > > > +}<br>
> > > > +<br>
> > > > +extern "C"<br>
> > > > +    __attribute__((visibility("default"))) void<br>
> > *__get_unsafe_stack_ptr() {<br>
> > > > +  return __safestack_unsafe_stack_ptr;<br>
> > > > +}<br>
> > > ><br>
> > > > Modified: compiler-rt/trunk/test/CMakeLists.txt<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_test_CMakeLists.txt-3Frev-3D239763-26r1-3D239762-26r2-3D239763-26view-3Ddiff&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=WRV2Z2gvSDKY3nty6UrFJHBVT3UMXVIadm1W12Db9LE&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/CMakeLists.txt?rev=239763&r1=239762&r2=239763&view=diff</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/test/CMakeLists.txt (original)<br>
> > > > +++ compiler-rt/trunk/test/CMakeLists.txt Mon Jun 15 16:08:47 2015<br>
> > > > @@ -58,6 +58,9 @@ if(COMPILER_RT_CAN_EXECUTE_TESTS)<br>
> > > >     add_subdirectory(ubsan)<br>
> > > >   endif()<br>
> > > >   add_subdirectory(cfi)<br>
> > > > +  if(COMPILER_RT_HAS_SAFESTACK)<br>
> > > > +    add_subdirectory(safestack)<br>
> > > > +  endif()<br>
> > > > endif()<br>
> > > ><br>
> > > > if(COMPILER_RT_STANDALONE_BUILD)<br>
> > > ><br>
> > > > Added: compiler-rt/trunk/test/safestack/CMakeLists.txt<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_test_safestack_CMakeLists.txt-3Frev-3D239763-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=Ur83i6YDicU4i6zpM1PisjMF7Zg-vANKAw_QFKody68&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/safestack/CMakeLists.txt?rev=239763&view=auto</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/test/safestack/CMakeLists.txt (added)<br>
> > > > +++ compiler-rt/trunk/test/safestack/CMakeLists.txt Mon Jun 15<br>
> > 16:08:47 2015<br>
> > > > @@ -0,0 +1,29 @@<br>
> > > > +set(SAFESTACK_LIT_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})<br>
> > > > +set(SAFESTACK_LIT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})<br>
> > > > +<br>
> > > > +set(SAFESTACK_TEST_DEPS ${SANITIZER_COMMON_LIT_TEST_DEPS})<br>
> > > > +if(NOT COMPILER_RT_STANDALONE_BUILD)<br>
> > > > +  list(APPEND SAFESTACK_TEST_DEPS safestack)<br>
> > > > +<br>
> > > > +  # Some tests require LTO, so add a dependency on the relevant LTO<br>
> > plugin.<br>
> > > > +  if(LLVM_ENABLE_PIC AND LLVM_BINUTILS_INCDIR)<br>
> > > > +    list(APPEND SAFESTACK_TEST_DEPS<br>
> > > > +      LLVMgold<br>
> > > > +    )<br>
> > > > +  endif()<br>
> > > > +  if(APPLE)<br>
> > > > +    list(APPEND SAFESTACK_TEST_DEPS<br>
> > > > +      LTO<br>
> > > > +    )<br>
> > > > +  endif()<br>
> > > > +endif()<br>
> > > > +<br>
> > > > +configure_lit_site_cfg(<br>
> > > > +  ${CMAKE_CURRENT_SOURCE_DIR}/<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lit.site.cfg.in&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=gxoAe-MA_PJRy8e9NRjztm_AuxNndWSPj-qlRH0A2jE&e=" rel="noreferrer" target="_blank">lit.site.cfg.in</a><br>
> > > > +  ${CMAKE_CURRENT_BINARY_DIR}/lit.site.cfg<br>
> > > > +  )<br>
> > > > +<br>
> > > > +add_lit_testsuite(check-safestack "Running the SafeStack tests"<br>
> > > > +  ${CMAKE_CURRENT_BINARY_DIR}<br>
> > > > +  DEPENDS ${SAFESTACK_TEST_DEPS})<br>
> > > > +set_target_properties(check-safestack PROPERTIES FOLDER "SafeStack<br>
> > tests")<br>
> > > ><br>
> > > > Added: compiler-rt/trunk/test/safestack/buffer-copy-vla.c<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_test_safestack_buffer-2Dcopy-2Dvla.c-3Frev-3D239763-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=FgQHI3aurBrjpJoicE0Z8QHtaHaO4gB4ObIwvaJJ6cE&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/safestack/buffer-copy-vla.c?rev=239763&view=auto</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/test/safestack/buffer-copy-vla.c (added)<br>
> > > > +++ compiler-rt/trunk/test/safestack/buffer-copy-vla.c Mon Jun 15<br>
> > 16:08:47 2015<br>
> > > > @@ -0,0 +1,26 @@<br>
> > > > +// RUN: %clang_safestack %s -o %t<br>
> > > > +// RUN: %run %t<br>
> > > > +<br>
> > > > +#include "utils.h"<br>
> > > > +<br>
> > > > +// Test that loads/stores work correctly for VLAs on the unsafe stack.<br>
> > > > +<br>
> > > > +int main(int argc, char **argv)<br>
> > > > +{<br>
> > > > +  int i = 128;<br>
> > > > +  break_optimization(&i);<br>
> > > > +  char buffer[i];<br>
> > > > +<br>
> > > > +  // check that we can write to a buffer<br>
> > > > +  for (i = 0; argv[0][i] && i < sizeof (buffer) - 1; ++i)<br>
> > > > +    buffer[i] = argv[0][i];<br>
> > > > +  buffer[i] = '\0';<br>
> > > > +<br>
> > > > +  break_optimization(buffer);<br>
> > > > +<br>
> > > > +  // check that we can read from a buffer<br>
> > > > +  for (i = 0; argv[0][i] && i < sizeof (buffer) - 1; ++i)<br>
> > > > +    if (buffer[i] != argv[0][i])<br>
> > > > +      return 1;<br>
> > > > +  return 0;<br>
> > > > +}<br>
> > > ><br>
> > > > Added: compiler-rt/trunk/test/safestack/buffer-copy.c<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_test_safestack_buffer-2Dcopy.c-3Frev-3D239763-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=z5TtiF6xUz6f3X17GliDGDc_u0y1C2scHSNRTxOGeTI&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/safestack/buffer-copy.c?rev=239763&view=auto</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/test/safestack/buffer-copy.c (added)<br>
> > > > +++ compiler-rt/trunk/test/safestack/buffer-copy.c Mon Jun 15 16:08:47<br>
> > 2015<br>
> > > > @@ -0,0 +1,25 @@<br>
> > > > +// RUN: %clang_safestack %s -o %t<br>
> > > > +// RUN: %run %t<br>
> > > > +<br>
> > > > +#include "utils.h"<br>
> > > > +<br>
> > > > +// Test that loads/stores work correctly for variables on the unsafe<br>
> > stack.<br>
> > > > +<br>
> > > > +int main(int argc, char **argv)<br>
> > > > +{<br>
> > > > +  int i;<br>
> > > > +  char buffer[128];<br>
> > > > +<br>
> > > > +  // check that we can write to a buffer<br>
> > > > +  for (i = 0; argv[0][i] && i < sizeof (buffer) - 1; ++i)<br>
> > > > +    buffer[i] = argv[0][i];<br>
> > > > +  buffer[i] = '\0';<br>
> > > > +<br>
> > > > +  break_optimization(buffer);<br>
> > > > +<br>
> > > > +  // check that we can read from a buffer<br>
> > > > +  for (i = 0; argv[0][i] && i < sizeof (buffer) - 1; ++i)<br>
> > > > +    if (buffer[i] != argv[0][i])<br>
> > > > +      return 1;<br>
> > > > +  return 0;<br>
> > > > +}<br>
> > > ><br>
> > > > Added: compiler-rt/trunk/test/safestack/init.c<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_test_safestack_init.c-3Frev-3D239763-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=nCADGOL_4xONyjvImtQIx-G7QMiIpLu-4W8b2qLrmLY&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/safestack/init.c?rev=239763&view=auto</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/test/safestack/init.c (added)<br>
> > > > +++ compiler-rt/trunk/test/safestack/init.c Mon Jun 15 16:08:47 2015<br>
> > > > @@ -0,0 +1,9 @@<br>
> > > > +// RUN: %clang_safestack %s -o %t<br>
> > > > +// RUN: %run %t<br>
> > > > +<br>
> > > > +// Basic smoke test for the runtime library.<br>
> > > > +<br>
> > > > +int main(int argc, char **argv)<br>
> > > > +{<br>
> > > > +  return 0;<br>
> > > > +}<br>
> > > ><br>
> > > > Added: compiler-rt/trunk/test/safestack/lit.cfg<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_test_safestack_lit.cfg-3Frev-3D239763-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=LrCbvMqf_P7XBQWxKVfNtp8NNo7zjG8SusP7HuruZKI&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/safestack/lit.cfg?rev=239763&view=auto</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/test/safestack/lit.cfg (added)<br>
> > > > +++ compiler-rt/trunk/test/safestack/lit.cfg Mon Jun 15 16:08:47 2015<br>
> > > > @@ -0,0 +1,24 @@<br>
> > > > +# -*- Python -*-<br>
> > > > +<br>
> > > > +import os<br>
> > > > +<br>
> > > > +# Setup config name.<br>
> > > > +<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__config.name&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=scow0_Kkd3euqZEzRqSbJ22Mio_r9xDYbh3t3wTSV-k&e=" rel="noreferrer" target="_blank">config.name</a> = 'SafeStack'<br>
> > > > +<br>
> > > > +# Setup source root.<br>
> > > > +config.test_source_root = os.path.dirname(__file__)<br>
> > > > +<br>
> > > > +# Test suffixes.<br>
> > > > +config.suffixes = ['.c', '.cc', '.cpp', '.m', '.mm', '.ll', '.test']<br>
> > > > +<br>
> > > > +# Add clang substitutions.<br>
> > > > +config.substitutions.append( ("%clang_nosafestack ", config.clang + "<br>
> > -O0 -fno-sanitize=safe-stack ") )<br>
> > > > +config.substitutions.append( ("%clang_safestack ", config.clang + "<br>
> > -O0 -fsanitize=safe-stack ") )<br>
> > > > +<br>
> > > > +if config.lto_supported:<br>
> > > > +  config.available_features.add('lto')<br>
> > > > +  config.substitutions.append((r"%clang_lto_safestack ", '<br>
> > '.join(config.lto_launch + [config.clang] + config.lto_flags + ['-flto<br>
> > -fsanitize=safe-stack '])))<br>
> > > > +<br>
> > > > +# SafeStack tests are currently supported on Linux, FreeBSD and<br>
> > Darwin only.<br>
> > > > +if config.host_os not in ['Linux', 'FreeBSD', 'Darwin']:<br>
> > > > +   config.unsupported = True<br>
> > > ><br>
> > > > Added: compiler-rt/trunk/test/safestack/<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lit.site.cfg.in&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=gxoAe-MA_PJRy8e9NRjztm_AuxNndWSPj-qlRH0A2jE&e=" rel="noreferrer" target="_blank">lit.site.cfg.in</a><br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_test_safestack_lit.site.cfg.in-3Frev-3D239763-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=i9T02vHoaLm7rhKs34FJBUolxZBvzbd-epukEmUg1Ro&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/safestack/lit.site.cfg.in?rev=239763&view=auto</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/test/safestack/<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lit.site.cfg.in&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=gxoAe-MA_PJRy8e9NRjztm_AuxNndWSPj-qlRH0A2jE&e=" rel="noreferrer" target="_blank">lit.site.cfg.in</a> (added)<br>
> > > > +++ compiler-rt/trunk/test/safestack/<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__lit.site.cfg.in&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=gxoAe-MA_PJRy8e9NRjztm_AuxNndWSPj-qlRH0A2jE&e=" rel="noreferrer" target="_blank">lit.site.cfg.in</a> Mon Jun 15<br>
> > 16:08:47 2015<br>
> > > > @@ -0,0 +1,8 @@<br>
> > > > +## Autogenerated by LLVM/Clang configuration.<br>
> > > > +# Do not edit!<br>
> > > > +<br>
> > > > +# Load common config for all compiler-rt lit tests.<br>
> > > > +lit_config.load_config(config, "@COMPILER_RT_BINARY_DIR@<br>
> > /test/lit.common.configured")<br>
> > > > +<br>
> > > > +# Load tool-specific config that would do the real work.<br>
> > > > +lit_config.load_config(config, "@SAFESTACK_LIT_SOURCE_DIR@/lit.cfg")<br>
> > > ><br>
> > > > Added: compiler-rt/trunk/test/safestack/lto.c<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_test_safestack_lto.c-3Frev-3D239763-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=JhxhOBJ_ilyiNRiMQoSAX6TeImethzZriIIKUK4KbM4&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/safestack/lto.c?rev=239763&view=auto</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/test/safestack/lto.c (added)<br>
> > > > +++ compiler-rt/trunk/test/safestack/lto.c Mon Jun 15 16:08:47 2015<br>
> > > > @@ -0,0 +1,12 @@<br>
> > > > +// REQUIRES: lto<br>
> > > > +<br>
> > > > +// RUN: %clang_lto_safestack %s -o %t<br>
> > > > +// RUN: %run %t<br>
> > > > +<br>
> > > > +// Test that safe stack works with LTO.<br>
> > > > +<br>
> > > > +int main() {<br>
> > > > +  char c[] = "hello world";<br>
> > > > +  puts(c);<br>
> > > > +  return 0;<br>
> > > > +}<br>
> > > ><br>
> > > > Added: compiler-rt/trunk/test/safestack/overflow.c<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_test_safestack_overflow.c-3Frev-3D239763-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=_ZIJ7LMuD0Mpl5Mnj6E3QPW7xJ9toObh58bj_Ns-ki4&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/safestack/overflow.c?rev=239763&view=auto</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/test/safestack/overflow.c (added)<br>
> > > > +++ compiler-rt/trunk/test/safestack/overflow.c Mon Jun 15 16:08:47<br>
> > 2015<br>
> > > > @@ -0,0 +1,23 @@<br>
> > > > +// RUN: %clang_safestack %s -o %t<br>
> > > > +// RUN: %run %t<br>
> > > > +<br>
> > > > +// RUN: %clang_nosafestack -fno-stack-protector %s -o %t<br>
> > > > +// RUN: not %run %t<br>
> > > > +<br>
> > > > +// Test that buffer overflows on the unsafe stack do not affect<br>
> > variables on the<br>
> > > > +// safe stack.<br>
> > > > +<br>
> > > > +__attribute__((noinline))<br>
> > > > +void fct(volatile int *buffer)<br>
> > > > +{<br>
> > > > +  memset(buffer - 1, 0, 7 * sizeof(int));<br>
> > > > +}<br>
> > > > +<br>
> > > > +int main(int argc, char **argv)<br>
> > > > +{<br>
> > > > +  int value1 = 42;<br>
> > > > +  int buffer[5];<br>
> > > > +  int value2 = 42;<br>
> > > > +  fct(buffer);<br>
> > > > +  return value1 != 42 || value2 != 42;<br>
> > > > +}<br>
> > > ><br>
> > > > Added: compiler-rt/trunk/test/safestack/pthread-cleanup.c<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_test_safestack_pthread-2Dcleanup.c-3Frev-3D239763-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=zlpgPMi76LsmhhN-tr94xzPSuBxrF-DNiSIRp5QqMhA&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/safestack/pthread-cleanup.c?rev=239763&view=auto</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/test/safestack/pthread-cleanup.c (added)<br>
> > > > +++ compiler-rt/trunk/test/safestack/pthread-cleanup.c Mon Jun 15<br>
> > 16:08:47 2015<br>
> > > > @@ -0,0 +1,31 @@<br>
> > > > +// RUN: %clang_safestack %s -pthread -o %t<br>
> > > > +// RUN: not --crash %run %t<br>
> > > > +<br>
> > > > +// Test that unsafe stacks are deallocated correctly on thread exit.<br>
> > > > +<br>
> > > > +#include <stdlib.h><br>
> > > > +#include <string.h><br>
> > > > +#include <pthread.h><br>
> > > > +<br>
> > > > +enum { kBufferSize = (1 << 15) };<br>
> > > > +<br>
> > > > +void *t1_start(void *ptr)<br>
> > > > +{<br>
> > > > +  char buffer[kBufferSize];<br>
> > > > +  return buffer;<br>
> > > > +}<br>
> > > > +<br>
> > > > +int main(int argc, char **argv)<br>
> > > > +{<br>
> > > > +  pthread_t t1;<br>
> > > > +  char *buffer = NULL;<br>
> > > > +<br>
> > > > +  if (pthread_create(&t1, NULL, t1_start, NULL))<br>
> > > > +    abort();<br>
> > > > +  if (pthread_join(t1, &buffer))<br>
> > > > +    abort();<br>
> > > > +<br>
> > > > +  // should segfault here<br>
> > > > +  memset(buffer, 0, kBufferSize);<br>
> > > > +  return 0;<br>
> > > > +}<br>
> > > ><br>
> > > > Added: compiler-rt/trunk/test/safestack/pthread.c<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_test_safestack_pthread.c-3Frev-3D239763-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=HdMcH1Z4PawHrw5DKWGtVHfMsi-1jvcShhElyVgNgow&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/safestack/pthread.c?rev=239763&view=auto</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/test/safestack/pthread.c (added)<br>
> > > > +++ compiler-rt/trunk/test/safestack/pthread.c Mon Jun 15 16:08:47 2015<br>
> > > > @@ -0,0 +1,40 @@<br>
> > > > +// RUN: %clang_safestack %s -pthread -o %t<br>
> > > > +// RUN: %run %t<br>
> > > > +<br>
> > > > +// Test that pthreads receive their own unsafe stack.<br>
> > > > +<br>
> > > > +#include <stdlib.h><br>
> > > > +#include <string.h><br>
> > > > +#include <pthread.h><br>
> > > > +#include "utils.h"<br>
> > > > +<br>
> > > > +static int ptr_test = 42;<br>
> > > > +<br>
> > > > +void *t1_start(void *ptr)<br>
> > > > +{<br>
> > > > +  if (ptr != &ptr_test)<br>
> > > > +    abort();<br>
> > > > +<br>
> > > > +  // safe stack<br>
> > > > +  int val = ptr_test * 5;<br>
> > > > +<br>
> > > > +  // unsafe stack<br>
> > > > +  char buffer[8096]; // two pages<br>
> > > > +  memset(buffer, val, sizeof (buffer));<br>
> > > > +  break_optimization(buffer);<br>
> > > > +<br>
> > > > +  return ptr;<br>
> > > > +}<br>
> > > > +<br>
> > > > +int main(int argc, char **argv)<br>
> > > > +{<br>
> > > > +  pthread_t t1;<br>
> > > > +  void *ptr = NULL;<br>
> > > > +  if (pthread_create(&t1, NULL, t1_start, &ptr_test))<br>
> > > > +    abort();<br>
> > > > +  if (pthread_join(t1, &ptr))<br>
> > > > +    abort();<br>
> > > > +  if (ptr != &ptr_test)<br>
> > > > +    abort();<br>
> > > > +  return 0;<br>
> > > > +}<br>
> > > ><br>
> > > > Added: compiler-rt/trunk/test/safestack/utils.h<br>
> > > > URL:<br>
> > <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_viewvc_llvm-2Dproject_compiler-2Drt_trunk_test_safestack_utils.h-3Frev-3D239763-26view-3Dauto&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=mQ4LZ2PUj9hpadE3cDHZnIdEwhEBrbAstXeMaFoB9tg&m=tBjjPCp2hxaD3NVILhQOAZPhCPwb7SHirMRV8ksmOro&s=BRR3RcxGaHDZTPWlJRaCaxFmCm9aDUBAcwTSHeJr1B8&e=" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/safestack/utils.h?rev=239763&view=auto</a><br>
> > > ><br>
> > ==============================================================================<br>
> > > > --- compiler-rt/trunk/test/safestack/utils.h (added)<br>
> > > > +++ compiler-rt/trunk/test/safestack/utils.h Mon Jun 15 16:08:47 2015<br>
> > > > @@ -0,0 +1,8 @@<br>
> > > > +#ifndef UTILS_H<br>
> > > > +#define UTILS_H<br>
> > > > +<br>
> > > > +static inline void break_optimization(void *arg) {<br>
> > > > +  __asm__ __volatile__("" : : "r" (arg) : "memory");<br>
> > > > +}<br>
> > > > +<br>
> > > > +#endif<br>
> > > ><br>
> > > ><br>
> > > > _______________________________________________<br>
> > > > llvm-commits mailing list<br>
> > > > <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> > > > <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
> > ><br>
> ><br>
> > --<br>
> > Peter<br>
> > _______________________________________________<br>
> > llvm-commits mailing list<br>
> > <a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
> > <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
> ><br>
<br>
</div></div><span class="HOEnZb"><font color="#888888">--<br>
Peter<br>
</font></span></blockquote></div><br></div>