AsmWriter.cpp revision 009505452b713ed2e3a8e99c5545a6e721c65495
1009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//===-- Writer.cpp - Library for Printing VM assembly files ------*- C++ -*--=// 2009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 3009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// This library implements the functionality defined in llvm/Assembly/Writer.h 4009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 5009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// This library uses the Analysis library to figure out offsets for 6009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// variables in the method tables... 7009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 8009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// TODO: print out the type name instead of the full type if a particular type 9009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// is in the symbol table... 10009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 11009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//===----------------------------------------------------------------------===// 12009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 13009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/Assembly/Writer.h" 14009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/Analysis/SlotCalculator.h" 15009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/Module.h" 16009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/Method.h" 17009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/BasicBlock.h" 18009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/ConstPoolVals.h" 19009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/iOther.h" 20009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner#include "llvm/iMemory.h" 21009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 22009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnerclass AssemblyWriter : public ModuleAnalyzer { 23009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner ostream &Out; 24009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner SlotCalculator &Table; 25009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnerpublic: 26009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner inline AssemblyWriter(ostream &o, SlotCalculator &Tab) : Out(o), Table(Tab) { 27009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 28009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 29009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner inline void write(const Module *M) { processModule(M); } 30009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner inline void write(const Method *M) { processMethod(M); } 31009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner inline void write(const BasicBlock *BB) { processBasicBlock(BB); } 32009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner inline void write(const Instruction *I) { processInstruction(I); } 33009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner inline void write(const ConstPoolVal *CPV) { processConstant(CPV); } 34009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 35009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnerprotected: 36009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner virtual bool visitMethod(const Method *M); 37009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner virtual bool processConstPool(const ConstantPool &CP, bool isMethod); 38009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner virtual bool processConstant(const ConstPoolVal *CPV); 39009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner virtual bool processMethod(const Method *M); 40009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner virtual bool processMethodArgument(const MethodArgument *MA); 41009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner virtual bool processBasicBlock(const BasicBlock *BB); 42009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner virtual bool processInstruction(const Instruction *I); 43009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 44009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnerprivate : 45009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner void writeOperand(const Value *Op, bool PrintType, bool PrintName = true); 46009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner}; 47009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 48009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 49009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 50009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// visitMethod - This member is called after the above two steps, visting each 51009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// method, because they are effectively values that go into the constant pool. 52009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 53009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnerbool AssemblyWriter::visitMethod(const Method *M) { 54009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner return false; 55009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 56009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 57009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnerbool AssemblyWriter::processConstPool(const ConstantPool &CP, bool isMethod) { 58009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Done printing arguments... 59009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (isMethod) Out << ")\n"; 60009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 61009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner ModuleAnalyzer::processConstPool(CP, isMethod); 62009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 63009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (isMethod) 64009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "begin"; 65009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner else 66009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "implementation\n"; 67009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner return false; 68009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 69009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 70009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 71009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// processConstant - Print out a constant pool entry... 72009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 73009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnerbool AssemblyWriter::processConstant(const ConstPoolVal *CPV) { 74009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "\t"; 75009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 76009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Print out name if it exists... 77009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (CPV->hasName()) 78009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "%" << CPV->getName() << " = "; 79009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 80009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Print out the opcode... 81009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << CPV->getType(); 82009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 83009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Write the value out now... 84009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner writeOperand(CPV, false, false); 85009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 86009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (!CPV->hasName() && CPV->getType() != Type::VoidTy) { 87009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner int Slot = Table.getValSlot(CPV); // Print out the def slot taken... 88009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "\t\t; <" << CPV->getType() << ">:"; 89009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (Slot >= 0) Out << Slot; 90009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner else Out << "<badref>"; 91009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 92009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 93009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << endl; 94009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner return false; 95009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 96009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 97009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// processMethod - Process all aspects of a method. 98009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 99009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnerbool AssemblyWriter::processMethod(const Method *M) { 100009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Print out the return type and name... 101009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "\n" << M->getReturnType() << " \"" << M->getName() << "\"("; 102009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Table.incorporateMethod(M); 103009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner ModuleAnalyzer::processMethod(M); 104009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Table.purgeMethod(); 105009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "end\n"; 106009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner return false; 107009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 108009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 109009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// processMethodArgument - This member is called for every argument that 110009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// is passed into the method. Simply print it out 111009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 112009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnerbool AssemblyWriter::processMethodArgument(const MethodArgument *Arg) { 113009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Insert commas as we go... the first arg doesn't get a comma 114009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (Arg != Arg->getParent()->getArgumentList().front()) Out << ", "; 115009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 116009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Output type... 117009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << Arg->getType(); 118009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 119009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Output name, if available... 120009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (Arg->hasName()) 121009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << " %" << Arg->getName(); 122009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner else if (Table.getValSlot(Arg) < 0) 123009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "<badref>"; 124009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 125009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner return false; 126009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 127009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 128009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// processBasicBlock - This member is called for each basic block in a methd. 129009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 130009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnerbool AssemblyWriter::processBasicBlock(const BasicBlock *BB) { 131009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (BB->hasName()) { // Print out the label if it exists... 132009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "\n" << BB->getName() << ":\n"; 133009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } else { 134009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner int Slot = Table.getValSlot(BB); 135009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "\t\t\t\t; <label>:"; 136009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (Slot >= 0) 137009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << Slot << endl; // Extra newline seperates out label's 138009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner else 139009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "<badref>\n"; 140009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 141009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 142009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner ModuleAnalyzer::processBasicBlock(BB); 143009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner return false; 144009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 145009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 146009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// processInstruction - This member is called for each Instruction in a methd. 147009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// 148009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnerbool AssemblyWriter::processInstruction(const Instruction *I) { 149009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "\t"; 150009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 151009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Print out name if it exists... 152009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (I && I->hasName()) 153009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "%" << I->getName() << " = "; 154009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 155009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Print out the opcode... 156009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << I->getOpcode(); 157009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 158009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Print out the type of the operands... 159009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner const Value *Operand = I->getOperand(0); 160009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 161009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Special case conditional branches to swizzle the condition out to the front 162009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (I->getInstType() == Instruction::Br && I->getOperand(1)) { 163009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner writeOperand(I->getOperand(2), true); 164009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << ","; 165009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner writeOperand(Operand, true); 166009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << ","; 167009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner writeOperand(I->getOperand(1), true); 168009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 169009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } else if (I->getInstType() == Instruction::Switch) { 170009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Special case switch statement to get formatting nice and correct... 171009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner writeOperand(Operand , true); Out << ","; 172009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner writeOperand(I->getOperand(1), true); Out << " ["; 173009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 174009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner for (unsigned op = 2; (Operand = I->getOperand(op)); op += 2) { 175009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "\n\t\t"; 176009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner writeOperand(Operand, true); Out << ","; 177009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner writeOperand(I->getOperand(op+1), true); 178009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 179009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "\n\t]"; 180009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 181009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } else if (I->getInstType() == Instruction::Ret && !Operand) { 182009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << " void"; 183009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } else if (I->getInstType() == Instruction::Call) { 184009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner writeOperand(Operand, true); 185009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "("; 186009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Operand = I->getOperand(1); 187009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (Operand) writeOperand(Operand, true); 188009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner for (unsigned op = 2; (Operand = I->getOperand(op)); ++op) { 189009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << ","; 190009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner writeOperand(Operand, true); 191009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 192009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 193009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << " )"; 194009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } else if (I->getInstType() == Instruction::Malloc || 195009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner I->getInstType() == Instruction::Alloca) { 196009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << " " << ((const PointerType*)((ConstPoolType*)Operand) 197009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner ->getValue())->getValueType(); 198009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if ((Operand = I->getOperand(1))) { 199009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << ","; writeOperand(Operand, true); 200009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 201009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 202009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } else if (Operand) { // Print the normal way... 203009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 204009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // PrintAllTypes - Instructions who have operands of all the same type 205009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // omit the type from all but the first operand. If the instruction has 206009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // different type operands (for example br), then they are all printed. 207009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner bool PrintAllTypes = false; 208009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner const Type *TheType = Operand->getType(); 209009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner unsigned i; 210009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 211009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner for (i = 1; (Operand = I->getOperand(i)); i++) { 212009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (Operand->getType() != TheType) { 213009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner PrintAllTypes = true; // We have differing types! Print them all! 214009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner break; 215009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 216009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 217009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 218009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (!PrintAllTypes) 219009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << " " << I->getOperand(0)->getType(); 220009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 221009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner for (unsigned i = 0; (Operand = I->getOperand(i)); i++) { 222009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (i) Out << ","; 223009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner writeOperand(Operand, PrintAllTypes); 224009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 225009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 226009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 227009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // Print a little comment after the instruction indicating which slot it 228009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // occupies. 229009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // 230009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (!I->hasName() && I->getType() != Type::VoidTy) { 231009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner int Slot = Table.getValSlot(I); // Print out the def slot taken... 232009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "\t\t; <" << I->getType() << ">:"; 233009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (Slot >= 0) Out << Slot; 234009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner else Out << "<badref>"; 235009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 236009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "\t[#uses=" << I->use_size() << "]"; // Output # uses 237009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 238009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 239009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << endl; 240009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 241009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner return false; 242009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 243009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 244009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 245009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnervoid AssemblyWriter::writeOperand(const Value *Operand, bool PrintType, 246009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner bool PrintName) { 247009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (PrintType) 248009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << " " << Operand->getType(); 249009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 250009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (Operand->hasName() && PrintName) { 251009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << " %" << Operand->getName(); 252009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } else { 253009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner int Slot = Table.getValSlot(Operand); 254009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 255009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (Operand->getValueType() == Value::ConstantVal) { 256009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << " " << ((ConstPoolVal*)Operand)->getStrValue(); 257009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } else { 258009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (Slot >= 0) Out << " %" << Slot; 259009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner else if (PrintName) 260009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner Out << "<badref>"; // Not embeded into a location? 261009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 262009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 263009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 264009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 265009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 266009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//===----------------------------------------------------------------------===// 267009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner// External Interface declarations 268009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//===----------------------------------------------------------------------===// 269009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 270009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 271009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 272009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnervoid WriteToAssembly(const Module *M, ostream &o) { 273009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (M == 0) { o << "<null> module\n"; return; } 274009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner SlotCalculator SlotTable(M, true); 275009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner AssemblyWriter W(o, SlotTable); 276009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 277009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner W.write(M); 278009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 279009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 280009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnervoid WriteToAssembly(const Method *M, ostream &o) { 281009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (M == 0) { o << "<null> method\n"; return; } 282009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner SlotCalculator SlotTable(M->getParent(), true); 283009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner AssemblyWriter W(o, SlotTable); 284009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 285009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner W.write(M); 286009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 287009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 288009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 289009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnervoid WriteToAssembly(const BasicBlock *BB, ostream &o) { 290009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (BB == 0) { o << "<null> basic block\n"; return; } 291009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 292009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner SlotCalculator SlotTable(BB->getParent(), true); 293009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner AssemblyWriter W(o, SlotTable); 294009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 295009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner W.write(BB); 296009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 297009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 298009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnervoid WriteToAssembly(const ConstPoolVal *CPV, ostream &o) { 299009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (CPV == 0) { o << "<null> constant pool value\n"; return; } 300009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 301009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner SlotCalculator *SlotTable; 302009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 303009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // A Constant pool value may have a parent that is either a method or a 304009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // module. Untangle this now... 305009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner // 306009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (CPV->getParent() == 0 || 307009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner CPV->getParent()->getValueType() == Value::MethodVal) { 308009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner SlotTable = new SlotCalculator((Method*)CPV->getParent(), true); 309009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } else { 310009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner assert(CPV->getParent()->getValueType() == Value::ModuleVal); 311009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner SlotTable = new SlotCalculator((Module*)CPV->getParent(), true); 312009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner } 313009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 314009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner AssemblyWriter W(o, *SlotTable); 315009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner W.write(CPV); 316009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 317009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner delete SlotTable; 318009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 319009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 320009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattnervoid WriteToAssembly(const Instruction *I, ostream &o) { 321009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner if (I == 0) { o << "<null> instruction\n"; return; } 322009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 323009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner SlotCalculator SlotTable(I->getParent() ? I->getParent()->getParent() : 0, 324009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner true); 325009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner AssemblyWriter W(o, SlotTable); 326009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner 327009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner W.write(I); 328009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner} 329