Modernize the error handling of the Materialize function.
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 24 Oct 2014 22:50:48 +0000 (22:50 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 24 Oct 2014 22:50:48 +0000 (22:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220600 91177308-0d34-0410-b5e6-96231b3b80d8

12 files changed:
include/llvm/IR/GVMaterializer.h
include/llvm/IR/GlobalValue.h
include/llvm/IR/Module.h
lib/Bitcode/Reader/BitcodeReader.cpp
lib/Bitcode/Reader/BitcodeReader.h
lib/IR/Globals.cpp
lib/IR/LegacyPassManager.cpp
lib/IR/Module.cpp
lib/Linker/LinkModules.cpp
tools/gold/gold-plugin.cpp
tools/llvm-extract/llvm-extract.cpp
unittests/Bitcode/BitReaderTest.cpp

index 7cc48eb05d061b3d220b02d1623629ec6b1198ce..a7d68eccba57fb94f6b1ab91bd7ac03bafedc02b 100644 (file)
@@ -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
index aaf86c33867cfb0cae90c7885067b81afaa20e93..e7b5d58d16f83126ad231550aa0ebb6be9dbfa93 100644 (file)
@@ -21,6 +21,8 @@
 #include "llvm/IR/Constant.h"
 #include "llvm/IR/DerivedTypes.h"
 
+#include <system_error>
+
 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
index 6c744dd27593d84833e32f73e0aa5eab5cbb7e59..70f474951539deef12e818281800d11372f20b01 100644 (file)
@@ -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.
index 507164c8468b13fe6feef5c80dbb30a711bbaea8..45a08b38390073ebbd5adc7703600045b30db447 100644 (file)
@@ -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<Function>(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;
     }
   }
index 9f0f668612193fe75269149cbfab92b7b4fe5dfd..047fef8fbae558f5ff25827881a0401e1d19a1ff 100644 (file)
@@ -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;
 
index 64bc61c500801103649be7b66f453036597e34a7..cecd999657e3c3dfb7406a0748f4bd05a57cd376 100644 (file)
@@ -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);
index 5ba08575134a4ba418357c5ffa35bdc830e49d88..1081f2a1b8c27c6555a57995504aa85e4ee91cab 100644 (file)
@@ -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);
 }
index f43080b72eed315b6b8cc77b16cfba07d4757b7c..e35eefbd45c5fce1173a6f0e2c340613a16e62a8 100644 (file)
@@ -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) {
index 510813ad972a3115e6055a4e72691cfb7ca25d64..c0601430feabda53b5339ca8a6441769b3a428f5 100644 (file)
@@ -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).
index 8ebae0e498c496d0990b6857fce37586e51593bd..2d50f49ffd786456b7e57740dd4ac998c248adcf 100644 (file)
@@ -482,8 +482,11 @@ static GlobalObject *makeInternalReplacement(GlobalObject *GO) {
   Module *M = GO->getParent();
   GlobalObject *Ret;
   if (auto *F = dyn_cast<Function>(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);
index 116b678e07e1252731c75d4ff73c411135d38754..fe97a03c0346f9b2573e759f61e6c587031e75c5 100644 (file)
@@ -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<GlobalValue *, 8> 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;
         }
       }
index 04c795038fcaeae9d9670a2ae32692314872eff9..6eb40d65208e98381d91ab79e5ea090a923d3396 100644 (file)
@@ -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()));