1 | // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-apple-darwin10 -stack-protector 2 -emit-llvm -o - %s | FileCheck %s |
2 | |
3 | // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple x86_64-apple-darwin10 -stack-protector 2 -emit-llvm -o - %s | FileCheck --check-prefix SIMD-ONLY0 %s |
4 | // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} |
5 | |
6 | // Check that function attributes are added to the OpenMP runtime functions. |
7 | |
8 | template <class T> |
9 | struct S { |
10 | T f; |
11 | S(T a) : f(a) {} |
12 | S() : f() {} |
13 | operator T() { return T(); } |
14 | ~S() {} |
15 | }; |
16 | |
17 | // CHECK: define internal void @.omp.copyprivate.copy_func(i8*, i8*) [[ATTR0:#[0-9]+]] { |
18 | |
19 | void foo0(); |
20 | |
21 | int foo1() { |
22 | char a; |
23 | |
24 | #pragma omp parallel |
25 | a = 2; |
26 | #pragma omp single copyprivate(a) |
27 | foo0(); |
28 | |
29 | return 0; |
30 | } |
31 | |
32 | // CHECK: define internal void @.omp_task_privates_map.({{.*}}) [[ATTR3:#[0-9]+]] { |
33 | // CHECK: define internal i32 @.omp_task_entry.({{.*}}) [[ATTR0]] { |
34 | // CHECK: define internal i32 @.omp_task_destructor.({{.*}}) [[ATTR0]] { |
35 | |
36 | int foo2() { |
37 | S<double> s_arr[] = {1, 2}; |
38 | S<double> var(3); |
39 | #pragma omp task private(s_arr, var) |
40 | s_arr[0] = var; |
41 | return 0; |
42 | } |
43 | |
44 | // CHECK: define internal void @.omp.reduction.reduction_func(i8*, i8*) [[ATTR0]] { |
45 | |
46 | float foo3(int n, float *a, float *b) { |
47 | int i; |
48 | float result; |
49 | |
50 | #pragma omp parallel for private(i) reduction(+:result) |
51 | for (i=0; i < n; i++) |
52 | result = result + (a[i] * b[i]); |
53 | return result; |
54 | } |
55 | |
56 | // CHECK: attributes [[ATTR0]] = {{{.*}} sspstrong {{.*}}} |
57 | // CHECK: attributes [[ATTR3]] = {{{.*}} sspstrong {{.*}}} |
58 | |