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

Evgenii Stepanov via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 17 17:08:36 PDT 2017


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&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