jhuber6 created this revision. jhuber6 added reviewers: JonChesterfield, carlo.bertolli, yaxunl, saiislam. Herald added subscribers: sunshaoce, kerbowa, guansong, tpr, jvesely. Herald added a project: All. jhuber6 requested review of this revision. Herald added subscribers: cfe-commits, jplehr, sstefan1, MaskRay. Herald added a reviewer: jdoerfert. Herald added a project: clang.
AMDGPU sometimes uses a novel formatting for their offloading architecture called the target id. This merges the attributes and the architecture name into a single string. Previously, we were passing this as the canonical architecture name. This caused the linker wrapper to fail to find relevant libraries and then pass an incalid CPU name. This patch changes the handling in the offload packager to handle the canonical architecture and then extract the features. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D150998 Files: clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/amdgpu-openmp-toolchain.c Index: clang/test/Driver/amdgpu-openmp-toolchain.c =================================================================== --- clang/test/Driver/amdgpu-openmp-toolchain.c +++ clang/test/Driver/amdgpu-openmp-toolchain.c @@ -62,3 +62,7 @@ // RUN: --rocm-device-lib-path=%S/Inputs/rocm/amdgcn/bitcode -fopenmp-new-driver %s 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-LIB-DEVICE-NOGPULIB // CHECK-LIB-DEVICE-NOGPULIB-NOT: "-cc1" {{.*}}ocml.bc"{{.*}}ockl.bc"{{.*}}oclc_daz_opt_on.bc"{{.*}}oclc_unsafe_math_off.bc"{{.*}}oclc_finite_only_off.bc"{{.*}}oclc_correctly_rounded_sqrt_on.bc"{{.*}}oclc_wavefrontsize64_on.bc"{{.*}}oclc_isa_version_803.bc" + +// RUN: %clang -### -target x86_64-pc-linux-gnu -fopenmp --offload-arch=gfx90a:sramecc-:xnack+ \ +// RUN: -nogpulib %s 2>&1 | FileCheck %s --check-prefix=CHECK-TARGET-ID +// CHECK-TARGET-ID: clang-offload-packager{{.*}}arch=gfx90a,kind=openmp,feature=-sramecc,feature=+xnack Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -8449,7 +8449,7 @@ C.getArgsForToolChain(TC, OffloadAction->getOffloadingArch(), OffloadAction->getOffloadingDeviceKind()); StringRef File = C.getArgs().MakeArgString(TC->getInputFilename(Input)); - StringRef Arch = (OffloadAction->getOffloadingArch()) + StringRef Arch = OffloadAction->getOffloadingArch() ? OffloadAction->getOffloadingArch() : TCArgs.getLastArgValue(options::OPT_march_EQ); StringRef Kind = @@ -8462,14 +8462,22 @@ llvm::copy_if(Features, std::back_inserter(FeatureArgs), [](StringRef Arg) { return !Arg.startswith("-target"); }); + if (TC->getTriple().isAMDGPU()) { + for (StringRef Feature : llvm::split(Arch.split(':').second, ':')) { + FeatureArgs.emplace_back( + Args.MakeArgString(Feature.take_back() + Feature.drop_back())); + } + } + SmallVector<std::string> Parts{ "file=" + File.str(), "triple=" + TC->getTripleString(), - "arch=" + Arch.str(), + "arch=" + getProcessorFromTargetID(TC->getTriple(), Arch).str(), "kind=" + Kind.str(), }; - if (TC->getDriver().isUsingLTO(/* IsOffload */ true)) + if (TC->getDriver().isUsingLTO(/* IsOffload */ true) || + TC->getTriple().isAMDGPU()) for (StringRef Feature : FeatureArgs) Parts.emplace_back("feature=" + Feature.str());
Index: clang/test/Driver/amdgpu-openmp-toolchain.c =================================================================== --- clang/test/Driver/amdgpu-openmp-toolchain.c +++ clang/test/Driver/amdgpu-openmp-toolchain.c @@ -62,3 +62,7 @@ // RUN: --rocm-device-lib-path=%S/Inputs/rocm/amdgcn/bitcode -fopenmp-new-driver %s 2>&1 | \ // RUN: FileCheck %s --check-prefix=CHECK-LIB-DEVICE-NOGPULIB // CHECK-LIB-DEVICE-NOGPULIB-NOT: "-cc1" {{.*}}ocml.bc"{{.*}}ockl.bc"{{.*}}oclc_daz_opt_on.bc"{{.*}}oclc_unsafe_math_off.bc"{{.*}}oclc_finite_only_off.bc"{{.*}}oclc_correctly_rounded_sqrt_on.bc"{{.*}}oclc_wavefrontsize64_on.bc"{{.*}}oclc_isa_version_803.bc" + +// RUN: %clang -### -target x86_64-pc-linux-gnu -fopenmp --offload-arch=gfx90a:sramecc-:xnack+ \ +// RUN: -nogpulib %s 2>&1 | FileCheck %s --check-prefix=CHECK-TARGET-ID +// CHECK-TARGET-ID: clang-offload-packager{{.*}}arch=gfx90a,kind=openmp,feature=-sramecc,feature=+xnack Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -8449,7 +8449,7 @@ C.getArgsForToolChain(TC, OffloadAction->getOffloadingArch(), OffloadAction->getOffloadingDeviceKind()); StringRef File = C.getArgs().MakeArgString(TC->getInputFilename(Input)); - StringRef Arch = (OffloadAction->getOffloadingArch()) + StringRef Arch = OffloadAction->getOffloadingArch() ? OffloadAction->getOffloadingArch() : TCArgs.getLastArgValue(options::OPT_march_EQ); StringRef Kind = @@ -8462,14 +8462,22 @@ llvm::copy_if(Features, std::back_inserter(FeatureArgs), [](StringRef Arg) { return !Arg.startswith("-target"); }); + if (TC->getTriple().isAMDGPU()) { + for (StringRef Feature : llvm::split(Arch.split(':').second, ':')) { + FeatureArgs.emplace_back( + Args.MakeArgString(Feature.take_back() + Feature.drop_back())); + } + } + SmallVector<std::string> Parts{ "file=" + File.str(), "triple=" + TC->getTripleString(), - "arch=" + Arch.str(), + "arch=" + getProcessorFromTargetID(TC->getTriple(), Arch).str(), "kind=" + Kind.str(), }; - if (TC->getDriver().isUsingLTO(/* IsOffload */ true)) + if (TC->getDriver().isUsingLTO(/* IsOffload */ true) || + TC->getTriple().isAMDGPU()) for (StringRef Feature : FeatureArgs) Parts.emplace_back("feature=" + Feature.str());
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits