From: Rafael Espindola Date: Fri, 13 Mar 2015 21:54:20 +0000 (+0000) Subject: Be lazy about loading metadata in IRObjectFile. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=dc6141a4ff04291f76dced9bd0155470cfbe7a5d;p=oota-llvm.git Be lazy about loading metadata in IRObjectFile. This speeds up llvm-ar building lib64/libclangSema.a with debug IR files from 8.658015807 seconds to just 0.351036519 seconds :-) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232221 91177308-0d34-0410-b5e6-96231b3b80d8 --- 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;