1 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc -fopenmp-version=50 2 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -fopenmp-version=50 | FileCheck %s --implicit-check-not='ret i32 {{1|81|84}}' 3 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -emit-pch -o %t -fopenmp-version=50 4 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple nvptx64-unknown-unknown -aux-triple powerpc64le-unknown-unknown -emit-llvm %s -fopenmp-is-device -fopenmp-host-ir-file-path %t-ppc-host.bc -include-pch %t -o - -fopenmp-version=50 | FileCheck %s --implicit-check-not='ret i32 {{1|81|84}}' 5 // expected-no-diagnostics 6 7 // CHECK-NOT: ret i32 {{1|81|84}} 8 // CHECK-DAG: define {{.*}}i32 @_Z3barv() 9 // CHECK-DAG: define {{.*}}i32 @_ZN16SpecSpecialFuncs6MethodEv(%struct.SpecSpecialFuncs* %{{.+}}) 10 // CHECK-DAG: define {{.*}}i32 @_ZN12SpecialFuncs6MethodEv(%struct.SpecialFuncs* %{{.+}}) 11 // CHECK-DAG: define linkonce_odr {{.*}}i32 @_ZN16SpecSpecialFuncs6methodEv(%struct.SpecSpecialFuncs* %{{.+}}) 12 // CHECK-DAG: define linkonce_odr {{.*}}i32 @_ZN12SpecialFuncs6methodEv(%struct.SpecialFuncs* %{{.+}}) 13 // CHECK-DAG: define {{.*}}i32 @_Z5prio_v() 14 // CHECK-DAG: define internal i32 @_ZL6prio1_v() 15 // CHECK-DAG: define {{.*}}i32 @_Z4callv() 16 // CHECK-DAG: define internal i32 @_ZL9stat_usedv() 17 // CHECK-DAG: define {{.*}}i32 @fn_linkage() 18 // CHECK-DAG: define {{.*}}i32 @_Z11fn_linkage1v() 19 20 // CHECK-DAG: ret i32 2 21 // CHECK-DAG: ret i32 3 22 // CHECK-DAG: ret i32 4 23 // CHECK-DAG: ret i32 5 24 // CHECK-DAG: ret i32 6 25 // CHECK-DAG: ret i32 7 26 // CHECK-DAG: ret i32 82 27 // CHECK-DAG: ret i32 83 28 // CHECK-DAG: ret i32 85 29 // CHECK-DAG: ret i32 86 30 // CHECK-DAG: ret i32 87 31 32 // Outputs for function members 33 // CHECK-DAG: ret i32 6 34 // CHECK-DAG: ret i32 7 35 // CHECK-NOT: ret i32 {{1|81|84}} 36 37 #ifndef HEADER 38 #define HEADER 39 40 int foo() { return 2; } 41 int bazzz(); 42 int test(); 43 static int stat_unused_(); 44 static int stat_used_(); 45 46 #pragma omp declare target 47 48 #pragma omp declare variant(foo) match(implementation = {vendor(llvm)}) 49 int bar() { return 1; } 50 51 #pragma omp declare variant(bazzz) match(implementation = {vendor(llvm)}) 52 int baz() { return 1; } 53 54 #pragma omp declare variant(test) match(implementation = {vendor(llvm)}) 55 int call() { return 1; } 56 57 #pragma omp declare variant(stat_unused_) match(implementation = {vendor(llvm)}) 58 static int stat_unused() { return 1; } 59 60 #pragma omp declare variant(stat_used_) match(implementation = {vendor(llvm)}) 61 static int stat_used() { return 1; } 62 63 #pragma omp end declare target 64 65 int main() { 66 int res; 67 #pragma omp target map(from \ 68 : res) 69 res = bar() + baz() + call(); 70 return res; 71 } 72 73 int test() { return 3; } 74 static int stat_unused_() { return 4; } 75 static int stat_used_() { return 5; } 76 77 #pragma omp declare target 78 79 struct SpecialFuncs { 80 void vd() {} 81 SpecialFuncs(); 82 ~SpecialFuncs(); 83 84 int method_() { return 6; } 85 #pragma omp declare variant(SpecialFuncs::method_) \ 86 match(implementation = {vendor(llvm)}) 87 int method() { return 1; } 88 #pragma omp declare variant(SpecialFuncs::method_) \ 89 match(implementation = {vendor(llvm)}) 90 int Method(); 91 } s; 92 93 int SpecialFuncs::Method() { return 1; } 94 95 struct SpecSpecialFuncs { 96 void vd() {} 97 SpecSpecialFuncs(); 98 ~SpecSpecialFuncs(); 99 100 int method_(); 101 #pragma omp declare variant(SpecSpecialFuncs::method_) \ 102 match(implementation = {vendor(llvm)}) 103 int method() { return 1; } 104 #pragma omp declare variant(SpecSpecialFuncs::method_) \ 105 match(implementation = {vendor(llvm)}) 106 int Method(); 107 } s1; 108 109 #pragma omp end declare target 110 111 int SpecSpecialFuncs::method_() { return 7; } 112 int SpecSpecialFuncs::Method() { return 1; } 113 114 int prio() { return 81; } 115 int prio1() { return 82; } 116 static int prio2() { return 83; } 117 static int prio3() { return 84; } 118 static int prio4() { return 84; } 119 int fn_linkage_variant() { return 85; } 120 extern "C" int fn_linkage_variant1() { return 86; } 121 int fn_variant2() { return 1; } 122 123 #pragma omp declare target 124 125 void xxx() { 126 (void)s.method(); 127 (void)s1.method(); 128 } 129 130 #pragma omp declare variant(prio) match(implementation = {vendor(llvm)}) 131 #pragma omp declare variant(prio1) match(implementation = {vendor(score(1) \ 132 : llvm)}) 133 int prio_() { return 1; } 134 135 #pragma omp declare variant(prio4) match(implementation = {vendor(score(3) \ 136 : llvm)}) 137 #pragma omp declare variant(prio2) match(implementation = {vendor(score(5) \ 138 : llvm)}) 139 #pragma omp declare variant(prio3) match(implementation = {vendor(score(1) \ 140 : llvm)}) 141 static int prio1_() { return 1; } 142 143 int int_fn() { return prio1_(); } 144 145 extern "C" { 146 #pragma omp declare variant(fn_linkage_variant) match(implementation = {vendor(llvm)}) 147 int fn_linkage() { return 1; } 148 } 149 150 #pragma omp declare variant(fn_linkage_variant1) match(implementation = {vendor(llvm)}) 151 int fn_linkage1() { return 1; } 152 153 #pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm, ibm)}) 154 int fn2() { return 87; } 155 156 #pragma omp end declare target 157 158 #endif // HEADER 159