blob: ceb7ddee6fb659ab07a1e1180919c95deee8fed0 [file] [log] [blame]
Jim Grosbach568eeed2010-09-17 18:46:17 +00001//===-- ARM/ARMMCCodeEmitter.cpp - Convert ARM code to machine code -------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements the ARMMCCodeEmitter class.
11//
12//===----------------------------------------------------------------------===//
13
14#define DEBUG_TYPE "arm-emitter"
15#include "ARM.h"
16#include "ARMInstrInfo.h"
17#include "llvm/MC/MCCodeEmitter.h"
18#include "llvm/MC/MCExpr.h"
19#include "llvm/MC/MCInst.h"
20#include "llvm/Support/raw_ostream.h"
21using namespace llvm;
22
23namespace {
24class ARMMCCodeEmitter : public MCCodeEmitter {
25 ARMMCCodeEmitter(const ARMMCCodeEmitter &); // DO NOT IMPLEMENT
26 void operator=(const ARMMCCodeEmitter &); // DO NOT IMPLEMENT
27 const TargetMachine &TM;
28 const TargetInstrInfo &TII;
29 MCContext &Ctx;
30
31public:
32 ARMMCCodeEmitter(TargetMachine &tm, MCContext &ctx)
33 : TM(tm), TII(*TM.getInstrInfo()), Ctx(ctx) {
34 assert(0 && "ARMMCCodeEmitter::ARMMCCodeEmitter() not yet implemented.");
35 }
36
37 ~ARMMCCodeEmitter() {}
38
39 unsigned getNumFixupKinds() const {
40 assert(0 && "ARMMCCodeEmitter::getNumFixupKinds() not yet implemented.");
41 }
42
43 const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const {
44 static MCFixupKindInfo rtn;
45 assert(0 && "ARMMCCodeEmitter::getFixupKindInfo() not yet implemented.");
46 return rtn;
47 }
48
49 static unsigned GetARMRegNum(const MCOperand &MO) {
50 // FIXME: getARMRegisterNumbering() is sufficient?
51 assert(0 && "ARMMCCodeEmitter::GetARMRegNum() not yet implemented.");
52 return 0;
53 }
54
55 void EmitByte(unsigned char C, unsigned &CurByte, raw_ostream &OS) const {
56 OS << (char)C;
57 ++CurByte;
58 }
59
60 void EmitConstant(uint64_t Val, unsigned Size, unsigned &CurByte,
61 raw_ostream &OS) const {
62 // Output the constant in little endian byte order.
63 for (unsigned i = 0; i != Size; ++i) {
64 EmitByte(Val & 255, CurByte, OS);
65 Val >>= 8;
66 }
67 }
68
69 void EmitImmediate(const MCOperand &Disp,
70 unsigned ImmSize, MCFixupKind FixupKind,
71 unsigned &CurByte, raw_ostream &OS,
72 SmallVectorImpl<MCFixup> &Fixups,
73 int ImmOffset = 0) const;
74
75 void EncodeInstruction(const MCInst &MI, raw_ostream &OS,
76 SmallVectorImpl<MCFixup> &Fixups) const;
77
78 void EmitOpcodePrefix(uint64_t TSFlags, unsigned &CurByte, int MemOperand,
79 const MCInst &MI, const TargetInstrDesc &Desc,
80 raw_ostream &OS) const;
81};
82
83} // end anonymous namespace
84
85
86MCCodeEmitter *llvm::createARMMCCodeEmitter(const Target &,
87 TargetMachine &TM,
88 MCContext &Ctx) {
89 return new ARMMCCodeEmitter(TM, Ctx);
90}
91
92void ARMMCCodeEmitter::
93EmitImmediate(const MCOperand &DispOp, unsigned Size, MCFixupKind FixupKind,
94 unsigned &CurByte, raw_ostream &OS,
95 SmallVectorImpl<MCFixup> &Fixups, int ImmOffset) const {
96 assert(0 && "ARMMCCodeEmitter::EmitImmediate() not yet implemented.");
97}
98
99/// EmitOpcodePrefix - Emit all instruction prefixes prior to the opcode.
100///
101/// MemOperand is the operand # of the start of a memory operand if present. If
102/// Not present, it is -1.
103void ARMMCCodeEmitter::EmitOpcodePrefix(uint64_t TSFlags, unsigned &CurByte,
104 int MemOperand, const MCInst &MI,
105 const TargetInstrDesc &Desc,
106 raw_ostream &OS) const {
107 assert(0 && "ARMMCCodeEmitter::EmitOpcodePrefix() not yet implemented.");
108}
109
110void ARMMCCodeEmitter::
111EncodeInstruction(const MCInst &MI, raw_ostream &OS,
112 SmallVectorImpl<MCFixup> &Fixups) const {
113 assert(0 && "ARMMCCodeEmitter::EncodeInstruction() not yet implemented.");
114}