51
51
using namespace clang ;
52
52
using namespace CodeGen ;
53
53
54
+ // Experiment to make sanitizers easier to debug
55
+ static llvm::cl::opt<bool > ClSanitizeDebugDeoptimization (
56
+ " ubsan-unique-traps" , llvm::cl::Optional,
57
+ llvm::cl::desc (" Deoptimize traps for UBSAN so there is 1 trap per check" ),
58
+ llvm::cl::init(false ));
59
+
54
60
// ===--------------------------------------------------------------------===//
55
61
// Miscellaneous Helper Methods
56
62
// ===--------------------------------------------------------------------===//
@@ -3553,17 +3559,28 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
3553
3559
// check-type per function to save on code size.
3554
3560
if (TrapBBs.size () <= CheckHandlerID)
3555
3561
TrapBBs.resize (CheckHandlerID + 1 );
3562
+
3556
3563
llvm::BasicBlock *&TrapBB = TrapBBs[CheckHandlerID];
3557
3564
3558
- if (!CGM.getCodeGenOpts ().OptimizationLevel || !TrapBB ||
3559
- (CurCodeDecl && CurCodeDecl->hasAttr <OptimizeNoneAttr>())) {
3565
+ if (!ClSanitizeDebugDeoptimization &&
3566
+ CGM.getCodeGenOpts ().OptimizationLevel && TrapBB &&
3567
+ (!CurCodeDecl || !CurCodeDecl->hasAttr <OptimizeNoneAttr>())) {
3568
+ auto Call = TrapBB->begin ();
3569
+ assert (isa<llvm::CallInst>(Call) && " Expected call in trap BB" );
3570
+
3571
+ Call->applyMergedLocation (Call->getDebugLoc (),
3572
+ Builder.getCurrentDebugLocation ());
3573
+ Builder.CreateCondBr (Checked, Cont, TrapBB);
3574
+ } else {
3560
3575
TrapBB = createBasicBlock (" trap" );
3561
3576
Builder.CreateCondBr (Checked, Cont, TrapBB);
3562
3577
EmitBlock (TrapBB);
3563
3578
3564
- llvm::CallInst *TrapCall =
3565
- Builder.CreateCall (CGM.getIntrinsic (llvm::Intrinsic::ubsantrap),
3566
- llvm::ConstantInt::get (CGM.Int8Ty , CheckHandlerID));
3579
+ llvm::CallInst *TrapCall = Builder.CreateCall (
3580
+ CGM.getIntrinsic (llvm::Intrinsic::ubsantrap),
3581
+ llvm::ConstantInt::get (CGM.Int8Ty , ClSanitizeDebugDeoptimization
3582
+ ? TrapBB->getParent ()->size ()
3583
+ : CheckHandlerID));
3567
3584
3568
3585
if (!CGM.getCodeGenOpts ().TrapFuncName .empty ()) {
3569
3586
auto A = llvm::Attribute::get (getLLVMContext (), " trap-func-name" ,
@@ -3573,13 +3590,6 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
3573
3590
TrapCall->setDoesNotReturn ();
3574
3591
TrapCall->setDoesNotThrow ();
3575
3592
Builder.CreateUnreachable ();
3576
- } else {
3577
- auto Call = TrapBB->begin ();
3578
- assert (isa<llvm::CallInst>(Call) && " Expected call in trap BB" );
3579
-
3580
- Call->applyMergedLocation (Call->getDebugLoc (),
3581
- Builder.getCurrentDebugLocation ());
3582
- Builder.CreateCondBr (Checked, Cont, TrapBB);
3583
3593
}
3584
3594
3585
3595
EmitBlock (Cont);
0 commit comments