//===---- AMDILMCCodeEmitter.cpp - Convert AMDIL text to AMDIL binary ----===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //==-----------------------------------------------------------------------===// // //===---------------------------------------------------------------------===// #include "AMDIL.h" #include "AMDILInstrInfo.h" #include "llvm/ADT/SmallVector.h" #include "llvm/MC/MCCodeEmitter.h" #include "llvm/MC/MCExpr.h" #include "llvm/MC/MCInst.h" #include "llvm/Support/raw_ostream.h" using namespace llvm; #if 0 namespace { class AMDILMCCodeEmitter : public MCCodeEmitter { AMDILMCCodeEmitter(const AMDILMCCodeEmitter &);// DO NOT IMPLEMENT void operator=(const AMDILMCCodeEmitter &); // DO NOT IMPLEMENT const TargetMachine &TM; const TargetInstrInfo &TII; MCContext &Ctx; bool Is64BitMode; public: AMDILMCCodeEmitter(TargetMachine &tm, MCContext &ctx, bool is64Bit); ~AMDILMCCodeEmitter(); unsigned getNumFixupKinds() const; const MCFixupKindInfo& getFixupKindInfo(MCFixupKind Kind) const; static unsigned GetAMDILRegNum(const MCOperand &MO); void EmitByte(unsigned char C, unsigned &CurByte, raw_ostream &OS) const; void EmitConstant(uint64_t Val, unsigned Size, unsigned &CurByte, raw_ostream &OS) const; void EmitImmediate(const MCOperand &Disp, unsigned ImmSize, MCFixupKind FixupKind, unsigned &CurByte, raw_ostream &os, SmallVectorImpl &Fixups, int ImmOffset = 0) const; void EncodeInstruction(const MCInst &MI, raw_ostream &OS, SmallVectorImpl &Fixups) const; }; // class AMDILMCCodeEmitter }; // anonymous namespace namespace llvm { MCCodeEmitter *createAMDILMCCodeEmitter(const Target &, TargetMachine &TM, MCContext &Ctx) { return new AMDILMCCodeEmitter(TM, Ctx, false); } } AMDILMCCodeEmitter::AMDILMCCodeEmitter(TargetMachine &tm, MCContext &ctx , bool is64Bit) : TM(tm), TII(*TM.getInstrInfo()), Ctx(ctx) { Is64BitMode = is64Bit; } AMDILMCCodeEmitter::~AMDILMCCodeEmitter() { } unsigned AMDILMCCodeEmitter::getNumFixupKinds() const { return 0; } const MCFixupKindInfo & AMDILMCCodeEmitter::getFixupKindInfo(MCFixupKind Kind) const { // const static MCFixupKindInfo Infos[] = {}; if (Kind < FirstTargetFixupKind) { return MCCodeEmitter::getFixupKindInfo(Kind); } assert(unsigned(Kind - FirstTargetFixupKind) < getNumFixupKinds() && "Invalid kind!"); return MCCodeEmitter::getFixupKindInfo(Kind); // return Infos[Kind - FirstTargetFixupKind]; } void AMDILMCCodeEmitter::EmitByte(unsigned char C, unsigned &CurByte, raw_ostream &OS) const { OS << (char) C; ++CurByte; } void AMDILMCCodeEmitter::EmitConstant(uint64_t Val, unsigned Size, unsigned &CurByte, raw_ostream &OS) const { // Output the constant in little endian byte order for (unsigned i = 0; i != Size; ++i) { EmitByte(Val & 255, CurByte, OS); Val >>= 8; } } void AMDILMCCodeEmitter::EmitImmediate(const MCOperand &DispOp, unsigned ImmSize, MCFixupKind FixupKind, unsigned &CurByte, raw_ostream &OS, SmallVectorImpl &Fixups, int ImmOffset) const { // If this is a simple integer displacement that doesn't require a relocation // emit it now. if (DispOp.isImm()) { EmitConstant(DispOp.getImm() + ImmOffset, ImmSize, CurByte, OS); } // If we have an immoffset, add it to the expression const MCExpr *Expr = DispOp.getExpr(); if (ImmOffset) { Expr = MCBinaryExpr::CreateAdd(Expr, MCConstantExpr::Create(ImmOffset, Ctx), Ctx); } // Emit a symbolic constant as a fixup and 4 zeros. Fixups.push_back(MCFixup::Create(CurByte, Expr, FixupKind)); // TODO: Why the 4 zeros? EmitConstant(0, ImmSize, CurByte, OS); } void AMDILMCCodeEmitter::EncodeInstruction(const MCInst &MI, raw_ostream &OS, SmallVectorImpl &Fixups) const { #if 0 unsigned Opcode = MI.getOpcode(); const TargetInstrDesc &Desc = TII.get(Opcode); unsigned TSFlags = Desc.TSFlags; // Keep track of the current byte being emitted. unsigned CurByte = 0; unsigned NumOps = Desc.getNumOperands(); unsigned CurOp = 0; unsigned char BaseOpcode = 0; #ifndef NDEBUG // FIXME: Verify. if (// !Desc.isVariadic() && CurOp != NumOps) { errs() << "Cannot encode all operands of: "; MI.dump(); errs() << '\n'; abort(); } #endif #endif } #endif