aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-12-13 13:58:38 -0800
committerAlon Zakai <alonzakai@gmail.com>2013-12-13 13:58:38 -0800
commitc26dff697a002a67a4a546719671cc14e76e52a0 (patch)
tree53e6740a12a35cb9d0a725e4c9920ec844438c05
parent817a707d8cffa3adef82d3c61b8240b773a81e87 (diff)
horrible wip - clean up illegal funcs that were legalized
-rw-r--r--lib/Transforms/NaCl/ExpandI64.cpp23
1 files changed, 22 insertions, 1 deletions
diff --git a/lib/Transforms/NaCl/ExpandI64.cpp b/lib/Transforms/NaCl/ExpandI64.cpp
index 5909f686ca..bb84c6d9a9 100644
--- a/lib/Transforms/NaCl/ExpandI64.cpp
+++ b/lib/Transforms/NaCl/ExpandI64.cpp
@@ -78,6 +78,9 @@ namespace {
// If the function has an illegal return or argument, create a legal version
void ensureLegalFunc(Function *F);
+ // If a function is illegal, remove it
+ void removeIllegalFunc(Function *F);
+
// splits a 64-bit instruction into 32-bit chunks. We do
// not yet have the values yet, as they depend on other
// splits, so store the parts in Splits, for FinalizeInst.
@@ -181,7 +184,18 @@ dumpv("rename %s => %s", CName, NewName);
if (NewArg->hasName()) LH.High->setName(NewArg->getName() + "_high");
}
}
- // TODO: F->eraseFromParent();
+ break;
+ }
+ }
+}
+
+void ExpandI64::removeIllegalFunc(Function *F) {
+ FunctionType *FT = F->getFunctionType();
+ int Num = FT->getNumParams();
+ for (int i = -1; i < Num; i++) {
+ Type *T = i == -1 ? FT->getReturnType() : FT->getParamType(i);
+ if (isIllegal(T)) {
+ F->eraseFromParent();
break;
}
}
@@ -754,6 +768,13 @@ bool ExpandI64::runOnModule(Module &M) {
}
}
}
+
+ // post pass - clean up illegal functions that were legalized
+ for (Module::iterator Iter = M.begin(), E = M.end(); Iter != E; ) {
+ Function *Func = Iter++;
+ removeIllegalFunc(Func);
+ }
+
return Changed;
}