3434#include " clang/AST/StmtVisitor.h"
3535#include " clang/Basic/Builtins.h"
3636#include " clang/Basic/CodeGenOptions.h"
37+ #include " clang/Basic/DiagnosticTrap.h" // TO_UPSTREAM(BoundsSafety)
3738#include " clang/Basic/Module.h"
3839#include " clang/Basic/SourceManager.h"
3940#include " llvm/ADT/STLExtras.h"
@@ -4577,8 +4578,7 @@ void CodeGenFunction::EmitUnreachable(SourceLocation Loc) {
45774578void CodeGenFunction::EmitTrapCheck (llvm::Value *Checked,
45784579 SanitizerHandler CheckHandlerID,
45794580 bool NoMerge, const TrapReason *TR,
4580- StringRef Annotation,
4581- StringRef BoundsSafetyTrapMessage) {
4581+ StringRef Annotation) {
45824582 llvm::BasicBlock *Cont = createBasicBlock (" cont" );
45834583
45844584 // If we're optimizing, collapse all calls to trap down to just one per
@@ -4592,26 +4592,24 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
45924592 llvm::StringRef TrapMessage;
45934593 llvm::StringRef TrapCategory;
45944594 auto DebugTrapReasonKind = CGM.getCodeGenOpts ().getSanitizeDebugTrapReasons ();
4595+
4596+ /* TO_UPSTREAM(BoundsSafety) ON*/
45954597 if (TR && !TR->isEmpty () &&
4596- DebugTrapReasonKind ==
4597- CodeGenOptions::SanitizeDebugTrapReasonKind::Detailed) {
4598+ (DebugTrapReasonKind ==
4599+ CodeGenOptions::SanitizeDebugTrapReasonKind::Detailed ||
4600+ CheckHandlerID == SanitizerHandler::BoundsSafety)) {
45984601 TrapMessage = TR->getMessage ();
45994602 TrapCategory = TR->getCategory ();
46004603 } else {
4601- /* TO_UPSTREAM(BoundsSafety) ON*/
4602- // FIXME: Move to using `TrapReason` (rdar://158623471).
4603- if (CheckHandlerID == SanitizerHandler::BoundsSafety) {
4604- TrapMessage = BoundsSafetyTrapMessage;
4605- TrapCategory = GetBoundsSafetyTrapMessagePrefix ();
4606- } else {
4607- TrapMessage = GetUBSanTrapForHandler (CheckHandlerID);
4608- TrapCategory = " Undefined Behavior Sanitizer" ;
4609- }
4604+ assert (CheckHandlerID != SanitizerHandler::BoundsSafety);
4605+ TrapMessage = GetUBSanTrapForHandler (CheckHandlerID);
4606+ TrapCategory = " Undefined Behavior Sanitizer" ;
46104607 }
46114608
46124609 if (getDebugInfo () && !(TrapMessage.empty () && TrapCategory.empty ()) &&
4613- DebugTrapReasonKind !=
4614- CodeGenOptions::SanitizeDebugTrapReasonKind::None &&
4610+ (DebugTrapReasonKind !=
4611+ CodeGenOptions::SanitizeDebugTrapReasonKind::None ||
4612+ CheckHandlerID == SanitizerHandler::BoundsSafety) &&
46154613 TrapLocation) {
46164614 TrapLocation = getDebugInfo ()->CreateTrapFailureMessageFor (
46174615 TrapLocation, TrapCategory, TrapMessage);
@@ -4701,19 +4699,26 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
47014699 EmitBlock (Cont);
47024700}
47034701
4704- void CodeGenFunction::EmitBoundsSafetyTrapCheck (llvm::Value *Checked,
4705- BoundsSafetyTrapKind kind,
4706- BoundsSafetyTrapCtx::Kind TrapCtx) {
4702+ void CodeGenFunction::EmitBoundsSafetyTrapCheck (
4703+ llvm::Value *Checked, BoundsSafetyTrapKind kind,
4704+ BoundsSafetyTrapCtx::Kind TrapCtx, TrapReason *TR ) {
47074705 auto OptRemark = GetBoundsSafetyOptRemarkForTrap (kind);
47084706 assert (BoundsSafetyOptRemarkScope::InScope (this , OptRemark));
47094707
4708+ // Fallback: If a TrapReason object isn't provided use the legacy approach
4709+ // for constructing
4710+ TrapReason TempTR;
4711+ if (!TR) {
4712+ CGM.BuildTrapReason (diag::trap_bs_fallback, TempTR)
4713+ << GetBoundsSafetyTrapMessageSuffix (kind, TrapCtx);
4714+ }
4715+
47104716 // We still need to pass `OptRemark` because not all emitted instructions
47114717 // can be covered by BoundsSafetyOptRemarkScope. This is because EmitTrapCheck
47124718 // caches basic blocks that contain instructions that need annotating.
47134719 EmitTrapCheck (Checked, SanitizerHandler::BoundsSafety,
47144720 /* NoMerge=*/ CGM.getCodeGenOpts ().BoundsSafetyUniqueTraps ,
4715- /* TR=*/ nullptr , GetBoundsSafetyOptRemarkString (OptRemark),
4716- GetBoundsSafetyTrapMessageSuffix (kind, TrapCtx));
4721+ TR ? TR : &TempTR, GetBoundsSafetyOptRemarkString (OptRemark));
47174722}
47184723
47194724llvm::CallInst *CodeGenFunction::EmitTrapCall (llvm::Intrinsic::ID IntrID) {
0 commit comments