[llvm] r289578 - Object: Make IRObjectFile own multiple modules and enumerate symbols from all modules.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 5 08:06:09 PST 2017


Hi Peter,

I probably missed the initial discussion about this. What is the main
use case for having a file be composed of multiple modules?

Cheers,
Rafael

Peter Collingbourne via llvm-commits <llvm-commits at lists.llvm.org>
writes:

> Author: pcc
> Date: Tue Dec 13 14:20:17 2016
> New Revision: 289578
>
> URL: http://llvm.org/viewvc/llvm-project?rev=289578&view=rev
> Log:
> 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
>
> Added:
>     llvm/trunk/test/Object/Inputs/multi-module.ll
>     llvm/trunk/test/Object/multi-module.ll
> Modified:
>     llvm/trunk/include/llvm/Object/IRObjectFile.h
>     llvm/trunk/lib/Object/IRObjectFile.cpp
>
> Modified: llvm/trunk/include/llvm/Object/IRObjectFile.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/IRObjectFile.h?rev=289578&r1=289577&r2=289578&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Object/IRObjectFile.h (original)
> +++ llvm/trunk/include/llvm/Object/IRObjectFile.h Tue Dec 13 14:20:17 2016
> @@ -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;
>
> Modified: llvm/trunk/lib/Object/IRObjectFile.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/IRObjectFile.cpp?rev=289578&r1=289577&r2=289578&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Object/IRObjectFile.cpp (original)
> +++ llvm/trunk/lib/Object/IRObjectFile.cpp Tue Dec 13 14:20:17 2016
> @@ -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::symb
>    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::f
>  }
>  
>  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)));
>  }
>
> Added: llvm/trunk/test/Object/Inputs/multi-module.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/multi-module.ll?rev=289578&view=auto
> ==============================================================================
> --- llvm/trunk/test/Object/Inputs/multi-module.ll (added)
> +++ llvm/trunk/test/Object/Inputs/multi-module.ll Tue Dec 13 14:20:17 2016
> @@ -0,0 +1,3 @@
> +define void @f2() {
> +  ret void
> +}
>
> Added: llvm/trunk/test/Object/multi-module.ll
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/multi-module.ll?rev=289578&view=auto
> ==============================================================================
> --- llvm/trunk/test/Object/multi-module.ll (added)
> +++ llvm/trunk/test/Object/multi-module.ll Tue Dec 13 14:20:17 2016
> @@ -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
> +}
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list