@@ -3222,7 +3222,7 @@ void CodeGenFunction::EmitCheck(
32223222 }
32233223
32243224 if (TrapCond)
3225- EmitTrapCheck (TrapCond);
3225+ EmitTrapCheck (TrapCond, CheckHandler );
32263226 if (!FatalCond && !RecoverableCond)
32273227 return ;
32283228
@@ -3417,7 +3417,7 @@ void CodeGenFunction::EmitCfiCheckFail() {
34173417 // Data == nullptr means the calling module has trap behaviour for this check.
34183418 llvm::Value *DataIsNotNullPtr =
34193419 Builder.CreateICmpNE (Data, llvm::ConstantPointerNull::get (Int8PtrTy));
3420- EmitTrapCheck (DataIsNotNullPtr);
3420+ EmitTrapCheck (DataIsNotNullPtr, SanitizerHandler::CFICheckFail );
34213421
34223422 llvm::StructType *SourceLocationTy =
34233423 llvm::StructType::get (VoidPtrTy, Int32Ty, Int32Ty);
@@ -3456,7 +3456,7 @@ void CodeGenFunction::EmitCfiCheckFail() {
34563456 EmitCheck (std::make_pair (Cond, Mask), SanitizerHandler::CFICheckFail, {},
34573457 {Data, Addr, ValidVtable});
34583458 else
3459- EmitTrapCheck (Cond);
3459+ EmitTrapCheck (Cond, SanitizerHandler::CFICheckFail );
34603460 }
34613461
34623462 FinishFunction ();
@@ -3476,28 +3476,48 @@ void CodeGenFunction::EmitUnreachable(SourceLocation Loc) {
34763476 Builder.CreateUnreachable ();
34773477}
34783478
3479- void CodeGenFunction::EmitTrapCheck (llvm::Value *Checked) {
3479+ void CodeGenFunction::EmitTrapCheck (llvm::Value *Checked,
3480+ SanitizerHandler CheckHandlerID) {
34803481 llvm::BasicBlock *Cont = createBasicBlock (" cont" );
34813482
34823483 // If we're optimizing, collapse all calls to trap down to just one per
3483- // function to save on code size.
3484+ // check-type per function to save on code size.
3485+ if (TrapBBs.size () <= CheckHandlerID)
3486+ TrapBBs.resize (CheckHandlerID + 1 );
3487+ llvm::BasicBlock *&TrapBB = TrapBBs[CheckHandlerID];
3488+
34843489 if (!CGM.getCodeGenOpts ().OptimizationLevel || !TrapBB) {
34853490 TrapBB = createBasicBlock (" trap" );
34863491 Builder.CreateCondBr (Checked, Cont, TrapBB);
34873492 EmitBlock (TrapBB);
3488- llvm::CallInst *TrapCall = EmitTrapCall (llvm::Intrinsic::trap);
3493+
3494+ llvm::CallInst *TrapCall =
3495+ Builder.CreateCall (CGM.getIntrinsic (llvm::Intrinsic::ubsantrap),
3496+ llvm::ConstantInt::get (CGM.Int8Ty , CheckHandlerID));
3497+
3498+ if (!CGM.getCodeGenOpts ().TrapFuncName .empty ()) {
3499+ auto A = llvm::Attribute::get (getLLVMContext (), " trap-func-name" ,
3500+ CGM.getCodeGenOpts ().TrapFuncName );
3501+ TrapCall->addAttribute (llvm::AttributeList::FunctionIndex, A);
3502+ }
34893503 TrapCall->setDoesNotReturn ();
34903504 TrapCall->setDoesNotThrow ();
34913505 Builder.CreateUnreachable ();
34923506 } else {
3507+ auto Call = TrapBB->begin ();
3508+ assert (isa<llvm::CallInst>(Call) && " Expected call in trap BB" );
3509+
3510+ Call->applyMergedLocation (Call->getDebugLoc (),
3511+ Builder.getCurrentDebugLocation ());
34933512 Builder.CreateCondBr (Checked, Cont, TrapBB);
34943513 }
34953514
34963515 EmitBlock (Cont);
34973516}
34983517
34993518llvm::CallInst *CodeGenFunction::EmitTrapCall (llvm::Intrinsic::ID IntrID) {
3500- llvm::CallInst *TrapCall = Builder.CreateCall (CGM.getIntrinsic (IntrID));
3519+ llvm::CallInst *TrapCall =
3520+ Builder.CreateCall (CGM.getIntrinsic (IntrID));
35013521
35023522 if (!CGM.getCodeGenOpts ().TrapFuncName .empty ()) {
35033523 auto A = llvm::Attribute::get (getLLVMContext (), " trap-func-name" ,
0 commit comments