<div dir="ltr"><br><div class="gmail_extra"><div class="gmail_quote">On Wed, Feb 20, 2013 at 6:28 PM, Kostya Serebryany <span dir="ltr"><<a href="mailto:kcc@google.com" target="_blank">kcc@google.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: kcc<br>
Date: Wed Feb 20 08:28:08 2013<br>
New Revision: 175623<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=175623&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=175623&view=rev</a><br>
Log:<br>
[asan] on linux, run __asan_init from .preinit_array (even earlier than before)<br>
<br>
Added:<br>
    compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc<br>
Modified:<br>
    compiler-rt/trunk/lib/asan/asan_internal.h<br>
    compiler-rt/trunk/lib/asan/asan_rtl.cc<br>
<br>
Modified: compiler-rt/trunk/lib/asan/asan_internal.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_internal.h?rev=175623&r1=175622&r2=175623&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_internal.h?rev=175623&r1=175622&r2=175623&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/asan/asan_internal.h (original)<br>
+++ compiler-rt/trunk/lib/asan/asan_internal.h Wed Feb 20 08:28:08 2013<br>
@@ -91,6 +91,10 @@<br>
 # endif<br>
 #endif<br>
<br>
+#ifndef ASAN_USE_PREINIT_ARRAY<br>
+# define ASAN_USE_PREINIT_ARRAY (ASAN_LINUX && !ASAN_ANDROID)<br>
+#endif<br>
+<br>
 // All internal functions in asan reside inside the __asan namespace<br>
 // to avoid namespace collisions with the user programs.<br>
 // Seperate namespace also makes it simpler to distinguish the asan run-time<br>
<br>
Modified: compiler-rt/trunk/lib/asan/asan_rtl.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=175623&r1=175622&r2=175623&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_rtl.cc?rev=175623&r1=175622&r2=175623&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/asan/asan_rtl.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/asan_rtl.cc Wed Feb 20 08:28:08 2013<br>
@@ -522,12 +522,12 @@ void __asan_init() {<br>
   }<br>
 }<br>
<br>
-#if defined(ASAN_USE_PREINIT_ARRAY)<br>
+#if ASAN_USE_PREINIT_ARRAY<br>
   // On Linux, we force __asan_init to be called before anyone else<br>
   // by placing it into .preinit_array section.<br>
   // FIXME: do we have anything like this on Mac?<br>
   __attribute__((section(".preinit_array")))<br>
-    typeof(__asan_init) *__asan_preinit =__asan_init;<br>
+  void (*__asan_preinit)(void) =__asan_init;<br>
 #elif defined(_WIN32) && defined(_DLL)<br>
   // On Windows, when using dynamic CRT (/MD), we can put a pointer<br>
   // to __asan_init into the global list of C initializers.<br>
<br>
Added: compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc?rev=175623&view=auto" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc?rev=175623&view=auto</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc (added)<br>
+++ compiler-rt/trunk/lib/asan/lit_tests/preinit_test.cc Wed Feb 20 08:28:08 2013<br></blockquote><div><br></div><div style>Shouldn't this test be run on Linux only?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

@@ -0,0 +1,27 @@<br>
+// RUN: %clangxx      -DFUNC=zzzz %s -shared -o %t.so -fPIC<br>
+// RUN: %clangxx_asan -DFUNC=main %s         -o %t    -Wl,-R. %t.so<br>
+// RUN: %t<br>
+<br>
+// This test ensures that we call __asan_init early enough.<br>
+// We build a shared library w/o asan instrumentation<br>
+// and the binary with asan instrumentation.<br>
+// Both files include the same header (emulated by -DFUNC here)<br>
+// with C++ template magic which runs global initializer at library load time.<br>
+// The function get() is instrumented with asan, but called<br>
+// before the usual constructors are run.<br>
+// So, we must make sure that __asan_init is executed even earlier.<br>
+//<br>
+// See <a href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56393" target="_blank">http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56393</a><br>
+<br>
+struct A {<br>
+  int foo() const { return 0; }<br>
+};<br>
+A get () { return A(); }<br>
+template <class> struct O {<br>
+  static A const e;<br>
+};<br>
+template <class T> A const O <T>::e = get();<br>
+int FUNC() {<br>
+  return O<int>::e.foo();<br>
+}<br>
+<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div>Alexey Samsonov, MSK</div>
</div></div>