Browse Source

+ implemented support for R_WASM_TABLE_INDEX_SLEB relocations

Nikolay Nikolov 3 years ago
parent
commit
7f5250bf46
3 changed files with 18 additions and 9 deletions
  1. 1 1
      compiler/ogbase.pas
  2. 16 7
      compiler/ogwasm.pas
  3. 1 1
      compiler/wasm32/aasmcpu.pas

+ 1 - 1
compiler/ogbase.pas

@@ -115,7 +115,7 @@ interface
 {$ifdef WASM32}
 {$ifdef WASM32}
          RELOC_FUNCTION_INDEX_LEB,
          RELOC_FUNCTION_INDEX_LEB,
          RELOC_MEMORY_ADDR_LEB,
          RELOC_MEMORY_ADDR_LEB,
-         RELOC_MEMORY_ADDR_SLEB,
+         RELOC_MEMORY_ADDR_OR_TABLE_INDEX_SLEB,
          RELOC_TYPE_INDEX_LEB,
          RELOC_TYPE_INDEX_LEB,
 {$endif WASM32}
 {$endif WASM32}
          { Relative relocation }
          { Relative relocation }

+ 16 - 7
compiler/ogwasm.pas

@@ -550,7 +550,7 @@ implementation
               writebytes(leb_zero,5);
               writebytes(leb_zero,5);
             end;
             end;
           RELOC_MEMORY_ADDR_LEB,
           RELOC_MEMORY_ADDR_LEB,
-          RELOC_MEMORY_ADDR_SLEB:
+          RELOC_MEMORY_ADDR_OR_TABLE_INDEX_SLEB:
             begin
             begin
               if (Reloctype=RELOC_MEMORY_ADDR_LEB) and (Data<0) then
               if (Reloctype=RELOC_MEMORY_ADDR_LEB) and (Data<0) then
                 internalerror(2021092602);
                 internalerror(2021092602);
@@ -909,7 +909,7 @@ implementation
                       objsec.Data.seek(objrel.DataOffset);
                       objsec.Data.seek(objrel.DataOffset);
                       WriteUleb5(objsec.Data,TWasmObjSymbol(objrel.symbol).ImportOrFuncIndex);
                       WriteUleb5(objsec.Data,TWasmObjSymbol(objrel.symbol).ImportOrFuncIndex);
                     end;
                     end;
-                  RELOC_MEMORY_ADDR_SLEB:
+                  RELOC_MEMORY_ADDR_OR_TABLE_INDEX_SLEB:
                     begin
                     begin
                       if not assigned(objrel.symbol) then
                       if not assigned(objrel.symbol) then
                         internalerror(2021092605);
                         internalerror(2021092605);
@@ -984,15 +984,24 @@ implementation
                       WriteUleb(relout,TWasmObjSymbol(objrel.symbol).SymbolIndex);
                       WriteUleb(relout,TWasmObjSymbol(objrel.symbol).SymbolIndex);
                       WriteUleb(relout,0);  { addend to add to the address }
                       WriteUleb(relout,0);  { addend to add to the address }
                     end;
                     end;
-                  RELOC_MEMORY_ADDR_SLEB:
+                  RELOC_MEMORY_ADDR_OR_TABLE_INDEX_SLEB:
                     begin
                     begin
                       if not assigned(objrel.symbol) then
                       if not assigned(objrel.symbol) then
                         internalerror(2021092604);
                         internalerror(2021092604);
                       Inc(relcount^);
                       Inc(relcount^);
-                      WriteByte(relout,Ord(R_WASM_MEMORY_ADDR_SLEB));
-                      WriteUleb(relout,objrel.DataOffset+objsec.FileSectionOfs);
-                      WriteUleb(relout,TWasmObjSymbol(objrel.symbol).SymbolIndex);
-                      WriteUleb(relout,0);  { addend to add to the address }
+                      if IsExternalFunction(objrel.symbol) or (objrel.symbol.typ=AT_FUNCTION) then
+                        begin
+                          WriteByte(relout,Ord(R_WASM_TABLE_INDEX_SLEB));
+                          WriteUleb(relout,objrel.DataOffset+objsec.FileSectionOfs);
+                          WriteUleb(relout,TWasmObjSymbol(objrel.symbol).SymbolIndex);
+                        end
+                      else
+                        begin
+                          WriteByte(relout,Ord(R_WASM_MEMORY_ADDR_SLEB));
+                          WriteUleb(relout,objrel.DataOffset+objsec.FileSectionOfs);
+                          WriteUleb(relout,TWasmObjSymbol(objrel.symbol).SymbolIndex);
+                          WriteUleb(relout,0);  { addend to add to the address }
+                        end;
                     end;
                     end;
                   RELOC_ABSOLUTE:
                   RELOC_ABSOLUTE:
                     begin
                     begin

+ 1 - 1
compiler/wasm32/aasmcpu.pas

@@ -1014,7 +1014,7 @@ uses
                   top_ref:
                   top_ref:
                     begin
                     begin
                       if assigned(ref^.symbol) then
                       if assigned(ref^.symbol) then
-                        objdata.writeReloc(ref^.offset,5,ObjData.symbolref(ref^.symbol),RELOC_MEMORY_ADDR_SLEB)
+                        objdata.writeReloc(ref^.offset,5,ObjData.symbolref(ref^.symbol),RELOC_MEMORY_ADDR_OR_TABLE_INDEX_SLEB)
                       else
                       else
                         begin
                         begin
                           if assigned(ref^.symbol) or (ref^.base<>NR_NO) or (ref^.index<>NR_NO) then
                           if assigned(ref^.symbol) or (ref^.base<>NR_NO) or (ref^.index<>NR_NO) then