mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-18 18:59:40 +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;
|
||||
end;
|
||||
|
||||
taicpu = class;
|
||||
|
||||
{ TWasmValidationStacks }
|
||||
|
||||
TWasmValidationStacks = class
|
||||
@ -100,6 +102,7 @@ uses
|
||||
procedure PushVal(vt: TWasmBasicType);
|
||||
function PopVal: TWasmBasicType;
|
||||
function PopVal(expect: TWasmBasicType): TWasmBasicType;
|
||||
function PopVal_RefType: TWasmBasicType;
|
||||
procedure PushVals(vals: TWasmBasicTypeList);
|
||||
function PopVals(vals: TWasmBasicTypeList): TWasmBasicTypeList;
|
||||
|
||||
@ -108,6 +111,8 @@ uses
|
||||
|
||||
function label_types(const frame: TWasmControlFrame): TWasmBasicTypeList;
|
||||
procedure Unreachable;
|
||||
|
||||
procedure Validate(a: taicpu);
|
||||
end;
|
||||
|
||||
twasmstruc_stack = class;
|
||||
@ -508,6 +513,14 @@ uses
|
||||
internalerror(2024013105);
|
||||
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);
|
||||
var
|
||||
v: TWasmBasicType;
|
||||
@ -571,6 +584,357 @@ uses
|
||||
c^.unreachable:=true;
|
||||
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 }
|
||||
|
||||
function twasmstruc_stack.Get(Index: Integer): taicpu_wasm_structured_instruction;
|
||||
|
Loading…
Reference in New Issue
Block a user