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 {{6|7|8|9|10|12|13|14|15|17|18|19|20|21|22|23|24|26}}' 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 {{6|7|8|9|10|12|13|14|15|17|18|19|20|21|22|23|24|26}}' 5 // expected-no-diagnostics 6 7 // CHECK-DAG: ret i32 2 8 // CHECK-DAG: ret i32 3 9 // CHECK-DAG: ret i32 4 10 // CHECK-DAG: ret i32 5 11 // CHECK-DAG: ret i32 11 12 // CHECK-DAG: ret i32 16 13 // CHECK-DAG: ret i32 19 14 // CHECK-DAG: ret i32 25 15 // CHECK-DAG: ret i32 27 16 // CHECK-DAG: ret i32 28 17 // CHECK-DAG: ret i32 29 18 19 #ifndef HEADER 20 #define HEADER 21 22 int foo() { return 2; } 23 int bazzz(); 24 int test(); 25 static int stat_unused_(); 26 static int stat_used_(); 27 28 #pragma omp declare target 29 30 #pragma omp declare variant(foo) match(implementation = {vendor(llvm)}) 31 int bar() { return 3; } 32 33 #pragma omp declare variant(bazzz) match(implementation = {vendor(llvm)}) 34 int baz() { return 4; } 35 36 #pragma omp declare variant(test) match(implementation = {vendor(llvm)}) 37 int call() { return 5; } 38 39 #pragma omp declare variant(stat_unused_) match(implementation = {vendor(llvm)}) 40 static int stat_unused() { return 6; } 41 42 #pragma omp declare variant(stat_used_) match(implementation = {vendor(llvm)}) 43 static int stat_used() { return 7; } 44 45 #pragma omp end declare target 46 47 int main() { 48 int res; 49 #pragma omp target map(from \ 50 : res) 51 res = bar() + baz() + call(); 52 return res; 53 } 54 55 int test() { return 8; } 56 static int stat_unused_() { return 9; } 57 static int stat_used_() { return 10; } 58 59 #pragma omp declare target 60 61 struct SpecialFuncs { 62 void vd() {} 63 SpecialFuncs(); 64 ~SpecialFuncs(); 65 66 int method_() { return 11; } 67 #pragma omp declare variant(SpecialFuncs::method_) \ 68 match(implementation = {vendor(llvm)}) 69 int method() { return 12; } 70 #pragma omp declare variant(SpecialFuncs::method_) \ 71 match(implementation = {vendor(llvm)}) 72 int Method(); 73 } s; 74 75 int SpecialFuncs::Method() { return 13; } 76 77 struct SpecSpecialFuncs { 78 void vd() {} 79 SpecSpecialFuncs(); 80 ~SpecSpecialFuncs(); 81 82 int method_(); 83 #pragma omp declare variant(SpecSpecialFuncs::method_) \ 84 match(implementation = {vendor(llvm)}) 85 int method() { return 14; } 86 #pragma omp declare variant(SpecSpecialFuncs::method_) \ 87 match(implementation = {vendor(llvm)}) 88 int Method(); 89 } s1; 90 91 #pragma omp end declare target 92 93 int SpecSpecialFuncs::method_() { return 15; } 94 int SpecSpecialFuncs::Method() { return 16; } 95 96 int prio() { return 17; } 97 int prio1() { return 18; } 98 static int prio2() { return 19; } 99 static int prio3() { return 20; } 100 static int prio4() { return 21; } 101 int fn_linkage_variant() { return 22; } 102 extern "C" int fn_linkage_variant1() { return 23; } 103 int fn_variant2() { return 24; } 104 105 #pragma omp declare target 106 107 void xxx() { 108 (void)s.method(); 109 (void)s1.method(); 110 } 111 112 #pragma omp declare variant(prio) match(implementation = {vendor(llvm)}) 113 #pragma omp declare variant(prio1) match(implementation = {vendor(score(1) \ 114 : llvm)}) 115 int prio_() { return 25; } 116 117 #pragma omp declare variant(prio4) match(implementation = {vendor(score(3) \ 118 : llvm)}) 119 #pragma omp declare variant(prio2) match(implementation = {vendor(score(5) \ 120 : llvm)}) 121 #pragma omp declare variant(prio3) match(implementation = {vendor(score(1) \ 122 : llvm)}) 123 static int prio1_() { return 26; } 124 125 int int_fn() { return prio1_(); } 126 127 extern "C" { 128 #pragma omp declare variant(fn_linkage_variant) match(implementation = {vendor(llvm)}) 129 int fn_linkage() { return 27; } 130 } 131 132 #pragma omp declare variant(fn_linkage_variant1) match(implementation = {vendor(llvm)}) 133 int fn_linkage1() { return 28; } 134 135 #pragma omp declare variant(fn_variant2) match(implementation = {vendor(llvm, ibm)}) 136 int fn2() { return 29; } 137 138 #pragma omp end declare target 139 140 #endif // HEADER 141