diff options
| author | Akira Hatanaka <ahatanak@gmail.com> | 2011-07-07 20:24:54 +0000 | 
|---|---|---|
| committer | Akira Hatanaka <ahatanak@gmail.com> | 2011-07-07 20:24:54 +0000 | 
| commit | 77a9e6e7df7f38b9f0509c570df6fe3f7fa0eb7c (patch) | |
| tree | 6e9082d4a91a8c47a4d07161cc8216c090287c1c /llvm/lib | |
| parent | 28597319fd2fd8a226f43e4abb1a6f6fd25a1e6d (diff) | |
| download | bcm5719-llvm-77a9e6e7df7f38b9f0509c570df6fe3f7fa0eb7c.tar.gz bcm5719-llvm-77a9e6e7df7f38b9f0509c570df6fe3f7fa0eb7c.zip | |
Define class MipsMCInstLower.
llvm-svn: 134633
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/Mips/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MipsMCInstLower.cpp | 117 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MipsMCInstLower.h | 43 | 
3 files changed, 161 insertions, 0 deletions
| diff --git a/llvm/lib/Target/Mips/CMakeLists.txt b/llvm/lib/Target/Mips/CMakeLists.txt index bcbc83d965e..43df007fdb0 100644 --- a/llvm/lib/Target/Mips/CMakeLists.txt +++ b/llvm/lib/Target/Mips/CMakeLists.txt @@ -17,6 +17,7 @@ add_llvm_target(MipsCodeGen    MipsISelLowering.cpp    MipsFrameLowering.cpp    MipsMCAsmInfo.cpp +  MipsMCInstLower.cpp    MipsMCSymbolRefExpr.cpp    MipsRegisterInfo.cpp    MipsSubtarget.cpp diff --git a/llvm/lib/Target/Mips/MipsMCInstLower.cpp b/llvm/lib/Target/Mips/MipsMCInstLower.cpp new file mode 100644 index 00000000000..416f7763202 --- /dev/null +++ b/llvm/lib/Target/Mips/MipsMCInstLower.cpp @@ -0,0 +1,117 @@ +//===-- MipsMCInstLower.cpp - Convert Mips MachineInstr to MCInst ---------===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file contains code to lower Mips MachineInstrs to their corresponding +// MCInst records. +// +//===----------------------------------------------------------------------===// + +#include "MipsMCInstLower.h" +#include "MipsAsmPrinter.h" +#include "MipsInstrInfo.h" +#include "MipsMCSymbolRefExpr.h" +#include "llvm/CodeGen/MachineFunction.h" +#include "llvm/CodeGen/MachineInstr.h" +#include "llvm/CodeGen/MachineOperand.h" +#include "llvm/MC/MCContext.h" +#include "llvm/MC/MCInst.h" +#include "llvm/Target/Mangler.h" +using namespace llvm; + +MipsMCInstLower::MipsMCInstLower(Mangler *mang, const MachineFunction &mf, +                                 MipsAsmPrinter &asmprinter) +  : Ctx(mf.getContext()), Mang(mang), AsmPrinter(asmprinter) {} + +MCOperand MipsMCInstLower::LowerSymbolOperand(const MachineOperand &MO, +                                              MachineOperandType MOTy) const { +  MipsMCSymbolRefExpr::VariantKind Kind; +  const MCSymbol *Symbol; +  int Offset = 0; + +  switch(MO.getTargetFlags()) { +  case MipsII::MO_NO_FLAG:  Kind = MipsMCSymbolRefExpr::VK_Mips_None; break; +  case MipsII::MO_GPREL:    Kind = MipsMCSymbolRefExpr::VK_Mips_GPREL; break; +  case MipsII::MO_GOT_CALL: Kind = MipsMCSymbolRefExpr::VK_Mips_GOT_CALL; break; +  case MipsII::MO_GOT:      Kind = MipsMCSymbolRefExpr::VK_Mips_GOT; break; +  case MipsII::MO_ABS_HI:   Kind = MipsMCSymbolRefExpr::VK_Mips_ABS_HI; break; +  case MipsII::MO_ABS_LO:   Kind = MipsMCSymbolRefExpr::VK_Mips_ABS_LO; break; +  case MipsII::MO_TLSGD:    Kind = MipsMCSymbolRefExpr::VK_Mips_TLSGD; break; +  case MipsII::MO_GOTTPREL: Kind = MipsMCSymbolRefExpr::VK_Mips_GOTTPREL; break; +  case MipsII::MO_TPREL_HI: Kind = MipsMCSymbolRefExpr::VK_Mips_TPREL_HI; break; +  case MipsII::MO_TPREL_LO: Kind = MipsMCSymbolRefExpr::VK_Mips_TPREL_LO; break; +  } + +  switch (MOTy) { +    case MachineOperand::MO_MachineBasicBlock: +      Symbol = MO.getMBB()->getSymbol(); +      break; + +    case MachineOperand::MO_GlobalAddress: +      Symbol = Mang->getSymbol(MO.getGlobal()); +      break; + +    case MachineOperand::MO_BlockAddress: +      Symbol = AsmPrinter.GetBlockAddressSymbol(MO.getBlockAddress()); +      break; + +    case MachineOperand::MO_ExternalSymbol: +      Symbol = AsmPrinter.GetExternalSymbolSymbol(MO.getSymbolName()); +      break; + +    case MachineOperand::MO_JumpTableIndex: +      Symbol = AsmPrinter.GetJTISymbol(MO.getIndex()); +      break; + +    case MachineOperand::MO_ConstantPoolIndex: +      Symbol = AsmPrinter.GetCPISymbol(MO.getIndex()); +      if (MO.getOffset()) +        Offset = MO.getOffset();   +      break; + +    default: +      llvm_unreachable("<unknown operand type>"); +  } +   +  return MCOperand::CreateExpr(MipsMCSymbolRefExpr::Create(Kind, Symbol, Offset, +                                                           Ctx)); +} + +void MipsMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const { +  OutMI.setOpcode(MI->getOpcode()); +   +  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { +    const MachineOperand &MO = MI->getOperand(i); +    MCOperand MCOp; +    MachineOperandType MOTy = MO.getType(); + +    switch (MOTy) { +    default: +      MI->dump(); +      llvm_unreachable("unknown operand type"); +    case MachineOperand::MO_Register: +      // Ignore all implicit register operands. +      if (MO.isImplicit()) continue; +      MCOp = MCOperand::CreateReg(MO.getReg()); +      break; +    case MachineOperand::MO_Immediate: +      MCOp = MCOperand::CreateImm(MO.getImm()); +      break; +    case MachineOperand::MO_MachineBasicBlock: +    case MachineOperand::MO_GlobalAddress: +    case MachineOperand::MO_ExternalSymbol: +    case MachineOperand::MO_JumpTableIndex: +    case MachineOperand::MO_ConstantPoolIndex: +    case MachineOperand::MO_BlockAddress: +      MCOp = LowerSymbolOperand(MO, MOTy); +      break; +    } +     +    OutMI.addOperand(MCOp); +  } +} diff --git a/llvm/lib/Target/Mips/MipsMCInstLower.h b/llvm/lib/Target/Mips/MipsMCInstLower.h new file mode 100644 index 00000000000..ec5201be7f6 --- /dev/null +++ b/llvm/lib/Target/Mips/MipsMCInstLower.h @@ -0,0 +1,43 @@ +//===-- MipsMCInstLower.h - Lower MachineInstr to MCInst -------------------===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef MIPSMCINSTLOWER_H +#define MIPSMCINSTLOWER_H +#include "llvm/CodeGen/MachineOperand.h" +#include "llvm/Support/Compiler.h" + +namespace llvm { +  class MCAsmInfo; +  class MCContext; +  class MCInst; +  class MCOperand; +  class MCSymbol; +  class MachineInstr; +  class MachineFunction; +  class Mangler; +  class MipsAsmPrinter; +   +/// MipsMCInstLower - This class is used to lower an MachineInstr into an +//                    MCInst. +class LLVM_LIBRARY_VISIBILITY MipsMCInstLower { +  typedef MachineOperand::MachineOperandType MachineOperandType; +  MCContext &Ctx; +  Mangler *Mang; +  MipsAsmPrinter &AsmPrinter; +public: +  MipsMCInstLower(Mangler *mang, const MachineFunction &MF, +                  MipsAsmPrinter &asmprinter);   +  void Lower(const MachineInstr *MI, MCInst &OutMI) const; +private: +  MCOperand LowerSymbolOperand(const MachineOperand &MO, +                               MachineOperandType MOTy) const; +}; +} + +#endif | 

