[RuntimeDyld][ELF] Actually fix R_AARCH64_ABS{16,32} overflow check
authorFangrui Song <i@maskray.me>
Wed, 5 Apr 2023 13:59:09 +0000 (06:59 -0700)
committerFangrui Song <i@maskray.me>
Wed, 5 Apr 2023 13:59:09 +0000 (06:59 -0700)
7b58259481417bb22d144a9c12ee8f4fb0a046e0 is incorrect.

llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp

index 300bb1d..762f51f 100644 (file)
@@ -426,13 +426,15 @@ void RuntimeDyldELF::resolveAArch64Relocation(const SectionEntry &Section,
     break;
   case ELF::R_AARCH64_ABS16: {
     uint64_t Result = Value + Addend;
-    assert(static_cast<int64_t>(Result) >= INT16_MIN && Result <= UINT16_MAX);
+    assert(Result == static_cast<uint64_t>(llvm::SignExtend64(Result, 16)) ||
+           (Result >> 16) == 0);
     write(isBE, TargetPtr, static_cast<uint16_t>(Result & 0xffffU));
     break;
   }
   case ELF::R_AARCH64_ABS32: {
     uint64_t Result = Value + Addend;
-    assert(static_cast<int64_t>(Result) >= INT32_MIN && Result <= UINT32_MAX);
+    assert(Result == static_cast<uint64_t>(llvm::SignExtend64(Result, 32)) ||
+           (Result >> 32) == 0);
     write(isBE, TargetPtr, static_cast<uint32_t>(Result & 0xffffffffU));
     break;
   }