+ write the type indexes correctly

This commit is contained in:
Nikolay Nikolov 2023-12-31 23:50:53 +02:00
parent f5dbd38b7e
commit 88a42c3ee0

View File

@ -49,6 +49,7 @@ interface
ImportName: string;
FuncType: TWasmFuncType;
ExeFunctionIndex: Integer;
ExeTypeIndex: Integer;
constructor Create;
destructor Destroy;override;
@ -231,6 +232,7 @@ interface
FWasmSections: array [TWasmSectionID] of tdynamicarray;
procedure WriteWasmSection(wsid: TWasmSectionID);
procedure PrepareImports;
procedure PrepareFunctions;
protected
function writeData:boolean;override;
procedure DoRelocationFixup(objsec:TObjSection);override;
@ -494,6 +496,7 @@ implementation
constructor TWasmObjSymbolLinkingData.Create;
begin
ExeFunctionIndex:=-1;
ExeTypeIndex:=-1;
end;
destructor TWasmObjSymbolLinkingData.Destroy;
@ -4072,7 +4075,7 @@ implementation
var
i: Integer;
exesec: TExeSection;
objsec: TObjSection;
objsec: TWasmObjSection;
begin
exesec:=FindExeSection('.text');
if not assigned(exesec) then
@ -4083,12 +4086,12 @@ implementation
WriteUleb(FWasmSections[wsiCode],exesec.ObjSectionList.Count);
for i:=0 to exesec.ObjSectionList.Count-1 do
begin
objsec:=TObjSection(exesec.ObjSectionList[i]);
objsec:=TWasmObjSection(exesec.ObjSectionList[i]);
if not (oso_data in objsec.secoptions) then
internalerror(2023123104);
if not assigned(objsec.data) then
internalerror(2023123105);
WriteUleb(FWasmSections[wsiFunction],0); { todo: TypIdx }
WriteUleb(FWasmSections[wsiFunction],objsec.MainFuncSymbol.LinkingData.ExeTypeIndex);
WriteUleb(FWasmSections[wsiCode],objsec.Data.size);
objsec.Data.seek(0);
CopyDynamicArray(objsec.Data,FWasmSections[wsiCode],objsec.Data.size);
@ -4172,6 +4175,7 @@ implementation
procedure TWasmExeOutput.AfterUnusedSectionRemoval;
begin
PrepareImports;
PrepareFunctions;
end;
procedure TWasmExeOutput.PrepareImports;
@ -4221,6 +4225,33 @@ implementation
end;
end;
procedure TWasmExeOutput.PrepareFunctions;
var
i: Integer;
exesec: TExeSection;
objsec: TWasmObjSection;
fsym: TWasmObjSymbol;
begin
exesec:=FindExeSection('.text');
if not assigned(exesec) then
internalerror(2023123106);
for i:=0 to exesec.ObjSectionList.Count-1 do
begin
objsec:=TWasmObjSection(exesec.ObjSectionList[i]);
fsym:=objsec.MainFuncSymbol;
if not assigned(fsym) then
internalerror(2023123107);
if not assigned(fsym.LinkingData.FuncType) then
internalerror(2023123108);
if fsym.LinkingData.ExeFunctionIndex<>-1 then
internalerror(2023123109);
if fsym.LinkingData.ExeTypeIndex<>-1 then
internalerror(2023123109);
fsym.LinkingData.ExeTypeIndex:=FFuncTypes.AddOrGetFuncType(fsym.LinkingData.FuncType);
fsym.LinkingData.ExeFunctionIndex:=i+Length(FFunctionImports);
end;
end;
{****************************************************************************
TWasmAssembler