https://github.com/thurstond updated 
https://github.com/llvm/llvm-project/pull/139809

>From 3c8c0d59725092fdc51ceeaef913852ba930acce Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurs...@google.com>
Date: Wed, 7 May 2025 23:33:21 +0000
Subject: [PATCH 1/9] [cfi] Enable -fsanitize-annotate-debug-info functionality
 for CFI checks

This connects the -fsanitize-annotate-debug-info plumbing
(https://github.com/llvm/llvm-project/pull/138577) to CFI check codegen.

Updates the tests from https://github.com/llvm/llvm-project/pull/139149.

A side effect is that __ubsan_check_array_bounds is renamed to 
__ubsan_check_array-bounds.
This affects clang/test/CodeGen/bounds-checking-debuginfo.c
from https://github.com/llvm/llvm-project/pull/128977
---
 clang/lib/CodeGen/CGClass.cpp                 |  53 ++++++--
 clang/lib/CodeGen/CGExpr.cpp                  |  32 ++++-
 clang/lib/CodeGen/CodeGenFunction.h           |  11 ++
 clang/lib/CodeGen/ItaniumCXXABI.cpp           |   7 +-
 .../test/CodeGen/bounds-checking-debuginfo.c  |   4 +-
 clang/test/CodeGen/cfi-check-fail-debuginfo.c |  23 ++--
 .../CodeGen/cfi-icall-generalize-debuginfo.c  |  46 ++++---
 .../CodeGen/cfi-icall-normalize2-debuginfo.c  | 127 +++++++++---------
 8 files changed, 197 insertions(+), 106 deletions(-)

diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp
index befbfc64a680c..232965f8f0a84 100644
--- a/clang/lib/CodeGen/CGClass.cpp
+++ b/clang/lib/CodeGen/CGClass.cpp
@@ -2779,6 +2779,36 @@ void CodeGenFunction::EmitTypeMetadataCodeForVCall(const 
CXXRecordDecl *RD,
   }
 }
 
