Correctly handle calls to functions which are further away than 2**32 bits will
[oota-llvm.git] / lib / Target / SparcV9 / SparcV9CodeEmitter.h
1 //===-- SparcV9CodeEmitter.h ------------------------------------*- C++ -*-===//
2 // 
3 //
4 //===----------------------------------------------------------------------===//
5
6 #ifndef SPARCV9CODEEMITTER_H
7 #define SPARCV9CODEEMITTER_H
8
9 #include "llvm/BasicBlock.h"
10 #include "llvm/CodeGen/MachineCodeEmitter.h"
11 #include "llvm/CodeGen/MachineFunctionPass.h"
12 #include "llvm/Target/TargetMachine.h"
13
14 class GlobalValue;
15 class MachineInstr;
16 class MachineOperand;
17
18 class SparcV9CodeEmitter : public MachineFunctionPass {
19   TargetMachine &TM;
20   MachineCodeEmitter &MCE;
21   BasicBlock *currBB;
22
23   // Tracks which instruction references which BasicBlock
24   std::vector<std::pair<BasicBlock*,
25                         std::pair<unsigned*,MachineInstr*> > > BBRefs;
26   // Tracks where each BasicBlock starts
27   std::map<BasicBlock*, long> BBLocations;
28
29   // Tracks locations of Constants which are laid out in memory (e.g. FP)
30   // But we also need to map Constants to ConstantPool indices
31   std::map<const Constant*, unsigned> ConstantMap;
32
33 public:
34   SparcV9CodeEmitter(TargetMachine &T, MachineCodeEmitter &M);
35   ~SparcV9CodeEmitter();
36
37   bool runOnMachineFunction(MachineFunction &F);
38   void emitWord(unsigned Val);
39     
40   /// Function generated by the CodeEmitterGenerator using TableGen
41   ///
42   unsigned getBinaryCodeForInstr(MachineInstr &MI);
43
44 private:    
45   int64_t getMachineOpValue(MachineInstr &MI, MachineOperand &MO);
46   inline unsigned getValueBit(int64_t Val, unsigned bit);
47   void emitBasicBlock(MachineBasicBlock &MBB);
48   void* getGlobalAddress(GlobalValue *V, MachineInstr &MI,
49                          bool isPCRelative);
50   bool isFPInstr(MachineInstr &MI);
51   unsigned getRealRegNum(unsigned fakeReg, MachineInstr &MI);
52   inline void emitFarCall(uint64_t Addr);
53
54 };
55
56 #endif