186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// RUN: %clang_cl_asan -LD -O0 -DDLL %s -Fe%t.dll 286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// RUN: %clang_cl_asan -O0 -DEXE %s -Fe%te.exe 3799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// RUN: %env_asan_opts=report_globals=2 %run %te.exe %t.dll 2>&1 | FileCheck %s 486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include <windows.h> 686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include <stdio.h> 786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#include <string.h> 886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 986277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesextern "C" { 1086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#if defined(EXE) 1186277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesint main(int argc, char **argv) { 1286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines if (argc != 2) { 1386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines printf("Usage: %s [client].dll\n", argv[0]); 1486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines return 101; 1586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines } 1686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines const char *dll_name = argv[1]; 1786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 1886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK: time to load DLL 1986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines printf("time to load DLL\n"); 2086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines fflush(0); 2186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 2286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// On DLL load, the "in DLL\n" string is registered: 2386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK: Added Global{{.*}} size=19 2486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK: in DLL(reason=1) 2586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines HMODULE dll = LoadLibrary(dll_name); 2686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines if (dll == NULL) 2786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines return 3; 2886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 2986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK: in DLL(reason=0) 3086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK-NEXT: Removed Global{{.*}} size=19 3186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines if (!FreeLibrary(dll)) 3286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines return 4; 3386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines 3486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines// CHECK: bye! 3586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines printf("bye!\n"); 3686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines fflush(0); 3786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines} 3886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#elif defined(DLL) 3986277eb844c4983c81de62d7c050e92fe7155788Stephen HinesBOOL WINAPI DllMain(HMODULE, DWORD reason, LPVOID) { 4086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines printf("in DLL(reason=%d)\n", (int)reason); 4186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines fflush(0); 4286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines return TRUE; 4386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines} 4486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#else 4586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines# error oops! 4686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines#endif 4786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines} 48