From 45102a24c77ae8355afefa6a3cd3856474ff7e1c Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Tue, 13 Dec 2016 20:20:17 +0000 Subject: [PATCH] Object: Make IRObjectFile own multiple modules and enumerate symbols from all modules. This implements multi-module support in IRObjectFile. Differential Revision: https://reviews.llvm.org/D26951 llvm-svn: 289578 --- llvm/include/llvm/Object/IRObjectFile.h | 5 +++-- llvm/lib/Object/IRObjectFile.cpp | 39 ++++++++++++++++++++++----------- llvm/test/Object/Inputs/multi-module.ll | 3 +++ llvm/test/Object/multi-module.ll | 8 +++++++ 4 files changed, 40 insertions(+), 15 deletions(-) create mode 100644 llvm/test/Object/Inputs/multi-module.ll create mode 100644 llvm/test/Object/multi-module.ll diff --git a/llvm/include/llvm/Object/IRObjectFile.h b/llvm/include/llvm/Object/IRObjectFile.h index 744af7e..0ea8901 100644 --- a/llvm/include/llvm/Object/IRObjectFile.h +++ b/llvm/include/llvm/Object/IRObjectFile.h @@ -28,9 +28,10 @@ namespace object { class ObjectFile; class IRObjectFile : public SymbolicFile { - std::unique_ptr M; + std::vector> Mods; ModuleSymbolTable SymTab; - IRObjectFile(MemoryBufferRef Object, std::unique_ptr M); + IRObjectFile(MemoryBufferRef Object, + std::vector> Mods); public: ~IRObjectFile() override; diff --git a/llvm/lib/Object/IRObjectFile.cpp b/llvm/lib/Object/IRObjectFile.cpp index 07296e8..2d055e1 100644 --- a/llvm/lib/Object/IRObjectFile.cpp +++ b/llvm/lib/Object/IRObjectFile.cpp @@ -35,9 +35,11 @@ using namespace llvm; using namespace object; -IRObjectFile::IRObjectFile(MemoryBufferRef Object, std::unique_ptr Mod) - : SymbolicFile(Binary::ID_IR, Object), M(std::move(Mod)) { - SymTab.addModule(M.get()); +IRObjectFile::IRObjectFile(MemoryBufferRef Object, + std::vector> Mods) + : SymbolicFile(Binary::ID_IR, Object), Mods(std::move(Mods)) { + for (auto &M : this->Mods) + SymTab.addModule(M.get()); } IRObjectFile::~IRObjectFile() {} @@ -73,7 +75,11 @@ basic_symbol_iterator IRObjectFile::symbol_end() const { return basic_symbol_iterator(BasicSymbolRef(Ret, this)); } -StringRef IRObjectFile::getTargetTriple() const { return M->getTargetTriple(); } +StringRef IRObjectFile::getTargetTriple() const { + // Each module must have the same target triple, so we arbitrarily access the + // first one. + return Mods[0]->getTargetTriple(); +} ErrorOr IRObjectFile::findBitcodeInObject(const ObjectFile &Obj) { for (const SectionRef &Sec : Obj.sections()) { @@ -108,19 +114,26 @@ ErrorOr IRObjectFile::findBitcodeInMemBuffer(MemoryBufferRef Ob } Expected> -llvm::object::IRObjectFile::create(MemoryBufferRef Object, - LLVMContext &Context) { +IRObjectFile::create(MemoryBufferRef Object, LLVMContext &Context) { ErrorOr BCOrErr = findBitcodeInMemBuffer(Object); if (!BCOrErr) return errorCodeToError(BCOrErr.getError()); - Expected> MOrErr = - getLazyBitcodeModule(*BCOrErr, Context, - /*ShouldLazyLoadMetadata*/ true); - if (!MOrErr) - return MOrErr.takeError(); + Expected> BMsOrErr = + getBitcodeModuleList(*BCOrErr); + if (!BMsOrErr) + return BMsOrErr.takeError(); + + std::vector> Mods; + for (auto BM : *BMsOrErr) { + Expected> MOrErr = + BM.getLazyModule(Context, /*ShouldLazyLoadMetadata*/ true); + if (!MOrErr) + return MOrErr.takeError(); + + Mods.push_back(std::move(*MOrErr)); + } - std::unique_ptr &M = MOrErr.get(); return std::unique_ptr( - new IRObjectFile(*BCOrErr, std::move(M))); + new IRObjectFile(*BCOrErr, std::move(Mods))); } diff --git a/llvm/test/Object/Inputs/multi-module.ll b/llvm/test/Object/Inputs/multi-module.ll new file mode 100644 index 0000000..e4e9b82 --- /dev/null +++ b/llvm/test/Object/Inputs/multi-module.ll @@ -0,0 +1,3 @@ +define void @f2() { + ret void +} diff --git a/llvm/test/Object/multi-module.ll b/llvm/test/Object/multi-module.ll new file mode 100644 index 0000000..204ffc6 --- /dev/null +++ b/llvm/test/Object/multi-module.ll @@ -0,0 +1,8 @@ +; RUN: llvm-cat -o - %s %S/Inputs/multi-module.ll | llvm-nm - | FileCheck %s + +; CHECK: T f1 +; CHECK: T f2 + +define void @f1() { + ret void +} -- 2.7.4