diff --git a/clang/test/Driver/linker-wrapper.c b/clang/test/Driver/linker-wrapper.c index a313a629cae9e..08ccadd2d72b8 100644 --- a/clang/test/Driver/linker-wrapper.c +++ b/clang/test/Driver/linker-wrapper.c @@ -13,7 +13,7 @@ // 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=NVPTX-LINK -// NVPTX-LINK: nvlink{{.*}}-m64 -o {{.*}}.out -arch sm_70 {{.*}}.o {{.*}}.o +// NVPTX-LINK: nvlink{{.*}}-m64 -o {{.*}}.img -arch sm_70 {{.*}}.o {{.*}}.o // RUN: clang-offload-packager -o %t.out \ // RUN: --image=file=%t.elf.o,kind=openmp,triple=nvptx64-nvidia-cuda,arch=sm_70 \ @@ -22,7 +22,7 @@ // 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=HOST-BC -// HOST-BC: nvlink{{.*}}-m64 -o {{.*}}.out -arch sm_70 {{.*}}.o {{.*}}.o +// HOST-BC: nvlink{{.*}}-m64 -o {{.*}}.img -arch sm_70 {{.*}}.o {{.*}}.o // RUN: clang-offload-packager -o %t.out \ // RUN: --image=file=%t.elf.o,kind=openmp,triple=nvptx64-nvidia-cuda,arch=sm_70 \ @@ -31,7 +31,7 @@ // RUN: clang-linker-wrapper --host-triple=x86_64-unknown-linux-gnu --dry-run --device-debug -O0 \ // RUN: --linker-path=/usr/bin/ld -- %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=NVPTX-LINK-DEBUG -// NVPTX-LINK-DEBUG: nvlink{{.*}}-m64 -g -o {{.*}}.out -arch sm_70 {{.*}}.o {{.*}}.o +// NVPTX-LINK-DEBUG: nvlink{{.*}}-m64 -g -o {{.*}}.img -arch sm_70 {{.*}}.o {{.*}}.o // RUN: clang-offload-packager -o %t.out \ // RUN: --image=file=%t.nvptx.bc,kind=openmp,triple=nvptx64-nvidia-cuda,arch=sm_70 \ @@ -49,7 +49,7 @@ // 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=AMDGPU-LINK -// AMDGPU-LINK: lld{{.*}}-flavor gnu --no-undefined -shared -plugin-opt=-amdgpu-internalize-symbols -plugin-opt=mcpu=gfx908 -o {{.*}}.out {{.*}}.o {{.*}}.o +// AMDGPU-LINK: lld{{.*}}-flavor gnu --no-undefined -shared -plugin-opt=-amdgpu-internalize-symbols -plugin-opt=mcpu=gfx908 -o {{.*}}.img {{.*}}.o {{.*}}.o // RUN: clang-offload-packager -o %t.out \ // RUN: --image=file=%t.amdgpu.bc,kind=openmp,triple=amdgcn-amd-amdhsa,arch=gfx1030 \ @@ -59,7 +59,7 @@ // RUN: --linker-path=/usr/bin/ld -- %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=AMDGPU-LTO-TEMPS // AMDGPU-LTO-TEMPS: clang" -o [[OBJ:.+]] -fPIC -c --target=amdgcn-amd-amdhsa -O2 -mcpu=gfx1030 {{.*}}.s -// AMDGPU-LTO-TEMPS: lld{{.*}}-flavor gnu --no-undefined -shared -plugin-opt=-amdgpu-internalize-symbols -plugin-opt=mcpu=gfx1030 -o {{.*}}.out {{.*}}.o +// AMDGPU-LTO-TEMPS: lld{{.*}}-flavor gnu --no-undefined -shared -plugin-opt=-amdgpu-internalize-symbols -plugin-opt=mcpu=gfx1030 -o {{.*}}.img {{.*}}.o // RUN: clang-offload-packager -o %t.out \ // RUN: --image=file=%t.amdgpu.bc,kind=openmp,triple=amdgcn-amd-amdhsa,arch=gfx908 \ @@ -68,7 +68,7 @@ // 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=AMDGPU-LINK-LTO -// AMDGPU-LINK-LTO: lld{{.*}}-flavor gnu --no-undefined -shared -plugin-opt=-amdgpu-internalize-symbols -plugin-opt=mcpu=gfx908 -o {{.*}}.out {{.*}}.o +// AMDGPU-LINK-LTO: lld{{.*}}-flavor gnu --no-undefined -shared -plugin-opt=-amdgpu-internalize-symbols -plugin-opt=mcpu=gfx908 -o {{.*}}.img {{.*}}.o // RUN: clang-offload-packager -o %t.out \ // RUN: --image=file=%t.elf.o,kind=openmp,triple=x86_64-unknown-linux-gnu \ @@ -77,7 +77,7 @@ // RUN: clang-linker-wrapper --host-triple=x86_64-unknown-linux-gnu --dry-run \ // RUN: --linker-path=/usr/bin/ld.lld -- %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=CPU-LINK -// CPU-LINK: ld.lld{{.*}}-m elf_x86_64 -shared -Bsymbolic -o {{.*}}.out {{.*}}.o {{.*}}.o +// CPU-LINK: ld.lld{{.*}}-m elf_x86_64 -shared -Bsymbolic -o {{.*}}.img {{.*}}.o {{.*}}.o // RUN: %clang -cc1 %s -triple x86_64-unknown-linux-gnu -emit-obj -o %t.o // RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu -mllvm -openmp-opt-disable \ @@ -103,7 +103,7 @@ // 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=CUDA-OMP-LINK -// CUDA-OMP-LINK: nvlink{{.*}}-m64 -o {{.*}}.out -arch sm_70 {{.*}}.o {{.*}}.o +// CUDA-OMP-LINK: nvlink{{.*}}-m64 -o {{.*}}.img -arch sm_70 {{.*}}.o {{.*}}.o // RUN: clang-offload-packager -o %t-lib.out \ // RUN: --image=file=%t.elf.o,kind=openmp,triple=nvptx64-nvidia-cuda,arch=sm_70 \ @@ -128,9 +128,9 @@ // RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \ // RUN: --linker-path=/usr/bin/ld -- %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=CUDA -// CUDA: nvlink{{.*}}-m64 -o {{.*}}.out -arch sm_52 {{.*}}.o -// CUDA: nvlink{{.*}}-m64 -o {{.*}}.out -arch sm_70 {{.*}}.o {{.*}}.o -// CUDA: fatbinary{{.*}}-64 --create {{.*}}.fatbin --image=profile=sm_70,file={{.*}}.out --image=profile=sm_52,file={{.*}}.out +// CUDA: nvlink{{.*}}-m64 -o {{.*}}.img -arch sm_52 {{.*}}.o +// CUDA: nvlink{{.*}}-m64 -o {{.*}}.img -arch sm_70 {{.*}}.o {{.*}}.o +// CUDA: fatbinary{{.*}}-64 --create {{.*}}.fatbin --image=profile=sm_70,file={{.*}}.img --image=profile=sm_52,file={{.*}}.img // RUN: clang-offload-packager -o %t.out \ // RUN: --image=file=%t.elf.o,kind=cuda,triple=nvptx64-nvidia-cuda,arch=sm_80 \ @@ -153,9 +153,9 @@ // RUN: clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu \ // RUN: --linker-path=/usr/bin/ld -- %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=HIP -// HIP: lld{{.*}}-flavor gnu --no-undefined -shared -plugin-opt=-amdgpu-internalize-symbols -plugin-opt=mcpu=gfx908 -o {{.*}}.out {{.*}}.o -// HIP: lld{{.*}}-flavor gnu --no-undefined -shared -plugin-opt=-amdgpu-internalize-symbols -plugin-opt=mcpu=gfx90a -o {{.*}}.out {{.*}}.o -// HIP: clang-offload-bundler{{.*}}-type=o -bundle-align=4096 -targets=host-x86_64-unknown-linux,hipv4-amdgcn-amd-amdhsa--gfx90a,hipv4-amdgcn-amd-amdhsa--gfx908 -input=/dev/null -input={{.*}}.out -input={{.*}}out -output={{.*}}.hipfb +// HIP: lld{{.*}}-flavor gnu --no-undefined -shared -plugin-opt=-amdgpu-internalize-symbols -plugin-opt=mcpu=gfx908 -o {{.*}}.img {{.*}}.o +// HIP: lld{{.*}}-flavor gnu --no-undefined -shared -plugin-opt=-amdgpu-internalize-symbols -plugin-opt=mcpu=gfx90a -o {{.*}}.img {{.*}}.o +// HIP: clang-offload-bundler{{.*}}-type=o -bundle-align=4096 -targets=host-x86_64-unknown-linux,hipv4-amdgcn-amd-amdhsa--gfx90a,hipv4-amdgcn-amd-amdhsa--gfx908 -input=/dev/null -input={{.*}}.img -input={{.*}}.img -output={{.*}}.hipfb // RUN: clang-offload-packager -o %t.out \ // RUN: --image=file=%t.elf.o,kind=openmp,triple=amdgcn-amd-amdhsa,arch=gfx908 \ @@ -166,8 +166,8 @@ // RUN: --linker-path=/usr/bin/ld --device-linker=a --device-linker=nvptx64-nvidia-cuda=b -- \ // RUN: %t.o -o a.out 2>&1 | FileCheck %s --check-prefix=LINKER-ARGS -// LINKER-ARGS: lld{{.*}}-flavor gnu --no-undefined -shared -plugin-opt=-amdgpu-internalize-symbols -plugin-opt=mcpu=gfx908 -o {{.*}}.out {{.*}}.o a -// LINKER-ARGS: nvlink{{.*}}-m64 -o {{.*}}.out -arch sm_70 {{.*}}.o a b +// LINKER-ARGS: lld{{.*}}-flavor gnu --no-undefined -shared -plugin-opt=-amdgpu-internalize-symbols -plugin-opt=mcpu=gfx908 -o {{.*}}.img {{.*}}.o a +// LINKER-ARGS: nvlink{{.*}}-m64 -o {{.*}}.img -arch sm_70 {{.*}}.o a b // RUN: not clang-linker-wrapper --dry-run --host-triple=x86_64-unknown-linux-gnu -ldummy \ // RUN: --linker-path=/usr/bin/ld --device-linker=a --device-linker=nvptx64-nvidia-cuda=b -- \ diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp index 095033e0517ee..1fb4c83052c4a 100644 --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -327,9 +327,9 @@ Expected link(ArrayRef InputFiles, const ArgList &Args) { // Create a new file to write the linked device image to. auto TempFileOrErr = - createOutputFile(sys::path::filename(ExecutableName) + "-device-" + - Triple.getArchName() + "-" + Arch, - "out"); + createOutputFile(sys::path::filename(ExecutableName) + "." + + Triple.getArchName() + "." + Arch, + "img"); if (!TempFileOrErr) return TempFileOrErr.takeError(); @@ -371,8 +371,8 @@ fatbinary(ArrayRef> InputFiles, Args.getLastArgValue(OPT_host_triple_EQ, sys::getDefaultTargetTriple())); // Create a new file to write the linked device image to. - auto TempFileOrErr = createOutputFile( - sys::path::filename(ExecutableName) + "-device", "fatbin"); + auto TempFileOrErr = + createOutputFile(sys::path::filename(ExecutableName), "fatbin"); if (!TempFileOrErr) return TempFileOrErr.takeError(); @@ -406,9 +406,9 @@ Expected link(ArrayRef InputFiles, const ArgList &Args) { // Create a new file to write the linked device image to. auto TempFileOrErr = - createOutputFile(sys::path::filename(ExecutableName) + "-" + - Triple.getArchName() + "-" + Arch, - "out"); + createOutputFile(sys::path::filename(ExecutableName) + "." + + Triple.getArchName() + "." + Arch, + "img"); if (!TempFileOrErr) return TempFileOrErr.takeError(); std::string ArchArg = ("-plugin-opt=mcpu=" + Arch).str(); @@ -451,9 +451,8 @@ fatbinary(ArrayRef> InputFiles, Args.getLastArgValue(OPT_host_triple_EQ, sys::getDefaultTargetTriple())); // Create a new file to write the linked device image to. - auto TempFileOrErr = createOutputFile(sys::path::filename(ExecutableName) + - "-device-" + Triple.getArchName(), - "hipfb"); + auto TempFileOrErr = + createOutputFile(sys::path::filename(ExecutableName), "hipfb"); if (!TempFileOrErr) return TempFileOrErr.takeError(); @@ -553,9 +552,9 @@ Expected link(ArrayRef InputFiles, const ArgList &Args) { // Create a new file to write the linked device image to. auto TempFileOrErr = - createOutputFile(sys::path::filename(ExecutableName) + "-" + - Triple.getArchName() + "-" + Arch, - "out"); + createOutputFile(sys::path::filename(ExecutableName) + "." + + Triple.getArchName() + "." + Arch, + "img"); if (!TempFileOrErr) return TempFileOrErr.takeError(); @@ -706,12 +705,24 @@ std::unique_ptr createLTO( Conf.PTO.SLPVectorization = Conf.OptLevel > 1; if (SaveTemps) { - std::string TempName = (sys::path::filename(ExecutableName) + "-device-" + - Triple.getTriple() + "-" + Arch) + std::string TempName = (sys::path::filename(ExecutableName) + "." + + Triple.getTriple() + "." + Arch) .str(); Conf.PostInternalizeModuleHook = [=](size_t Task, const Module &M) { - std::string File = !Task ? TempName + ".bc" - : TempName + "." + std::to_string(Task) + ".bc"; + std::string File = + !Task ? TempName + ".postlink.bc" + : TempName + "." + std::to_string(Task) + ".postlink.bc"; + error_code EC; + raw_fd_ostream LinkedBitcode(File, EC, sys::fs::OF_None); + if (EC) + reportError(errorCodeToError(EC)); + WriteBitcodeToFile(M, LinkedBitcode); + return true; + }; + Conf.PreCodeGenModuleHook = [=](size_t Task, const Module &M) { + std::string File = + !Task ? TempName + ".postopt.bc" + : TempName + "." + std::to_string(Task) + ".postopt.bc"; error_code EC; raw_fd_ostream LinkedBitcode(File, EC, sys::fs::OF_None); if (EC) @@ -743,6 +754,7 @@ Error linkBitcodeFiles(SmallVectorImpl &InputFiles, const ArgList &Args) { llvm::TimeTraceScope TimeScope("Link bitcode files"); const llvm::Triple Triple(Args.getLastArgValue(OPT_triple_EQ)); + StringRef Arch = Args.getLastArgValue(OPT_arch_EQ); SmallVector BitcodeInputFiles; DenseSet UsedInRegularObj; @@ -892,8 +904,8 @@ Error linkBitcodeFiles(SmallVectorImpl &InputFiles, StringRef Extension = (Triple.isNVPTX() || SaveTemps) ? "s" : "o"; std::string TaskStr = Task ? "." + std::to_string(Task) : ""; auto TempFileOrErr = - createOutputFile(sys::path::filename(ExecutableName) + "-device-" + - Triple.getTriple() + TaskStr, + createOutputFile(sys::path::filename(ExecutableName) + "." + + Triple.getTriple() + "." + Arch + TaskStr, Extension); if (!TempFileOrErr) reportError(TempFileOrErr.takeError()); @@ -986,8 +998,8 @@ Expected compileModule(Module &M) { M.setDataLayout(TM->createDataLayout()); int FD = -1; - auto TempFileOrErr = - createOutputFile(sys::path::filename(ExecutableName) + "-wrapper", "o"); + auto TempFileOrErr = createOutputFile( + sys::path::filename(ExecutableName) + ".image.wrapper", "o"); if (!TempFileOrErr) return TempFileOrErr.takeError(); if (std::error_code EC = sys::fs::openFileForWrite(*TempFileOrErr, FD))