llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang @llvm/pr-subscribers-backend-spir-v Author: Yury Plyakhin (YuriPlyakhin) <details> <summary>Changes</summary> A direct `clang --target=spirv64-unknown-unknown --sycl-link a.bc` did not tell clang-sycl-linker which device it is finalizing for. Derive the triple from the target the driver was given, and the architecture from -march=, and pass them as -triple=/-arch=. An absent -march= means no specific device was requested. That is spelled as an absent -arch=, matching how clang-linker-wrapper renders an offload image that names no device. A caller may also name these itself, via -Xlinker/-Wl, or (through clang-linker-wrapper) via -Xoffload-linker. clang-sycl-linker keeps the last value of each, so an explicitly given one has to win: detect them and derive nothing in that case. With the driver deriving both values, the SYCL-specific forwarding in clang-linker-wrapper becomes redundant - it spelled the triple and the architecture out through -Xlinker after having already passed the very same strings as --target= and -march= - so drop it. --- Full diff: https://github.com/llvm/llvm-project/pull/217492.diff 5 Files Affected: - (modified) clang/lib/Driver/ToolChains/SPIRV.cpp (+17) - (modified) clang/test/Driver/sycl-link-spirv-target.cpp (+29) - (modified) clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-verbose.c (+1-1) - (modified) clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper.c (+9-1) - (modified) clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp (+2-7) ``````````diff diff --git a/clang/lib/Driver/ToolChains/SPIRV.cpp b/clang/lib/Driver/ToolChains/SPIRV.cpp index 5cc1eec74c1cc..3a5cc6f90d23f 100644 --- a/clang/lib/Driver/ToolChains/SPIRV.cpp +++ b/clang/lib/Driver/ToolChains/SPIRV.cpp @@ -184,6 +184,23 @@ void SPIRV::Linker::ConstructJob(Compilation &C, const JobAction &JA, // Use of --sycl-link will call the clang-sycl-linker instead of // the default linker (spirv-link). Linker = ToolChain.GetProgramPath("clang-sycl-linker"); + + // clang-sycl-linker needs the device target triple and architecture to + // finalize a device image. + bool HasTriple = false, HasArch = false; + for (const Arg *A : + Args.filtered(options::OPT_Xlinker, options::OPT_Wl_COMMA, + options::OPT_Zlinker_input)) + for (StringRef Val : A->getValues()) { + HasTriple |= Val.starts_with("-triple") || Val.starts_with("--triple"); + HasArch |= Val.starts_with("-arch") || Val.starts_with("--arch"); + } + if (!HasTriple) + CmdArgs.push_back( + Args.MakeArgString("-triple=" + ToolChain.getTripleString())); + StringRef Arch = Args.getLastArgValue(options::OPT_march_EQ); + if (!HasArch && !Arch.empty()) + CmdArgs.push_back(Args.MakeArgString("-arch=" + Arch)); if (Args.hasArg(options::OPT_v)) CmdArgs.push_back("-v"); } else if (!llvm::sys::fs::can_execute(Linker) && diff --git a/clang/test/Driver/sycl-link-spirv-target.cpp b/clang/test/Driver/sycl-link-spirv-target.cpp index 885621140a679..4858f860d94e3 100644 --- a/clang/test/Driver/sycl-link-spirv-target.cpp +++ b/clang/test/Driver/sycl-link-spirv-target.cpp @@ -14,3 +14,32 @@ // RUN: %clangxx -### --target=spirv64 --sycl-link -v %t.bc 2>&1 \ // RUN: | FileCheck %s -check-prefix=VERBOSE // VERBOSE: "{{.*}}clang-sycl-linker{{.*}}" {{.*}}"-v" + +// Test that -triple is propagated from --target and passed to clang-sycl-linker. +// Test that no -march= results in no -arch= in clang-sycl-linker command line. +// RUN: touch %t.bc +// RUN: %clangxx -### --target=spirv64-unknown-unknown --sycl-link %t.bc 2>&1 \ +// RUN: | FileCheck %s -check-prefix=FINALIZE +// FINALIZE: "{{.*}}clang-sycl-linker{{.*}}" "{{.*}}.bc" "-o" "a.out" "-triple=spirv64-unknown-unknown"{{$}} + +// Test that the target triple is passed on as spelled rather than padded out +// to a full triple. +// RUN: touch %t.bc +// RUN: %clangxx -### --target=spirv64 --sycl-link %t.bc 2>&1 \ +// RUN: | FileCheck %s -check-prefix=FINALIZE-SHORT +// FINALIZE-SHORT: "{{.*}}clang-sycl-linker{{.*}}" "{{.*}}.bc" "-o" "a.out" "-triple=spirv64"{{$}} + +// Test that a requested device architecture is passed on as -arch=. +// RUN: touch %t.bc +// RUN: %clangxx -### --target=spirv64-unknown-unknown -march=foo --sycl-link %t.bc 2>&1 \ +// RUN: | FileCheck %s -check-prefix=FINALIZE-ARCH +// FINALIZE-ARCH: "{{.*}}clang-sycl-linker{{.*}}" "{{.*}}.bc" "-o" "a.out" "-triple=spirv64-unknown-unknown" "-arch=foo"{{$}} + +// Test that -triple=/-arch= passed through -Xlinker/-Wl take priority and that +// --target/-march passed to clang do not cause duplication of -triple=/-arch=. +// RUN: touch %t.bc +// RUN: %clangxx -### --target=spirv64 --sycl-link -march=bmg_g21 -Xlinker -triple=spirv64-unknown-unknown -Xlinker -arch=bar %t.bc 2>&1 \ +// RUN: | FileCheck %s -check-prefix=NODUP +// RUN: %clangxx -### --target=spirv64 --sycl-link -march=bmg_g21 -Wl,-triple=spirv64-unknown-unknown,-arch=bar %t.bc 2>&1 \ +// RUN: | FileCheck %s -check-prefix=NODUP +// NODUP: "{{.*}}clang-sycl-linker{{.*}}" "-triple=spirv64-unknown-unknown" "-arch=bar" "{{.*}}.bc" "-o" "a.out"{{$}} diff --git a/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-verbose.c b/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-verbose.c index 54bd856746fd3..7da80fc9ee41f 100644 --- a/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-verbose.c +++ b/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-verbose.c @@ -76,7 +76,7 @@ // RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=SYCL // SYCL: llvm-offload-binary{{.*}} {{.*}}.o --image=kind=sycl,triple=spirv64-unknown-unknown,arch=generic,file={{.*}}.o -// SYCL: clang{{.*}} --target=spirv64-unknown-unknown {{.*}} --sycl-link {{.*}}-triple=spirv64-unknown-unknown{{.*}}-arch= +// SYCL: clang{{.*}} --target=spirv64-unknown-unknown {{.*}} --sycl-link{{$}} // SYCL: llvm-offload-wrapper{{.*}} --kind=sycl --triple=x86_64-unknown-linux-gnu -o [[BC:.*]].bc {{.*}}.img // SYCL: clang{{.*}} --no-default-config --target=x86_64-unknown-linux-gnu -c -fPIC -o {{.*}}.sycl.image.wrapper{{.*}}.o [[BC]].bc diff --git a/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper.c b/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper.c index ca2743114cd7b..9db92e604847c 100644 --- a/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper.c +++ b/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper.c @@ -57,7 +57,15 @@ __attribute__((visibility("protected"), used)) int x; // RUN: clang-linker-wrapper --host-triple=x86_64-unknown-linux-gnu --dry-run \ // RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=SPIRV-LINK -// SPIRV-LINK: clang{{.*}} -o {{.*}}.img -dumpdir a.out.spirv64..img. --target=spirv64-unknown-unknown {{.*}}.o --sycl-link -Xlinker -triple=spirv64-unknown-unknown -Xlinker -arch= +// SPIRV-LINK: clang{{.*}} -o {{.*}}.img -dumpdir a.out.spirv64..img. --target=spirv64-unknown-unknown {{.*}}.o --sycl-link{{$}} + +// RUN: llvm-offload-binary -o %t.out \ +// RUN: --image=file=%t.spirv.bc,kind=sycl,triple=spirv64-unknown-unknown,arch=foo +// RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.o -fembed-offload-object=%t.out +// RUN: clang-linker-wrapper --host-triple=x86_64-unknown-linux-gnu --dry-run \ +// RUN: --linker-path=/usr/bin/ld %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=SPIRV-LINK-ARCH + +// SPIRV-LINK-ARCH: clang{{.*}} --target=spirv64-unknown-unknown -march=foo {{.*}}.o --sycl-link{{$}} // RUN: llvm-offload-binary -o %t.out \ // RUN: --image=file=%t.elf.o,kind=openmp,triple=x86_64-unknown-linux-gnu \ diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp index 399f07d7c0a70..ecc87ed5b53b6 100644 --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -603,14 +603,9 @@ Expected<StringRef> clang(ArrayRef<StringRef> InputFiles, const ArgList &Args, // For linking device code with the SYCL offload kind, special handling is // required. Passing --sycl-link to clang results in a call to - // clang-sycl-linker. Additional linker flags required by clang-sycl-linker - // will be communicated via the -Xlinker option. - if (ActiveOffloadKindMask & OFK_SYCL) { + // clang-sycl-linker. + if (ActiveOffloadKindMask & OFK_SYCL) CmdArgs.push_back("--sycl-link"); - CmdArgs.append( - {"-Xlinker", Args.MakeArgString("-triple=" + Triple.getTriple())}); - CmdArgs.append({"-Xlinker", Args.MakeArgString("-arch=" + Arch)}); - } for (StringRef Arg : Args.getAllArgValues(OPT_linker_arg_EQ)) CmdArgs.append({"-Xlinker", Args.MakeArgString(Arg)}); `````````` </details> https://github.com/llvm/llvm-project/pull/217492 _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
