e5f9114c8e1f7ece9b26ecf80cafb8393635ff0c
[oota-llvm.git] / lib / VMCore / AsmWriter.cpp
1 //===-- AsmWriter.cpp - Printing LLVM as an assembly file -----------------===//
2 //
3 // This library implements the functionality defined in llvm/Assembly/Writer.h
4 //
5 // TODO: print out the type name instead of the full type if a particular type
6 //       is in the symbol table...
7 //
8 //===----------------------------------------------------------------------===//
9
10 #include "llvm/Assembly/CachedWriter.h"
11 #include "llvm/Assembly/Writer.h"
12 #include "llvm/SlotCalculator.h"
13 #include "llvm/Module.h"
14 #include "llvm/Function.h"
15 #include "llvm/GlobalVariable.h"
16 #include "llvm/BasicBlock.h"
17 #include "llvm/ConstantVals.h"
18 #include "llvm/iMemory.h"
19 #include "llvm/iTerminators.h"
20 #include "llvm/iPHINode.h"
21 #include "llvm/iOther.h"
22 #include "llvm/SymbolTable.h"
23 #include "Support/StringExtras.h"
24 #include "Support/STLExtras.h"
25 #include <algorithm>
26 #include <map>
27 using std::string;
28 using std::map;
29 using std::vector;
30 using std::ostream;
31
32 static const Module *getModuleFromVal(const Value *V) {
33   if (const FunctionArgument *MA = dyn_cast<const FunctionArgument>(V))
34     return MA->getParent() ? MA->getParent()->getParent() : 0;
35   else if (const BasicBlock *BB = dyn_cast<const BasicBlock>(V))
36     return BB->getParent() ? BB->getParent()->getParent() : 0;
37   else if (const Instruction *I = dyn_cast<const Instruction>(V)) {
38     const Function *M = I->getParent() ? I->getParent()->getParent() : 0;
39     return M ? M->getParent() : 0;
40   } else if (const GlobalValue *GV = dyn_cast<const GlobalValue>(V))
41     return GV->getParent();
42   else if (const Module *Mod  = dyn_cast<const Module>(V))
43     return Mod;
44   return 0;
45 }
46
47 static SlotCalculator *createSlotCalculator(const Value *V) {
48   assert(!isa<Type>(V) && "Can't create an SC for a type!");
49   if (const FunctionArgument *FA = dyn_cast<const FunctionArgument>(V)) {
50     return new SlotCalculator(FA->getParent(), true);
51   } else if (const Instruction *I = dyn_cast<const Instruction>(V)) {
52     return new SlotCalculator(I->getParent()->getParent(), true);
53   } else if (const BasicBlock *BB = dyn_cast<const BasicBlock>(V)) {
54     return new SlotCalculator(BB->getParent(), true);
55   } else if (const GlobalVariable *GV = dyn_cast<const GlobalVariable>(V)){
56     return new SlotCalculator(GV->getParent(), true);
57   } else if (const Function *Func = dyn_cast<const Function>(V)) {
58     return new SlotCalculator(Func, true);
59   } else if (const Module *Mod  = dyn_cast<const Module>(V)) {
60     return new SlotCalculator(Mod, true);
61   }
62   return 0;
63 }
64
65 // WriteAsOperand - Write the name of the specified value out to the specified
66 // ostream.  This can be useful when you just want to print int %reg126, not the
67 // whole instruction that generated it.
68 //
69 static void WriteAsOperandInternal(ostream &Out, const Value *V, bool PrintName,
70                                    SlotCalculator *Table) {
71   if (PrintName && V->hasName()) {
72     Out << " %" << V->getName();
73   } else {
74     if (const Constant *CPV = dyn_cast<const Constant>(V)) {
75       Out << " " << CPV->getStrValue();
76     } else {
77       int Slot;
78       if (Table) {
79         Slot = Table->getValSlot(V);
80       } else {
81         if (const Type *Ty = dyn_cast<const Type>(V)) {
82           Out << " " << Ty->getDescription();
83           return;
84         }
85
86         Table = createSlotCalculator(V);
87         if (Table == 0) { Out << "BAD VALUE TYPE!"; return; }
88
89         Slot = Table->getValSlot(V);
90         delete Table;
91       }
92       if (Slot >= 0)  Out << " %" << Slot;
93       else if (PrintName)
94         Out << "<badref>";     // Not embeded into a location?
95     }
96   }
97 }
98
99
100 // If the module has a symbol table, take all global types and stuff their
101 // names into the TypeNames map.
102 //
103 static void fillTypeNameTable(const Module *M,
104                               map<const Type *, string> &TypeNames) {
105   if (M && M->hasSymbolTable()) {
106     const SymbolTable *ST = M->getSymbolTable();
107     SymbolTable::const_iterator PI = ST->find(Type::TypeTy);
108     if (PI != ST->end()) {
109       SymbolTable::type_const_iterator I = PI->second.begin();
110       for (; I != PI->second.end(); ++I) {
111         // As a heuristic, don't insert pointer to primitive types, because
112         // they are used too often to have a single useful name.
113         //
114         const Type *Ty = cast<const Type>(I->second);
115         if (!isa<PointerType>(Ty) ||
116             !cast<PointerType>(Ty)->getElementType()->isPrimitiveType())
117           TypeNames.insert(std::make_pair(Ty, "%"+I->first));
118       }
119     }
120   }
121 }
122
123
124
125 static string calcTypeName(const Type *Ty, vector<const Type *> &TypeStack,
126                            map<const Type *, string> &TypeNames) {
127   if (Ty->isPrimitiveType()) return Ty->getDescription();  // Base case
128
129   // Check to see if the type is named.
130   map<const Type *, string>::iterator I = TypeNames.find(Ty);
131   if (I != TypeNames.end()) return I->second;
132
133   // Check to see if the Type is already on the stack...
134   unsigned Slot = 0, CurSize = TypeStack.size();
135   while (Slot < CurSize && TypeStack[Slot] != Ty) ++Slot; // Scan for type
136
137   // This is another base case for the recursion.  In this case, we know 
138   // that we have looped back to a type that we have previously visited.
139   // Generate the appropriate upreference to handle this.
140   // 
141   if (Slot < CurSize)
142     return "\\" + utostr(CurSize-Slot);       // Here's the upreference
143
144   TypeStack.push_back(Ty);    // Recursive case: Add us to the stack..
145   
146   string Result;
147   switch (Ty->getPrimitiveID()) {
148   case Type::FunctionTyID: {
149     const FunctionType *MTy = cast<const FunctionType>(Ty);
150     Result = calcTypeName(MTy->getReturnType(), TypeStack, TypeNames) + " (";
151     for (FunctionType::ParamTypes::const_iterator
152            I = MTy->getParamTypes().begin(),
153            E = MTy->getParamTypes().end(); I != E; ++I) {
154       if (I != MTy->getParamTypes().begin())
155         Result += ", ";
156       Result += calcTypeName(*I, TypeStack, TypeNames);
157     }
158     if (MTy->isVarArg()) {
159       if (!MTy->getParamTypes().empty()) Result += ", ";
160       Result += "...";
161     }
162     Result += ")";
163     break;
164   }
165   case Type::StructTyID: {
166     const StructType *STy = cast<const StructType>(Ty);
167     Result = "{ ";
168     for (StructType::ElementTypes::const_iterator
169            I = STy->getElementTypes().begin(),
170            E = STy->getElementTypes().end(); I != E; ++I) {
171       if (I != STy->getElementTypes().begin())
172         Result += ", ";
173       Result += calcTypeName(*I, TypeStack, TypeNames);
174     }
175     Result += " }";
176     break;
177   }
178   case Type::PointerTyID:
179     Result = calcTypeName(cast<const PointerType>(Ty)->getElementType(), 
180                           TypeStack, TypeNames) + " *";
181     break;
182   case Type::ArrayTyID: {
183     const ArrayType *ATy = cast<const ArrayType>(Ty);
184     int NumElements = ATy->getNumElements();
185     Result = "[";
186     if (NumElements != -1) Result += itostr(NumElements) + " x ";
187     Result += calcTypeName(ATy->getElementType(), TypeStack, TypeNames) + "]";
188     break;
189   }
190   default:
191     assert(0 && "Unhandled case in getTypeProps!");
192     Result = "<error>";
193   }
194
195   TypeStack.pop_back();       // Remove self from stack...
196   return Result;
197 }
198
199
200 // printTypeInt - The internal guts of printing out a type that has a
201 // potentially named portion.
202 //
203 static ostream &printTypeInt(ostream &Out, const Type *Ty,
204                              map<const Type *, string> &TypeNames) {
205   // Primitive types always print out their description, regardless of whether
206   // they have been named or not.
207   //
208   if (Ty->isPrimitiveType()) return Out << Ty->getDescription();
209
210   // Check to see if the type is named.
211   map<const Type *, string>::iterator I = TypeNames.find(Ty);
212   if (I != TypeNames.end()) return Out << I->second;
213
214   // Otherwise we have a type that has not been named but is a derived type.
215   // Carefully recurse the type hierarchy to print out any contained symbolic
216   // names.
217   //
218   vector<const Type *> TypeStack;
219   string TypeName = calcTypeName(Ty, TypeStack, TypeNames);
220   TypeNames.insert(std::make_pair(Ty, TypeName));//Cache type name for later use
221   return Out << TypeName;
222 }
223
224
225 // WriteTypeSymbolic - This attempts to write the specified type as a symbolic
226 // type, iff there is an entry in the modules symbol table for the specified
227 // type or one of it's component types.  This is slower than a simple x << Type;
228 //
229 ostream &WriteTypeSymbolic(ostream &Out, const Type *Ty, const Module *M) {
230   Out << " "; 
231
232   // If they want us to print out a type, attempt to make it symbolic if there
233   // is a symbol table in the module...
234   if (M && M->hasSymbolTable()) {
235     map<const Type *, string> TypeNames;
236     fillTypeNameTable(M, TypeNames);
237     
238     return printTypeInt(Out, Ty, TypeNames);
239   } else {
240     return Out << Ty->getDescription();
241   }
242 }
243
244
245 // WriteAsOperand - Write the name of the specified value out to the specified
246 // ostream.  This can be useful when you just want to print int %reg126, not the
247 // whole instruction that generated it.
248 //
249 ostream &WriteAsOperand(ostream &Out, const Value *V, bool PrintType, 
250                         bool PrintName, SlotCalculator *Table) {
251   if (PrintType)
252     WriteTypeSymbolic(Out, V->getType(), getModuleFromVal(V));
253
254   WriteAsOperandInternal(Out, V, PrintName, Table);
255   return Out;
256 }
257
258
259
260 class AssemblyWriter {
261   ostream &Out;
262   SlotCalculator &Table;
263   const Module *TheModule;
264   map<const Type *, string> TypeNames;
265 public:
266   inline AssemblyWriter(ostream &o, SlotCalculator &Tab, const Module *M)
267     : Out(o), Table(Tab), TheModule(M) {
268
269     // If the module has a symbol table, take all global types and stuff their
270     // names into the TypeNames map.
271     //
272     fillTypeNameTable(M, TypeNames);
273   }
274
275   inline void write(const Module *M)         { printModule(M);      }
276   inline void write(const GlobalVariable *G) { printGlobal(G);      }
277   inline void write(const Function *F)       { printFunction(F);    }
278   inline void write(const BasicBlock *BB)    { printBasicBlock(BB); }
279   inline void write(const Instruction *I)    { printInstruction(I); }
280   inline void write(const Constant *CPV)     { printConstant(CPV);  }
281   inline void write(const Type *Ty)          { printType(Ty);       }
282
283 private :
284   void printModule(const Module *M);
285   void printSymbolTable(const SymbolTable &ST);
286   void printConstant(const Constant *CPV);
287   void printGlobal(const GlobalVariable *GV);
288   void printFunction(const Function *F);
289   void printFunctionArgument(const FunctionArgument *FA);
290   void printBasicBlock(const BasicBlock *BB);
291   void printInstruction(const Instruction *I);
292   ostream &printType(const Type *Ty);
293
294   void writeOperand(const Value *Op, bool PrintType, bool PrintName = true);
295
296   // printInfoComment - Print a little comment after the instruction indicating
297   // which slot it occupies.
298   void printInfoComment(const Value *V);
299 };
300
301
302 void AssemblyWriter::writeOperand(const Value *Operand, bool PrintType, 
303                                   bool PrintName) {
304   if (PrintType) { Out << " "; printType(Operand->getType()); }
305   WriteAsOperandInternal(Out, Operand, PrintName, &Table);
306 }
307
308
309 void AssemblyWriter::printModule(const Module *M) {
310   // Loop over the symbol table, emitting all named constants...
311   if (M->hasSymbolTable())
312     printSymbolTable(*M->getSymbolTable());
313   
314   for_each(M->gbegin(), M->gend(), 
315            bind_obj(this, &AssemblyWriter::printGlobal));
316
317   Out << "implementation\n";
318   
319   // Output all of the functions...
320   for_each(M->begin(), M->end(), bind_obj(this,&AssemblyWriter::printFunction));
321 }
322
323 void AssemblyWriter::printGlobal(const GlobalVariable *GV) {
324   if (GV->hasName()) Out << "%" << GV->getName() << " = ";
325
326   if (GV->hasInternalLinkage()) Out << "internal ";
327   if (!GV->hasInitializer()) Out << "uninitialized ";
328
329   Out << (GV->isConstant() ? "constant " : "global ");
330   printType(GV->getType()->getElementType());
331
332   if (GV->hasInitializer())
333     writeOperand(GV->getInitializer(), false, false);
334
335   printInfoComment(GV);
336   Out << "\n";
337 }
338
339
340 // printSymbolTable - Run through symbol table looking for named constants
341 // if a named constant is found, emit it's declaration...
342 //
343 void AssemblyWriter::printSymbolTable(const SymbolTable &ST) {
344   for (SymbolTable::const_iterator TI = ST.begin(); TI != ST.end(); ++TI) {
345     SymbolTable::type_const_iterator I = ST.type_begin(TI->first);
346     SymbolTable::type_const_iterator End = ST.type_end(TI->first);
347     
348     for (; I != End; ++I) {
349       const Value *V = I->second;
350       if (const Constant *CPV = dyn_cast<const Constant>(V)) {
351         printConstant(CPV);
352       } else if (const Type *Ty = dyn_cast<const Type>(V)) {
353         Out << "\t%" << I->first << " = type " << Ty->getDescription() << "\n";
354       }
355     }
356   }
357 }
358
359
360 // printConstant - Print out a constant pool entry...
361 //
362 void AssemblyWriter::printConstant(const Constant *CPV) {
363   // Don't print out unnamed constants, they will be inlined
364   if (!CPV->hasName()) return;
365
366   // Print out name...
367   Out << "\t%" << CPV->getName() << " = ";
368
369   // Print out the constant type...
370   printType(CPV->getType());
371
372   // Write the value out now...
373   writeOperand(CPV, false, false);
374
375   if (!CPV->hasName() && CPV->getType() != Type::VoidTy) {
376     int Slot = Table.getValSlot(CPV); // Print out the def slot taken...
377     Out << "\t\t; <";
378     printType(CPV->getType()) << ">:";
379     if (Slot >= 0) Out << Slot;
380     else Out << "<badref>";
381   } 
382
383   Out << "\n";
384 }
385
386 // printFunction - Print all aspects of a function.
387 //
388 void AssemblyWriter::printFunction(const Function *M) {
389   // Print out the return type and name...
390   Out << "\n" << (M->isExternal() ? "declare " : "")
391       << (M->hasInternalLinkage() ? "internal " : "");
392   printType(M->getReturnType()) << " \"" << M->getName() << "\"(";
393   Table.incorporateFunction(M);
394
395   // Loop over the arguments, printing them...
396   const FunctionType *MT = M->getFunctionType();
397
398   if (!M->isExternal()) {
399     for_each(M->getArgumentList().begin(), M->getArgumentList().end(),
400              bind_obj(this, &AssemblyWriter::printFunctionArgument));
401   } else {
402     // Loop over the arguments, printing them...
403     const FunctionType *MT = M->getFunctionType();
404     for (FunctionType::ParamTypes::const_iterator I = MT->getParamTypes().begin(),
405            E = MT->getParamTypes().end(); I != E; ++I) {
406       if (I != MT->getParamTypes().begin()) Out << ", ";
407       printType(*I);
408     }
409   }
410
411   // Finish printing arguments...
412   if (MT->isVarArg()) {
413     if (MT->getParamTypes().size()) Out << ", ";
414     Out << "...";  // Output varargs portion of signature!
415   }
416   Out << ")\n";
417
418   if (!M->isExternal()) {
419     // Loop over the symbol table, emitting all named constants...
420     if (M->hasSymbolTable())
421       printSymbolTable(*M->getSymbolTable());
422
423     Out << "begin";
424   
425     // Output all of its basic blocks... for the function
426     for_each(M->begin(), M->end(),
427              bind_obj(this, &AssemblyWriter::printBasicBlock));
428
429     Out << "end\n";
430   }
431
432   Table.purgeFunction();
433 }
434
435 // printFunctionArgument - This member is called for every argument that 
436 // is passed into the function.  Simply print it out
437 //
438 void AssemblyWriter::printFunctionArgument(const FunctionArgument *Arg) {
439   // Insert commas as we go... the first arg doesn't get a comma
440   if (Arg != Arg->getParent()->getArgumentList().front()) Out << ", ";
441
442   // Output type...
443   printType(Arg->getType());
444   
445   // Output name, if available...
446   if (Arg->hasName())
447     Out << " %" << Arg->getName();
448   else if (Table.getValSlot(Arg) < 0)
449     Out << "<badref>";
450 }
451
452 // printBasicBlock - This member is called for each basic block in a methd.
453 //
454 void AssemblyWriter::printBasicBlock(const BasicBlock *BB) {
455   if (BB->hasName()) {              // Print out the label if it exists...
456     Out << "\n" << BB->getName() << ":";
457   } else {
458     int Slot = Table.getValSlot(BB);
459     Out << "\n; <label>:";
460     if (Slot >= 0) 
461       Out << Slot;         // Extra newline seperates out label's
462     else 
463       Out << "<badref>"; 
464   }
465   Out << "\t\t\t\t\t;[#uses=" << BB->use_size() << "]\n";  // Output # uses
466
467   // Output all of the instructions in the basic block...
468   for_each(BB->begin(), BB->end(),
469            bind_obj(this, &AssemblyWriter::printInstruction));
470 }
471
472
473 // printInfoComment - Print a little comment after the instruction indicating
474 // which slot it occupies.
475 //
476 void AssemblyWriter::printInfoComment(const Value *V) {
477   if (V->getType() != Type::VoidTy) {
478     Out << "\t\t; <";
479     printType(V->getType()) << ">";
480
481     if (!V->hasName()) {
482       int Slot = Table.getValSlot(V); // Print out the def slot taken...
483       if (Slot >= 0) Out << ":" << Slot;
484       else Out << ":<badref>";
485     }
486     Out << " [#uses=" << V->use_size() << "]";  // Output # uses
487   }
488 }
489
490 // printInstruction - This member is called for each Instruction in a methd.
491 //
492 void AssemblyWriter::printInstruction(const Instruction *I) {
493   Out << "\t";
494
495   // Print out name if it exists...
496   if (I && I->hasName())
497     Out << "%" << I->getName() << " = ";
498
499   // Print out the opcode...
500   Out << I->getOpcodeName();
501
502   // Print out the type of the operands...
503   const Value *Operand = I->getNumOperands() ? I->getOperand(0) : 0;
504
505   // Special case conditional branches to swizzle the condition out to the front
506   if (I->getOpcode() == Instruction::Br && I->getNumOperands() > 1) {
507     writeOperand(I->getOperand(2), true);
508     Out << ",";
509     writeOperand(Operand, true);
510     Out << ",";
511     writeOperand(I->getOperand(1), true);
512
513   } else if (I->getOpcode() == Instruction::Switch) {
514     // Special case switch statement to get formatting nice and correct...
515     writeOperand(Operand         , true); Out << ",";
516     writeOperand(I->getOperand(1), true); Out << " [";
517
518     for (unsigned op = 2, Eop = I->getNumOperands(); op < Eop; op += 2) {
519       Out << "\n\t\t";
520       writeOperand(I->getOperand(op  ), true); Out << ",";
521       writeOperand(I->getOperand(op+1), true);
522     }
523     Out << "\n\t]";
524   } else if (isa<PHINode>(I)) {
525     Out << " ";
526     printType(I->getType());
527     Out << " ";
528
529     for (unsigned op = 0, Eop = I->getNumOperands(); op < Eop; op += 2) {
530       if (op) Out << ", ";
531       Out << "[";  
532       writeOperand(I->getOperand(op  ), false); Out << ",";
533       writeOperand(I->getOperand(op+1), false); Out << " ]";
534     }
535   } else if (isa<ReturnInst>(I) && !Operand) {
536     Out << " void";
537   } else if (isa<CallInst>(I)) {
538     const PointerType *PTy = dyn_cast<PointerType>(Operand->getType());
539     const FunctionType*MTy = PTy ? dyn_cast<FunctionType>(PTy->getElementType()):0;
540     const Type      *RetTy = MTy ? MTy->getReturnType() : 0;
541
542     // If possible, print out the short form of the call instruction, but we can
543     // only do this if the first argument is a pointer to a nonvararg function,
544     // and if the value returned is not a pointer to a function.
545     //
546     if (RetTy && !MTy->isVarArg() &&
547         (!isa<PointerType>(RetTy)||!isa<FunctionType>(cast<PointerType>(RetTy)))){
548       Out << " "; printType(RetTy);
549       writeOperand(Operand, false);
550     } else {
551       writeOperand(Operand, true);
552     }
553     Out << "(";
554     if (I->getNumOperands() > 1) writeOperand(I->getOperand(1), true);
555     for (unsigned op = 2, Eop = I->getNumOperands(); op < Eop; ++op) {
556       Out << ",";
557       writeOperand(I->getOperand(op), true);
558     }
559
560     Out << " )";
561   } else if (const InvokeInst *II = dyn_cast<InvokeInst>(I)) {
562     // TODO: Should try to print out short form of the Invoke instruction
563     writeOperand(Operand, true);
564     Out << "(";
565     if (I->getNumOperands() > 3) writeOperand(I->getOperand(3), true);
566     for (unsigned op = 4, Eop = I->getNumOperands(); op < Eop; ++op) {
567       Out << ",";
568       writeOperand(I->getOperand(op), true);
569     }
570
571     Out << " )\n\t\t\tto";
572     writeOperand(II->getNormalDest(), true);
573     Out << " except";
574     writeOperand(II->getExceptionalDest(), true);
575
576   } else if (I->getOpcode() == Instruction::Malloc || 
577              I->getOpcode() == Instruction::Alloca) {
578     Out << " ";
579     printType(cast<const PointerType>(I->getType())->getElementType());
580     if (I->getNumOperands()) {
581       Out << ",";
582       writeOperand(I->getOperand(0), true);
583     }
584   } else if (isa<CastInst>(I)) {
585     writeOperand(Operand, true);
586     Out << " to ";
587     printType(I->getType());
588   } else if (Operand) {   // Print the normal way...
589
590     // PrintAllTypes - Instructions who have operands of all the same type 
591     // omit the type from all but the first operand.  If the instruction has
592     // different type operands (for example br), then they are all printed.
593     bool PrintAllTypes = false;
594     const Type *TheType = Operand->getType();
595
596     for (unsigned i = 1, E = I->getNumOperands(); i != E; ++i) {
597       Operand = I->getOperand(i);
598       if (Operand->getType() != TheType) {
599         PrintAllTypes = true;       // We have differing types!  Print them all!
600         break;
601       }
602     }
603
604     // Shift Left & Right print both types even for Ubyte LHS
605     if (isa<ShiftInst>(I)) PrintAllTypes = true;
606
607     if (!PrintAllTypes) {
608       Out << " ";
609       printType(I->getOperand(0)->getType());
610     }
611
612     for (unsigned i = 0, E = I->getNumOperands(); i != E; ++i) {
613       if (i) Out << ",";
614       writeOperand(I->getOperand(i), PrintAllTypes);
615     }
616   }
617
618   printInfoComment(I);
619   Out << "\n";
620 }
621
622
623 // printType - Go to extreme measures to attempt to print out a short, symbolic
624 // version of a type name.
625 //
626 ostream &AssemblyWriter::printType(const Type *Ty) {
627   return printTypeInt(Out, Ty, TypeNames);
628 }
629
630
631 //===----------------------------------------------------------------------===//
632 //                       External Interface declarations
633 //===----------------------------------------------------------------------===//
634
635
636 void Module::print(std::ostream &o) const {
637   SlotCalculator SlotTable(this, true);
638   AssemblyWriter W(o, SlotTable, this);
639   W.write(this);
640 }
641
642 void GlobalVariable::print(std::ostream &o) const {
643   SlotCalculator SlotTable(getParent(), true);
644   AssemblyWriter W(o, SlotTable, getParent());
645   W.write(this);
646 }
647
648 void Function::print(std::ostream &o) const {
649   SlotCalculator SlotTable(getParent(), true);
650   AssemblyWriter W(o, SlotTable, getParent());
651
652   W.write(this);
653 }
654
655 void BasicBlock::print(std::ostream &o) const {
656   SlotCalculator SlotTable(getParent(), true);
657   AssemblyWriter W(o, SlotTable, 
658                    getParent() ? getParent()->getParent() : 0);
659   W.write(this);
660 }
661
662 void Instruction::print(std::ostream &o) const {
663   const Function *F = getParent() ? getParent()->getParent() : 0;
664   SlotCalculator SlotTable(F, true);
665   AssemblyWriter W(o, SlotTable, F ? F->getParent() : 0);
666
667   W.write(this);
668 }
669
670 void Constant::print(std::ostream &o) const {
671   if (this == 0) { o << "<null> constant value\n"; return; }
672   o << " " << getType()->getDescription() << " " << getStrValue();
673 }
674
675 void Type::print(std::ostream &o) const { 
676   if (this == 0)
677     o << "<null Type>";
678   else
679     o << getDescription();
680 }
681
682 void FunctionArgument::print(std::ostream &o) const {
683   o << getType() << " " << getName();
684 }
685
686 void Value::dump() const { print(std::cerr); }
687
688 //===----------------------------------------------------------------------===//
689 //  CachedWriter Class Implementation
690 //===----------------------------------------------------------------------===//
691
692 void CachedWriter::setModule(const Module *M) {
693   delete SC; delete AW;
694   if (M) {
695     SC = new SlotCalculator(M, true);
696     AW = new AssemblyWriter(Out, *SC, M);
697   } else {
698     SC = 0; AW = 0;
699   }
700 }
701
702 CachedWriter::~CachedWriter() {
703   delete AW;
704   delete SC;
705 }
706
707 CachedWriter &CachedWriter::operator<<(const Value *V) {
708   assert(AW && SC && "CachedWriter does not have a current module!");
709   switch (V->getValueType()) {
710   case Value::ConstantVal:
711     Out << " "; AW->write(V->getType());
712     Out << " " << cast<Constant>(V)->getStrValue(); break;
713   case Value::FunctionArgumentVal: 
714     AW->write(V->getType()); Out << " " << V->getName(); break;
715   case Value::TypeVal:           AW->write(cast<const Type>(V)); break;
716   case Value::InstructionVal:    AW->write(cast<Instruction>(V)); break;
717   case Value::BasicBlockVal:     AW->write(cast<BasicBlock>(V)); break;
718   case Value::FunctionVal:       AW->write(cast<Function>(V)); break;
719   case Value::GlobalVariableVal: AW->write(cast<GlobalVariable>(V)); break;
720   case Value::ModuleVal:         AW->write(cast<Module>(V)); break;
721   default: Out << "<unknown value type: " << V->getValueType() << ">"; break;
722   }
723   return *this;
724 }