LCOV - code coverage report
Current view: top level - lib/Target/WebAssembly/MCTargetDesc - WebAssemblyTargetStreamer.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 67 77 87.0 %
Date: 2018-10-20 13:21:21 Functions: 16 21 76.2 %
Legend: Lines: hit not hit

          Line data    Source code
       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             : /// 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/MCSectionWasm.h"
      21             : #include "llvm/MC/MCSubtargetInfo.h"
      22             : #include "llvm/MC/MCSymbolWasm.h"
      23             : #include "llvm/Support/Casting.h"
      24             : #include "llvm/Support/ErrorHandling.h"
      25             : #include "llvm/Support/FormattedStream.h"
      26             : using namespace llvm;
      27             : 
      28         307 : WebAssemblyTargetStreamer::WebAssemblyTargetStreamer(MCStreamer &S)
      29         307 :     : MCTargetStreamer(S) {}
      30             : 
      31           8 : void WebAssemblyTargetStreamer::emitValueType(wasm::ValType Type) {
      32           8 :   Streamer.EmitIntValue(uint8_t(Type), 1);
      33           8 : }
      34             : 
      35         157 : WebAssemblyTargetAsmStreamer::WebAssemblyTargetAsmStreamer(
      36         157 :     MCStreamer &S, formatted_raw_ostream &OS)
      37         157 :     : WebAssemblyTargetStreamer(S), OS(OS) {}
      38             : 
      39         150 : WebAssemblyTargetWasmStreamer::WebAssemblyTargetWasmStreamer(MCStreamer &S)
      40         150 :     : WebAssemblyTargetStreamer(S) {}
      41             : 
      42        4222 : static void PrintTypes(formatted_raw_ostream &OS, ArrayRef<MVT> Types) {
      43             :   bool First = true;
      44       13435 :   for (MVT Type : Types) {
      45        9213 :     if (First)
      46             :       First = false;
      47             :     else
      48        4991 :       OS << ", ";
      49        9213 :     OS << WebAssembly::TypeToString(WebAssembly::toValType(Type));
      50             :   }
      51        4222 :   OS << '\n';
      52        4222 : }
      53             : 
      54        2636 : void WebAssemblyTargetAsmStreamer::emitParam(MCSymbol *Symbol,
      55             :                                              ArrayRef<MVT> Types) {
      56        2636 :   if (!Types.empty()) {
      57        2398 :     OS << "\t.param  \t";
      58             : 
      59             :     // FIXME: Currently this applies to the "current" function; it may
      60             :     // be cleaner to specify an explicit symbol as part of the directive.
      61             : 
      62        2398 :     PrintTypes(OS, Types);
      63             :   }
      64        2636 : }
      65             : 
      66        2634 : void WebAssemblyTargetAsmStreamer::emitResult(MCSymbol *Symbol,
      67             :                                               ArrayRef<MVT> Types) {
      68        2634 :   if (!Types.empty()) {
      69        1658 :     OS << "\t.result \t";
      70             : 
      71             :     // FIXME: Currently this applies to the "current" function; it may
      72             :     // be cleaner to specify an explicit symbol as part of the directive.
      73             : 
      74        1658 :     PrintTypes(OS, Types);
      75             :   }
      76        2634 : }
      77             : 
      78        2636 : void WebAssemblyTargetAsmStreamer::emitLocal(ArrayRef<MVT> Types) {
      79        2636 :   if (!Types.empty()) {
      80         166 :     OS << "\t.local  \t";
      81         166 :     PrintTypes(OS, Types);
      82             :   }
      83        2636 : }
      84             : 
      85           0 : void WebAssemblyTargetAsmStreamer::emitEndFunc() { OS << "\t.endfunc\n"; }
      86             : 
      87         208 : void WebAssemblyTargetAsmStreamer::emitIndirectFunctionType(
      88             :     MCSymbolWasm *Symbol) {
      89         416 :   OS << "\t.functype\t" << Symbol->getName();
      90         208 :   if (Symbol->getSignature()->Returns.empty())
      91         129 :     OS << ", void";
      92             :   else {
      93             :     assert(Symbol->getSignature()->Returns.size() == 1);
      94          79 :     OS << ", "
      95          79 :        << WebAssembly::TypeToString(Symbol->getSignature()->Returns.front());
      96             :   }
      97         375 :   for (auto Ty : Symbol->getSignature()->Params)
      98         167 :     OS << ", " << WebAssembly::TypeToString(Ty);
      99         208 :   OS << '\n';
     100         208 : }
     101             : 
     102           0 : void WebAssemblyTargetAsmStreamer::emitGlobalImport(StringRef name) {
     103           0 :   OS << "\t.import_global\t" << name << '\n';
     104           0 : }
     105             : 
     106           1 : void WebAssemblyTargetAsmStreamer::emitImportModule(MCSymbolWasm *Sym,
     107             :                                                     StringRef ModuleName) {
     108           2 :   OS << "\t.import_module\t" << Sym->getName() << ", " << ModuleName << '\n';
     109           1 : }
     110             : 
     111           2 : void WebAssemblyTargetAsmStreamer::emitIndIdx(const MCExpr *Value) {
     112           2 :   OS << "\t.indidx  \t" << *Value << '\n';
     113           2 : }
     114             : 
     115         348 : void WebAssemblyTargetWasmStreamer::emitParam(MCSymbol *Symbol,
     116             :                                               ArrayRef<MVT> Types) {
     117             :   // The Symbol already has its signature
     118         348 : }
     119             : 
     120         348 : void WebAssemblyTargetWasmStreamer::emitResult(MCSymbol *Symbol,
     121             :                                                ArrayRef<MVT> Types) {
     122             :   // The Symbol already has its signature
     123         348 : }
     124             : 
     125         348 : void WebAssemblyTargetWasmStreamer::emitLocal(ArrayRef<MVT> Types) {
     126             :   SmallVector<std::pair<MVT, uint32_t>, 4> Grouped;
     127         360 :   for (MVT Type : Types) {
     128          12 :     if (Grouped.empty() || Grouped.back().first != Type)
     129          16 :       Grouped.push_back(std::make_pair(Type, 1));
     130             :     else
     131           4 :       ++Grouped.back().second;
     132             :   }
     133             : 
     134         696 :   Streamer.EmitULEB128IntValue(Grouped.size());
     135         356 :   for (auto Pair : Grouped) {
     136           8 :     Streamer.EmitULEB128IntValue(Pair.second);
     137           8 :     emitValueType(WebAssembly::toValType(Pair.first));
     138             :   }
     139         348 : }
     140             : 
     141           0 : void WebAssemblyTargetWasmStreamer::emitEndFunc() {
     142           0 :   llvm_unreachable(".end_func is not needed for direct wasm output");
     143             : }
     144             : 
     145           0 : void WebAssemblyTargetWasmStreamer::emitIndIdx(const MCExpr *Value) {
     146           0 :   llvm_unreachable(".indidx encoding not yet implemented");
     147             : }
     148             : 
     149          70 : void WebAssemblyTargetWasmStreamer::emitIndirectFunctionType(
     150             :     MCSymbolWasm *Symbol) {
     151             :   // Symbol already has its arguments and result set.
     152             :   Symbol->setType(wasm::WASM_SYMBOL_TYPE_FUNCTION);
     153          70 : }
     154             : 
     155           0 : void WebAssemblyTargetWasmStreamer::emitGlobalImport(StringRef name) {
     156           0 :   llvm_unreachable(".global_import is not needed for direct wasm output");
     157             : }
     158             : 
     159           1 : void WebAssemblyTargetWasmStreamer::emitImportModule(MCSymbolWasm *Sym,
     160             :                                                      StringRef ModuleName) {
     161           1 :   Sym->setModuleName(ModuleName);
     162           1 : }

Generated by: LCOV version 1.13