+void CodeGenFunction::ParseCFITypeCheckKind(CFITypeCheckKind TCK,
+                                            SanitizerKind::SanitizerOrdinal &M,
+                                            llvm::SanitizerStatKind &SSK) {
+  switch (TCK) {
+  case CFITCK_VCall:
+    M = SanitizerKind::SO_CFIVCall;
+    SSK = llvm::SanStat_CFI_VCall;
+    break;
+  case CFITCK_NVCall:
+    M = SanitizerKind::SO_CFINVCall;
+    SSK = llvm::SanStat_CFI_NVCall;
+    break;
+  case CFITCK_DerivedCast:
+    M = SanitizerKind::SO_CFIDerivedCast;
+    SSK = llvm::SanStat_CFI_DerivedCast;
+    break;
+  case CFITCK_UnrelatedCast:
+    M = SanitizerKind::SO_CFIUnrelatedCast;
+    SSK = llvm::SanStat_CFI_UnrelatedCast;
+    break;
+  case CFITCK_ICall:
+    M = SanitizerKind::SO_CFIICall;
+    SSK = llvm::SanStat_CFI_ICall;
+    break;
+  case CFITCK_NVMFCall:
+  case CFITCK_VMFCall:
+    llvm_unreachable("unexpected sanitizer kind");
+  }
+}
+
 void CodeGenFunction::EmitVTablePtrCheckForCall(const CXXRecordDecl *RD,
                                                 llvm::Value *VTable,
                                                 CFITypeCheckKind TCK,
@@ -2786,6 +2816,10 @@ void CodeGenFunction::EmitVTablePtrCheckForCall(const 
CXXRecordDecl *RD,
   if (!SanOpts.has(SanitizerKind::CFICastStrict))
     RD = LeastDerivedClassWithSameLayout(RD);
 
+  SanitizerKind::SanitizerOrdinal Ordinal;
+  llvm::SanitizerStatKind SSK;
+  ParseCFITypeCheckKind(TCK, Ordinal, SSK);
+  ApplyDebugLocation ApplyTrapDI(*this, SanitizerAnnotateDebugInfo(Ordinal));
   EmitVTablePtrCheck(RD, VTable, TCK, Loc);
 }
 
@@ -2808,6 +2842,11 @@ void CodeGenFunction::EmitVTablePtrCheckForCast(QualType 
T, Address Derived,
   if (!SanOpts.has(SanitizerKind::CFICastStrict))
     ClassDecl = LeastDerivedClassWithSameLayout(ClassDecl);
 
+  SanitizerKind::SanitizerOrdinal Ordinal;
+  llvm::SanitizerStatKind SSK;
+  ParseCFITypeCheckKind(TCK, Ordinal, SSK);
+  ApplyDebugLocation ApplyTrapDI(*this, SanitizerAnnotateDebugInfo(Ordinal));
+
   llvm::BasicBlock *ContBlock = nullptr;
 
   if (MayBeNull) {
@@ -2844,22 +2883,12 @@ void CodeGenFunction::EmitVTablePtrCheck(const 
CXXRecordDecl *RD,
 
   SanitizerKind::SanitizerOrdinal M;
   llvm::SanitizerStatKind SSK;
+  ParseCFITypeCheckKind(TCK, M, SSK);
   switch (TCK) {
   case CFITCK_VCall:
-    M = SanitizerKind::SO_CFIVCall;
-    SSK = llvm::SanStat_CFI_VCall;
-    break;
   case CFITCK_NVCall:
-    M = SanitizerKind::SO_CFINVCall;
-    SSK = llvm::SanStat_CFI_NVCall;
-    break;
   case CFITCK_DerivedCast:
-    M = SanitizerKind::SO_CFIDerivedCast;
-    SSK = llvm::SanStat_CFI_DerivedCast;
-    break;
   case CFITCK_UnrelatedCast:
-    M = SanitizerKind::SO_CFIUnrelatedCast;
-    SSK = llvm::SanStat_CFI_UnrelatedCast;
     break;
   case CFITCK_ICall:
   case CFITCK_NVMFCall:
@@ -2932,6 +2961,8 @@ llvm::Value *CodeGenFunction::EmitVTableTypeCheckedLoad(
   SanitizerScope SanScope(this);
 
   EmitSanitizerStatReport(llvm::SanStat_CFI_VCall);
+  ApplyDebugLocation ApplyTrapDI(
+      *this, SanitizerAnnotateDebugInfo(SanitizerKind::SO_CFIVCall));
 
   llvm::Metadata *MD =
       CGM.CreateMetadataIdentifierForType(QualType(RD->getTypeForDecl(), 0));
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index 37a5678aa61d5..f270d74195d9d 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -1217,6 +1217,30 @@ void CodeGenFunction::EmitBoundsCheck(const Expr *E, 
const Expr *Base,
   EmitBoundsCheckImpl(E, Bound, Index, IndexType, IndexedType, Accessed);
 }
 
+llvm::DILocation *CodeGenFunction::SanitizerAnnotateDebugInfo(
+    SanitizerKind::SanitizerOrdinal CheckKindOrdinal) {
+  StringRef Label;
+  switch (CheckKindOrdinal) {
+#define SANITIZER(NAME, ID)                                                    
\
+  case SanitizerKind::SO_##ID:                                                 
\
+    Label = "__ubsan_check_" NAME;                                             
\
+    break;
+#include "clang/Basic/Sanitizers.def"
+  default:
+    llvm_unreachable("unexpected sanitizer kind");
+  }
+
+  llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation();
+  // TODO: deprecate ClArrayBoundsPseudoFn
+  if (((ClArrayBoundsPseudoFn &&
+        CheckKindOrdinal == SanitizerKind::SO_ArrayBounds) ||
+       CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo.has(CheckKindOrdinal)) &&
+      CheckDI) {
+    CheckDI = getDebugInfo()->CreateSyntheticInlineAt(CheckDI, Label);
+  }
+  return CheckDI;
+}
+
 void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound,
                                           llvm::Value *Index,
                                           QualType IndexType,
@@ -1225,7 +1249,6 @@ void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, 
llvm::Value *Bound,
     return;
 
   SanitizerScope SanScope(this);
-
   auto CheckKind = SanitizerKind::SO_ArrayBounds;
   ApplyDebugLocation ApplyTrapDI(*this, SanitizerAnnotateDebugInfo(CheckKind));
 
@@ -3971,6 +3994,8 @@ void CodeGenFunction::EmitCfiCheckFail() {
                          {Addr, AllVtables}),
       IntPtrTy);
 
+  // TODO: the instructions above are not annotated with debug info. It is
+  // inconvenient to do so because we hadn't determined the SanitizerKind yet.
   const std::pair<int, SanitizerKind::SanitizerOrdinal> CheckKinds[] = {
       {CFITCK_VCall, SanitizerKind::SO_CFIVCall},
       {CFITCK_NVCall, SanitizerKind::SO_CFINVCall},
@@ -3981,6 +4006,9 @@ void CodeGenFunction::EmitCfiCheckFail() {
   for (auto CheckKindOrdinalPair : CheckKinds) {
     int Kind = CheckKindOrdinalPair.first;
     SanitizerKind::SanitizerOrdinal Ordinal = CheckKindOrdinalPair.second;
+
+    ApplyDebugLocation ApplyTrapDI(*this, SanitizerAnnotateDebugInfo(Ordinal));
+
     llvm::Value *Cond =
         Builder.CreateICmpNE(CheckKind, llvm::ConstantInt::get(Int8Ty, Kind));
     if (CGM.getLangOpts().Sanitize.has(Ordinal))
@@ -6315,6 +6343,8 @@ RValue CodeGenFunction::EmitCall(QualType CalleeType,
       (!TargetDecl || !isa<FunctionDecl>(TargetDecl))) {
     SanitizerScope SanScope(this);
     EmitSanitizerStatReport(llvm::SanStat_CFI_ICall);
+    ApplyDebugLocation ApplyTrapDI(
+        *this, SanitizerAnnotateDebugInfo(SanitizerKind::SO_CFIICall));
 
     llvm::Metadata *MD;
     if (CGM.getCodeGenOpts().SanitizeCfiICallGeneralizePointers)
diff --git a/clang/lib/CodeGen/CodeGenFunction.h 
b/clang/lib/CodeGen/CodeGenFunction.h
index 7104303cba50e..e0c65b218ce03 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -3358,6 +3358,17 @@ class CodeGenFunction : public CodeGenTypeCache {
                      SanitizerSet SkippedChecks = SanitizerSet(),
                      llvm::Value *ArraySize = nullptr);
 
+  /// Returns debug info, with additional annotation if enabled by
+  /// CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo[CheckKindOrdinal].
+  llvm::DILocation *
+  SanitizerAnnotateDebugInfo(SanitizerKind::SanitizerOrdinal CheckKindOrdinal);
+
+  /// Converts the CFITypeCheckKind into SanitizerKind::SanitizerOrdinal and
+  /// llvm::SanitizerStatKind.
+  void ParseCFITypeCheckKind(CFITypeCheckKind TCK,
+                             SanitizerKind::SanitizerOrdinal &M,
+                             llvm::SanitizerStatKind &SSK);
+
   /// Emit a check that \p Base points into an array object, which
   /// we can access at index \p Index. \p Accessed should be \c false if we
   /// this expression is used as an lvalue, for instance in "&Arr[Idx]".
diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp 
b/clang/lib/CodeGen/ItaniumCXXABI.cpp
index 8826085c596da..db5ef54f0d2f7 100644
--- a/clang/lib/CodeGen/ItaniumCXXABI.cpp
+++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp
@@ -703,6 +703,9 @@ CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
 
   {
     CodeGenFunction::SanitizerScope SanScope(&CGF);
+    ApplyDebugLocation ApplyTrapDI(
+        CGF, CGF.SanitizerAnnotateDebugInfo(SanitizerKind::SO_CFIMFCall));
+
     llvm::Value *TypeId = nullptr;
     llvm::Value *CheckResult = nullptr;
 
@@ -792,14 +795,16 @@ CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
   // In the non-virtual path, the function pointer is actually a
   // function pointer.
   CGF.EmitBlock(FnNonVirtual);
+
   llvm::Value *NonVirtualFn =
       Builder.CreateIntToPtr(FnAsInt, CGF.UnqualPtrTy, "memptr.nonvirtualfn");
-
   // Check the function pointer if CFI on member function pointers is enabled.
   if (ShouldEmitCFICheck) {
     CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
     if (RD->hasDefinition()) {
       CodeGenFunction::SanitizerScope SanScope(&CGF);
+      ApplyDebugLocation ApplyTrapDI(
+          CGF, CGF.SanitizerAnnotateDebugInfo(SanitizerKind::SO_CFIMFCall));
 
       llvm::Constant *StaticData[] = {
           llvm::ConstantInt::get(CGF.Int8Ty, CodeGenFunction::CFITCK_NVMFCall),
diff --git a/clang/test/CodeGen/bounds-checking-debuginfo.c 
b/clang/test/CodeGen/bounds-checking-debuginfo.c
index 74c06665dfe02..1549b02938697 100644
--- a/clang/test/CodeGen/bounds-checking-debuginfo.c
+++ b/clang/test/CodeGen/bounds-checking-debuginfo.c
@@ -89,7 +89,7 @@ double f1(int b, int i) {
 // CHECK-TRAP: [[DBG21]] = !DILocation(line: 65, column: 3, scope: [[DBG4]])
 // CHECK-TRAP: [[DBG22]] = !DILocation(line: 66, column: 12, scope: [[DBG4]])
 // CHECK-TRAP: [[DBG23]] = !DILocation(line: 0, scope: [[META24:![0-9]+]], 
inlinedAt: [[DBG26]])
-// CHECK-TRAP: [[META24]] = distinct !DISubprogram(name: 
"__ubsan_check_array_bounds", scope: [[META5]], file: [[META5]], type: 
[[META25:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: 
[[META0]])
+// CHECK-TRAP: [[META24]] = distinct !DISubprogram(name: 
"__ubsan_check_array-bounds", scope: [[META5]], file: [[META5]], type: 
[[META25:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: 
[[META0]])
 // CHECK-TRAP: [[META25]] = !DISubroutineType(types: null)
 // CHECK-TRAP: [[DBG26]] = !DILocation(line: 66, column: 10, scope: [[DBG4]])
 // CHECK-TRAP: [[PROF27]] = !{!"branch_weights", i32 1048575, i32 1}
@@ -117,7 +117,7 @@ double f1(int b, int i) {
 // CHECK-NOTRAP: [[DBG21]] = !DILocation(line: 65, column: 3, scope: [[DBG4]])
 // CHECK-NOTRAP: [[DBG22]] = !DILocation(line: 66, column: 12, scope: [[DBG4]])
 // CHECK-NOTRAP: [[DBG23]] = !DILocation(line: 0, scope: [[META24:![0-9]+]], 
inlinedAt: [[DBG26]])
-// CHECK-NOTRAP: [[META24]] = distinct !DISubprogram(name: 
"__ubsan_check_array_bounds", scope: [[META5]], file: [[META5]], type: 
[[META25:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: 
[[META0]])
+// CHECK-NOTRAP: [[META24]] = distinct !DISubprogram(name: 
"__ubsan_check_array-bounds", scope: [[META5]], file: [[META5]], type: 
[[META25:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: 
[[META0]])
 // CHECK-NOTRAP: [[META25]] = !DISubroutineType(types: null)
 // CHECK-NOTRAP: [[DBG26]] = !DILocation(line: 66, column: 10, scope: [[DBG4]])
 // CHECK-NOTRAP: [[PROF27]] = !{!"branch_weights", i32 1048575, i32 1}
diff --git a/clang/test/CodeGen/cfi-check-fail-debuginfo.c 
b/clang/test/CodeGen/cfi-check-fail-debuginfo.c
index cd5ec567cb01b..7100a42fef886 100644
--- a/clang/test/CodeGen/cfi-check-fail-debuginfo.c
+++ b/clang/test/CodeGen/cfi-check-fail-debuginfo.c
@@ -10,14 +10,14 @@
 // CHECK-SAME: ptr noundef [[F:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] 
!dbg [[DBG7:![0-9]+]] !type [[META16:![0-9]+]] !type [[META17:![0-9]+]] !type 
[[META18:![0-9]+]] {
 // CHECK-NEXT:  [[ENTRY:.*:]]
 // CHECK-NEXT:      #dbg_value(ptr [[F]], [[META15:![0-9]+]], !DIExpression(), 
[[META19:![0-9]+]])
-// CHECK-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr [[F]], 
metadata !"_ZTSFvvE"), !dbg [[DBG20:![0-9]+]], !nosanitize [[META21:![0-9]+]]
-// CHECK-NEXT:    br i1 [[TMP0]], label %[[CFI_CONT:.*]], label 
%[[CFI_SLOWPATH:.*]], !dbg [[DBG20]], !prof [[PROF22:![0-9]+]], !nosanitize 
[[META21]]
+// CHECK-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr [[F]], 
metadata !"_ZTSFvvE"), !dbg [[DBG20:![0-9]+]], !nosanitize [[META24:![0-9]+]]
+// CHECK-NEXT:    br i1 [[TMP0]], label %[[CFI_CONT:.*]], label 
%[[CFI_SLOWPATH:.*]], !dbg [[DBG20]], !prof [[PROF25:![0-9]+]], !nosanitize 
[[META24]]
 // CHECK:       [[CFI_SLOWPATH]]:
-// CHECK-NEXT:    tail call void @__cfi_slowpath(i64 9080559750644022485, ptr 
[[F]]) #[[ATTR6:[0-9]+]], !dbg [[DBG20]], !nosanitize [[META21]]
-// CHECK-NEXT:    br label %[[CFI_CONT]], !dbg [[DBG20]], !nosanitize 
[[META21]]
+// CHECK-NEXT:    tail call void @__cfi_slowpath(i64 9080559750644022485, ptr 
[[F]]) #[[ATTR6:[0-9]+]], !dbg [[DBG20]], !nosanitize [[META24]]
+// CHECK-NEXT:    br label %[[CFI_CONT]], !dbg [[DBG20]], !nosanitize 
[[META24]]
 // CHECK:       [[CFI_CONT]]:
-// CHECK-NEXT:    tail call void [[F]]() #[[ATTR6]], !dbg [[DBG20]]
-// CHECK-NEXT:    ret void, !dbg [[DBG23:![0-9]+]]
+// CHECK-NEXT:    tail call void [[F]]() #[[ATTR6]], !dbg [[DBG23:![0-9]+]]
+// CHECK-NEXT:    ret void, !dbg [[DBG26:![0-9]+]]
 //
 void caller(void (*f)(void)) {
   f();
@@ -38,8 +38,11 @@ void caller(void (*f)(void)) {
 // CHECK: [[META17]] = !{i64 0, !"_ZTSFvPvE.generalized"}
 // CHECK: [[META18]] = !{i64 0, i64 2451761621477796417}
 // CHECK: [[META19]] = !DILocation(line: 0, scope: [[DBG7]])
-// CHECK: [[DBG20]] = !DILocation(line: 23, column: 3, scope: [[DBG7]])
-// CHECK: [[META21]] = !{}
-// CHECK: [[PROF22]] = !{!"branch_weights", i32 1048575, i32 1}
-// CHECK: [[DBG23]] = !DILocation(line: 24, column: 1, scope: [[DBG7]])
+// CHECK: [[DBG20]] = !DILocation(line: 0, scope: [[META21:![0-9]+]], 
inlinedAt: [[DBG23]])
+// CHECK: [[META21]] = distinct !DISubprogram(name: "__ubsan_check_cfi-icall", 
scope: [[META8]], file: [[META8]], type: [[META22:![0-9]+]], flags: 
DIFlagArtificial, spFlags: DISPFlagDefinition, unit: [[META0]])
+// CHECK: [[META22]] = !DISubroutineType(types: null)
+// CHECK: [[DBG23]] = !DILocation(line: 23, column: 3, scope: [[DBG7]])
+// CHECK: [[META24]] = !{}
+// CHECK: [[PROF25]] = !{!"branch_weights", i32 1048575, i32 1}
+// CHECK: [[DBG26]] = !DILocation(line: 24, column: 1, scope: [[DBG7]])
 //.
diff --git a/clang/test/CodeGen/cfi-icall-generalize-debuginfo.c 
b/clang/test/CodeGen/cfi-icall-generalize-debuginfo.c
index 8b184528889a0..e47f058e2c633 100644
--- a/clang/test/CodeGen/cfi-icall-generalize-debuginfo.c
+++ b/clang/test/CodeGen/cfi-icall-generalize-debuginfo.c
@@ -27,27 +27,27 @@ int** f(const char *a, const char **b) {
 // UNGENERALIZED-SAME: ptr noundef [[FP:%.*]]) local_unnamed_addr 
#[[ATTR1:[0-9]+]] !dbg [[DBG25:![0-9]+]] !type [[META31:![0-9]+]] !type 
[[META32:![0-9]+]] {
 // UNGENERALIZED-NEXT:  [[ENTRY:.*:]]
 // UNGENERALIZED-NEXT:      #dbg_value(ptr [[FP]], [[META30:![0-9]+]], 
!DIExpression(), [[META33:![0-9]+]])
-// UNGENERALIZED-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr 
[[FP]], metadata !"_ZTSFPPiPKcPS2_E"), !dbg [[DBG34:![0-9]+]], !nosanitize 
[[META35:![0-9]+]]
-// UNGENERALIZED-NEXT:    br i1 [[TMP0]], label %[[CONT:.*]], label 
%[[TRAP:.*]], !dbg [[DBG34]], !prof [[PROF36:![0-9]+]], !nosanitize [[META35]]
+// UNGENERALIZED-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr 
[[FP]], metadata !"_ZTSFPPiPKcPS2_E"), !dbg [[DBG34:![0-9]+]], !nosanitize 
[[META38:![0-9]+]]
+// UNGENERALIZED-NEXT:    br i1 [[TMP0]], label %[[CONT:.*]], label 
%[[TRAP:.*]], !dbg [[DBG34]], !prof [[PROF39:![0-9]+]], !nosanitize [[META38]]
 // UNGENERALIZED:       [[TRAP]]:
-// UNGENERALIZED-NEXT:    tail call void @llvm.ubsantrap(i8 2) 
#[[ATTR4:[0-9]+]], !dbg [[DBG34]], !nosanitize [[META35]]
-// UNGENERALIZED-NEXT:    unreachable, !dbg [[DBG34]], !nosanitize [[META35]]
+// UNGENERALIZED-NEXT:    tail call void @llvm.ubsantrap(i8 2) 
#[[ATTR4:[0-9]+]], !dbg [[DBG34]], !nosanitize [[META38]]
+// UNGENERALIZED-NEXT:    unreachable, !dbg [[DBG34]], !nosanitize [[META38]]
 // UNGENERALIZED:       [[CONT]]:
-// UNGENERALIZED-NEXT:    [[CALL:%.*]] = tail call ptr [[FP]](ptr noundef 
null, ptr noundef null) #[[ATTR5:[0-9]+]], !dbg [[DBG34]]
-// UNGENERALIZED-NEXT:    ret void, !dbg [[DBG37:![0-9]+]]
+// UNGENERALIZED-NEXT:    [[CALL:%.*]] = tail call ptr [[FP]](ptr noundef 
null, ptr noundef null) #[[ATTR5:[0-9]+]], !dbg [[DBG37:![0-9]+]]
+// UNGENERALIZED-NEXT:    ret void, !dbg [[DBG40:![0-9]+]]
 //
 // GENERALIZED-LABEL: define dso_local void @g(
 // GENERALIZED-SAME: ptr noundef [[FP:%.*]]) local_unnamed_addr 
#[[ATTR1:[0-9]+]] !dbg [[DBG25:![0-9]+]] !type [[META31:![0-9]+]] !type 
[[META32:![0-9]+]] {
 // GENERALIZED-NEXT:  [[ENTRY:.*:]]
 // GENERALIZED-NEXT:      #dbg_value(ptr [[FP]], [[META30:![0-9]+]], 
!DIExpression(), [[META33:![0-9]+]])
-// GENERALIZED-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr 
[[FP]], metadata !"_ZTSFPvPKvS_E.generalized"), !dbg [[DBG34:![0-9]+]], 
!nosanitize [[META35:![0-9]+]]
-// GENERALIZED-NEXT:    br i1 [[TMP0]], label %[[CONT:.*]], label 
%[[TRAP:.*]], !dbg [[DBG34]], !prof [[PROF36:![0-9]+]], !nosanitize [[META35]]
+// GENERALIZED-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr 
[[FP]], metadata !"_ZTSFPvPKvS_E.generalized"), !dbg [[DBG34:![0-9]+]], 
!nosanitize [[META38:![0-9]+]]
+// GENERALIZED-NEXT:    br i1 [[TMP0]], label %[[CONT:.*]], label 
%[[TRAP:.*]], !dbg [[DBG34]], !prof [[PROF39:![0-9]+]], !nosanitize [[META38]]
 // GENERALIZED:       [[TRAP]]:
-// GENERALIZED-NEXT:    tail call void @llvm.ubsantrap(i8 2) 
#[[ATTR4:[0-9]+]], !dbg [[DBG34]], !nosanitize [[META35]]
-// GENERALIZED-NEXT:    unreachable, !dbg [[DBG34]], !nosanitize [[META35]]
+// GENERALIZED-NEXT:    tail call void @llvm.ubsantrap(i8 2) 
#[[ATTR4:[0-9]+]], !dbg [[DBG34]], !nosanitize [[META38]]
+// GENERALIZED-NEXT:    unreachable, !dbg [[DBG34]], !nosanitize [[META38]]
 // GENERALIZED:       [[CONT]]:
-// GENERALIZED-NEXT:    [[CALL:%.*]] = tail call ptr [[FP]](ptr noundef null, 
ptr noundef null) #[[ATTR5:[0-9]+]], !dbg [[DBG34]]
-// GENERALIZED-NEXT:    ret void, !dbg [[DBG37:![0-9]+]]
+// GENERALIZED-NEXT:    [[CALL:%.*]] = tail call ptr [[FP]](ptr noundef null, 
ptr noundef null) #[[ATTR5:[0-9]+]], !dbg [[DBG37:![0-9]+]]
+// GENERALIZED-NEXT:    ret void, !dbg [[DBG40:![0-9]+]]
 //
 void g(int** (*fp)(const char *, const char **)) {
   fp(0, 0);
@@ -84,10 +84,13 @@ void g(int** (*fp)(const char *, const char **)) {
 // UNGENERALIZED: [[META31]] = !{i64 0, !"_ZTSFvPFPPiPKcPS2_EE"}
 // UNGENERALIZED: [[META32]] = !{i64 0, !"_ZTSFvPvE.generalized"}
 // UNGENERALIZED: [[META33]] = !DILocation(line: 0, scope: [[DBG25]])
-// UNGENERALIZED: [[DBG34]] = !DILocation(line: 53, column: 3, scope: 
[[DBG25]])
-// UNGENERALIZED: [[META35]] = !{}
-// UNGENERALIZED: [[PROF36]] = !{!"branch_weights", i32 1048575, i32 1}
-// UNGENERALIZED: [[DBG37]] = !DILocation(line: 54, column: 1, scope: 
[[DBG25]])
+// UNGENERALIZED: [[DBG34]] = !DILocation(line: 0, scope: [[META35:![0-9]+]], 
inlinedAt: [[DBG37]])
+// UNGENERALIZED: [[META35]] = distinct !DISubprogram(name: 
"__ubsan_check_cfi-icall", scope: [[META11]], file: [[META11]], type: 
[[META36:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: 
[[META0]])
+// UNGENERALIZED: [[META36]] = !DISubroutineType(types: null)
+// UNGENERALIZED: [[DBG37]] = !DILocation(line: 53, column: 3, scope: 
[[DBG25]])
+// UNGENERALIZED: [[META38]] = !{}
+// UNGENERALIZED: [[PROF39]] = !{!"branch_weights", i32 1048575, i32 1}
+// UNGENERALIZED: [[DBG40]] = !DILocation(line: 54, column: 1, scope: 
[[DBG25]])
 //.
 // GENERALIZED: [[META0:![0-9]+]] = distinct !DICompileUnit(language: 
DW_LANG_C11, file: [[META1:![0-9]+]], isOptimized: true, runtimeVersion: 0, 
emissionKind: FullDebug, retainedTypes: [[META2:![0-9]+]], splitDebugInlining: 
false, nameTableKind: None)
 // GENERALIZED: [[META1]] = !DIFile(filename: "{{.*}}<stdin>", directory: 
{{.*}})
@@ -119,8 +122,11 @@ void g(int** (*fp)(const char *, const char **)) {
 // GENERALIZED: [[META31]] = !{i64 0, !"_ZTSFvPFPPiPKcPS2_EE"}
 // GENERALIZED: [[META32]] = !{i64 0, !"_ZTSFvPvE.generalized"}
 // GENERALIZED: [[META33]] = !DILocation(line: 0, scope: [[DBG25]])
-// GENERALIZED: [[DBG34]] = !DILocation(line: 53, column: 3, scope: [[DBG25]])
-// GENERALIZED: [[META35]] = !{}
-// GENERALIZED: [[PROF36]] = !{!"branch_weights", i32 1048575, i32 1}
-// GENERALIZED: [[DBG37]] = !DILocation(line: 54, column: 1, scope: [[DBG25]])
+// GENERALIZED: [[DBG34]] = !DILocation(line: 0, scope: [[META35:![0-9]+]], 
inlinedAt: [[DBG37]])
+// GENERALIZED: [[META35]] = distinct !DISubprogram(name: 
"__ubsan_check_cfi-icall", scope: [[META11]], file: [[META11]], type: 
[[META36:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: 
[[META0]])
+// GENERALIZED: [[META36]] = !DISubroutineType(types: null)
+// GENERALIZED: [[DBG37]] = !DILocation(line: 53, column: 3, scope: [[DBG25]])
+// GENERALIZED: [[META38]] = !{}
+// GENERALIZED: [[PROF39]] = !{!"branch_weights", i32 1048575, i32 1}
+// GENERALIZED: [[DBG40]] = !DILocation(line: 54, column: 1, scope: [[DBG25]])
 //.
diff --git a/clang/test/CodeGen/cfi-icall-normalize2-debuginfo.c 
b/clang/test/CodeGen/cfi-icall-normalize2-debuginfo.c
index 00f416e47dee6..2c1574b646087 100644
--- a/clang/test/CodeGen/cfi-icall-normalize2-debuginfo.c
+++ b/clang/test/CodeGen/cfi-icall-normalize2-debuginfo.c
@@ -12,53 +12,53 @@
 // CHECK-NEXT:  [[ENTRY:.*:]]
 // CHECK-NEXT:      #dbg_value(ptr [[FN]], [[META16:![0-9]+]], 
!DIExpression(), [[META20:![0-9]+]])
 // CHECK-NEXT:      #dbg_value(i32 [[ARG]], [[META17:![0-9]+]], 
!DIExpression(), [[META20]])
-// CHECK-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr [[FN]], 
metadata !"_ZTSFvu3i32E.normalized"), !dbg [[DBG21:![0-9]+]], !nosanitize 
[[META22:![0-9]+]]
-// CHECK-NEXT:    br i1 [[TMP0]], label %[[CONT:.*]], label %[[TRAP:.*]], !dbg 
[[DBG21]], !prof [[PROF23:![0-9]+]], !nosanitize [[META22]]
+// CHECK-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr [[FN]], 
metadata !"_ZTSFvu3i32E.normalized"), !dbg [[DBG21:![0-9]+]], !nosanitize 
[[META25:![0-9]+]]
+// CHECK-NEXT:    br i1 [[TMP0]], label %[[CONT:.*]], label %[[TRAP:.*]], !dbg 
[[DBG21]], !prof [[PROF26:![0-9]+]], !nosanitize [[META25]]
 // CHECK:       [[TRAP]]:
-// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR3:[0-9]+]], !dbg 
[[DBG21]], !nosanitize [[META22]]
-// CHECK-NEXT:    unreachable, !dbg [[DBG21]], !nosanitize [[META22]]
+// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR3:[0-9]+]], !dbg 
[[DBG21]], !nosanitize [[META25]]
+// CHECK-NEXT:    unreachable, !dbg [[DBG21]], !nosanitize [[META25]]
 // CHECK:       [[CONT]]:
-// CHECK-NEXT:    tail call void [[FN]](i32 noundef [[ARG]]) 
#[[ATTR4:[0-9]+]], !dbg [[DBG21]]
-// CHECK-NEXT:    ret void, !dbg [[DBG24:![0-9]+]]
+// CHECK-NEXT:    tail call void [[FN]](i32 noundef [[ARG]]) 
#[[ATTR4:[0-9]+]], !dbg [[DBG24:![0-9]+]]
+// CHECK-NEXT:    ret void, !dbg [[DBG27:![0-9]+]]
 //
 void foo(void (*fn)(int), int arg) {
     fn(arg);
 }
 
 // CHECK-LABEL: define dso_local void @bar(
-// CHECK-SAME: ptr noundef [[FN:%.*]], i32 noundef [[ARG1:%.*]], i32 noundef 
[[ARG2:%.*]]) local_unnamed_addr #[[ATTR0]] !dbg [[DBG25:![0-9]+]] !type 
[[META35:![0-9]+]] !type [[META36:![0-9]+]] {
+// CHECK-SAME: ptr noundef [[FN:%.*]], i32 noundef [[ARG1:%.*]], i32 noundef 
[[ARG2:%.*]]) local_unnamed_addr #[[ATTR0]] !dbg [[DBG28:![0-9]+]] !type 
[[META38:![0-9]+]] !type [[META39:![0-9]+]] {
 // CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:      #dbg_value(ptr [[FN]], [[META32:![0-9]+]], 
!DIExpression(), [[META37:![0-9]+]])
-// CHECK-NEXT:      #dbg_value(i32 [[ARG1]], [[META33:![0-9]+]], 
!DIExpression(), [[META37]])
-// CHECK-NEXT:      #dbg_value(i32 [[ARG2]], [[META34:![0-9]+]], 
!DIExpression(), [[META37]])
-// CHECK-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr [[FN]], 
metadata !"_ZTSFvu3i32S_E.normalized"), !dbg [[DBG38:![0-9]+]], !nosanitize 
[[META22]]
-// CHECK-NEXT:    br i1 [[TMP0]], label %[[CONT:.*]], label %[[TRAP:.*]], !dbg 
[[DBG38]], !prof [[PROF23]], !nosanitize [[META22]]
+// CHECK-NEXT:      #dbg_value(ptr [[FN]], [[META35:![0-9]+]], 
!DIExpression(), [[META40:![0-9]+]])
+// CHECK-NEXT:      #dbg_value(i32 [[ARG1]], [[META36:![0-9]+]], 
!DIExpression(), [[META40]])
+// CHECK-NEXT:      #dbg_value(i32 [[ARG2]], [[META37:![0-9]+]], 
!DIExpression(), [[META40]])
+// CHECK-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr [[FN]], 
metadata !"_ZTSFvu3i32S_E.normalized"), !dbg [[DBG41:![0-9]+]], !nosanitize 
[[META25]]
+// CHECK-NEXT:    br i1 [[TMP0]], label %[[CONT:.*]], label %[[TRAP:.*]], !dbg 
[[DBG41]], !prof [[PROF26]], !nosanitize [[META25]]
 // CHECK:       [[TRAP]]:
-// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR3]], !dbg 
[[DBG38]], !nosanitize [[META22]]
-// CHECK-NEXT:    unreachable, !dbg [[DBG38]], !nosanitize [[META22]]
+// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR3]], !dbg 
[[DBG41]], !nosanitize [[META25]]
+// CHECK-NEXT:    unreachable, !dbg [[DBG41]], !nosanitize [[META25]]
 // CHECK:       [[CONT]]:
-// CHECK-NEXT:    tail call void [[FN]](i32 noundef [[ARG1]], i32 noundef 
[[ARG2]]) #[[ATTR4]], !dbg [[DBG38]]
-// CHECK-NEXT:    ret void, !dbg [[DBG39:![0-9]+]]
+// CHECK-NEXT:    tail call void [[FN]](i32 noundef [[ARG1]], i32 noundef 
[[ARG2]]) #[[ATTR4]], !dbg [[DBG42:![0-9]+]]
+// CHECK-NEXT:    ret void, !dbg [[DBG43:![0-9]+]]
 //
 void bar(void (*fn)(int, int), int arg1, int arg2) {
     fn(arg1, arg2);
 }
 
 // CHECK-LABEL: define dso_local void @baz(
-// CHECK-SAME: ptr noundef [[FN:%.*]], i32 noundef [[ARG1:%.*]], i32 noundef 
[[ARG2:%.*]], i32 noundef [[ARG3:%.*]]) local_unnamed_addr #[[ATTR0]] !dbg 
[[DBG40:![0-9]+]] !type [[META51:![0-9]+]] !type [[META52:![0-9]+]] {
+// CHECK-SAME: ptr noundef [[FN:%.*]], i32 noundef [[ARG1:%.*]], i32 noundef 
[[ARG2:%.*]], i32 noundef [[ARG3:%.*]]) local_unnamed_addr #[[ATTR0]] !dbg 
[[DBG44:![0-9]+]] !type [[META55:![0-9]+]] !type [[META56:![0-9]+]] {
 // CHECK-NEXT:  [[ENTRY:.*:]]
-// CHECK-NEXT:      #dbg_value(ptr [[FN]], [[META47:![0-9]+]], 
!DIExpression(), [[META53:![0-9]+]])
-// CHECK-NEXT:      #dbg_value(i32 [[ARG1]], [[META48:![0-9]+]], 
!DIExpression(), [[META53]])
-// CHECK-NEXT:      #dbg_value(i32 [[ARG2]], [[META49:![0-9]+]], 
!DIExpression(), [[META53]])
-// CHECK-NEXT:      #dbg_value(i32 [[ARG3]], [[META50:![0-9]+]], 
!DIExpression(), [[META53]])
-// CHECK-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr [[FN]], 
metadata !"_ZTSFvu3i32S_S_E.normalized"), !dbg [[DBG54:![0-9]+]], !nosanitize 
[[META22]]
-// CHECK-NEXT:    br i1 [[TMP0]], label %[[CONT:.*]], label %[[TRAP:.*]], !dbg 
[[DBG54]], !prof [[PROF23]], !nosanitize [[META22]]
+// CHECK-NEXT:      #dbg_value(ptr [[FN]], [[META51:![0-9]+]], 
!DIExpression(), [[META57:![0-9]+]])
+// CHECK-NEXT:      #dbg_value(i32 [[ARG1]], [[META52:![0-9]+]], 
!DIExpression(), [[META57]])
+// CHECK-NEXT:      #dbg_value(i32 [[ARG2]], [[META53:![0-9]+]], 
!DIExpression(), [[META57]])
+// CHECK-NEXT:      #dbg_value(i32 [[ARG3]], [[META54:![0-9]+]], 
!DIExpression(), [[META57]])
+// CHECK-NEXT:    [[TMP0:%.*]] = tail call i1 @llvm.type.test(ptr [[FN]], 
metadata !"_ZTSFvu3i32S_S_E.normalized"), !dbg [[DBG58:![0-9]+]], !nosanitize 
[[META25]]
+// CHECK-NEXT:    br i1 [[TMP0]], label %[[CONT:.*]], label %[[TRAP:.*]], !dbg 
[[DBG58]], !prof [[PROF26]], !nosanitize [[META25]]
 // CHECK:       [[TRAP]]:
-// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR3]], !dbg 
[[DBG54]], !nosanitize [[META22]]
-// CHECK-NEXT:    unreachable, !dbg [[DBG54]], !nosanitize [[META22]]
+// CHECK-NEXT:    tail call void @llvm.ubsantrap(i8 2) #[[ATTR3]], !dbg 
[[DBG58]], !nosanitize [[META25]]
+// CHECK-NEXT:    unreachable, !dbg [[DBG58]], !nosanitize [[META25]]
 // CHECK:       [[CONT]]:
