| //===-- SparcV9CodeEmitter.h ------------------------------------*- C++ -*-===// |
| // |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef SPARCV9CODEEMITTER_H |
| #define SPARCV9CODEEMITTER_H |
| |
| #include "llvm/BasicBlock.h" |
| #include "llvm/CodeGen/MachineCodeEmitter.h" |
| #include "llvm/CodeGen/MachineFunctionPass.h" |
| #include "llvm/Target/TargetMachine.h" |
| |
| class GlobalValue; |
| class MachineInstr; |
| class MachineOperand; |
| |
| class SparcV9CodeEmitter : public MachineFunctionPass { |
| TargetMachine &TM; |
| MachineCodeEmitter &MCE; |
| BasicBlock *currBB; |
| |
| // Tracks which instruction references which BasicBlock |
| std::vector<std::pair<BasicBlock*, |
| std::pair<unsigned*,MachineInstr*> > > BBRefs; |
| // Tracks where each BasicBlock starts |
| std::map<BasicBlock*, long> BBLocations; |
| |
| // Tracks locations of Constants which are laid out in memory (e.g. FP) |
| // But we also need to map Constants to ConstantPool indices |
| std::map<const Constant*, unsigned> ConstantMap; |
| |
| public: |
| SparcV9CodeEmitter(TargetMachine &T, MachineCodeEmitter &M); |
| ~SparcV9CodeEmitter(); |
| |
| bool runOnMachineFunction(MachineFunction &F); |
| void emitWord(unsigned Val); |
| |
| /// Function generated by the CodeEmitterGenerator using TableGen |
| /// |
| unsigned getBinaryCodeForInstr(MachineInstr &MI); |
| |
| private: |
| int64_t getMachineOpValue(MachineInstr &MI, MachineOperand &MO); |
| unsigned getValueBit(int64_t Val, unsigned bit); |
| void emitBasicBlock(MachineBasicBlock &MBB); |
| void* getGlobalAddress(GlobalValue *V, MachineInstr &MI, |
| bool isPCRelative); |
| }; |
| |
| #endif |