1 //==-- WebAssemblyTargetStreamer.cpp - WebAssembly Target Streamer Methods --=//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 ///
10 /// \file
11 /// \brief This file defines WebAssembly-specific target streamer classes.
12 /// These are for implementing support for target-specific assembly directives.
13 ///
14 //===----------------------------------------------------------------------===//
15 
16 #include "WebAssemblyTargetStreamer.h"
17 #include "InstPrinter/WebAssemblyInstPrinter.h"
18 #include "WebAssemblyMCTargetDesc.h"
19 #include "llvm/MC/MCContext.h"
20 #include "llvm/MC/MCSectionELF.h"
21 #include "llvm/MC/MCSubtargetInfo.h"
22 #include "llvm/MC/MCSymbolELF.h"
23 #include "llvm/Support/CommandLine.h"
24 #include "llvm/Support/ELF.h"
25 #include "llvm/Support/ErrorHandling.h"
26 #include "llvm/Support/FormattedStream.h"
27 using namespace llvm;
28 
29 WebAssemblyTargetStreamer::WebAssemblyTargetStreamer(MCStreamer &S)
30     : MCTargetStreamer(S) {}
31 
32 WebAssemblyTargetAsmStreamer::WebAssemblyTargetAsmStreamer(
33     MCStreamer &S, formatted_raw_ostream &OS)
34     : WebAssemblyTargetStreamer(S), OS(OS) {}
35 
36 WebAssemblyTargetELFStreamer::WebAssemblyTargetELFStreamer(MCStreamer &S)
37     : WebAssemblyTargetStreamer(S) {}
38 
39 static void PrintTypes(formatted_raw_ostream &OS, ArrayRef<MVT> Types) {
40   bool First = true;
41   for (MVT Type : Types) {
42     if (First)
43       First = false;
44     else
45       OS << ", ";
46     OS << WebAssembly::TypeToString(Type);
47   }
48   OS << '\n';
49 }
50 
51 void WebAssemblyTargetAsmStreamer::emitParam(ArrayRef<MVT> Types) {
52   OS << "\t.param  \t";
53   PrintTypes(OS, Types);
54 }
55 
56 void WebAssemblyTargetAsmStreamer::emitResult(ArrayRef<MVT> Types) {
57   OS << "\t.result \t";
58   PrintTypes(OS, Types);
59 }
60 
61 void WebAssemblyTargetAsmStreamer::emitLocal(ArrayRef<MVT> Types) {
62   OS << "\t.local  \t";
63   PrintTypes(OS, Types);
64 }
65 
66 void WebAssemblyTargetAsmStreamer::emitEndFunc() { OS << "\t.endfunc\n"; }
67 
68 // FIXME: What follows is not the real binary encoding.
69 
70 static void EncodeTypes(MCStreamer &Streamer, ArrayRef<MVT> Types) {
71   Streamer.EmitIntValue(Types.size(), sizeof(uint64_t));
72   for (MVT Type : Types)
73     Streamer.EmitIntValue(Type.SimpleTy, sizeof(uint64_t));
74 }
75 
76 void WebAssemblyTargetELFStreamer::emitParam(ArrayRef<MVT> Types) {
77   Streamer.EmitIntValue(WebAssembly::DotParam, sizeof(uint64_t));
78   EncodeTypes(Streamer, Types);
79 }
80 
81 void WebAssemblyTargetELFStreamer::emitResult(ArrayRef<MVT> Types) {
82   Streamer.EmitIntValue(WebAssembly::DotResult, sizeof(uint64_t));
83   EncodeTypes(Streamer, Types);
84 }
85 
86 void WebAssemblyTargetELFStreamer::emitLocal(ArrayRef<MVT> Types) {
87   Streamer.EmitIntValue(WebAssembly::DotLocal, sizeof(uint64_t));
88   EncodeTypes(Streamer, Types);
89 }
90 
91 void WebAssemblyTargetELFStreamer::emitEndFunc() {
92   Streamer.EmitIntValue(WebAssembly::DotEndFunc, sizeof(uint64_t));
93 }
94