diff options
author | Chris Lattner <sabre@nondot.org> | 2003-12-20 09:17:40 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-12-20 09:17:40 +0000 |
commit | 583b9d8455f311fba46f72e9b3d644743dc27ce5 (patch) | |
tree | 320d9944e44cb172d86d4520d27d888645b3a6e4 /lib/Target/SparcV9/SparcV9TargetMachine.cpp | |
parent | 07f32d48f1e16bcdc621985549548a5849215238 (diff) | |
download | external_llvm-583b9d8455f311fba46f72e9b3d644743dc27ce5.zip external_llvm-583b9d8455f311fba46f72e9b3d644743dc27ce5.tar.gz external_llvm-583b9d8455f311fba46f72e9b3d644743dc27ce5.tar.bz2 |
Hoist some sparc specific code into the sparc target
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10554 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/SparcV9/SparcV9TargetMachine.cpp')
-rw-r--r-- | lib/Target/SparcV9/SparcV9TargetMachine.cpp | 55 |
1 files changed, 50 insertions, 5 deletions
diff --git a/lib/Target/SparcV9/SparcV9TargetMachine.cpp b/lib/Target/SparcV9/SparcV9TargetMachine.cpp index a122e3c..505aeb8 100644 --- a/lib/Target/SparcV9/SparcV9TargetMachine.cpp +++ b/lib/Target/SparcV9/SparcV9TargetMachine.cpp @@ -31,11 +31,9 @@ using namespace llvm; -namespace llvm { - static const unsigned ImplicitRegUseList[] = { 0 }; /* not used yet */ // Build the MachineInstruction Description Array... -const TargetInstrDescriptor SparcMachineInstrDesc[] = { +const TargetInstrDescriptor llvm::SparcMachineInstrDesc[] = { #define I(ENUM, OPCODESTRING, NUMOPERANDS, RESULTPOS, MAXIMM, IMMSE, \ NUMDELAYSLOTS, LATENCY, SCHEDCLASS, INSTFLAGS) \ { OPCODESTRING, NUMOPERANDS, RESULTPOS, MAXIMM, IMMSE, \ @@ -66,7 +64,54 @@ namespace { cl::Hidden); } -} // End llvm namespace +//===---------------------------------------------------------------------===// +// Code generation/destruction passes +//===---------------------------------------------------------------------===// + +namespace { + class ConstructMachineFunction : public FunctionPass { + TargetMachine &Target; + public: + ConstructMachineFunction(TargetMachine &T) : Target(T) {} + + const char *getPassName() const { + return "ConstructMachineFunction"; + } + + bool runOnFunction(Function &F) { + MachineFunction::construct(&F, Target).getInfo()->CalculateArgSize(); + return false; + } + }; + + struct DestroyMachineFunction : public FunctionPass { + const char *getPassName() const { return "FreeMachineFunction"; } + + static void freeMachineCode(Instruction &I) { + MachineCodeForInstruction::destroy(&I); + } + + bool runOnFunction(Function &F) { + for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) + for (BasicBlock::iterator I = FI->begin(), E = FI->end(); I != E; ++I) + MachineCodeForInstruction::get(I).dropAllReferences(); + + for (Function::iterator FI = F.begin(), FE = F.end(); FI != FE; ++FI) + for_each(FI->begin(), FI->end(), freeMachineCode); + + return false; + } + }; + + FunctionPass *createMachineCodeConstructionPass(TargetMachine &Target) { + return new ConstructMachineFunction(Target); + } +} + +FunctionPass *llvm::createSparcMachineCodeDestructionPass() { + return new DestroyMachineFunction(); +} + SparcTargetMachine::SparcTargetMachine() : TargetMachine("UltraSparc-Native", false), @@ -141,7 +186,7 @@ SparcTargetMachine::addPassesToEmitAssembly(PassManager &PM, std::ostream &Out) // function has been emitted. // PM.add(createAsmPrinterPass(Out, *this)); - PM.add(createMachineCodeDestructionPass()); // Free stuff no longer needed + PM.add(createSparcMachineCodeDestructionPass()); // Free stuff no longer needed // Emit bytecode to the assembly file into its special section next if (EmitMappingInfo) |