[llvm] ed92c36 - [RuntimeDyld][ELF] Actually fix R_AARCH64_ABS{16, 32} overflow check

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Wed Apr 5 06:59:14 PDT 2023


Author: Fangrui Song
Date: 2023-04-05T06:59:09-07:00
New Revision: ed92c369e5436bea9abf7eed986bae640ac13147

URL: https://github.com/llvm/llvm-project/commit/ed92c369e5436bea9abf7eed986bae640ac13147
DIFF: https://github.com/llvm/llvm-project/commit/ed92c369e5436bea9abf7eed986bae640ac13147.diff

LOG: [RuntimeDyld][ELF] Actually fix R_AARCH64_ABS{16,32} overflow check

7b58259481417bb22d144a9c12ee8f4fb0a046e0 is incorrect.

Added: 
    

Modified: 
    llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
index 300bb1d73e52..762f51f54188 100644
--- a/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
+++ b/llvm/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp
@@ -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;
   }


        


More information about the llvm-commits mailing list