aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2016-12-13 20:20:17 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2016-12-13 20:20:17 +0000
commit265ab521b87520c70bd0b820e2d9a0d5959360ab (patch)
tree8de76cac3b5e5444077aaa0f4f101a6ef9c3a181
parente976df103e587c2c67c9ed84ca847a7a38a5d89d (diff)
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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289578 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Object/IRObjectFile.h5
-rw-r--r--lib/Object/IRObjectFile.cpp39
-rw-r--r--test/Object/Inputs/multi-module.ll3
-rw-r--r--test/Object/multi-module.ll8
4 files changed, 40 insertions, 15 deletions
diff --git a/include/llvm/Object/IRObjectFile.h b/include/llvm/Object/IRObjectFile.h
index 744af7e9561..0ea89011e88 100644
--- a/include/llvm/Object/IRObjectFile.h
+++ b/include/llvm/Object/IRObjectFile.h
@@ -28,9 +28,10 @@ namespace object {
class ObjectFile;
class IRObjectFile : public SymbolicFile {
- std::unique_ptr<Module> M;
+ std::vector<std::unique_ptr<Module>> Mods;
ModuleSymbolTable SymTab;
- IRObjectFile(MemoryBufferRef Object, std::unique_ptr<Module> M);
+ IRObjectFile(MemoryBufferRef Object,
+ std::vector<std::unique_ptr<Module>> Mods);
public:
~IRObjectFile() override;
diff --git a/lib/Object/IRObjectFile.cpp b/lib/Object/IRObjectFile.cpp
index 07296e85e6c..2d055e14470 100644
--- a/lib/Object/IRObjectFile.cpp
+++ b/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)));
}
diff --git a/test/Object/Inputs/multi-module.ll b/test/Object/Inputs/multi-module.ll
new file mode 100644
index 00000000000..e4e9b82be64
--- /dev/null
+++ b/test/Object/Inputs/multi-module.ll
@@ -0,0 +1,3 @@
+define void @f2() {
+ ret void
+}
diff --git a/test/Object/multi-module.ll b/test/Object/multi-module.ll
new file mode 100644
index 00000000000..204ffc600cb
--- /dev/null
+++ b/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
+}