MachineInstr.cpp revision 2a90ba60175f93e7438165d8423100aa573c16c5
1035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===-- MachineInstr.cpp --------------------------------------------------===// 270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 5b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// This file was developed by the LLVM research group and is distributed under 6b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 7b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 9b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 10035dfbe7f2d109008d2d62d9f2a67efb477a7ab6Chris Lattner//===----------------------------------------------------------------------===// 1170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 12822b4fb896846b87dd11a330ae13f2239329aeefChris Lattner#include "llvm/CodeGen/MachineInstr.h" 13ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner#include "llvm/CodeGen/MachineBasicBlock.h" 143801f6d38371b734d9de2fb8394ca75d2bf190ebChris Lattner#include "llvm/Value.h" 151049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner#include "llvm/Target/TargetMachine.h" 163501feab811c86c9659248a4875fc31a3165f84dChris Lattner#include "llvm/Target/TargetInstrInfo.h" 172a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner#include "llvm/Target/MRegisterInfo.h" 188d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner 19d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 20d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 21f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// Global variable holding an array of descriptors for machine instructions. 22f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// The actual object needs to be created separately for each target machine. 233501feab811c86c9659248a4875fc31a3165f84dChris Lattner// This variable is initialized and reset by class TargetInstrInfo. 24f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// 25f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// FIXME: This should be a property of the target so that more than one target 26f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// at a time can be active... 27f1757c414cbf7d1b7a11cc8287fd26c2ce13fb41Chris Lattner// 283501feab811c86c9659248a4875fc31a3165f84dChris Lattnerextern const TargetInstrDescriptor *TargetInstrDescriptors; 2969917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka 301885da4f49cf32efde2d4c840365c4333a0c8579Vikram S. Adve// Constructor for instructions with variable #operands 312a90ba60175f93e7438165d8423100aa573c16c5Chris LattnerMachineInstr::MachineInstr(MachineOpCode opcode, unsigned numOperands) 322a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner : Opcode(opcode), operands(numOperands, MachineOperand()), numImplicitRefs(0){ 33413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner} 34413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 35ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - This constructor only does a _reserve_ of the operands, 36ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// not a resize for them. It is expected that if you use this that you call 37ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// add* methods below to fill up the operands, instead of the Set methods. 38ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// Eventually, the "resizing" ctors will be phased out. 39ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// 402a90ba60175f93e7438165d8423100aa573c16c5Chris LattnerMachineInstr::MachineInstr(MachineOpCode opcode, unsigned numOperands, 41a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve bool XX, bool YY) 422a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner : Opcode(opcode), numImplicitRefs(0) { 437279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner operands.reserve(numOperands); 447279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner} 457279122e668816bed0d4f38d3392bbab0140fad0Chris Lattner 46ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr ctor - Work exactly the same as the ctor above, except that the 47ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// MachineInstr is created and added to the end of the specified basic block. 48ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner/// 492a90ba60175f93e7438165d8423100aa573c16c5Chris LattnerMachineInstr::MachineInstr(MachineBasicBlock *MBB, MachineOpCode opcode, 50ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner unsigned numOperands) 512a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner : Opcode(opcode), numImplicitRefs(0) { 52ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner assert(MBB && "Cannot use inserting ctor with null basic block!"); 53ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner operands.reserve(numOperands); 54ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner MBB->push_back(this); // Add instruction to end of basic block! 55ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner} 56ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner 57ddd7fcb887be752ec8167276a697994ad9cb9c4eChris Lattner 58413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner// OperandComplete - Return true if it's illegal to add a new operand 592a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnerbool MachineInstr::OperandsComplete() const { 602a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner int NumOperands = TargetInstrDescriptors[Opcode].numOperands; 61a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve if (NumOperands >= 0 && getNumOperands() >= (unsigned)NumOperands) 623497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve return true; // Broken: we have all the operands of this instruction! 63413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner return false; 6470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 6570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 66413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner 67e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// 68e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// Support for replacing opcode and operands of a MachineInstr in place. 69e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// This only resets the size of the operand vector and initializes it. 70e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// The new operands must be set explicitly later. 71e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve// 722a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnervoid MachineInstr::replace(MachineOpCode opcode, unsigned numOperands) { 73a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(getNumImplicitRefs() == 0 && 74a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve "This is probably broken because implicit refs are going to be lost."); 752a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner Opcode = opcode; 76e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve operands.clear(); 77413746e9833d97a8b463ef6a788aa326cf3829a2Chris Lattner operands.resize(numOperands, MachineOperand()); 78e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve} 79e8b57ef2603ed522083dc18e559ca4e20abf22aeVikram S. Adve 80a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattnervoid MachineInstr::SetMachineOperandVal(unsigned i, 81a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner MachineOperand::MachineOperandType opTy, 82a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner Value* V) { 83a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < operands.size()); // may be explicit or implicit op 84a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattner operands[i].opType = opTy; 85572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].value = V; 86572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].regNum = -1; 8770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 8870bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 8970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Advevoid 90572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris LattnerMachineInstr::SetMachineOperandConst(unsigned i, 9170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve MachineOperand::MachineOperandType operandType, 922a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner int64_t intValue) { 93a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands()); // must be explicit op 942a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner assert(TargetInstrDescriptors[Opcode].resultPos != (int) i && 95c356e565a69e56993d018c7d94194e504a78285fVikram S. Adve "immed. constant cannot be defined"); 96572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 97572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].opType = operandType; 98572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].value = NULL; 99572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].immedVal = intValue; 100572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].regNum = -1; 101572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].flags = 0; 10270bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 10370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 104a2dd745613fdb9deff6037285f4efc20248c7b3dChris Lattnervoid MachineInstr::SetMachineOperandReg(unsigned i, int regNum) { 105a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands()); // must be explicit op 106572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner 1072f305989b395a0a8bf00c4b9dc140a6df051245eChris Lattner operands[i].opType = MachineOperand::MO_MachineRegister; 108572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].value = NULL; 109572f5c8c0cf66cd6f53dda255cd8c4d8f27d8505Chris Lattner operands[i].regNum = regNum; 11070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 11170bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 1122a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnervoid MachineInstr::SetRegForOperand(unsigned i, int regNum) { 113a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve assert(i < getNumOperands()); // must be explicit op 1147a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve operands[i].setRegForValue(regNum); 1157a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve} 1167a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve 1172a90ba60175f93e7438165d8423100aa573c16c5Chris Lattnervoid MachineInstr::SetRegForImplicitRef(unsigned i, int regNum) { 1183497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve getImplicitOp(i).setRegForValue(regNum); 1193497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve} 1203497782f3843007de3be0c43e3ff206a01e2ccacVikram S. Adve 1217a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve 1226eba07a6a3dacec09aefa54a305b06c98b0c86c1Misha Brukman// Substitute all occurrences of Value* oldVal with newVal in all operands 123627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve// and all implicit refs. 124627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve// If defsOnly == true, substitute defs only. 125e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adveunsigned 126627eb31cd791f808eaa048478d01222577a30a1aVikram S. AdveMachineInstr::substituteValue(const Value* oldVal, Value* newVal, 127627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve bool defsOnly, bool notDefsAndUses, 128627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve bool& someArgsWereIgnored) 129e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve{ 1302010f7baec18914b8a5d1b2b4c3c21511fa6e25dVikram S. Adve assert((!defsOnly || !notDefsAndUses) && 1312010f7baec18914b8a5d1b2b4c3c21511fa6e25dVikram S. Adve "notDefsAndUses is irrelevant if defsOnly == true."); 132627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve 133e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve unsigned numSubst = 0; 134e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 1356eba07a6a3dacec09aefa54a305b06c98b0c86c1Misha Brukman // Substitute operands 136e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve for (MachineInstr::val_op_iterator O = begin(), E = end(); O != E; ++O) 137e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve if (*O == oldVal) 138627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve if (!defsOnly || 1394d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos notDefsAndUses && (O.isDef() && !O.isUse()) || 1404d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos !notDefsAndUses && O.isDef()) 141e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve { 142e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve O.getMachineOperand().value = newVal; 143e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve ++numSubst; 144e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve } 145627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve else 146627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve someArgsWereIgnored = true; 147e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 1486eba07a6a3dacec09aefa54a305b06c98b0c86c1Misha Brukman // Substitute implicit refs 149a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve for (unsigned i=0, N=getNumImplicitRefs(); i < N; ++i) 15027a08935ca4ccf2121c2cf4bfbf148e2382c7762Chris Lattner if (getImplicitRef(i) == oldVal) 151627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve if (!defsOnly || 1524d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos notDefsAndUses && (getImplicitOp(i).isDef() && !getImplicitOp(i).isUse()) || 1534d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos !notDefsAndUses && getImplicitOp(i).isDef()) 154e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve { 155a2bae305fb5a870c4ef753ed290a7ddea73ec82bVikram S. Adve getImplicitOp(i).value = newVal; 156e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve ++numSubst; 157e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve } 158627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve else 159627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve someArgsWereIgnored = true; 160e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 161e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve return numSubst; 162e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve} 163e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 164e2a78e31862c2b6142491db5a67065756d6870beVikram S. Adve 1657a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Advevoid 1667a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. AdveMachineInstr::dump() const 1677a4be9580e095ca4bffd16ec6ec4882f6270fb09Vikram S. Adve{ 168925b771dc378d6c88da44cd5b6650f2758c3c0a7Chris Lattner std::cerr << " " << *this; 16970bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 17070bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 1718c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Advestatic inline std::ostream& 1728c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. AdveOutputValue(std::ostream &os, const Value* val) 17393240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve{ 17493240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve os << "(val "; 175627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve os << (void*) val; // print address always 17693240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve if (val && val->hasName()) 177627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve os << " " << val->getName() << ")"; // print name also, if available 178627eb31cd791f808eaa048478d01222577a30a1aVikram S. Adve return os; 17993240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve} 18093240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve 1812a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattnerstatic inline void OutputReg(std::ostream &os, unsigned RegNo, 1822a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner const MRegisterInfo *MRI = 0) { 1832a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner if (MRI) { 1842a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner if (RegNo < MRegisterInfo::FirstVirtualRegister) 1852a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner os << "%" << MRI->get(RegNo).Name; 1862a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner else 1872a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner os << "%reg" << RegNo; 1882a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner } else 1892a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner os << "%mreg(" << RegNo << ")"; 1908c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve} 1918c6936a58b75d7d185014839ea95377eb2fbd878Vikram S. Adve 1921049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattnerstatic void print(const MachineOperand &MO, std::ostream &OS, 1931049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner const TargetMachine &TM) { 1942a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner const MRegisterInfo *MRI = TM.getRegisterInfo(); 1951049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner bool CloseParen = true; 1964d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MO.isHiBits32()) 1971049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%lm("; 1984d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isLoBits32()) 1991049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%lo("; 2004d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isHiBits64()) 2011049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%hh("; 2024d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isLoBits64()) 2031049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%hm("; 2041049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner else 2051049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner CloseParen = false; 2061049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 2071049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner switch (MO.getType()) { 2081049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_VirtualRegister: 2091049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.getVRegValue()) { 2101049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%reg"; 2111049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OutputValue(OS, MO.getVRegValue()); 2121049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.hasAllocatedReg()) 2131049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "=="; 2141049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2151049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.hasAllocatedReg()) 2162a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner OutputReg(OS, MO.getAllocatedRegNum(), MRI); 2171049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2181049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_CCRegister: 2191049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%ccreg"; 2201049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OutputValue(OS, MO.getVRegValue()); 2211049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (MO.hasAllocatedReg()) { 2221049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "=="; 2232a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner OutputReg(OS, MO.getAllocatedRegNum(), MRI); 2241049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2251049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2261049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_MachineRegister: 2272a79a0927c479b69316aa275c1f79c74d20e8040Chris Lattner OutputReg(OS, MO.getMachineRegNum(), MRI); 2281049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2291049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_SignExtendedImmed: 2301049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << (long)MO.getImmedValue(); 2311049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2321049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_UnextendedImmed: 2331049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << (long)MO.getImmedValue(); 2341049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2351049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner case MachineOperand::MO_PCRelativeDisp: { 2361049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner const Value* opVal = MO.getVRegValue(); 2371049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal); 2381049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "%disp(" << (isLabel? "label " : "addr-of-val "); 2391049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (opVal->hasName()) 2401049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << opVal->getName(); 2411049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner else 2421049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << (const void*) opVal; 2431049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << ")"; 2441049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner break; 2451049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2462109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner case MachineOperand::MO_MachineBasicBlock: 2472109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner OS << "bb<" 2482109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 2492109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << "," << (void*)MO.getMachineBasicBlock()->getBasicBlock() << ">"; 2502109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner break; 25110cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner case MachineOperand::MO_FrameIndex: 25210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "<fi#" << MO.getFrameIndex() << ">"; 25310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner break; 2548d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ConstantPoolIndex: 2558d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 2568d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 2578d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_GlobalAddress: 2588d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">"; 2598d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 2608d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ExternalSymbol: 2618d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<es:" << MO.getSymbolName() << ">"; 2628d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 2631049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner default: 2641049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner assert(0 && "Unrecognized operand type"); 2651049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2661049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 2671049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (CloseParen) 2681049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << ")"; 2691049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 2701049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 271af55be15dfa5321f470ce9734fabd858f5af7a88Chris Lattnervoid MachineInstr::print(std::ostream &OS, const TargetMachine &TM) const { 2726a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner unsigned StartOp = 0; 2736a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 2746a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner // Specialize printing if op#0 is definition 2754d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (getNumOperands() && getOperand(0).isDef() && !getOperand(0).isUse()) { 276d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke llvm::print(getOperand(0), OS, TM); 2776a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " = "; 2786a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner ++StartOp; // Don't print this operand again! 2796a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner } 2801049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << TM.getInstrInfo().getName(getOpcode()); 2816a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 2826a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner for (unsigned i = StartOp, e = getNumOperands(); i != e; ++i) { 2835f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve const MachineOperand& mop = getOperand(i); 2846a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner if (i != StartOp) 2856a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << ","; 2866a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner OS << " "; 287d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke llvm::print(mop, OS, TM); 2886a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 2894d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (mop.isDef()) 2904d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (mop.isUse()) 2914d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos OS << "<def&use>"; 2924d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else 2934d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos OS << "<def>"; 2941049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 2956a592271fb2946a0704b06fd66199987cdd40b3cChris Lattner 2966eba07a6a3dacec09aefa54a305b06c98b0c86c1Misha Brukman // code for printing implicit references 2971049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner if (getNumImplicitRefs()) { 2981049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\tImplicitRefs: "; 2991049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner for(unsigned i = 0, e = getNumImplicitRefs(); i != e; ++i) { 3001049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\t"; 3015f2180c53330502eb2f0f5bf3f21a838ad800906Vikram S. Adve OutputValue(OS, getImplicitRef(i)); 3024d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (getImplicitOp(i).isDef()) 3034d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (getImplicitOp(i).isUse()) 3044d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos OS << "<def&use>"; 3054d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else 3064d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos OS << "<def>"; 3071049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 3081049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 3091049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 3101049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner OS << "\n"; 3111049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner} 3121049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 3131049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner 3148d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattnerstd::ostream &operator<<(std::ostream& os, const MachineInstr& MI) 31570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve{ 3162a90ba60175f93e7438165d8423100aa573c16c5Chris Lattner os << TargetInstrDescriptors[MI.getOpcode()].Name; 31770bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 3188d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner for (unsigned i=0, N=MI.getNumOperands(); i < N; i++) { 3198d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner os << "\t" << MI.getOperand(i); 3204d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MI.getOperand(i).isDef()) 3214d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MI.getOperand(i).isUse()) 3224d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos os << "<d&u>"; 3234d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else 3244d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos os << "<d>"; 3258d24337eea5f9462908b7ac07a997935e31ddd59Ruchira Sasanka } 32670bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 3276eba07a6a3dacec09aefa54a305b06c98b0c86c1Misha Brukman // code for printing implicit references 3288d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner unsigned NumOfImpRefs = MI.getNumImplicitRefs(); 3298d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner if (NumOfImpRefs > 0) { 33093240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve os << "\tImplicit: "; 3318d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner for (unsigned z=0; z < NumOfImpRefs; z++) { 3328d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OutputValue(os, MI.getImplicitRef(z)); 3334d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MI.getImplicitOp(z).isDef()) 3344d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MI.getImplicitOp(z).isUse()) 3354d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos os << "<d&u>"; 3364d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else 3374d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos os << "<d>"; 33807c7086bd29b5c7223945cbdeae48494874de38fRuchira Sasanka os << "\t"; 33969917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka } 34069917e27af9248cbce98bb56f1e1b5286aede759Ruchira Sasanka } 34193240fe6b1f79e9ccb271a214a01141f8c2c123aVikram S. Adve 342697954c15da58bd8b186dbafdedd8b06db770201Chris Lattner return os << "\n"; 34370bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 34470bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve 34510cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattnerstd::ostream &operator<<(std::ostream &OS, const MachineOperand &MO) 3466e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve{ 3474d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos if (MO.isHiBits32()) 34810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%lm("; 3494d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isLoBits32()) 35010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%lo("; 3514d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isHiBits64()) 35210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%hh("; 3534d7af65903cbc858464362e70a6adf499982ec8aAlkis Evlogimenos else if (MO.isLoBits64()) 35410cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%hm("; 3553bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve 3562109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner switch (MO.getType()) 3576e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve { 3586e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_VirtualRegister: 3598d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner if (MO.hasAllocatedReg()) 36010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OutputReg(OS, MO.getAllocatedRegNum()); 3618d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner 3628d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner if (MO.getVRegValue()) { 3638d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner if (MO.hasAllocatedReg()) OS << "=="; 3648d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "%vreg"; 3658d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OutputValue(OS, MO.getVRegValue()); 3661049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 3673bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 3686e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_CCRegister: 36910cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%ccreg"; 37010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OutputValue(OS, MO.getVRegValue()); 3712109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner if (MO.hasAllocatedReg()) { 37210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "=="; 37310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OutputReg(OS, MO.getAllocatedRegNum()); 3741049164aa6b06d91d9b3b557a9a213eaf3f6319aChris Lattner } 3753bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 3763bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve case MachineOperand::MO_MachineRegister: 37710cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OutputReg(OS, MO.getMachineRegNum()); 3783bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 3796e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_SignExtendedImmed: 38010cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << (long)MO.getImmedValue(); 3813bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 3826e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_UnextendedImmed: 38310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << (long)MO.getImmedValue(); 3843bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 3856e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve case MachineOperand::MO_PCRelativeDisp: 386e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve { 3872109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner const Value* opVal = MO.getVRegValue(); 3884d669b510c1d609c6b3fe98ac14ae38bd7c011f6Chris Lattner bool isLabel = isa<Function>(opVal) || isa<BasicBlock>(opVal); 38910cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "%disp(" << (isLabel? "label " : "addr-of-val "); 390d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve if (opVal->hasName()) 39110cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << opVal->getName(); 392d9beb975f20cea2d3e9c3f528068cd25b80a1b72Vikram S. Adve else 39310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << (const void*) opVal; 39410cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << ")"; 3953bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve break; 396e949da5bb18f89de40b6781237dfe616cba7bfc9Vikram S. Adve } 3972109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner case MachineOperand::MO_MachineBasicBlock: 39810cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "bb<" 3992109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << ((Value*)MO.getMachineBasicBlock()->getBasicBlock())->getName() 4002109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner << "," << (void*)MO.getMachineBasicBlock()->getBasicBlock() << ">"; 4012109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner break; 40210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner case MachineOperand::MO_FrameIndex: 40310cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << "<fi#" << MO.getFrameIndex() << ">"; 40410cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner break; 4058d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ConstantPoolIndex: 4068d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<cp#" << MO.getConstantPoolIndex() << ">"; 4078d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 4088d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_GlobalAddress: 4098d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<ga:" << ((Value*)MO.getGlobal())->getName() << ">"; 4108d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 4118d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner case MachineOperand::MO_ExternalSymbol: 4128d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner OS << "<es:" << MO.getSymbolName() << ">"; 4138d95ef4973226044cefdd6dc237d3c326ffc15b3Chris Lattner break; 4146e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve default: 4156e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve assert(0 && "Unrecognized operand type"); 4166e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve break; 4176e447181928b95902c38ea89e57bc835ecd83cb5Vikram S. Adve } 418e6fdb11e1ae823d69e646e76828ccb5d427a9d3aChris Lattner 4192109f502d646a1bafc7b21a14347a71771a7b4cfChris Lattner if (MO.flags & 4203bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve (MachineOperand::HIFLAG32 | MachineOperand::LOFLAG32 | 4213bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve MachineOperand::HIFLAG64 | MachineOperand::LOFLAG64)) 42210cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner OS << ")"; 4233bc9ef9317982cd7157ff29fb6bc3a60a11c3f78Vikram S. Adve 42410cb79b48430ea7679e83ae045aaeadea04a0cc5Chris Lattner return OS; 42570bc4b5d1a3795a8f41be96723cfcbccac8e1671Vikram S. Adve} 426d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 427d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 428