Etienne Bergeron 60ce0f667c [compiler-rt][asan|win] Force tls_init test to use dynamic runtime
Summary:
There is no guarantee that the tls_init is executed on the static runtime
(/MT).

On windows 7, this unittest is failing.
On windows 10, I believe it's working because of the new CRT.

On ASAN side, it doesn't matter that the hook point is run or not.
It must be run only if there is other tls_initializer that are registered.

Reviewers: rnk, chrisha

Reviewed By: rnk

Subscribers: kubamracek, llvm-commits

Differential Revision: https://reviews.llvm.org/D29838

llvm-svn: 295057
2017-02-14 15:21:53 +00:00

52 lines
1.3 KiB
C++

// RUN: %clang_cl_asan %s -Fe%t.exe /MD
// RUN: %run %t.exe | FileCheck %s
// CHECK: my_thread_callback
// CHECK: ran_before_main: 1
#include <windows.h>
#include <stdio.h>
#include <string.h>
#pragma comment (lib, "dbghelp")
static bool ran_before_main = false;
extern "C" void __asan_init(void);
static void NTAPI /*__attribute__((no_sanitize_address))*/
my_thread_callback(PVOID module, DWORD reason, PVOID reserved) {
ran_before_main = true;
static const char str[] = "my_thread_callback\n";
// Fail the test if we aren't called for the expected reason or we can't write
// stdout.
if (reason != DLL_PROCESS_ATTACH)
return;
HANDLE out = GetStdHandle(STD_OUTPUT_HANDLE);
if (!out || out == INVALID_HANDLE_VALUE)
return;
DWORD written = 0;
WriteFile(out, &str[0], sizeof(str), &written, NULL);
}
extern "C" {
#pragma const_seg(".CRT$XLC")
extern const PIMAGE_TLS_CALLBACK p_thread_callback;
const PIMAGE_TLS_CALLBACK p_thread_callback = my_thread_callback;
#pragma const_seg()
}
#ifdef _WIN64
#pragma comment(linker, "/INCLUDE:_tls_used")
#pragma comment(linker, "/INCLUDE:p_thread_callback")
#else
#pragma comment(linker, "/INCLUDE:__tls_used")
#pragma comment(linker, "/INCLUDE:_p_thread_callback")
#endif
int main() {
printf("ran_before_main: %d\n", ran_before_main);
}