mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-24 08:33:39 +00:00
Loosen up the requirements in the Horrible Hack(tm) to include all selectors
which don't have a catch-all associated with them not just clean-ups. This fixes the SingleSource/Benchmarks/Shootout-C++/except.cpp testcase that broke because of my change r105902. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106772 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
761fa7af9e
commit
efbf306107
@ -89,7 +89,7 @@ namespace {
|
||||
/// initializer instead.
|
||||
bool CleanupSelectors();
|
||||
|
||||
bool IsACleanupSelector(IntrinsicInst *);
|
||||
bool HasCatchAllInSelector(IntrinsicInst *);
|
||||
|
||||
/// FindAllCleanupSelectors - Find all eh.selector calls that are clean-ups.
|
||||
void FindAllCleanupSelectors(SmallPtrSet<IntrinsicInst*, 32> &Sels);
|
||||
@ -188,34 +188,14 @@ FunctionPass *llvm::createDwarfEHPass(const TargetMachine *tm, bool fast) {
|
||||
return new DwarfEHPrepare(tm, fast);
|
||||
}
|
||||
|
||||
/// IsACleanupSelector - Return true if the intrinsic instruction is a clean-up
|
||||
/// selector instruction.
|
||||
bool DwarfEHPrepare::IsACleanupSelector(IntrinsicInst *II) {
|
||||
unsigned NumOps = II->getNumOperands();
|
||||
bool IsCleanUp = (NumOps == 3);
|
||||
/// HasCatchAllInSelector - Return true if the intrinsic instruction has a
|
||||
/// catch-all.
|
||||
bool DwarfEHPrepare::HasCatchAllInSelector(IntrinsicInst *II) {
|
||||
if (!EHCatchAllValue) return false;
|
||||
|
||||
if (IsCleanUp)
|
||||
return true;
|
||||
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(II->getOperand(3))) {
|
||||
unsigned Val = CI->getZExtValue();
|
||||
|
||||
if (Val == 0 || Val + 3 == NumOps) {
|
||||
// If the value is 0 or the selector has only filters in it, then it's
|
||||
// a cleanup.
|
||||
return true;
|
||||
} else {
|
||||
assert(Val + 3 < NumOps && "Ill-formed eh.selector!");
|
||||
|
||||
if (Val + 4 == NumOps) {
|
||||
if (ConstantInt *FinalVal =
|
||||
dyn_cast<ConstantInt>(II->getOperand(NumOps - 1)))
|
||||
return FinalVal->isZero();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
unsigned OpIdx = II->getNumOperands() - 1;
|
||||
GlobalVariable *GV = dyn_cast<GlobalVariable>(II->getOperand(OpIdx));
|
||||
return GV == EHCatchAllValue;
|
||||
}
|
||||
|
||||
/// FindAllCleanupSelectors - Find all eh.selector calls that are clean-ups.
|
||||
@ -229,7 +209,7 @@ FindAllCleanupSelectors(SmallPtrSet<IntrinsicInst*, 32> &Sels) {
|
||||
if (II->getParent()->getParent() != F)
|
||||
continue;
|
||||
|
||||
if (IsACleanupSelector(II))
|
||||
if (!HasCatchAllInSelector(II))
|
||||
Sels.insert(II);
|
||||
}
|
||||
}
|
||||
@ -387,7 +367,7 @@ bool DwarfEHPrepare::HandleURoRInvokes() {
|
||||
// need to convert it to a 'catch-all'.
|
||||
for (SmallPtrSet<IntrinsicInst*, 8>::iterator
|
||||
SI = SelCalls.begin(), SE = SelCalls.end(); SI != SE; ++SI)
|
||||
if (IsACleanupSelector(*SI))
|
||||
if (!HasCatchAllInSelector(*SI))
|
||||
SelsToConvert.insert(*SI);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user