blob: fd968bc9ea304be46d670023d6365143f5273a64 [file] [log] [blame]
Dan Gohman10e730a2015-06-29 23:51:55 +00001// WebAssemblyInstPrinter.h - Print wasm MCInst to assembly syntax -*- C++ -*-//
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
Adrian Prantl5f8f34e42018-05-01 15:54:18 +000011/// This class prints an WebAssembly MCInst to wasm file syntax.
Dan Gohman10e730a2015-06-29 23:51:55 +000012///
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_LIB_TARGET_WEBASSEMBLY_INSTPRINTER_WEBASSEMBLYINSTPRINTER_H
16#define LLVM_LIB_TARGET_WEBASSEMBLY_INSTPRINTER_WEBASSEMBLYINSTPRINTER_H
17
Eric Liu01792302016-04-18 12:21:59 +000018#include "llvm/ADT/SmallVector.h"
Zachary Turner264b5d92017-06-07 03:48:56 +000019#include "llvm/BinaryFormat/Wasm.h"
Dan Gohman83947562016-01-20 05:54:22 +000020#include "llvm/MC/MCInstPrinter.h"
David Blaikie13e77db2018-03-23 23:58:25 +000021#include "llvm/Support/MachineValueType.h"
Dan Gohman10e730a2015-06-29 23:51:55 +000022
23namespace llvm {
24
Dan Gohman10e730a2015-06-29 23:51:55 +000025class MCSubtargetInfo;
26
Dan Gohmanfd4a88c2015-11-25 16:29:24 +000027class WebAssemblyInstPrinter final : public MCInstPrinter {
Heejin Ahn3103d3d2018-10-25 23:45:48 +000028 uint64_t ControlFlowCounter = 0;
29 uint64_t EHPadStackCounter = 0;
30 SmallVector<std::pair<uint64_t, bool>, 4> ControlFlowStack;
31 SmallVector<uint64_t, 4> EHPadStack;
32
33 enum EHInstKind { TRY, CATCH, END_TRY };
34 EHInstKind LastSeenEHInst = END_TRY;
Dan Gohman1d68e80f2016-01-12 19:14:46 +000035
Dan Gohman10e730a2015-06-29 23:51:55 +000036public:
37 WebAssemblyInstPrinter(const MCAsmInfo &MAI, const MCInstrInfo &MII,
38 const MCRegisterInfo &MRI);
39
40 void printRegName(raw_ostream &OS, unsigned RegNo) const override;
41 void printInst(const MCInst *MI, raw_ostream &OS, StringRef Annot,
42 const MCSubtargetInfo &STI) override;
JF Bastienb9073fb2015-07-22 21:28:15 +000043
JF Bastienaf111db2015-08-24 22:16:48 +000044 // Used by tblegen code.
45 void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O);
Wouter van Oortmerssend3c544a2018-12-17 22:04:44 +000046 void printBrList(const MCInst *MI, unsigned OpNo, raw_ostream &O);
Dan Gohmanbb372242016-01-26 03:39:31 +000047 void printWebAssemblyP2AlignOperand(const MCInst *MI, unsigned OpNo,
48 raw_ostream &O);
Dan Gohman2726b882016-10-06 22:29:32 +000049 void printWebAssemblySignatureOperand(const MCInst *MI, unsigned OpNo,
50 raw_ostream &O);
JF Bastienaf111db2015-08-24 22:16:48 +000051
JF Bastienb9073fb2015-07-22 21:28:15 +000052 // Autogenerated by tblgen.
53 void printInstruction(const MCInst *MI, raw_ostream &O);
54 static const char *getRegisterName(unsigned RegNo);
Dan Gohman10e730a2015-06-29 23:51:55 +000055};
56
Dan Gohman5e0886b2015-12-06 19:42:29 +000057namespace WebAssembly {
58
Derek Schuff77a7a382018-10-03 22:22:48 +000059const char *TypeToString(wasm::ValType Ty);
Dan Gohman5e0886b2015-12-06 19:42:29 +000060
61} // end namespace WebAssembly
62
Dan Gohman10e730a2015-06-29 23:51:55 +000063} // end namespace llvm
64
65#endif