-// CHECK-NEXT:    tail call void [[FN]](i32 noundef [[ARG1]], i32 noundef 
[[ARG2]], i32 noundef [[ARG3]]) #[[ATTR4]], !dbg [[DBG54]]
-// CHECK-NEXT:    ret void, !dbg [[DBG55:![0-9]+]]
+// CHECK-NEXT:    tail call void [[FN]](i32 noundef [[ARG1]], i32 noundef 
[[ARG2]], i32 noundef [[ARG3]]) #[[ATTR4]], !dbg [[DBG59:![0-9]+]]
+// CHECK-NEXT:    ret void, !dbg [[DBG60:![0-9]+]]
 //
 void baz(void (*fn)(int, int, int), int arg1, int arg2, int arg3) {
     fn(arg1, arg2, arg3);
@@ -81,39 +81,44 @@ void baz(void (*fn)(int, int, int), int arg1, int arg2, int 
arg3) {
 // CHECK: [[META18]] = !{i64 0, !"_ZTSFvPFvu3i32ES_E.normalized"}
 // CHECK: [[META19]] = !{i64 0, !"_ZTSFvPvu3i32E.normalized.generalized"}
 // CHECK: [[META20]] = !DILocation(line: 0, scope: [[DBG7]])
-// CHECK: [[DBG21]] = !DILocation(line: 25, column: 5, scope: [[DBG7]])
-// CHECK: [[META22]] = !{}
-// CHECK: [[PROF23]] = !{!"branch_weights", i32 1048575, i32 1}
-// CHECK: [[DBG24]] = !DILocation(line: 26, column: 1, scope: [[DBG7]])
-// CHECK: [[DBG25]] = distinct !DISubprogram(name: "bar", scope: [[META8]], 
file: [[META8]], line: 43, type: [[META26:![0-9]+]], scopeLine: 43, flags: 
DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: 
[[META0]], retainedNodes: [[META31:![0-9]+]])
-// CHECK: [[META26]] = !DISubroutineType(types: [[META27:![0-9]+]])
-// CHECK: [[META27]] = !{null, [[META28:![0-9]+]], [[META14]], [[META14]]}
-// CHECK: [[META28]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: 
[[META29:![0-9]+]], size: 64)
+// CHECK: [[DBG21]] = !DILocation(line: 0, scope: [[META22:![0-9]+]], 
inlinedAt: [[DBG24]])
+// CHECK: [[META22]] = distinct !DISubprogram(name: "__ubsan_check_cfi-icall", 
scope: [[META8]], file: [[META8]], type: [[META23:![0-9]+]], flags: 
DIFlagArtificial, spFlags: DISPFlagDefinition, unit: [[META0]])
+// CHECK: [[META23]] = !DISubroutineType(types: null)
+// CHECK: [[DBG24]] = !DILocation(line: 25, column: 5, scope: [[DBG7]])
+// CHECK: [[META25]] = !{}
+// CHECK: [[PROF26]] = !{!"branch_weights", i32 1048575, i32 1}
+// CHECK: [[DBG27]] = !DILocation(line: 26, column: 1, scope: [[DBG7]])
+// CHECK: [[DBG28]] = distinct !DISubprogram(name: "bar", scope: [[META8]], 
file: [[META8]], line: 43, type: [[META29:![0-9]+]], scopeLine: 43, flags: 
DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: 
[[META0]], retainedNodes: [[META34:![0-9]+]])
 // CHECK: [[META29]] = !DISubroutineType(types: [[META30:![0-9]+]])
-// CHECK: [[META30]] = !{null, [[META14]], [[META14]]}
-// CHECK: [[META31]] = !{[[META32]], [[META33]], [[META34]]}
-// CHECK: [[META32]] = !DILocalVariable(name: "fn", arg: 1, scope: [[DBG25]], 
file: [[META8]], line: 43, type: [[META28]])
-// CHECK: [[META33]] = !DILocalVariable(name: "arg1", arg: 2, scope: 
[[DBG25]], file: [[META8]], line: 43, type: [[META14]])
-// CHECK: [[META34]] = !DILocalVariable(name: "arg2", arg: 3, scope: 
[[DBG25]], file: [[META8]], line: 43, type: [[META14]])
-// CHECK: [[META35]] = !{i64 0, !"_ZTSFvPFvu3i32S_ES_S_E.normalized"}
-// CHECK: [[META36]] = !{i64 0, !"_ZTSFvPvu3i32S0_E.normalized.generalized"}
-// CHECK: [[META37]] = !DILocation(line: 0, scope: [[DBG25]])
-// CHECK: [[DBG38]] = !DILocation(line: 44, column: 5, scope: [[DBG25]])
-// CHECK: [[DBG39]] = !DILocation(line: 45, column: 1, scope: [[DBG25]])
-// CHECK: [[DBG40]] = distinct !DISubprogram(name: "baz", scope: [[META8]], 
file: [[META8]], line: 63, type: [[META41:![0-9]+]], scopeLine: 63, flags: 
DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: 
[[META0]], retainedNodes: [[META46:![0-9]+]])
-// CHECK: [[META41]] = !DISubroutineType(types: [[META42:![0-9]+]])
-// CHECK: [[META42]] = !{null, [[META43:![0-9]+]], [[META14]], [[META14]], 
[[META14]]}
-// CHECK: [[META43]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: 
[[META44:![0-9]+]], size: 64)
-// CHECK: [[META44]] = !DISubroutineType(types: [[META45:![0-9]+]])
-// CHECK: [[META45]] = !{null, [[META14]], [[META14]], [[META14]]}
-// CHECK: [[META46]] = !{[[META47]], [[META48]], [[META49]], [[META50]]}
-// CHECK: [[META47]] = !DILocalVariable(name: "fn", arg: 1, scope: [[DBG40]], 
file: [[META8]], line: 63, type: [[META43]])
-// CHECK: [[META48]] = !DILocalVariable(name: "arg1", arg: 2, scope: 
[[DBG40]], file: [[META8]], line: 63, type: [[META14]])
-// CHECK: [[META49]] = !DILocalVariable(name: "arg2", arg: 3, scope: 
[[DBG40]], file: [[META8]], line: 63, type: [[META14]])
-// CHECK: [[META50]] = !DILocalVariable(name: "arg3", arg: 4, scope: 
[[DBG40]], file: [[META8]], line: 63, type: [[META14]])
-// CHECK: [[META51]] = !{i64 0, !"_ZTSFvPFvu3i32S_S_ES_S_S_E.normalized"}
-// CHECK: [[META52]] = !{i64 0, !"_ZTSFvPvu3i32S0_S0_E.normalized.generalized"}
-// CHECK: [[META53]] = !DILocation(line: 0, scope: [[DBG40]])
-// CHECK: [[DBG54]] = !DILocation(line: 64, column: 5, scope: [[DBG40]])
-// CHECK: [[DBG55]] = !DILocation(line: 65, column: 1, scope: [[DBG40]])
+// CHECK: [[META30]] = !{null, [[META31:![0-9]+]], [[META14]], [[META14]]}
+// CHECK: [[META31]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: 
[[META32:![0-9]+]], size: 64)
+// CHECK: [[META32]] = !DISubroutineType(types: [[META33:![0-9]+]])
+// CHECK: [[META33]] = !{null, [[META14]], [[META14]]}
+// CHECK: [[META34]] = !{[[META35]], [[META36]], [[META37]]}
+// CHECK: [[META35]] = !DILocalVariable(name: "fn", arg: 1, scope: [[DBG28]], 
file: [[META8]], line: 43, type: [[META31]])
+// CHECK: [[META36]] = !DILocalVariable(name: "arg1", arg: 2, scope: 
[[DBG28]], file: [[META8]], line: 43, type: [[META14]])
+// CHECK: [[META37]] = !DILocalVariable(name: "arg2", arg: 3, scope: 
[[DBG28]], file: [[META8]], line: 43, type: [[META14]])
+// CHECK: [[META38]] = !{i64 0, !"_ZTSFvPFvu3i32S_ES_S_E.normalized"}
+// CHECK: [[META39]] = !{i64 0, !"_ZTSFvPvu3i32S0_E.normalized.generalized"}
+// CHECK: [[META40]] = !DILocation(line: 0, scope: [[DBG28]])
+// CHECK: [[DBG41]] = !DILocation(line: 0, scope: [[META22]], inlinedAt: 
[[DBG42]])
+// CHECK: [[DBG42]] = !DILocation(line: 44, column: 5, scope: [[DBG28]])
+// CHECK: [[DBG43]] = !DILocation(line: 45, column: 1, scope: [[DBG28]])
+// CHECK: [[DBG44]] = distinct !DISubprogram(name: "baz", scope: [[META8]], 
file: [[META8]], line: 63, type: [[META45:![0-9]+]], scopeLine: 63, flags: 
DIFlagPrototyped, spFlags: DISPFlagDefinition | DISPFlagOptimized, unit: 
[[META0]], retainedNodes: [[META50:![0-9]+]])
+// CHECK: [[META45]] = !DISubroutineType(types: [[META46:![0-9]+]])
+// CHECK: [[META46]] = !{null, [[META47:![0-9]+]], [[META14]], [[META14]], 
[[META14]]}
+// CHECK: [[META47]] = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: 
[[META48:![0-9]+]], size: 64)
+// CHECK: [[META48]] = !DISubroutineType(types: [[META49:![0-9]+]])
+// CHECK: [[META49]] = !{null, [[META14]], [[META14]], [[META14]]}
+// CHECK: [[META50]] = !{[[META51]], [[META52]], [[META53]], [[META54]]}
+// CHECK: [[META51]] = !DILocalVariable(name: "fn", arg: 1, scope: [[DBG44]], 
file: [[META8]], line: 63, type: [[META47]])
+// CHECK: [[META52]] = !DILocalVariable(name: "arg1", arg: 2, scope: 
[[DBG44]], file: [[META8]], line: 63, type: [[META14]])
+// CHECK: [[META53]] = !DILocalVariable(name: "arg2", arg: 3, scope: 
[[DBG44]], file: [[META8]], line: 63, type: [[META14]])
+// CHECK: [[META54]] = !DILocalVariable(name: "arg3", arg: 4, scope: 
[[DBG44]], file: [[META8]], line: 63, type: [[META14]])
+// CHECK: [[META55]] = !{i64 0, !"_ZTSFvPFvu3i32S_S_ES_S_S_E.normalized"}
+// CHECK: [[META56]] = !{i64 0, !"_ZTSFvPvu3i32S0_S0_E.normalized.generalized"}
+// CHECK: [[META57]] = !DILocation(line: 0, scope: [[DBG44]])
+// CHECK: [[DBG58]] = !DILocation(line: 0, scope: [[META22]], inlinedAt: 
[[DBG59]])
+// CHECK: [[DBG59]] = !DILocation(line: 64, column: 5, scope: [[DBG44]])
+// CHECK: [[DBG60]] = !DILocation(line: 65, column: 1, scope: [[DBG44]])
 //.

>From 06b83ab96eb4178a14ea0d9ccca1da9dd9453d41 Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurs...@google.com>
Date: Tue, 13 May 2025 23:15:48 +0000
Subject: [PATCH 2/9] Undo whitespace change

---
 clang/lib/CodeGen/ItaniumCXXABI.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/CodeGen/ItaniumCXXABI.cpp 
