From 7aef8b3754a28e0856a8300980786a45bf7b4cd4 Mon Sep 17 00:00:00 2001 From: Joseph Huber Date: Thu, 24 Feb 2022 10:24:39 -0500 Subject: [PATCH] [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. --- clang/lib/CodeGen/BackendUtil.cpp | 10 ++++------ clang/test/Frontend/embed-object.ll | 4 ++-- llvm/lib/Transforms/Utils/ModuleUtils.cpp | 5 +++-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index ebfbe991881c..490f5b3de1ff 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> 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 49b477d4a7be..3270a7806210 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 61cf42db4a75..032ea8039797 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); }