[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