<div dir="ltr">"slightly?"  More like hugely.  ;)<div><br></div><div>However, local statics are not thread safe with MSVC yet.  You may want to use something like InitOnceExecuteOnce: <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms683493(v=vs.85).aspx">http://msdn.microsoft.com/en-us/library/windows/desktop/ms683493(v=vs.85).aspx</a></div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Sep 23, 2013 at 4:40 AM, Timur Iskhodzhanov <span dir="ltr"><<a href="mailto:timurrrr@google.com" target="_blank">timurrrr@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: timurrrr<br>
Date: Mon Sep 23 06:40:58 2013<br>
New Revision: 191190<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=191190&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=191190&view=rev</a><br>
Log:<br>
[ASan/Win] Slightly optimize the DLL thunk<br>
<br>
Modified:<br>
    compiler-rt/trunk/lib/asan/asan_dll_thunk.cc<br>
<br>
Modified: compiler-rt/trunk/lib/asan/asan_dll_thunk.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_dll_thunk.cc?rev=191190&r1=191189&r2=191190&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_dll_thunk.cc?rev=191190&r1=191189&r2=191190&view=diff</a><br>

==============================================================================<br>
--- compiler-rt/trunk/lib/asan/asan_dll_thunk.cc (original)<br>
+++ compiler-rt/trunk/lib/asan/asan_dll_thunk.cc Mon Sep 23 06:40:58 2013<br>
@@ -38,63 +38,63 @@ static void *getRealProcAddressOrDie(con<br>
 #define WRAP_V_V(name)                                                         \<br>
   extern "C" void name() {                                                     \<br>
     typedef void (*fntype)();                                                  \<br>
-    fntype fn = (fntype)getRealProcAddressOrDie(#name);                        \<br>
+    static fntype fn = (fntype)getRealProcAddressOrDie(#name);                 \<br>
     fn();                                                                      \<br>
   }<br>
<br>
 #define WRAP_V_W(name)                                                         \<br>
   extern "C" void name(void *arg) {                                            \<br>
     typedef void (*fntype)(void *arg);                                         \<br>
-    fntype fn = (fntype)getRealProcAddressOrDie(#name);                        \<br>
+    static fntype fn = (fntype)getRealProcAddressOrDie(#name);                 \<br>
     fn(arg);                                                                   \<br>
   }<br>
<br>
 #define WRAP_V_WW(name)                                                        \<br>
   extern "C" void name(void *arg1, void *arg2) {                               \<br>
     typedef void (*fntype)(void *, void *);                                    \<br>
-    fntype fn = (fntype)getRealProcAddressOrDie(#name);                        \<br>
+    static fntype fn = (fntype)getRealProcAddressOrDie(#name);                 \<br>
     fn(arg1, arg2);                                                            \<br>
   }<br>
<br>
 #define WRAP_V_WWW(name)                                                       \<br>
   extern "C" void name(void *arg1, void *arg2, void *arg3) {                   \<br>
     typedef void *(*fntype)(void *, void *, void *);                           \<br>
-    fntype fn = (fntype)getRealProcAddressOrDie(#name);                        \<br>
+    static fntype fn = (fntype)getRealProcAddressOrDie(#name);                 \<br>
     fn(arg1, arg2, arg3);                                                      \<br>
   }<br>
<br>
 #define WRAP_W_V(name)                                                         \<br>
   extern "C" void *name() {                                                    \<br>
     typedef void *(*fntype)();                                                 \<br>
-    fntype fn = (fntype)getRealProcAddressOrDie(#name);                        \<br>
+    static fntype fn = (fntype)getRealProcAddressOrDie(#name);                 \<br>
     return fn();                                                               \<br>
   }<br>
<br>
 #define WRAP_W_W(name)                                                         \<br>
   extern "C" void *name(void *arg) {                                           \<br>
     typedef void *(*fntype)(void *arg);                                        \<br>
-    fntype fn = (fntype)getRealProcAddressOrDie(#name);                        \<br>
+    static fntype fn = (fntype)getRealProcAddressOrDie(#name);                 \<br>
     return fn(arg);                                                            \<br>
   }<br>
<br>
 #define WRAP_W_WW(name)                                                        \<br>
   extern "C" void *name(void *arg1, void *arg2) {                              \<br>
     typedef void *(*fntype)(void *, void *);                                   \<br>
-    fntype fn = (fntype)getRealProcAddressOrDie(#name);                        \<br>
+    static fntype fn = (fntype)getRealProcAddressOrDie(#name);                 \<br>
     return fn(arg1, arg2);                                                     \<br>
   }<br>
<br>
 #define WRAP_W_WWW(name)                                                       \<br>
   extern "C" void *name(void *arg1, void *arg2, void *arg3) {                  \<br>
     typedef void *(*fntype)(void *, void *, void *);                           \<br>
-    fntype fn = (fntype)getRealProcAddressOrDie(#name);                        \<br>
+    static fntype fn = (fntype)getRealProcAddressOrDie(#name);                 \<br>
     return fn(arg1, arg2, arg3);                                               \<br>
   }<br>
<br>
 #define WRAP_W_WWWW(name)                                                      \<br>
   extern "C" void *name(void *arg1, void *arg2, void *arg3, void *arg4) {      \<br>
     typedef void *(*fntype)(void *, void *, void *, void *);                   \<br>
-    fntype fn = (fntype)getRealProcAddressOrDie(#name);                        \<br>
+    static fntype fn = (fntype)getRealProcAddressOrDie(#name);                 \<br>
     return fn(arg1, arg2, arg3, arg4);                                         \<br>
   }<br>
<br>
@@ -102,7 +102,7 @@ static void *getRealProcAddressOrDie(con<br>
   extern "C" void *name(void *arg1, void *arg2, void *arg3, void *arg4,        \<br>
                         void *arg5) {                                          \<br>
     typedef void *(*fntype)(void *, void *, void *, void *, void *);           \<br>
-    fntype fn = (fntype)getRealProcAddressOrDie(#name);                        \<br>
+    static fntype fn = (fntype)getRealProcAddressOrDie(#name);                 \<br>
     return fn(arg1, arg2, arg3, arg4, arg5);                                   \<br>
   }<br>
<br>
@@ -110,7 +110,7 @@ static void *getRealProcAddressOrDie(con<br>
   extern "C" void *name(void *arg1, void *arg2, void *arg3, void *arg4,        \<br>
                         void *arg5, void *arg6) {                              \<br>
     typedef void *(*fntype)(void *, void *, void *, void *, void *, void *);   \<br>
-    fntype fn = (fntype)getRealProcAddressOrDie(#name);                        \<br>
+    static fntype fn = (fntype)getRealProcAddressOrDie(#name);                 \<br>
     return fn(arg1, arg2, arg3, arg4, arg5, arg6);                             \<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></div>