1 // 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 11 /// This class prints an WebAssembly MCInst to wasm file syntax. 12 /// 13 //===----------------------------------------------------------------------===// 14 15 #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_INSTPRINTER_WEBASSEMBLYINSTPRINTER_H 16 #define LLVM_LIB_TARGET_WEBASSEMBLY_INSTPRINTER_WEBASSEMBLYINSTPRINTER_H 17 18 #include "llvm/ADT/SmallVector.h" 19 #include "llvm/BinaryFormat/Wasm.h" 20 #include "llvm/MC/MCInstPrinter.h" 21 #include "llvm/Support/MachineValueType.h" 22 23 namespace llvm { 24 25 class MCSubtargetInfo; 26 27 class WebAssemblyInstPrinter final : public MCInstPrinter { 28 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; 35 36 public: 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; 43 44 // Used by tblegen code. 45 void printOperand(const MCInst *MI, unsigned OpNo, raw_ostream &O); 46 void printBrList(const MCInst *MI, unsigned OpNo, raw_ostream &O); 47 void printWebAssemblyP2AlignOperand(const MCInst *MI, unsigned OpNo, 48 raw_ostream &O); 49 void printWebAssemblySignatureOperand(const MCInst *MI, unsigned OpNo, 50 raw_ostream &O); 51 52 // Autogenerated by tblgen. 53 void printInstruction(const MCInst *MI, raw_ostream &O); 54 static const char *getRegisterName(unsigned RegNo); 55 }; 56 57 namespace WebAssembly { 58 59 const char *typeToString(wasm::ValType Ty); 60 const char *anyTypeToString(unsigned Ty); 61 62 } // end namespace WebAssembly 63 64 } // end namespace llvm 65 66 #endif 67