Restore support for indirect function calls (which briefly wasn't working

after I removed annotations on MachineInstr for the CallDescriptor).


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4469 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Vikram S. Adve 2002-10-31 15:34:48 +00:00
parent 38bb2ff828
commit 26fbcec43b

View File

@ -45,18 +45,24 @@ CallArgsDescriptor::getReturnValue() const
// Mechanism to get the descriptor for a CALL MachineInstr.
// We get the LLVM CallInstr from the ret. addr. register argument
// of the CALL MachineInstr, then get the CallArgsDescriptor from the
// MachineCodeForInstruction object for the CallInstr.
// of the CALL MachineInstr (which is explicit operand #3 for indirect
// calls or the last implicit operand for direct calls). We then get
// the CallArgsDescriptor from the MachineCodeForInstruction object for
// the CallInstr.
// This is roundabout but avoids adding a new map or annotation just
// to keep track of CallArgsDescriptors.
//
CallArgsDescriptor *CallArgsDescriptor::get(const MachineInstr* MI)
{
const TmpInstruction* retAddrReg =
cast<TmpInstruction>(MI->getImplicitRef(MI->getNumImplicitRefs()-1));
cast<TmpInstruction>(isa<Function>(MI->getOperand(0).getVRegValue())
? MI->getImplicitRef(MI->getNumImplicitRefs()-1)
: MI->getOperand(2).getVRegValue());
assert(retAddrReg->getNumOperands() == 1 &&
isa<CallInst>(retAddrReg->getOperand(0)) &&
"Order of implicit args of CALL instr. changed. FIX THIS CODE!");
"Location of callInstr arg for CALL instr. changed? FIX THIS CODE!");
const CallInst* callInstr = cast<CallInst>(retAddrReg->getOperand(0));
CallArgsDescriptor* desc =