Author: Joseph Huber Date: 2023-09-28T11:22:11-05:00 New Revision: 7485d36a6267d1861710dfcb1b64784e4fb1187c
URL: https://github.com/llvm/llvm-project/commit/7485d36a6267d1861710dfcb1b64784e4fb1187c DIFF: https://github.com/llvm/llvm-project/commit/7485d36a6267d1861710dfcb1b64784e4fb1187c.diff LOG: [LinkerWrapper] Correctly handle multiple image wrappers (#67679) Summary: We use these image wrappers to do runtime specifica registration of variables and to load the device image that was compiled. This was intended to support multiple of these running at the same time, e.g. you can have a CUDA instance running with OpenMP and they should both function so long as you do not share state between the two. However, because we did not use a unique name for this file it would cause conflicts when included. This patch names the image based off of the language runtime it's using so that they remain separate. Fixes: https://github.com/llvm/llvm-project/issues/67583 Added: Modified: clang/test/Driver/linker-wrapper.c clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp Removed: ################################################################################ diff --git a/clang/test/Driver/linker-wrapper.c b/clang/test/Driver/linker-wrapper.c index 140cc72886692be..da7bdc22153ceae 100644 --- a/clang/test/Driver/linker-wrapper.c +++ b/clang/test/Driver/linker-wrapper.c @@ -87,6 +87,7 @@ // CUDA: clang{{.*}} -o [[IMG_SM52:.+]] --target=nvptx64-nvidia-cuda -march=sm_52 // CUDA: clang{{.*}} -o [[IMG_SM70:.+]] --target=nvptx64-nvidia-cuda -march=sm_70 // CUDA: fatbinary{{.*}}-64 --create {{.*}}.fatbin --image=profile=sm_70,file=[[IMG_SM70]] --image=profile=sm_52,file=[[IMG_SM52]] +// CUDA: usr/bin/ld{{.*}} {{.*}}.openmp.image.{{.*}}.o {{.*}}.cuda.image.{{.*}}.o // RUN: clang-offload-packager -o %t.out \ // RUN: --image=file=%t.elf.o,kind=cuda,triple=nvptx64-nvidia-cuda,arch=sm_80 \ diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp index b5f6fb35f227321..632e37e3cac8fec 100644 --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -810,7 +810,7 @@ Expected<StringRef> writeOffloadFile(const OffloadFile &File) { // Compile the module to an object file using the appropriate target machine for // the host triple. -Expected<StringRef> compileModule(Module &M) { +Expected<StringRef> compileModule(Module &M, OffloadKind Kind) { llvm::TimeTraceScope TimeScope("Compile module"); std::string Msg; const Target *T = TargetRegistry::lookupTarget(M.getTargetTriple(), Msg); @@ -829,8 +829,10 @@ Expected<StringRef> compileModule(Module &M) { M.setDataLayout(TM->createDataLayout()); int FD = -1; - auto TempFileOrErr = createOutputFile( - sys::path::filename(ExecutableName) + ".image.wrapper", "o"); + auto TempFileOrErr = + createOutputFile(sys::path::filename(ExecutableName) + "." + + getOffloadKindName(Kind) + ".image.wrapper", + "o"); if (!TempFileOrErr) return TempFileOrErr.takeError(); if (std::error_code EC = sys::fs::openFileForWrite(*TempFileOrErr, FD)) @@ -902,7 +904,7 @@ wrapDeviceImages(ArrayRef<std::unique_ptr<MemoryBuffer>> Buffers, WriteBitcodeToFile(M, OS); } - auto FileOrErr = compileModule(M); + auto FileOrErr = compileModule(M, Kind); if (!FileOrErr) return FileOrErr.takeError(); return *FileOrErr; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits