[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:38:16 PDT 2017


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