[compiler-rt] r298159 - [asan] Fix dead stripping of globals on Linux (compiler-rt)

Yung, Douglas via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 17 17:03:21 PDT 2017


Hi Evgeniy,

Your change here seems to be breaking our internal linux bot when trying to run cmake.

Command: cmake -G Ninja -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_ENABLE_TIMESTAMPS=OFF -DLLVM_VERSION_SUFFIX= -DLLVM_BUILD_RUNTIME=ON -DLLVM_LIT_ARGS=--verbose --no-progress-bar --xunit-xml-output=xunit.xml -DCMAKE_BUILD_TYPE=Release -DLLVM_TOOL_LLD_BUILD=OFF ../llvm

CMake output:
...
CMake Error at cmake/modules/AddLLVM.cmake:1174 (add_dependencies):
  The dependency target "lld" of target "check-all" does not exist.
Call Stack (most recent call first):
  CMakeLists.txt:900 (add_lit_target)


CMake Error at cmake/modules/AddLLVM.cmake:1174 (add_dependencies):
  The dependency target "lld" of target "check-asan-dynamic" does not exist.
Call Stack (most recent call first):
  cmake/modules/AddLLVM.cmake:1195 (add_lit_target)
  projects/compiler-rt/test/asan/CMakeLists.txt:101 (add_lit_testsuite)


CMake Error at cmake/modules/AddLLVM.cmake:1174 (add_dependencies):
  The dependency target "lld" of target "check-asan" does not exist.
Call Stack (most recent call first):
  cmake/modules/AddLLVM.cmake:1195 (add_lit_target)
  projects/compiler-rt/test/asan/CMakeLists.txt:89 (add_lit_testsuite)


I don't know if it makes a difference, but we do have the LLD sources in our tree, however we are not building them at this time. Could that be what is happening here?

Douglas Yung

