aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/SparcV9/SparcV9TargetMachine.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-12-20 09:17:40 +0000
committerChris Lattner <sabre@nondot.org>2003-12-20 09:17:40 +0000
commit583b9d8455f311fba46f72e9b3d644743dc27ce5 (patch)
tree320d9944e44cb172d86d4520d27d888645b3a6e4 /lib/Target/SparcV9/SparcV9TargetMachine.cpp
parent07f32d48f1e16bcdc621985549548a5849215238 (diff)
downloadexternal_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.cpp55
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)