<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi Reid,<div class=""><br class=""></div><div class="">could you please take a look at this bot: <span style="font-family: 'Segoe UI', 'Segoe UI Web Regular', 'Segoe UI Symbol', Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; background-color: rgb(255, 255, 255);" class=""> </span><font color="#136cb2" face="Segoe UI, Segoe UI Web Regular, Segoe UI Symbol, Lato, Helvetica Neue, Helvetica, Arial, sans-serif" size="2" class=""><span style="cursor: pointer;" class=""><a href="http://lab.llvm.org:8080/green/job/clang-stage2-configure-Rlto_check/9576/consoleFull#-15796076f80f5c9c-2aaa-47fb-b15d-be39b7128d72" class="">http://lab.llvm.org:8080/green/job/clang-stage2-configure-Rlto_check/9576/consoleFull#-15796076f80f5c9c-2aaa-47fb-b15d-be39b7128d72</a></span></font><font face="Segoe UI, Segoe UI Web Regular, Segoe UI Symbol, Lato, Helvetica Neue, Helvetica, Arial, sans-serif" size="2" class=""><span style="background-color: rgb(255, 255, 255);" class=""> ?</span></font></div><div class=""><font face="Segoe UI, Segoe UI Web Regular, Segoe UI Symbol, Lato, Helvetica Neue, Helvetica, Arial, sans-serif" size="2" class=""><span style="background-color: rgb(255, 255, 255);" class=""><br class=""></span></font></div><div class=""><span style="font-family: 'Segoe UI', 'Segoe UI Web Regular', 'Segoe UI Symbol', Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; background-color: rgb(255, 255, 255);" class="">This is failing the SanitizerLintCheck.</span></div><div class=""><span style="font-family: 'Segoe UI', 'Segoe UI Web Regular', 'Segoe UI Symbol', Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; background-color: rgb(255, 255, 255);" class=""><br class=""></span></div><div class=""><span style="font-family: 'Segoe UI', 'Segoe UI Web Regular', 'Segoe UI Symbol', Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; background-color: rgb(255, 255, 255);" class="">Thanks</span></div><div class=""><span style="font-family: 'Segoe UI', 'Segoe UI Web Regular', 'Segoe UI Symbol', Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; background-color: rgb(255, 255, 255);" class=""><br class=""></span></div><div class=""><span style="font-family: 'Segoe UI', 'Segoe UI Web Regular', 'Segoe UI Symbol', Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; background-color: rgb(255, 255, 255);" class="">Cheers,</span></div><div class=""><span style="font-family: 'Segoe UI', 'Segoe UI Web Regular', 'Segoe UI Symbol', Lato, 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: 13px; background-color: rgb(255, 255, 255);" class="">Juergen</span></div><div class=""><font face="Segoe UI, Segoe UI Web Regular, Segoe UI Symbol, Lato, Helvetica Neue, Helvetica, Arial, sans-serif" size="2" class=""><span style="background-color: rgb(255, 255, 255);" class=""><br class=""></span></font><div><blockquote type="cite" class=""><div class="">On Nov 8, 2016, at 12:45 PM, Reid Kleckner via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Author: rnk<br class="">Date: Tue Nov  8 14:45:45 2016<br class="">New Revision: 286290<br class=""><br class="">URL: <a href="http://llvm.org/viewvc/llvm-project?rev=286290&view=rev" class="">http://llvm.org/viewvc/llvm-project?rev=286290&view=rev</a><br class="">Log:<br class="">[asan/win] Add init hooks to .CRT$XLAB<br class=""><br class="">Summary:<br class="">User applications may register hooks in the .CRT$XL* callback list,<br class="">which is called very early by the loader. This is very common in<br class="">Chromium:<br class=""><a href="https://cs.chromium.org/search/?q=CRT.XL&sq=package:chromium&type=cs" class="">https://cs.chromium.org/search/?q=CRT.XL&sq=package:chromium&type=cs</a><br class=""><br class="">This has flown under the radar for a long time because the loader<br class="">appears to catch exceptions originating from these callbacks. It's a<br class="">real problem when you're debugging an asan application, though, since it<br class="">makes the program crash early.<br class=""><br class="">The solution is to add our own callback to this list, and sort it very<br class="">early in the list like we do elsewhere. Also add a test with such an<br class="">instrumented callback, and test that it gets called with asan.<br class=""><br class="">Reviewers: etienneb<br class=""><br class="">Subscribers: llvm-commits, kubabrecka<br class=""><br class="">Differential Revision: https://reviews.llvm.org/D26404<br class=""><br class="">Added:<br class="">    compiler-rt/trunk/test/asan/TestCases/Windows/tls_init.cc<br class="">Modified:<br class="">    compiler-rt/trunk/lib/asan/asan_win.cc<br class="">    compiler-rt/trunk/lib/asan/asan_win_dll_thunk.cc<br class="">    compiler-rt/trunk/lib/asan/asan_win_dynamic_runtime_thunk.cc<br class=""><br class="">Modified: compiler-rt/trunk/lib/asan/asan_win.cc<br class="">URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_win.cc?rev=286290&r1=286289&r2=286290&view=diff<br class="">==============================================================================<br class="">--- compiler-rt/trunk/lib/asan/asan_win.cc (original)<br class="">+++ compiler-rt/trunk/lib/asan/asan_win.cc Tue Nov  8 14:45:45 2016<br class="">@@ -343,9 +343,23 @@ int __asan_set_seh_filter() {<br class=""> // immediately after the CRT runs. This way, our exception filter is called<br class=""> // first and we can delegate to their filter if appropriate.<br class=""> #pragma section(".CRT$XCAB", long, read)  // NOLINT<br class="">-__declspec(allocate(".CRT$XCAB"))<br class="">-    int (*__intercept_seh)() = __asan_set_seh_filter;<br class="">+__declspec(allocate(".CRT$XCAB")) int (*__intercept_seh)() =<br class="">+    __asan_set_seh_filter;<br class="">+<br class="">+// Piggyback on the TLS initialization callback directory to initialize asan as<br class="">+// early as possible. Initializers in .CRT$XL* are called directly by ntdll,<br class="">+// which run before the CRT. Users also add code to .CRT$XLC, so it's important<br class="">+// to run our initializers first.<br class="">+static void NTAPI asan_thread_init(void *module, DWORD reason, void *reserved) {<br class="">+  if (reason == DLL_PROCESS_ATTACH) __asan_init();<br class="">+}<br class="">+<br class="">+#pragma section(".CRT$XLAB", long, read)  // NOLINT<br class="">+__declspec(allocate(".CRT$XLAB")) void (NTAPI *__asan_tls_init)(<br class="">+    void *, unsigned long, void *) = asan_thread_init;<br class=""> #endif<br class="">+<br class="">+<br class=""> // }}}<br class=""> }  // namespace __asan<br class=""><br class=""><br class="">Modified: compiler-rt/trunk/lib/asan/asan_win_dll_thunk.cc<br class="">URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_win_dll_thunk.cc?rev=286290&r1=286289&r2=286290&view=diff<br class="">==============================================================================<br class="">--- compiler-rt/trunk/lib/asan/asan_win_dll_thunk.cc (original)<br class="">+++ compiler-rt/trunk/lib/asan/asan_win_dll_thunk.cc Tue Nov  8 14:45:45 2016<br class="">@@ -456,4 +456,19 @@ static int call_asan_init() {<br class=""> #pragma section(".CRT$XIB", long, read)  // NOLINT<br class=""> __declspec(allocate(".CRT$XIB")) int (*__asan_preinit)() = call_asan_init;<br class=""><br class="">+#ifdef _M_IX86<br class="">+#define NTAPI __stdcall<br class="">+#else<br class="">+#define NTAPI<br class="">+#endif<br class="">+<br class="">+static void NTAPI asan_thread_init(void *mod, unsigned long reason,<br class="">+                                   void *reserved) {<br class="">+  if (reason == /*DLL_PROCESS_ATTACH=*/1) __asan_init();<br class="">+}<br class="">+<br class="">+#pragma section(".CRT$XLAB", long, read)  // NOLINT<br class="">+__declspec(allocate(".CRT$XLAB")) void (NTAPI *__asan_tls_init)(<br class="">+    void *, unsigned long, void *) = asan_thread_init;<br class="">+<br class=""> #endif // ASAN_DLL_THUNK<br class=""><br class="">Modified: compiler-rt/trunk/lib/asan/asan_win_dynamic_runtime_thunk.cc<br class="">URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_win_dynamic_runtime_thunk.cc?rev=286290&r1=286289&r2=286290&view=diff<br class="">==============================================================================<br class="">--- compiler-rt/trunk/lib/asan/asan_win_dynamic_runtime_thunk.cc (original)<br class="">+++ compiler-rt/trunk/lib/asan/asan_win_dynamic_runtime_thunk.cc Tue Nov  8 14:45:45 2016<br class="">@@ -33,6 +33,7 @@<br class=""> #pragma section(".CRT$XCAB", long, read)  // NOLINT<br class=""> #pragma section(".CRT$XTW", long, read)  // NOLINT<br class=""> #pragma section(".CRT$XTY", long, read)  // NOLINT<br class="">+#pragma section(".CRT$XLAB", long, read)  // NOLINT<br class=""><br class=""> ////////////////////////////////////////////////////////////////////////////////<br class=""> // Define a copy of __asan_option_detect_stack_use_after_return that should be<br class="">@@ -61,9 +62,17 @@ static int InitializeClonedVariables() {<br class="">   return 0;<br class=""> }<br class=""><br class="">-// Our cloned variables must be initialized before C/C++ constructors.<br class="">-__declspec(allocate(".CRT$XIB"))<br class="">-int (*__asan_initialize_cloned_variables)() = InitializeClonedVariables;<br class="">+static void NTAPI asan_thread_init(void *mod, unsigned long reason, void *reserved) {<br class="">+  if (reason == DLL_PROCESS_ATTACH) InitializeClonedVariables();<br class="">+}<br class="">+<br class="">+// Our cloned variables must be initialized before C/C++ constructors.  If TLS<br class="">+// is used, our .CRT$XLAB initializer will run first. If not, our .CRT$XIB<br class="">+// initializer is needed as a backup.<br class="">+__declspec(allocate(".CRT$XIB")) int (*__asan_initialize_cloned_variables)() =<br class="">+    InitializeClonedVariables;<br class="">+__declspec(allocate(".CRT$XLAB")) void (NTAPI *__asan_tls_init)(<br class="">+    void *, unsigned long, void *) = asan_thread_init;<br class=""><br class=""> ////////////////////////////////////////////////////////////////////////////////<br class=""> // For some reason, the MD CRT doesn't call the C/C++ terminators during on DLL<br class=""><br class="">Added: compiler-rt/trunk/test/asan/TestCases/Windows/tls_init.cc<br class="">URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/asan/TestCases/Windows/tls_init.cc?rev=286290&view=auto<br class="">==============================================================================<br class="">--- compiler-rt/trunk/test/asan/TestCases/Windows/tls_init.cc (added)<br class="">+++ compiler-rt/trunk/test/asan/TestCases/Windows/tls_init.cc Tue Nov  8 14:45:45 2016<br class="">@@ -0,0 +1,51 @@<br class="">+// RUN: %clang_cl_asan %s -Fe%t.exe<br class="">+// RUN: %run %t.exe | FileCheck %s<br class="">+<br class="">+// CHECK: my_thread_callback<br class="">+// CHECK: ran_before_main: 1<br class="">+<br class="">+#include <windows.h><br class="">+#include <stdio.h><br class="">+#include <string.h><br class="">+<br class="">+#pragma comment (lib, "dbghelp")<br class="">+<br class="">+static bool ran_before_main = false;<br class="">+<br class="">+extern "C" void __asan_init(void);<br class="">+<br class="">+static void NTAPI /*__attribute__((no_sanitize_address))*/<br class="">+my_thread_callback(PVOID module, DWORD reason, PVOID reserved) {<br class="">+  ran_before_main = true;<br class="">+  static const char str[] = "my_thread_callback\n";<br class="">+<br class="">+  // Fail the test if we aren't called for the expected reason or we can't write<br class="">+  // stdout.<br class="">+  if (reason != DLL_PROCESS_ATTACH)<br class="">+    return;<br class="">+  HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);<br class="">+  if (!out || out == INVALID_HANDLE_VALUE)<br class="">+    return;<br class="">+<br class="">+  DWORD written = 0;<br class="">+  WriteFile(out, &str[0], sizeof(str), &written, NULL);<br class="">+}<br class="">+<br class="">+extern "C" {<br class="">+#pragma const_seg(".CRT$XLC")<br class="">+extern const PIMAGE_TLS_CALLBACK p_thread_callback;<br class="">+const PIMAGE_TLS_CALLBACK p_thread_callback = my_thread_callback;<br class="">+#pragma const_seg()<br class="">+}<br class="">+<br class="">+#ifdef _WIN64<br class="">+#pragma comment(linker, "/INCLUDE:_tls_used")<br class="">+#pragma comment(linker, "/INCLUDE:p_thread_callback")<br class="">+#else<br class="">+#pragma comment(linker, "/INCLUDE:__tls_used")<br class="">+#pragma comment(linker, "/INCLUDE:_p_thread_callback")<br class="">+#endif<br class="">+<br class="">+int main() {<br class="">+  printf("ran_before_main: %d\n", ran_before_main);<br class="">+}<br class=""><br class=""><br class="">_______________________________________________<br class="">llvm-commits mailing list<br class="">llvm-commits@lists.llvm.org<br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits<br class=""></div></div></blockquote></div><br class=""></div></body></html>