forked from OSchip/llvm-project
[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:
parent
33b61c5678
commit
219a2eb4d4
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
Loading…
Reference in New Issue