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