Author: Joseph Huber Date: 2022-02-24T10:57:09-05:00 New Revision: 7aef8b3754a28e0856a8300980786a45bf7b4cd4
URL: https://github.com/llvm/llvm-project/commit/7aef8b3754a28e0856a8300980786a45bf7b4cd4 DIFF: https://github.com/llvm/llvm-project/commit/7aef8b3754a28e0856a8300980786a45bf7b4cd4.diff LOG: [OpenMP] Make section variable external to prevent collisions Summary: We use a section to embed offloading code into the host for later linking. This is normally unique to the translation unit as it is thrown away during linking. However, if the user performs a relocatable link the sections will be merged and we won't be able to access the files stored inside. This patch changes the section variables to have external linkage and a name defined by the section name, so if two sections are combined during linking we get an error. Added: Modified: clang/lib/CodeGen/BackendUtil.cpp clang/test/Frontend/embed-object.ll llvm/lib/Transforms/Utils/ModuleUtils.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index ebfbe991881c6..490f5b3de1ff3 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -1759,24 +1759,22 @@ void clang::EmbedObject(llvm::Module *M, const CodeGenOptions &CGOpts, return; for (StringRef OffloadObject : CGOpts.OffloadObjects) { - if (OffloadObject.count(',') != 1) { + if (OffloadObject.count(',') != 1) Diags.Report(Diags.getCustomDiagID( DiagnosticsEngine::Error, "Invalid string pair for embedding '%0'")) << OffloadObject; - return; - } auto FilenameAndSection = OffloadObject.split(','); llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> ObjectOrErr = - llvm::MemoryBuffer::getFileOrSTDIN(std::get<0>(FilenameAndSection)); + llvm::MemoryBuffer::getFileOrSTDIN(FilenameAndSection.first); if (std::error_code EC = ObjectOrErr.getError()) { auto DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, "could not open '%0' for embedding"); - Diags.Report(DiagID) << std::get<0>(FilenameAndSection); + Diags.Report(DiagID) << FilenameAndSection.first; return; } SmallString<128> SectionName( - {".llvm.offloading.", std::get<1>(FilenameAndSection)}); + {".llvm.offloading.", FilenameAndSection.second}); llvm::embedBufferInModule(*M, **ObjectOrErr, SectionName); } } diff --git a/clang/test/Frontend/embed-object.ll b/clang/test/Frontend/embed-object.ll index 49b477d4a7be0..3270a7806210b 100644 --- a/clang/test/Frontend/embed-object.ll +++ b/clang/test/Frontend/embed-object.ll @@ -3,8 +3,8 @@ ; RUN: -fembed-offload-object=%S/Inputs/empty.h,section2 -x ir %s -o - \ ; RUN: | FileCheck %s -check-prefix=CHECK -; CHECK: @[[OBJECT1:.+]] = private constant [0 x i8] zeroinitializer, section ".llvm.offloading.section1" -; CHECK: @[[OBJECT2:.+]] = private constant [0 x i8] zeroinitializer, section ".llvm.offloading.section2" +; CHECK: @[[OBJECT1:.+]] = hidden constant [0 x i8] zeroinitializer, section ".llvm.offloading.section1" +; CHECK: @[[OBJECT2:.+]] = hidden constant [0 x i8] zeroinitializer, section ".llvm.offloading.section2" ; CHECK: @llvm.compiler.used = appending global [3 x i8*] [i8* @x, i8* getelementptr inbounds ([0 x i8], [0 x i8]* @[[OBJECT1]], i32 0, i32 0), i8* getelementptr inbounds ([0 x i8], [0 x i8]* @[[OBJECT2]], i32 0, i32 0)], section "llvm.metadata" @x = private constant i8 1 diff --git a/llvm/lib/Transforms/Utils/ModuleUtils.cpp b/llvm/lib/Transforms/Utils/ModuleUtils.cpp index 61cf42db4a755..032ea80397977 100644 --- a/llvm/lib/Transforms/Utils/ModuleUtils.cpp +++ b/llvm/lib/Transforms/Utils/ModuleUtils.cpp @@ -271,9 +271,10 @@ void llvm::embedBufferInModule(Module &M, MemoryBufferRef Buf, Constant *ModuleConstant = ConstantDataArray::get( M.getContext(), makeArrayRef(Buf.getBufferStart(), Buf.getBufferSize())); GlobalVariable *GV = new GlobalVariable( - M, ModuleConstant->getType(), true, GlobalValue::PrivateLinkage, - ModuleConstant, "llvm.embedded.object"); + M, ModuleConstant->getType(), true, GlobalValue::ExternalLinkage, + ModuleConstant, SectionName.drop_front()); GV->setSection(SectionName); + GV->setVisibility(GlobalValue::HiddenVisibility); appendToCompilerUsed(M, GV); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits