[WebAssembly] Update WebAssemblyAsmTypeCheck for table.get

This patch is aimed to resolve [[ https://github.com/llvm/llvm-project/issues/53789 | GitHub Issue #53789 ]].

Reviewed By: sbc100

Differential Revision: https://reviews.llvm.org/D120229
This commit is contained in:
kamenokonokotan 2022-03-05 16:34:28 +01:00 committed by Paulo Matos
parent 33b61c5678
commit 219a2eb4d4
3 changed files with 58 additions and 0 deletions

View File

@ -182,6 +182,20 @@ bool WebAssemblyAsmTypeCheck::getGlobal(SMLoc ErrorLoc, const MCInst &Inst,
return false; return false;
} }
bool WebAssemblyAsmTypeCheck::getTable(SMLoc ErrorLoc, const MCInst &Inst,
wasm::ValType &Type) {
const MCSymbolRefExpr *SymRef;
if (getSymRef(ErrorLoc, Inst, SymRef))
return true;
auto WasmSym = cast<MCSymbolWasm>(&SymRef->getSymbol());
if (WasmSym->getType().getValueOr(wasm::WASM_SYMBOL_TYPE_DATA) !=
wasm::WASM_SYMBOL_TYPE_TABLE)
return typeError(ErrorLoc, StringRef("symbol ") + WasmSym->getName() +
" missing .tabletype");
Type = static_cast<wasm::ValType>(WasmSym->getTableType().ElemType);
return false;
}
bool WebAssemblyAsmTypeCheck::endOfFunction(SMLoc ErrorLoc) { bool WebAssemblyAsmTypeCheck::endOfFunction(SMLoc ErrorLoc) {
// Check the return types. // Check the return types.
for (auto RVT : llvm::reverse(ReturnTypes)) { for (auto RVT : llvm::reverse(ReturnTypes)) {
@ -225,6 +239,28 @@ bool WebAssemblyAsmTypeCheck::typeCheck(SMLoc ErrorLoc, const MCInst &Inst) {
return true; return true;
if (popType(ErrorLoc, Type)) if (popType(ErrorLoc, Type))
return true; return true;
} else if (Name == "table.get") {
if (getTable(ErrorLoc, Inst, Type))
return true;
if (popType(ErrorLoc, wasm::ValType::I32))
return true;
Stack.push_back(Type);
} else if (Name == "table.set") {
if (getTable(ErrorLoc, Inst, Type))
return true;
if (popType(ErrorLoc, Type))
return true;
if (popType(ErrorLoc, wasm::ValType::I32))
return true;
} else if (Name == "table.fill") {
if (getTable(ErrorLoc, Inst, Type))
return true;
if (popType(ErrorLoc, wasm::ValType::I32))
return true;
if (popType(ErrorLoc, Type))
return true;
if (popType(ErrorLoc, wasm::ValType::I32))
return true;
} else if (Name == "drop") { } else if (Name == "drop") {
if (popType(ErrorLoc, {})) if (popType(ErrorLoc, {}))
return true; return true;

View File

@ -44,6 +44,7 @@ class WebAssemblyAsmTypeCheck final {
bool getSymRef(SMLoc ErrorLoc, const MCInst &Inst, bool getSymRef(SMLoc ErrorLoc, const MCInst &Inst,
const MCSymbolRefExpr *&SymRef); const MCSymbolRefExpr *&SymRef);
bool getGlobal(SMLoc ErrorLoc, const MCInst &Inst, wasm::ValType &Type); bool getGlobal(SMLoc ErrorLoc, const MCInst &Inst, wasm::ValType &Type);
bool getTable(SMLoc ErrorLoc, const MCInst &Inst, wasm::ValType &Type);
public: public:
WebAssemblyAsmTypeCheck(MCAsmParser &Parser, const MCInstrInfo &MII, bool is64); WebAssemblyAsmTypeCheck(MCAsmParser &Parser, const MCInstrInfo &MII, bool is64);

View File

@ -0,0 +1,21 @@
# RUN: llvm-mc -mattr=+reference-types -triple=wasm32-unknown-unknown -filetype=obj -o - < %s | obj2yaml | FileCheck %s
.globl __indirect_function_table
.tabletype __indirect_function_table, funcref
.globl obtain_funcref_from_table_index
obtain_funcref_from_table_index:
.functype obtain_funcref_from_table_index(i32) -> (funcref)
local.get 0
table.get __indirect_function_table
end_function
# CHECK: Sections:
# CHECK-NEXT: - Type: TYPE
# CHECK-NEXT: Signatures:
# CHECK-NEXT: - Index: 0
# CHECK-NEXT: ParamTypes:
# CHECK-NEXT: - I32
# CHECK-NEXT: ReturnTypes:
# CHECK-NEXT: - FUNCREF