+ implemented support for R_WASM_TABLE_INDEX_SLEB relocations

This commit is contained in:
Nikolay Nikolov 2021-09-26 06:22:41 +03:00
parent 9fa2e2934b
commit 7f5250bf46
3 changed files with 18 additions and 9 deletions

View File

@ -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 }

View File

@ -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)); if IsExternalFunction(objrel.symbol) or (objrel.symbol.typ=AT_FUNCTION) then
WriteUleb(relout,objrel.DataOffset+objsec.FileSectionOfs); begin
WriteUleb(relout,TWasmObjSymbol(objrel.symbol).SymbolIndex); WriteByte(relout,Ord(R_WASM_TABLE_INDEX_SLEB));
WriteUleb(relout,0); { addend to add to the address } 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

View File

@ -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