diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm/IR/Module.h | 2 | ||||
-rw-r--r-- | llvm/include/llvm/IR/Value.h | 77 | ||||
-rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 5 | ||||
-rw-r--r-- | llvm/lib/IR/Module.cpp | 6 | ||||
-rw-r--r-- | llvm/lib/IR/Value.cpp | 10 | ||||
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 4 | ||||
-rw-r--r-- | llvm/tools/llvm-extract/llvm-extract.cpp | 15 |
7 files changed, 23 insertions, 96 deletions
diff --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h index 942f68543cb..bf1447e48af 100644 --- a/llvm/include/llvm/IR/Module.h +++ b/llvm/include/llvm/IR/Module.h @@ -439,7 +439,6 @@ public: void setMaterializer(GVMaterializer *GVM); /// Retrieves the GVMaterializer, if any, for this Module. GVMaterializer *getMaterializer() const { return Materializer.get(); } - bool isMaterialized() const { return !getMaterializer(); } /// Make sure the GlobalValue is fully read. If the module is corrupt, this /// returns true and fills in the optional string with information about the @@ -447,6 +446,7 @@ public: std::error_code materialize(GlobalValue *GV); /// Make sure all GlobalValues in this Module are fully read and clear the + /// Materializer. If the module is corrupt, this DOES NOT clear the old /// Materializer. std::error_code materializeAll(); diff --git a/llvm/include/llvm/IR/Value.h b/llvm/include/llvm/IR/Value.h index bb7ff278fde..be9f14a78de 100644 --- a/llvm/include/llvm/IR/Value.h +++ b/llvm/include/llvm/IR/Value.h @@ -273,91 +273,38 @@ public: //---------------------------------------------------------------------- // Methods for handling the chain of uses of this Value. // - // Materializing a function can introduce new uses, so these methods come in - // two variants: - // The methods that start with materialized_ check the uses that are - // currently known given which functions are materialized. Be very careful - // when using them since you might not get all uses. - // The methods that don't start with materialized_ assert that modules is - // fully materialized. -#ifdef NDEBUG - void assertModuleIsMaterialized() const {} -#else - void assertModuleIsMaterialized() const; -#endif - - bool use_empty() const { - assertModuleIsMaterialized(); - return UseList == nullptr; - } + bool use_empty() const { return UseList == nullptr; } typedef use_iterator_impl<Use> use_iterator; typedef use_iterator_impl<const Use> const_use_iterator; - use_iterator materialized_use_begin() { return use_iterator(UseList); } - const_use_iterator materialized_use_begin() const { - return const_use_iterator(UseList); - } - use_iterator use_begin() { - assertModuleIsMaterialized(); - return materialized_use_begin(); - } - const_use_iterator use_begin() const { - assertModuleIsMaterialized(); - return materialized_use_begin(); - } + use_iterator use_begin() { return use_iterator(UseList); } + const_use_iterator use_begin() const { return const_use_iterator(UseList); } use_iterator use_end() { return use_iterator(); } const_use_iterator use_end() const { return const_use_iterator(); } - iterator_range<use_iterator> materialized_uses() { - return make_range(materialized_use_begin(), use_end()); - } - iterator_range<const_use_iterator> materialized_uses() const { - return make_range(materialized_use_begin(), use_end()); - } iterator_range<use_iterator> uses() { - assertModuleIsMaterialized(); - return materialized_uses(); + return make_range(use_begin(), use_end()); } iterator_range<const_use_iterator> uses() const { - assertModuleIsMaterialized(); - return materialized_uses(); + return make_range(use_begin(), use_end()); } - bool user_empty() const { - assertModuleIsMaterialized(); - return UseList == nullptr; - } + bool user_empty() const { return UseList == nullptr; } typedef user_iterator_impl<User> user_iterator; typedef user_iterator_impl<const User> const_user_iterator; - user_iterator materialized_user_begin() { return user_iterator(UseList); } - const_user_iterator materialized_user_begin() const { - return const_user_iterator(UseList); - } - user_iterator user_begin() { - assertModuleIsMaterialized(); - return materialized_user_begin(); - } + user_iterator user_begin() { return user_iterator(UseList); } const_user_iterator user_begin() const { - assertModuleIsMaterialized(); - return materialized_user_begin(); + return const_user_iterator(UseList); } user_iterator user_end() { return user_iterator(); } const_user_iterator user_end() const { return const_user_iterator(); } - User *user_back() { - assertModuleIsMaterialized(); - return *materialized_user_begin(); - } - const User *user_back() const { - assertModuleIsMaterialized(); - return *materialized_user_begin(); - } + User *user_back() { return *user_begin(); } + const User *user_back() const { return *user_begin(); } iterator_range<user_iterator> users() { - assertModuleIsMaterialized(); - return make_range(materialized_user_begin(), user_end()); + return make_range(user_begin(), user_end()); } iterator_range<const_user_iterator> users() const { - assertModuleIsMaterialized(); - return make_range(materialized_user_begin(), user_end()); + return make_range(user_begin(), user_end()); } /// \brief Return true if there is exactly one user of this value. diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 2ad4b32e315..a76bb23e952 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -3022,7 +3022,7 @@ std::error_code BitcodeReader::parseUseLists() { V = ValueList[ID]; unsigned NumUses = 0; SmallDenseMap<const Use *, unsigned, 16> Order; - for (const Use &U : V->materialized_uses()) { + for (const Use &U : V->uses()) { if (++NumUses > Record.size()) break; Order[&U] = Record[NumUses - 1]; @@ -5267,8 +5267,7 @@ std::error_code BitcodeReader::materialize(GlobalValue *GV) { // Upgrade any old intrinsic calls in the function. for (auto &I : UpgradedIntrinsics) { - for (auto UI = I.first->materialized_user_begin(), UE = I.first->user_end(); - UI != UE;) { + for (auto UI = I.first->user_begin(), UE = I.first->user_end(); UI != UE;) { User *U = *UI; ++UI; if (CallInst *CI = dyn_cast<CallInst>(U)) diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp index ac578d6dba0..0685c1a206d 100644 --- a/llvm/lib/IR/Module.cpp +++ b/llvm/lib/IR/Module.cpp @@ -394,8 +394,10 @@ std::error_code Module::materialize(GlobalValue *GV) { std::error_code Module::materializeAll() { if (!Materializer) return std::error_code(); - std::unique_ptr<GVMaterializer> M = std::move(Materializer); - return M->materializeModule(); + if (std::error_code EC = Materializer->materializeModule()) + return EC; + Materializer.reset(); + return std::error_code(); } std::error_code Module::materializeMetadata() { diff --git a/llvm/lib/IR/Value.cpp b/llvm/lib/IR/Value.cpp index eb9deb6a07e..925f2058e55 100644 --- a/llvm/lib/IR/Value.cpp +++ b/llvm/lib/IR/Value.cpp @@ -314,16 +314,6 @@ void Value::takeName(Value *V) { } #ifndef NDEBUG -void Value::assertModuleIsMaterialized() const { - const GlobalValue *GV = dyn_cast<GlobalValue>(this); - if (!GV) - return; - const Module *M = GV->getParent(); - if (!M) - return; - assert(M->isMaterialized()); -} - static bool contains(SmallPtrSetImpl<ConstantExpr *> &Cache, ConstantExpr *Expr, Constant *C) { if (!Cache.insert(Expr).second) diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 9198b0e1fb5..c4519c48ab5 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -1901,9 +1901,7 @@ void Verifier::visitFunction(const Function &F) { // If this function is actually an intrinsic, verify that it is only used in // direct call/invokes, never having its "address taken". - // Only do this if the module is materialized, otherwise we don't have all the - // uses. - if (F.getIntrinsicID() && F.getParent()->isMaterialized()) { + if (F.getIntrinsicID()) { const User *U; if (F.hasAddressTaken(&U)) Assert(0, "Invalid user of intrinsic instruction!", U); diff --git a/llvm/tools/llvm-extract/llvm-extract.cpp b/llvm/tools/llvm-extract/llvm-extract.cpp index 1da456d33f5..de4288dd6ad 100644 --- a/llvm/tools/llvm-extract/llvm-extract.cpp +++ b/llvm/tools/llvm-extract/llvm-extract.cpp @@ -242,22 +242,13 @@ int main(int argc, char **argv) { } } - { - std::vector<GlobalValue *> Gvs(GVs.begin(), GVs.end()); - legacy::PassManager Extract; - Extract.add(createGVExtractionPass(Gvs, DeleteFn)); - Extract.run(*M); - - // Now that we have all the GVs we want, mark the module as fully - // materialized. - // FIXME: should the GVExtractionPass handle this? - M->materializeAll(); - } - // In addition to deleting all other functions, we also want to spiff it // up a little bit. Do this now. legacy::PassManager Passes; + std::vector<GlobalValue*> Gvs(GVs.begin(), GVs.end()); + + Passes.add(createGVExtractionPass(Gvs, DeleteFn)); if (!DeleteFn) Passes.add(createGlobalDCEPass()); // Delete unreachable globals Passes.add(createStripDeadDebugInfoPass()); // Remove dead debug info |