+ allocate stack and set the initial value for the stack pointer in the wasm internal exe writer

This commit is contained in:
Nikolay Nikolov 2024-01-01 22:32:48 +02:00
parent eaf9a9f1b9
commit baa81d5275

View File

@ -257,10 +257,12 @@ interface
end; end;
FWasmSections: array [TWasmSectionID] of tdynamicarray; FWasmSections: array [TWasmSectionID] of tdynamicarray;
FStackPointerSym: TWasmObjSymbol;
procedure WriteWasmSection(wsid: TWasmSectionID); procedure WriteWasmSection(wsid: TWasmSectionID);
procedure PrepareImports; procedure PrepareImports;
procedure PrepareFunctions; procedure PrepareFunctions;
function AddOrGetIndirectFunctionTableIndex(FuncIdx: Integer): integer; function AddOrGetIndirectFunctionTableIndex(FuncIdx: Integer): integer;
procedure SetStackPointer;
protected protected
function writeData:boolean;override; function writeData:boolean;override;
procedure DoRelocationFixup(objsec:TObjSection);override; procedure DoRelocationFixup(objsec:TObjSection);override;
@ -284,6 +286,9 @@ implementation
uses uses
cutils,verbose,version,globals,ogmap; cutils,verbose,version,globals,ogmap;
const
StackPointerSymStr='__stack_pointer';
procedure WriteUleb5(d: tdynamicarray; v: uint64); procedure WriteUleb5(d: tdynamicarray; v: uint64);
var var
b: byte; b: byte;
@ -4482,6 +4487,8 @@ implementation
begin begin
result:=false; result:=false;
SetStackPointer;
FFuncTypes.WriteTo(FWasmSections[wsiType]); FFuncTypes.WriteTo(FWasmSections[wsiType]);
WriteImportSection; WriteImportSection;
WriteCodeSegments; WriteCodeSegments;
@ -4681,22 +4688,18 @@ implementation
end; end;
procedure TWasmExeOutput.Load_Symbol(const aname: string); procedure TWasmExeOutput.Load_Symbol(const aname: string);
const
StackPointerSymStr='__stack_pointer';
var
objsym: TWasmObjSymbol;
begin begin
if aname=StackPointerSymStr then if aname=StackPointerSymStr then
begin begin
internalObjData.createsection('*'+aname,1,[oso_Data,oso_load]); internalObjData.createsection('*'+aname,1,[oso_Data,oso_load]);
objsym:=TWasmObjSymbol(internalObjData.SymbolDefine(aname,AB_GLOBAL,AT_WASM_GLOBAL)); FStackPointerSym:=TWasmObjSymbol(internalObjData.SymbolDefine(aname,AB_GLOBAL,AT_WASM_GLOBAL));
objsym.size:=1; FStackPointerSym.size:=1;
objsym.ObjSection.WriteZeros(1); FStackPointerSym.ObjSection.WriteZeros(1);
TWasmObjSection(objsym.ObjSection).MainFuncSymbol:=objsym; TWasmObjSection(FStackPointerSym.ObjSection).MainFuncSymbol:=FStackPointerSym;
objsym.LinkingData.GlobalType:=wbt_i32; FStackPointerSym.LinkingData.GlobalType:=wbt_i32;
objsym.LinkingData.GlobalIsMutable:=True; FStackPointerSym.LinkingData.GlobalIsMutable:=True;
objsym.LinkingData.GlobalInitializer.typ:=wbt_i32; FStackPointerSym.LinkingData.GlobalInitializer.typ:=wbt_i32;
objsym.LinkingData.GlobalInitializer.init_i32:=0; FStackPointerSym.LinkingData.GlobalInitializer.init_i32:=0;
end end
else else
inherited; inherited;
@ -4816,6 +4819,15 @@ implementation
FIndirectFunctionTable[Result].FuncIdx:=FuncIdx; FIndirectFunctionTable[Result].FuncIdx:=FuncIdx;
end; end;
procedure TWasmExeOutput.SetStackPointer;
var
BssSec: TExeSection;
StackStart: QWord;
begin
BssSec:=FindExeSection('.bss');
FStackPointerSym.LinkingData.GlobalInitializer.init_i32:=Int32((BssSec.MemPos+BssSec.Size+stacksize+15) and (not 15));
end;
{**************************************************************************** {****************************************************************************
TWasmAssembler TWasmAssembler