[llvm] [DebugInfo] Add support for emitting DW_AT_defaulted (PR #213187)

via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 30 18:14:27 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-debuginfo

Author: Alex Langford (bulbazord)

<details>
<summary>Changes</summary>

DW_AT_defaulted (as defined in DWARFv5 5.7.8) is a DWARF 5 attribute denoting whether a C++ special member function has been declared default, and if so, how the function is defaulted.

This commit aims to add the relevant support to DISubprogram to describe a function as defaulted and to DwarfUnit to emit the DWARF attribute. I will add support to clang in a subsequent change.

---

Patch is 53.11 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/213187.diff


6 Files Affected:

- (modified) llvm/include/llvm/IR/DebugInfoFlags.def (+4-3) 
- (modified) llvm/include/llvm/IR/DebugInfoMetadata.h (+9-4) 
- (modified) llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp (+33) 
- (modified) llvm/lib/IR/DebugInfoMetadata.cpp (+4-2) 
- (added) llvm/test/DebugInfo/X86/DW_AT_defaulted.ll (+730) 
- (modified) llvm/unittests/IR/MetadataTest.cpp (+3-1) 


``````````diff
diff --git a/llvm/include/llvm/IR/DebugInfoFlags.def b/llvm/include/llvm/IR/DebugInfoFlags.def
index 44946b1fb83b7..fcadb005e88bd 100644
--- a/llvm/include/llvm/IR/DebugInfoFlags.def
+++ b/llvm/include/llvm/IR/DebugInfoFlags.def
@@ -88,15 +88,16 @@ HANDLE_DISP_FLAG((1u << 5), Pure)
 HANDLE_DISP_FLAG((1u << 6), Elemental)
 HANDLE_DISP_FLAG((1u << 7), Recursive)
 HANDLE_DISP_FLAG((1u << 8), MainSubprogram)
-// May also utilize this Flag in future, when adding support
-// for defaulted functions
 HANDLE_DISP_FLAG((1u << 9), Deleted)
+HANDLE_DISP_FLAG((1u << 10), DefaultedNo)
 HANDLE_DISP_FLAG((1u << 11), ObjCDirect)
+HANDLE_DISP_FLAG((1u << 12), DefaultedInClass)
+HANDLE_DISP_FLAG((1u << 13), DefaultedOutOfClass)
 
 #ifdef DISP_FLAG_LARGEST_NEEDED
 // Intended to be used with ADT/BitmaskEnum.h.
 // NOTE: Always must be equal to largest flag, check this when adding new flags.
-HANDLE_DISP_FLAG((1 << 11), Largest)
+HANDLE_DISP_FLAG((1 << 13), Largest)
 #undef DISP_FLAG_LARGEST_NEEDED
 #endif
 
diff --git a/llvm/include/llvm/IR/DebugInfoMetadata.h b/llvm/include/llvm/IR/DebugInfoMetadata.h
index 846342bee6071..6fbdbe65a34d8 100644
--- a/llvm/include/llvm/IR/DebugInfoMetadata.h
+++ b/llvm/include/llvm/IR/DebugInfoMetadata.h
@@ -2303,6 +2303,9 @@ class DISubprogram : public DILocalScope {
 #include "llvm/IR/DebugInfoFlags.def"
     SPFlagNonvirtual = SPFlagZero,
     SPFlagVirtuality = SPFlagVirtual | SPFlagPureVirtual,
+    SPFlagDefaultedUnspecified = SPFlagZero,
+    SPFlagDefaulted =
+        SPFlagDefaultedNo | SPFlagDefaultedInClass | SPFlagDefaultedOutOfClass,
     LLVM_MARK_AS_BITMASK_ENUM(SPFlagLargest)
   };
 
@@ -2317,10 +2320,11 @@ class DISubprogram : public DILocalScope {
                                        SmallVectorImpl<DISPFlags> &SplitFlags);
 
   // Helper for converting old bitfields to new flags word.
-  LLVM_ABI static DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition,
-                                      bool IsOptimized,
-                                      unsigned Virtuality = SPFlagNonvirtual,
-                                      bool IsMainSubprogram = false);
+  LLVM_ABI static DISPFlags
+  toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized,
+            unsigned Virtuality = SPFlagNonvirtual,
+            unsigned Defaulted = SPFlagDefaultedUnspecified,
+            bool IsMainSubprogram = false);
 
 private:
   DIFlags Flags;
