+ start writing the wasm sections. The DataCount section is the first section to be implemented.

This commit is contained in:
Nikolay Nikolov 2021-09-19 22:46:54 +03:00
parent e45d8578e8
commit 2563cb6daa

View File

@ -27,7 +27,7 @@ interface
uses
{ common }
globtype,
cclasses,globtype,
{ target }
systems,
{ assembler }
@ -64,10 +64,16 @@ interface
{ TWasmObjOutput }
TWasmObjOutput = class(tObjOutput)
private
FWasmSections: array [TWasmSectionID] of tdynamicarray;
procedure WriteUleb(d: tdynamicarray; v: uint64);
procedure WriteUleb(w: TObjectWriter; v: uint64);
procedure WriteWasmSection(wsid: TWasmSectionID);
protected
function writeData(Data:TObjData):boolean;override;
public
constructor create(AWriter:TObjectWriter);override;
destructor destroy;override;
end;
{ TWasmAssembler }
@ -262,6 +268,42 @@ implementation
TWasmObjOutput
****************************************************************************}
procedure TWasmObjOutput.WriteUleb(d: tdynamicarray; v: uint64);
var
b: byte;
begin
repeat
b:=byte(v) and 127;
v:=v shr 7;
if v<>0 then
b:=b or 128;
d.write(b,1);
until v=0;
end;
procedure TWasmObjOutput.WriteUleb(w: TObjectWriter; v: uint64);
var
b: byte;
begin
repeat
b:=byte(v) and 127;
v:=v shr 7;
if v<>0 then
b:=b or 128;
w.write(b,1);
until v=0;
end;
procedure TWasmObjOutput.WriteWasmSection(wsid: TWasmSectionID);
var
b: byte;
begin
b:=ord(wsid);
Writer.write(b,1);
WriteUleb(Writer,FWasmSections[wsid].size);
Writer.writearray(FWasmSections[wsid]);
end;
function TWasmObjOutput.writeData(Data:TObjData):boolean;
var
i: Integer;
@ -280,9 +322,13 @@ implementation
end;
end;
WriteUleb(FWasmSections[wsiDataCount],segment_count);
Writer.write(WasmModuleMagic,SizeOf(WasmModuleMagic));
Writer.write(WasmVersion,SizeOf(WasmVersion));
WriteWasmSection(wsiDataCount);
Writeln('ObjSectionList:');
for i:=0 to Data.ObjSectionList.Count-1 do
begin
@ -294,9 +340,22 @@ implementation
end;
constructor TWasmObjOutput.create(AWriter: TObjectWriter);
var
i: TWasmSectionID;
begin
inherited;
cobjdata:=TWasmObjData;
for i in TWasmSectionID do
FWasmSections[i] := tdynamicarray.create(SectionDataMaxGrow);
end;
destructor TWasmObjOutput.destroy;
var
i: TWasmSectionID;
begin
for i in TWasmSectionID do
FWasmSections[i].Free;
inherited destroy;
end;
{****************************************************************************