Browse Source

+ wasm internal object reader: process SYMTAB_GLOBAL import entries

Nikolay Nikolov 1 year ago
parent
commit
880d0333b0
1 changed files with 43 additions and 1 deletions
  1. 43 1
      compiler/ogwasm.pas

+ 43 - 1
compiler/ogwasm.pas

@@ -3922,7 +3922,49 @@ implementation
                     end;
                     end;
                   objsym.LinkingData.FuncType:=TWasmFuncType.Create(FFuncTypes[FuncTypes[SymIndex].typidx]);
                   objsym.LinkingData.FuncType:=TWasmFuncType.Create(FFuncTypes[FuncTypes[SymIndex].typidx]);
                 end;
                 end;
-              byte(SYMTAB_GLOBAL),
+              byte(SYMTAB_GLOBAL):
+                begin
+                  if (SymFlags and WASM_SYM_UNDEFINED)<>0 then
+                    begin
+                      if not GlobalTypes[SymIndex].IsImport then
+                        begin
+                          InputError('WASM_SYM_UNDEFINED set on a SYMTAB_GLOBAL 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_WASM_GLOBAL;
+                          objsym.objsection:=nil;
+                          objsym.offset:=0;
+                          objsym.size:=0;
+                          objsym.LinkingData.ImportModule:=GlobalTypes[SymIndex].ImportModName;
+                          objsym.LinkingData.ImportName:=GlobalTypes[SymIndex].ImportName;
+                        end
+                      else
+                        begin
+                          if GlobalTypes[SymIndex].ImportModName = 'env' then
+                            objsym:=TWasmObjSymbol(ObjData.CreateSymbol(GlobalTypes[SymIndex].ImportName))
+                          else
+                            objsym:=TWasmObjSymbol(ObjData.CreateSymbol(GlobalTypes[SymIndex].ImportModName + '.' + GlobalTypes[SymIndex].ImportName));
+                          objsym.bind:=AB_EXTERNAL;
+                          objsym.typ:=AT_WASM_GLOBAL;
+                          objsym.objsection:=nil;
+                          objsym.offset:=0;
+                          objsym.size:=0;
+                        end;
+                    end
+                  else
+                    begin
+                      if GlobalTypes[SymIndex].IsImport then
+                        begin
+                          InputError('WASM_SYM_UNDEFINED not set on a SYMTAB_GLOBAL symbol, that is an import');
+                          exit;
+                        end;
+                      Writeln('defined global ', SymName);
+                    end;
+                end;
               byte(SYMTAB_SECTION),
               byte(SYMTAB_SECTION),
               byte(SYMTAB_EVENT),
               byte(SYMTAB_EVENT),
               byte(SYMTAB_TABLE):
               byte(SYMTAB_TABLE):