AsmWriter.cpp revision cc041ba03aed685400197fb938b7a583713d25af
1//===-- AsmWriter.cpp - Printing LLVM as an assembly file -----------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This library implements the functionality defined in llvm/Assembly/Writer.h
11//
12// Note that these routines must be extremely tolerant of various errors in the
13// LLVM code, because it can be used for debugging transformations.
14//
15//===----------------------------------------------------------------------===//
16
17#include "llvm/Assembly/CachedWriter.h"
18#include "llvm/Assembly/Writer.h"
19#include "llvm/Assembly/PrintModulePass.h"
20#include "llvm/Assembly/AsmAnnotationWriter.h"
21#include "llvm/CallingConv.h"
22#include "llvm/Constants.h"
23#include "llvm/DerivedTypes.h"
24#include "llvm/Instruction.h"
25#include "llvm/Instructions.h"
26#include "llvm/Module.h"
27#include "llvm/SymbolTable.h"
28#include "llvm/Assembly/Writer.h"
29#include "llvm/Support/CFG.h"
30#include "llvm/ADT/StringExtras.h"
31#include "llvm/ADT/STLExtras.h"
32#include "llvm/Support/MathExtras.h"
33#include <algorithm>
34using namespace llvm;
35
36namespace llvm {
37
38// Make virtual table appear in this compilation unit.
39AssemblyAnnotationWriter::~AssemblyAnnotationWriter() {}
40
41/// This class provides computation of slot numbers for LLVM Assembly writing.
42/// @brief LLVM Assembly Writing Slot Computation.
43class SlotMachine {
44
45/// @name Types
46/// @{
47public:
48
49  /// @brief A mapping of Values to slot numbers
50  typedef std::map<const Value*, unsigned> ValueMap;
51  typedef std::map<const Type*, unsigned> TypeMap;
52
53  /// @brief A plane with next slot number and ValueMap
54  struct ValuePlane {
55    unsigned next_slot;        ///< The next slot number to use
56    ValueMap map;              ///< The map of Value* -> unsigned
57    ValuePlane() { next_slot = 0; } ///< Make sure we start at 0
58  };
59
60  struct TypePlane {
61    unsigned next_slot;
62    TypeMap map;
63    TypePlane() { next_slot = 0; }
64    void clear() { map.clear(); next_slot = 0; }
65  };
66
67  /// @brief The map of planes by Type
68  typedef std::map<const Type*, ValuePlane> TypedPlanes;
69
70/// @}
71/// @name Constructors
72/// @{
73public:
74  /// @brief Construct from a module
75  SlotMachine(const Module *M );
76
77  /// @brief Construct from a function, starting out in incorp state.
78  SlotMachine(const Function *F );
79
80/// @}
81/// @name Accessors
82/// @{
83public:
84  /// Return the slot number of the specified value in it's type
85  /// plane.  Its an error to ask for something not in the SlotMachine.
86  /// Its an error to ask for a Type*
87  int getSlot(const Value *V);
88  int getSlot(const Type*Ty);
89
90  /// Determine if a Value has a slot or not
91  bool hasSlot(const Value* V);
92  bool hasSlot(const Type* Ty);
93
94/// @}
95/// @name Mutators
96/// @{
97public:
98  /// If you'd like to deal with a function instead of just a module, use
99  /// this method to get its data into the SlotMachine.
100  void incorporateFunction(const Function *F) {
101    TheFunction = F;
102    FunctionProcessed = false;
103  }
104
105  /// After calling incorporateFunction, use this method to remove the
106  /// most recently incorporated function from the SlotMachine. This
107  /// will reset the state of the machine back to just the module contents.
108  void purgeFunction();
109
110/// @}
111/// @name Implementation Details
112/// @{
113private:
114  /// This function does the actual initialization.
115  inline void initialize();
116
117  /// Values can be crammed into here at will. If they haven't
118  /// been inserted already, they get inserted, otherwise they are ignored.
119  /// Either way, the slot number for the Value* is returned.
120  unsigned createSlot(const Value *V);
121  unsigned createSlot(const Type* Ty);
122
123  /// Insert a value into the value table. Return the slot number
124  /// that it now occupies.  BadThings(TM) will happen if you insert a
125  /// Value that's already been inserted.
126  unsigned insertValue( const Value *V );
127  unsigned insertValue( const Type* Ty);
128
129  /// Add all of the module level global variables (and their initializers)
130  /// and function declarations, but not the contents of those functions.
131  void processModule();
132
133  /// Add all of the functions arguments, basic blocks, and instructions
134  void processFunction();
135
136  SlotMachine(const SlotMachine &);  // DO NOT IMPLEMENT
137  void operator=(const SlotMachine &);  // DO NOT IMPLEMENT
138
139/// @}
140/// @name Data
141/// @{
142public:
143
144  /// @brief The module for which we are holding slot numbers
145  const Module* TheModule;
146
147  /// @brief The function for which we are holding slot numbers
148  const Function* TheFunction;
149  bool FunctionProcessed;
150
151  /// @brief The TypePlanes map for the module level data
152  TypedPlanes mMap;
153  TypePlane mTypes;
154
155  /// @brief The TypePlanes map for the function level data
156  TypedPlanes fMap;
157  TypePlane fTypes;
158
159/// @}
160
161};
162
163}  // end namespace llvm
164
165static RegisterPass<PrintModulePass>
166X("printm", "Print module to stderr",PassInfo::Analysis|PassInfo::Optimization);
167static RegisterPass<PrintFunctionPass>
168Y("print","Print function to stderr",PassInfo::Analysis|PassInfo::Optimization);
169
170static void WriteAsOperandInternal(std::ostream &Out, const Value *V,
171                                   bool PrintName,
172                                 std::map<const Type *, std::string> &TypeTable,
173                                   SlotMachine *Machine);
174
175static void WriteAsOperandInternal(std::ostream &Out, const Type *T,
176                                   bool PrintName,
177                                 std::map<const Type *, std::string> &TypeTable,
178                                   SlotMachine *Machine);
179
180static const Module *getModuleFromVal(const Value *V) {
181  if (const Argument *MA = dyn_cast<Argument>(V))
182    return MA->getParent() ? MA->getParent()->getParent() : 0;
183  else if (const BasicBlock *BB = dyn_cast<BasicBlock>(V))
184    return BB->getParent() ? BB->getParent()->getParent() : 0;
185  else if (const Instruction *I = dyn_cast<Instruction>(V)) {
186    const Function *M = I->getParent() ? I->getParent()->getParent() : 0;
187    return M ? M->getParent() : 0;
188  } else if (const GlobalValue *GV = dyn_cast<GlobalValue>(V))
189    return GV->getParent();
190  return 0;
191}
192
193static SlotMachine *createSlotMachine(const Value *V) {
194  if (const Argument *FA = dyn_cast<Argument>(V)) {
195    return new SlotMachine(FA->getParent());
196  } else if (const Instruction *I = dyn_cast<Instruction>(V)) {
197    return new SlotMachine(I->getParent()->getParent());
198  } else if (const BasicBlock *BB = dyn_cast<BasicBlock>(V)) {
199    return new SlotMachine(BB->getParent());
200  } else if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(V)){
201    return new SlotMachine(GV->getParent());
202  } else if (const Function *Func = dyn_cast<Function>(V)) {
203    return new SlotMachine(Func);
204  }
205  return 0;
206}
207
208// getLLVMName - Turn the specified string into an 'LLVM name', which is either
209// prefixed with % (if the string only contains simple characters) or is
210// surrounded with ""'s (if it has special chars in it).
211static std::string getLLVMName(const std::string &Name,
212                               bool prefixName = true) {
213  assert(!Name.empty() && "Cannot get empty name!");
214
215  // First character cannot start with a number...
216  if (Name[0] >= '0' && Name[0] <= '9')
217    return "\"" + Name + "\"";
218
219  // Scan to see if we have any characters that are not on the "white list"
220  for (unsigned i = 0, e = Name.size(); i != e; ++i) {
221    char C = Name[i];
222    assert(C != '"' && "Illegal character in LLVM value name!");
223    if ((C < 'a' || C > 'z') && (C < 'A' || C > 'Z') && (C < '0' || C > '9') &&
224        C != '-' && C != '.' && C != '_')
225      return "\"" + Name + "\"";
226  }
227
228  // If we get here, then the identifier is legal to use as a "VarID".
229  if (prefixName)
230    return "%"+Name;
231  else
232    return Name;
233}
234
235
236/// fillTypeNameTable - If the module has a symbol table, take all global types
237/// and stuff their names into the TypeNames map.
238///
239static void fillTypeNameTable(const Module *M,
240                              std::map<const Type *, std::string> &TypeNames) {
241  if (!M) return;
242  const SymbolTable &ST = M->getSymbolTable();
243  SymbolTable::type_const_iterator TI = ST.type_begin();
244  for (; TI != ST.type_end(); ++TI ) {
245    // As a heuristic, don't insert pointer to primitive types, because
246    // they are used too often to have a single useful name.
247    //
248    const Type *Ty = cast<Type>(TI->second);
249    if (!isa<PointerType>(Ty) ||
250        !cast<PointerType>(Ty)->getElementType()->isPrimitiveType() ||
251        isa<OpaqueType>(cast<PointerType>(Ty)->getElementType()))
252      TypeNames.insert(std::make_pair(Ty, getLLVMName(TI->first)));
253  }
254}
255
256
257
258static void calcTypeName(const Type *Ty,
259                         std::vector<const Type *> &TypeStack,
260                         std::map<const Type *, std::string> &TypeNames,
261                         std::string & Result){
262  if (Ty->isPrimitiveType() && !isa<OpaqueType>(Ty)) {
263    Result += Ty->getDescription();  // Base case
264    return;
265  }
266
267  // Check to see if the type is named.
268  std::map<const Type *, std::string>::iterator I = TypeNames.find(Ty);
269  if (I != TypeNames.end()) {
270    Result += I->second;
271    return;
272  }
273
274  if (isa<OpaqueType>(Ty)) {
275    Result += "opaque";
276    return;
277  }
278
279  // Check to see if the Type is already on the stack...
280  unsigned Slot = 0, CurSize = TypeStack.size();
281  while (Slot < CurSize && TypeStack[Slot] != Ty) ++Slot; // Scan for type
282
283  // This is another base case for the recursion.  In this case, we know
284  // that we have looped back to a type that we have previously visited.
285  // Generate the appropriate upreference to handle this.
286  if (Slot < CurSize) {
287    Result += "\\" + utostr(CurSize-Slot);     // Here's the upreference
288    return;
289  }
290
291  TypeStack.push_back(Ty);    // Recursive case: Add us to the stack..
292
293  switch (Ty->getTypeID()) {
294  case Type::FunctionTyID: {
295    const FunctionType *FTy = cast<FunctionType>(Ty);
296    calcTypeName(FTy->getReturnType(), TypeStack, TypeNames, Result);
297    Result += " (";
298    for (FunctionType::param_iterator I = FTy->param_begin(),
299           E = FTy->param_end(); I != E; ++I) {
300      if (I != FTy->param_begin())
301        Result += ", ";
302      calcTypeName(*I, TypeStack, TypeNames, Result);
303    }
304    if (FTy->isVarArg()) {
305      if (FTy->getNumParams()) Result += ", ";
306      Result += "...";
307    }
308    Result += ")";
309    break;
310  }
311  case Type::StructTyID: {
312    const StructType *STy = cast<StructType>(Ty);
313    Result += "{ ";
314    for (StructType::element_iterator I = STy->element_begin(),
315           E = STy->element_end(); I != E; ++I) {
316      if (I != STy->element_begin())
317        Result += ", ";
318      calcTypeName(*I, TypeStack, TypeNames, Result);
319    }
320    Result += " }";
321    break;
322  }
323  case Type::PointerTyID:
324    calcTypeName(cast<PointerType>(Ty)->getElementType(),
325                          TypeStack, TypeNames, Result);
326    Result += "*";
327    break;
328  case Type::ArrayTyID: {
329    const ArrayType *ATy = cast<ArrayType>(Ty);
330    Result += "[" + utostr(ATy->getNumElements()) + " x ";
331    calcTypeName(ATy->getElementType(), TypeStack, TypeNames, Result);
332    Result += "]";
333    break;
334  }
335  case Type::PackedTyID: {
336    const PackedType *PTy = cast<PackedType>(Ty);
337    Result += "<" + utostr(PTy->getNumElements()) + " x ";
338    calcTypeName(PTy->getElementType(), TypeStack, TypeNames, Result);
339    Result += ">";
340    break;
341  }
342  case Type::OpaqueTyID:
343    Result += "opaque";
344    break;
345  default:
346    Result += "<unrecognized-type>";
347  }
348
349  TypeStack.pop_back();       // Remove self from stack...
350  return;
351}
352
353
354/// printTypeInt - The internal guts of printing out a type that has a
355/// potentially named portion.
356///
357static std::ostream &printTypeInt(std::ostream &Out, const Type *Ty,
358                              std::map<const Type *, std::string> &TypeNames) {
359  // Primitive types always print out their description, regardless of whether
360  // they have been named or not.
361  //
362  if (Ty->isPrimitiveType() && !isa<OpaqueType>(Ty))
363    return Out << Ty->getDescription();
364
365  // Check to see if the type is named.
366  std::map<const Type *, std::string>::iterator I = TypeNames.find(Ty);
367  if (I != TypeNames.end()) return Out << I->second;
368
369  // Otherwise we have a type that has not been named but is a derived type.
370  // Carefully recurse the type hierarchy to print out any contained symbolic
371  // names.
372  //
373  std::vector<const Type *> TypeStack;
374  std::string TypeName;
375  calcTypeName(Ty, TypeStack, TypeNames, TypeName);
376  TypeNames.insert(std::make_pair(Ty, TypeName));//Cache type name for later use
377  return (Out << TypeName);
378}
379
380
381/// WriteTypeSymbolic - This attempts to write the specified type as a symbolic
382/// type, iff there is an entry in the modules symbol table for the specified
383/// type or one of it's component types. This is slower than a simple x << Type
384///
385std::ostream &llvm::WriteTypeSymbolic(std::ostream &Out, const Type *Ty,
386                                      const Module *M) {
387  Out << ' ';
388
389  // If they want us to print out a type, attempt to make it symbolic if there
390  // is a symbol table in the module...
391  if (M) {
392    std::map<const Type *, std::string> TypeNames;
393    fillTypeNameTable(M, TypeNames);
394
395    return printTypeInt(Out, Ty, TypeNames);
396  } else {
397    return Out << Ty->getDescription();
398  }
399}
400
401// PrintEscapedString - Print each character of the specified string, escaping
402// it if it is not printable or if it is an escape char.
403static void PrintEscapedString(const std::string &Str, std::ostream &Out) {
404  for (unsigned i = 0, e = Str.size(); i != e; ++i) {
405    unsigned char C = Str[i];
406    if (isprint(C) && C != '"' && C != '\\') {
407      Out << C;
408    } else {
409      Out << '\\'
410          << (char) ((C/16  < 10) ? ( C/16 +'0') : ( C/16 -10+'A'))
411          << (char)(((C&15) < 10) ? ((C&15)+'0') : ((C&15)-10+'A'));
412    }
413  }
414}
415
416/// @brief Internal constant writer.
417static void WriteConstantInt(std::ostream &Out, const Constant *CV,
418                             bool PrintName,
419                             std::map<const Type *, std::string> &TypeTable,
420                             SlotMachine *Machine) {
421  if (const ConstantBool *CB = dyn_cast<ConstantBool>(CV)) {
422    Out << (CB == ConstantBool::True ? "true" : "false");
423  } else if (const ConstantSInt *CI = dyn_cast<ConstantSInt>(CV)) {
424    Out << CI->getValue();
425  } else if (const ConstantUInt *CI = dyn_cast<ConstantUInt>(CV)) {
426    Out << CI->getValue();
427  } else if (const ConstantFP *CFP = dyn_cast<ConstantFP>(CV)) {
428    // We would like to output the FP constant value in exponential notation,
429    // but we cannot do this if doing so will lose precision.  Check here to
430    // make sure that we only output it in exponential format if we can parse
431    // the value back and get the same value.
432    //
433    std::string StrVal = ftostr(CFP->getValue());
434
435    // Check to make sure that the stringized number is not some string like
436    // "Inf" or NaN, that atof will accept, but the lexer will not.  Check that
437    // the string matches the "[-+]?[0-9]" regex.
438    //
439    if ((StrVal[0] >= '0' && StrVal[0] <= '9') ||
440        ((StrVal[0] == '-' || StrVal[0] == '+') &&
441         (StrVal[1] >= '0' && StrVal[1] <= '9')))
442      // Reparse stringized version!
443      if (atof(StrVal.c_str()) == CFP->getValue()) {
444        Out << StrVal;
445        return;
446      }
447
448    // Otherwise we could not reparse it to exactly the same value, so we must
449    // output the string in hexadecimal format!
450    assert(sizeof(double) == sizeof(uint64_t) &&
451           "assuming that double is 64 bits!");
452    Out << "0x" << utohexstr(DoubleToBits(CFP->getValue()));
453
454  } else if (isa<ConstantAggregateZero>(CV)) {
455    Out << "zeroinitializer";
456  } else if (const ConstantArray *CA = dyn_cast<ConstantArray>(CV)) {
457    // As a special case, print the array as a string if it is an array of
458    // ubytes or an array of sbytes with positive values.
459    //
460    const Type *ETy = CA->getType()->getElementType();
461    if (CA->isString()) {
462      Out << "c\"";
463      PrintEscapedString(CA->getAsString(), Out);
464      Out << "\"";
465
466    } else {                // Cannot output in string format...
467      Out << '[';
468      if (CA->getNumOperands()) {
469        Out << ' ';
470        printTypeInt(Out, ETy, TypeTable);
471        WriteAsOperandInternal(Out, CA->getOperand(0),
472                               PrintName, TypeTable, Machine);
473        for (unsigned i = 1, e = CA->getNumOperands(); i != e; ++i) {
474          Out << ", ";
475          printTypeInt(Out, ETy, TypeTable);
476          WriteAsOperandInternal(Out, CA->getOperand(i), PrintName,
477                                 TypeTable, Machine);
478        }
479      }
480      Out << " ]";
481    }
482  } else if (const ConstantStruct *CS = dyn_cast<ConstantStruct>(CV)) {
483    Out << '{';
484    if (CS->getNumOperands()) {
485      Out << ' ';
486      printTypeInt(Out, CS->getOperand(0)->getType(), TypeTable);
487
488      WriteAsOperandInternal(Out, CS->getOperand(0),
489                             PrintName, TypeTable, Machine);
490
491      for (unsigned i = 1; i < CS->getNumOperands(); i++) {
492        Out << ", ";
493        printTypeInt(Out, CS->getOperand(i)->getType(), TypeTable);
494
495        WriteAsOperandInternal(Out, CS->getOperand(i),
496                               PrintName, TypeTable, Machine);
497      }
498    }
499
500    Out << " }";
501  } else if (const ConstantPacked *CP = dyn_cast<ConstantPacked>(CV)) {
502      const Type *ETy = CP->getType()->getElementType();
503      assert(CP->getNumOperands() > 0 &&
504             "Number of operands for a PackedConst must be > 0");
505      Out << '<';
506      Out << ' ';
507      printTypeInt(Out, ETy, TypeTable);
508      WriteAsOperandInternal(Out, CP->getOperand(0),
509                             PrintName, TypeTable, Machine);
510      for (unsigned i = 1, e = CP->getNumOperands(); i != e; ++i) {
511          Out << ", ";
512          printTypeInt(Out, ETy, TypeTable);
513          WriteAsOperandInternal(Out, CP->getOperand(i), PrintName,
514                                 TypeTable, Machine);
515      }
516      Out << " >";
517  } else if (isa<ConstantPointerNull>(CV)) {
518    Out << "null";
519
520  } else if (isa<UndefValue>(CV)) {
521    Out << "undef";
522
523  } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
524    Out << CE->getOpcodeName() << " (";
525
526    for (User::const_op_iterator OI=CE->op_begin(); OI != CE->op_end(); ++OI) {
527      printTypeInt(Out, (*OI)->getType(), TypeTable);
528      WriteAsOperandInternal(Out, *OI, PrintName, TypeTable, Machine);
529      if (OI+1 != CE->op_end())
530        Out << ", ";
531    }
532
533    if (CE->getOpcode() == Instruction::Cast) {
534      Out << " to ";
535      printTypeInt(Out, CE->getType(), TypeTable);
536    }
537    Out << ')';
538
539  } else {
540    Out << "<placeholder or erroneous Constant>";
541  }
542}
543
544
545/// WriteAsOperand - Write the name of the specified value out to the specified
546/// ostream.  This can be useful when you just want to print int %reg126, not
547/// the whole instruction that generated it.
548///
549static void WriteAsOperandInternal(std::ostream &Out, const Value *V,
550                                   bool PrintName,
551                                  std::map<const Type*, std::string> &TypeTable,
552                                   SlotMachine *Machine) {
553  Out << ' ';
554  if ((PrintName || isa<GlobalValue>(V)) && V->hasName())
555    Out << getLLVMName(V->getName());
556  else {
557    const Constant *CV = dyn_cast<Constant>(V);
558    if (CV && !isa<GlobalValue>(CV))
559      WriteConstantInt(Out, CV, PrintName, TypeTable, Machine);
560    else {
561      int Slot;
562      if (Machine) {
563        Slot = Machine->getSlot(V);
564      } else {
565        Machine = createSlotMachine(V);
566        if (Machine == 0)
567          Slot = Machine->getSlot(V);
568        else
569          Slot = -1;
570        delete Machine;
571      }
572      if (Slot != -1)
573        Out << '%' << Slot;
574      else
575        Out << "<badref>";
576    }
577  }
578}
579
580/// WriteAsOperand - Write the name of the specified value out to the specified
581/// ostream.  This can be useful when you just want to print int %reg126, not
582/// the whole instruction that generated it.
583///
584std::ostream &llvm::WriteAsOperand(std::ostream &Out, const Value *V,
585                                   bool PrintType, bool PrintName,
586                                   const Module *Context) {
587  std::map<const Type *, std::string> TypeNames;
588  if (Context == 0) Context = getModuleFromVal(V);
589
590  if (Context)
591    fillTypeNameTable(Context, TypeNames);
592
593  if (PrintType)
594    printTypeInt(Out, V->getType(), TypeNames);
595
596  WriteAsOperandInternal(Out, V, PrintName, TypeNames, 0);
597  return Out;
598}
599
600/// WriteAsOperandInternal - Write the name of the specified value out to
601/// the specified ostream.  This can be useful when you just want to print
602/// int %reg126, not the whole instruction that generated it.
603///
604static void WriteAsOperandInternal(std::ostream &Out, const Type *T,
605                                   bool PrintName,
606                                  std::map<const Type*, std::string> &TypeTable,
607                                   SlotMachine *Machine) {
608  Out << ' ';
609  int Slot;
610  if (Machine) {
611    Slot = Machine->getSlot(T);
612    if (Slot != -1)
613      Out << '%' << Slot;
614    else
615      Out << "<badref>";
616  } else {
617    Out << T->getDescription();
618  }
619}
620
621/// WriteAsOperand - Write the name of the specified value out to the specified
622/// ostream.  This can be useful when you just want to print int %reg126, not
623/// the whole instruction that generated it.
624///
625std::ostream &llvm::WriteAsOperand(std::ostream &Out, const Type *Ty,
626                                   bool PrintType, bool PrintName,
627                                   const Module *Context) {
628  std::map<const Type *, std::string> TypeNames;
629  assert(Context != 0 && "Can't write types as operand without module context");
630
631  fillTypeNameTable(Context, TypeNames);
632
633  // if (PrintType)
634    // printTypeInt(Out, V->getType(), TypeNames);
635
636  printTypeInt(Out, Ty, TypeNames);
637
638  WriteAsOperandInternal(Out, Ty, PrintName, TypeNames, 0);
639  return Out;
640}
641
642namespace llvm {
643
644class AssemblyWriter {
645  std::ostream &Out;
646  SlotMachine &Machine;
647  const Module *TheModule;
648  std::map<const Type *, std::string> TypeNames;
649  AssemblyAnnotationWriter *AnnotationWriter;
650public:
651  inline AssemblyWriter(std::ostream &o, SlotMachine &Mac, const Module *M,
652                        AssemblyAnnotationWriter *AAW)
653    : Out(o), Machine(Mac), TheModule(M), AnnotationWriter(AAW) {
654
655    // If the module has a symbol table, take all global types and stuff their
656    // names into the TypeNames map.
657    //
658    fillTypeNameTable(M, TypeNames);
659  }
660
661  inline void write(const Module *M)         { printModule(M);      }
662  inline void write(const GlobalVariable *G) { printGlobal(G);      }
663  inline void write(const Function *F)       { printFunction(F);    }
664  inline void write(const BasicBlock *BB)    { printBasicBlock(BB); }
665  inline void write(const Instruction *I)    { printInstruction(*I); }
666  inline void write(const Constant *CPV)     { printConstant(CPV);  }
667  inline void write(const Type *Ty)          { printType(Ty);       }
668
669  void writeOperand(const Value *Op, bool PrintType, bool PrintName = true);
670
671  const Module* getModule() { return TheModule; }
672
673private:
674  void printModule(const Module *M);
675  void printSymbolTable(const SymbolTable &ST);
676  void printConstant(const Constant *CPV);
677  void printGlobal(const GlobalVariable *GV);
678  void printFunction(const Function *F);
679  void printArgument(const Argument *FA);
680  void printBasicBlock(const BasicBlock *BB);
681  void printInstruction(const Instruction &I);
682
683  // printType - Go to extreme measures to attempt to print out a short,
684  // symbolic version of a type name.
685  //
686  std::ostream &printType(const Type *Ty) {
687    return printTypeInt(Out, Ty, TypeNames);
688  }
689
690  // printTypeAtLeastOneLevel - Print out one level of the possibly complex type
691  // without considering any symbolic types that we may have equal to it.
692  //
693  std::ostream &printTypeAtLeastOneLevel(const Type *Ty);
694
695  // printInfoComment - Print a little comment after the instruction indicating
696  // which slot it occupies.
697  void printInfoComment(const Value &V);
698};
699}  // end of llvm namespace
700
701/// printTypeAtLeastOneLevel - Print out one level of the possibly complex type
702/// without considering any symbolic types that we may have equal to it.
703///
704std::ostream &AssemblyWriter::printTypeAtLeastOneLevel(const Type *Ty) {
705  if (const FunctionType *FTy = dyn_cast<FunctionType>(Ty)) {
706    printType(FTy->getReturnType()) << " (";
707    for (FunctionType::param_iterator I = FTy->param_begin(),
708           E = FTy->param_end(); I != E; ++I) {
709      if (I != FTy->param_begin())
710        Out << ", ";
711      printType(*I);
712    }
713    if (FTy->isVarArg()) {
714      if (FTy->getNumParams()) Out << ", ";
715      Out << "...";
716    }
717    Out << ')';
718  } else if (const StructType *STy = dyn_cast<StructType>(Ty)) {
719    Out << "{ ";
720    for (StructType::element_iterator I = STy->element_begin(),
721           E = STy->element_end(); I != E; ++I) {
722      if (I != STy->element_begin())
723        Out << ", ";
724      printType(*I);
725    }
726    Out << " }";
727  } else if (const PointerType *PTy = dyn_cast<PointerType>(Ty)) {
728    printType(PTy->getElementType()) << '*';
729  } else if (const ArrayType *ATy = dyn_cast<ArrayType>(Ty)) {
730    Out << '[' << ATy->getNumElements() << " x ";
731    printType(ATy->getElementType()) << ']';
732  } else if (const PackedType *PTy = dyn_cast<PackedType>(Ty)) {
733    Out << '<' << PTy->getNumElements() << " x ";
734    printType(PTy->getElementType()) << '>';
735  }
736  else if (const OpaqueType *OTy = dyn_cast<OpaqueType>(Ty)) {
737    Out << "opaque";
738  } else {
739    if (!Ty->isPrimitiveType())
740      Out << "<unknown derived type>";
741    printType(Ty);
742  }
743  return Out;
744}
745
746
747void AssemblyWriter::writeOperand(const Value *Operand, bool PrintType,
748                                  bool PrintName) {
749  if (Operand != 0) {
750    if (PrintType) { Out << ' '; printType(Operand->getType()); }
751    WriteAsOperandInternal(Out, Operand, PrintName, TypeNames, &Machine);
752  } else {
753    Out << "<null operand!>";
754  }
755}
756
757
758void AssemblyWriter::printModule(const Module *M) {
759  if (!M->getModuleIdentifier().empty() &&
760      // Don't print the ID if it will start a new line (which would
761      // require a comment char before it).
762      M->getModuleIdentifier().find('\n') == std::string::npos)
763    Out << "; ModuleID = '" << M->getModuleIdentifier() << "'\n";
764
765  switch (M->getEndianness()) {
766  case Module::LittleEndian: Out << "target endian = little\n"; break;
767  case Module::BigEndian:    Out << "target endian = big\n";    break;
768  case Module::AnyEndianness: break;
769  }
770  switch (M->getPointerSize()) {
771  case Module::Pointer32:    Out << "target pointersize = 32\n"; break;
772  case Module::Pointer64:    Out << "target pointersize = 64\n"; break;
773  case Module::AnyPointerSize: break;
774  }
775  if (!M->getTargetTriple().empty())
776    Out << "target triple = \"" << M->getTargetTriple() << "\"\n";
777
778  if (!M->getModuleInlineAsm().empty()) {
779    // Split the string into lines, to make it easier to read the .ll file.
780    std::string Asm = M->getModuleInlineAsm();
781    size_t CurPos = 0;
782    size_t NewLine = Asm.find_first_of('\n', CurPos);
783    while (NewLine != std::string::npos) {
784      // We found a newline, print the portion of the asm string from the
785      // last newline up to this newline.
786      Out << "module asm \"";
787      PrintEscapedString(std::string(Asm.begin()+CurPos, Asm.begin()+NewLine),
788                         Out);
789      Out << "\"\n";
790      CurPos = NewLine+1;
791      NewLine = Asm.find_first_of('\n', CurPos);
792    }
793    Out << "module asm \"";
794    PrintEscapedString(std::string(Asm.begin()+CurPos, Asm.end()), Out);
795    Out << "\"\n";
796  }
797
798  // Loop over the dependent libraries and emit them.
799  Module::lib_iterator LI = M->lib_begin();
800  Module::lib_iterator LE = M->lib_end();
801  if (LI != LE) {
802    Out << "deplibs = [ ";
803    while (LI != LE) {
804      Out << '"' << *LI << '"';
805      ++LI;
806      if (LI != LE)
807        Out << ", ";
808    }
809    Out << " ]\n";
810  }
811
812  // Loop over the symbol table, emitting all named constants.
813  printSymbolTable(M->getSymbolTable());
814
815  for (Module::const_global_iterator I = M->global_begin(), E = M->global_end(); I != E; ++I)
816    printGlobal(I);
817
818  Out << "\nimplementation   ; Functions:\n";
819
820  // Output all of the functions.
821  for (Module::const_iterator I = M->begin(), E = M->end(); I != E; ++I)
822    printFunction(I);
823}
824
825void AssemblyWriter::printGlobal(const GlobalVariable *GV) {
826  if (GV->hasName()) Out << getLLVMName(GV->getName()) << " = ";
827
828  if (!GV->hasInitializer())
829    Out << "external ";
830  else
831    switch (GV->getLinkage()) {
832    case GlobalValue::InternalLinkage:  Out << "internal "; break;
833    case GlobalValue::LinkOnceLinkage:  Out << "linkonce "; break;
834    case GlobalValue::WeakLinkage:      Out << "weak "; break;
835    case GlobalValue::AppendingLinkage: Out << "appending "; break;
836    case GlobalValue::ExternalLinkage: break;
837    case GlobalValue::GhostLinkage:
838      std::cerr << "GhostLinkage not allowed in AsmWriter!\n";
839      abort();
840    }
841
842  Out << (GV->isConstant() ? "constant " : "global ");
843  printType(GV->getType()->getElementType());
844
845  if (GV->hasInitializer()) {
846    Constant* C = cast<Constant>(GV->getInitializer());
847    assert(C &&  "GlobalVar initializer isn't constant?");
848    writeOperand(GV->getInitializer(), false, isa<GlobalValue>(C));
849  }
850
851  if (GV->hasSection())
852    Out << ", section \"" << GV->getSection() << '"';
853  if (GV->getAlignment())
854    Out << ", align " << GV->getAlignment();
855
856  printInfoComment(*GV);
857  Out << "\n";
858}
859
860
861// printSymbolTable - Run through symbol table looking for constants
862// and types. Emit their declarations.
863void AssemblyWriter::printSymbolTable(const SymbolTable &ST) {
864
865  // Print the types.
866  for (SymbolTable::type_const_iterator TI = ST.type_begin();
867       TI != ST.type_end(); ++TI ) {
868    Out << "\t" << getLLVMName(TI->first) << " = type ";
869
870    // Make sure we print out at least one level of the type structure, so
871    // that we do not get %FILE = type %FILE
872    //
873    printTypeAtLeastOneLevel(TI->second) << "\n";
874  }
875
876  // Print the constants, in type plane order.
877  for (SymbolTable::plane_const_iterator PI = ST.plane_begin();
878       PI != ST.plane_end(); ++PI ) {
879    SymbolTable::value_const_iterator VI = ST.value_begin(PI->first);
880    SymbolTable::value_const_iterator VE = ST.value_end(PI->first);
881
882    for (; VI != VE; ++VI) {
883      const Value* V = VI->second;
884      const Constant *CPV = dyn_cast<Constant>(V) ;
885      if (CPV && !isa<GlobalValue>(V)) {
886        printConstant(CPV);
887      }
888    }
889  }
890}
891
892
893/// printConstant - Print out a constant pool entry...
894///
895void AssemblyWriter::printConstant(const Constant *CPV) {
896  // Don't print out unnamed constants, they will be inlined
897  if (!CPV->hasName()) return;
898
899  // Print out name...
900  Out << "\t" << getLLVMName(CPV->getName()) << " =";
901
902  // Write the value out now...
903  writeOperand(CPV, true, false);
904
905  printInfoComment(*CPV);
906  Out << "\n";
907}
908
909/// printFunction - Print all aspects of a function.
910///
911void AssemblyWriter::printFunction(const Function *F) {
912  // Print out the return type and name...
913  Out << "\n";
914
915  // Ensure that no local symbols conflict with global symbols.
916  const_cast<Function*>(F)->renameLocalSymbols();
917
918  if (AnnotationWriter) AnnotationWriter->emitFunctionAnnot(F, Out);
919
920  if (F->isExternal())
921    Out << "declare ";
922  else
923    switch (F->getLinkage()) {
924    case GlobalValue::InternalLinkage:  Out << "internal "; break;
925    case GlobalValue::LinkOnceLinkage:  Out << "linkonce "; break;
926    case GlobalValue::WeakLinkage:      Out << "weak "; break;
927    case GlobalValue::AppendingLinkage: Out << "appending "; break;
928    case GlobalValue::ExternalLinkage: break;
929    case GlobalValue::GhostLinkage:
930      std::cerr << "GhostLinkage not allowed in AsmWriter!\n";
931      abort();
932    }
933
934  // Print the calling convention.
935  switch (F->getCallingConv()) {
936  case CallingConv::C: break;   // default
937  case CallingConv::Fast: Out << "fastcc "; break;
938  case CallingConv::Cold: Out << "coldcc "; break;
939  default: Out << "cc" << F->getCallingConv() << " "; break;
940  }
941
942  printType(F->getReturnType()) << ' ';
943  if (!F->getName().empty())
944    Out << getLLVMName(F->getName());
945  else
946    Out << "\"\"";
947  Out << '(';
948  Machine.incorporateFunction(F);
949
950  // Loop over the arguments, printing them...
951  const FunctionType *FT = F->getFunctionType();
952
953  for(Function::const_arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I)
954    printArgument(I);
955
956  // Finish printing arguments...
957  if (FT->isVarArg()) {
958    if (FT->getNumParams()) Out << ", ";
959    Out << "...";  // Output varargs portion of signature!
960  }
961  Out << ')';
962
963  if (F->hasSection())
964    Out << " section \"" << F->getSection() << '"';
965  if (F->getAlignment())
966    Out << " align " << F->getAlignment();
967
968  if (F->isExternal()) {
969    Out << "\n";
970  } else {
971    Out << " {";
972
973    // Output all of its basic blocks... for the function
974    for (Function::const_iterator I = F->begin(), E = F->end(); I != E; ++I)
975      printBasicBlock(I);
976
977    Out << "}\n";
978  }
979
980  Machine.purgeFunction();
981}
982
983/// printArgument - This member is called for every argument that is passed into
984/// the function.  Simply print it out
985///
986void AssemblyWriter::printArgument(const Argument *Arg) {
987  // Insert commas as we go... the first arg doesn't get a comma
988  if (Arg != Arg->getParent()->arg_begin()) Out << ", ";
989
990  // Output type...
991  printType(Arg->getType());
992
993  // Output name, if available...
994  if (Arg->hasName())
995    Out << ' ' << getLLVMName(Arg->getName());
996}
997
998/// printBasicBlock - This member is called for each basic block in a method.
999///
1000void AssemblyWriter::printBasicBlock(const BasicBlock *BB) {
1001  if (BB->hasName()) {              // Print out the label if it exists...
1002    Out << "\n" << getLLVMName(BB->getName(), false) << ':';
1003  } else if (!BB->use_empty()) {      // Don't print block # of no uses...
1004    Out << "\n; <label>:";
1005    int Slot = Machine.getSlot(BB);
1006    if (Slot != -1)
1007      Out << Slot;
1008    else
1009      Out << "<badref>";
1010  }
1011
1012  if (BB->getParent() == 0)
1013    Out << "\t\t; Error: Block without parent!";
1014  else {
1015    if (BB != &BB->getParent()->front()) {  // Not the entry block?
1016      // Output predecessors for the block...
1017      Out << "\t\t;";
1018      pred_const_iterator PI = pred_begin(BB), PE = pred_end(BB);
1019
1020      if (PI == PE) {
1021        Out << " No predecessors!";
1022      } else {
1023        Out << " preds =";
1024        writeOperand(*PI, false, true);
1025        for (++PI; PI != PE; ++PI) {
1026          Out << ',';
1027          writeOperand(*PI, false, true);
1028        }
1029      }
1030    }
1031  }
1032
1033  Out << "\n";
1034
1035  if (AnnotationWriter) AnnotationWriter->emitBasicBlockStartAnnot(BB, Out);
1036
1037  // Output all of the instructions in the basic block...
1038  for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I)
1039    printInstruction(*I);
1040
1041  if (AnnotationWriter) AnnotationWriter->emitBasicBlockEndAnnot(BB, Out);
1042}
1043
1044
1045/// printInfoComment - Print a little comment after the instruction indicating
1046/// which slot it occupies.
1047///
1048void AssemblyWriter::printInfoComment(const Value &V) {
1049  if (V.getType() != Type::VoidTy) {
1050    Out << "\t\t; <";
1051    printType(V.getType()) << '>';
1052
1053    if (!V.hasName()) {
1054      int SlotNum = Machine.getSlot(&V);
1055      if (SlotNum == -1)
1056        Out << ":<badref>";
1057      else
1058        Out << ':' << SlotNum; // Print out the def slot taken.
1059    }
1060    Out << " [#uses=" << V.getNumUses() << ']';  // Output # uses
1061  }
1062}
1063
1064/// printInstruction - This member is called for each Instruction in a function..
1065///
1066void AssemblyWriter::printInstruction(const Instruction &I) {
1067  if (AnnotationWriter) AnnotationWriter->emitInstructionAnnot(&I, Out);
1068
1069  Out << "\t";
1070
1071  // Print out name if it exists...
1072  if (I.hasName())
1073    Out << getLLVMName(I.getName()) << " = ";
1074
1075  // If this is a volatile load or store, print out the volatile marker.
1076  if ((isa<LoadInst>(I)  && cast<LoadInst>(I).isVolatile()) ||
1077      (isa<StoreInst>(I) && cast<StoreInst>(I).isVolatile())) {
1078      Out << "volatile ";
1079  } else if (isa<CallInst>(I) && cast<CallInst>(I).isTailCall()) {
1080    // If this is a call, check if it's a tail call.
1081    Out << "tail ";
1082  }
1083
1084  // Print out the opcode...
1085  Out << I.getOpcodeName();
1086
1087  // Print out the type of the operands...
1088  const Value *Operand = I.getNumOperands() ? I.getOperand(0) : 0;
1089
1090  // Special case conditional branches to swizzle the condition out to the front
1091  if (isa<BranchInst>(I) && I.getNumOperands() > 1) {
1092    writeOperand(I.getOperand(2), true);
1093    Out << ',';
1094    writeOperand(Operand, true);
1095    Out << ',';
1096    writeOperand(I.getOperand(1), true);
1097
1098  } else if (isa<SwitchInst>(I)) {
1099    // Special case switch statement to get formatting nice and correct...
1100    writeOperand(Operand        , true); Out << ',';
1101    writeOperand(I.getOperand(1), true); Out << " [";
1102
1103    for (unsigned op = 2, Eop = I.getNumOperands(); op < Eop; op += 2) {
1104      Out << "\n\t\t";
1105      writeOperand(I.getOperand(op  ), true); Out << ',';
1106      writeOperand(I.getOperand(op+1), true);
1107    }
1108    Out << "\n\t]";
1109  } else if (isa<PHINode>(I)) {
1110    Out << ' ';
1111    printType(I.getType());
1112    Out << ' ';
1113
1114    for (unsigned op = 0, Eop = I.getNumOperands(); op < Eop; op += 2) {
1115      if (op) Out << ", ";
1116      Out << '[';
1117      writeOperand(I.getOperand(op  ), false); Out << ',';
1118      writeOperand(I.getOperand(op+1), false); Out << " ]";
1119    }
1120  } else if (isa<ReturnInst>(I) && !Operand) {
1121    Out << " void";
1122  } else if (const CallInst *CI = dyn_cast<CallInst>(&I)) {
1123    // Print the calling convention being used.
1124    switch (CI->getCallingConv()) {
1125    case CallingConv::C: break;   // default
1126    case CallingConv::Fast: Out << " fastcc"; break;
1127    case CallingConv::Cold: Out << " coldcc"; break;
1128    default: Out << " cc" << CI->getCallingConv(); break;
1129    }
1130
1131    const PointerType  *PTy = cast<PointerType>(Operand->getType());
1132    const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
1133    const Type       *RetTy = FTy->getReturnType();
1134
1135    // If possible, print out the short form of the call instruction.  We can
1136    // only do this if the first argument is a pointer to a nonvararg function,
1137    // and if the return type is not a pointer to a function.
1138    //
1139    if (!FTy->isVarArg() &&
1140        (!isa<PointerType>(RetTy) ||
1141         !isa<FunctionType>(cast<PointerType>(RetTy)->getElementType()))) {
1142      Out << ' '; printType(RetTy);
1143      writeOperand(Operand, false);
1144    } else {
1145      writeOperand(Operand, true);
1146    }
1147    Out << '(';
1148    if (CI->getNumOperands() > 1) writeOperand(CI->getOperand(1), true);
1149    for (unsigned op = 2, Eop = I.getNumOperands(); op < Eop; ++op) {
1150      Out << ',';
1151      writeOperand(I.getOperand(op), true);
1152    }
1153
1154    Out << " )";
1155  } else if (const InvokeInst *II = dyn_cast<InvokeInst>(&I)) {
1156    const PointerType  *PTy = cast<PointerType>(Operand->getType());
1157    const FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
1158    const Type       *RetTy = FTy->getReturnType();
1159
1160    // Print the calling convention being used.
1161    switch (II->getCallingConv()) {
1162    case CallingConv::C: break;   // default
1163    case CallingConv::Fast: Out << " fastcc"; break;
1164    case CallingConv::Cold: Out << " coldcc"; break;
1165    default: Out << " cc" << II->getCallingConv(); break;
1166    }
1167
1168    // If possible, print out the short form of the invoke instruction. We can
1169    // only do this if the first argument is a pointer to a nonvararg function,
1170    // and if the return type is not a pointer to a function.
1171    //
1172    if (!FTy->isVarArg() &&
1173        (!isa<PointerType>(RetTy) ||
1174         !isa<FunctionType>(cast<PointerType>(RetTy)->getElementType()))) {
1175      Out << ' '; printType(RetTy);
1176      writeOperand(Operand, false);
1177    } else {
1178      writeOperand(Operand, true);
1179    }
1180
1181    Out << '(';
1182    if (I.getNumOperands() > 3) writeOperand(I.getOperand(3), true);
1183    for (unsigned op = 4, Eop = I.getNumOperands(); op < Eop; ++op) {
1184      Out << ',';
1185      writeOperand(I.getOperand(op), true);
1186    }
1187
1188    Out << " )\n\t\t\tto";
1189    writeOperand(II->getNormalDest(), true);
1190    Out << " unwind";
1191    writeOperand(II->getUnwindDest(), true);
1192
1193  } else if (const AllocationInst *AI = dyn_cast<AllocationInst>(&I)) {
1194    Out << ' ';
1195    printType(AI->getType()->getElementType());
1196    if (AI->isArrayAllocation()) {
1197      Out << ',';
1198      writeOperand(AI->getArraySize(), true);
1199    }
1200    if (AI->getAlignment()) {
1201      Out << ", align " << AI->getAlignment();
1202    }
1203  } else if (isa<CastInst>(I)) {
1204    if (Operand) writeOperand(Operand, true);   // Work with broken code
1205    Out << " to ";
1206    printType(I.getType());
1207  } else if (isa<VAArgInst>(I)) {
1208    if (Operand) writeOperand(Operand, true);   // Work with broken code
1209    Out << ", ";
1210    printType(I.getType());
1211  } else if (Operand) {   // Print the normal way...
1212
1213    // PrintAllTypes - Instructions who have operands of all the same type
1214    // omit the type from all but the first operand.  If the instruction has
1215    // different type operands (for example br), then they are all printed.
1216    bool PrintAllTypes = false;
1217    const Type *TheType = Operand->getType();
1218
1219    // Shift Left & Right print both types even for Ubyte LHS, and select prints
1220    // types even if all operands are bools.
1221    if (isa<ShiftInst>(I) || isa<SelectInst>(I) || isa<StoreInst>(I)) {
1222      PrintAllTypes = true;
1223    } else {
1224      for (unsigned i = 1, E = I.getNumOperands(); i != E; ++i) {
1225        Operand = I.getOperand(i);
1226        if (Operand->getType() != TheType) {
1227          PrintAllTypes = true;    // We have differing types!  Print them all!
1228          break;
1229        }
1230      }
1231    }
1232
1233    if (!PrintAllTypes) {
1234      Out << ' ';
1235      printType(TheType);
1236    }
1237
1238    for (unsigned i = 0, E = I.getNumOperands(); i != E; ++i) {
1239      if (i) Out << ',';
1240      writeOperand(I.getOperand(i), PrintAllTypes);
1241    }
1242  }
1243
1244  printInfoComment(I);
1245  Out << "\n";
1246}
1247
1248
1249//===----------------------------------------------------------------------===//
1250//                       External Interface declarations
1251//===----------------------------------------------------------------------===//
1252
1253void Module::print(std::ostream &o, AssemblyAnnotationWriter *AAW) const {
1254  SlotMachine SlotTable(this);
1255  AssemblyWriter W(o, SlotTable, this, AAW);
1256  W.write(this);
1257}
1258
1259void GlobalVariable::print(std::ostream &o) const {
1260  SlotMachine SlotTable(getParent());
1261  AssemblyWriter W(o, SlotTable, getParent(), 0);
1262  W.write(this);
1263}
1264
1265void Function::print(std::ostream &o, AssemblyAnnotationWriter *AAW) const {
1266  SlotMachine SlotTable(getParent());
1267  AssemblyWriter W(o, SlotTable, getParent(), AAW);
1268
1269  W.write(this);
1270}
1271
1272void InlineAsm::print(std::ostream &o, AssemblyAnnotationWriter *AAW) const {
1273  SlotMachine SlotTable(getParent());
1274  AssemblyWriter W(o, SlotTable, getParent(), AAW);
1275
1276  assert(0 && "Inline asm printing unimplemented!");
1277  //W.write(this);
1278}
1279
1280void BasicBlock::print(std::ostream &o, AssemblyAnnotationWriter *AAW) const {
1281  SlotMachine SlotTable(getParent());
1282  AssemblyWriter W(o, SlotTable,
1283                   getParent() ? getParent()->getParent() : 0, AAW);
1284  W.write(this);
1285}
1286
1287void Instruction::print(std::ostream &o, AssemblyAnnotationWriter *AAW) const {
1288  const Function *F = getParent() ? getParent()->getParent() : 0;
1289  SlotMachine SlotTable(F);
1290  AssemblyWriter W(o, SlotTable, F ? F->getParent() : 0, AAW);
1291
1292  W.write(this);
1293}
1294
1295void Constant::print(std::ostream &o) const {
1296  if (this == 0) { o << "<null> constant value\n"; return; }
1297
1298  o << ' ' << getType()->getDescription() << ' ';
1299
1300  std::map<const Type *, std::string> TypeTable;
1301  WriteConstantInt(o, this, false, TypeTable, 0);
1302}
1303
1304void Type::print(std::ostream &o) const {
1305  if (this == 0)
1306    o << "<null Type>";
1307  else
1308    o << getDescription();
1309}
1310
1311void Argument::print(std::ostream &o) const {
1312  WriteAsOperand(o, this, true, true,
1313                 getParent() ? getParent()->getParent() : 0);
1314}
1315
1316// Value::dump - allow easy printing of  Values from the debugger.
1317// Located here because so much of the needed functionality is here.
1318void Value::dump() const { print(std::cerr); }
1319
1320// Type::dump - allow easy printing of  Values from the debugger.
1321// Located here because so much of the needed functionality is here.
1322void Type::dump() const { print(std::cerr); }
1323
1324//===----------------------------------------------------------------------===//
1325//  CachedWriter Class Implementation
1326//===----------------------------------------------------------------------===//
1327
1328void CachedWriter::setModule(const Module *M) {
1329  delete SC; delete AW;
1330  if (M) {
1331    SC = new SlotMachine(M );
1332    AW = new AssemblyWriter(Out, *SC, M, 0);
1333  } else {
1334    SC = 0; AW = 0;
1335  }
1336}
1337
1338CachedWriter::~CachedWriter() {
1339  delete AW;
1340  delete SC;
1341}
1342
1343CachedWriter &CachedWriter::operator<<(const Value &V) {
1344  assert(AW && SC && "CachedWriter does not have a current module!");
1345  if (const Instruction *I = dyn_cast<Instruction>(&V))
1346    AW->write(I);
1347  else if (const BasicBlock *BB = dyn_cast<BasicBlock>(&V))
1348    AW->write(BB);
1349  else if (const Function *F = dyn_cast<Function>(&V))
1350    AW->write(F);
1351  else if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(&V))
1352    AW->write(GV);
1353  else
1354    AW->writeOperand(&V, true, true);
1355  return *this;
1356}
1357
1358CachedWriter& CachedWriter::operator<<(const Type &Ty) {
1359  if (SymbolicTypes) {
1360    const Module *M = AW->getModule();
1361    if (M) WriteTypeSymbolic(Out, &Ty, M);
1362  } else {
1363    AW->write(&Ty);
1364  }
1365  return *this;
1366}
1367
1368//===----------------------------------------------------------------------===//
1369//===--                    SlotMachine Implementation
1370//===----------------------------------------------------------------------===//
1371
1372#if 0
1373#define SC_DEBUG(X) std::cerr << X
1374#else
1375#define SC_DEBUG(X)
1376#endif
1377
1378// Module level constructor. Causes the contents of the Module (sans functions)
1379// to be added to the slot table.
1380SlotMachine::SlotMachine(const Module *M)
1381  : TheModule(M)    ///< Saved for lazy initialization.
1382  , TheFunction(0)
1383  , FunctionProcessed(false)
1384  , mMap()
1385  , mTypes()
1386  , fMap()
1387  , fTypes()
1388{
1389}
1390
1391// Function level constructor. Causes the contents of the Module and the one
1392// function provided to be added to the slot table.
1393SlotMachine::SlotMachine(const Function *F )
1394  : TheModule( F ? F->getParent() : 0 ) ///< Saved for lazy initialization
1395  , TheFunction(F) ///< Saved for lazy initialization
1396  , FunctionProcessed(false)
1397  , mMap()
1398  , mTypes()
1399  , fMap()
1400  , fTypes()
1401{
1402}
1403
1404inline void SlotMachine::initialize(void) {
1405  if ( TheModule) {
1406    processModule();
1407    TheModule = 0; ///< Prevent re-processing next time we're called.
1408  }
1409  if ( TheFunction && ! FunctionProcessed) {
1410    processFunction();
1411  }
1412}
1413
1414// Iterate through all the global variables, functions, and global
1415// variable initializers and create slots for them.
1416void SlotMachine::processModule() {
1417  SC_DEBUG("begin processModule!\n");
1418
1419  // Add all of the global variables to the value table...
1420  for (Module::const_global_iterator I = TheModule->global_begin(), E = TheModule->global_end();
1421       I != E; ++I)
1422    createSlot(I);
1423
1424  // Add all the functions to the table
1425  for (Module::const_iterator I = TheModule->begin(), E = TheModule->end();
1426       I != E; ++I)
1427    createSlot(I);
1428
1429  SC_DEBUG("end processModule!\n");
1430}
1431
1432
1433// Process the arguments, basic blocks, and instructions  of a function.
1434void SlotMachine::processFunction() {
1435  SC_DEBUG("begin processFunction!\n");
1436
1437  // Add all the function arguments
1438  for(Function::const_arg_iterator AI = TheFunction->arg_begin(),
1439      AE = TheFunction->arg_end(); AI != AE; ++AI)
1440    createSlot(AI);
1441
1442  SC_DEBUG("Inserting Instructions:\n");
1443
1444  // Add all of the basic blocks and instructions
1445  for (Function::const_iterator BB = TheFunction->begin(),
1446       E = TheFunction->end(); BB != E; ++BB) {
1447    createSlot(BB);
1448    for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I!=E; ++I) {
1449      createSlot(I);
1450    }
1451  }
1452
1453  FunctionProcessed = true;
1454
1455  SC_DEBUG("end processFunction!\n");
1456}
1457
1458// Clean up after incorporating a function. This is the only way
1459// to get out of the function incorporation state that affects the
1460// getSlot/createSlot lock. Function incorporation state is indicated
1461// by TheFunction != 0.
1462void SlotMachine::purgeFunction() {
1463  SC_DEBUG("begin purgeFunction!\n");
1464  fMap.clear(); // Simply discard the function level map
1465  fTypes.clear();
1466  TheFunction = 0;
1467  FunctionProcessed = false;
1468  SC_DEBUG("end purgeFunction!\n");
1469}
1470
1471/// Get the slot number for a value. This function will assert if you
1472/// ask for a Value that hasn't previously been inserted with createSlot.
1473/// Types are forbidden because Type does not inherit from Value (any more).
1474int SlotMachine::getSlot(const Value *V) {
1475  assert( V && "Can't get slot for null Value" );
1476  assert(!isa<Constant>(V) || isa<GlobalValue>(V) &&
1477    "Can't insert a non-GlobalValue Constant into SlotMachine");
1478
1479  // Check for uninitialized state and do lazy initialization
1480  this->initialize();
1481
1482  // Get the type of the value
1483  const Type* VTy = V->getType();
1484
1485  // Find the type plane in the module map
1486  TypedPlanes::const_iterator MI = mMap.find(VTy);
1487
1488  if ( TheFunction ) {
1489    // Lookup the type in the function map too
1490    TypedPlanes::const_iterator FI = fMap.find(VTy);
1491    // If there is a corresponding type plane in the function map
1492    if ( FI != fMap.end() ) {
1493      // Lookup the Value in the function map
1494      ValueMap::const_iterator FVI = FI->second.map.find(V);
1495      // If the value doesn't exist in the function map
1496      if ( FVI == FI->second.map.end() ) {
1497        // Look up the value in the module map.
1498        if (MI == mMap.end()) return -1;
1499        ValueMap::const_iterator MVI = MI->second.map.find(V);
1500        // If we didn't find it, it wasn't inserted
1501        if (MVI == MI->second.map.end()) return -1;
1502        assert( MVI != MI->second.map.end() && "Value not found");
1503        // We found it only at the module level
1504        return MVI->second;
1505
1506      // else the value exists in the function map
1507      } else {
1508        // Return the slot number as the module's contribution to
1509        // the type plane plus the index in the function's contribution
1510        // to the type plane.
1511        if (MI != mMap.end())
1512          return MI->second.next_slot + FVI->second;
1513        else
1514          return FVI->second;
1515      }
1516    }
1517  }
1518
1519  // N.B. Can get here only if either !TheFunction or the function doesn't
1520  // have a corresponding type plane for the Value
1521
1522  // Make sure the type plane exists
1523  if (MI == mMap.end()) return -1;
1524  // Lookup the value in the module's map
1525  ValueMap::const_iterator MVI = MI->second.map.find(V);
1526  // Make sure we found it.
1527  if (MVI == MI->second.map.end()) return -1;
1528  // Return it.
1529  return MVI->second;
1530}
1531
1532/// Get the slot number for a value. This function will assert if you
1533/// ask for a Value that hasn't previously been inserted with createSlot.
1534/// Types are forbidden because Type does not inherit from Value (any more).
1535int SlotMachine::getSlot(const Type *Ty) {
1536  assert( Ty && "Can't get slot for null Type" );
1537
1538  // Check for uninitialized state and do lazy initialization
1539  this->initialize();
1540
1541  if ( TheFunction ) {
1542    // Lookup the Type in the function map
1543    TypeMap::const_iterator FTI = fTypes.map.find(Ty);
1544    // If the Type doesn't exist in the function map
1545    if ( FTI == fTypes.map.end() ) {
1546      TypeMap::const_iterator MTI = mTypes.map.find(Ty);
1547      // If we didn't find it, it wasn't inserted
1548      if (MTI == mTypes.map.end())
1549        return -1;
1550      // We found it only at the module level
1551      return MTI->second;
1552
1553    // else the value exists in the function map
1554    } else {
1555      // Return the slot number as the module's contribution to
1556      // the type plane plus the index in the function's contribution
1557      // to the type plane.
1558      return mTypes.next_slot + FTI->second;
1559    }
1560  }
1561
1562  // N.B. Can get here only if either !TheFunction
1563
1564  // Lookup the value in the module's map
1565  TypeMap::const_iterator MTI = mTypes.map.find(Ty);
1566  // Make sure we found it.
1567  if (MTI == mTypes.map.end()) return -1;
1568  // Return it.
1569  return MTI->second;
1570}
1571
1572// Create a new slot, or return the existing slot if it is already
1573// inserted. Note that the logic here parallels getSlot but instead
1574// of asserting when the Value* isn't found, it inserts the value.
1575unsigned SlotMachine::createSlot(const Value *V) {
1576  assert( V && "Can't insert a null Value to SlotMachine");
1577  assert(!isa<Constant>(V) || isa<GlobalValue>(V) &&
1578    "Can't insert a non-GlobalValue Constant into SlotMachine");
1579
1580  const Type* VTy = V->getType();
1581
1582  // Just ignore void typed things
1583  if (VTy == Type::VoidTy) return 0; // FIXME: Wrong return value!
1584
1585  // Look up the type plane for the Value's type from the module map
1586  TypedPlanes::const_iterator MI = mMap.find(VTy);
1587
1588  if ( TheFunction ) {
1589    // Get the type plane for the Value's type from the function map
1590    TypedPlanes::const_iterator FI = fMap.find(VTy);
1591    // If there is a corresponding type plane in the function map
1592    if ( FI != fMap.end() ) {
1593      // Lookup the Value in the function map
1594      ValueMap::const_iterator FVI = FI->second.map.find(V);
1595      // If the value doesn't exist in the function map
1596      if ( FVI == FI->second.map.end() ) {
1597        // If there is no corresponding type plane in the module map
1598        if ( MI == mMap.end() )
1599          return insertValue(V);
1600        // Look up the value in the module map
1601        ValueMap::const_iterator MVI = MI->second.map.find(V);
1602        // If we didn't find it, it wasn't inserted
1603        if ( MVI == MI->second.map.end() )
1604          return insertValue(V);
1605        else
1606          // We found it only at the module level
1607          return MVI->second;
1608
1609      // else the value exists in the function map
1610      } else {
1611        if ( MI == mMap.end() )
1612          return FVI->second;
1613        else
1614          // Return the slot number as the module's contribution to
1615          // the type plane plus the index in the function's contribution
1616          // to the type plane.
1617          return MI->second.next_slot + FVI->second;
1618      }
1619
1620    // else there is not a corresponding type plane in the function map
1621    } else {
1622      // If the type plane doesn't exists at the module level
1623      if ( MI == mMap.end() ) {
1624        return insertValue(V);
1625      // else type plane exists at the module level, examine it
1626      } else {
1627        // Look up the value in the module's map
1628        ValueMap::const_iterator MVI = MI->second.map.find(V);
1629        // If we didn't find it there either
1630        if ( MVI == MI->second.map.end() )
1631          // Return the slot number as the module's contribution to
1632          // the type plane plus the index of the function map insertion.
1633          return MI->second.next_slot + insertValue(V);
1634        else
1635          return MVI->second;
1636      }
1637    }
1638  }
1639
1640  // N.B. Can only get here if !TheFunction
1641
1642  // If the module map's type plane is not for the Value's type
1643  if ( MI != mMap.end() ) {
1644    // Lookup the value in the module's map
1645    ValueMap::const_iterator MVI = MI->second.map.find(V);
1646    if ( MVI != MI->second.map.end() )
1647      return MVI->second;
1648  }
1649
1650  return insertValue(V);
1651}
1652
1653// Create a new slot, or return the existing slot if it is already
1654// inserted. Note that the logic here parallels getSlot but instead
1655// of asserting when the Value* isn't found, it inserts the value.
1656unsigned SlotMachine::createSlot(const Type *Ty) {
1657  assert( Ty && "Can't insert a null Type to SlotMachine");
1658
1659  if ( TheFunction ) {
1660    // Lookup the Type in the function map
1661    TypeMap::const_iterator FTI = fTypes.map.find(Ty);
1662    // If the type doesn't exist in the function map
1663    if ( FTI == fTypes.map.end() ) {
1664      // Look up the type in the module map
1665      TypeMap::const_iterator MTI = mTypes.map.find(Ty);
1666      // If we didn't find it, it wasn't inserted
1667      if ( MTI == mTypes.map.end() )
1668        return insertValue(Ty);
1669      else
1670        // We found it only at the module level
1671        return MTI->second;
1672
1673    // else the value exists in the function map
1674    } else {
1675      // Return the slot number as the module's contribution to
1676      // the type plane plus the index in the function's contribution
1677      // to the type plane.
1678      return mTypes.next_slot + FTI->second;
1679    }
1680  }
1681
1682  // N.B. Can only get here if !TheFunction
1683
1684  // Lookup the type in the module's map
1685  TypeMap::const_iterator MTI = mTypes.map.find(Ty);
1686  if ( MTI != mTypes.map.end() )
1687    return MTI->second;
1688
1689  return insertValue(Ty);
1690}
1691
1692// Low level insert function. Minimal checking is done. This
1693// function is just for the convenience of createSlot (above).
1694unsigned SlotMachine::insertValue(const Value *V ) {
1695  assert(V && "Can't insert a null Value into SlotMachine!");
1696  assert(!isa<Constant>(V) || isa<GlobalValue>(V) &&
1697    "Can't insert a non-GlobalValue Constant into SlotMachine");
1698
1699  // If this value does not contribute to a plane (is void)
1700  // or if the value already has a name then ignore it.
1701  if (V->getType() == Type::VoidTy || V->hasName() ) {
1702      SC_DEBUG("ignored value " << *V << "\n");
1703      return 0;   // FIXME: Wrong return value
1704  }
1705
1706  const Type *VTy = V->getType();
1707  unsigned DestSlot = 0;
1708
1709  if ( TheFunction ) {
1710    TypedPlanes::iterator I = fMap.find( VTy );
1711    if ( I == fMap.end() )
1712      I = fMap.insert(std::make_pair(VTy,ValuePlane())).first;
1713    DestSlot = I->second.map[V] = I->second.next_slot++;
1714  } else {
1715    TypedPlanes::iterator I = mMap.find( VTy );
1716    if ( I == mMap.end() )
1717      I = mMap.insert(std::make_pair(VTy,ValuePlane())).first;
1718    DestSlot = I->second.map[V] = I->second.next_slot++;
1719  }
1720
1721  SC_DEBUG("  Inserting value [" << VTy << "] = " << V << " slot=" <<
1722           DestSlot << " [");
1723  // G = Global, C = Constant, T = Type, F = Function, o = other
1724  SC_DEBUG((isa<GlobalVariable>(V) ? 'G' : (isa<Function>(V) ? 'F' :
1725           (isa<Constant>(V) ? 'C' : 'o'))));
1726  SC_DEBUG("]\n");
1727  return DestSlot;
1728}
1729
1730// Low level insert function. Minimal checking is done. This
1731// function is just for the convenience of createSlot (above).
1732unsigned SlotMachine::insertValue(const Type *Ty ) {
1733  assert(Ty && "Can't insert a null Type into SlotMachine!");
1734
1735  unsigned DestSlot = 0;
1736
1737  if ( TheFunction ) {
1738    DestSlot = fTypes.map[Ty] = fTypes.next_slot++;
1739  } else {
1740    DestSlot = fTypes.map[Ty] = fTypes.next_slot++;
1741  }
1742  SC_DEBUG("  Inserting type [" << DestSlot << "] = " << Ty << "\n");
1743  return DestSlot;
1744}
1745
1746// vim: sw=2
1747