From c498284e46864744036b9e167cb960058618a4fc Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Fri, 24 Oct 2014 22:50:48 +0000 Subject: [PATCH] Modernize the error handling of the Materialize function. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220600 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/GVMaterializer.h | 2 +- include/llvm/IR/GlobalValue.h | 4 +++- include/llvm/IR/Module.h | 2 +- lib/Bitcode/Reader/BitcodeReader.cpp | 6 +++--- lib/Bitcode/Reader/BitcodeReader.h | 2 +- lib/IR/Globals.cpp | 4 ++-- lib/IR/LegacyPassManager.cpp | 5 ++--- lib/IR/Module.cpp | 13 ++++--------- lib/Linker/LinkModules.cpp | 8 ++++++-- tools/gold/gold-plugin.cpp | 7 +++++-- tools/llvm-extract/llvm-extract.cpp | 18 +++++++++--------- unittests/Bitcode/BitReaderTest.cpp | 6 +++--- 12 files changed, 40 insertions(+), 37 deletions(-) diff --git a/include/llvm/IR/GVMaterializer.h b/include/llvm/IR/GVMaterializer.h index 7cc48eb05d0..a7d68eccba5 100644 --- a/include/llvm/IR/GVMaterializer.h +++ b/include/llvm/IR/GVMaterializer.h @@ -38,7 +38,7 @@ public: /// Make sure the given GlobalValue is fully read. /// - virtual std::error_code Materialize(GlobalValue *GV) = 0; + virtual std::error_code materialize(GlobalValue *GV) = 0; /// If the given GlobalValue is read in, and if the GVMaterializer supports /// it, release the memory for the GV, and set it up to be materialized diff --git a/include/llvm/IR/GlobalValue.h b/include/llvm/IR/GlobalValue.h index aaf86c33867..e7b5d58d16f 100644 --- a/include/llvm/IR/GlobalValue.h +++ b/include/llvm/IR/GlobalValue.h @@ -21,6 +21,8 @@ #include "llvm/IR/Constant.h" #include "llvm/IR/DerivedTypes.h" +#include + namespace llvm { class Comdat; @@ -311,7 +313,7 @@ public: /// Make sure this GlobalValue is fully read. If the module is corrupt, this /// returns true and fills in the optional string with information about the /// problem. If successful, this returns false. - bool Materialize(std::string *ErrInfo = nullptr); + std::error_code materialize(); /// If this GlobalValue is read in, and if the GVMaterializer supports it, /// release the memory for the function, and set it up to be materialized diff --git a/include/llvm/IR/Module.h b/include/llvm/IR/Module.h index 6c744dd2759..70f47495153 100644 --- a/include/llvm/IR/Module.h +++ b/include/llvm/IR/Module.h @@ -476,7 +476,7 @@ public: /// 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 /// problem. If successful, this returns false. - bool Materialize(GlobalValue *GV, std::string *ErrInfo = nullptr); + std::error_code materialize(GlobalValue *GV); /// If the GlobalValue is read in, and if the GVMaterializer supports it, /// release the memory for the function, and set it up to be materialized /// lazily. If !isDematerializable(), this method is a noop. diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 507164c8468..45a08b38390 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -56,7 +56,7 @@ std::error_code BitcodeReader::materializeForwardReferencedFunctions() { return Error(BitcodeError::NeverResolvedFunctionFromBlockAddress); // Try to materialize F. - if (std::error_code EC = Materialize(F)) + if (std::error_code EC = materialize(F)) return EC; } assert(BasicBlockFwdRefs.empty() && "Function missing from queue"); @@ -3282,7 +3282,7 @@ std::error_code BitcodeReader::FindFunctionInStream( void BitcodeReader::releaseBuffer() { Buffer.release(); } -std::error_code BitcodeReader::Materialize(GlobalValue *GV) { +std::error_code BitcodeReader::materialize(GlobalValue *GV) { Function *F = dyn_cast(GV); // If it's not a function or is already material, ignore the request. if (!F || !F->isMaterializable()) @@ -3358,7 +3358,7 @@ std::error_code BitcodeReader::MaterializeModule(Module *M) { for (Module::iterator F = TheModule->begin(), E = TheModule->end(); F != E; ++F) { if (F->isMaterializable()) { - if (std::error_code EC = Materialize(F)) + if (std::error_code EC = materialize(F)) return EC; } } diff --git a/lib/Bitcode/Reader/BitcodeReader.h b/lib/Bitcode/Reader/BitcodeReader.h index 9f0f6686121..047fef8fbae 100644 --- a/lib/Bitcode/Reader/BitcodeReader.h +++ b/lib/Bitcode/Reader/BitcodeReader.h @@ -224,7 +224,7 @@ public: void releaseBuffer(); bool isDematerializable(const GlobalValue *GV) const override; - std::error_code Materialize(GlobalValue *GV) override; + std::error_code materialize(GlobalValue *GV) override; std::error_code MaterializeModule(Module *M) override; void Dematerialize(GlobalValue *GV) override; diff --git a/lib/IR/Globals.cpp b/lib/IR/Globals.cpp index 64bc61c5008..cecd999657e 100644 --- a/lib/IR/Globals.cpp +++ b/lib/IR/Globals.cpp @@ -36,8 +36,8 @@ bool GlobalValue::isMaterializable() const { bool GlobalValue::isDematerializable() const { return getParent() && getParent()->isDematerializable(this); } -bool GlobalValue::Materialize(std::string *ErrInfo) { - return getParent()->Materialize(this, ErrInfo); +std::error_code GlobalValue::materialize() { + return getParent()->materialize(this); } void GlobalValue::Dematerialize() { getParent()->Dematerialize(this); diff --git a/lib/IR/LegacyPassManager.cpp b/lib/IR/LegacyPassManager.cpp index 5ba08575134..1081f2a1b8c 100644 --- a/lib/IR/LegacyPassManager.cpp +++ b/lib/IR/LegacyPassManager.cpp @@ -1404,9 +1404,8 @@ void FunctionPassManager::add(Pass *P) { /// bool FunctionPassManager::run(Function &F) { if (F.isMaterializable()) { - std::string errstr; - if (F.Materialize(&errstr)) - report_fatal_error("Error reading bitcode file: " + Twine(errstr)); + if (std::error_code EC = F.materialize()) + report_fatal_error("Error reading bitcode file: " + EC.message()); } return FPM->run(F); } diff --git a/lib/IR/Module.cpp b/lib/IR/Module.cpp index f43080b72ee..e35eefbd45c 100644 --- a/lib/IR/Module.cpp +++ b/lib/IR/Module.cpp @@ -395,16 +395,11 @@ bool Module::isDematerializable(const GlobalValue *GV) const { return false; } -bool Module::Materialize(GlobalValue *GV, std::string *ErrInfo) { +std::error_code Module::materialize(GlobalValue *GV) { if (!Materializer) - return false; - - std::error_code EC = Materializer->Materialize(GV); - if (!EC) - return false; - if (ErrInfo) - *ErrInfo = EC.message(); - return true; + return std::error_code(); + + return Materializer->materialize(GV); } void Module::Dematerialize(GlobalValue *GV) { diff --git a/lib/Linker/LinkModules.cpp b/lib/Linker/LinkModules.cpp index 510813ad972..c0601430fea 100644 --- a/lib/Linker/LinkModules.cpp +++ b/lib/Linker/LinkModules.cpp @@ -1626,8 +1626,10 @@ bool ModuleLinker::run() { // Materialize if needed. if (SF->isMaterializable()) { - if (SF->Materialize(&ErrorMsg)) + if (std::error_code EC = SF->materialize()) { + ErrorMsg = EC.message(); return true; + } } // Skip if no body (function is external). @@ -1677,8 +1679,10 @@ bool ModuleLinker::run() { // Materialize if needed. if (SF->isMaterializable()) { - if (SF->Materialize(&ErrorMsg)) + if (std::error_code EC = SF->materialize()) { + ErrorMsg = EC.message(); return true; + } } // Skip if no body (function is external). diff --git a/tools/gold/gold-plugin.cpp b/tools/gold/gold-plugin.cpp index 8ebae0e498c..2d50f49ffd7 100644 --- a/tools/gold/gold-plugin.cpp +++ b/tools/gold/gold-plugin.cpp @@ -482,8 +482,11 @@ static GlobalObject *makeInternalReplacement(GlobalObject *GO) { Module *M = GO->getParent(); GlobalObject *Ret; if (auto *F = dyn_cast(GO)) { - if (F->isMaterializable()) - F->Materialize(); + if (F->isMaterializable()) { + if (std::error_code EC = F->materialize()) + message(LDPL_FATAL, "LLVM gold plugin has failed to read a function"); + + } auto *NewF = Function::Create(F->getFunctionType(), F->getLinkage(), F->getName(), M); diff --git a/tools/llvm-extract/llvm-extract.cpp b/tools/llvm-extract/llvm-extract.cpp index 116b678e07e..fe97a03c034 100644 --- a/tools/llvm-extract/llvm-extract.cpp +++ b/tools/llvm-extract/llvm-extract.cpp @@ -217,9 +217,9 @@ int main(int argc, char **argv) { for (size_t i = 0, e = GVs.size(); i != e; ++i) { GlobalValue *GV = GVs[i]; if (GV->isMaterializable()) { - std::string ErrInfo; - if (GV->Materialize(&ErrInfo)) { - errs() << argv[0] << ": error reading input: " << ErrInfo << "\n"; + if (std::error_code EC = GV->materialize()) { + errs() << argv[0] << ": error reading input: " << EC.message() + << "\n"; return 1; } } @@ -229,18 +229,18 @@ int main(int argc, char **argv) { SmallPtrSet GVSet(GVs.begin(), GVs.end()); for (auto &G : M->globals()) { if (!GVSet.count(&G) && G.isMaterializable()) { - std::string ErrInfo; - if (G.Materialize(&ErrInfo)) { - errs() << argv[0] << ": error reading input: " << ErrInfo << "\n"; + if (std::error_code EC = G.materialize()) { + errs() << argv[0] << ": error reading input: " << EC.message() + << "\n"; return 1; } } } for (auto &F : *M) { if (!GVSet.count(&F) && F.isMaterializable()) { - std::string ErrInfo; - if (F.Materialize(&ErrInfo)) { - errs() << argv[0] << ": error reading input: " << ErrInfo << "\n"; + if (std::error_code EC = F.materialize()) { + errs() << argv[0] << ": error reading input: " << EC.message() + << "\n"; return 1; } } diff --git a/unittests/Bitcode/BitReaderTest.cpp b/unittests/Bitcode/BitReaderTest.cpp index 04c795038fc..6eb40d65208 100644 --- a/unittests/Bitcode/BitReaderTest.cpp +++ b/unittests/Bitcode/BitReaderTest.cpp @@ -69,7 +69,7 @@ TEST(BitReaderTest, DematerializeFunctionPreservesLinkageType) { EXPECT_FALSE(verifyModule(*M, &dbgs())); - M->getFunction("func")->Materialize(); + M->getFunction("func")->materialize(); EXPECT_FALSE(M->getFunction("func")->empty()); EXPECT_TRUE(M->getFunction("func")->getLinkage() == GlobalValue::InternalLinkage); @@ -121,7 +121,7 @@ TEST(BitReaderTest, MaterializeFunctionsForBlockAddrInFunctionBefore) { EXPECT_FALSE(verifyModule(*M, &dbgs())); // Materialize @before, pulling in @func. - EXPECT_FALSE(M->getFunction("before")->Materialize()); + EXPECT_FALSE(M->getFunction("before")->materialize()); EXPECT_FALSE(M->getFunction("func")->empty()); EXPECT_TRUE(M->getFunction("other")->empty()); EXPECT_FALSE(verifyModule(*M, &dbgs())); @@ -153,7 +153,7 @@ TEST(BitReaderTest, MaterializeFunctionsForBlockAddrInFunctionAfter) { EXPECT_FALSE(verifyModule(*M, &dbgs())); // Materialize @after, pulling in @func. - EXPECT_FALSE(M->getFunction("after")->Materialize()); + EXPECT_FALSE(M->getFunction("after")->materialize()); EXPECT_FALSE(M->getFunction("func")->empty()); EXPECT_TRUE(M->getFunction("other")->empty()); EXPECT_FALSE(verifyModule(*M, &dbgs())); -- 2.34.1