From 1d21f3eb1d86a3e6dc0761f40ebaa81c819d2656 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 9 Apr 2002 05:21:26 +0000 Subject: [PATCH] * Add a useful file comment * Move InsertPrologEpilogCode class to PrologEpilogCodeInserter.cpp -> Among other things, this eliminates the need for the minstrVec static global array. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2195 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/SparcV9/SparcV9TargetMachine.cpp | 98 ++------------------- 1 file changed, 7 insertions(+), 91 deletions(-) diff --git a/lib/Target/SparcV9/SparcV9TargetMachine.cpp b/lib/Target/SparcV9/SparcV9TargetMachine.cpp index cb6d100d398..0fe8f1efcec 100644 --- a/lib/Target/SparcV9/SparcV9TargetMachine.cpp +++ b/lib/Target/SparcV9/SparcV9TargetMachine.cpp @@ -1,14 +1,9 @@ -// $Id$ -//*************************************************************************** -// File: -// Sparc.cpp -// -// Purpose: -// -// History: -// 7/15/01 - Vikram Adve - Created -//**************************************************************************/ - +//===-- Sparc.cpp - General implementation file for the Sparc Target ------===// +// +// This file contains the code for the Sparc Target that does not fit in any of +// the other files in this directory. +// +//===----------------------------------------------------------------------===// #include "SparcInternals.h" #include "llvm/Target/Sparc.h" @@ -17,7 +12,6 @@ #include "llvm/CodeGen/MachineCodeForInstruction.h" #include "llvm/CodeGen/MachineCodeForMethod.h" #include "llvm/CodeGen/RegisterAllocation.h" -#include "llvm/CodeGen/MachineInstr.h" #include "llvm/Function.h" #include "llvm/BasicBlock.h" #include "llvm/PassManager.h" @@ -37,88 +31,10 @@ const MachineInstrDescriptor SparcMachineInstrDesc[] = { // allocateSparcTargetMachine - Allocate and return a subclass of TargetMachine // that implements the Sparc backend. (the llvm/CodeGen/Sparc.h interface) //---------------------------------------------------------------------------- -// TargetMachine *allocateSparcTargetMachine() { return new UltraSparc(); } -//--------------------------------------------------------------------------- -// class InsertPrologEpilogCode -// -// Insert SAVE/RESTORE instructions for the function -// -// Insert prolog code at the unique function entry point. -// Insert epilog code at each function exit point. -// InsertPrologEpilog invokes these only if the function is not compiled -// with the leaf function optimization. -// -//--------------------------------------------------------------------------- -static MachineInstr* minstrVec[MAX_INSTR_PER_VMINSTR]; - -class InsertPrologEpilogCode : public MethodPass { - TargetMachine &Target; -public: - inline InsertPrologEpilogCode(TargetMachine &T) : Target(T) {} - bool runOnMethod(Function *F) { - MachineCodeForMethod &mcodeInfo = MachineCodeForMethod::get(F); - if (!mcodeInfo.isCompiledAsLeafMethod()) { - InsertPrologCode(F); - InsertEpilogCode(F); - } - return false; - } - - void InsertPrologCode(Function *F); - void InsertEpilogCode(Function *F); -}; - -void InsertPrologEpilogCode::InsertPrologCode(Function *F) -{ - BasicBlock *entryBB = F->getEntryNode(); - unsigned N = GetInstructionsForProlog(entryBB, Target, minstrVec); - assert(N <= MAX_INSTR_PER_VMINSTR); - MachineCodeForBasicBlock& bbMvec = entryBB->getMachineInstrVec(); - bbMvec.insert(bbMvec.begin(), minstrVec, minstrVec+N); -} - - -void InsertPrologEpilogCode::InsertEpilogCode(Function *F) -{ - for (Function::iterator I = F->begin(), E = F->end(); I != E; ++I) { - Instruction *TermInst = (Instruction*)(*I)->getTerminator(); - if (TermInst->getOpcode() == Instruction::Ret) - { - BasicBlock* exitBB = *I; - unsigned N = GetInstructionsForEpilog(exitBB, Target, minstrVec); - - MachineCodeForBasicBlock& bbMvec = exitBB->getMachineInstrVec(); - MachineCodeForInstruction &termMvec = - MachineCodeForInstruction::get(TermInst); - - // Remove the NOPs in the delay slots of the return instruction - const MachineInstrInfo &mii = Target.getInstrInfo(); - unsigned numNOPs = 0; - while (termMvec.back()->getOpCode() == NOP) - { - assert( termMvec.back() == bbMvec.back()); - termMvec.pop_back(); - bbMvec.pop_back(); - ++numNOPs; - } - assert(termMvec.back() == bbMvec.back()); - - // Check that we found the right number of NOPs and have the right - // number of instructions to replace them. - unsigned ndelays = mii.getNumDelaySlots(termMvec.back()->getOpCode()); - assert(numNOPs == ndelays && "Missing NOPs in delay slots?"); - assert(N == ndelays && "Cannot use epilog code for delay slots?"); - - // Append the epilog code to the end of the basic block. - bbMvec.insert(bbMvec.end(), minstrVec, minstrVec+N); - } - } -} - //--------------------------------------------------------------------------- // class UltraSparcFrameInfo @@ -272,7 +188,7 @@ void UltraSparc::addPassesToEmitAssembly(PassManager &PM, std::ostream &Out) { //PM.add(new RemoveChainedBranches()); // should be folded with previous //PM.add(new RemoveRedundantOps()); // operations with %g0, NOP, etc. - PM.add(new InsertPrologEpilogCode(*this)); + PM.add(createPrologEpilogCodeInserter(*this)); // Output assembly language to the .s file. Assembly emission is split into // two parts: Function output and Global value output. This is because