3636#include " clang/AST/StmtVisitor.h"
3737#include " clang/Basic/Builtins.h"
3838#include " clang/Basic/CodeGenOptions.h"
39+ #include " clang/Basic/DiagnosticTrap.h" // TO_UPSTREAM(BoundsSafety)
3940#include " clang/Basic/Module.h"
4041#include " clang/Basic/SourceManager.h"
4142#include " llvm/ADT/STLExtras.h"
@@ -4855,8 +4856,7 @@ void CodeGenFunction::EmitUnreachable(SourceLocation Loc) {
48554856void CodeGenFunction::EmitTrapCheck (llvm::Value *Checked,
48564857 SanitizerHandler CheckHandlerID,
48574858 bool NoMerge, const TrapReason *TR,
4858- StringRef Annotation,
4859- StringRef BoundsSafetyTrapMessage) {
4859+ StringRef Annotation) {
48604860 llvm::BasicBlock *Cont = createBasicBlock (" cont" );
48614861
48624862 // If we're optimizing, collapse all calls to trap down to just one per
@@ -4870,26 +4870,24 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
48704870 llvm::StringRef TrapMessage;
48714871 llvm::StringRef TrapCategory;
48724872 auto DebugTrapReasonKind = CGM.getCodeGenOpts ().getSanitizeDebugTrapReasons ();
4873+
4874+ /* TO_UPSTREAM(BoundsSafety) ON*/
48734875 if (TR && !TR->isEmpty () &&
4874- DebugTrapReasonKind ==
4875- CodeGenOptions::SanitizeDebugTrapReasonKind::Detailed) {
4876+ (DebugTrapReasonKind ==
4877+ CodeGenOptions::SanitizeDebugTrapReasonKind::Detailed ||
4878+ CheckHandlerID == SanitizerHandler::BoundsSafety)) {
48764879 TrapMessage = TR->getMessage ();
48774880 TrapCategory = TR->getCategory ();
48784881 } else {
4879- /* TO_UPSTREAM(BoundsSafety) ON*/
4880- // FIXME: Move to using `TrapReason` (rdar://158623471).
4881- if (CheckHandlerID == SanitizerHandler::BoundsSafety) {
4882- TrapMessage = BoundsSafetyTrapMessage;
4883- TrapCategory = GetBoundsSafetyTrapMessagePrefix ();
4884- } else {
4885- TrapMessage = GetUBSanTrapForHandler (CheckHandlerID);
4886- TrapCategory = " Undefined Behavior Sanitizer" ;
4887- }
4882+ assert (CheckHandlerID != SanitizerHandler::BoundsSafety);
4883+ TrapMessage = GetUBSanTrapForHandler (CheckHandlerID);
4884+ TrapCategory = " Undefined Behavior Sanitizer" ;
48884885 }
48894886
48904887 if (getDebugInfo () && !(TrapMessage.empty () && TrapCategory.empty ()) &&
4891- DebugTrapReasonKind !=
4892- CodeGenOptions::SanitizeDebugTrapReasonKind::None &&
4888+ (DebugTrapReasonKind !=
4889+ CodeGenOptions::SanitizeDebugTrapReasonKind::None ||
4890+ CheckHandlerID == SanitizerHandler::BoundsSafety) &&
48934891 TrapLocation) {
48944892 TrapLocation = getDebugInfo ()->CreateTrapFailureMessageFor (
48954893 TrapLocation, TrapCategory, TrapMessage);
@@ -4979,19 +4977,26 @@ void CodeGenFunction::EmitTrapCheck(llvm::Value *Checked,
49794977 EmitBlock (Cont);
49804978}
49814979
4982- void CodeGenFunction::EmitBoundsSafetyTrapCheck (llvm::Value *Checked,
4983- BoundsSafetyTrapKind kind,
4984- BoundsSafetyTrapCtx::Kind TrapCtx) {
4980+ void CodeGenFunction::EmitBoundsSafetyTrapCheck (
4981+ llvm::Value *Checked, BoundsSafetyTrapKind kind,
4982+ BoundsSafetyTrapCtx::Kind TrapCtx, TrapReason *TR ) {
49854983 auto OptRemark = GetBoundsSafetyOptRemarkForTrap (kind);
49864984 assert (BoundsSafetyOptRemarkScope::InScope (this , OptRemark));
49874985
4986+ // Fallback: If a TrapReason object isn't provided use the legacy approach
4987+ // for constructing
4988+ TrapReason TempTR;
4989+ if (!TR) {
4990+ CGM.BuildTrapReason (diag::trap_bs_fallback, TempTR)
4991+ << GetBoundsSafetyTrapMessageSuffix (kind, TrapCtx);
4992+ }
4993+
49884994 // We still need to pass `OptRemark` because not all emitted instructions
49894995 // can be covered by BoundsSafetyOptRemarkScope. This is because EmitTrapCheck
49904996 // caches basic blocks that contain instructions that need annotating.
49914997 EmitTrapCheck (Checked, SanitizerHandler::BoundsSafety,
49924998 /* NoMerge=*/ CGM.getCodeGenOpts ().BoundsSafetyUniqueTraps ,
4993- /* TR=*/ nullptr , GetBoundsSafetyOptRemarkString (OptRemark),
4994- GetBoundsSafetyTrapMessageSuffix (kind, TrapCtx));
4999+ TR ? TR : &TempTR, GetBoundsSafetyOptRemarkString (OptRemark));
49955000}
49965001
49975002llvm::CallInst *CodeGenFunction::EmitTrapCall (llvm::Intrinsic::ID IntrID) {
0 commit comments