> -----Original Message-----
> From: llvm-commits [mailto:llvm-commits-bounces at lists.llvm.org] On Behalf Of
> Evgeniy Stepanov via llvm-commits
> Sent: Friday, March 17, 2017 15:18
> To: llvm-commits at lists.llvm.org
> Subject: [compiler-rt] r298159 - [asan] Fix dead stripping of globals on Linux
> (compiler-rt)
> 
> Author: eugenis
> Date: Fri Mar 17 17:17:38 2017
> New Revision: 298159
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=298159&view=rev
> Log:
> [asan] Fix dead stripping of globals on Linux (compiler-rt)
> 
> Runtime support for the new instrumentation of globals based on !associated,
> and a bunch of tests.
> 
> Differential Revision: https://reviews.llvm.org/D30120
> 
> Added:
>     compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-bfd.cc
>     compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-lld.cc
>     compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections-lld.cc
> Modified:
>     compiler-rt/trunk/lib/asan/asan_globals.cc
>     compiler-rt/trunk/lib/asan/asan_interface.inc
>     compiler-rt/trunk/lib/asan/asan_interface_internal.h
>     compiler-rt/trunk/test/asan/CMakeLists.txt
>     compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections.cc
> 
> Modified: compiler-rt/trunk/lib/asan/asan_globals.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/lib/asan/asan_globals.cc?rev=298159&r1=298158&r2=298159&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/asan_globals.cc (original)
> +++ compiler-rt/trunk/lib/asan/asan_globals.cc Fri Mar 17 17:17:38 2017
> @@ -332,6 +332,26 @@ void __asan_unregister_image_globals(upt
>    *flag = 0;
>  }
> 
> +void __asan_register_elf_globals(uptr *flag, void *start, void *stop) {
> +  if (*flag) return;
> +  if (!start) return;
> +  CHECK_EQ(0, ((uptr)stop - (uptr)start) % sizeof(__asan_global));
> +  __asan_global *globals_start = (__asan_global*)start;
> +  __asan_global *globals_stop = (__asan_global*)stop;
> +  __asan_register_globals(globals_start, globals_stop - globals_start);
> +  *flag = 1;
> +}
> +
> +void __asan_unregister_elf_globals(uptr *flag, void *start, void *stop)
> +{
> +  if (!*flag) return;
> +  if (!start) return;
> +  CHECK_EQ(0, ((uptr)stop - (uptr)start) % sizeof(__asan_global));
> +  __asan_global *globals_start = (__asan_global*)start;
> +  __asan_global *globals_stop = (__asan_global*)stop;
> +  __asan_unregister_globals(globals_start, globals_stop -
> +globals_start);
> +  *flag = 0;
> +}
> +
>  // Register an array of globals.
>  void __asan_register_globals(__asan_global *globals, uptr n) {
>    if (!flags()->report_globals) return;
> 
> Modified: compiler-rt/trunk/lib/asan/asan_interface.inc
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/lib/asan/asan_interface.inc?rev=298159&r1=298158&r2=298159&view=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/asan_interface.inc (original)
> +++ compiler-rt/trunk/lib/asan/asan_interface.inc Fri Mar 17 17:17:38
> +++ 2017
> @@ -64,6 +64,7 @@ INTERFACE_FUNCTION(__asan_poison_stack_m
>  INTERFACE_FUNCTION(__asan_print_accumulated_stats)
>  INTERFACE_FUNCTION(__asan_region_is_poisoned)
>  INTERFACE_FUNCTION(__asan_register_globals)
> +INTERFACE_FUNCTION(__asan_register_elf_globals)
>  INTERFACE_FUNCTION(__asan_register_image_globals)
>  INTERFACE_FUNCTION(__asan_report_error)
>  INTERFACE_FUNCTION(__asan_report_exp_load1)
> @@ -149,6 +150,7 @@ INTERFACE_FUNCTION(__asan_unpoison_intra
>  INTERFACE_FUNCTION(__asan_unpoison_memory_region)
>  INTERFACE_FUNCTION(__asan_unpoison_stack_memory)
>  INTERFACE_FUNCTION(__asan_unregister_globals)
> +INTERFACE_FUNCTION(__asan_unregister_elf_globals)
>  INTERFACE_FUNCTION(__asan_unregister_image_globals)
>  INTERFACE_FUNCTION(__asan_version_mismatch_check_v8)
>  INTERFACE_FUNCTION(__sanitizer_finish_switch_fiber)
> 
> Modified: compiler-rt/trunk/lib/asan/asan_interface_internal.h
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/lib/asan/asan_interface_internal.h?rev=298159&r1=298158&r2=298159&vie
> w=diff
> ==============================================================================
> --- compiler-rt/trunk/lib/asan/asan_interface_internal.h (original)
> +++ compiler-rt/trunk/lib/asan/asan_interface_internal.h Fri Mar 17
> +++ 17:17:38 2017
> @@ -67,6 +67,11 @@ extern "C" {
>    SANITIZER_INTERFACE_ATTRIBUTE
>    void __asan_unregister_image_globals(uptr *flag);
> 
> +  SANITIZER_INTERFACE_ATTRIBUTE
> +  void __asan_register_elf_globals(uptr *flag, void *start, void
> + *stop);  SANITIZER_INTERFACE_ATTRIBUTE  void
> + __asan_unregister_elf_globals(uptr *flag, void *start, void *stop);
> +
>    // These two functions should be called by the instrumented code.
>    // 'globals' is an array of structures describing 'n' globals.
>    SANITIZER_INTERFACE_ATTRIBUTE
> 
> Modified: compiler-rt/trunk/test/asan/CMakeLists.txt
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/test/asan/CMakeLists.txt?rev=298159&r1=298158&r2=298159&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/asan/CMakeLists.txt (original)
> +++ compiler-rt/trunk/test/asan/CMakeLists.txt Fri Mar 17 17:17:38 2017
> @@ -16,7 +16,7 @@ endmacro()
>  set(ASAN_TEST_DEPS ${SANITIZER_COMMON_LIT_TEST_DEPS})
>  if(NOT COMPILER_RT_STANDALONE_BUILD)
>    list(APPEND ASAN_TEST_DEPS asan)
> -  if(WIN32 AND COMPILER_RT_HAS_LLD_SOURCES)
> +  if(NOT APPLE AND COMPILER_RT_HAS_LLD_SOURCES)
>      list(APPEND ASAN_TEST_DEPS
>        lld
>      )
> 
> Added: compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-bfd.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/test/asan/TestCases/Linux/global-overflow-bfd.cc?rev=298159&view=auto
> ==============================================================================
> --- compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-bfd.cc (added)
> +++ compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-bfd.cc
> +++ Fri Mar 17 17:17:38 2017
> @@ -0,0 +1,18 @@
> +// Test that gc-sections-friendly instrumentation of globals does not
> +introduce // false negatives with the BFD linker.
> +// RUN: %clangxx_asan -fuse-ld=bfd -Wl,-gc-sections -ffunction-sections
> +-fdata-sections -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s
> +
> +#include <string.h>
> +int main(int argc, char **argv) {
> +  static char XXX[10];
> +  static char YYY[10];
> +  static char ZZZ[10];
> +  memset(XXX, 0, 10);
> +  memset(YYY, 0, 10);
> +  memset(ZZZ, 0, 10);
> +  int res = YYY[argc * 10];  // BOOOM
> +  // CHECK: {{READ of size 1 at}}
> +  // CHECK: {{located 0 bytes to the right of global variable}}
> +  res += XXX[argc] + ZZZ[argc];
> +  return res;
> +}
> 
> Added: compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-lld.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/test/asan/TestCases/Linux/global-overflow-lld.cc?rev=298159&view=auto
> ==============================================================================
> --- compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-lld.cc (added)
> +++ compiler-rt/trunk/test/asan/TestCases/Linux/global-overflow-lld.cc
> +++ Fri Mar 17 17:17:38 2017
> @@ -0,0 +1,19 @@
> +// Test that gc-sections-friendly instrumentation of globals does not
> +introduce // false negatives with the LLD linker.
> +// RUN: %clangxx_asan -fuse-ld=lld -Wl,-gc-sections -ffunction-sections
> +-fdata-sections -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s //
> +REQUIRES: lld
> +
> +#include <string.h>
> +int main(int argc, char **argv) {
> +  static char XXX[10];
> +  static char YYY[10];
> +  static char ZZZ[10];
> +  memset(XXX, 0, 10);
> +  memset(YYY, 0, 10);
> +  memset(ZZZ, 0, 10);
> +  int res = YYY[argc * 10];  // BOOOM
> +  // CHECK: {{READ of size 1 at}}
> +  // CHECK: {{located 0 bytes to the right of global variable}}
> +  res += XXX[argc] + ZZZ[argc];
> +  return res;
> +}
> 
> Added: compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections-lld.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/test/asan/TestCases/Linux/globals-gc-sections-
> lld.cc?rev=298159&view=auto
> ==============================================================================
> --- compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections-lld.cc
> (added)
> +++ compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections-lld.
> +++ cc Fri Mar 17 17:17:38 2017
> @@ -0,0 +1,15 @@
> +// RUN: %clangxx_asan %s -o %t -Wl,--gc-sections -fuse-ld=lld
> +-ffunction-sections -fdata-sections -mllvm -asan-globals=0 // RUN:
> +%clangxx_asan %s -o %t -Wl,--gc-sections -fuse-ld=lld
> +-ffunction-sections -fdata-sections -mllvm -asan-globals=1
> +
> +// https://code.google.com/p/address-sanitizer/issues/detail?id=260
> +// REQUIRES: lld
> +
> +int undefined();
> +
> +// On i386 clang adds --export-dynamic when linking with ASan, which
> +adds all // non-hidden globals to GC roots.
> +__attribute__((visibility("hidden"))) int (*unused)() = undefined;
> +
> +int main() {
> +        return 0;
> +}
> 
> Modified: compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections.cc
> URL: http://llvm.org/viewvc/llvm-project/compiler-
> rt/trunk/test/asan/TestCases/Linux/globals-gc-
> sections.cc?rev=298159&r1=298158&r2=298159&view=diff
> ==============================================================================
> --- compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections.cc
> (original)
> +++ compiler-rt/trunk/test/asan/TestCases/Linux/globals-gc-sections.cc
> +++ Fri Mar 17 17:17:38 2017
> @@ -1,12 +1,18 @@
> -// RUN: %clangxx_asan %s -o %t -Wl,--gc-sections -ffunction-sections -mllvm -
> asan-globals=0 -// RUN: %clangxx_asan %s -o %t -Wl,--gc-sections -ffunction-
> sections -mllvm -asan-globals=1
> +// RUN: %clangxx_asan %s -o %t -Wl,--gc-sections -fuse-ld=bfd
> +-ffunction-sections -fdata-sections -mllvm -asan-globals=0 // RUN:
> +%clangxx_asan %s -o %t -Wl,--gc-sections -fuse-ld=bfd
> +-ffunction-sections -fdata-sections -mllvm -asan-globals=1
> 
>  // https://code.google.com/p/address-sanitizer/issues/detail?id=260
> -// XFAIL: *
> 
>  int undefined();
> 
> -int (*unused)() = undefined;
> +// bug in ld.bfd: with multiple "asan_globals" sections,
> +__start_asan_globals is // treated as a strong GC reference to the
> +first such section. As a result, the // first (for some definition of the
> word) global is never gc-ed.
> +int first_unused = 42;
> +
> +// On i386 clang adds --export-dynamic when linking with ASan, which
> +adds all // non-hidden globals to GC roots.
> +__attribute__((visibility("hidden"))) int (*unused)() = undefined;
> 
>  int main() {
>          return 0;
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list