1 /// 2 /// Perform several driver tests for OpenMP offloading 3 /// 4 5 /// ########################################################################### 6 7 /// Check whether an invalid OpenMP target is specified: 8 // RUN: not %clang -### -fopenmp=libomp -fopenmp-targets=aaa-bbb-ccc-ddd %s 2>&1 \ 9 // RUN: | FileCheck -check-prefix=CHK-INVALID-TARGET %s 10 // CHK-INVALID-TARGET: error: OpenMP target is invalid: 'aaa-bbb-ccc-ddd' 11 12 /// ########################################################################### 13 14 /// Check warning for empty -fopenmp-targets 15 // RUN: %clang -### -fopenmp=libomp -fopenmp-targets= %s 2>&1 \ 16 // RUN: | FileCheck -check-prefix=CHK-EMPTY-OMPTARGETS %s 17 // CHK-EMPTY-OMPTARGETS: warning: joined argument expects additional value: '-fopenmp-targets=' 18 19 /// ########################################################################### 20 21 /// Check error for no -fopenmp option 22 // RUN: not %clang -### -fopenmp-targets=powerpc64le-ibm-linux-gnu %s 2>&1 \ 23 // RUN: | FileCheck -check-prefix=CHK-NO-FOPENMP %s 24 // RUN: not %clang -### -fopenmp=libgomp -fopenmp-targets=powerpc64le-ibm-linux-gnu %s 2>&1 \ 25 // RUN: | FileCheck -check-prefix=CHK-NO-FOPENMP %s 26 // CHK-NO-FOPENMP: error: '-fopenmp-targets' must be used in conjunction with a '-fopenmp' option compatible with offloading; e.g., '-fopenmp=libomp' or '-fopenmp=libiomp5' 27 28 /// ########################################################################### 29 30 /// Check warning for duplicate offloading targets. 31 // RUN: %clang -### -ccc-print-phases -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu,powerpc64le-ibm-linux-gnu %s 2>&1 \ 32 // RUN: | FileCheck -check-prefix=CHK-DUPLICATES %s 33 // CHK-DUPLICATES: warning: OpenMP offloading target 'powerpc64le-ibm-linux-gnu' is similar to target 'powerpc64le-ibm-linux-gnu' already specified; will be ignored 34 35 /// ########################################################################### 36 37 /// Check -Xopenmp-target=powerpc64le-ibm-linux-gnu -mcpu=pwr7 is passed when compiling for the device. 38 // RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target=powerpc64le-ibm-linux-gnu -mcpu=pwr7 %s 2>&1 \ 39 // RUN: | FileCheck -check-prefix=CHK-FOPENMP-EQ-TARGET %s 40 41 // CHK-FOPENMP-EQ-TARGET: clang{{.*}} "-target-cpu" "pwr7" {{.*}}"-fopenmp-is-target-device" 42 43 /// ########################################################################### 44 45 /// Check -Xopenmp-target -mcpu=pwr7 is passed when compiling for the device. 46 // RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target -mcpu=pwr7 %s 2>&1 \ 47 // RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET %s 48 49 // CHK-FOPENMP-TARGET: clang{{.*}} "-target-cpu" "pwr7" {{.*}}"-fopenmp-is-target-device" 50 51 /// ########################################################################## 52 53 /// Check -mcpu=pwr7 is passed to the same triple. 54 // RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu --target=powerpc64le-ibm-linux-gnu -mcpu=pwr7 %s 2>&1 \ 55 // RUN: | FileCheck -check-prefix=CHK-FOPENMP-MCPU-TO-SAME-TRIPLE %s 56 57 // CHK-FOPENMP-MCPU-TO-SAME-TRIPLE: clang{{.*}} "-target-cpu" "pwr7" {{.*}}"-fopenmp-is-target-device" 58 59 /// ########################################################################## 60 61 /// Check -march=pwr7 is NOT passed to nvptx64-nvidia-cuda. 62 // RUN: not %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=nvptx64-nvidia-cuda --target=powerpc64le-ibm-linux-gnu -march=pwr7 %s 2>&1 \ 63 // RUN: | FileCheck -check-prefix=CHK-FOPENMP-MARCH-TO-GPU %s 64 65 // CHK-FOPENMP-MARCH-TO-GPU-NOT: clang{{.*}} "-target-cpu" "pwr7" {{.*}}"-fopenmp-is-target-device" 66 67 /// ########################################################################### 68 69 /// Check -march=pwr7 is NOT passed to x86_64-unknown-linux-gnu. 70 // RUN: not %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=x86_64-unknown-linux-gnu --target=powerpc64le-ibm-linux-gnu -march=pwr7 %s 2>&1 \ 71 // RUN: | FileCheck -check-prefix=CHK-FOPENMP-MARCH-TO-X86 %s 72 73 // CHK-FOPENMP-MARCH-TO-X86-NOT: clang{{.*}} "-target-cpu" "pwr7" {{.*}}"-fopenmp-is-target-device" 74 75 /// ########################################################################### 76 77 /// Check -Xopenmp-target triggers error when multiple triples are used. 78 // RUN: not %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu,powerpc64le-unknown-linux-gnu -Xopenmp-target -mcpu=pwr8 %s 2>&1 \ 79 // RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET-AMBIGUOUS-ERROR %s 80 81 // CHK-FOPENMP-TARGET-AMBIGUOUS-ERROR: clang{{.*}} error: cannot deduce implicit triple value for -Xopenmp-target, specify triple using -Xopenmp-target=<triple> 82 83 /// ########################################################################### 84 85 /// Check -Xopenmp-target triggers error when an option requiring arguments is passed to it. 86 // RUN: not %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target -Xopenmp-target -mcpu=pwr8 %s 2>&1 \ 87 // RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR_0 %s 88 89 // CHK-FOPENMP-TARGET-NESTED-ERROR_0: error: invalid -Xopenmp-target argument: '-Xopenmp-target -Xopenmp-target', options requiring arguments are unsupported 90 91 /// Check -Xopenmp-target= triggers error when an option requiring arguments is passed to it. 92 // RUN: not %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target=powerpc64le-ibm-linux-gnu -Xopenmp-target -mcpu=pwr8 %s 2>&1 \ 93 // RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR_1 %s 94 95 // CHK-FOPENMP-TARGET-NESTED-ERROR_1: error: invalid -Xopenmp-target argument: '-Xopenmp-target=powerpc64le-ibm-linux-gnu -Xopenmp-target', options requiring arguments are unsupported 96 97 /// ########################################################################### 98 99 /// Check the phases graph when using a single target, different from the host. 100 /// We should have an offload action joining the host compile and device 101 /// preprocessor and another one joining the device linking outputs to the host 102 /// action. 103 // RUN: %clang -ccc-print-phases -fopenmp=libomp --target=powerpc64-ibm-linux-gnu \ 104 // RUN: -fopenmp-targets=powerpc64-ibm-linux-gnu %s 2>&1 | FileCheck -check-prefix=CHK-PHASES %s 105 // CHK-PHASES: 0: input, "[[INPUT:.+]]", c, (host-openmp) 106 // CHK-PHASES-NEXT: 1: preprocessor, {0}, cpp-output, (host-openmp) 107 // CHK-PHASES-NEXT: 2: compiler, {1}, ir, (host-openmp) 108 // CHK-PHASES-NEXT: 3: input, "[[INPUT]]", c, (device-openmp) 109 // CHK-PHASES-NEXT: 4: preprocessor, {3}, cpp-output, (device-openmp) 110 // CHK-PHASES-NEXT: 5: compiler, {4}, ir, (device-openmp) 111 // CHK-PHASES-NEXT: 6: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {2}, "device-openmp (powerpc64-ibm-linux-gnu)" {5}, ir 112 // CHK-PHASES-NEXT: 7: backend, {6}, assembler, (device-openmp) 113 // CHK-PHASES-NEXT: 8: assembler, {7}, object, (device-openmp) 114 // CHK-PHASES-NEXT: 9: offload, "device-openmp (powerpc64-ibm-linux-gnu)" {8}, object 115 // CHK-PHASES-NEXT: 10: clang-offload-packager, {9}, image, (device-openmp) 116 // CHK-PHASES-NEXT: 11: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {2}, "device-openmp (powerpc64-ibm-linux-gnu)" {10}, ir 117 // CHK-PHASES-NEXT: 12: backend, {11}, assembler, (host-openmp) 118 // CHK-PHASES-NEXT: 13: assembler, {12}, object, (host-openmp) 119 // CHK-PHASES-NEXT: 14: clang-linker-wrapper, {13}, image, (host-openmp) 120 121 /// ########################################################################### 122 123 /// Check the phases when using multiple targets and multiple source files 124 // RUN: %clang -ccc-print-phases -lsomelib -fopenmp=libomp --target=powerpc64-ibm-linux-gnu \ 125 // RUN: -fopenmp-targets=x86_64-pc-linux-gnu,powerpc64-ibm-linux-gnu %s %s 2>&1 | FileCheck -check-prefix=CHK-PHASES-FILES %s 126 // CHK-PHASES-FILES: 0: input, "somelib", object, (host-openmp) 127 // CHK-PHASES-FILES-NEXT: 1: input, "[[INPUT:.+]]", c, (host-openmp) 128 // CHK-PHASES-FILES-NEXT: 2: preprocessor, {1}, cpp-output, (host-openmp) 129 // CHK-PHASES-FILES-NEXT: 3: compiler, {2}, ir, (host-openmp) 130 // CHK-PHASES-FILES-NEXT: 4: input, "[[INPUT]]", c, (device-openmp) 131 // CHK-PHASES-FILES-NEXT: 5: preprocessor, {4}, cpp-output, (device-openmp) 132 // CHK-PHASES-FILES-NEXT: 6: compiler, {5}, ir, (device-openmp) 133 // CHK-PHASES-FILES-NEXT: 7: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {3}, "device-openmp (powerpc64-ibm-linux-gnu)" {6}, ir 134 // CHK-PHASES-FILES-NEXT: 8: backend, {7}, assembler, (device-openmp) 135 // CHK-PHASES-FILES-NEXT: 9: assembler, {8}, object, (device-openmp) 136 // CHK-PHASES-FILES-NEXT: 10: offload, "device-openmp (powerpc64-ibm-linux-gnu)" {9}, object 137 // CHK-PHASES-FILES-NEXT: 11: input, "[[INPUT]]", c, (device-openmp) 138 // CHK-PHASES-FILES-NEXT: 12: preprocessor, {11}, cpp-output, (device-openmp) 139 // CHK-PHASES-FILES-NEXT: 13: compiler, {12}, ir, (device-openmp) 140 // CHK-PHASES-FILES-NEXT: 14: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {3}, "device-openmp (x86_64-pc-linux-gnu)" {13}, ir 141 // CHK-PHASES-FILES-NEXT: 15: backend, {14}, assembler, (device-openmp) 142 // CHK-PHASES-FILES-NEXT: 16: assembler, {15}, object, (device-openmp) 143 // CHK-PHASES-FILES-NEXT: 17: offload, "device-openmp (x86_64-pc-linux-gnu)" {16}, object 144 // CHK-PHASES-FILES-NEXT: 18: clang-offload-packager, {10, 17}, image, (device-openmp) 145 // CHK-PHASES-FILES-NEXT: 19: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {3}, "device-openmp (powerpc64-ibm-linux-gnu)" {18}, ir 146 // CHK-PHASES-FILES-NEXT: 20: backend, {19}, assembler, (host-openmp) 147 // CHK-PHASES-FILES-NEXT: 21: assembler, {20}, object, (host-openmp) 148 // CHK-PHASES-FILES-NEXT: 22: input, "[[INPUT]]", c, (host-openmp) 149 // CHK-PHASES-FILES-NEXT: 23: preprocessor, {22}, cpp-output, (host-openmp) 150 // CHK-PHASES-FILES-NEXT: 24: compiler, {23}, ir, (host-openmp) 151 // CHK-PHASES-FILES-NEXT: 25: input, "[[INPUT]]", c, (device-openmp) 152 // CHK-PHASES-FILES-NEXT: 26: preprocessor, {25}, cpp-output, (device-openmp) 153 // CHK-PHASES-FILES-NEXT: 27: compiler, {26}, ir, (device-openmp) 154 // CHK-PHASES-FILES-NEXT: 28: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {24}, "device-openmp (powerpc64-ibm-linux-gnu)" {27}, ir 155 // CHK-PHASES-FILES-NEXT: 29: backend, {28}, assembler, (device-openmp) 156 // CHK-PHASES-FILES-NEXT: 30: assembler, {29}, object, (device-openmp) 157 // CHK-PHASES-FILES-NEXT: 31: offload, "device-openmp (powerpc64-ibm-linux-gnu)" {30}, object 158 // CHK-PHASES-FILES-NEXT: 32: input, "[[INPUT]]", c, (device-openmp) 159 // CHK-PHASES-FILES-NEXT: 33: preprocessor, {32}, cpp-output, (device-openmp) 160 // CHK-PHASES-FILES-NEXT: 34: compiler, {33}, ir, (device-openmp) 161 // CHK-PHASES-FILES-NEXT: 35: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {24}, "device-openmp (x86_64-pc-linux-gnu)" {34}, ir 162 // CHK-PHASES-FILES-NEXT: 36: backend, {35}, assembler, (device-openmp) 163 // CHK-PHASES-FILES-NEXT: 37: assembler, {36}, object, (device-openmp) 164 // CHK-PHASES-FILES-NEXT: 38: offload, "device-openmp (x86_64-pc-linux-gnu)" {37}, object 165 // CHK-PHASES-FILES-NEXT: 39: clang-offload-packager, {31, 38}, image, (device-openmp) 166 // CHK-PHASES-FILES-NEXT: 40: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {24}, "device-openmp (powerpc64-ibm-linux-gnu)" {39}, ir 167 // CHK-PHASES-FILES-NEXT: 41: backend, {40}, assembler, (host-openmp) 168 // CHK-PHASES-FILES-NEXT: 42: assembler, {41}, object, (host-openmp) 169 // CHK-PHASES-FILES-NEXT: 43: clang-linker-wrapper, {0, 21, 42}, image, (host-openmp) 170 171 /// Check -fopenmp-is-target-device is passed when compiling for the device. 172 // RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu %s 2>&1 \ 173 // RUN: | FileCheck -check-prefix=CHK-fopenmp-is-target-device %s 174 175 // CHK-fopenmp-is-target-device: "-cc1"{{.*}} "-aux-triple" "powerpc64le-unknown-linux" {{.*}}"-fopenmp-is-target-device" "-fopenmp-host-ir-file-path" {{.*}}.c" 176 177 /// Check arguments to the linker wrapper 178 // RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu %s 2>&1 \ 179 // RUN: | FileCheck -check-prefix=CHK-NEW-DRIVER %s 180 181 // CHK-NEW-DRIVER: clang-linker-wrapper{{.*}}"--host-triple=powerpc64le-unknown-linux"{{.*}}--{{.*}}"-lomp"{{.*}}"-lomptarget" 182 183 /// Check arguments to the linker wrapper 184 // RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -g %s 2>&1 \ 185 // RUN: | FileCheck -check-prefix=CHK-NEW-DRIVER-DEBUG %s 186 187 // CHK-NEW-DRIVER-DEBUG: clang-linker-wrapper{{.*}} "--device-debug" 188 189 /// Check arguments to the linker wrapper 190 // RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu \ 191 // RUN: -mllvm -abc %s 2>&1 | FileCheck -check-prefix=CHK-NEW-DRIVER-MLLVM %s 192 193 // CHK-NEW-DRIVER-MLLVM: clang-linker-wrapper{{.*}} "-abc" 194 195 // 196 // Ensure that we generate the correct bindings for '-fsyntax-only' for OpenMP. 197 // 198 // RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu \ 199 // RUN: -fsyntax-only -ccc-print-bindings %s 2>&1 | FileCheck -check-prefix=CHK-SYNTAX-ONLY %s 200 // CHK-SYNTAX-ONLY: # "powerpc64le-ibm-linux-gnu" - "clang", inputs: ["[[INPUT:.+]]"], output: (nothing) 201 // CHK-SYNTAX-ONLY: # "powerpc64le-unknown-linux" - "clang", inputs: ["[[INPUT]]", (nothing)], output: (nothing) 202 203 // 204 // Ensure that we can generate the correct arguments for '-fsyntax-only' for 205 // OpenMP. 206 // 207 // RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu \ 208 // RUN: -fsyntax-only %s 2>&1 | FileCheck -check-prefix=CHK-SYNTAX-ONLY-ARGS %s 209 // CHK-SYNTAX-ONLY-ARGS: "-cc1" "-triple" "powerpc64le-ibm-linux-gnu"{{.*}}"-fsyntax-only" 210 // CHK-SYNTAX-ONLY-ARGS: "-cc1" "-triple" "powerpc64le-unknown-linux"{{.*}}"-fsyntax-only" 211