1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 02:33:06 +01:00

[COFF] Fix ARM and ARM64 REL32 relocations to be relative to the end of the relocation

This matches how they are defined on X86.

This should fix the relative lookup tables pass for COFF, allowing
it to be reenabled.

Differential Revision: https://reviews.llvm.org/D102217
This commit is contained in:
Martin Storsjö 2021-05-11 10:04:02 +03:00
parent 79d2416a46
commit b44324fc5c
3 changed files with 9 additions and 5 deletions

View File

@ -789,12 +789,16 @@ void WinCOFFObjectWriter::recordRelocation(MCAssembler &Asm,
Reloc.Data.Type = TargetObjectWriter->getRelocType(
Asm.getContext(), Target, Fixup, SymB, Asm.getBackend());
// FIXME: Can anyone explain what this does other than adjust for the size
// of the offset?
// The *_REL32 relocations are relative to the end of the relocation,
// not to the start.
if ((Header.Machine == COFF::IMAGE_FILE_MACHINE_AMD64 &&
Reloc.Data.Type == COFF::IMAGE_REL_AMD64_REL32) ||
(Header.Machine == COFF::IMAGE_FILE_MACHINE_I386 &&
Reloc.Data.Type == COFF::IMAGE_REL_I386_REL32))
Reloc.Data.Type == COFF::IMAGE_REL_I386_REL32) ||
(Header.Machine == COFF::IMAGE_FILE_MACHINE_ARMNT &&
Reloc.Data.Type == COFF::IMAGE_REL_ARM_REL32) ||
(Header.Machine == COFF::IMAGE_FILE_MACHINE_ARM64 &&
Reloc.Data.Type == COFF::IMAGE_REL_ARM64_REL32))
FixedValue += 4;
if (Header.Machine == COFF::IMAGE_FILE_MACHINE_ARMNT) {

View File

@ -109,4 +109,4 @@ tbz x0, #0, target
// DISASM: 4c: 20 1a 09 30 adr x0, #74565
// DATA: Contents of section .rdata:
// DATA-NEXT: 0000 2c000000 04000000
// DATA-NEXT: 0000 30000000 08000000

View File

@ -120,4 +120,4 @@ secrel:
@ CHECK-RELOCATION: ]
@ CHECK-DATA: Contents of section .rdata:
@ CHECK-DATA-NEXT: 0000 00000000 04000000
@ CHECK-DATA-NEXT: 0000 04000000 08000000