X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FAssembly%2FWriter.h;h=f87dc12ad0fd1952fbe6f83967511f4bf1d9acbc;hb=fd479b6fd4fe7ec83421a8b999e6b02d86a9e006;hp=68a5ed28122b1ded18cece14eaf4af9c2c83e23c;hpb=d1ee90f1a5fd695e5d6f0b22319d564d55d6cdcb;p=oota-llvm.git diff --git a/include/llvm/Assembly/Writer.h b/include/llvm/Assembly/Writer.h index 68a5ed28122..f87dc12ad0f 100644 --- a/include/llvm/Assembly/Writer.h +++ b/include/llvm/Assembly/Writer.h @@ -16,76 +16,26 @@ #ifndef LLVM_ASSEMBLY_WRITER_H #define LLVM_ASSEMBLY_WRITER_H -#include -#include "llvm/Type.h" - +#include +class Type; class Module; -class Method; -class BasicBlock; -class Instruction; +class Value; -// The only interface defined by this file... convert the internal -// representation of an object into an ascii bytestream that the parser can -// understand later... (the parser only understands whole classes though) -// -void WriteToAssembly(const Module *Module, ostream &o); -void WriteToAssembly(const Method *Method, ostream &o); -void WriteToAssembly(const BasicBlock *BB, ostream &o); -void WriteToAssembly(const Instruction *In, ostream &o); -void WriteToAssembly(const ConstPoolVal *V, ostream &o); -// WriteToVCG - Dump the specified structure to a VCG file. If method is -// dumped, then the file named is created. If a module is to be written, a -// family of files with a common base name is created, with a method name -// suffix. +// 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; // -void WriteToVCG(const Module *Module, const string &Filename); -void WriteToVCG(const Method *Method, const string &Filename); - +std::ostream &WriteTypeSymbolic(std::ostream &, const Type *, const Module *M); - -// Define operator<< to work on the various classes that we can send to an -// ostream... +// 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). // -inline ostream &operator<<(ostream &o, const Module *C) { - WriteToAssembly(C, o); return o; -} - -inline ostream &operator<<(ostream &o, const Method *M) { - WriteToAssembly(M, o); return o; -} - -inline ostream &operator<<(ostream &o, const BasicBlock *B) { - WriteToAssembly(B, o); return o; -} - -inline ostream &operator<<(ostream &o, const Instruction *I) { - WriteToAssembly(I, o); return o; -} - -inline ostream &operator<<(ostream &o, const ConstPoolVal *I) { - WriteToAssembly(I, o); return o; -} - - -inline ostream &operator<<(ostream &o, const Type *T) { - if (!T) return o << ""; - return o << T->getName(); -} - -inline ostream &operator<<(ostream &o, const Value *I) { - switch (I->getValueType()) { - case Value::TypeVal: return o << (const Type*)I; - case Value::ConstantVal: WriteToAssembly((const ConstPoolVal*)I, o); break; - case Value::MethodArgumentVal: return o <getType() << " " << I->getName(); - case Value::InstructionVal: WriteToAssembly((const Instruction *)I, o); break; - case Value::BasicBlockVal: WriteToAssembly((const BasicBlock *)I, o); break; - case Value::MethodVal: WriteToAssembly((const Method *)I, o); break; - case Value::ModuleVal: WriteToAssembly((const Module *)I, o); break; - default: return o << "getValueType() << ">"; - } - return o; -} +std::ostream &WriteAsOperand(std::ostream &, const Value *, bool PrintTy = true, + bool PrintName = true, const Module *Context = 0); #endif