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

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 5 11:01:47 PST 2017


Hi Rafael,

My use case is to allow bitcode modules to be split into a regular LTO part
and a ThinLTO part to support CFI and whole-program devirtualization under
ThinLTO. The initlal RFC threads were:
http://lists.llvm.org/pipermail/llvm-dev/2016-October/106490.html
http://lists.llvm.org/pipermail/llvm-dev/2016-October/106492.html

We also discussed other use cases on the second thread.

Thanks,
Peter

On Thu, Jan 5, 2017 at 8:06 AM, Rafael Avila de Espindola <
rafael.espindola at gmail.com> wrote:

>
> 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
>



-- 
-- 
Peter
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170105/c9ac3d0b/attachment.html>


More information about the llvm-commits mailing list