[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 18:13:23 PDT 2017


That seems to have worked, thanks!

Douglas Yung

> -----Original Message-----
> From: Evgenii Stepanov [mailto:eugeni.stepanov at gmail.com]
> Sent: Friday, March 17, 2017 17:38
> To: Yung, Douglas
> Cc: llvm-commits at lists.llvm.org
> Subject: Re: [compiler-rt] r298159 - [asan] Fix dead stripping of globals on
> Linux (compiler-rt)
> 
> Should be fixed in r298174
> 
> On Fri, Mar 17, 2017 at 5:08 PM, Evgenii Stepanov <eugeni.stepanov at gmail.com>
> wrote:
> > Hi,
> >
> > I've reproduced the problem. Looking...
> >
> > On Fri, Mar 17, 2017 at 5:03 PM, Yung, Douglas <douglas.yung at sony.com>
> wrote:
> >> 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&vie
> >>> w=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&vie
> >>> w=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