b/clang/lib/CodeGen/ItaniumCXXABI.cpp
index db5ef54f0d2f7..faa07024a6052 100644
--- a/clang/lib/CodeGen/ItaniumCXXABI.cpp
+++ b/clang/lib/CodeGen/ItaniumCXXABI.cpp
@@ -795,9 +795,9 @@ CGCallee ItaniumCXXABI::EmitLoadOfMemberFunctionPointer(
   // In the non-virtual path, the function pointer is actually a
   // function pointer.
   CGF.EmitBlock(FnNonVirtual);
-
   llvm::Value *NonVirtualFn =
       Builder.CreateIntToPtr(FnAsInt, CGF.UnqualPtrTy, "memptr.nonvirtualfn");
+
   // Check the function pointer if CFI on member function pointers is enabled.
   if (ShouldEmitCFICheck) {
     CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();

>From eafdee73c8d6fa74a4606ab87f897c5179447eb4 Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurs...@google.com>
Date: Tue, 13 May 2025 23:43:38 +0000
Subject: [PATCH 3/9] Sanitize labels

---
 clang/lib/CodeGen/CGExpr.cpp                        |  7 ++++++-
 clang/test/CodeGen/bounds-checking-debuginfo.c      | 12 ++++++------
 clang/test/CodeGen/cfi-check-fail-debuginfo.c       |  2 +-
 clang/test/CodeGen/cfi-icall-generalize-debuginfo.c |  4 ++--
 clang/test/CodeGen/cfi-icall-normalize2-debuginfo.c |  2 +-
 5 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index f270d74195d9d..655b1e03e128c 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -1219,7 +1219,7 @@ void CodeGenFunction::EmitBoundsCheck(const Expr *E, 
const Expr *Base,
 
 llvm::DILocation *CodeGenFunction::SanitizerAnnotateDebugInfo(
     SanitizerKind::SanitizerOrdinal CheckKindOrdinal) {
-  StringRef Label;
+  std::string Label;
   switch (CheckKindOrdinal) {
 #define SANITIZER(NAME, ID)                                                    
\
   case SanitizerKind::SO_##ID:                                                 
\
@@ -1230,6 +1230,11 @@ llvm::DILocation 
*CodeGenFunction::SanitizerAnnotateDebugInfo(
     llvm_unreachable("unexpected sanitizer kind");
   }
 
+  // Sanitize label
+  for (unsigned int i = 0; i < Label.length(); i++)
+    if (!std::isalpha(Label[i]))
+      Label[i] = '_';
+
   llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation();
   // TODO: deprecate ClArrayBoundsPseudoFn
   if (((ClArrayBoundsPseudoFn &&
diff --git a/clang/test/CodeGen/bounds-checking-debuginfo.c 
b/clang/test/CodeGen/bounds-checking-debuginfo.c
index 1549b02938697..43762eed9e2fe 100644
--- a/clang/test/CodeGen/bounds-checking-debuginfo.c
+++ b/clang/test/CodeGen/bounds-checking-debuginfo.c
@@ -68,9 +68,9 @@ double f1(int b, int i) {
 
 //.
 // CHECK-TRAP: [[META0:![0-9]+]] = distinct !DICompileUnit(language: 
DW_LANG_C11, file: [[META1:![0-9]+]], isOptimized: false, runtimeVersion: 0, 
emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
-// CHECK-TRAP: [[META1]] = !DIFile(filename: "<stdin>", directory: {{.*}})
+// CHECK-TRAP: [[META1]] = !DIFile(filename: "{{.*}}<stdin>", directory: 
{{.*}})
 // CHECK-TRAP: [[DBG4]] = distinct !DISubprogram(name: "f1", scope: 
[[META5:![0-9]+]], file: [[META5]], line: 63, type: [[META6:![0-9]+]], 
scopeLine: 63, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: 
[[META0]], retainedNodes: [[META10]])
-// CHECK-TRAP: [[META5]] = !DIFile(filename: "bounds-checking-debuginfo.c", 
directory: {{.*}})
+// CHECK-TRAP: [[META5]] = !DIFile(filename: 
"{{.*}}bounds-checking-debuginfo.c", directory: {{.*}})
 // CHECK-TRAP: [[META6]] = !DISubroutineType(types: [[META7:![0-9]+]])
 // CHECK-TRAP: [[META7]] = !{[[META8:![0-9]+]], [[META9:![0-9]+]], [[META9]]}
 // CHECK-TRAP: [[META8]] = !DIBasicType(name: "double", size: 64, encoding: 
DW_ATE_float)
@@ -89,16 +89,16 @@ double f1(int b, int i) {
 // CHECK-TRAP: [[DBG21]] = !DILocation(line: 65, column: 3, scope: [[DBG4]])
 // CHECK-TRAP: [[DBG22]] = !DILocation(line: 66, column: 12, scope: [[DBG4]])
 // CHECK-TRAP: [[DBG23]] = !DILocation(line: 0, scope: [[META24:![0-9]+]], 
inlinedAt: [[DBG26]])
-// CHECK-TRAP: [[META24]] = distinct !DISubprogram(name: 
"__ubsan_check_array-bounds", scope: [[META5]], file: [[META5]], type: 
[[META25:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: 
[[META0]])
+// CHECK-TRAP: [[META24]] = distinct !DISubprogram(name: 
"__ubsan_check_array_bounds", scope: [[META5]], file: [[META5]], type: 
[[META25:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: 
[[META0]])
 // CHECK-TRAP: [[META25]] = !DISubroutineType(types: null)
 // CHECK-TRAP: [[DBG26]] = !DILocation(line: 66, column: 10, scope: [[DBG4]])
 // CHECK-TRAP: [[PROF27]] = !{!"branch_weights", i32 1048575, i32 1}
 // CHECK-TRAP: [[DBG28]] = !DILocation(line: 66, column: 3, scope: [[DBG4]])
 //.
 // CHECK-NOTRAP: [[META0:![0-9]+]] = distinct !DICompileUnit(language: 
DW_LANG_C11, file: [[META1:![0-9]+]], isOptimized: false, runtimeVersion: 0, 
emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
-// CHECK-NOTRAP: [[META1]] = !DIFile(filename: "<stdin>", directory: {{.*}})
+// CHECK-NOTRAP: [[META1]] = !DIFile(filename: "{{.*}}<stdin>", directory: 
{{.*}})
 // CHECK-NOTRAP: [[DBG4]] = distinct !DISubprogram(name: "f1", scope: 
[[META5:![0-9]+]], file: [[META5]], line: 63, type: [[META6:![0-9]+]], 
scopeLine: 63, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: 
[[META0]], retainedNodes: [[META10]])
-// CHECK-NOTRAP: [[META5]] = !DIFile(filename: "bounds-checking-debuginfo.c", 
directory: {{.*}})
+// CHECK-NOTRAP: [[META5]] = !DIFile(filename: 
"{{.*}}bounds-checking-debuginfo.c", directory: {{.*}})
 // CHECK-NOTRAP: [[META6]] = !DISubroutineType(types: [[META7:![0-9]+]])
 // CHECK-NOTRAP: [[META7]] = !{[[META8:![0-9]+]], [[META9:![0-9]+]], [[META9]]}
 // CHECK-NOTRAP: [[META8]] = !DIBasicType(name: "double", size: 64, encoding: 
DW_ATE_float)
@@ -117,7 +117,7 @@ double f1(int b, int i) {
 // CHECK-NOTRAP: [[DBG21]] = !DILocation(line: 65, column: 3, scope: [[DBG4]])
 // CHECK-NOTRAP: [[DBG22]] = !DILocation(line: 66, column: 12, scope: [[DBG4]])
 // CHECK-NOTRAP: [[DBG23]] = !DILocation(line: 0, scope: [[META24:![0-9]+]], 
inlinedAt: [[DBG26]])
-// CHECK-NOTRAP: [[META24]] = distinct !DISubprogram(name: 
"__ubsan_check_array-bounds", scope: [[META5]], file: [[META5]], type: 
[[META25:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: 
[[META0]])
+// CHECK-NOTRAP: [[META24]] = distinct !DISubprogram(name: 
"__ubsan_check_array_bounds", scope: [[META5]], file: [[META5]], type: 
[[META25:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: 
[[META0]])
 // CHECK-NOTRAP: [[META25]] = !DISubroutineType(types: null)
 // CHECK-NOTRAP: [[DBG26]] = !DILocation(line: 66, column: 10, scope: [[DBG4]])
 // CHECK-NOTRAP: [[PROF27]] = !{!"branch_weights", i32 1048575, i32 1}
diff --git a/clang/test/CodeGen/cfi-check-fail-debuginfo.c 
b/clang/test/CodeGen/cfi-check-fail-debuginfo.c
index 7100a42fef886..74ed5564ec704 100644
--- a/clang/test/CodeGen/cfi-check-fail-debuginfo.c
+++ b/clang/test/CodeGen/cfi-check-fail-debuginfo.c
@@ -39,7 +39,7 @@ void caller(void (*f)(void)) {
 // CHECK: [[META18]] = !{i64 0, i64 2451761621477796417}
 // CHECK: [[META19]] = !DILocation(line: 0, scope: [[DBG7]])
 // CHECK: [[DBG20]] = !DILocation(line: 0, scope: [[META21:![0-9]+]], 
inlinedAt: [[DBG23]])
-// CHECK: [[META21]] = distinct !DISubprogram(name: "__ubsan_check_cfi-icall", 
scope: [[META8]], file: [[META8]], type: [[META22:![0-9]+]], flags: 
DIFlagArtificial, spFlags: DISPFlagDefinition, unit: [[META0]])
+// CHECK: [[META21]] = distinct !DISubprogram(name: "__ubsan_check_cfi_icall", 
scope: [[META8]], file: [[META8]], type: [[META22:![0-9]+]], flags: 
DIFlagArtificial, spFlags: DISPFlagDefinition, unit: [[META0]])
 // CHECK: [[META22]] = !DISubroutineType(types: null)
 // CHECK: [[DBG23]] = !DILocation(line: 23, column: 3, scope: [[DBG7]])
 // CHECK: [[META24]] = !{}
diff --git a/clang/test/CodeGen/cfi-icall-generalize-debuginfo.c 
b/clang/test/CodeGen/cfi-icall-generalize-debuginfo.c
index e47f058e2c633..304b60539c3d1 100644
--- a/clang/test/CodeGen/cfi-icall-generalize-debuginfo.c
+++ b/clang/test/CodeGen/cfi-icall-generalize-debuginfo.c
@@ -85,7 +85,7 @@ void g(int** (*fp)(const char *, const char **)) {
 // UNGENERALIZED: [[META32]] = !{i64 0, !"_ZTSFvPvE.generalized"}
 // UNGENERALIZED: [[META33]] = !DILocation(line: 0, scope: [[DBG25]])
 // UNGENERALIZED: [[DBG34]] = !DILocation(line: 0, scope: [[META35:![0-9]+]], 
inlinedAt: [[DBG37]])
-// UNGENERALIZED: [[META35]] = distinct !DISubprogram(name: 
"__ubsan_check_cfi-icall", scope: [[META11]], file: [[META11]], type: 
[[META36:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: 
[[META0]])
+// UNGENERALIZED: [[META35]] = distinct !DISubprogram(name: 
"__ubsan_check_cfi_icall", scope: [[META11]], file: [[META11]], type: 
[[META36:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: 
[[META0]])
 // UNGENERALIZED: [[META36]] = !DISubroutineType(types: null)
 // UNGENERALIZED: [[DBG37]] = !DILocation(line: 53, column: 3, scope: 
[[DBG25]])
 // UNGENERALIZED: [[META38]] = !{}
@@ -123,7 +123,7 @@ void g(int** (*fp)(const char *, const char **)) {
 // GENERALIZED: [[META32]] = !{i64 0, !"_ZTSFvPvE.generalized"}
 // GENERALIZED: [[META33]] = !DILocation(line: 0, scope: [[DBG25]])
 // GENERALIZED: [[DBG34]] = !DILocation(line: 0, scope: [[META35:![0-9]+]], 
inlinedAt: [[DBG37]])
-// GENERALIZED: [[META35]] = distinct !DISubprogram(name: 
"__ubsan_check_cfi-icall", scope: [[META11]], file: [[META11]], type: 
[[META36:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: 
[[META0]])
+// GENERALIZED: [[META35]] = distinct !DISubprogram(name: 
"__ubsan_check_cfi_icall", scope: [[META11]], file: [[META11]], type: 
[[META36:![0-9]+]], flags: DIFlagArtificial, spFlags: DISPFlagDefinition, unit: 
[[META0]])
 // GENERALIZED: [[META36]] = !DISubroutineType(types: null)
 // GENERALIZED: [[DBG37]] = !DILocation(line: 53, column: 3, scope: [[DBG25]])
 // GENERALIZED: [[META38]] = !{}
diff --git a/clang/test/CodeGen/cfi-icall-normalize2-debuginfo.c 
b/clang/test/CodeGen/cfi-icall-normalize2-debuginfo.c
index 2c1574b646087..a2f6ee0c6805c 100644
--- a/clang/test/CodeGen/cfi-icall-normalize2-debuginfo.c
+++ b/clang/test/CodeGen/cfi-icall-normalize2-debuginfo.c
@@ -82,7 +82,7 @@ void baz(void (*fn)(int, int, int), int arg1, int arg2, int 
arg3) {
 // CHECK: [[META19]] = !{i64 0, !"_ZTSFvPvu3i32E.normalized.generalized"}
 // CHECK: [[META20]] = !DILocation(line: 0, scope: [[DBG7]])
 // CHECK: [[DBG21]] = !DILocation(line: 0, scope: [[META22:![0-9]+]], 
inlinedAt: [[DBG24]])
-// CHECK: [[META22]] = distinct !DISubprogram(name: "__ubsan_check_cfi-icall", 
scope: [[META8]], file: [[META8]], type: [[META23:![0-9]+]], flags: 
DIFlagArtificial, spFlags: DISPFlagDefinition, unit: [[META0]])
+// CHECK: [[META22]] = distinct !DISubprogram(name: "__ubsan_check_cfi_icall", 
scope: [[META8]], file: [[META8]], type: [[META23:![0-9]+]], flags: 
DIFlagArtificial, spFlags: DISPFlagDefinition, unit: [[META0]])
 // CHECK: [[META23]] = !DISubroutineType(types: null)
 // CHECK: [[DBG24]] = !DILocation(line: 25, column: 5, scope: [[DBG7]])
 // CHECK: [[META25]] = !{}

