[KCFI] Emit debugtrap to make indirect call checks recoverable
authorSami Tolvanen <samitolvanen@google.com>
Thu, 1 Jun 2023 23:06:12 +0000 (16:06 -0700)
committerSami Tolvanen <samitolvanen@google.com>
Fri, 2 Jun 2023 19:39:13 +0000 (19:39 +0000)
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.

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

index f2d4d6f..eacbb02 100644 (file)
@@ -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;
   }
 
index 49c311b..f6028ae 100644 (file)
@@ -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()