| //==- WebAssemblyAsmTypeCheck.h - Assembler for WebAssembly -*- C++ -*-==// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// This file is part of the WebAssembly Assembler. |
| /// |
| /// It contains code to translate a parsed .s file into MCInsts. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_ASMPARSER_TYPECHECK_H |
| #define LLVM_LIB_TARGET_WEBASSEMBLY_ASMPARSER_TYPECHECK_H |
| |
| #include "llvm/MC/MCParser/MCAsmParser.h" |
| #include "llvm/MC/MCInstrInfo.h" |
| #include "llvm/BinaryFormat/Wasm.h" |
| #include "llvm/MC/MCSymbol.h" |
| |
| namespace llvm { |
| |
| class WebAssemblyAsmTypeCheck final { |
| MCAsmParser &Parser; |
| const MCInstrInfo &MII; |
| |
| SmallVector<wasm::ValType, 8> Stack; |
| SmallVector<wasm::ValType, 16> LocalTypes; |
| SmallVector<wasm::ValType, 4> ReturnTypes; |
| wasm::WasmSignature LastSig; |
| bool TypeErrorThisFunction = false; |
| bool Unreachable = false; |
| bool is64; |
| |
| void dumpTypeStack(Twine Msg); |
| bool typeError(SMLoc ErrorLoc, const Twine &Msg); |
| bool popType(SMLoc ErrorLoc, Optional<wasm::ValType> EVT); |
| bool getLocal(SMLoc ErrorLoc, const MCInst &Inst, wasm::ValType &Type); |
| bool checkEnd(SMLoc ErrorLoc); |
| bool checkSig(SMLoc ErrorLoc, const wasm::WasmSignature &Sig); |
| bool getSymRef(SMLoc ErrorLoc, const MCInst &Inst, |
| const MCSymbolRefExpr *&SymRef); |
| bool getGlobal(SMLoc ErrorLoc, const MCInst &Inst, wasm::ValType &Type); |
| |
| public: |
| WebAssemblyAsmTypeCheck(MCAsmParser &Parser, const MCInstrInfo &MII, bool is64); |
| |
| void funcDecl(const wasm::WasmSignature &Sig); |
| void localDecl(const SmallVector<wasm::ValType, 4> &Locals); |
| void setLastSig(const wasm::WasmSignature &Sig) { LastSig = Sig; } |
| bool endOfFunction(SMLoc ErrorLoc); |
| bool typeCheck(SMLoc ErrorLoc, const MCInst &Inst); |
| |
| void Clear() { |
| Stack.clear(); |
| LocalTypes.clear(); |
| ReturnTypes.clear(); |
| TypeErrorThisFunction = false; |
| Unreachable = false; |
| } |
| }; |
| |
| } // end namespace llvm |
| |
| #endif // LLVM_LIB_TARGET_WEBASSEMBLY_ASMPARSER_TYPECHECK_H |