<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Sat, Oct 3, 2015 at 5:59 PM, Davide Italiano via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: davide<br>
Date: Sat Oct  3 19:59:16 2015<br>
New Revision: 249254<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=249254&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=249254&view=rev</a><br>
Log:<br>
[ELF2/AArch64] Add support for AARCH64_ABS{16,32,64} relocations.<br>
<br>
I saw these in the wild while trying to link shared libraries.<br>
<br>
Added:<br>
    lld/trunk/test/elf2/aarch64-data-relocs.s<br>
Modified:<br>
    lld/trunk/ELF/Target.cpp<br>
<br>
Modified: lld/trunk/ELF/Target.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=249254&r1=249253&r2=249254&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Target.cpp?rev=249254&r1=249253&r2=249254&view=diff</a><br>
==============================================================================<br>
--- lld/trunk/ELF/Target.cpp (original)<br>
+++ lld/trunk/ELF/Target.cpp Sat Oct  3 19:59:16 2015<br>
@@ -267,6 +267,26 @@ static uint64_t AArch64GetPage(uint64_t<br>
   return Expr & (~static_cast<uint64_t>(0xFFF));<br>
 }<br>
<br>
+static void handle_ABS16(uint8_t *Location, uint64_t S, int64_t A) {<br>
+  uint64_t X = S + A;<br>
+  if (!isInt<16>(X)) // -2^15 <= X < 2^16<br>
+    error("Relocation R_AARCH64_ABS16 out of range");<br>
+  write16le(Location, read32le(Location) | X);<br>
+}<br></blockquote><div><br></div><div>This reads 32 bits and writes back 16 bits.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+static void handle_ABS32(uint8_t *Location, uint64_t S, int64_t A) {<br>
+  uint64_t X = S + A;<br>
+  if (!isInt<32>(X)) // -2^31 <= X < 2^32<br>
+    error("Relocation R_AARCH64_ABS32 out of range");<br>
+  write32le(Location, read32le(Location) | X);<br>
+}<br>
+<br>
+static void handle_ABS64(uint8_t *Location, uint64_t S, int64_t A) {<br>
+  uint64_t X = S + A;<br>
+  // No overflow check.<br>
+  write64le(Location, read32le(Location) | X);<br>
+}<br></blockquote><div><br></div><div>And this is 32 bits and 64 bits. Are these correct?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
 static void handle_ADD_ABS_LO12_NC(uint8_t *Location, uint64_t S, int64_t A) {<br>
   // No overflow check.<br>
   uint64_t X = ((S + A) & 0xFFF) << 10;<br>
@@ -300,6 +320,15 @@ void AArch64TargetInfo::relocateOne(uint<br>
   int64_t A = Rel.r_addend;<br>
   uint64_t P = BaseAddr + Rel.r_offset;<br>
   switch (Type) {<br>
+  case R_AARCH64_ABS16:<br>
+    handle_ABS16(Location, S, A);<br>
+    break;<br>
+  case R_AARCH64_ABS32:<br>
+    handle_ABS32(Location, S, A);<br>
+    break;<br>
+  case R_AARCH64_ABS64:<br>
+    handle_ABS64(Location, S, A);<br>
+    break;<br>
   case R_AARCH64_ADD_ABS_LO12_NC:<br>
     handle_ADD_ABS_LO12_NC(Location, S, A);<br>
     break;<br>
<br>
Added: lld/trunk/test/elf2/aarch64-data-relocs.s<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/aarch64-data-relocs.s?rev=249254&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/aarch64-data-relocs.s?rev=249254&view=auto</a><br>
==============================================================================<br>
--- lld/trunk/test/elf2/aarch64-data-relocs.s (added)<br>
+++ lld/trunk/test/elf2/aarch64-data-relocs.s Sat Oct  3 19:59:16 2015<br>
@@ -0,0 +1,29 @@<br>
+// RUN: llvm-mc -filetype=obj -triple=aarch64-none-freebsd %s -o %t<br>
+// RUN: lld -flavor gnu2 -shared %t -o %t2<br>
+// RUN: llvm-objdump -d %t2 | FileCheck %s<br>
+// REQUIRES: aarch64<br>
+<br>
+.section .R_AARCH64_ABS16, "ax",@progbits<br>
+  .hword sym+12<br>
+<br>
+.section .R_AARCH64_ABS32, "ax",@progbits<br>
+  .word sym+24<br>
+<br>
+.section .R_AARCH64_ABS64, "ax",@progbits<br>
+  .xword sym+36<br>
+<br>
+// CHECK: Disassembly of section .R_AARCH64_ABS16:<br>
+// CHECK-NEXT: $d.0:<br>
+// CHECK-NEXT:     2000:       0c 00   .short<br>
+//                             ^-- A = 0xc<br>
+<br>
+// CHECK-NEXT: Disassembly of section .R_AARCH64_ABS32:<br>
+// CHECK-NEXT: $d.1:<br>
+// CHECK-NEXT:     2002:       18 00 00 00     .word<br>
+//                             ^-- A = 0x18<br>
+<br>
+// CHECK-NEXT: Disassembly of section .R_AARCH64_ABS64:<br>
+// CHECK-NEXT: $d.2:<br>
+// CHECK-NEXT:     2006:       24 00 00 00     .word<br>
+//                             ^-- A = 0x24<br>
+// CHECK-NEXT:     200a:       00 00 00 00     .word<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>