void emitFunction(const Function &F);
private :
- void emitBasicBlock(const BasicBlock *BB);
+ void emitBasicBlock(const MachineBasicBlock &MBB);
void emitMachineInst(const MachineInstr *MI);
unsigned int printOperands(const MachineInstr *MI, unsigned int opNum);
}
void
-SparcFunctionAsmPrinter::emitBasicBlock(const BasicBlock *BB)
+SparcFunctionAsmPrinter::emitBasicBlock(const MachineBasicBlock &MBB)
{
// Emit a label for the basic block
- toAsm << getID(BB) << ":\n";
-
- // Get the vector of machine instructions corresponding to this bb.
- const MachineBasicBlock &MIs = MachineBasicBlock::get(BB);
+ toAsm << getID(MBB.getBasicBlock()) << ":\n";
// Loop over all of the instructions in the basic block...
- for (MachineBasicBlock::const_iterator MII = MIs.begin(), MIE = MIs.end();
+ for (MachineBasicBlock::const_iterator MII = MBB.begin(), MIE = MBB.end();
MII != MIE; ++MII)
emitMachineInst(*MII);
toAsm << "\n"; // Seperate BB's with newlines
toAsm << methName << ":\n";
// Output code for all of the basic blocks in the function...
- for (Function::const_iterator I = F.begin(), E = F.end(); I != E; ++I)
- emitBasicBlock(I);
+ MachineFunction &MF = MachineFunction::get(&F);
+ for (MachineFunction::const_iterator I = MF.begin(), E = MF.end(); I != E; ++I)
+ emitBasicBlock(*I);
// Output a .size directive so the debugger knows the extents of the function
toAsm << ".EndOf_" << methName << ":\n\t.size "
mvec.push_back(M);
}
- MachineBasicBlock& bbMvec = MachineBasicBlock::get(&F.getEntryNode());
+ MachineBasicBlock& bbMvec = mcInfo.front();
bbMvec.insert(bbMvec.begin(), mvec.begin(), mvec.end());
}
void InsertPrologEpilogCode::InsertEpilogCode(Function &F)
{
- for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I) {
- Instruction *TermInst = (Instruction*)I->getTerminator();
+ MachineFunction &MF = MachineFunction::get(&F);
+ for (MachineFunction::iterator I = MF.begin(), E = MF.end(); I != E; ++I) {
+ MachineBasicBlock &MBB = *I;
+ BasicBlock &BB = *I->getBasicBlock();
+ Instruction *TermInst = (Instruction*)BB.getTerminator();
if (TermInst->getOpcode() == Instruction::Ret)
{
MachineInstr *Restore = new MachineInstr(RESTORE);
(int64_t)0);
Restore->SetMachineOperandReg(2, Target.getRegInfo().getZeroRegNum());
- MachineBasicBlock& bbMvec = MachineBasicBlock::get(I);
MachineCodeForInstruction &termMvec =
MachineCodeForInstruction::get(TermInst);
unsigned numNOPs = 0;
while (termMvec.back()->getOpCode() == NOP)
{
- assert( termMvec.back() == bbMvec.back());
- delete bbMvec.pop_back();
+ assert( termMvec.back() == MBB.back());
+ delete MBB.pop_back();
termMvec.pop_back();
++numNOPs;
}
- assert(termMvec.back() == bbMvec.back());
+ assert(termMvec.back() == MBB.back());
// Check that we found the right number of NOPs and have the right
// number of instructions to replace them.
assert(ndelays == 1 && "Cannot use epilog code for delay slots?");
// Append the epilog code to the end of the basic block.
- bbMvec.push_back(Restore);
+ MBB.push_back(Restore);
}
}
}