[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