225 lines · c
1///2/// Perform several driver tests for OpenMP offloading3///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 %s10// CHK-INVALID-TARGET: error: invalid or unsupported offload target: 'aaa-bbb-ccc-ddd'11 12/// ###########################################################################13 14/// Check warning for empty -fopenmp-targets15// RUN: %clang -### -fopenmp=libomp -fopenmp-targets= %s 2>&1 \16// RUN: | FileCheck -check-prefix=CHK-EMPTY-OMPTARGETS %s17// CHK-EMPTY-OMPTARGETS: warning: joined argument expects additional value: '-fopenmp-targets='18 19/// ###########################################################################20 21/// Check warning for duplicate offloading targets.22// RUN: %clang -### -ccc-print-phases -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu,powerpc64le-ibm-linux-gnu %s 2>&1 \23// RUN: | FileCheck -check-prefix=CHK-DUPLICATES %s24// CHK-DUPLICATES: warning: OpenMP offloading target 'powerpc64le-ibm-linux-gnu' is similar to target 'powerpc64le-ibm-linux-gnu' already specified; will be ignored25 26/// ###########################################################################27 28/// Check -Xopenmp-target=powerpc64le-ibm-linux-gnu -mcpu=pwr7 is passed when compiling for the device.29// RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target=powerpc64le-ibm-linux-gnu -mcpu=pwr7 %s 2>&1 \30// RUN: | FileCheck -check-prefix=CHK-FOPENMP-EQ-TARGET %s31 32// CHK-FOPENMP-EQ-TARGET: clang{{.*}} "-target-cpu" "pwr7" {{.*}}"-fopenmp-is-target-device"33 34/// ###########################################################################35 36/// Check -Xopenmp-target -mcpu=pwr7 is passed when compiling for the device.37// RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target -mcpu=pwr7 %s 2>&1 \38// RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET %s39 40// CHK-FOPENMP-TARGET: clang{{.*}} "-target-cpu" "pwr7" {{.*}}"-fopenmp-is-target-device"41 42/// ##########################################################################43 44/// Check -mcpu=pwr7 is passed to the same triple.45// RUN: %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu --target=powerpc64le-ibm-linux-gnu -mcpu=pwr7 %s 2>&1 \46// RUN: | FileCheck -check-prefix=CHK-FOPENMP-MCPU-TO-SAME-TRIPLE %s47 48// CHK-FOPENMP-MCPU-TO-SAME-TRIPLE: clang{{.*}} "-target-cpu" "pwr7" {{.*}}"-fopenmp-is-target-device"49 50/// ##########################################################################51 52/// Check -march=pwr7 is NOT passed to nvptx64-nvidia-cuda.53// RUN: not %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=nvptx64-nvidia-cuda --target=powerpc64le-ibm-linux-gnu -march=pwr7 %s 2>&1 \54// RUN: | FileCheck -check-prefix=CHK-FOPENMP-MARCH-TO-GPU %s55 56// CHK-FOPENMP-MARCH-TO-GPU-NOT: clang{{.*}} "-target-cpu" "pwr7" {{.*}}"-fopenmp-is-target-device"57 58/// ###########################################################################59 60/// Check -march=pwr7 is NOT passed to x86_64-unknown-linux-gnu.61// 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 \62// RUN: | FileCheck -check-prefix=CHK-FOPENMP-MARCH-TO-X86 %s63 64// CHK-FOPENMP-MARCH-TO-X86-NOT: clang{{.*}} "-target-cpu" "pwr7" {{.*}}"-fopenmp-is-target-device"65 66/// ###########################################################################67 68/// Check -Xopenmp-target triggers error when multiple triples are used.69// 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 \70// RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET-AMBIGUOUS-ERROR %s71 72// CHK-FOPENMP-TARGET-AMBIGUOUS-ERROR: clang{{.*}} error: cannot deduce implicit triple value for -Xopenmp-target, specify triple using -Xopenmp-target=<triple>73 74/// ###########################################################################75 76/// Check -Xopenmp-target triggers error when an option requiring arguments is passed to it.77// RUN: not %clang -### -no-canonical-prefixes -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -Xopenmp-target -Xopenmp-target -mcpu=pwr8 %s 2>&1 \78// RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR_0 %s79 80// CHK-FOPENMP-TARGET-NESTED-ERROR_0: error: invalid -Xopenmp-target argument: '-Xopenmp-target -Xopenmp-target', options requiring arguments are unsupported81 82/// Check -Xopenmp-target= triggers error when an option requiring arguments is passed to it.83// 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 \84// RUN: | FileCheck -check-prefix=CHK-FOPENMP-TARGET-NESTED-ERROR_1 %s85 86// CHK-FOPENMP-TARGET-NESTED-ERROR_1: error: invalid -Xopenmp-target argument: '-Xopenmp-target=powerpc64le-ibm-linux-gnu -Xopenmp-target', options requiring arguments are unsupported87 88/// ###########################################################################89 90/// Check the phases graph when using a single target, different from the host.91/// We should have an offload action joining the host compile and device92/// preprocessor and another one joining the device linking outputs to the host93/// action.94// RUN: %clang -ccc-print-phases -fopenmp=libomp --target=powerpc64-ibm-linux-gnu \95// RUN: -fopenmp-targets=powerpc64-ibm-linux-gnu %s 2>&1 | FileCheck -check-prefix=CHK-PHASES %s96// CHK-PHASES: 0: input, "[[INPUT:.+]]", c, (host-openmp)97// CHK-PHASES-NEXT: 1: preprocessor, {0}, cpp-output, (host-openmp)98// CHK-PHASES-NEXT: 2: compiler, {1}, ir, (host-openmp)99// CHK-PHASES-NEXT: 3: input, "[[INPUT]]", c, (device-openmp)100// CHK-PHASES-NEXT: 4: preprocessor, {3}, cpp-output, (device-openmp)101// CHK-PHASES-NEXT: 5: compiler, {4}, ir, (device-openmp)102// CHK-PHASES-NEXT: 6: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {2}, "device-openmp (powerpc64-ibm-linux-gnu)" {5}, ir103// CHK-PHASES-NEXT: 7: backend, {6}, assembler, (device-openmp)104// CHK-PHASES-NEXT: 8: assembler, {7}, object, (device-openmp)105// CHK-PHASES-NEXT: 9: offload, "device-openmp (powerpc64-ibm-linux-gnu)" {8}, object106// CHK-PHASES-NEXT: 10: llvm-offload-binary, {9}, image, (device-openmp)107// CHK-PHASES-NEXT: 11: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {2}, "device-openmp (powerpc64-ibm-linux-gnu)" {10}, ir108// CHK-PHASES-NEXT: 12: backend, {11}, assembler, (host-openmp)109// CHK-PHASES-NEXT: 13: assembler, {12}, object, (host-openmp)110// CHK-PHASES-NEXT: 14: clang-linker-wrapper, {13}, image, (host-openmp)111 112/// ###########################################################################113 114/// Check the phases when using multiple targets and multiple source files115// RUN: %clang -ccc-print-phases -lsomelib -fopenmp=libomp --target=powerpc64-ibm-linux-gnu \116// RUN: -fopenmp-targets=x86_64-pc-linux-gnu,powerpc64-ibm-linux-gnu %s %s 2>&1 | FileCheck -check-prefix=CHK-PHASES-FILES %s117// CHK-PHASES-FILES: 0: input, "somelib", object, (host-openmp)118// CHK-PHASES-FILES-NEXT: 1: input, "[[INPUT:.+]]", c, (host-openmp)119// CHK-PHASES-FILES-NEXT: 2: preprocessor, {1}, cpp-output, (host-openmp)120// CHK-PHASES-FILES-NEXT: 3: compiler, {2}, ir, (host-openmp)121// CHK-PHASES-FILES-NEXT: 4: input, "[[INPUT]]", c, (device-openmp)122// CHK-PHASES-FILES-NEXT: 5: preprocessor, {4}, cpp-output, (device-openmp)123// CHK-PHASES-FILES-NEXT: 6: compiler, {5}, ir, (device-openmp)124// CHK-PHASES-FILES-NEXT: 7: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {3}, "device-openmp (powerpc64-ibm-linux-gnu)" {6}, ir125// CHK-PHASES-FILES-NEXT: 8: backend, {7}, assembler, (device-openmp)126// CHK-PHASES-FILES-NEXT: 9: assembler, {8}, object, (device-openmp)127// CHK-PHASES-FILES-NEXT: 10: offload, "device-openmp (powerpc64-ibm-linux-gnu)" {9}, object128// CHK-PHASES-FILES-NEXT: 11: input, "[[INPUT]]", c, (device-openmp)129// CHK-PHASES-FILES-NEXT: 12: preprocessor, {11}, cpp-output, (device-openmp)130// CHK-PHASES-FILES-NEXT: 13: compiler, {12}, ir, (device-openmp)131// CHK-PHASES-FILES-NEXT: 14: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {3}, "device-openmp (x86_64-pc-linux-gnu)" {13}, ir132// CHK-PHASES-FILES-NEXT: 15: backend, {14}, assembler, (device-openmp)133// CHK-PHASES-FILES-NEXT: 16: assembler, {15}, object, (device-openmp)134// CHK-PHASES-FILES-NEXT: 17: offload, "device-openmp (x86_64-pc-linux-gnu)" {16}, object135// CHK-PHASES-FILES-NEXT: 18: llvm-offload-binary, {10, 17}, image, (device-openmp)136// CHK-PHASES-FILES-NEXT: 19: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {3}, "device-openmp (powerpc64-ibm-linux-gnu)" {18}, ir137// CHK-PHASES-FILES-NEXT: 20: backend, {19}, assembler, (host-openmp)138// CHK-PHASES-FILES-NEXT: 21: assembler, {20}, object, (host-openmp)139// CHK-PHASES-FILES-NEXT: 22: input, "[[INPUT]]", c, (host-openmp)140// CHK-PHASES-FILES-NEXT: 23: preprocessor, {22}, cpp-output, (host-openmp)141// CHK-PHASES-FILES-NEXT: 24: compiler, {23}, ir, (host-openmp)142// CHK-PHASES-FILES-NEXT: 25: input, "[[INPUT]]", c, (device-openmp)143// CHK-PHASES-FILES-NEXT: 26: preprocessor, {25}, cpp-output, (device-openmp)144// CHK-PHASES-FILES-NEXT: 27: compiler, {26}, ir, (device-openmp)145// CHK-PHASES-FILES-NEXT: 28: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {24}, "device-openmp (powerpc64-ibm-linux-gnu)" {27}, ir146// CHK-PHASES-FILES-NEXT: 29: backend, {28}, assembler, (device-openmp)147// CHK-PHASES-FILES-NEXT: 30: assembler, {29}, object, (device-openmp)148// CHK-PHASES-FILES-NEXT: 31: offload, "device-openmp (powerpc64-ibm-linux-gnu)" {30}, object149// CHK-PHASES-FILES-NEXT: 32: input, "[[INPUT]]", c, (device-openmp)150// CHK-PHASES-FILES-NEXT: 33: preprocessor, {32}, cpp-output, (device-openmp)151// CHK-PHASES-FILES-NEXT: 34: compiler, {33}, ir, (device-openmp)152// CHK-PHASES-FILES-NEXT: 35: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {24}, "device-openmp (x86_64-pc-linux-gnu)" {34}, ir153// CHK-PHASES-FILES-NEXT: 36: backend, {35}, assembler, (device-openmp)154// CHK-PHASES-FILES-NEXT: 37: assembler, {36}, object, (device-openmp)155// CHK-PHASES-FILES-NEXT: 38: offload, "device-openmp (x86_64-pc-linux-gnu)" {37}, object156// CHK-PHASES-FILES-NEXT: 39: llvm-offload-binary, {31, 38}, image, (device-openmp)157// CHK-PHASES-FILES-NEXT: 40: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {24}, "device-openmp (powerpc64-ibm-linux-gnu)" {39}, ir158// CHK-PHASES-FILES-NEXT: 41: backend, {40}, assembler, (host-openmp)159// CHK-PHASES-FILES-NEXT: 42: assembler, {41}, object, (host-openmp)160// CHK-PHASES-FILES-NEXT: 43: clang-linker-wrapper, {0, 21, 42}, image, (host-openmp)161 162/// Check -fopenmp-is-target-device is passed when compiling for the device.163// RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu %s 2>&1 \164// RUN: | FileCheck -check-prefix=CHK-fopenmp-is-target-device %s165 166// CHK-fopenmp-is-target-device: "-cc1"{{.*}} "-aux-triple" "powerpc64le-unknown-linux" {{.*}}"-fopenmp-is-target-device" "-fopenmp-host-ir-file-path" {{.*}}.c"167 168/// Check arguments to the linker wrapper169// RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu %s 2>&1 \170// RUN: | FileCheck -check-prefix=CHK-NEW-DRIVER %s171 172// CHK-NEW-DRIVER: clang-linker-wrapper{{.*}}"--host-triple=powerpc64le-unknown-linux"{{.*}}--{{.*}}"-lomp"{{.*}}"-lomptarget"173 174/// Check arguments to the linker wrapper175// RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu -g %s 2>&1 \176// RUN: | FileCheck -check-prefix=CHK-NEW-DRIVER-DEBUG %s177 178// CHK-NEW-DRIVER-DEBUG: clang-linker-wrapper{{.*}} "--device-compiler=powerpc64le-ibm-linux-gnu=-g"179 180/// Check arguments to the linker wrapper181// RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu \182// RUN: -mllvm -abc %s 2>&1 | FileCheck -check-prefix=CHK-NEW-DRIVER-MLLVM %s183 184// CHK-NEW-DRIVER-MLLVM: clang-linker-wrapper{{.*}} "--device-linker=powerpc64le-ibm-linux-gnu=-mllvm" "--device-linker=powerpc64le-ibm-linux-gnu=-abc"185 186//187// Ensure that we generate the correct bindings for '-fsyntax-only' for OpenMP.188//189// RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu \190// RUN: -fsyntax-only -ccc-print-bindings %s 2>&1 | FileCheck -check-prefix=CHK-SYNTAX-ONLY %s191// CHK-SYNTAX-ONLY: # "powerpc64le-ibm-linux-gnu" - "clang", inputs: ["[[INPUT:.+]]"], output: (nothing)192// CHK-SYNTAX-ONLY: # "powerpc64le-unknown-linux" - "clang", inputs: ["[[INPUT]]", (nothing)], output: (nothing)193 194//195// Ensure that we can generate the correct arguments for '-fsyntax-only' for196// OpenMP.197//198// RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu \199// RUN: -fsyntax-only %s 2>&1 | FileCheck -check-prefix=CHK-SYNTAX-ONLY-ARGS %s200// CHK-SYNTAX-ONLY-ARGS: "-cc1" "-triple" "powerpc64le-ibm-linux-gnu"{{.*}}"-fsyntax-only"201// CHK-SYNTAX-ONLY-ARGS: "-cc1" "-triple" "powerpc64le-unknown-linux"{{.*}}"-fsyntax-only"202 203//204// Ensure `-foffload-lto` is forwarded properly.205//206// RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu \207// RUN: -foffload-lto %s 2>&1 | FileCheck -check-prefix=CHK-DEVICE-LTO-FULL %s208// CHK-DEVICE-LTO-FULL: clang-linker-wrapper{{.*}} "--device-compiler=powerpc64le-ibm-linux-gnu=-flto=full"209// RUN: %clang -### --target=powerpc64le-linux -fopenmp=libomp -fopenmp-targets=powerpc64le-ibm-linux-gnu \210// RUN: -foffload-lto=thin %s 2>&1 | FileCheck -check-prefix=CHK-DEVICE-LTO-THIN %s211// CHK-DEVICE-LTO-THIN: clang-linker-wrapper{{.*}} "--device-compiler=powerpc64le-ibm-linux-gnu=-flto=thin"212 213//214// Check forwarding architectures to non-GPU targets215//216// RUN: %clang -### --target=aarch64-unknown-linux-gnu -fopenmp=libomp -fopenmp-targets=aarch64-unknown-linux-gnu \217// RUN: --offload-arch=a64fx %s 2>&1 | FileCheck -check-prefix=CHK-CPU-ARCH-A %s218// CHK-CPU-ARCH-A: "-cc1" "-triple" "aarch64-unknown-linux-gnu" {{.*}} "-target-cpu" "generic"219// CHK-CPU-ARCH-A: "-cc1" "-triple" "aarch64-unknown-linux-gnu" {{.*}} "-target-cpu" "a64fx"220//221// RUN: %clang -### --target=x86_64-unknown-linux-gnu -fopenmp=libomp -fopenmp-targets=x86_64-unknown-linux-gnu \222// RUN: --offload-arch=znver4 %s 2>&1 | FileCheck -check-prefix=CHK-CPU-ARCH-X %s223// CHK-CPU-ARCH-X: "-cc1" "-triple" "x86_64-unknown-linux-gnu" {{.*}} "-target-cpu" "x86-64"224// CHK-CPU-ARCH-X: "-cc1" "-triple" "x86_64-unknown-linux-gnu" {{.*}} "-target-cpu" "znver4"225