X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FAssembly%2FWriter.h;h=5e5fe1560585da65c631baf6e45ebfcc4c1dcdcb;hb=104cf9e02b0ed94d4173869a598af6c6972a8660;hp=5798ae8ac78628610ec9164141f22056e4feacd7;hpb=6fbcc26f1460eaee4e0eb8b426fc1ff0c7af11be;p=oota-llvm.git diff --git a/include/llvm/Assembly/Writer.h b/include/llvm/Assembly/Writer.h index 5798ae8ac78..5e5fe156058 100644 --- a/include/llvm/Assembly/Writer.h +++ b/include/llvm/Assembly/Writer.h @@ -1,22 +1,16 @@ -//===-- llvm/Assembly/Writer.h - Printer for VM assembly files --*- C++ -*-===// -// -// The LLVM Compiler Infrastructure +//===-- llvm/Assembly/Writer.h - Printer for LLVM assembly files --*- C++ -*-=// // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// +// The LLVM Compiler Infrastructure // -// This functionality is implemented by the lib/Assembly/Writer library. -// This library is used to print VM assembly language files to an iostream. It -// can print VM code at a variety of granularities, ranging from a whole class -// down to an individual instruction. This makes it useful for debugging. +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. // -// This file also defines functions that allow it to output files that a program -// called VCG can read. +//===----------------------------------------------------------------------===// // -// This library uses the Analysis library to figure out offsets for -// variables in the method tables... +// This functionality is implemented by lib/VMCore/AsmWriter.cpp. +// This library is used to print LLVM assembly language files to an iostream. It +// can print LLVM code at a variety of granularities, including Modules, +// BasicBlocks, and Instructions. This makes it useful for debugging. // //===----------------------------------------------------------------------===// @@ -24,23 +18,64 @@ #define LLVM_ASSEMBLY_WRITER_H #include +#include + +namespace llvm { + class Type; class Module; class Value; +class raw_ostream; +template class SmallVectorImpl; + +/// TypePrinting - Type printing machinery. +class TypePrinting { + void *TypeNames; // A map to remember type names. + TypePrinting(const TypePrinting &); // DO NOT IMPLEMENT + void operator=(const TypePrinting&); // DO NOT IMPLEMENT +public: + TypePrinting(); + ~TypePrinting(); + + void clear(); + + void print(const Type *Ty, raw_ostream &OS, bool IgnoreTopLevelName = false); + + void printAtLeastOneLevel(const Type *Ty, raw_ostream &OS) { + print(Ty, OS, true); + } + + /// hasTypeName - Return true if the type has a name in TypeNames, false + /// otherwise. + bool hasTypeName(const Type *Ty) const; + + /// addTypeName - Add a name for the specified type if it doesn't already have + /// one. This name will be printed instead of the structural version of the + /// type in order to make the output more concise. + void addTypeName(const Type *Ty, const std::string &N); + +private: + void CalcTypeName(const Type *Ty, SmallVectorImpl &TypeStack, + raw_ostream &OS, bool IgnoreTopLevelName = false); +}; // WriteTypeSymbolic - This attempts to write the specified type as a symbolic -// type, iff there is an entry in the modules symbol table for the specified -// type or one of it's component types. This is slower than a simple x << Type; +// type, if there is an entry in the Module's symbol table for the specified +// type or one of its component types. // -std::ostream &WriteTypeSymbolic(std::ostream &, const Type *, const Module *M); +void WriteTypeSymbolic(raw_ostream &, const Type *, const Module *M); // WriteAsOperand - Write the name of the specified value out to the specified // ostream. This can be useful when you just want to print int %reg126, not the // whole instruction that generated it. If you specify a Module for context, -// then even constants get pretty printed (for example the type of a null -// pointer is printed symbolically). +// then even constants get pretty-printed; for example, the type of a null +// pointer is printed symbolically. // -std::ostream &WriteAsOperand(std::ostream &, const Value *, bool PrintTy = true, - bool PrintName = true, const Module *Context = 0); +void WriteAsOperand(std::ostream &, const Value *, bool PrintTy = true, + const Module *Context = 0); +void WriteAsOperand(raw_ostream &, const Value *, bool PrintTy = true, + const Module *Context = 0); + +} // End llvm namespace #endif