Browse Source

+ fill the correct minimal number of memory pages required in the wasm internal linker

Nikolay Nikolov 1 year ago
parent
commit
5fe4ab49bc
1 changed files with 6 additions and 3 deletions
  1. 6 3
      compiler/ogwasm.pas

+ 6 - 3
compiler/ogwasm.pas

@@ -258,6 +258,7 @@ interface
 
         FWasmSections: array [TWasmSectionID] of tdynamicarray;
         FStackPointerSym: TWasmObjSymbol;
+        FMinMemoryPages: Integer;
         procedure WriteWasmSection(wsid: TWasmSectionID);
         procedure PrepareImports;
         procedure PrepareFunctions;
@@ -4520,7 +4521,7 @@ implementation
 
         WriteUleb(FWasmSections[wsiMemory],1);
         WriteByte(FWasmSections[wsiMemory],0);
-        WriteUleb(FWasmSections[wsiMemory],2);  { todo: fill min memory (pages) }
+        WriteUleb(FWasmSections[wsiMemory],FMinMemoryPages);
 
         {...}
 
@@ -4874,10 +4875,12 @@ implementation
     procedure TWasmExeOutput.SetStackPointer;
       var
         BssSec: TExeSection;
-        StackStart: QWord;
+        StackStart, InitialStackPtrAddr: QWord;
       begin
         BssSec:=FindExeSection('.bss');
-        FStackPointerSym.LinkingData.GlobalInitializer.init_i32:=Int32((BssSec.MemPos+BssSec.Size+stacksize+15) and (not 15));
+        InitialStackPtrAddr := (BssSec.MemPos+BssSec.Size+stacksize+15) and (not 15);
+        FMinMemoryPages := (InitialStackPtrAddr+65535) shr 16;
+        FStackPointerSym.LinkingData.GlobalInitializer.init_i32:=Int32(InitialStackPtrAddr);
       end;