>From 1dd9d38f93c5cc40f6c6c2433b04f5359be3da7f Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurs...@google.com>
Date: Tue, 13 May 2025 23:53:19 +0000
Subject: [PATCH 4/9] static std::pair<SanitizerKind::SanitizerOrdinal,
 llvm::SanitizerStatKind> ParseCFITypeCheckKind(CFITypeCheckKind TCK);

---
 clang/lib/CodeGen/CGClass.cpp       | 23 +++++++++++------------
 clang/lib/CodeGen/CodeGenFunction.h |  5 ++---
 2 files changed, 13 insertions(+), 15 deletions(-)

diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp
index 232965f8f0a84..5a243216ccd11 100644
--- a/clang/lib/CodeGen/CGClass.cpp
+++ b/clang/lib/CodeGen/CGClass.cpp
@@ -2779,9 +2779,11 @@ void CodeGenFunction::EmitTypeMetadataCodeForVCall(const 
CXXRecordDecl *RD,
   }
 }
 
-void CodeGenFunction::ParseCFITypeCheckKind(CFITypeCheckKind TCK,
-                                            SanitizerKind::SanitizerOrdinal &M,
-                                            llvm::SanitizerStatKind &SSK) {
+std::pair<SanitizerKind::SanitizerOrdinal, llvm::SanitizerStatKind>
+CodeGenFunction::ParseCFITypeCheckKind(CFITypeCheckKind TCK) {
+  SanitizerKind::SanitizerOrdinal M;
+  llvm::SanitizerStatKind SSK;
+
   switch (TCK) {
   case CFITCK_VCall:
     M = SanitizerKind::SO_CFIVCall;
@@ -2807,6 +2809,8 @@ void 
CodeGenFunction::ParseCFITypeCheckKind(CFITypeCheckKind TCK,
   case CFITCK_VMFCall:
     llvm_unreachable("unexpected sanitizer kind");
   }
+
+  return std::make_pair(M, SSK);
 }
 
 void CodeGenFunction::EmitVTablePtrCheckForCall(const CXXRecordDecl *RD,
@@ -2816,10 +2820,9 @@ void CodeGenFunction::EmitVTablePtrCheckForCall(const 
CXXRecordDecl *RD,
   if (!SanOpts.has(SanitizerKind::CFICastStrict))
     RD = LeastDerivedClassWithSameLayout(RD);
 
-  SanitizerKind::SanitizerOrdinal Ordinal;
-  llvm::SanitizerStatKind SSK;
-  ParseCFITypeCheckKind(TCK, Ordinal, SSK);
+  auto [Ordinal, SSK] = ParseCFITypeCheckKind(TCK);
   ApplyDebugLocation ApplyTrapDI(*this, SanitizerAnnotateDebugInfo(Ordinal));
+
   EmitVTablePtrCheck(RD, VTable, TCK, Loc);
 }
 
@@ -2842,9 +2845,7 @@ void CodeGenFunction::EmitVTablePtrCheckForCast(QualType 
T, Address Derived,
   if (!SanOpts.has(SanitizerKind::CFICastStrict))
     ClassDecl = LeastDerivedClassWithSameLayout(ClassDecl);
 
-  SanitizerKind::SanitizerOrdinal Ordinal;
-  llvm::SanitizerStatKind SSK;
-  ParseCFITypeCheckKind(TCK, Ordinal, SSK);
+  auto [Ordinal, SSK] = ParseCFITypeCheckKind(TCK);
   ApplyDebugLocation ApplyTrapDI(*this, SanitizerAnnotateDebugInfo(Ordinal));
 
   llvm::BasicBlock *ContBlock = nullptr;
@@ -2881,9 +2882,7 @@ void CodeGenFunction::EmitVTablePtrCheck(const 
CXXRecordDecl *RD,
       !CGM.HasHiddenLTOVisibility(RD))
     return;
 
-  SanitizerKind::SanitizerOrdinal M;
-  llvm::SanitizerStatKind SSK;
-  ParseCFITypeCheckKind(TCK, M, SSK);
+  auto [M, SSK] = ParseCFITypeCheckKind(TCK);
   switch (TCK) {
   case CFITCK_VCall:
   case CFITCK_NVCall:
diff --git a/clang/lib/CodeGen/CodeGenFunction.h 
b/clang/lib/CodeGen/CodeGenFunction.h
index e0c65b218ce03..8bdeac9d87155 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -3365,9 +3365,8 @@ class CodeGenFunction : public CodeGenTypeCache {
 
   /// Converts the CFITypeCheckKind into SanitizerKind::SanitizerOrdinal and
   /// llvm::SanitizerStatKind.
-  void ParseCFITypeCheckKind(CFITypeCheckKind TCK,
-                             SanitizerKind::SanitizerOrdinal &M,
-                             llvm::SanitizerStatKind &SSK);
+  static std::pair<SanitizerKind::SanitizerOrdinal, llvm::SanitizerStatKind>
+  ParseCFITypeCheckKind(CFITypeCheckKind TCK);
 
   /// Emit a check that \p Base points into an array object, which
   /// we can access at index \p Index. \p Accessed should be \c false if we

>From 01a46bd9a17b3f9177b109dab5c001fd65cd6c2d Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurs...@google.com>
Date: Wed, 14 May 2025 16:29:08 +0000
Subject: [PATCH 5/9] Revert clang/test/CodeGen/bounds-checking-debuginfo.c

---
 clang/test/CodeGen/bounds-checking-debuginfo.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/clang/test/CodeGen/bounds-checking-debuginfo.c 
b/clang/test/CodeGen/bounds-checking-debuginfo.c
index 43762eed9e2fe..74c06665dfe02 100644
--- a/clang/test/CodeGen/bounds-checking-debuginfo.c
+++ b/clang/test/CodeGen/bounds-checking-debuginfo.c
@@ -68,9 +68,9 @@ double f1(int b, int i) {
 
 //.
 // CHECK-TRAP: [[META0:![0-9]+]] = distinct !DICompileUnit(language: 
DW_LANG_C11, file: [[META1:![0-9]+]], isOptimized: false, runtimeVersion: 0, 
emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
-// CHECK-TRAP: [[META1]] = !DIFile(filename: "{{.*}}<stdin>", directory: 
{{.*}})
+// CHECK-TRAP: [[META1]] = !DIFile(filename: "<stdin>", directory: {{.*}})
 // CHECK-TRAP: [[DBG4]] = distinct !DISubprogram(name: "f1", scope: 
[[META5:![0-9]+]], file: [[META5]], line: 63, type: [[META6:![0-9]+]], 
scopeLine: 63, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: 
[[META0]], retainedNodes: [[META10]])
-// CHECK-TRAP: [[META5]] = !DIFile(filename: 
"{{.*}}bounds-checking-debuginfo.c", directory: {{.*}})
+// CHECK-TRAP: [[META5]] = !DIFile(filename: "bounds-checking-debuginfo.c", 
directory: {{.*}})
 // CHECK-TRAP: [[META6]] = !DISubroutineType(types: [[META7:![0-9]+]])
 // CHECK-TRAP: [[META7]] = !{[[META8:![0-9]+]], [[META9:![0-9]+]], [[META9]]}
 // CHECK-TRAP: [[META8]] = !DIBasicType(name: "double", size: 64, encoding: 
DW_ATE_float)
@@ -96,9 +96,9 @@ double f1(int b, int i) {
 // CHECK-TRAP: [[DBG28]] = !DILocation(line: 66, column: 3, scope: [[DBG4]])
 //.
 // CHECK-NOTRAP: [[META0:![0-9]+]] = distinct !DICompileUnit(language: 
DW_LANG_C11, file: [[META1:![0-9]+]], isOptimized: false, runtimeVersion: 0, 
emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
-// CHECK-NOTRAP: [[META1]] = !DIFile(filename: "{{.*}}<stdin>", directory: 
{{.*}})
+// CHECK-NOTRAP: [[META1]] = !DIFile(filename: "<stdin>", directory: {{.*}})
 // CHECK-NOTRAP: [[DBG4]] = distinct !DISubprogram(name: "f1", scope: 
[[META5:![0-9]+]], file: [[META5]], line: 63, type: [[META6:![0-9]+]], 
scopeLine: 63, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: 
[[META0]], retainedNodes: [[META10]])
-// CHECK-NOTRAP: [[META5]] = !DIFile(filename: 
"{{.*}}bounds-checking-debuginfo.c", directory: {{.*}})
+// CHECK-NOTRAP: [[META5]] = !DIFile(filename: "bounds-checking-debuginfo.c", 
directory: {{.*}})
 // CHECK-NOTRAP: [[META6]] = !DISubroutineType(types: [[META7:![0-9]+]])
 // CHECK-NOTRAP: [[META7]] = !{[[META8:![0-9]+]], [[META9:![0-9]+]], [[META9]]}
 // CHECK-NOTRAP: [[META8]] = !DIBasicType(name: "double", size: 64, encoding: 
