[llvm] 2831a27 - [KCFI] Emit debugtrap to make indirect call checks recoverable

Sami Tolvanen via llvm-commits llvm-commits at lists.llvm.org
Fri Jun 2 13:00:20 PDT 2023


Author: Sami Tolvanen
Date: 2023-06-02T19:39:13Z
New Revision: 2831a271c8beee7bc0a5b8ea1421de606358207b

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

LOG: [KCFI] Emit debugtrap to make indirect call checks recoverable

KCFI traps should always be recoverable, but as Intrinsic::trap
is marked noreturn, it's not possible to continue execution after
handling the trap as the compiler is free to assume we never
return. Switch to debugtrap instead to ensure we have the option
to resume execution after the trap.

Added: 
    

Modified: 
    llvm/lib/Transforms/Instrumentation/KCFI.cpp
    llvm/test/Transforms/KCFI/kcfi.ll

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Instrumentation/KCFI.cpp b/llvm/lib/Transforms/Instrumentation/KCFI.cpp
index f2d4d6f429e76..eacbb02828658 100644
--- a/llvm/lib/Transforms/Instrumentation/KCFI.cpp
+++ b/llvm/lib/Transforms/Instrumentation/KCFI.cpp
@@ -100,7 +100,7 @@ PreservedAnalyses KCFIPass::run(Function &F, FunctionAnalysisManager &AM) {
     Instruction *ThenTerm =
         SplitBlockAndInsertIfThen(Test, Call, false, VeryUnlikelyWeights);
     Builder.SetInsertPoint(ThenTerm);
-    Builder.CreateCall(Intrinsic::getDeclaration(&M, Intrinsic::trap));
+    Builder.CreateCall(Intrinsic::getDeclaration(&M, Intrinsic::debugtrap));
     ++NumKCFIChecks;
   }
 

diff  --git a/llvm/test/Transforms/KCFI/kcfi.ll b/llvm/test/Transforms/KCFI/kcfi.ll
index 49c311b1927a8..f6028ae782193 100644
--- a/llvm/test/Transforms/KCFI/kcfi.ll
+++ b/llvm/test/Transforms/KCFI/kcfi.ll
@@ -7,7 +7,7 @@ define void @f1(ptr noundef %x) {
   ; CHECK-NEXT: %[[#ICMP:]] = icmp ne i32 %[[#LOAD]], 12345678
   ; CHECK-NEXT: br i1 %[[#ICMP]], label %[[#TRAP:]], label %[[#CALL:]], !prof ![[#WEIGHTS:]]
   ; CHECK:      [[#TRAP]]:
-  ; CHECK-NEXT: call void @llvm.trap()
+  ; CHECK-NEXT: call void @llvm.debugtrap()
   ; CHECK-NEXT: br label %[[#CALL]]
   ; CHECK:      [[#CALL]]:
   ; CHECK-NEXT: call void %x()


        


More information about the llvm-commits mailing list