[PATCH] D20951: [RFC][ARM][LLD] Initial support for ARM in lld

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 6 09:07:47 PDT 2016


ruiu added inline comments.

================
Comment at: ELF/Target.cpp:1466
@@ +1465,3 @@
+  case R_ARM_JUMP24:
+    return S.isPreemptible() ? R_PLT_PC : R_PC;
+  case R_ARM_GOTOFF32:
----------------
I doubt this is correct. I'd think you want to return just R_PLT_PC and let adjustExpr in Relocations.cpp to relax it later.

================
Comment at: ELF/Target.cpp:1538-1542
@@ +1537,7 @@
+  case R_ARM_GOTOFF32:
+  case R_ARM_GOT_PREL:
+  case R_ARM_GOT_BREL:
+  case R_ARM_BASE_PREL:
+  case R_ARM_ABS32:
+  case R_ARM_REL32:
+    write32le(Loc, Val);
----------------
Sort

================
Comment at: ELF/Target.cpp:1549-1552
@@ +1548,6 @@
+    break;
+  case R_ARM_PC24:
+  case R_ARM_PLT32:
+  case R_ARM_CALL:
+  case R_ARM_JUMP24:
+    checkInt<26>(Val, Type);
----------------
Sort

================
Comment at: ELF/Target.cpp:1575-1579
@@ +1574,7 @@
+    return 0;
+  case R_ARM_GOTOFF32:
+  case R_ARM_GOT_PREL:
+  case R_ARM_GOT_BREL:
+  case R_ARM_BASE_PREL:
+  case R_ARM_ABS32:
+    return SignExtend64<32>(read32le(Buf));
----------------
Sort

================
Comment at: ELF/Target.cpp:1583
@@ +1582,3 @@
+  case R_ARM_PREL31:
+    return SignExtend64<31>(read32le(Buf) & ~0x80000000);
+    break;
----------------
Do you have to clear the most significant bit? I think SignExtend64<31> will do that for you.

================
Comment at: ELF/Target.cpp:1596
@@ +1595,3 @@
+    // MOVT is in the range -32768 <= A < 32768
+    int64_t Val = read32le(Buf) & 0x000f0fff;
+    return SignExtend64<16>(((Val & 0x000f0000) >> 4) | (Val & 0x00fff));
----------------
Use uint64_t instead of int64_t to avoid confusion on right shift.


http://reviews.llvm.org/D20951





More information about the llvm-commits mailing list