diff --git a/include/llvm/IR/GVMaterializer.h b/include/llvm/IR/GVMaterializer.h index 6f57dc2a98a..ae2f2e1aefb 100644 --- a/include/llvm/IR/GVMaterializer.h +++ b/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/include/llvm/IR/Module.h b/include/llvm/IR/Module.h index 698e8747495..ac60c8e885e 100644 --- a/include/llvm/IR/Module.h +++ b/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/lib/Bitcode/Reader/BitcodeReader.h b/lib/Bitcode/Reader/BitcodeReader.h index 0a69148d84d..27e8b2e2111 100644 --- a/lib/Bitcode/Reader/BitcodeReader.h +++ b/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/lib/IR/Module.cpp b/lib/IR/Module.cpp index 3a88db9754a..3e8f91fee74 100644 --- a/lib/IR/Module.cpp +++ b/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/lib/Object/IRObjectFile.cpp b/lib/Object/IRObjectFile.cpp index 6369d8befd1..58c4ca312e8 100644 --- a/lib/Object/IRObjectFile.cpp +++ b/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/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp index f7379ea314a..8decc8ea6d5 100644 --- a/tools/gold/gold-plugin.cpp +++ b/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;