[COFF] Fix ARM and ARM64 REL32 relocations to be relative to the end of the relocation
authorMartin Storsjö <martin@martin.st>
Tue, 11 May 2021 07:04:02 +0000 (10:04 +0300)
committerMartin Storsjö <martin@martin.st>
Wed, 12 May 2021 06:53:43 +0000 (09:53 +0300)
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

llvm/lib/MC/WinCOFFObjectWriter.cpp
llvm/test/MC/AArch64/coff-relocations.s
llvm/test/MC/ARM/coff-relocations.s

index 2a69a30..646f416 100644 (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) {
index d0ebd07..e0fc30d 100644 (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
index b2a4a92..32a95f9 100644 (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