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