@@ -2417,6 +2421,7 @@ class DISubprogram : public DILocalScope {
 public:
   unsigned getLine() const { return Line; }
   unsigned getVirtuality() const { return getSPFlags() & SPFlagVirtuality; }
+  unsigned getDefaulted() const { return getSPFlags() & SPFlagDefaulted; }
   unsigned getVirtualIndex() const { return VirtualIndex; }
   int getThisAdjustment() const { return ThisAdjustment; }
   unsigned getScopeLine() const { return ScopeLine; }
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
index 78c0769e49161..e7874bc22429f 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp
@@ -1430,6 +1430,26 @@ bool DwarfUnit::applySubprogramDefinitionAttributes(const DISubprogram *SP,
 
       if (SP->getLine() != SPDecl->getLine())
         addUInt(SPDie, dwarf::DW_AT_decl_line, std::nullopt, SP->getLine());
+
+      unsigned DefDefaulted = SP->getDefaulted();
+      if (DD->getDwarfVersion() >= 5 && DefDefaulted) {
+        unsigned DeclDefaulted = SPDecl->getDefaulted();
+        assert(DeclDefaulted ==
+                   DISubprogram::DISPFlags::SPFlagDefaultedUnspecified ||
+               DeclDefaulted == DefDefaulted &&
+                   "Declaration DISP and Definition DISP disagree on the "
+                   "defaulted state of this subprogram!");
+        if (DefDefaulted & DISubprogram::DISPFlags::SPFlagDefaultedNo)
+          addUInt(SPDie, dwarf::DW_AT_defaulted, dwarf::DW_FORM_data1,
+                  dwarf::DW_DEFAULTED_no);
+        else if (DefDefaulted & DISubprogram::DISPFlags::SPFlagDefaultedInClass)
+          addUInt(SPDie, dwarf::DW_AT_defaulted, dwarf::DW_FORM_data1,
+                  dwarf::DW_DEFAULTED_in_class);
+        else if (DefDefaulted &
+                 DISubprogram::DISPFlags::SPFlagDefaultedOutOfClass)
+          addUInt(SPDie, dwarf::DW_AT_defaulted, dwarf::DW_FORM_data1,
+                  dwarf::DW_DEFAULTED_out_of_class);
+      }
     }
   }
 
@@ -1513,6 +1533,19 @@ void DwarfUnit::applySubprogramAttributes(const DISubprogram *SP, DIE &SPDie,
     ContainingTypeMap.insert(std::make_pair(&SPDie, SP->getContainingType()));
   }
 
