forked from OSchip/llvm-project
Use error_code in GVMaterializer.
They just propagate out the bitcode reader error, so we don't need a new enum. llvm-svn: 194091
This commit is contained in:
parent
bbf5c1c965
commit
2b11ad4fe9
|
@ -18,7 +18,7 @@
|
|||
#ifndef LLVM_GVMATERIALIZER_H
|
||||
#define LLVM_GVMATERIALIZER_H
|
||||
|
||||
#include <string>
|
||||
#include "llvm/Support/system_error.h"
|
||||
|
||||
namespace llvm {
|
||||
|
||||
|
@ -41,11 +41,9 @@ public:
|
|||
/// dematerialized back to whatever backing store this GVMaterializer uses.
|
||||
virtual bool isDematerializable(const GlobalValue *GV) const = 0;
|
||||
|
||||
/// Materialize - make sure the given 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.
|
||||
/// Materialize - make sure the given GlobalValue is fully read.
|
||||
///
|
||||
virtual bool Materialize(GlobalValue *GV, std::string *ErrInfo = 0) = 0;
|
||||
virtual error_code Materialize(GlobalValue *GV) = 0;
|
||||
|
||||
/// Dematerialize - If the given GlobalValue is read in, and if the
|
||||
/// GVMaterializer supports it, release the memory for the GV, and set it up
|
||||
|
@ -55,10 +53,8 @@ public:
|
|||
virtual void Dematerialize(GlobalValue *) {}
|
||||
|
||||
/// MaterializeModule - make sure the entire Module has been completely read.
|
||||
/// On error, this returns true and fills in the optional string with
|
||||
/// information about the problem. If successful, this returns false.
|
||||
///
|
||||
virtual bool MaterializeModule(Module *M, std::string *ErrInfo = 0) = 0;
|
||||
virtual error_code MaterializeModule(Module *M) = 0;
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
|
|
@ -3076,26 +3076,25 @@ bool BitcodeReader::isMaterializable(const GlobalValue *GV) const {
|
|||
return false;
|
||||
}
|
||||
|
||||
bool BitcodeReader::Materialize(GlobalValue *GV, std::string *ErrInfo) {
|
||||
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()) return false;
|
||||
if (!F || !F->isMaterializable())
|
||||
return error_code::success();
|
||||
|
||||
DenseMap<Function*, uint64_t>::iterator DFII = DeferredFunctionInfo.find(F);
|
||||
assert(DFII != DeferredFunctionInfo.end() && "Deferred function not found!");
|
||||
// If its position is recorded as 0, its body is somewhere in the stream
|
||||
// but we haven't seen it yet.
|
||||
if (DFII->second == 0)
|
||||
if (LazyStreamer && FindFunctionInStream(F, DFII)) return true;
|
||||
if (DFII->second == 0 && LazyStreamer)
|
||||
if (error_code EC = FindFunctionInStream(F, DFII))
|
||||
return EC;
|
||||
|
||||
// Move the bit stream to the saved position of the deferred function body.
|
||||
Stream.JumpToBit(DFII->second);
|
||||
|
||||
if (error_code EC = ParseFunctionBody(F)) {
|
||||
if (ErrInfo)
|
||||
*ErrInfo = EC.message();
|
||||
return true;
|
||||
}
|
||||
if (error_code EC = ParseFunctionBody(F))
|
||||
return EC;
|
||||
|
||||
// Upgrade any old intrinsic calls in the function.
|
||||
for (UpgradedIntrinsicMap::iterator I = UpgradedIntrinsics.begin(),
|
||||
|
@ -3109,7 +3108,7 @@ bool BitcodeReader::Materialize(GlobalValue *GV, std::string *ErrInfo) {
|
|||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
return error_code::success();
|
||||
}
|
||||
|
||||
bool BitcodeReader::isDematerializable(const GlobalValue *GV) const {
|
||||
|
@ -3132,17 +3131,18 @@ void BitcodeReader::Dematerialize(GlobalValue *GV) {
|
|||
}
|
||||
|
||||
|
||||
bool BitcodeReader::MaterializeModule(Module *M, std::string *ErrInfo) {
|
||||
error_code BitcodeReader::MaterializeModule(Module *M) {
|
||||
assert(M == TheModule &&
|
||||
"Can only Materialize the Module this BitcodeReader is attached to.");
|
||||
// Iterate over the module, deserializing any functions that are still on
|
||||
// disk.
|
||||
for (Module::iterator F = TheModule->begin(), E = TheModule->end();
|
||||
F != E; ++F)
|
||||
if (F->isMaterializable() &&
|
||||
Materialize(F, ErrInfo))
|
||||
return true;
|
||||
|
||||
F != E; ++F) {
|
||||
if (F->isMaterializable()) {
|
||||
if (error_code EC = Materialize(F))
|
||||
return EC;
|
||||
}
|
||||
}
|
||||
// At this point, if there are any function bodies, the current bit is
|
||||
// pointing to the END_BLOCK record after them. Now make sure the rest
|
||||
// of the bits in the module have been read.
|
||||
|
@ -3171,7 +3171,7 @@ bool BitcodeReader::MaterializeModule(Module *M, std::string *ErrInfo) {
|
|||
for (unsigned I = 0, E = InstsWithTBAATag.size(); I < E; I++)
|
||||
UpgradeInstWithTBAATag(InstsWithTBAATag[I]);
|
||||
|
||||
return false;
|
||||
return error_code::success();
|
||||
}
|
||||
|
||||
error_code BitcodeReader::InitStream() {
|
||||
|
|
|
@ -249,8 +249,8 @@ public:
|
|||
|
||||
virtual bool isMaterializable(const GlobalValue *GV) const;
|
||||
virtual bool isDematerializable(const GlobalValue *GV) const;
|
||||
virtual bool Materialize(GlobalValue *GV, std::string *ErrInfo = 0);
|
||||
virtual bool MaterializeModule(Module *M, std::string *ErrInfo = 0);
|
||||
virtual error_code Materialize(GlobalValue *GV);
|
||||
virtual error_code MaterializeModule(Module *M);
|
||||
virtual void Dematerialize(GlobalValue *GV);
|
||||
|
||||
/// @brief Main interface to parsing a bitcode buffer.
|
||||
|
|
|
@ -401,9 +401,15 @@ bool Module::isDematerializable(const GlobalValue *GV) const {
|
|||
}
|
||||
|
||||
bool Module::Materialize(GlobalValue *GV, std::string *ErrInfo) {
|
||||
if (Materializer)
|
||||
return Materializer->Materialize(GV, ErrInfo);
|
||||
return false;
|
||||
if (!Materializer)
|
||||
return false;
|
||||
|
||||
error_code EC = Materializer->Materialize(GV);
|
||||
if (!EC)
|
||||
return false;
|
||||
if (ErrInfo)
|
||||
*ErrInfo = EC.message();
|
||||
return true;
|
||||
}
|
||||
|
||||
void Module::Dematerialize(GlobalValue *GV) {
|
||||
|
@ -414,7 +420,12 @@ void Module::Dematerialize(GlobalValue *GV) {
|
|||
bool Module::MaterializeAll(std::string *ErrInfo) {
|
||||
if (!Materializer)
|
||||
return false;
|
||||
return Materializer->MaterializeModule(this, ErrInfo);
|
||||
error_code EC = Materializer->MaterializeModule(this);
|
||||
if (!EC)
|
||||
return false;
|
||||
if (ErrInfo)
|
||||
*ErrInfo = EC.message();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Module::MaterializeAllPermanently(std::string *ErrInfo) {
|
||||
|
|
Loading…
Reference in New Issue