diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2016-12-13 20:20:17 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2016-12-13 20:20:17 +0000 |
commit | 45102a24c77ae8355afefa6a3cd3856474ff7e1c (patch) | |
tree | 5ff0fd26a07f88f9c95d9ef6a5dc50cd02e4b065 /llvm/lib/Object/IRObjectFile.cpp | |
parent | c5fecb4f1a857bd741c3296293cfcbf0e18ff623 (diff) | |
download | bcm5719-llvm-45102a24c77ae8355afefa6a3cd3856474ff7e1c.tar.gz bcm5719-llvm-45102a24c77ae8355afefa6a3cd3856474ff7e1c.zip |
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
Diffstat (limited to 'llvm/lib/Object/IRObjectFile.cpp')
-rw-r--r-- | llvm/lib/Object/IRObjectFile.cpp | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/llvm/lib/Object/IRObjectFile.cpp b/llvm/lib/Object/IRObjectFile.cpp index 07296e85e6c..2d055e14470 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<Module> Mod) - : SymbolicFile(Binary::ID_IR, Object), M(std::move(Mod)) { - SymTab.addModule(M.get()); +IRObjectFile::IRObjectFile(MemoryBufferRef Object, + std::vector<std::unique_ptr<Module>> 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<MemoryBufferRef> IRObjectFile::findBitcodeInObject(const ObjectFile &Obj) { for (const SectionRef &Sec : Obj.sections()) { @@ -108,19 +114,26 @@ ErrorOr<MemoryBufferRef> IRObjectFile::findBitcodeInMemBuffer(MemoryBufferRef Ob } Expected<std::unique_ptr<IRObjectFile>> -llvm::object::IRObjectFile::create(MemoryBufferRef Object, - LLVMContext &Context) { +IRObjectFile::create(MemoryBufferRef Object, LLVMContext &Context) { ErrorOr<MemoryBufferRef> BCOrErr = findBitcodeInMemBuffer(Object); if (!BCOrErr) return errorCodeToError(BCOrErr.getError()); - Expected<std::unique_ptr<Module>> MOrErr = - getLazyBitcodeModule(*BCOrErr, Context, - /*ShouldLazyLoadMetadata*/ true); - if (!MOrErr) - return MOrErr.takeError(); + Expected<std::vector<BitcodeModule>> BMsOrErr = + getBitcodeModuleList(*BCOrErr); + if (!BMsOrErr) + return BMsOrErr.takeError(); + + std::vector<std::unique_ptr<Module>> Mods; + for (auto BM : *BMsOrErr) { + Expected<std::unique_ptr<Module>> MOrErr = + BM.getLazyModule(Context, /*ShouldLazyLoadMetadata*/ true); + if (!MOrErr) + return MOrErr.takeError(); + + Mods.push_back(std::move(*MOrErr)); + } - std::unique_ptr<Module> &M = MOrErr.get(); return std::unique_ptr<IRObjectFile>( - new IRObjectFile(*BCOrErr, std::move(M))); + new IRObjectFile(*BCOrErr, std::move(Mods))); } |