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