+  unsigned Defaulted = SP->getDefaulted();
+  if (DD->getDwarfVersion() >= 5 && Defaulted) {
+    if (Defaulted & DISubprogram::DISPFlags::SPFlagDefaultedNo)
+      addUInt(SPDie, dwarf::DW_AT_defaulted, dwarf::DW_FORM_data1,
+              dwarf::DW_DEFAULTED_no);
+    else if (Defaulted & DISubprogram::DISPFlags::SPFlagDefaultedInClass)
+      addUInt(SPDie, dwarf::DW_AT_defaulted, dwarf::DW_FORM_data1,
+              dwarf::DW_DEFAULTED_in_class);
+    else if (Defaulted & DISubprogram::DISPFlags::SPFlagDefaultedOutOfClass)
+      addUInt(SPDie, dwarf::DW_AT_defaulted, dwarf::DW_FORM_data1,
+              dwarf::DW_DEFAULTED_out_of_class);
+  }
+
   if (!SP->isDefinition()) {
     addFlag(SPDie, dwarf::DW_AT_declaration);
 
diff --git a/llvm/lib/IR/DebugInfoMetadata.cpp b/llvm/lib/IR/DebugInfoMetadata.cpp
index 88f7f2f6240e0..e780c511be341 100644
--- a/llvm/lib/IR/DebugInfoMetadata.cpp
+++ b/llvm/lib/IR/DebugInfoMetadata.cpp
@@ -1314,14 +1314,15 @@ DISubprogram::DISubprogram(LLVMContext &C, StorageType Storage, unsigned Line,
 }
 DISubprogram::DISPFlags
 DISubprogram::toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized,
-                        unsigned Virtuality, bool IsMainSubprogram) {
+                        unsigned Virtuality, unsigned Defaulted,
+                        bool IsMainSubprogram) {
   // We're assuming virtuality is the low-order field.
   static_assert(int(SPFlagVirtual) == int(dwarf::DW_VIRTUALITY_virtual) &&
                     int(SPFlagPureVirtual) ==
                         int(dwarf::DW_VIRTUALITY_pure_virtual),
                 "Virtuality constant mismatch");
   return static_cast<DISPFlags>(
-      (Virtuality & SPFlagVirtuality) |
+      (Virtuality & SPFlagVirtuality) | (Defaulted & SPFlagDefaulted) |
       (IsLocalToUnit ? SPFlagLocalToUnit : SPFlagZero) |
       (IsDefinition ? SPFlagDefinition : SPFlagZero) |
       (IsOptimized ? SPFlagOptimized : SPFlagZero) |
@@ -1378,6 +1379,7 @@ StringRef DISubprogram::getFlagString(DISPFlags Flag) {
   switch (Flag) {
   // Appease a warning.
   case SPFlagVirtuality:
+  case SPFlagDefaulted:
     return "";
 #define HANDLE_DISP_FLAG(ID, NAME)                                             \
   case SPFlag##NAME:                                                           \
diff --git a/llvm/test/DebugInfo/X86/DW_AT_defaulted.ll b/llvm/test/DebugInfo/X86/DW_AT_defaulted.ll
new file mode 100644
index 0000000000000..a9829b42b8f23
--- /dev/null
+++ b/llvm/test/DebugInfo/X86/DW_AT_defaulted.ll
@@ -0,0 +1,730 @@
+; RUN: llc < %s -filetype=obj -o %t
+; RUN: llvm-dwarfdump -v %t | FileCheck %s
+
+; C++ source to regenerate:
+; class DefaultedInline {
+; public:
+;   DefaultedInline() = default;
+;   ~DefaultedInline() = default;
+;
+;   DefaultedInline(const DefaultedInline &) = default;
+;   DefaultedInline &operator=(const DefaultedInline &) = default;
+;
+;   DefaultedInline(DefaultedInline &&) = default;
+;   DefaultedInline &operator=(DefaultedInline &&) = default;
+; };
+;
+; class DefaultedOutline {
+; public:
+;   DefaultedOutline();
+;   ~DefaultedOutline();
+;
+;   DefaultedOutline(const DefaultedOutline &);
+;   DefaultedOutline &operator=(const DefaultedOutline &);
+;
+;   DefaultedOutline(DefaultedOutline &&);
+;   DefaultedOutline &operator=(DefaultedOutline &&);
+; };
+;
+; DefaultedOutline::DefaultedOutline() = default;
+; DefaultedOutline::~DefaultedOutline() = default;
+;
+; DefaultedOutline::DefaultedOutline(const DefaultedOutline &) = default;
+; DefaultedOutline &
+; DefaultedOutline::operator=(const DefaultedOutline &) = default;
+;
+; DefaultedOutline::DefaultedOutline(DefaultedOutline &&) = default;
+; DefaultedOutline &DefaultedOutline::operator=(DefaultedOutline &&) = default;
+;
+; class NeverDefaulted {
+; public:
+;   NeverDefaulted() {}
+;   ~NeverDefaulted() {}
+;
+;   NeverDefaulted(const NeverDefaulted &) {}
+;   NeverDefaulted &operator=(const NeverDefaulted &) { return *this; }
+;
+;   NeverDefaulted(NeverDefaulted &&) {}
+;   NeverDefaulted &operator=(NeverDefaulted &&) { return *this; }
+; };
+;
+; template <int N> class DefaultedInlineWithTemplate {
+; public:
+;   char m[N];
+;
+;   DefaultedInlineWithTemplate() = default;
+;   ~DefaultedInlineWithTemplate() = default;
+;
+;   DefaultedInlineWithTemplate(const DefaultedInlineWithTemplate &) = default;
+;   DefaultedInlineWithTemplate &
+;   operator=(const DefaultedInlineWithTemplate &) = default;
+;
+;   DefaultedInlineWithTemplate(DefaultedInlineWithTemplate &&) = default;
+;   DefaultedInlineWithTemplate &
+;   operator=(DefaultedInlineWithTemplate &&) = default;
+; };
+;
+; int main() {
+;   DefaultedInline a;
+;   DefaultedOutline b;
+;   NeverDefaulted c;
+;   DefaultedInlineWithTemplate<6> d;
+;   DefaultedInlineWithTemplate<7> e;
+;   return 0;
+; }
+; $ clang++ -O0 -g -gdwarf-5 debug-info-defaulted.cpp -S -emit-llvm
+
+; CHECK: .debug_abbrev contents:
+
+; CHECK: [11] DW_TAG_subprogram DW_CHILDREN_yes
+; CHECK: DW_AT_defaulted DW_FORM_data1
+
+; CHECK: [13] DW_TAG_subprogram DW_CHILDREN_yes
+; CHECK: DW_AT_defaulted DW_FORM_data1
+
+; CHECK: [14] DW_TAG_subprogram DW_CHILDREN_yes
+; CHECK: DW_AT_defaulted DW_FORM_data1
+
+; CHECK: [15] DW_TAG_subprogram DW_CHILDREN_yes
+; CHECK: DW_AT_defaulted DW_FORM_data1
+
+; CHECK: [17] DW_TAG_subprogram DW_CHILDREN_yes
+; CHECK: DW_AT_defaulted DW_FORM_data1
+
+; CHECK: [20] DW_TAG_subprogram DW_CHILDREN_yes
+; CHECK: DW_AT_defaulted DW_FORM_data1
+
+; CHECK: [21] DW_TAG_subprogram DW_CHILDREN_yes
+; CHECK: DW_AT_defaulted DW_FORM_data1
+
+; CHECK: [22] DW_TAG_subprogram DW_CHILDREN_yes
+; CHECK: DW_AT_defaulted DW_FORM_data1
+
+; CHECK: [23] DW_TAG_subprogram DW_CHILDREN_yes
+; CHECK: DW_AT_defaulted DW_FORM_data1
+
+; CHECK: [24] DW_TAG_subprogram DW_CHILDREN_yes
+; CHECK: DW_AT_defaulted DW_FORM_data1
+
+; CHECK: [25] DW_TAG_subprogram DW_CHILDREN_yes
+; CHECK: DW_AT_defaulted DW_FORM_data1
+
+; CHECK: .debug_info contents:
+
+; CHECK: DW_TAG_subprogram [11]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN16DefaultedOutlineC2Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_out_of_class)
+
+; CHECK: DW_TAG_subprogram [13]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN16DefaultedOutlineC1Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_out_of_class)
+
+; CHECK: DW_TAG_subprogram [14]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN16DefaultedOutlineD2Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_out_of_class)
+
+; CHECK: DW_TAG_subprogram [15]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN16DefaultedOutlineD1Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_out_of_class)
+
+; CHECK: DW_TAG_subprogram [11]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN16DefaultedOutlineC2ERKS_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_out_of_class)
+
+; CHECK: DW_TAG_subprogram [13]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN16DefaultedOutlineC1ERKS_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_out_of_class)
+
+; CHECK: DW_TAG_subprogram [17]
+; CHECK-DAG: DW_AT_specification {{.*}} "_ZN16DefaultedOutlineaSERKS_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_out_of_class)
+
+; CHECK: DW_TAG_subprogram [11]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN16DefaultedOutlineC2EOS_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_out_of_class)
+
+; CHECK: DW_TAG_subprogram [13]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN16DefaultedOutlineC1EOS_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_out_of_class)
+
+; CHECK: DW_TAG_subprogram [17]
+; CHECK-DAG: DW_AT_specification {{.*}} "_ZN16DefaultedOutlineaSEOS_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_out_of_class)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN14NeverDefaultedC4Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_no)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN14NeverDefaultedD4Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_no)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN14NeverDefaultedC4ERKS_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_no)
+
+; CHECK: DW_TAG_subprogram [21]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN14NeverDefaultedaSERKS_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_no)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN14NeverDefaultedC4EOS_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_no)
+
+; CHECK: DW_TAG_subprogram [21]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN14NeverDefaultedaSEOS_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_no)
+
+; CHECK: DW_TAG_subprogram [22]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN14NeverDefaultedC1Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_no)
+
+; CHECK: DW_TAG_subprogram [23]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN14NeverDefaultedD1Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_no)
+
+; CHECK: DW_TAG_subprogram [24]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN14NeverDefaultedC2Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_no)
+
+; CHECK: DW_TAG_subprogram [25]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN14NeverDefaultedD2Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_no)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN15DefaultedInlineC4Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN15DefaultedInlineD4Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN15DefaultedInlineC4ERKS_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [21]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN15DefaultedInlineaSERKS_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN15DefaultedInlineC4EOS_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [21]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN15DefaultedInlineaSEOS_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN27DefaultedInlineWithTemplateILi6EEC4Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN27DefaultedInlineWithTemplateILi6EED4Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN27DefaultedInlineWithTemplateILi6EEC4ERKS0_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [21]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN27DefaultedInlineWithTemplateILi6EEaSERKS0_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN27DefaultedInlineWithTemplateILi6EEC4EOS0_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [21]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN27DefaultedInlineWithTemplateILi6EEaSEOS0_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN27DefaultedInlineWithTemplateILi7EEC4Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN27DefaultedInlineWithTemplateILi7EED4Ev")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN27DefaultedInlineWithTemplateILi7EEC4ERKS0_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [21]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN27DefaultedInlineWithTemplateILi7EEaSERKS0_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [20]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN27DefaultedInlineWithTemplateILi7EEC4EOS0_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; CHECK: DW_TAG_subprogram [21]
+; CHECK-DAG: DW_AT_linkage_name {{.*}} "_ZN27DefaultedInlineWithTemplateILi7EEaSEOS0_")
+; CHECK-DAG: DW_AT_defaulted [DW_FORM_data1] (DW_DEFAULTED_in_class)
+
+; ModuleID = 'debug-info-defaulted.cpp'
+source_filename = "debug-info-defaulted.cpp"
+target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-n32:64-S128-Fn32"
+target triple = "arm64-apple-macosx26.0.0"
+
+%class.DefaultedInline = type { i8 }
+%class.DefaultedOutline = type { i8 }
+%class.NeverDefaulted = type { i8 }
+%class.DefaultedInlineWithTemplate = type { [6 x i8] }
+%class.DefaultedInlineWithTemplate.0 = type { [7 x i8] }
+
+; Function Attrs: mustprogress noinline nounwind optnone ssp uwtable(sync)
+define noundef ptr @_ZN16DefaultedOutlineC2Ev(ptr noundef nonnull returned align 1 dereferenceable(1) %this) unnamed_addr #0 !dbg !8 {
+entry:
+  %this.addr = alloca ptr, align 8
+  store ptr %this, ptr %this.addr, align 8
+    #dbg_declare(ptr %this.addr, !33, !DIExpression(), !35)
+  %this1 = load ptr, ptr %this.addr, align 8
+  ret ptr %this1, !dbg !36
+}
+
+; Function Attrs: mustprogress noinline nounwind optnone ssp uwtable(sync)
+define noundef ptr @_ZN16DefaultedOutlineC1Ev(ptr noundef nonnull returned align 1 dereferenceable(1) %this) unnamed_addr #0 !dbg !37 {
+entry:
+  %this.addr = alloca ptr, align 8
+  store ptr %this, ptr %this.addr, align 8
+    #dbg_declare(ptr %this.addr, !38, !DIExpression(), !39)
+  %this1 = load ptr, ptr %this.addr, align 8
+  %call = call noundef ptr @_ZN16DefaultedOutlineC2Ev(ptr noundef nonnull align 1 dereferenceable(1) %this1), !dbg !40
+  ret ptr %this1, !dbg !40
+}
+
+; Function Attrs: mustprogress noinline nounwind optnone ssp uwtable(sync)
+define noundef ptr @_ZN16DefaultedOutlineD2Ev(ptr noundef nonnull returned align 1 dereferenceable(1) %this) unnamed_addr #0 !dbg !41 {
+entry:
+  %this.addr = alloca ptr, align 8
+  store ptr %this, ptr %this.addr, align 8
+    #dbg_declare(ptr %this.addr, !44, !DIExpression(), !45)
+  %this1 = load ptr, ptr %this.addr, align 8
+  ret ptr %this1, !dbg !46
+}
+
+; Function Attrs: mustprogress noinline nounwind optnone ssp uwtable(sync)
+define noundef ptr @_ZN16DefaultedOutlineD1Ev(ptr noundef nonnull returned align 1 dereferenceable(1) %this) unnamed_addr #0 !dbg !47 {
+entry:
+  %this.addr = alloca ptr, align 8
+  store ptr %this, ptr %this.addr, align 8
+    #dbg_declare(ptr %this.addr, !48, !DIExpression(), !49)
+  %this1 = load ptr, ptr %this.addr, align 8
+  %call = call noundef ptr @_ZN16DefaultedOutlineD2Ev(ptr noundef nonnull align 1 dereferenceable(1) %this1) #3, !dbg !50
+  ret ptr %this1, !dbg !50
+}
+
+; Function Attrs: mustprogress noinline nounwind optnone ssp uwtable(sync)
+define noundef ptr @_ZN16DefaultedOutlineC2ERKS_(ptr noundef nonnull returned align 1 dereferenceable(1) %this, ptr noundef nonnull align 1 dereferenceable(1) %0) unnamed_addr #0 !dbg !51 {
+entry:
+  %this.addr = alloca ptr, align 8
+  %.addr = alloca ptr, align 8
+  store ptr %this, ptr %this.addr, align 8
+    #dbg_declare(ptr %this.addr, !52, !DIExpression(), !53)
+  store ptr %0, ptr %.addr, align 8
+    #dbg_declare(ptr %.addr, !54, !DIExpression(), !55)
+  %this1 = load ptr, ptr %this.addr, align 8
+...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/213187


More information about the llvm-commits mailing list