MachineInstr.cpp revision 2d90ac7ca6117d3b160dde8a4f322c1079a6ffce
18e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===-- MachineInstr.cpp --------------------------------------------------===// 28e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// 38e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// The LLVM Compiler Infrastructure 48e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file was developed by the LLVM research group and is distributed under 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details. 78e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// 88e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner//===----------------------------------------------------------------------===// 98e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// 108e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// Methods common to all machine instructions. 118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// 128e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// FIXME: Now that MachineInstrs have parent pointers, they should always 138e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// print themselves using their MachineFunction's TargetMachine. 148e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// 15df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner//===----------------------------------------------------------------------===// 16df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 17ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson#include "llvm/CodeGen/MachineInstr.h" 18c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/CodeGen/MachineFunction.h" 198e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner#include "llvm/Value.h" 20d185f64f828ce1f8b476807a4a1345c0c53d8213Chris Lattner#include "llvm/Target/TargetMachine.h" 2192bcb426c3e4503c99324afd4ed0a73521711a56Chris Lattner#include "llvm/Target/TargetInstrInfo.h" 22df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "llvm/Target/MRegisterInfo.h" 23df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner#include "llvm/Support/LeakDetector.h" 24bcef7df6ec9aba7c5009a4d33944f80227563665Duncan Sands#include <iostream> 25a896176973d59d8e22514b363d31e8d1becf185eChris Lattner 265679d18c54ef46170e46f51bf471bb334f2b6525Misha Brukmanusing namespace llvm; 278e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 288e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// Global variable holding an array of descriptors for machine instructions. 29df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// The actual object needs to be created separately for each target machine. 30eeb4a84ac8d91fb1d5a7c484a1c7047409faee30Chris Lattner// This variable is initialized and reset by class TargetInstrInfo. 31df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// 32df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// FIXME: This should be a property of the target so that more than one target 33df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner// at a time can be active... 348e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner// 358e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnernamespace llvm { 368e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner extern const TargetInstrDescriptor *TargetInstrDescriptors; 378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 388e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 398e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// MachineInstr ctor - This constructor only does a _reserve_ of the operands, 408e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// not a resize for them. It is expected that if you use this that you call 418e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// add* methods below to fill up the operands, instead of the Set methods. 42df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner/// Eventually, the "resizing" ctors will be phased out. 438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// 448e3a8e0452695643d04c21e15c94b802aef81baeChris LattnerMachineInstr::MachineInstr(short opcode, unsigned numOperands, bool XX, bool YY) 458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner : Opcode(opcode), parent(0) { 468e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner operands.reserve(numOperands); 478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Make sure that we get added to a machine basicblock 488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner LeakDetector::addGarbageObject(this); 49df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner} 508e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 518e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the 528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// MachineInstr is created and added to the end of the specified basic block. 538e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// 548e3a8e0452695643d04c21e15c94b802aef81baeChris LattnerMachineInstr::MachineInstr(MachineBasicBlock *MBB, short opcode, 558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner unsigned numOperands) 56df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner : Opcode(opcode), parent(0) { 578e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner assert(MBB && "Cannot use inserting ctor with null basic block!"); 588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner operands.reserve(numOperands); 598e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Make sure that we get added to a machine basicblock 608e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner LeakDetector::addGarbageObject(this); 618e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner MBB->push_back(this); // Add instruction to end of basic block! 628e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 638e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 648e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// MachineInstr ctor - Copies MachineInstr arg exactly 658e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// 668e3a8e0452695643d04c21e15c94b802aef81baeChris LattnerMachineInstr::MachineInstr(const MachineInstr &MI) { 678e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner Opcode = MI.getOpcode(); 682c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling operands.reserve(MI.getNumOperands()); 698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 70df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner // Add operands 718e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner for (unsigned i = 0; i < MI.getNumOperands(); ++i) 728e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner operands.push_back(MachineOperand(MI.getOperand(i))); 738e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 748e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Set parent, next, and prev to null 758e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner parent = 0; 768e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner prev = 0; 77df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner next = 0; 78df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner} 798e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 808e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 818e3a8e0452695643d04c21e15c94b802aef81baeChris LattnerMachineInstr::~MachineInstr() { 828e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner LeakDetector::removeGarbageObject(this); 838e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 848e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 858e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// clone - Create a copy of 'this' instruction that is identical in all ways 868e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// except the following: the new instruction has no parent and it has no name 878e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// 888e3a8e0452695643d04c21e15c94b802aef81baeChris LattnerMachineInstr* MachineInstr::clone() const { 898e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return new MachineInstr(*this); 908e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 918e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 928e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// removeFromParent - This method unlinks 'this' from the containing basic 938e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// block, and returns it, but does not delete it. 948e3a8e0452695643d04c21e15c94b802aef81baeChris LattnerMachineInstr *MachineInstr::removeFromParent() { 958e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner assert(getParent() && "Not embedded in a basic block!"); 968e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner getParent()->remove(this); 978e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return this; 988e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 998e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1008e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1018e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner/// OperandComplete - Return true if it's illegal to add a new operand 102d343c6b70ec03b357d42e47ce7c00b3c3cb78efdChris Lattner/// 103df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattnerbool MachineInstr::OperandsComplete() const { 1048e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner int NumOperands = TargetInstrDescriptors[Opcode].numOperands; 1058e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands) 1061b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen return true; // Broken: we have all the operands of this instruction! 1071b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen return false; 1081b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen} 1091b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen 1101b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesenvoid MachineInstr::dump() const { 1111b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen std::cerr << " " << *this; 1121b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen} 1131b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen 1141b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesenstatic inline std::ostream& OutputValue(std::ostream &os, const Value* val) { 1151b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen os << "(val "; 1161b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen os << (void*) val; // print address always 1171b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen if (val && val->hasName()) 1181b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen os << " " << val->getName(); // print name also, if available 1191b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen os << ")"; 1201b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen return os; 1211b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen} 1221b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen 1231b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesenstatic inline void OutputReg(std::ostream &os, unsigned RegNo, 1241b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen const MRegisterInfo *MRI = 0) { 1251b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen if (!RegNo || MRegisterInfo::isPhysicalRegister(RegNo)) { 1261b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen if (MRI) 1271b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen os << "%" << MRI->get(RegNo).Name; 1281b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen else 1291b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen os << "%mreg(" << RegNo << ")"; 1301b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen } else 1311b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen os << "%reg" << RegNo; 1321b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen} 1331b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen 1341b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesenstatic void print(const MachineOperand &MO, std::ostream &OS, 1351b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen const TargetMachine *TM) { 1361b25cb2416c46a6cebf2a6c52235e9fe46a10d11Dale Johannesen const MRegisterInfo *MRI = 0; 1378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1388e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (TM) MRI = TM->getRegisterInfo(); 1398e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1408e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner switch (MO.getType()) { 1412c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling case MachineOperand::MO_Register: 1428e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OutputReg(OS, MO.getReg(), MRI); 1438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner break; 1448e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case MachineOperand::MO_Immediate: 1458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << (long)MO.getImmedValue(); 1468e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner break; 1478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case MachineOperand::MO_MachineBasicBlock: 1488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << "mbb<" 1498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 1508e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner << "," << (void*)MO.getMachineBasicBlock() << ">"; 1518e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner break; 1528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case MachineOperand::MO_FrameIndex: 1538e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << "<fi#" << MO.getFrameIndex() << ">"; 1548e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner break; 1558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case MachineOperand::MO_ConstantPoolIndex: 1568e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 1578e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner break; 1588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case MachineOperand::MO_JumpTableIndex: 1598e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << "<jt#" << MO.getJumpTableIndex() << ">"; 1608e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner break; 1618e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case MachineOperand::MO_GlobalAddress: 1628e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << "<ga:" << ((Value*)MO.getGlobal())->getName(); 1638e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (MO.getOffset()) OS << "+" << MO.getOffset(); 1648e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << ">"; 1658e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner break; 1668e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case MachineOperand::MO_ExternalSymbol: 1678e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << "<es:" << MO.getSymbolName(); 1688e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (MO.getOffset()) OS << "+" << MO.getOffset(); 1698e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << ">"; 1708e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner break; 1718e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner default: 1728e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner assert(0 && "Unrecognized operand type"); 1738e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 1748e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 1758e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1768e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine *TM) const { 1778e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner unsigned StartOp = 0; 1788e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1798e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Specialize printing if op#0 is definition 1808e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (getNumOperands() && getOperand(0).isDef() && !getOperand(0).isUse()) { 1818e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ::print(getOperand(0), OS, TM); 1828e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << " = "; 1838e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ++StartOp; // Don't print this operand again! 1848e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 1858e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 186ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson // Must check if Target machine is not null because machine BB could not 187ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson // be attached to a Machine function yet 188ff6c91efcf62d1cb99343fdcb2de6271520a1981Owen Anderson if (TM) 1898e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << TM->getInstrInfo()->getName(getOpcode()); 1908e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1918e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) { 1928e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner const MachineOperand& mop = getOperand(i); 1938e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (i != StartOp) 1948e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << ","; 1958e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << " "; 1968e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner ::print(mop, OS, TM); 1978e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 1988e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (mop.isDef()) 1998e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (mop.isUse()) 2008e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << "<def&use>"; 2018e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner else 2028e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << "<def>"; 2038e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 2048e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 2052c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling OS << "\n"; 2068e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 2072c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling 2088e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerstd::ostream &llvm::operator<<(std::ostream &os, const MachineInstr &MI) { 2092c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling // If the instruction is embedded into a basic block, we can find the target 2108e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // info for the instruction. 2118e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (const MachineBasicBlock *MBB = MI.getParent()) { 2128e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner const MachineFunction *MF = MBB->getParent(); 213df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner if (MF) 2148e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner MI.print(os, &MF->getTarget()); 2152c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling else 2168e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner MI.print(os, 0); 2178e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return os; 2188e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 2198e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 2208e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // Otherwise, print it out in the "raw" format without symbolic register names 2218e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner // and such. 2222c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling os << TargetInstrDescriptors[MI.getOpcode()].Name; 223df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 224df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner for (unsigned i = 0, N = MI.getNumOperands(); i < N; i++) { 2258e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner os << "\t" << MI.getOperand(i); 2268e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (MI.getOperand(i).isDef()) 2278e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner if (MI.getOperand(i).isUse()) 2288e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner os << "<d&u>"; 2298e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner else 2308e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner os << "<d>"; 2318e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner } 2328e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 2338e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner return os << "\n"; 2348e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner} 2358e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner 2368e3a8e0452695643d04c21e15c94b802aef81baeChris Lattnerstd::ostream &llvm::operator<<(std::ostream &OS, const MachineOperand &MO) { 2378e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner switch (MO.getType()) { 2388e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case MachineOperand::MO_Register: 239df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner OutputReg(OS, MO.getReg()); 240df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner break; 2418e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case MachineOperand::MO_Immediate: 2428e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << (long)MO.getImmedValue(); 2438e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner break; 244df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner case MachineOperand::MO_MachineBasicBlock: 2458e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << "<mbb:" 246df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 2478e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner << "@" << (void*)MO.getMachineBasicBlock() << ">"; 2488e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner break; 2498e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case MachineOperand::MO_FrameIndex: 250df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner OS << "<fi#" << MO.getFrameIndex() << ">"; 251df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner break; 2528e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case MachineOperand::MO_ConstantPoolIndex: 253df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 2548e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner break; 2558e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case MachineOperand::MO_JumpTableIndex: 2568e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << "<jt#" << MO.getJumpTableIndex() << ">"; 257eff2ab61b5d411fe64ba601d402b7c549644b590Devang Patel break; 2588e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case MachineOperand::MO_GlobalAddress: 2598e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">"; 2602c6fd8c7ceea0392635ce21038d2b7fc215d9116Bill Wendling break; 2618e3a8e0452695643d04c21e15c94b802aef81baeChris Lattner case MachineOperand::MO_ExternalSymbol: 262df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner OS << "<es:" << MO.getSymbolName() << ">"; 263df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner break; 264df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner default: 265df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner assert(0 && "Unrecognized operand type"); 266df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner break; 267df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner } 268df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner 269df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner return OS; 270df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner} 271df98617b23315e427cc4fad8ccfdd50d68bec2f9Chris Lattner