PPCMCInstLower.cpp revision 1520fd60950c1c347457b225dbbd72224d4fcd19
1//===-- PPCMCInstLower.cpp - Convert PPC 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 PPC MachineInstrs to their corresponding 11// MCInst records. 12// 13//===----------------------------------------------------------------------===// 14 15#include "PPC.h" 16#include "llvm/CodeGen/AsmPrinter.h" 17#include "llvm/CodeGen/MachineBasicBlock.h" 18#include "llvm/MC/MCExpr.h" 19#include "llvm/MC/MCInst.h" 20#include "llvm/Target/Mangler.h" 21using namespace llvm; 22 23static MCOperand GetSymbolRef(const MachineOperand &MO, const MCSymbol *Symbol, 24 AsmPrinter &Printer) { 25 MCContext &Ctx = Printer.OutContext; 26 const MCExpr *Expr; 27 switch (MO.getTargetFlags()) { 28 default: assert(0 && "Unknown target flag on symbol operand"); 29 case 0: 30 Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_None, Ctx); 31 break; 32#if 0 33 case ARMII::MO_LO16: 34 Expr = MCSymbolRefExpr::Create(Symbol, MCSymbolRefExpr::VK_ARM_LO16, Ctx); 35 break; 36#endif 37 } 38 39 if (!MO.isJTI() && MO.getOffset()) 40 Expr = MCBinaryExpr::CreateAdd(Expr, 41 MCConstantExpr::Create(MO.getOffset(), Ctx), 42 Ctx); 43 return MCOperand::CreateExpr(Expr); 44 45} 46 47void llvm::LowerPPCMachineInstrToMCInst(const MachineInstr *MI, MCInst &OutMI, 48 AsmPrinter &AP) { 49 OutMI.setOpcode(MI->getOpcode()); 50 51 for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { 52 const MachineOperand &MO = MI->getOperand(i); 53 54 MCOperand MCOp; 55 switch (MO.getType()) { 56 default: 57 MI->dump(); 58 assert(0 && "unknown operand type"); 59 case MachineOperand::MO_Register: 60 assert(!MO.getSubReg() && "Subregs should be eliminated!"); 61 MCOp = MCOperand::CreateReg(MO.getReg()); 62 break; 63 case MachineOperand::MO_Immediate: 64 MCOp = MCOperand::CreateImm(MO.getImm()); 65 break; 66 case MachineOperand::MO_MachineBasicBlock: 67 MCOp = MCOperand::CreateExpr(MCSymbolRefExpr::Create( 68 MO.getMBB()->getSymbol(), AP.OutContext)); 69 break; 70 case MachineOperand::MO_GlobalAddress: 71 MCOp = GetSymbolRef(MO, AP.Mang->getSymbol(MO.getGlobal()), AP); 72 break; 73 case MachineOperand::MO_ExternalSymbol: 74 MCOp = GetSymbolRef(MO, 75 AP.GetExternalSymbolSymbol(MO.getSymbolName()), AP); 76 break; 77 case MachineOperand::MO_JumpTableIndex: 78 MCOp = GetSymbolRef(MO, AP.GetJTISymbol(MO.getIndex()), AP); 79 break; 80 case MachineOperand::MO_ConstantPoolIndex: 81 MCOp = GetSymbolRef(MO, AP.GetCPISymbol(MO.getIndex()), AP); 82 break; 83 case MachineOperand::MO_BlockAddress: 84 MCOp = GetSymbolRef(MO,AP.GetBlockAddressSymbol(MO.getBlockAddress()),AP); 85 break; 86 } 87 88 OutMI.addOperand(MCOp); 89 } 90} 91