From c00c2b246b12b47ab2cc22d522806aa3a900038b Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 8 Jun 2017 01:26:14 +0000 Subject: Object: Factor out the code for creating the irsymtab for an arbitrary bitcode file. This code now lives in lib/Object. The idea is that it can now be reused by IRObjectFile among other things. Differential Revision: https://reviews.llvm.org/D31921 llvm-svn: 304958 --- llvm/lib/Object/IRSymtab.cpp | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'llvm/lib/Object/IRSymtab.cpp') diff --git a/llvm/lib/Object/IRSymtab.cpp b/llvm/lib/Object/IRSymtab.cpp index 28558bdd065..fa343618caf 100644 --- a/llvm/lib/Object/IRSymtab.cpp +++ b/llvm/lib/Object/IRSymtab.cpp @@ -23,7 +23,9 @@ #include "llvm/IR/Mangler.h" #include "llvm/IR/Metadata.h" #include "llvm/IR/Module.h" +#include "llvm/Bitcode/BitcodeReader.h" #include "llvm/MC/StringTableBuilder.h" +#include "llvm/Object/IRObjectFile.h" #include "llvm/Object/ModuleSymbolTable.h" #include "llvm/Object/SymbolicFile.h" #include "llvm/Support/Allocator.h" @@ -259,3 +261,35 @@ Error irsymtab::build(ArrayRef Mods, SmallVector &Symtab, SmallVector &Strtab) { return Builder(Symtab, Strtab).build(Mods); } + +Expected irsymtab::readBitcode(ArrayRef BMs) { + FileContents FC; + if (BMs.empty()) + return make_error("Bitcode file does not contain any modules", + inconvertibleErrorCode()); + + LLVMContext Ctx; + std::vector Mods; + std::vector> OwnedMods; + for (auto BM : BMs) { + Expected> MOrErr = + BM.getLazyModule(Ctx, /*ShouldLazyLoadMetadata*/ true, + /*IsImporting*/ false); + if (!MOrErr) + return MOrErr.takeError(); + + if ((*MOrErr)->getDataLayoutStr().empty()) + return make_error("input module has no datalayout", + inconvertibleErrorCode()); + + Mods.push_back(MOrErr->get()); + OwnedMods.push_back(std::move(*MOrErr)); + } + + if (Error E = build(Mods, FC.Symtab, FC.Strtab)) + return std::move(E); + + FC.TheReader = {{FC.Symtab.data(), FC.Symtab.size()}, + {FC.Strtab.data(), FC.Strtab.size()}}; + return std::move(FC); +} -- cgit v1.2.3