Browse Source

+ store the functype in TWasmObjSymbolLinkingData

Nikolay Nikolov 1 year ago
parent
commit
4f4beb6225
1 changed files with 57 additions and 40 deletions
  1. 57 40
      compiler/ogwasm.pas

+ 57 - 40
compiler/ogwasm.pas

@@ -44,8 +44,12 @@ interface
       { TWasmObjSymbolLinkingData }
 
       TWasmObjSymbolLinkingData = class
+      public
         ImportModule: string;
         ImportName: string;
+        FuncType: TWasmFuncType;
+
+        destructor Destroy;override;
       end;
 
       { TWasmObjSymbol }
@@ -395,6 +399,16 @@ implementation
         d.write(q,4);
       end;
 
+{****************************************************************************
+                         TWasmObjSymbolLinkingData
+****************************************************************************}
+
+    destructor TWasmObjSymbolLinkingData.Destroy;
+      begin
+        FuncType.Free;
+        inherited Destroy;
+      end;
+
 {****************************************************************************
                              TWasmObjRelocation
 ****************************************************************************}
@@ -3801,46 +3815,49 @@ implementation
                     objsym.size:=SymSize;
                   end;
               byte(SYMTAB_FUNCTION):
-                if (SymFlags and WASM_SYM_UNDEFINED)<>0 then
-                  begin
-                    if not FuncTypes[SymIndex].IsImport then
-                      begin
-                        InputError('WASM_SYM_UNDEFINED set on a SYMTAB_FUNCTION symbol, that is not an import');
-                        exit;
-                      end;
-                    if (SymFlags and WASM_SYM_EXPLICIT_NAME)<>0 then
-                      begin
-                        objsym:=TWasmObjSymbol(ObjData.CreateSymbol(SymName));
-                        objsym.bind:=AB_EXTERNAL;
-                        objsym.typ:=AT_FUNCTION;
-                        objsym.objsection:=nil;
-                        objsym.offset:=0;
-                        objsym.size:=0;
-                        objsym.LinkingData.ImportModule:=FuncTypes[SymIndex].ImportModName;
-                        objsym.LinkingData.ImportName:=FuncTypes[SymIndex].ImportName;
-                      end
-                    else
-                      begin
-                        if FuncTypes[SymIndex].ImportModName = 'env' then
-                          objsym:=TWasmObjSymbol(ObjData.CreateSymbol(FuncTypes[SymIndex].ImportName))
-                        else
-                          objsym:=TWasmObjSymbol(ObjData.CreateSymbol(FuncTypes[SymIndex].ImportModName + '.' + FuncTypes[SymIndex].ImportName));
-                        objsym.bind:=AB_EXTERNAL;
-                        objsym.typ:=AT_FUNCTION;
-                        objsym.objsection:=nil;
-                        objsym.offset:=0;
-                        objsym.size:=0;
-                      end;
-                  end
-                else
-                  begin
-                    objsym:=TWasmObjSymbol(ObjData.CreateSymbol(SymName));
-                    objsym.bind:=AB_GLOBAL;
-                    objsym.typ:=AT_FUNCTION;
-                    objsym.objsection:=TObjSection(ObjData.ObjSectionList[SymIndex-FuncTypeImportsCount]);
-                    objsym.offset:=0;
-                    objsym.size:=objsym.objsection.Size;
-                  end;
+                begin
+                  if (SymFlags and WASM_SYM_UNDEFINED)<>0 then
+                    begin
+                      if not FuncTypes[SymIndex].IsImport then
+                        begin
+                          InputError('WASM_SYM_UNDEFINED set on a SYMTAB_FUNCTION symbol, that is not an import');
+                          exit;
+                        end;
+                      if (SymFlags and WASM_SYM_EXPLICIT_NAME)<>0 then
+                        begin
+                          objsym:=TWasmObjSymbol(ObjData.CreateSymbol(SymName));
+                          objsym.bind:=AB_EXTERNAL;
+                          objsym.typ:=AT_FUNCTION;
+                          objsym.objsection:=nil;
+                          objsym.offset:=0;
+                          objsym.size:=0;
+                          objsym.LinkingData.ImportModule:=FuncTypes[SymIndex].ImportModName;
+                          objsym.LinkingData.ImportName:=FuncTypes[SymIndex].ImportName;
+                        end
+                      else
+                        begin
+                          if FuncTypes[SymIndex].ImportModName = 'env' then
+                            objsym:=TWasmObjSymbol(ObjData.CreateSymbol(FuncTypes[SymIndex].ImportName))
+                          else
+                            objsym:=TWasmObjSymbol(ObjData.CreateSymbol(FuncTypes[SymIndex].ImportModName + '.' + FuncTypes[SymIndex].ImportName));
+                          objsym.bind:=AB_EXTERNAL;
+                          objsym.typ:=AT_FUNCTION;
+                          objsym.objsection:=nil;
+                          objsym.offset:=0;
+                          objsym.size:=0;
+                        end;
+                    end
+                  else
+                    begin
+                      objsym:=TWasmObjSymbol(ObjData.CreateSymbol(SymName));
+                      objsym.bind:=AB_GLOBAL;
+                      objsym.typ:=AT_FUNCTION;
+                      objsym.objsection:=TObjSection(ObjData.ObjSectionList[SymIndex-FuncTypeImportsCount]);
+                      objsym.offset:=0;
+                      objsym.size:=objsym.objsection.Size;
+                    end;
+                  objsym.LinkingData.FuncType:=TWasmFuncType.Create(FFuncTypes[FuncTypes[SymIndex].typidx]);
+                end;
               byte(SYMTAB_GLOBAL),
               byte(SYMTAB_SECTION),
               byte(SYMTAB_EVENT),