Write llvm bytecode to output .s file as last step of LLC.
authorChris Lattner <sabre@nondot.org>
Mon, 11 Feb 2002 22:35:46 +0000 (22:35 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 11 Feb 2002 22:35:46 +0000 (22:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1728 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/SparcV9/EmitBytecodeToAssembly.cpp [new file with mode: 0644]
lib/Target/SparcV9/SparcV9Internals.h
lib/Target/SparcV9/SparcV9TargetMachine.cpp

diff --git a/lib/Target/SparcV9/EmitBytecodeToAssembly.cpp b/lib/Target/SparcV9/EmitBytecodeToAssembly.cpp
new file mode 100644 (file)
index 0000000..7cbf085
--- /dev/null
@@ -0,0 +1,77 @@
+//===-- EmitBytecodeToAssembly.cpp - Emit bytecode to Sparc .s File --------==//
+//
+// 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
+// of the executable for use at runtime later.
+//
+//===----------------------------------------------------------------------===//
+
+#include "SparcInternals.h"
+#include "llvm/Bytecode/Writer.h"
+
+namespace {
+
+  // sparcasmbuf - stream buf for encoding output bytes as .byte directives for
+  // the sparc assembler.
+  //
+  class sparcasmbuf : public streambuf {
+    std::ostream &BaseStr;
+  public:
+    typedef char        char_type;
+    typedef int         int_type;
+    typedef streampos   pos_type;
+    typedef streamoff   off_type;
+    
+    sparcasmbuf(std::ostream &On) : BaseStr(On) {}
+
+    virtual int_type overflow(int_type C) {
+      if (C != EOF)
+        BaseStr << "\t.byte " << C << "\n"; // Output C;
+      return C;
+    }
+  };
+
+
+  // osparcasmstream - Define an ostream implementation that uses a sparcasmbuf
+  // as the underlying streambuf to write the data to.  This streambuf formats
+  // the output as .byte directives for sparc output.
+  //
+  class osparcasmstream : public ostream {
+    sparcasmbuf sb;
+  public:
+    typedef char      char_type;
+    typedef int       int_type;
+    typedef streampos pos_type;
+    typedef streamoff off_type;
+
+    explicit osparcasmstream(ostream &On) : ostream(&sb), sb(On) { }
+
+    sparcasmbuf *rdbuf() const {
+      return const_cast<sparcasmbuf*>(&sb);
+    }
+  };
+
+  // SparcBytecodeWriter - Write bytecode out to a stream that is sparc'ified
+  class SparcBytecodeWriter : public Pass {
+    std::ostream &Out;
+  public:
+    SparcBytecodeWriter(std::ostream &out) : Out(out) {}
+
+    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";
+      osparcasmstream OS(Out);
+      WriteBytecodeToFile(M, OS);
+
+      Out << ".end_LLVMBytecode:\n";
+      Out << "\t.size LLVMBytecode, .end_LLVMBytecode-LLVMBytecode\n\n";
+      return false;
+    }
+  };
+}  // end anonymous namespace
+
+Pass *UltraSparc::getEmitBytecodeToAsmPass(std::ostream &Out) {
+  return new SparcBytecodeWriter(Out);
+}
index ad3f478b334969283a75e582f602cc3711d73443..73f02c345bdeb03be268a89cd4b3960d19006659 100644 (file)
@@ -607,6 +607,7 @@ public:
 private:
   Pass *getMethodAsmPrinterPass(PassManager &PM, std::ostream &Out);
   Pass *getModuleAsmPrinterPass(PassManager &PM, std::ostream &Out);
+  Pass *getEmitBytecodeToAsmPass(std::ostream &Out);
 };
 
 #endif
index 422dda02bf49b3bf850582c658dce90639de26be..14be99231545608c30d603f359e24faa545bec2d 100644 (file)
@@ -269,4 +269,7 @@ void UltraSparc::addPassesToEmitAssembly(PassManager &PM, std::ostream &Out) {
 
   // Emit Module level assembly after all of the methods have been processed.
   PM.add(getModuleAsmPrinterPass(PM, Out));
+
+  // Emit bytecode to the sparc assembly file into its special section next
+  PM.add(getEmitBytecodeToAsmPass(Out));
 }