Skip to content

Commit

Permalink
Modernize the error handling of the Materialize function.
Browse files Browse the repository at this point in the history
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@220600 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
espindola committed Oct 24, 2014
1 parent 44ccedc commit c498284
Show file tree
Hide file tree
Showing 12 changed files with 40 additions and 37 deletions.
2 changes: 1 addition & 1 deletion include/llvm/IR/GVMaterializer.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ class GVMaterializer {

/// 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
Expand Down
4 changes: 3 additions & 1 deletion include/llvm/IR/GlobalValue.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
#include "llvm/IR/Constant.h"
#include "llvm/IR/DerivedTypes.h"

#include <system_error>

namespace llvm {

class Comdat;
Expand Down Expand Up @@ -311,7 +313,7 @@ class GlobalValue : public Constant {
/// 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
Expand Down
2 changes: 1 addition & 1 deletion include/llvm/IR/Module.h
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,7 @@ class Module {
/// 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.
Expand Down
6 changes: 3 additions & 3 deletions lib/Bitcode/Reader/BitcodeReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down Expand Up @@ -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())
Expand Down Expand Up @@ -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;
}
}
Expand Down
2 changes: 1 addition & 1 deletion lib/Bitcode/Reader/BitcodeReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ class BitcodeReader : public GVMaterializer {
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;

Expand Down
4 changes: 2 additions & 2 deletions lib/IR/Globals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
5 changes: 2 additions & 3 deletions lib/IR/LegacyPassManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
13 changes: 4 additions & 9 deletions lib/IR/Module.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
8 changes: 6 additions & 2 deletions lib/Linker/LinkModules.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down Expand Up @@ -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).
Expand Down
7 changes: 5 additions & 2 deletions tools/gold/gold-plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
18 changes: 9 additions & 9 deletions tools/llvm-extract/llvm-extract.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
Expand All @@ -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;
}
}
Expand Down
6 changes: 3 additions & 3 deletions unittests/Bitcode/BitReaderTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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()));
Expand Down Expand Up @@ -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()));
Expand Down

0 comments on commit c498284

Please sign in to comment.