implement the ModuleProvider::dematerializeFunction hook

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37080 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2007-05-15 06:29:44 +00:00
parent 76c94b6169
commit d67c632d96
2 changed files with 21 additions and 9 deletions

View File

@ -1114,7 +1114,6 @@ bool BitcodeReader::materializeFunction(Function *F, std::string *ErrInfo) {
// restore the real linkage type for the function.
Stream.JumpToBit(DFII->second.first);
F->setLinkage((GlobalValue::LinkageTypes)DFII->second.second);
DeferredFunctionInfo.erase(DFII);
if (ParseFunctionBody(F)) {
if (ErrInfo) *ErrInfo = ErrorString;
@ -1124,14 +1123,26 @@ bool BitcodeReader::materializeFunction(Function *F, std::string *ErrInfo) {
return false;
}
void BitcodeReader::dematerializeFunction(Function *F) {
// If this function isn't materialized, or if it is a proto, this is a noop.
if (F->hasNotBeenReadFromBytecode() || F->isDeclaration())
return;
assert(DeferredFunctionInfo.count(F) && "No info to read function later?");
// Just forget the function body, we can remat it later.
F->deleteBody();
F->setLinkage(GlobalValue::GhostLinkage);
}
Module *BitcodeReader::materializeModule(std::string *ErrInfo) {
DenseMap<Function*, std::pair<uint64_t, unsigned> >::iterator I =
DeferredFunctionInfo.begin();
while (!DeferredFunctionInfo.empty()) {
Function *F = (*I++).first;
assert(F->hasNotBeenReadFromBytecode() &&
"Deserialized function found in map!");
if (materializeFunction(F, ErrInfo))
for (DenseMap<Function*, std::pair<uint64_t, unsigned> >::iterator I =
DeferredFunctionInfo.begin(), E = DeferredFunctionInfo.end(); I != E;
++I) {
Function *F = I->first;
if (F->hasNotBeenReadFromBytecode() &&
materializeFunction(F, ErrInfo))
return 0;
}
return TheModule;

View File

@ -123,7 +123,8 @@ public:
virtual bool materializeFunction(Function *F, std::string *ErrInfo = 0);
virtual Module *materializeModule(std::string *ErrInfo = 0);
virtual void dematerializeFunction(Function *F);
bool Error(const char *Str) {
ErrorString = Str;
return true;