From 16c45e9de896ea37d48d093dbe02fc9a4c1b9f8f Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 20 Dec 2003 10:20:58 +0000 Subject: [PATCH] Add a new target-independent machine code freeing pass git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10560 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/MachineFunction.cpp | 41 ++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/lib/CodeGen/MachineFunction.cpp b/lib/CodeGen/MachineFunction.cpp index 66497d964a8..fa77906332b 100644 --- a/lib/CodeGen/MachineFunction.cpp +++ b/lib/CodeGen/MachineFunction.cpp @@ -13,19 +13,19 @@ // //===----------------------------------------------------------------------===// -#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineCodeForInstruction.h" #include "llvm/CodeGen/SSARegMap.h" #include "llvm/CodeGen/MachineFunctionInfo.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineConstantPool.h" +#include "llvm/CodeGen/Passes.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Target/TargetFrameInfo.h" #include "llvm/Target/TargetCacheInfo.h" #include "llvm/Function.h" #include "llvm/iOther.h" -#include "llvm/Pass.h" using namespace llvm; static AnnotationID MF_AID( @@ -33,15 +33,15 @@ static AnnotationID MF_AID( namespace { - struct Printer : public FunctionPass { + struct Printer : public MachineFunctionPass { const char *getPassName() const { return "MachineFunction Printer"; } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); } - bool runOnFunction(Function &F) { - MachineFunction::get(&F).dump(); + bool runOnMachineFunction(MachineFunction &MF) { + MF.dump(); return false; } }; @@ -51,6 +51,33 @@ FunctionPass *llvm::createMachineFunctionPrinterPass() { return new Printer(); } +namespace { + struct Deleter : public MachineFunctionPass { + const char *getPassName() const { return "Machine Code Deleter"; } + + bool runOnMachineFunction(MachineFunction &MF) { + // Delete all of the MachineInstrs out of the function. When the sparc + // backend gets fixed, this can be dramatically simpler, but actually + // putting this stuff into the MachineBasicBlock destructor! + for (MachineFunction::iterator BB = MF.begin(), E = MF.end(); BB != E; + ++BB) + while (!BB->empty()) + delete BB->pop_back(); + + // Delete the annotation from the function now. + MachineFunction::destruct(MF.getFunction()); + return true; + } + }; +} + +/// MachineCodeDeletion Pass - This pass deletes all of the machine code for +/// the current function, which should happen after the function has been +/// emitted to a .s file or to memory. +FunctionPass *llvm::createMachineCodeDeleter() { + return new Deleter(); +} + //===---------------------------------------------------------------------===// // MachineFunction implementation @@ -113,9 +140,7 @@ MachineFunction::construct(const Function *Fn, const TargetMachine &Tar) return *mcInfo; } -void -MachineFunction::destruct(const Function *Fn) -{ +void MachineFunction::destruct(const Function *Fn) { bool Deleted = Fn->deleteAnnotation(MF_AID); assert(Deleted && "Machine code did not exist for function!"); }