Implement R_PPC_ADDR32.
authorRui Ueyama <ruiu@google.com>
Tue, 1 Nov 2016 18:30:28 +0000 (18:30 +0000)
committerRui Ueyama <ruiu@google.com>
Tue, 1 Nov 2016 18:30:28 +0000 (18:30 +0000)
Patch from Jack Andersen.

llvm-svn: 285720

lld/ELF/Target.cpp
lld/test/ELF/ppc-relocs.s

index e4de88f..9539a81 100644 (file)
@@ -966,12 +966,13 @@ void PPCTargetInfo::relocateOne(uint8_t *Loc, uint32_t Type,
   case R_PPC_ADDR16_LO:
     write16be(Loc, applyPPCLo(Val));
     break;
-  case R_PPC_REL24:
-    or32be(Loc, Val & 0x3FFFFFC);
-    break;
+  case R_PPC_ADDR32:
   case R_PPC_REL32:
     write32be(Loc, Val);
     break;
+  case R_PPC_REL24:
+    or32be(Loc, Val & 0x3FFFFFC);
+    break;
   default:
     fatal("unrecognized reloc " + Twine(Type));
   }
index 95c5043..78542dd 100644 (file)
@@ -51,3 +51,14 @@ mystr:
 # CHECK: Disassembly of section .R_PPC_REL32:
 # CHECK: .FR_PPC_REL32:
 # CHECK:    11018:       00 00 00 04
+
+.section .R_PPC_ADDR32,"ax",@progbits
+.globl .FR_PPC_ADDR32
+.FR_PPC_ADDR32:
+  .long .Lfoox2
+.section .R_PPC_ADDR32_2,"ax",@progbits
+.Lfoox2:
+
+# CHECK: Disassembly of section .R_PPC_ADDR32:
+# CHECK: .FR_PPC_ADDR32:
+# CHECK:    1101c:       00 01 10 20