diff options
Diffstat (limited to 'include/llvm/Assembly')
-rw-r--r-- | include/llvm/Assembly/Parser.h | 66 | ||||
-rw-r--r-- | include/llvm/Assembly/Writer.h | 79 |
2 files changed, 145 insertions, 0 deletions
diff --git a/include/llvm/Assembly/Parser.h b/include/llvm/Assembly/Parser.h new file mode 100644 index 0000000000..5ac6ec20fa --- /dev/null +++ b/include/llvm/Assembly/Parser.h @@ -0,0 +1,66 @@ +//===-- llvm/assembly/Parser.h - Parser for VM assembly files ----*- C++ -*--=// +// +// These classes are implemented by the lib/AssemblyParser library. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_ASSEMBLY_PARSER_H +#define LLVM_ASSEMBLY_PARSER_H + +#include <string> + +class Module; +class ToolCommandLine; +class ParseException; + + +// The useful interface defined by this file... Parse an ascii file, and return +// the internal representation in a nice slice'n'dice'able representation. +// +Module *ParseAssemblyFile(const ToolCommandLine &Opts) throw (ParseException); + +//===------------------------------------------------------------------------=== +// Helper Classes +//===------------------------------------------------------------------------=== + +// ParseException - For when an exceptional event is generated by the parser. +// This class lets you print out the exception message +// +class ParseException { +public: + ParseException(const ToolCommandLine &Opts, const string &message, + int LineNo = -1, int ColNo = -1); + + ParseException(const ParseException &E); + + // getMessage - Return the message passed in at construction time plus extra + // information extracted from the options used to parse with... + // + const string getMessage() const; + + inline const string getRawMessage() const { // Just the raw message... + return Message; + } + + inline const ToolCommandLine &getOptions() const { + return Opts; // Get the options obj used to parse. + } + + // getErrorLocation - Return the line and column number of the error in the + // input source file. The source filename can be derived from the + // ParserOptions in effect. If positional information is not applicable, + // these will return a value of -1. + // + inline const void getErrorLocation(int &Line, int &Column) const { + Line = LineNo; Column = ColumnNo; + } + +private : + const ToolCommandLine &Opts; + string Message; + int LineNo, ColumnNo; // -1 if not relevant + + ParseException &operator=(const ParseException &E); // objects by reference +}; + +#endif diff --git a/include/llvm/Assembly/Writer.h b/include/llvm/Assembly/Writer.h new file mode 100644 index 0000000000..71e2f4e054 --- /dev/null +++ b/include/llvm/Assembly/Writer.h @@ -0,0 +1,79 @@ +//===-- llvm/assembly/Writer.h - Printer for VM assembly files ---*- C++ -*--=// +// +// This functionality is implemented by the lib/AssemblyWriter 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 library uses the Analysis library to figure out offsets for +// variables in the method tables... +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_ASSEMBLY_WRITER_H +#define LLVM_ASSEMBLY_WRITER_H + +#include <iostream> +#include "llvm/Type.h" + +class Module; +class Method; +class BasicBlock; +class Instruction; + +// 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); + + + +// Define operator<< to work on the various classes that we can send to an +// ostream... +// +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 << "<null Type>"; + 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 <<I->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 << "<unknown value type: " << I->getValueType() << ">"; + } + return o; +} + +#endif |