DW_ATE_float)

>From ec3589e0b4113945855abdbfd7ded3799362fb61 Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurs...@google.com>
Date: Wed, 14 May 2025 16:50:22 +0000
Subject: [PATCH 6/9] Fix grammar

---
 clang/lib/CodeGen/CGExpr.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index 655b1e03e128c..1cdff052b44d1 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -4000,7 +4000,7 @@ void CodeGenFunction::EmitCfiCheckFail() {
       IntPtrTy);
 
   // TODO: the instructions above are not annotated with debug info. It is
-  // inconvenient to do so because we hadn't determined the SanitizerKind yet.
+  // inconvenient to do so because we have not determined SanitizerKind yet.
   const std::pair<int, SanitizerKind::SanitizerOrdinal> CheckKinds[] = {
       {CFITCK_VCall, SanitizerKind::SO_CFIVCall},
       {CFITCK_NVCall, SanitizerKind::SO_CFINVCall},

>From 8bbc00fd3842d7a82ce04027531e02905792e896 Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurs...@google.com>
Date: Wed, 14 May 2025 16:54:14 +0000
Subject: [PATCH 7/9] Remove unnecessary braces

---
 clang/lib/CodeGen/CGExpr.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index 1cdff052b44d1..08aae4e3028ec 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -1240,9 +1240,9 @@ llvm::DILocation 
*CodeGenFunction::SanitizerAnnotateDebugInfo(
   if (((ClArrayBoundsPseudoFn &&
         CheckKindOrdinal == SanitizerKind::SO_ArrayBounds) ||
        CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo.has(CheckKindOrdinal)) &&
-      CheckDI) {
+      CheckDI)
     CheckDI = getDebugInfo()->CreateSyntheticInlineAt(CheckDI, Label);
-  }
+
   return CheckDI;
 }
 

>From 5093d817a9efa9d2901d4a631f7d1e3e397370b8 Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurs...@google.com>
Date: Thu, 15 May 2025 17:39:49 +0000
Subject: [PATCH 8/9] Make SanitizerAnnotateDebugInfo public and fix merge
 conflict

---
 clang/lib/CodeGen/CGExpr.cpp        | 29 -----------------------------
 clang/lib/CodeGen/CodeGenFunction.h | 15 +++++----------
 2 files changed, 5 insertions(+), 39 deletions(-)

diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index 08aae4e3028ec..82f1e7c8878a1 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -1217,35 +1217,6 @@ void CodeGenFunction::EmitBoundsCheck(const Expr *E, 
const Expr *Base,
   EmitBoundsCheckImpl(E, Bound, Index, IndexType, IndexedType, Accessed);
 }
 
-llvm::DILocation *CodeGenFunction::SanitizerAnnotateDebugInfo(
-    SanitizerKind::SanitizerOrdinal CheckKindOrdinal) {
-  std::string Label;
-  switch (CheckKindOrdinal) {
-#define SANITIZER(NAME, ID)                                                    
\
-  case SanitizerKind::SO_##ID:                                                 
\
-    Label = "__ubsan_check_" NAME;                                             
\
-    break;
-#include "clang/Basic/Sanitizers.def"
-  default:
-    llvm_unreachable("unexpected sanitizer kind");
-  }
-
-  // Sanitize label
-  for (unsigned int i = 0; i < Label.length(); i++)
-    if (!std::isalpha(Label[i]))
-      Label[i] = '_';
-
-  llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation();
-  // TODO: deprecate ClArrayBoundsPseudoFn
-  if (((ClArrayBoundsPseudoFn &&
-        CheckKindOrdinal == SanitizerKind::SO_ArrayBounds) ||
-       CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo.has(CheckKindOrdinal)) &&
-      CheckDI)
-    CheckDI = getDebugInfo()->CreateSyntheticInlineAt(CheckDI, Label);
-
-  return CheckDI;
-}
-
 void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound,
                                           llvm::Value *Index,
                                           QualType IndexType,
diff --git a/clang/lib/CodeGen/CodeGenFunction.h 
b/clang/lib/CodeGen/CodeGenFunction.h
index 8bdeac9d87155..398ae2abb258f 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -2816,11 +2816,6 @@ class CodeGenFunction : public CodeGenTypeCache {
   void emitStoresForInitAfterBZero(llvm::Constant *Init, Address Loc,
                                    bool isVolatile, bool IsAutoInit);
 
-  /// Returns debug info, with additional annotation if enabled by
-  /// CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo[CheckKindOrdinal].
-  llvm::DILocation *
-  SanitizerAnnotateDebugInfo(SanitizerKind::SanitizerOrdinal CheckKindOrdinal);
-
 public:
   // Captures all the allocas created during the scope of its RAII object.
   struct AllocaTrackerRAII {
@@ -3358,11 +3353,6 @@ class CodeGenFunction : public CodeGenTypeCache {
                      SanitizerSet SkippedChecks = SanitizerSet(),
                      llvm::Value *ArraySize = nullptr);
 
-  /// Returns debug info, with additional annotation if enabled by
-  /// CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo[CheckKindOrdinal].
-  llvm::DILocation *
-  SanitizerAnnotateDebugInfo(SanitizerKind::SanitizerOrdinal CheckKindOrdinal);
-
   /// Converts the CFITypeCheckKind into SanitizerKind::SanitizerOrdinal and
   /// llvm::SanitizerStatKind.
   static std::pair<SanitizerKind::SanitizerOrdinal, llvm::SanitizerStatKind>
@@ -3377,6 +3367,11 @@ class CodeGenFunction : public CodeGenTypeCache {
                            llvm::Value *Index, QualType IndexType,
                            QualType IndexedType, bool Accessed);
 
+  /// Returns debug info, with additional annotation if enabled by
+  /// CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo[CheckKindOrdinal].
+  llvm::DILocation *
+  SanitizerAnnotateDebugInfo(SanitizerKind::SanitizerOrdinal CheckKindOrdinal);
+
   llvm::Value *GetCountedByFieldExprGEP(const Expr *Base, const FieldDecl *FD,
                                         const FieldDecl *CountDecl);
 

>From e9c40b9ff66ea7476f2d750883df9c7c63b9fec6 Mon Sep 17 00:00:00 2001
From: Thurston Dang <thurs...@google.com>
Date: Thu, 15 May 2025 17:58:51 +0000
Subject: [PATCH 9/9] Simplify by removing CFITCK_ICall support from
 ParseCFITypeCheckKind

---
 clang/lib/CodeGen/CGClass.cpp | 15 ---------------
 1 file changed, 15 deletions(-)

diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp
index 5a243216ccd11..9815aa2b9e20f 100644
--- a/clang/lib/CodeGen/CGClass.cpp
+++ b/clang/lib/CodeGen/CGClass.cpp
@@ -2802,9 +2802,6 @@ CodeGenFunction::ParseCFITypeCheckKind(CFITypeCheckKind 
TCK) {
     SSK = llvm::SanStat_CFI_UnrelatedCast;
     break;
   case CFITCK_ICall:
-    M = SanitizerKind::SO_CFIICall;
-    SSK = llvm::SanStat_CFI_ICall;
-    break;
   case CFITCK_NVMFCall:
   case CFITCK_VMFCall:
     llvm_unreachable("unexpected sanitizer kind");
@@ -2883,18 +2880,6 @@ void CodeGenFunction::EmitVTablePtrCheck(const 
CXXRecordDecl *RD,
     return;
 
   auto [M, SSK] = ParseCFITypeCheckKind(TCK);
-  switch (TCK) {
-  case CFITCK_VCall:
-  case CFITCK_NVCall:
-  case CFITCK_DerivedCast:
-  case CFITCK_UnrelatedCast:
-    break;
-  case CFITCK_ICall:
-  case CFITCK_NVMFCall:
-  case CFITCK_VMFCall:
-    llvm_unreachable("unexpected sanitizer kind");
-  }
-
   std::string TypeName = RD->getQualifiedNameAsString();
   if (getContext().getNoSanitizeList().containsType(
           SanitizerMask::bitPosToMask(M), TypeName))

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to