diff --git a/llvm/include/llvm/IR/GVMaterializer.h b/llvm/include/llvm/IR/GVMaterializer.h index 6f57dc2a98a6..ae2f2e1aefbe 100644 --- a/llvm/include/llvm/IR/GVMaterializer.h +++ b/llvm/include/llvm/IR/GVMaterializer.h @@ -53,6 +53,8 @@ public: /// virtual std::error_code MaterializeModule(Module *M) = 0; + virtual std::error_code materializeMetadata() = 0; + virtual std::vector getIdentifiedStructTypes() const = 0; }; diff --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h index 698e8747495d..ac60c8e885e2 100644 --- a/llvm/include/llvm/IR/Module.h +++ b/llvm/include/llvm/IR/Module.h @@ -502,6 +502,8 @@ public: /// Materializer. std::error_code materializeAllPermanently(); + std::error_code materializeMetadata(); + /// @} /// @name Direct access to the globals list, functions list, and symbol table /// @{ diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.h b/llvm/lib/Bitcode/Reader/BitcodeReader.h index 0a69148d84da..27e8b2e2111d 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.h +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.h @@ -255,7 +255,7 @@ public: static uint64_t decodeSignRotatedValue(uint64_t V); /// Materialize any deferred Metadata block. - std::error_code materializeMetadata(); + std::error_code materializeMetadata() override; private: std::vector IdentifiedStructTypes; diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp index 3a88db9754af..3e8f91fee743 100644 --- a/llvm/lib/IR/Module.cpp +++ b/llvm/lib/IR/Module.cpp @@ -413,6 +413,12 @@ std::error_code Module::materializeAllPermanently() { return std::error_code(); } +std::error_code Module::materializeMetadata() { + if (!Materializer) + return std::error_code(); + return Materializer->materializeMetadata(); +} + //===----------------------------------------------------------------------===// // Other module related stuff. // diff --git a/llvm/lib/Object/IRObjectFile.cpp b/llvm/lib/Object/IRObjectFile.cpp index 6369d8befd1e..58c4ca312e89 100644 --- a/llvm/lib/Object/IRObjectFile.cpp +++ b/llvm/lib/Object/IRObjectFile.cpp @@ -300,7 +300,9 @@ llvm::object::IRObjectFile::create(MemoryBufferRef Object, std::unique_ptr Buff( MemoryBuffer::getMemBuffer(BCOrErr.get(), false)); - ErrorOr MOrErr = getLazyBitcodeModule(std::move(Buff), Context); + ErrorOr MOrErr = + getLazyBitcodeModule(std::move(Buff), Context, nullptr, + /*ShouldLazyLoadMetadata*/ true); if (std::error_code EC = MOrErr.getError()) return EC; diff --git a/llvm/tools/gold/gold-plugin.cpp b/llvm/tools/gold/gold-plugin.cpp index f7379ea314ab..8decc8ea6d54 100644 --- a/llvm/tools/gold/gold-plugin.cpp +++ b/llvm/tools/gold/gold-plugin.cpp @@ -598,6 +598,7 @@ getModuleForFile(LLVMContext &Context, claimed_file &F, Module &M = Obj.getModule(); + M.materializeMetadata(); UpgradeDebugInfo(M); SmallPtrSet Used;