1 //===-- ARMMCInstLower.cpp - Convert ARM MachineInstr to an MCInst --------===// 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 contains code to lower ARM MachineInstrs to their corresponding 11 // MCInst records. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "ARMMCInstLower.h" 16 //#include "llvm/CodeGen/MachineModuleInfoImpls.h" 17 #include "llvm/CodeGen/AsmPrinter.h" 18 #include "llvm/CodeGen/MachineBasicBlock.h" 19 #include "llvm/MC/MCAsmInfo.h" 20 #include "llvm/MC/MCContext.h" 21 #include "llvm/MC/MCExpr.h" 22 #include "llvm/MC/MCInst.h" 23 //#include "llvm/MC/MCStreamer.h" 24 #include "llvm/Target/Mangler.h" 25 #include "llvm/Support/raw_ostream.h" 26 #include "llvm/ADT/SmallString.h" 27 using namespace llvm; 28 29 30 #if 0 31 const ARMSubtarget &ARMMCInstLower::getSubtarget() const { 32 return AsmPrinter.getSubtarget(); 33 } 34 35 MachineModuleInfoMachO &ARMMCInstLower::getMachOMMI() const { 36 assert(getSubtarget().isTargetDarwin() &&"Can only get MachO info on darwin"); 37 return AsmPrinter.MMI->getObjFileInfo<MachineModuleInfoMachO>(); 38 } 39 #endif 40 41 MCSymbol *ARMMCInstLower:: 42 GetGlobalAddressSymbol(const MachineOperand &MO) const { 43 // FIXME: HANDLE PLT references how?? 44 switch (MO.getTargetFlags()) { 45 default: assert(0 && "Unknown target flag on GV operand"); 46 case 0: break; 47 } 48 49 return Printer.Mang->getSymbol(MO.getGlobal()); 50 } 51 52 MCSymbol *ARMMCInstLower:: 53 GetExternalSymbolSymbol(const MachineOperand &MO) const { 54 // FIXME: HANDLE PLT references how?? 55 switch (MO.getTargetFlags()) { 56 default: assert(0 && "Unknown target flag on GV operand"); 57 case 0: break; 58 } 59 60 return Printer.GetExternalSymbolSymbol(MO.getSymbolName()); 61 } 62 63 64 65 MCSymbol *ARMMCInstLower:: 66 GetJumpTableSymbol(const MachineOperand &MO) const { 67 SmallString<256> Name; 68 raw_svector_ostream(Name) << Printer.MAI->getPrivateGlobalPrefix() << "JTI" 69 << Printer.getFunctionNumber() << '_' << MO.getIndex(); 70 71 #if 0 72 switch (MO.getTargetFlags()) { 73 default: llvm_unreachable("Unknown target flag on GV operand"); 74 } 75 #endif 76 77 // Create a symbol for the name. 78 return Ctx.GetOrCreateSymbol(Name.str()); 79 } 80 81 MCSymbol *ARMMCInstLower:: 82 GetConstantPoolIndexSymbol(const MachineOperand &MO) const { 83 SmallString<256> Name; 84 raw_svector_ostream(Name) << Printer.MAI->getPrivateGlobalPrefix() << "CPI" 85 << Printer.getFunctionNumber() << '_' << MO.getIndex(); 86 87 #if 0 88 switch (MO.getTargetFlags()) { 89 default: llvm_unreachable("Unknown target flag on GV operand"); 90 } 91 #endif 92 93 // Create a symbol for the name. 94 return Ctx.GetOrCreateSymbol(Name.str()); 95 } 96 97 MCOperand ARMMCInstLower:: 98 LowerSymbolOperand(const MachineOperand &MO, MCSymbol *Sym) const { 99 // FIXME: We would like an efficient form for this, so we don't have to do a 100 // lot of extra uniquing. 101 const MCExpr *Expr = MCSymbolRefExpr::Create(Sym, Ctx); 102 103 #if 0 104 switch (MO.getTargetFlags()) { 105 default: llvm_unreachable("Unknown target flag on GV operand"); 106 } 107 #endif 108 109 if (!MO.isJTI() && MO.getOffset()) 110 Expr = MCBinaryExpr::CreateAdd(Expr, 111 MCConstantExpr::Create(MO.getOffset(), Ctx), 112 Ctx); 113 return MCOperand::CreateExpr(Expr); 114 } 115 116 117 void ARMMCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const { 118 OutMI.setOpcode(MI->getOpcode()); 119 120 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 121 const MachineOperand &MO = MI->getOperand(i); 122 123 MCOperand MCOp; 124 switch (MO.getType()) { 125 default: 126 MI->dump(); 127 assert(0 && "unknown operand type"); 128 case MachineOperand::MO_Register: 129 // Ignore all implicit register operands. 130 if (MO.isImplicit()) continue; 131 assert(!MO.getSubReg() && "Subregs should be eliminated!"); 132 MCOp = MCOperand::CreateReg(MO.getReg()); 133 break; 134 case MachineOperand::MO_Immediate: 135 MCOp = MCOperand::CreateImm(MO.getImm()); 136 break; 137 case MachineOperand::MO_MachineBasicBlock: 138 MCOp = MCOperand::CreateExpr(MCSymbolRefExpr::Create( 139 MO.getMBB()->getSymbol(), Ctx)); 140 break; 141 case MachineOperand::MO_GlobalAddress: 142 MCOp = LowerSymbolOperand(MO, GetGlobalAddressSymbol(MO)); 143 break; 144 case MachineOperand::MO_ExternalSymbol: 145 MCOp = LowerSymbolOperand(MO, GetExternalSymbolSymbol(MO)); 146 break; 147 case MachineOperand::MO_JumpTableIndex: 148 MCOp = LowerSymbolOperand(MO, GetJumpTableSymbol(MO)); 149 break; 150 case MachineOperand::MO_ConstantPoolIndex: 151 MCOp = LowerSymbolOperand(MO, GetConstantPoolIndexSymbol(MO)); 152 break; 153 case MachineOperand::MO_BlockAddress: 154 MCOp = LowerSymbolOperand(MO, Printer.GetBlockAddressSymbol( 155 MO.getBlockAddress())); 156 break; 157 } 158 159 OutMI.addOperand(MCOp); 160 } 161 162 } 163