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