15d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clang_cl_asan -O0 %p/dll_host.cc -Fe%t
25d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clang_cl_asan -LD -O0 %s -Fe%t.dll
35d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %run %t %t.dll 2>&1 | FileCheck %s
45d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
55d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// Test that it works correctly even with ICF enabled.
65d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %clang_cl_asan -LD -O0 %s -Fe%t.dll -link /OPT:REF /OPT:ICF
75d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// RUN: %run %t %t.dll 2>&1 | FileCheck %s
85d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
95d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines#include <iostream>
105d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
115d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesextern "C" __declspec(dllexport)
125d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hinesint test_function() {
135d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  // Just make sure we can use cout.
145d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  std::cout << "All ok\n";
155d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: All ok
165d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines
175d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  // This line forces a declaration of some global basic_ostream internal object that
185d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  // calls memcpy() in its constructor.  This doesn't work if __asan_init is not
195d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  // called early enough.
205d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  std::cout << 42;
215d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines// CHECK: 42
225d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines  return 0;
235d71de26cedae3dafc17449fe0182045c0bd20e8Stephen Hines}
24