1*673dc3d4SNico Weber // RUN: %clang_cl_asan -Od %p/dll_host.cpp -Fe%t
2*673dc3d4SNico Weber // RUN: %clang_cl_asan -LD -Od %s -Fe%t.dll
3*673dc3d4SNico Weber // RUN: %run %t %t.dll | FileCheck %s
4*673dc3d4SNico Weber 
5*673dc3d4SNico Weber #include <malloc.h>
6*673dc3d4SNico Weber #include <stdio.h>
7*673dc3d4SNico Weber 
8*673dc3d4SNico Weber #define CHECK_ALIGNED(ptr,alignment) \
9*673dc3d4SNico Weber   do { \
10*673dc3d4SNico Weber     if (((uintptr_t)(ptr) % (alignment)) != 0) \
11*673dc3d4SNico Weber       return __LINE__; \
12*673dc3d4SNico Weber     } \
13*673dc3d4SNico Weber   while(0)
14*673dc3d4SNico Weber 
15*673dc3d4SNico Weber extern "C" __declspec(dllexport)
test_function()16*673dc3d4SNico Weber int test_function() {
17*673dc3d4SNico Weber   int *p = (int*)_aligned_malloc(1024 * sizeof(int), 32);
18*673dc3d4SNico Weber   CHECK_ALIGNED(p, 32);
19*673dc3d4SNico Weber   p[512] = 0;
20*673dc3d4SNico Weber   _aligned_free(p);
21*673dc3d4SNico Weber 
22*673dc3d4SNico Weber   p = (int*)_aligned_malloc(128, 128);
23*673dc3d4SNico Weber   CHECK_ALIGNED(p, 128);
24*673dc3d4SNico Weber   p = (int*)_aligned_realloc(p, 2048 * sizeof(int), 128);
25*673dc3d4SNico Weber   CHECK_ALIGNED(p, 128);
26*673dc3d4SNico Weber   p[1024] = 0;
27*673dc3d4SNico Weber   if (_aligned_msize(p, 128, 0) != 2048 * sizeof(int))
28*673dc3d4SNico Weber     return __LINE__;
29*673dc3d4SNico Weber   _aligned_free(p);
30*673dc3d4SNico Weber 
31*673dc3d4SNico Weber   printf("All ok\n");
32*673dc3d4SNico Weber // CHECK: All ok
33*673dc3d4SNico Weber   return 0;
34*673dc3d4SNico Weber }
35