mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
If there's more than one function operand to a call instruction, be conservative
and don't assume that the call doesn't throw. It would be nice if there were a way to determine which is the callee and which is a parameter. In practice, the architecture we care about normally only have one operand for a call instruction (x86 and arm). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@87023 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3f2bf85d14
commit
ac18929801
@ -494,15 +494,26 @@ ComputeCallSiteTable(SmallVectorImpl<CallSiteEntry> &CallSites,
|
||||
// Don't mark a call as potentially throwing if the function it's
|
||||
// calling is marked "nounwind".
|
||||
bool DoesNotThrow = false;
|
||||
bool SawFunc = false;
|
||||
for (unsigned OI = 0, OE = MI->getNumOperands(); OI != OE; ++OI) {
|
||||
const MachineOperand &MO = MI->getOperand(OI);
|
||||
|
||||
if (MO.isGlobal()) {
|
||||
if (Function *F = dyn_cast<Function>(MO.getGlobal())) {
|
||||
if (F->doesNotThrow()) {
|
||||
DoesNotThrow = true;
|
||||
if (SawFunc) {
|
||||
// Be conservative. If we have more than one function operand
|
||||
// for this call, then we can't make the assumption that it's
|
||||
// the callee and not a parameter to the call.
|
||||
//
|
||||
// FIXME: Determine if there's a way to say that `F' is the
|
||||
// callee or parameter.
|
||||
DoesNotThrow = false;
|
||||
break;
|
||||
}
|
||||
if (F->doesNotThrow()) {
|
||||
SawFunc = true;
|
||||
DoesNotThrow = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user