Browse Source

* WebAssembly threads internal linker: create a startup function for
initializing shared memory (dummy for now)

Nikolay Nikolov 1 year ago
parent
commit
914b1feceb
2 changed files with 33 additions and 1 deletions
  1. 32 1
      compiler/ogwasm.pas
  2. 1 0
      compiler/systems/t_wasi.pas

+ 32 - 1
compiler/ogwasm.pas

@@ -271,6 +271,7 @@ interface
         FTlsSizeSym: TWasmObjSymbol;
         FTlsSizeSym: TWasmObjSymbol;
         FTlsAlignSym: TWasmObjSymbol;
         FTlsAlignSym: TWasmObjSymbol;
         FInitTlsFunctionSym: TWasmObjSymbol;
         FInitTlsFunctionSym: TWasmObjSymbol;
+        FInitSharedMemoryFunctionSym: TWasmObjSymbol;
         FMinMemoryPages,
         FMinMemoryPages,
         FMaxMemoryPages: Integer;
         FMaxMemoryPages: Integer;
         procedure WriteWasmSection(wsid: TWasmSectionID);
         procedure WriteWasmSection(wsid: TWasmSectionID);
@@ -284,6 +285,7 @@ interface
         procedure SetTlsSizeAlignAndBase;
         procedure SetTlsSizeAlignAndBase;
         procedure SetThreadVarGlobalsInitValues;
         procedure SetThreadVarGlobalsInitValues;
         procedure GenerateCode_InitTls;
         procedure GenerateCode_InitTls;
+        procedure GenerateCode_InitSharedMemory;
         procedure WriteExeSectionToDynArray(exesec: TExeSection; dynarr: tdynamicarray);
         procedure WriteExeSectionToDynArray(exesec: TExeSection; dynarr: tdynamicarray);
       protected
       protected
         function writeData:boolean;override;
         function writeData:boolean;override;
@@ -4909,6 +4911,7 @@ implementation
         SetTlsSizeAlignAndBase;
         SetTlsSizeAlignAndBase;
         SetThreadVarGlobalsInitValues;
         SetThreadVarGlobalsInitValues;
         GenerateCode_InitTls;
         GenerateCode_InitTls;
+        GenerateCode_InitSharedMemory;
 
 
         FFuncTypes.WriteTo(FWasmSections[wsiType]);
         FFuncTypes.WriteTo(FWasmSections[wsiType]);
         WriteImportSection;
         WriteImportSection;
@@ -4926,7 +4929,8 @@ implementation
             WriteUleb(FWasmSections[wsiMemory],FMinMemoryPages);
             WriteUleb(FWasmSections[wsiMemory],FMinMemoryPages);
           end;
           end;
 
 
-        {...}
+        if ts_wasm_threads in current_settings.targetswitches then
+          WriteUleb(FWasmSections[wsiStart],FInitSharedMemoryFunctionSym.LinkingData.ExeFunctionIndex);
 
 
         Writer.write(WasmModuleMagic,SizeOf(WasmModuleMagic));
         Writer.write(WasmModuleMagic,SizeOf(WasmModuleMagic));
         Writer.write(WasmVersion,SizeOf(WasmVersion));
         Writer.write(WasmVersion,SizeOf(WasmVersion));
@@ -4939,6 +4943,8 @@ implementation
         WriteWasmSectionIfNotEmpty(wsiTag);
         WriteWasmSectionIfNotEmpty(wsiTag);
         WriteWasmSection(wsiGlobal);
         WriteWasmSection(wsiGlobal);
         WriteWasmSection(wsiExport);
         WriteWasmSection(wsiExport);
+        if ts_wasm_threads in current_settings.targetswitches then
+          WriteWasmSection(wsiStart);
         WriteWasmSection(wsiElement);
         WriteWasmSection(wsiElement);
         WriteWasmSection(wsiDataCount);
         WriteWasmSection(wsiDataCount);
         WriteWasmSection(wsiCode);
         WriteWasmSection(wsiCode);
@@ -5264,6 +5270,14 @@ implementation
             TWasmObjSection(FInitTlsFunctionSym.ObjSection).MainFuncSymbol:=FInitTlsFunctionSym;
             TWasmObjSection(FInitTlsFunctionSym.ObjSection).MainFuncSymbol:=FInitTlsFunctionSym;
             FInitTlsFunctionSym.LinkingData.FuncType:=TWasmFuncType.Create([wbt_i32],[]);
             FInitTlsFunctionSym.LinkingData.FuncType:=TWasmFuncType.Create([wbt_i32],[]);
           end
           end
+        else if (ts_wasm_threads in current_settings.targetswitches) and (aname='__fpc_wasm_init_shared_memory') then
+          begin
+            internalObjData.createsection('*'+aname,0,[]);
+            FInitSharedMemoryFunctionSym:=TWasmObjSymbol(internalObjData.SymbolDefine(aname,AB_GLOBAL,AT_FUNCTION));
+            TWasmObjSection(FInitSharedMemoryFunctionSym.ObjSection).MainFuncSymbol:=FInitSharedMemoryFunctionSym;
+            FInitSharedMemoryFunctionSym.ObjSection.SecOptions:=FInitSharedMemoryFunctionSym.ObjSection.SecOptions+[oso_keep];
+            FInitSharedMemoryFunctionSym.LinkingData.FuncType:=TWasmFuncType.Create([],[]);
+          end
         else
         else
           inherited;
           inherited;
       end;
       end;
@@ -5544,6 +5558,23 @@ implementation
         Sec.writeUInt8($0B);  { end }
         Sec.writeUInt8($0B);  { end }
       end;
       end;
 
 
+    procedure TWasmExeOutput.GenerateCode_InitSharedMemory;
+      var
+        Sec: TObjSection;
+      begin
+        if not (ts_wasm_threads in current_settings.targetswitches) then
+          exit;
+        Sec:=FInitSharedMemoryFunctionSym.objsection;
+        Sec.SecOptions:=Sec.SecOptions+[oso_Data];
+
+        { locals }
+        Sec.writeUInt8($00);
+
+        { TODO: implement }
+
+        Sec.writeUInt8($0B);  { end }
+      end;
+
     procedure TWasmExeOutput.WriteExeSectionToDynArray(exesec: TExeSection; dynarr: tdynamicarray);
     procedure TWasmExeOutput.WriteExeSectionToDynArray(exesec: TExeSection; dynarr: tdynamicarray);
       var
       var
         exesecdatapos: LongWord;
         exesecdatapos: LongWord;

+ 1 - 0
compiler/systems/t_wasi.pas

@@ -354,6 +354,7 @@ begin
       linkscript.Concat('  OBJSECTION .text*');
       linkscript.Concat('  OBJSECTION .text*');
       { functions, generated by the linker: }
       { functions, generated by the linker: }
       linkscript.Concat('  SYMBOL __wasm_init_tls');
       linkscript.Concat('  SYMBOL __wasm_init_tls');
+      linkscript.Concat('  SYMBOL __fpc_wasm_init_shared_memory');
       linkscript.Concat('ENDEXESECTION');
       linkscript.Concat('ENDEXESECTION');
     end
     end
   else
   else