[compiler-rt] r175623 - [asan] on linux, run __asan_init from .preinit_array (even earlier than before)

Kostya Serebryany kcc at google.com
Wed Feb 20 07:01:21 PST 2013


Err, yea. It fails on Mac with "ld: unknown option: -R."
Alexander, could you please check if this test could be made Mac-friendly?
Os should we just move it to Linux-only?

--kcc



On Wed, Feb 20, 2013 at 6:57 PM, Alexey Samsonov <samsonov at google.com>wrote:

>
> On Wed, Feb 20, 2013 at 6:28 PM, Kostya Serebryany <kcc at google.com> wrote:
>
>> Author: kcc
>> Date: Wed Feb 20 08:28:08 2013
>> New Revision: 175623
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=175623&view=rev
>> Log:
>> [asan] on linux, run __asan_init from .preinit_array (even earlier than
>> before)
>>
>> Added:
>>     compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc
>> Modified:
>>     compiler-rt/trunk/lib/asan/asan_internal.h
>>     compiler-rt/trunk/lib/asan/asan_rtl.cc
>>
>> Modified: compiler-rt/trunk/lib/asan/asan_internal.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_internal.h?rev=175623&r1=175622&r2=175623&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/asan/asan_internal.h (original)
>> +++ compiler-rt/trunk/lib/asan/asan_internal.h Wed Feb 20 08:28:08 2013
>> @@ -91,6 +91,10 @@
>>  # endif
>>  #endif
>>
>> +#ifndef ASAN_USE_PREINIT_ARRAY
>> +# define ASAN_USE_PREINIT_ARRAY (ASAN_LINUX && !ASAN_ANDROID)
>> +#endif
>> +
>>  // All internal functions in asan reside inside the __asan namespace
>>  // to avoid namespace collisions with the user programs.
>>  // Seperate namespace also makes it simpler to distinguish the asan
>> run-time
>>
>> Modified: compiler-rt/trunk/lib/asan/asan_rtl.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=175623&r1=175622&r2=175623&view=diff
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/asan/asan_rtl.cc (original)
>> +++ compiler-rt/trunk/lib/asan/asan_rtl.cc Wed Feb 20 08:28:08 2013
>> @@ -522,12 +522,12 @@ void __asan_init() {
>>    }
>>  }
>>
>> -#if defined(ASAN_USE_PREINIT_ARRAY)
>> +#if ASAN_USE_PREINIT_ARRAY
>>    // On Linux, we force __asan_init to be called before anyone else
>>    // by placing it into .preinit_array section.
>>    // FIXME: do we have anything like this on Mac?
>>    __attribute__((section(".preinit_array")))
>> -    typeof(__asan_init) *__asan_preinit =__asan_init;
>> +  void (*__asan_preinit)(void) =__asan_init;
>>  #elif defined(_WIN32) && defined(_DLL)
>>    // On Windows, when using dynamic CRT (/MD), we can put a pointer
>>    // to __asan_init into the global list of C initializers.
>>
>> Added: compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc
>> URL:
>> http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc?rev=175623&view=auto
>>
>> ==============================================================================
>> --- compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc (added)
>> +++ compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc Wed Feb 20
>> 08:28:08 2013
>>
>
> Shouldn't this test be run on Linux only?
>
>
>> @@ -0,0 +1,27 @@
>> +// RUN: %clangxx      -DFUNC=zzzz %s -shared -o %t.so -fPIC
>> +// RUN: %clangxx_asan -DFUNC=main %s         -o %t    -Wl,-R. %t.so
>> +// RUN: %t
>> +
>> +// This test ensures that we call __asan_init early enough.
>> +// We build a shared library w/o asan instrumentation
>> +// and the binary with asan instrumentation.
>> +// Both files include the same header (emulated by -DFUNC here)
>> +// with C++ template magic which runs global initializer at library load
>> time.
>> +// The function get() is instrumented with asan, but called
>> +// before the usual constructors are run.
>> +// So, we must make sure that __asan_init is executed even earlier.
>> +//
>> +// See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56393
>> +
>> +struct A {
>> +  int foo() const { return 0; }
>> +};
>> +A get () { return A(); }
>> +template <class> struct O {
>> +  static A const e;
>> +};
>> +template <class T> A const O <T>::e = get();
>> +int FUNC() {
>> +  return O<int>::e.foo();
>> +}
>> +
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>>
>
>
>
> --
> Alexey Samsonov, MSK
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130220/46e8f110/attachment.html>


More information about the llvm-commits mailing list