ARMMCInstLower.cpp revision 6f99776f6c1d6cc93a62192099a0fd8cc2cc3a0c
19cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner//===-- ARMMCInstLower.cpp - Convert ARM MachineInstr to an MCInst --------===//
29cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner//
39cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner//                     The LLVM Compiler Infrastructure
49cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner//
59cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner// This file is distributed under the University of Illinois Open Source
69cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner// License. See LICENSE.TXT for details.
79cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner//
89cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner//===----------------------------------------------------------------------===//
99cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner//
109cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner// This file contains code to lower ARM MachineInstrs to their corresponding
119cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner// MCInst records.
129cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner//
139cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner//===----------------------------------------------------------------------===//
149cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner
159cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner#include "ARMMCInstLower.h"
169cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner//#include "llvm/CodeGen/MachineModuleInfoImpls.h"
179cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner#include "llvm/CodeGen/MachineInstr.h"
186f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#include "llvm/MC/MCAsmInfo.h"
196f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#include "llvm/MC/MCContext.h"
206f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#include "llvm/MC/MCExpr.h"
219cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner#include "llvm/MC/MCInst.h"
229cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner//#include "llvm/MC/MCStreamer.h"
236f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#include "llvm/Support/raw_ostream.h"
246f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#include "llvm/Support/Mangler.h"
256f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#include "llvm/ADT/SmallString.h"
269cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattnerusing namespace llvm;
279cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner
289cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner
299cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner#if 0
309cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattnerconst ARMSubtarget &ARMMCInstLower::getSubtarget() const {
319cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner  return AsmPrinter.getSubtarget();
329cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner}
339cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner
349cf0eb5e58fa42802af7e5776b39909516ca74e7Chris LattnerMachineModuleInfoMachO &ARMMCInstLower::getMachOMMI() const {
359cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner  assert(getSubtarget().isTargetDarwin() &&"Can only get MachO info on darwin");
369cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner  return AsmPrinter.MMI->getObjFileInfo<MachineModuleInfoMachO>();
379cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner}
389cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner#endif
399cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner
406f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris LattnerMCSymbol *ARMMCInstLower::
416f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris LattnerGetGlobalAddressSymbol(const MachineOperand &MO) const {
426f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  const GlobalValue *GV = MO.getGlobal();
436f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner
446f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  SmallString<128> Name;
456f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  Mang.getNameWithPrefix(Name, GV, false);
466f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner
476f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  // FIXME: HANDLE PLT references how??
486f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  switch (MO.getTargetFlags()) {
496f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  default: assert(0 && "Unknown target flag on GV operand");
506f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  case 0: break;
516f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  }
526f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner
536f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  return Ctx.GetOrCreateSymbol(Name.str());
546f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner}
556f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner
566f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner
576f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris LattnerMCSymbol *ARMMCInstLower::
586f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris LattnerGetJumpTableSymbol(const MachineOperand &MO) const {
596f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  SmallString<256> Name;
606f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  raw_svector_ostream(Name) << MAI.getPrivateGlobalPrefix() << "JTI"
616f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner    << CurFunctionNumber << '_' << MO.getIndex();
626f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner
636f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#if 0
646f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  switch (MO.getTargetFlags()) {
656f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner    default: llvm_unreachable("Unknown target flag on GV operand");
666f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  }
676f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#endif
686f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner
696f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  // Create a symbol for the name.
706f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  return Ctx.GetOrCreateSymbol(Name.str());
716f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner}
726f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner
736f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris LattnerMCSymbol *ARMMCInstLower::
746f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris LattnerGetConstantPoolIndexSymbol(const MachineOperand &MO) const {
756f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  SmallString<256> Name;
766f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  raw_svector_ostream(Name) << MAI.getPrivateGlobalPrefix() << "CPI"
776f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner    << CurFunctionNumber << '_' << MO.getIndex();
786f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner
796f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#if 0
806f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  switch (MO.getTargetFlags()) {
816f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  default: llvm_unreachable("Unknown target flag on GV operand");
826f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  }
836f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#endif
846f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner
856f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  // Create a symbol for the name.
866f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  return Ctx.GetOrCreateSymbol(Name.str());
876f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner}
886f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner
896f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris LattnerMCOperand ARMMCInstLower::
906f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris LattnerLowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const {
916f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  // FIXME: We would like an efficient form for this, so we don't have to do a
926f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  // lot of extra uniquing.
936f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  const MCExpr *Expr = MCSymbolRefExpr::Create(Sym, Ctx);
946f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner
956f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#if 0
966f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  switch (MO.getTargetFlags()) {
976f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  default: llvm_unreachable("Unknown target flag on GV operand");
986f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  }
996f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#endif
1006f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner
1016f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  if (!MO.isJTI() && MO.getOffset())
1026f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner    Expr = MCBinaryExpr::CreateAdd(Expr,
1036f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner                                   MCConstantExpr::Create(MO.getOffset(), Ctx),
1046f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner                                   Ctx);
1056f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner  return MCOperand::CreateExpr(Expr);
1066f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner}
1076f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner
1089cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner
1099cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattnervoid ARMMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {
1109cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner  OutMI.setOpcode(MI->getOpcode());
1119cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner
1129cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner  for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
1139cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner    const MachineOperand &MO = MI->getOperand(i);
1149cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner
1159cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner    MCOperand MCOp;
1169cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner    switch (MO.getType()) {
1179cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner    default:
1189cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      MI->dump();
1199cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      assert(0 && "unknown operand type");
1209cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner    case MachineOperand::MO_Register:
1219cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      MCOp = MCOperand::CreateReg(MO.getReg());
1229cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      break;
1239cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner    case MachineOperand::MO_Immediate:
1249cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      MCOp = MCOperand::CreateImm(MO.getImm());
1259cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      break;
1269cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner#if 0
1279cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner    case MachineOperand::MO_MachineBasicBlock:
1289cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      MCOp = MCOperand::CreateExpr(MCSymbolRefExpr::Create(
1299cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner                       AsmPrinter.GetMBBSymbol(MO.getMBB()->getNumber()), Ctx));
1309cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      break;
1316f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#endif
1329cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner    case MachineOperand::MO_GlobalAddress:
1339cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      MCOp = LowerSymbolOperand(MO, GetGlobalAddressSymbol(MO));
1349cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      break;
1356f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#if 0
1369cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner    case MachineOperand::MO_ExternalSymbol:
1379cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      MCOp = LowerSymbolOperand(MO, GetExternalSymbolSymbol(MO));
1389cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      break;
1396f99776f6c1d6cc93a62192099a0fd8cc2cc3a0cChris Lattner#endif
1409cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner    case MachineOperand::MO_JumpTableIndex:
1419cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      MCOp = LowerSymbolOperand(MO, GetJumpTableSymbol(MO));
1429cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      break;
1439cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner    case MachineOperand::MO_ConstantPoolIndex:
1449cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      MCOp = LowerSymbolOperand(MO, GetConstantPoolIndexSymbol(MO));
1459cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner      break;
1469cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner    }
1479cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner
1489cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner    OutMI.addOperand(MCOp);
1499cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner  }
1509cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner
1519cf0eb5e58fa42802af7e5776b39909516ca74e7Chris Lattner}
152