blob: 4a99cb3c4ca4cb87c32a2854c86e42bd8dabf2f3 [file] [log] [blame]
Chris Lattner9530a6f2002-02-11 22:35:46 +00001//===-- EmitBytecodeToAssembly.cpp - Emit bytecode to Sparc .s File --------==//
2//
3// This file implements the pass that writes LLVM bytecode as data to a sparc
4// assembly file. The bytecode gets assembled into a special bytecode section
5// of the executable for use at runtime later.
6//
7//===----------------------------------------------------------------------===//
8
9#include "SparcInternals.h"
Chris Lattnerd50b6712002-04-28 20:40:59 +000010#include "llvm/Pass.h"
Chris Lattner9530a6f2002-02-11 22:35:46 +000011#include "llvm/Bytecode/Writer.h"
Vikram S. Adve9ee9d712002-03-03 20:46:32 +000012#include <iostream>
Mehwish Nagda0009c2e2002-07-25 17:22:48 +000013
Anand Shukla3ee2ea82002-07-21 09:35:01 +000014using std::ostream;
Chris Lattner9530a6f2002-02-11 22:35:46 +000015
16namespace {
17
18 // sparcasmbuf - stream buf for encoding output bytes as .byte directives for
19 // the sparc assembler.
20 //
Anand Shukla3ee2ea82002-07-21 09:35:01 +000021 class sparcasmbuf : public std::streambuf {
Chris Lattner9530a6f2002-02-11 22:35:46 +000022 std::ostream &BaseStr;
23 public:
Chris Lattner49b8a9c2002-02-24 23:02:40 +000024 typedef char char_type;
25 typedef int int_type;
26 typedef std::streampos pos_type;
27 typedef std::streamoff off_type;
Chris Lattner9530a6f2002-02-11 22:35:46 +000028
29 sparcasmbuf(std::ostream &On) : BaseStr(On) {}
30
31 virtual int_type overflow(int_type C) {
32 if (C != EOF)
33 BaseStr << "\t.byte " << C << "\n"; // Output C;
34 return C;
35 }
36 };
37
38
39 // osparcasmstream - Define an ostream implementation that uses a sparcasmbuf
40 // as the underlying streambuf to write the data to. This streambuf formats
41 // the output as .byte directives for sparc output.
42 //
Mehwish Nagda0009c2e2002-07-25 17:22:48 +000043 class osparcasmstream : public std::ostream {
Chris Lattner9530a6f2002-02-11 22:35:46 +000044 sparcasmbuf sb;
45 public:
Chris Lattner49b8a9c2002-02-24 23:02:40 +000046 typedef char char_type;
47 typedef int int_type;
48 typedef std::streampos pos_type;
49 typedef std::streamoff off_type;
Chris Lattner9530a6f2002-02-11 22:35:46 +000050
Mehwish Nagda0009c2e2002-07-25 17:22:48 +000051 explicit osparcasmstream(std::ostream &On) : std::ostream(&sb), sb(On) { }
Chris Lattner9530a6f2002-02-11 22:35:46 +000052
53 sparcasmbuf *rdbuf() const {
54 return const_cast<sparcasmbuf*>(&sb);
55 }
56 };
57
58 // SparcBytecodeWriter - Write bytecode out to a stream that is sparc'ified
59 class SparcBytecodeWriter : public Pass {
60 std::ostream &Out;
61 public:
62 SparcBytecodeWriter(std::ostream &out) : Out(out) {}
63
Chris Lattner96c466b2002-04-29 14:57:45 +000064 const char *getPassName() const { return "Emit Bytecode to Sparc Assembly";}
Mehwish Nagda0009c2e2002-07-25 17:22:48 +000065
Chris Lattner0b12b5f2002-06-25 16:13:21 +000066 virtual bool run(Module &M) {
Chris Lattner9530a6f2002-02-11 22:35:46 +000067 // Write bytecode out to the sparc assembly stream
Anand Shukla3ee2ea82002-07-21 09:35:01 +000068
Mehwish Nagda0009c2e2002-07-25 17:22:48 +000069
Chris Lattner9530a6f2002-02-11 22:35:46 +000070 Out << "\n\n!LLVM BYTECODE OUTPUT\n\t.section \".rodata\"\n\t.align 8\n";
71 Out << "\t.global LLVMBytecode\n\t.type LLVMBytecode,#object\n";
72 Out << "LLVMBytecode:\n";
Anand Shukla3ee2ea82002-07-21 09:35:01 +000073 //changed --anand, to get the size of bytecode
Mehwish Nagda0009c2e2002-07-25 17:22:48 +000074 osparcasmstream OS(Out);
Chris Lattner0b12b5f2002-06-25 16:13:21 +000075 WriteBytecodeToFile(&M, OS);
Chris Lattner9530a6f2002-02-11 22:35:46 +000076
Mehwish Nagda0009c2e2002-07-25 17:22:48 +000077
Chris Lattner9530a6f2002-02-11 22:35:46 +000078 Out << ".end_LLVMBytecode:\n";
79 Out << "\t.size LLVMBytecode, .end_LLVMBytecode-LLVMBytecode\n\n";
Anand Shukla3ee2ea82002-07-21 09:35:01 +000080
Mehwish Nagda0009c2e2002-07-25 17:22:48 +000081
82 Out <<"\n\n!LLVM BYTECODE Length\n";
83 Out <<"\t.section \".data\",#alloc,#write\n";
84 Out <<"\t.global llvm_length\n";
85 Out <<"\t.align 4\n";
86 Out <<"\t.type llvm_length,#object\n";
87 Out <<"\t.size llvm_length,4\n";
88 Out <<"llvm_length:\n";
89 Out <<"\t.word\t.end_LLVMBytecode-LLVMBytecode\n";
Chris Lattner9530a6f2002-02-11 22:35:46 +000090 return false;
91 }
92 };
93} // end anonymous namespace
94
95Pass *UltraSparc::getEmitBytecodeToAsmPass(std::ostream &Out) {
96 return new SparcBytecodeWriter(Out);
97}