SparcTargetMachine.cpp revision a9a582fbb6f0c9e24bebda73f0a13e560f2d3c5e
1de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//===-- SparcV8TargetMachine.cpp - Define TargetMachine for SparcV8 -------===//
2de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//
336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//                     The LLVM Compiler Infrastructure
4de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//
5de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// This file was developed by the LLVM research group and is distributed under
6de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// the University of Illinois Open Source License. See LICENSE.TXT for details.
7de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//
8de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//===----------------------------------------------------------------------===//
9de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//
10de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//
11de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//===----------------------------------------------------------------------===//
12de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak
13de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#include "SparcV8TargetMachine.h"
14de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#include "SparcV8.h"
15de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#include "llvm/Module.h"
16de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#include "llvm/PassManager.h"
17de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#include "llvm/CodeGen/MachineFunction.h"
18255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/CodeGen/Passes.h"
19de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak#include "llvm/Target/TargetMachineImpls.h"
20255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/Transforms/Scalar.h"
21de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszakusing namespace llvm;
22de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak
23de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// allocateSparcV8TargetMachine - Allocate and return a subclass of
24de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak// TargetMachine that implements the SparcV8 backend.
25de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak//
26de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub StaszakTargetMachine *llvm::allocateSparcV8TargetMachine(const Module &M,
27de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak                                                  IntrinsicLowering *IL) {
28de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  return new SparcV8TargetMachine(M, IL);
29de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak}
30de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak
31de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak/// SparcV8TargetMachine ctor - Create an ILP32 architecture model
32354362524a72b3fa43a6c09380b7ae3b2380cbbaJuergen Ributzka///
33de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub StaszakSparcV8TargetMachine::SparcV8TargetMachine(const Module &M,
34de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak                                           IntrinsicLowering *IL)
35de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  : TargetMachine("SparcV8", IL, true, 4, 4, 4, 4, 4),
36b21ab43cfc3fa0dacf5c95f04e58b6d804b59a16Alexey Samsonov    FrameInfo(TargetFrameInfo::StackGrowsDown, 8, 0), JITInfo(*this) {
37de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak}
38de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak
39de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak/// addPassesToEmitAssembly - Add passes to the specified pass manager
40de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak/// to implement a static compiler for this target.
41de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak///
42cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hinesbool SparcV8TargetMachine::addPassesToEmitAssembly(PassManager &PM,
43cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines					       std::ostream &Out) {
44de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  // FIXME: Implement efficient support for garbage collection intrinsics.
45de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  PM.add(createLowerGCPass());
46de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak
47de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  // Replace malloc and free instructions with library calls.
48f12745f7a7e68c05c89ebd515b9b4faedce37dd0Rafael Espindola  PM.add(createLowerAllocationsPass());
49de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak
50de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  // FIXME: implement the select instruction in the instruction selector.
51de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  PM.add(createLowerSelectPass());
5236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
53de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  // FIXME: implement the switch instruction in the instruction selector.
54de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  PM.add(createLowerSwitchPass());
55de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak
56de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  // FIXME: implement the invoke/unwind instructions!
57de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  PM.add(createLowerInvokePass());
58de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak
59de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  PM.add(createLowerConstantExpressionsPass());
6036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
61de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  // Make sure that no unreachable blocks are instruction selected.
62de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  PM.add(createUnreachableBlockEliminationPass());
63b21ab43cfc3fa0dacf5c95f04e58b6d804b59a16Alexey Samsonov
64de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  PM.add(createSparcV8SimpleInstructionSelector(*this));
65de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak
66de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  // Print machine instructions as they were initially generated.
67de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  if (PrintMachineCode)
68de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak    PM.add(createMachineFunctionPrinterPass(&std::cerr));
69de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak
70de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  PM.add(createRegisterAllocator());
71de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  PM.add(createPrologEpilogCodeInserter());
7236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines
7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  // Print machine instructions after register allocation and prolog/epilog
74de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  // insertion.
75de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  if (PrintMachineCode)
76de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak    PM.add(createMachineFunctionPrinterPass(&std::cerr));
77de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak
7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines  PM.add(createSparcV8DelaySlotFillerPass(*this));
79de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak
80de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  // Print machine instructions after filling delay slots.
81de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak  if (PrintMachineCode)
82de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak    PM.add(createMachineFunctionPrinterPass(&std::cerr));
83de7c8530c85181c78fbb30a305749ee3a71cfc51Jakub Staszak
84  // Output assembly language.
85  PM.add(createSparcV8CodePrinterPass(Out, *this));
86
87  // Delete the MachineInstrs we generated, since they're no longer needed.
88  PM.add(createMachineCodeDeleter());
89  return false;
90}
91
92/// addPassesToJITCompile - Add passes to the specified pass manager to
93/// implement a fast dynamic compiler for this target.
94///
95void SparcV8JITInfo::addPassesToJITCompile(FunctionPassManager &PM) {
96  // FIXME: Implement efficient support for garbage collection intrinsics.
97  PM.add(createLowerGCPass());
98
99  // Replace malloc and free instructions with library calls.
100  PM.add(createLowerAllocationsPass());
101
102  // FIXME: implement the select instruction in the instruction selector.
103  PM.add(createLowerSelectPass());
104
105  // FIXME: implement the switch instruction in the instruction selector.
106  PM.add(createLowerSwitchPass());
107
108  // FIXME: implement the invoke/unwind instructions!
109  PM.add(createLowerInvokePass());
110
111  PM.add(createLowerConstantExpressionsPass());
112
113  // Make sure that no unreachable blocks are instruction selected.
114  PM.add(createUnreachableBlockEliminationPass());
115
116  PM.add(createSparcV8SimpleInstructionSelector(TM));
117
118  // Print machine instructions as they were initially generated.
119  if (PrintMachineCode)
120    PM.add(createMachineFunctionPrinterPass(&std::cerr));
121
122  PM.add(createRegisterAllocator());
123  PM.add(createPrologEpilogCodeInserter());
124
125  // Print machine instructions after register allocation and prolog/epilog
126  // insertion.
127  if (PrintMachineCode)
128    PM.add(createMachineFunctionPrinterPass(&std::cerr));
129
130  PM.add(createSparcV8DelaySlotFillerPass(TM));
131
132  // Print machine instructions after filling delay slots.
133  if (PrintMachineCode)
134    PM.add(createMachineFunctionPrinterPass(&std::cerr));
135}
136