From b647f13226b4b30b8b0cb6e9baebc7a01558cde4 Mon Sep 17 00:00:00 2001 From: Joseph Huber Date: Mon, 19 Sep 2022 10:24:21 -0500 Subject: [PATCH] [CUDA][HIP] Fix new driver crashing when using -save-temps in RDC-mode Previously when using the `clang-offload-packager` we did not pass the active offloading kinds. Then in Clang when we attempted to detect when there was host-offloading action that needed to be embedded in the host we did not find it. This patch adds the active offloading kinds so we know when there is input to be embedded. Reviewed By: tra Differential Revision: https://reviews.llvm.org/D134189 --- clang/include/clang/Driver/Action.h | 7 ++++++- clang/lib/Driver/Action.cpp | 13 +++++++++++++ clang/lib/Driver/Driver.cpp | 2 +- clang/test/Driver/amdgpu-openmp-toolchain.c | 2 +- clang/test/Driver/cuda-bindings.cu | 10 ++++++++++ clang/test/Driver/cuda-phases.cu | 6 +++--- clang/test/Driver/openmp-offload-gpu.c | 2 +- clang/test/Driver/openmp-offload.c | 12 ++++++------ 8 files changed, 41 insertions(+), 13 deletions(-) diff --git a/clang/include/clang/Driver/Action.h b/clang/include/clang/Driver/Action.h index 9d94076..550a47b 100644 --- a/clang/include/clang/Driver/Action.h +++ b/clang/include/clang/Driver/Action.h @@ -296,11 +296,16 @@ public: OffloadKindList DeviceOffloadKinds; public: - /// Add a action along with the associated toolchain, bound arch, and + /// Add an action along with the associated toolchain, bound arch, and /// offload kind. void add(Action &A, const ToolChain &TC, const char *BoundArch, OffloadKind OKind); + /// Add an action along with the associated toolchain, bound arch, and + /// offload kinds. + void add(Action &A, const ToolChain &TC, const char *BoundArch, + unsigned OffloadKindMask); + /// Get each of the individual arrays. const ActionList &getActions() const { return DeviceActions; } const ToolChainList &getToolChains() const { return DeviceToolChains; } diff --git a/clang/lib/Driver/Action.cpp b/clang/lib/Driver/Action.cpp index 1cb6827..bec6491 100644 --- a/clang/lib/Driver/Action.cpp +++ b/clang/lib/Driver/Action.cpp @@ -307,6 +307,19 @@ void OffloadAction::DeviceDependences::add(Action &A, const ToolChain &TC, DeviceOffloadKinds.push_back(OKind); } +void OffloadAction::DeviceDependences::add(Action &A, const ToolChain &TC, + const char *BoundArch, + unsigned OffloadKindMask) { + DeviceActions.push_back(&A); + DeviceToolChains.push_back(&TC); + DeviceBoundArchs.push_back(BoundArch); + + // Add each active offloading kind from a mask. + for (OffloadKind OKind : {OFK_OpenMP, OFK_Cuda, OFK_HIP}) + if (OKind & OffloadKindMask) + DeviceOffloadKinds.push_back(OKind); +} + OffloadAction::HostDependence::HostDependence(Action &A, const ToolChain &TC, const char *BoundArch, const DeviceDependences &DDeps) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index a67cf36..013d5b3 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -4391,7 +4391,7 @@ Action *Driver::BuildOffloadingActions(Compilation &C, Action *PackagerAction = C.MakeAction(OffloadActions, types::TY_Image); DDep.add(*PackagerAction, *C.getSingleOffloadToolChain(), - nullptr, Action::OFK_None); + nullptr, C.getActiveOffloadKinds()); } // If we are unable to embed a single device output into the host, we need to diff --git a/clang/test/Driver/amdgpu-openmp-toolchain.c b/clang/test/Driver/amdgpu-openmp-toolchain.c index 96caf57..288122c 100644 --- a/clang/test/Driver/amdgpu-openmp-toolchain.c +++ b/clang/test/Driver/amdgpu-openmp-toolchain.c @@ -26,7 +26,7 @@ // CHECK-PHASES: 8: assembler, {7}, object, (device-openmp) // CHECK-PHASES: 9: offload, "device-openmp (amdgcn-amd-amdhsa)" {8}, object // CHECK-PHASES: 10: clang-offload-packager, {9}, image -// CHECK-PHASES: 11: offload, "host-openmp (x86_64-unknown-linux-gnu)" {2}, " (x86_64-unknown-linux-gnu)" {10}, ir +// CHECK-PHASES: 11: offload, "host-openmp (x86_64-unknown-linux-gnu)" {2}, "device-openmp (x86_64-unknown-linux-gnu)" {10}, ir // CHECK-PHASES: 12: backend, {11}, assembler, (host-openmp) // CHECK-PHASES: 13: assembler, {12}, object, (host-openmp) // CHECK-PHASES: 14: clang-linker-wrapper, {13}, image, (host-openmp) diff --git a/clang/test/Driver/cuda-bindings.cu b/clang/test/Driver/cuda-bindings.cu index f95d2de..78c9bb9 100644 --- a/clang/test/Driver/cuda-bindings.cu +++ b/clang/test/Driver/cuda-bindings.cu @@ -224,3 +224,13 @@ // SYNTAX-ONLY: "-cc1" "-triple" "nvptx64-nvidia-cuda"{{.*}}"-fsyntax-only" // SYNTAX-ONLY: "-cc1" "-triple" "nvptx64-nvidia-cuda"{{.*}}"-fsyntax-only" // SYNTAX-ONLY: "-cc1" "-triple" "powerpc64le-ibm-linux-gnu"{{.*}}"-fsyntax-only" + +// +// Check to ensure that we can use '-save-temps' when operating in RDC-mode. +// +// RUN: %clang -### -target powerpc64le-ibm-linux-gnu -save-temps --offload-new-driver \ +// RUN: -fgpu-rdc --offload-arch=sm_70 --offload-arch=sm_52 -c %s 2>&1 \ +// RUN: | FileCheck -check-prefix=SAVE-TEMPS %s +// SAVE-TEMPS: "-cc1" "-triple" "nvptx64-nvidia-cuda"{{.*}}"-target-cpu" "sm_52" +// SAVE-TEMPS: "-cc1" "-triple" "nvptx64-nvidia-cuda"{{.*}}"-target-cpu" "sm_70" +// SAVE-TEMPS: "-cc1" "-triple" "powerpc64le-ibm-linux-gnu" diff --git a/clang/test/Driver/cuda-phases.cu b/clang/test/Driver/cuda-phases.cu index 4e0c66a..0230d30 100644 --- a/clang/test/Driver/cuda-phases.cu +++ b/clang/test/Driver/cuda-phases.cu @@ -238,8 +238,8 @@ // NEW-DRIVER-RDC-NEXT: 12: backend, {11}, assembler, (device-cuda, sm_70) // NEW-DRIVER-RDC-NEXT: 13: assembler, {12}, object, (device-cuda, sm_70) // NEW-DRIVER-RDC-NEXT: 14: offload, "device-cuda (nvptx64-nvidia-cuda:sm_70)" {13}, object -// NEW-DRIVER-RDC-NEXT: 15: clang-offload-packager, {8, 14}, image -// NEW-DRIVER-RDC-NEXT: 16: offload, " (powerpc64le-ibm-linux-gnu)" {2}, " (powerpc64le-ibm-linux-gnu)" {15}, ir +// NEW-DRIVER-RDC-NEXT: 15: clang-offload-packager, {8, 14}, image, (device-cuda) +// NEW-DRIVER-RDC-NEXT: 16: offload, "host-cuda (powerpc64le-ibm-linux-gnu)" {2}, "device-cuda (powerpc64le-ibm-linux-gnu)" {15}, ir // NEW-DRIVER-RDC-NEXT: 17: backend, {16}, assembler, (host-cuda) // NEW-DRIVER-RDC-NEXT: 18: assembler, {17}, object, (host-cuda) // NEW-DRIVER-RDC-NEXT: 19: clang-linker-wrapper, {18}, image, (host-cuda) @@ -262,7 +262,7 @@ // NEW-DRIVER-NEXT: 13: assembler, {12}, object, (device-cuda, sm_70) // NEW-DRIVER-NEXT: 14: offload, "device-cuda (nvptx64-nvidia-cuda:sm_70)" {13}, object // NEW-DRIVER-NEXT: 15: clang-offload-packager, {8, 14}, image -// NEW-DRIVER-NEXT: 16: offload, " (powerpc64le-ibm-linux-gnu)" {2}, " (powerpc64le-ibm-linux-gnu)" {15}, ir +// NEW-DRIVER-NEXT: 16: offload, "host-cuda (powerpc64le-ibm-linux-gnu)" {2}, "device-cuda (powerpc64le-ibm-linux-gnu)" {15}, ir // NEW-DRIVER-NEXT: 17: backend, {16}, assembler, (host-cuda) // NEW-DRIVER-NEXT: 18: assembler, {17}, object, (host-cuda) // NEW-DRIVER-NEXT: 19: clang-linker-wrapper, {18}, image, (host-cuda) diff --git a/clang/test/Driver/openmp-offload-gpu.c b/clang/test/Driver/openmp-offload-gpu.c index 66c9adf..333f6e8 100644 --- a/clang/test/Driver/openmp-offload-gpu.c +++ b/clang/test/Driver/openmp-offload-gpu.c @@ -258,7 +258,7 @@ // CHECK-PHASES: 8: assembler, {7}, object, (device-openmp) // CHECK-PHASES: 9: offload, "device-openmp (nvptx64-nvidia-cuda)" {8}, object // CHECK-PHASES: 10: clang-offload-packager, {9}, image -// CHECK-PHASES: 11: offload, "host-openmp (x86_64-unknown-linux-gnu)" {2}, " (x86_64-unknown-linux-gnu)" {10}, ir +// CHECK-PHASES: 11: offload, "host-openmp (x86_64-unknown-linux-gnu)" {2}, "device-openmp (x86_64-unknown-linux-gnu)" {10}, ir // CHECK-PHASES: 12: backend, {11}, assembler, (host-openmp) // CHECK-PHASES: 13: assembler, {12}, object, (host-openmp) // CHECK-PHASES: 14: clang-linker-wrapper, {13}, image, (host-openmp) diff --git a/clang/test/Driver/openmp-offload.c b/clang/test/Driver/openmp-offload.c index 377359d..1881f72 100644 --- a/clang/test/Driver/openmp-offload.c +++ b/clang/test/Driver/openmp-offload.c @@ -110,8 +110,8 @@ // CHK-PHASES-NEXT: 7: backend, {6}, assembler, (device-openmp) // CHK-PHASES-NEXT: 8: assembler, {7}, object, (device-openmp) // CHK-PHASES-NEXT: 9: offload, "device-openmp (powerpc64-ibm-linux-gnu)" {8}, object -// CHK-PHASES-NEXT: 10: clang-offload-packager, {9}, image -// CHK-PHASES-NEXT: 11: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {2}, " (powerpc64-ibm-linux-gnu)" {10}, ir +// CHK-PHASES-NEXT: 10: clang-offload-packager, {9}, image, (device-openmp) +// CHK-PHASES-NEXT: 11: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {2}, "device-openmp (powerpc64-ibm-linux-gnu)" {10}, ir // CHK-PHASES-NEXT: 12: backend, {11}, assembler, (host-openmp) // CHK-PHASES-NEXT: 13: assembler, {12}, object, (host-openmp) // CHK-PHASES-NEXT: 14: clang-linker-wrapper, {13}, image, (host-openmp) @@ -139,8 +139,8 @@ // CHK-PHASES-FILES-NEXT: 15: backend, {14}, assembler, (device-openmp) // CHK-PHASES-FILES-NEXT: 16: assembler, {15}, object, (device-openmp) // CHK-PHASES-FILES-NEXT: 17: offload, "device-openmp (powerpc64-ibm-linux-gnu)" {16}, object -// CHK-PHASES-FILES-NEXT: 18: clang-offload-packager, {10, 17}, image -// CHK-PHASES-FILES-NEXT: 19: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {3}, " (powerpc64-ibm-linux-gnu)" {18}, ir +// CHK-PHASES-FILES-NEXT: 18: clang-offload-packager, {10, 17}, image, (device-openmp) +// CHK-PHASES-FILES-NEXT: 19: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {3}, "device-openmp (powerpc64-ibm-linux-gnu)" {18}, ir // CHK-PHASES-FILES-NEXT: 20: backend, {19}, assembler, (host-openmp) // CHK-PHASES-FILES-NEXT: 21: assembler, {20}, object, (host-openmp) // CHK-PHASES-FILES-NEXT: 22: input, "[[INPUT]]", c, (host-openmp) @@ -160,8 +160,8 @@ // CHK-PHASES-FILES-NEXT: 36: backend, {35}, assembler, (device-openmp) // CHK-PHASES-FILES-NEXT: 37: assembler, {36}, object, (device-openmp) // CHK-PHASES-FILES-NEXT: 38: offload, "device-openmp (powerpc64-ibm-linux-gnu)" {37}, object -// CHK-PHASES-FILES-NEXT: 39: clang-offload-packager, {31, 38}, image -// CHK-PHASES-FILES-NEXT: 40: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {24}, " (powerpc64-ibm-linux-gnu)" {39}, ir +// CHK-PHASES-FILES-NEXT: 39: clang-offload-packager, {31, 38}, image, (device-openmp) +// CHK-PHASES-FILES-NEXT: 40: offload, "host-openmp (powerpc64-ibm-linux-gnu)" {24}, "device-openmp (powerpc64-ibm-linux-gnu)" {39}, ir // CHK-PHASES-FILES-NEXT: 41: backend, {40}, assembler, (host-openmp) // CHK-PHASES-FILES-NEXT: 42: assembler, {41}, object, (host-openmp) // CHK-PHASES-FILES-NEXT: 43: clang-linker-wrapper, {0, 21, 42}, image, (host-openmp) -- 2.7.4