Browse Source

+ support generating R_WASM_TABLE_INDEX_I32 relocations

Nikolay Nikolov 3 năm trước cách đây
mục cha
commit
bf5048cb5e
1 tập tin đã thay đổi với 24 bổ sung1 xóa
  1. 24 1
      compiler/ogwasm.pas

+ 24 - 1
compiler/ogwasm.pas

@@ -548,7 +548,14 @@ implementation
             end;
             end;
           RELOC_ABSOLUTE:
           RELOC_ABSOLUTE:
             begin
             begin
-              { todo... }
+              if len<>4 then
+                internalerror(2021092607);
+              if not assigned(p) then
+                internalerror(2021092608);
+              objreloc:=TWasmObjRelocation.CreateSymbol(CurrObjSec.Size,p,Reloctype);
+              CurrObjSec.ObjRelocations.Add(objreloc);
+              Data:=NtoLE(Data);
+              writebytes(Data,4);
             end;
             end;
           else
           else
             internalerror(2021092501);
             internalerror(2021092501);
@@ -893,6 +900,8 @@ implementation
                           AddUleb5(objsec.Data,objrel.symbol.offset+TWasmObjSection(objrel.symbol.objsection).SegOfs);
                           AddUleb5(objsec.Data,objrel.symbol.offset+TWasmObjSection(objrel.symbol.objsection).SegOfs);
                         end;
                         end;
                     end;
                     end;
+                  RELOC_ABSOLUTE:
+                    ;
                   else
                   else
                     internalerror(2021092510);
                     internalerror(2021092510);
                 end;
                 end;
@@ -954,6 +963,20 @@ 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_ABSOLUTE:
+                    begin
+                      if not assigned(objrel.symbol) then
+                        internalerror(2021092604);
+                      if IsExternalFunction(objrel.symbol) or (objrel.symbol.typ=AT_FUNCTION) then
+                        begin
+                          Inc(relcount^);
+                          WriteByte(relout,Ord(R_WASM_TABLE_INDEX_I32));
+                          WriteUleb(relout,objrel.DataOffset+objsec.FileSectionOfs);
+                          WriteUleb(relout,TWasmObjSymbol(objrel.symbol).SymbolIndex);
+                        end
+                      else
+                        internalerror(2021092609);
+                    end;
                   else
                   else
                     internalerror(2021092507);
                     internalerror(2021092507);
                 end;
                 end;