| //===- WebAssemblyStackifierEmitter.cpp - Stackifier cases ------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file emits the switch statement cases to translate WebAssembly |
| // instructions to their stack forms. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "WebAssemblyDisassemblerEmitter.h" |
| #include "llvm/TableGen/Record.h" |
| |
| namespace llvm { |
| |
| // Find all register WebAssembly instructions and their corresponding stack |
| // instructions. For each pair, emit a switch case of the form |
| // |
| // case WebAssembly::RegisterInstr: return WebAssembly::StackInstr; |
| // |
| // For example, |
| // |
| // case WebAssembly::ADD_I32: return WebAssembly::ADD_I32_S; |
| // |
| // This is useful for converting instructions from their register form to their |
| // equivalent stack form. |
| void EmitWebAssemblyStackifier(RecordKeeper &RK, raw_ostream &OS) { |
| Record *InstrClass = RK.getClass("WebAssemblyInst"); |
| for (auto &RecordPair : RK.getDefs()) { |
| if (!RecordPair.second->isSubClassOf(InstrClass)) |
| continue; |
| bool IsStackBased = RecordPair.second->getValueAsBit("StackBased"); |
| if (IsStackBased) |
| continue; |
| OS << " case WebAssembly::" << RecordPair.first << ": return " |
| << "WebAssembly::" << RecordPair.first << "_S;\n"; |
| } |
| } |
| |
| } // namespace llvm |