X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FSparcV9%2FEmitBytecodeToAssembly.cpp;h=eeb288a33dcb691a944fe5bf623d0a95135e1a45;hb=541f91b17c33712e2c92f02916082832e6d73c46;hp=4a99cb3c4ca4cb87c32a2854c86e42bd8dabf2f3;hpb=0009c2e8b38478eef745c777eafcca511cabc246;p=oota-llvm.git diff --git a/lib/Target/SparcV9/EmitBytecodeToAssembly.cpp b/lib/Target/SparcV9/EmitBytecodeToAssembly.cpp index 4a99cb3c4ca..eeb288a33dc 100644 --- a/lib/Target/SparcV9/EmitBytecodeToAssembly.cpp +++ b/lib/Target/SparcV9/EmitBytecodeToAssembly.cpp @@ -1,4 +1,11 @@ -//===-- EmitBytecodeToAssembly.cpp - Emit bytecode to Sparc .s File --------==// +//===-- EmitBytecodeToAssembly.cpp - Emit bytecode to SparcV9 .s File ------==// +// +// The LLVM Compiler Infrastructure +// +// 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. +// +//===----------------------------------------------------------------------===// // // This file implements the pass that writes LLVM bytecode as data to a sparc // assembly file. The bytecode gets assembled into a special bytecode section @@ -6,12 +13,11 @@ // //===----------------------------------------------------------------------===// -#include "SparcInternals.h" +#include "SparcV9Internals.h" #include "llvm/Pass.h" #include "llvm/Bytecode/Writer.h" #include - -using std::ostream; +using namespace llvm; namespace { @@ -25,7 +31,7 @@ namespace { typedef int int_type; typedef std::streampos pos_type; typedef std::streamoff off_type; - + sparcasmbuf(std::ostream &On) : BaseStr(On) {} virtual int_type overflow(int_type C) { @@ -55,43 +61,55 @@ namespace { } }; - // SparcBytecodeWriter - Write bytecode out to a stream that is sparc'ified - class SparcBytecodeWriter : public Pass { + static void writePrologue (std::ostream &Out, const std::string &comment, + const std::string &symName) { + // Prologue: + // Output a comment describing the object. + Out << "!" << comment << "\n"; + // Switch the current section to .rodata in the assembly output: + Out << "\t.section \".rodata\"\n\t.align 8\n"; + // Output a global symbol naming the object: + Out << "\t.global " << symName << "\n"; + Out << "\t.type " << symName << ",#object\n"; + Out << symName << ":\n"; + } + + static void writeEpilogue (std::ostream &Out, const std::string &symName) { + // Epilogue: + // Output a local symbol marking the end of the object: + Out << ".end_" << symName << ":\n"; + // Output size directive giving the size of the object: + Out << "\t.size " << symName << ", .end_" << symName << "-" << symName + << "\n"; + } + + // SparcV9BytecodeWriter - Write bytecode out to a stream that is sparc'ified + class SparcV9BytecodeWriter : public ModulePass { std::ostream &Out; public: - SparcBytecodeWriter(std::ostream &out) : Out(out) {} - - const char *getPassName() const { return "Emit Bytecode to Sparc Assembly";} - - virtual bool run(Module &M) { - // Write bytecode out to the sparc assembly stream - - - Out << "\n\n!LLVM BYTECODE OUTPUT\n\t.section \".rodata\"\n\t.align 8\n"; - Out << "\t.global LLVMBytecode\n\t.type LLVMBytecode,#object\n"; - Out << "LLVMBytecode:\n"; - //changed --anand, to get the size of bytecode + SparcV9BytecodeWriter(std::ostream &out) : Out(out) {} + + const char *getPassName() const { return "Emit Bytecode to SparcV9 Assembly";} + + virtual bool runOnModule(Module &M) { + // Write an object containing the bytecode to the SPARC assembly stream + writePrologue (Out, "LLVM BYTECODE OUTPUT", "LLVMBytecode"); osparcasmstream OS(Out); WriteBytecodeToFile(&M, OS); + writeEpilogue (Out, "LLVMBytecode"); + + // Write an object containing its length as an integer to the + // SPARC assembly stream + writePrologue (Out, "LLVM BYTECODE LENGTH", "llvm_length"); + Out <<"\t.word\t.end_LLVMBytecode-LLVMBytecode\n"; + writeEpilogue (Out, "llvm_length"); - - Out << ".end_LLVMBytecode:\n"; - Out << "\t.size LLVMBytecode, .end_LLVMBytecode-LLVMBytecode\n\n"; - - - Out <<"\n\n!LLVM BYTECODE Length\n"; - Out <<"\t.section \".data\",#alloc,#write\n"; - Out <<"\t.global llvm_length\n"; - Out <<"\t.align 4\n"; - Out <<"\t.type llvm_length,#object\n"; - Out <<"\t.size llvm_length,4\n"; - Out <<"llvm_length:\n"; - Out <<"\t.word\t.end_LLVMBytecode-LLVMBytecode\n"; return false; } }; } // end anonymous namespace -Pass *UltraSparc::getEmitBytecodeToAsmPass(std::ostream &Out) { - return new SparcBytecodeWriter(Out); +ModulePass *llvm::createBytecodeAsmPrinterPass(std::ostream &Out) { + return new SparcV9BytecodeWriter(Out); } +