mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 07:26:24 +02:00
+ implemented TWasmValidationStacks.Validate for many (but not all, yet) instructions
This commit is contained in:
parent
7ffbbdd50b
commit
d7581aa1ee
@ -87,6 +87,8 @@ uses
|
|||||||
property Count: Integer read GetCount;
|
property Count: Integer read GetCount;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
taicpu = class;
|
||||||
|
|
||||||
{ TWasmValidationStacks }
|
{ TWasmValidationStacks }
|
||||||
|
|
||||||
TWasmValidationStacks = class
|
TWasmValidationStacks = class
|
||||||
@ -100,6 +102,7 @@ uses
|
|||||||
procedure PushVal(vt: TWasmBasicType);
|
procedure PushVal(vt: TWasmBasicType);
|
||||||
function PopVal: TWasmBasicType;
|
function PopVal: TWasmBasicType;
|
||||||
function PopVal(expect: TWasmBasicType): TWasmBasicType;
|
function PopVal(expect: TWasmBasicType): TWasmBasicType;
|
||||||
|
function PopVal_RefType: TWasmBasicType;
|
||||||
procedure PushVals(vals: TWasmBasicTypeList);
|
procedure PushVals(vals: TWasmBasicTypeList);
|
||||||
function PopVals(vals: TWasmBasicTypeList): TWasmBasicTypeList;
|
function PopVals(vals: TWasmBasicTypeList): TWasmBasicTypeList;
|
||||||
|
|
||||||
@ -108,6 +111,8 @@ uses
|
|||||||
|
|
||||||
function label_types(const frame: TWasmControlFrame): TWasmBasicTypeList;
|
function label_types(const frame: TWasmControlFrame): TWasmBasicTypeList;
|
||||||
procedure Unreachable;
|
procedure Unreachable;
|
||||||
|
|
||||||
|
procedure Validate(a: taicpu);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
twasmstruc_stack = class;
|
twasmstruc_stack = class;
|
||||||
@ -508,6 +513,14 @@ uses
|
|||||||
internalerror(2024013105);
|
internalerror(2024013105);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TWasmValidationStacks.PopVal_RefType: TWasmBasicType;
|
||||||
|
begin
|
||||||
|
Result:=wbt_Unknown;
|
||||||
|
Result:=PopVal;
|
||||||
|
if not (Result in (WasmReferenceTypes + [wbt_Unknown])) then
|
||||||
|
internalerror(2024020501);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TWasmValidationStacks.PushVals(vals: TWasmBasicTypeList);
|
procedure TWasmValidationStacks.PushVals(vals: TWasmBasicTypeList);
|
||||||
var
|
var
|
||||||
v: TWasmBasicType;
|
v: TWasmBasicType;
|
||||||
@ -571,6 +584,357 @@ uses
|
|||||||
c^.unreachable:=true;
|
c^.unreachable:=true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TWasmValidationStacks.Validate(a: taicpu);
|
||||||
|
begin
|
||||||
|
case a.opcode of
|
||||||
|
a_nop:
|
||||||
|
;
|
||||||
|
a_i32_const:
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
a_i64_const:
|
||||||
|
PushVal(wbt_i64);
|
||||||
|
a_f32_const:
|
||||||
|
PushVal(wbt_f32);
|
||||||
|
a_f64_const:
|
||||||
|
PushVal(wbt_f64);
|
||||||
|
a_i32_add,
|
||||||
|
a_i32_sub,
|
||||||
|
a_i32_mul,
|
||||||
|
a_i32_div_s, a_i32_div_u,
|
||||||
|
a_i32_rem_s, a_i32_rem_u,
|
||||||
|
a_i32_and,
|
||||||
|
a_i32_or,
|
||||||
|
a_i32_xor,
|
||||||
|
a_i32_shl,
|
||||||
|
a_i32_shr_s, a_i32_shr_u,
|
||||||
|
a_i32_rotl,
|
||||||
|
a_i32_rotr:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_i64_add,
|
||||||
|
a_i64_sub,
|
||||||
|
a_i64_mul,
|
||||||
|
a_i64_div_s, a_i64_div_u,
|
||||||
|
a_i64_rem_s, a_i64_rem_u,
|
||||||
|
a_i64_and,
|
||||||
|
a_i64_or,
|
||||||
|
a_i64_xor,
|
||||||
|
a_i64_shl,
|
||||||
|
a_i64_shr_s, a_i64_shr_u,
|
||||||
|
a_i64_rotl,
|
||||||
|
a_i64_rotr:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i64);
|
||||||
|
PopVal(wbt_i64);
|
||||||
|
PushVal(wbt_i64);
|
||||||
|
end;
|
||||||
|
a_f32_add,
|
||||||
|
a_f32_sub,
|
||||||
|
a_f32_mul,
|
||||||
|
a_f32_div,
|
||||||
|
a_f32_min,
|
||||||
|
a_f32_max,
|
||||||
|
a_f32_copysign:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f32);
|
||||||
|
PopVal(wbt_f32);
|
||||||
|
PushVal(wbt_f32);
|
||||||
|
end;
|
||||||
|
a_f64_add,
|
||||||
|
a_f64_sub,
|
||||||
|
a_f64_mul,
|
||||||
|
a_f64_div,
|
||||||
|
a_f64_min,
|
||||||
|
a_f64_max,
|
||||||
|
a_f64_copysign:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f64);
|
||||||
|
PopVal(wbt_f64);
|
||||||
|
PushVal(wbt_f64);
|
||||||
|
end;
|
||||||
|
a_i32_clz,
|
||||||
|
a_i32_ctz,
|
||||||
|
a_i32_popcnt:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_i64_clz,
|
||||||
|
a_i64_ctz,
|
||||||
|
a_i64_popcnt:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i64);
|
||||||
|
PushVal(wbt_i64);
|
||||||
|
end;
|
||||||
|
a_f32_abs,
|
||||||
|
a_f32_neg,
|
||||||
|
a_f32_sqrt,
|
||||||
|
a_f32_ceil,
|
||||||
|
a_f32_floor,
|
||||||
|
a_f32_trunc,
|
||||||
|
a_f32_nearest:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f32);
|
||||||
|
PushVal(wbt_f32);
|
||||||
|
end;
|
||||||
|
a_f64_abs,
|
||||||
|
a_f64_neg,
|
||||||
|
a_f64_sqrt,
|
||||||
|
a_f64_ceil,
|
||||||
|
a_f64_floor,
|
||||||
|
a_f64_trunc,
|
||||||
|
a_f64_nearest:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f64);
|
||||||
|
PushVal(wbt_f64);
|
||||||
|
end;
|
||||||
|
a_i32_eqz:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_i64_eqz:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i64);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_i32_eq,
|
||||||
|
a_i32_ne,
|
||||||
|
a_i32_lt_s, a_i32_lt_u,
|
||||||
|
a_i32_gt_s, a_i32_gt_u,
|
||||||
|
a_i32_le_s, a_i32_le_u,
|
||||||
|
a_i32_ge_s, a_i32_ge_u:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_i64_eq,
|
||||||
|
a_i64_ne,
|
||||||
|
a_i64_lt_s, a_i64_lt_u,
|
||||||
|
a_i64_gt_s, a_i64_gt_u,
|
||||||
|
a_i64_le_s, a_i64_le_u,
|
||||||
|
a_i64_ge_s, a_i64_ge_u:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i64);
|
||||||
|
PopVal(wbt_i64);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_f32_eq,
|
||||||
|
a_f32_ne,
|
||||||
|
a_f32_lt,
|
||||||
|
a_f32_gt,
|
||||||
|
a_f32_le,
|
||||||
|
a_f32_ge:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f32);
|
||||||
|
PopVal(wbt_f32);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_f64_eq,
|
||||||
|
a_f64_ne,
|
||||||
|
a_f64_lt,
|
||||||
|
a_f64_gt,
|
||||||
|
a_f64_le,
|
||||||
|
a_f64_ge:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f64);
|
||||||
|
PopVal(wbt_f64);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_i32_extend8_s,
|
||||||
|
a_i32_extend16_s:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_i64_extend8_s,
|
||||||
|
a_i64_extend16_s,
|
||||||
|
a_i64_extend32_s:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i64);
|
||||||
|
PushVal(wbt_i64);
|
||||||
|
end;
|
||||||
|
a_i32_wrap_i64:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i64);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_i64_extend_i32_s,
|
||||||
|
a_i64_extend_i32_u:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PushVal(wbt_i64);
|
||||||
|
end;
|
||||||
|
a_i32_trunc_f32_s,
|
||||||
|
a_i32_trunc_f32_u,
|
||||||
|
a_i32_trunc_sat_f32_s,
|
||||||
|
a_i32_trunc_sat_f32_u:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f32);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_i32_trunc_f64_s,
|
||||||
|
a_i32_trunc_f64_u,
|
||||||
|
a_i32_trunc_sat_f64_s,
|
||||||
|
a_i32_trunc_sat_f64_u:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f64);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_i64_trunc_f32_s,
|
||||||
|
a_i64_trunc_f32_u,
|
||||||
|
a_i64_trunc_sat_f32_s,
|
||||||
|
a_i64_trunc_sat_f32_u:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f32);
|
||||||
|
PushVal(wbt_i64);
|
||||||
|
end;
|
||||||
|
a_i64_trunc_f64_s,
|
||||||
|
a_i64_trunc_f64_u,
|
||||||
|
a_i64_trunc_sat_f64_s,
|
||||||
|
a_i64_trunc_sat_f64_u:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f64);
|
||||||
|
PushVal(wbt_i64);
|
||||||
|
end;
|
||||||
|
a_f32_demote_f64:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f64);
|
||||||
|
PushVal(wbt_f32);
|
||||||
|
end;
|
||||||
|
a_f64_promote_f32:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f32);
|
||||||
|
PushVal(wbt_f64);
|
||||||
|
end;
|
||||||
|
a_f32_convert_i32_s,
|
||||||
|
a_f32_convert_i32_u:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PushVal(wbt_f32);
|
||||||
|
end;
|
||||||
|
a_f32_convert_i64_s,
|
||||||
|
a_f32_convert_i64_u:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i64);
|
||||||
|
PushVal(wbt_f32);
|
||||||
|
end;
|
||||||
|
a_f64_convert_i32_s,
|
||||||
|
a_f64_convert_i32_u:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PushVal(wbt_f64);
|
||||||
|
end;
|
||||||
|
a_f64_convert_i64_s,
|
||||||
|
a_f64_convert_i64_u:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i64);
|
||||||
|
PushVal(wbt_f64);
|
||||||
|
end;
|
||||||
|
a_i32_reinterpret_f32:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f32);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_i64_reinterpret_f64:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f64);
|
||||||
|
PushVal(wbt_i64);
|
||||||
|
end;
|
||||||
|
a_f32_reinterpret_i32:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PushVal(wbt_f32);
|
||||||
|
end;
|
||||||
|
a_f64_reinterpret_i64:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i64);
|
||||||
|
PushVal(wbt_f64);
|
||||||
|
end;
|
||||||
|
a_ref_null_externref:
|
||||||
|
PushVal(wbt_externref);
|
||||||
|
a_ref_null_funcref:
|
||||||
|
PushVal(wbt_funcref);
|
||||||
|
a_ref_is_null:
|
||||||
|
begin
|
||||||
|
PopVal_RefType;
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_drop:
|
||||||
|
PopVal;
|
||||||
|
a_unreachable:
|
||||||
|
Unreachable;
|
||||||
|
a_i32_load,
|
||||||
|
a_i32_load16_s, a_i32_load16_u,
|
||||||
|
a_i32_load8_s, a_i32_load8_u:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_i64_load,
|
||||||
|
a_i64_load32_s, a_i64_load32_u,
|
||||||
|
a_i64_load16_s, a_i64_load16_u,
|
||||||
|
a_i64_load8_s, a_i64_load8_u:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PushVal(wbt_i64);
|
||||||
|
end;
|
||||||
|
a_f32_load:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PushVal(wbt_f32);
|
||||||
|
end;
|
||||||
|
a_f64_load:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PushVal(wbt_f64);
|
||||||
|
end;
|
||||||
|
a_i32_store,
|
||||||
|
a_i32_store16,
|
||||||
|
a_i32_store8:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_i64_store,
|
||||||
|
a_i64_store32,
|
||||||
|
a_i64_store16,
|
||||||
|
a_i64_store8:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i64);
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_f32_store:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f32);
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_f64_store:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_f64);
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_memory_size:
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
a_memory_grow:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PushVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
a_memory_fill,
|
||||||
|
a_memory_copy:
|
||||||
|
begin
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
PopVal(wbt_i32);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
{ twasmstruc_stack }
|
{ twasmstruc_stack }
|
||||||
|
|
||||||
function twasmstruc_stack.Get(Index: Integer): taicpu_wasm_structured_instruction;
|
function twasmstruc_stack.Get(Index: Integer): taicpu_wasm_structured_instruction;
|
||||||
|
Loading…
Reference in New Issue
Block a user