Skip to content

Commit 94c1334

Browse files
committed
Generate DW_AT_RUST_short_backtrace attributes for DISubprogram nodes
The Rust standard library has two [styles](https://doc.rust-lang.org/stable/std/panic/enum.BacktraceStyle.html) for printing backtraces at runtime: 1. Full backtraces. These work in the obvious way. 2. Short backtraces. These filter out "unimportant" frames that are likely not related to the developer's bug. For example, frames like `__libc_start_main`, `_Unwind_Resume`, and rust runtime internals like `std::rt::lang_start` are filtered out. Currently, the Rust runtime determines "unimportant" frames by looking directly at un-mangled symbol names of generated functions. This is not extensible, and involves a state machine that requires the frames to be present at runtime; in particular the frames must be marked `noinline`, impeding optimizations. This extends LLVM to encode short backtrace metadata in DWARF debuginfo. It currently does not attempt to add debuginfo to PDB, which was not designed to be extensible. See rust-lang/compiler-team#818 for more background. - Add a new category for Rust DWARF vendor extensions - Add a new `enum ShortBacktraceAttr { SkipFrame, StartFrame, EndFrame }`. StartFrame and EndFrame correspond to the existing `__rust_start_short_backtrace` and `__rust_end_short_backtrace` symbols. SkipFrame currently has no analogue. Each of these values is mutually exclusive with the others, and generating multiple for the same function is a logical error. - Update all callsites of `DISubprogram::getImpl` to pass in a `std::optional<ShortBacktraceAttr>` - Emit `ShortBacktraceAttr` when creating DWARF debuginfo. Note that this also generates debuginfo in more cases than before: When using line-tables-only debuginfo, LLVM attempts to skip functions with 0 lexical scopes. But some shims in the Rust standard library, such as `std::ops::Fn::call`, are shims that never appear in Rust source code but still appear in the backtrace. Generate info for these functions if they have a short backtrace attribute, so that they are correctly skipped in backtraces. - Parse and serialize the new attribute in .ll files - Add a regression test
1 parent 59512b0 commit 94c1334

22 files changed

+167
-71
lines changed

llvm/include/llvm/BinaryFormat/Dwarf.def

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -605,6 +605,10 @@ HANDLE_DW_AT(0x3b28, BORLAND_Delphi_ABI, 0, BORLAND)
605605
HANDLE_DW_AT(0x3b29, BORLAND_Delphi_return, 0, BORLAND)
606606
HANDLE_DW_AT(0x3b30, BORLAND_Delphi_frameptr, 0, BORLAND)
607607
HANDLE_DW_AT(0x3b31, BORLAND_closure, 0, BORLAND)
608+
609+
// Rust extensions.
610+
HANDLE_DW_AT(0x3c00, RUST_short_backtrace, 0, RUST)
611+
608612
// LLVM project extensions.
609613
HANDLE_DW_AT(0x3e00, LLVM_include_path, 0, LLVM)
610614
HANDLE_DW_AT(0x3e01, LLVM_config_macros, 0, LLVM)

llvm/include/llvm/BinaryFormat/Dwarf.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ enum LLVMConstants : uint32_t {
8484
DWARF_VENDOR_PGI,
8585
DWARF_VENDOR_SUN,
8686
DWARF_VENDOR_UPC,
87+
DWARF_VENDOR_RUST,
8788
///\}
8889
};
8990

llvm/include/llvm/Bitcode/LLVMBitCodes.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,7 @@ enum AttributeKindCodes {
758758
ATTR_KIND_SANITIZE_NUMERICAL_STABILITY = 93,
759759
ATTR_KIND_INITIALIZES = 94,
760760
ATTR_KIND_HYBRID_PATCHABLE = 95,
761+
ATTR_KIND_SHORT_BACKTRACE = 96,
761762
};
762763

763764
enum ComdatSelectionKindCodes {

llvm/include/llvm/IR/Attributes.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,9 @@ def NoProfile : EnumAttr<"noprofile", [FnAttr]>;
203203
// functions into it.
204204
def SkipProfile : EnumAttr<"skipprofile", [FnAttr]>;
205205

206+
/// This function affects the display of short backtraces when displayed by the Rust standard library panic hook.
207+
def ShortBacktrace : IntAttr<"shortbacktrace", [FnAttr]>;
208+
206209
/// Function doesn't unwind stack.
207210
def NoUnwind : EnumAttr<"nounwind", [FnAttr]>;
208211

llvm/include/llvm/IR/DIBuilder.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -803,6 +803,7 @@ namespace llvm {
803803
DIFile *File, unsigned LineNo, DISubroutineType *Ty,
804804
unsigned ScopeLine, DINode::DIFlags Flags = DINode::FlagZero,
805805
DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagZero,
806+
std::optional<ShortBacktraceAttr> ShortBacktrace = std::nullopt,
806807
DITemplateParameterArray TParams = nullptr,
807808
DISubprogram *Decl = nullptr,
808809
DITypeArray ThrownTypes = nullptr,
@@ -816,6 +817,7 @@ namespace llvm {
816817
unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine,
817818
DINode::DIFlags Flags = DINode::FlagZero,
818819
DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagZero,
820+
std::optional<ShortBacktraceAttr> ShortBacktrace = std::nullopt,
819821
DITemplateParameterArray TParams = nullptr,
820822
DISubprogram *Decl = nullptr, DITypeArray ThrownTypes = nullptr);
821823

@@ -845,6 +847,7 @@ namespace llvm {
845847
DIType *VTableHolder = nullptr,
846848
DINode::DIFlags Flags = DINode::FlagZero,
847849
DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagZero,
850+
std::optional<ShortBacktraceAttr> ShortBacktrace = std::nullopt,
848851
DITemplateParameterArray TParams = nullptr,
849852
DITypeArray ThrownTypes = nullptr);
850853

llvm/include/llvm/IR/DebugInfoMetadata.h

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,13 @@ class DITypeRefArray {
125125
iterator end() const { return N ? iterator(N->op_end()) : iterator(); }
126126
};
127127

128+
/// DWARF-like extension attribute for setting short backtrace debuginfo.
129+
enum class ShortBacktraceAttr {
130+
SkipFrame = 0,
131+
StartShortBacktrace = 1,
132+
EndShortBacktrace = 2,
133+
};
134+
128135
/// Tagged DWARF-like metadata node.
129136
///
130137
/// A metadata node with a DWARF tag (i.e., a constant named \c DW_TAG_*,
@@ -1713,26 +1720,27 @@ class DISubprogram : public DILocalScope {
17131720
private:
17141721
DIFlags Flags;
17151722
DISPFlags SPFlags;
1723+
std::optional<ShortBacktraceAttr> ShortBacktrace;
17161724

17171725
DISubprogram(LLVMContext &C, StorageType Storage, unsigned Line,
17181726
unsigned ScopeLine, unsigned VirtualIndex, int ThisAdjustment,
1719-
DIFlags Flags, DISPFlags SPFlags, ArrayRef<Metadata *> Ops);
1727+
DIFlags Flags, DISPFlags SPFlags, std::optional<ShortBacktraceAttr> ShortBacktrace, ArrayRef<Metadata *> Ops);
17201728
~DISubprogram() = default;
17211729

17221730
static DISubprogram *
17231731
getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
17241732
StringRef LinkageName, DIFile *File, unsigned Line,
17251733
DISubroutineType *Type, unsigned ScopeLine, DIType *ContainingType,
17261734
unsigned VirtualIndex, int ThisAdjustment, DIFlags Flags,
1727-
DISPFlags SPFlags, DICompileUnit *Unit,
1735+
DISPFlags SPFlags, std::optional<ShortBacktraceAttr> ShortBacktrace, DICompileUnit *Unit,
17281736
DITemplateParameterArray TemplateParams, DISubprogram *Declaration,
17291737
DINodeArray RetainedNodes, DITypeArray ThrownTypes,
17301738
DINodeArray Annotations, StringRef TargetFuncName,
17311739
StorageType Storage, bool ShouldCreate = true) {
17321740
return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
17331741
getCanonicalMDString(Context, LinkageName), File, Line, Type,
17341742
ScopeLine, ContainingType, VirtualIndex, ThisAdjustment,
1735-
Flags, SPFlags, Unit, TemplateParams.get(), Declaration,
1743+
Flags, SPFlags, ShortBacktrace, Unit, TemplateParams.get(), Declaration,
17361744
RetainedNodes.get(), ThrownTypes.get(), Annotations.get(),
17371745
getCanonicalMDString(Context, TargetFuncName),
17381746
Storage, ShouldCreate);
@@ -1741,7 +1749,7 @@ class DISubprogram : public DILocalScope {
17411749
getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
17421750
MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
17431751
unsigned ScopeLine, Metadata *ContainingType, unsigned VirtualIndex,
1744-
int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
1752+
int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, std::optional<ShortBacktraceAttr> ShortBacktrace, Metadata *Unit,
17451753
Metadata *TemplateParams, Metadata *Declaration,
17461754
Metadata *RetainedNodes, Metadata *ThrownTypes, Metadata *Annotations,
17471755
MDString *TargetFuncName, StorageType Storage,
@@ -1751,7 +1759,7 @@ class DISubprogram : public DILocalScope {
17511759
return getTemporary(getContext(), getScope(), getName(), getLinkageName(),
17521760
getFile(), getLine(), getType(), getScopeLine(),
17531761
getContainingType(), getVirtualIndex(),
1754-
getThisAdjustment(), getFlags(), getSPFlags(),
1762+
getThisAdjustment(), getFlags(), getSPFlags(), getShortBacktrace(),
17551763
getUnit(), getTemplateParams(), getDeclaration(),
17561764
getRetainedNodes(), getThrownTypes(), getAnnotations(),
17571765
getTargetFuncName());
@@ -1763,26 +1771,26 @@ class DISubprogram : public DILocalScope {
17631771
(DIScope * Scope, StringRef Name, StringRef LinkageName, DIFile *File,
17641772
unsigned Line, DISubroutineType *Type, unsigned ScopeLine,
17651773
DIType *ContainingType, unsigned VirtualIndex, int ThisAdjustment,
1766-
DIFlags Flags, DISPFlags SPFlags, DICompileUnit *Unit,
1774+
DIFlags Flags, DISPFlags SPFlags, std::optional<ShortBacktraceAttr> ShortBacktrace, DICompileUnit *Unit,
17671775
DITemplateParameterArray TemplateParams = nullptr,
17681776
DISubprogram *Declaration = nullptr, DINodeArray RetainedNodes = nullptr,
17691777
DITypeArray ThrownTypes = nullptr, DINodeArray Annotations = nullptr,
17701778
StringRef TargetFuncName = ""),
17711779
(Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType,
1772-
VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams,
1780+
VirtualIndex, ThisAdjustment, Flags, SPFlags, ShortBacktrace, Unit, TemplateParams,
17731781
Declaration, RetainedNodes, ThrownTypes, Annotations, TargetFuncName))
17741782

17751783
DEFINE_MDNODE_GET(
17761784
DISubprogram,
17771785
(Metadata * Scope, MDString *Name, MDString *LinkageName, Metadata *File,
17781786
unsigned Line, Metadata *Type, unsigned ScopeLine,
17791787
Metadata *ContainingType, unsigned VirtualIndex, int ThisAdjustment,
1780-
DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
1788+
DIFlags Flags, DISPFlags SPFlags, std::optional<ShortBacktraceAttr> ShortBacktrace, Metadata *Unit,
17811789
Metadata *TemplateParams = nullptr, Metadata *Declaration = nullptr,
17821790
Metadata *RetainedNodes = nullptr, Metadata *ThrownTypes = nullptr,
17831791
Metadata *Annotations = nullptr, MDString *TargetFuncName = nullptr),
17841792
(Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType,
1785-
VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams,
1793+
VirtualIndex, ThisAdjustment, Flags, SPFlags, ShortBacktrace, Unit, TemplateParams,
17861794
Declaration, RetainedNodes, ThrownTypes, Annotations, TargetFuncName))
17871795

17881796
TempDISubprogram clone() const { return cloneImpl(); }
@@ -1806,6 +1814,7 @@ class DISubprogram : public DILocalScope {
18061814
}
18071815
DIFlags getFlags() const { return Flags; }
18081816
DISPFlags getSPFlags() const { return SPFlags; }
1817+
const std::optional<ShortBacktraceAttr> getShortBacktrace() const { return ShortBacktrace; }
18091818
bool isLocalToUnit() const { return getSPFlags() & SPFlagLocalToUnit; }
18101819
bool isDefinition() const { return getSPFlags() & SPFlagDefinition; }
18111820
bool isOptimized() const { return getSPFlags() & SPFlagOptimized; }

llvm/lib/AsmParser/LLParser.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5555,7 +5555,7 @@ bool LLParser::parseDICompileUnit(MDNode *&Result, bool IsDistinct) {
55555555
/// isDefinition: true, scopeLine: 8, containingType: !3,
55565556
/// virtuality: DW_VIRTUALTIY_pure_virtual,
55575557
/// virtualIndex: 10, thisAdjustment: 4, flags: 11,
5558-
/// spFlags: 10, isOptimized: false, templateParams: !4,
5558+
/// spFlags: 10, shortBacktrace: 0, isOptimized: false, templateParams: !4,
55595559
/// declaration: !5, retainedNodes: !6, thrownTypes: !7,
55605560
/// annotations: !8)
55615561
bool LLParser::parseDISubprogram(MDNode *&Result, bool IsDistinct) {
@@ -5583,10 +5583,27 @@ bool LLParser::parseDISubprogram(MDNode *&Result, bool IsDistinct) {
55835583
OPTIONAL(retainedNodes, MDField, ); \
55845584
OPTIONAL(thrownTypes, MDField, ); \
55855585
OPTIONAL(annotations, MDField, ); \
5586+
OPTIONAL(shortBacktrace, MDSignedField, (-1, -1, 2)); \
55865587
OPTIONAL(targetFuncName, MDStringField, );
55875588
PARSE_MD_FIELDS();
55885589
#undef VISIT_MD_FIELDS
55895590

5591+
std::optional<ShortBacktraceAttr> parsedShortBacktrace;
5592+
switch (shortBacktrace.Val) {
5593+
case -1:
5594+
parsedShortBacktrace = std::nullopt;
5595+
break;
5596+
case 0:
5597+
parsedShortBacktrace = ShortBacktraceAttr::SkipFrame;
5598+
break;
5599+
case 1:
5600+
parsedShortBacktrace = ShortBacktraceAttr::StartShortBacktrace;
5601+
break;
5602+
case 2:
5603+
parsedShortBacktrace = ShortBacktraceAttr::EndShortBacktrace;
5604+
break;
5605+
}
5606+
55905607
// An explicit spFlags field takes precedence over individual fields in
55915608
// older IR versions.
55925609
DISubprogram::DISPFlags SPFlags =
@@ -5601,7 +5618,7 @@ bool LLParser::parseDISubprogram(MDNode *&Result, bool IsDistinct) {
56015618
DISubprogram,
56025619
(Context, scope.Val, name.Val, linkageName.Val, file.Val, line.Val,
56035620
type.Val, scopeLine.Val, containingType.Val, virtualIndex.Val,
5604-
thisAdjustment.Val, flags.Val, SPFlags, unit.Val, templateParams.Val,
5621+
thisAdjustment.Val, flags.Val, SPFlags, parsedShortBacktrace, unit.Val, templateParams.Val,
56055622
declaration.Val, retainedNodes.Val, thrownTypes.Val, annotations.Val,
56065623
targetFuncName.Val));
56075624
return false;

llvm/lib/Bitcode/Reader/MetadataLoader.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1875,6 +1875,8 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
18751875
HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment
18761876
Flags, // flags
18771877
SPFlags, // SPFlags
1878+
// TODO: parse this from the record
1879+
std::nullopt, // shortBacktrace
18781880
HasUnit ? CUorFn : nullptr, // unit
18791881
getMDOrNull(Record[13 + OffsetB]), // templateParams
18801882
getMDOrNull(Record[14 + OffsetB]), // declaration

llvm/lib/Bitcode/Writer/BitcodeWriter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -829,6 +829,8 @@ static uint64_t getAttrKindEncoding(Attribute::AttrKind Kind) {
829829
return bitc::ATTR_KIND_SAFESTACK;
830830
case Attribute::ShadowCallStack:
831831
return bitc::ATTR_KIND_SHADOWCALLSTACK;
832+
case Attribute::ShortBacktrace:
833+
return bitc::ATTR_KIND_SHORT_BACKTRACE;
832834
case Attribute::StrictFP:
833835
return bitc::ATTR_KIND_STRICT_FP;
834836
case Attribute::StructRet:

llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2295,6 +2295,7 @@ void DwarfDebug::endFunctionImpl(const MachineFunction *MF) {
22952295
// subroutines inside it. But with -fdebug-info-for-profiling, the subprogram
22962296
// is still needed as we need its source location.
22972297
if (!TheCU.getCUNode()->getDebugInfoForProfiling() &&
2298+
!SP->getShortBacktrace().has_value() &&
22982299
TheCU.getCUNode()->getEmissionKind() == DICompileUnit::LineTablesOnly &&
22992300
LScopes.getAbstractScopesList().empty() && !IsDarwin) {
23002301
for (const auto &R : Asm->MBBSectionRanges)

llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1288,6 +1288,10 @@ void DwarfUnit::applySubprogramAttributes(const DISubprogram *SP, DIE &SPDie,
12881288
if (!SkipSPSourceLocation)
12891289
addSourceLine(SPDie, SP);
12901290

1291+
if (SP->getShortBacktrace().has_value()) {
1292+
addUInt(SPDie, dwarf::DW_AT_RUST_short_backtrace, dwarf::DW_FORM_data1, static_cast<uint64_t>(*SP->getShortBacktrace()));
1293+
}
1294+
12911295
// Skip the rest of the attributes under -gmlt to save space.
12921296
if (SkipSPAttributes)
12931297
return;

llvm/lib/IR/AsmWriter.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2294,6 +2294,8 @@ static void writeDISubprogram(raw_ostream &Out, const DISubprogram *N,
22942294
Printer.printInt("thisAdjustment", N->getThisAdjustment());
22952295
Printer.printDIFlags("flags", N->getFlags());
22962296
Printer.printDISPFlags("spFlags", N->getSPFlags());
2297+
if (N->getShortBacktrace().has_value())
2298+
Printer.printInt("shortBacktrace", static_cast<signed>(N->getShortBacktrace().value()), /* ShouldSkipZero */ false);
22972299
Printer.printMetadata("unit", N->getRawUnit());
22982300
Printer.printMetadata("templateParams", N->getRawTemplateParams());
22992301
Printer.printMetadata("declaration", N->getRawDeclaration());

llvm/lib/IR/DIBuilder.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "llvm/BinaryFormat/Dwarf.h"
1818
#include "llvm/IR/Constants.h"
1919
#include "llvm/IR/DebugInfo.h"
20+
#include "llvm/IR/DebugInfoMetadata.h"
2021
#include "llvm/IR/IRBuilder.h"
2122
#include "llvm/IR/Module.h"
2223
#include "llvm/Support/CommandLine.h"
@@ -856,14 +857,15 @@ DISubprogram *DIBuilder::createFunction(
856857
DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File,
857858
unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine,
858859
DINode::DIFlags Flags, DISubprogram::DISPFlags SPFlags,
860+
std::optional<ShortBacktraceAttr> ShortBacktrace,
859861
DITemplateParameterArray TParams, DISubprogram *Decl,
860862
DITypeArray ThrownTypes, DINodeArray Annotations,
861863
StringRef TargetFuncName) {
862864
bool IsDefinition = SPFlags & DISubprogram::SPFlagDefinition;
863865
auto *Node = getSubprogram(
864866
/*IsDistinct=*/IsDefinition, VMContext, getNonCompileUnitScope(Context),
865867
Name, LinkageName, File, LineNo, Ty, ScopeLine, nullptr, 0, 0, Flags,
866-
SPFlags, IsDefinition ? CUNode : nullptr, TParams, Decl, nullptr,
868+
SPFlags, ShortBacktrace, IsDefinition ? CUNode : nullptr, TParams, Decl, nullptr,
867869
ThrownTypes, Annotations, TargetFuncName);
868870

869871
if (IsDefinition)
@@ -876,12 +878,13 @@ DISubprogram *DIBuilder::createTempFunctionFwdDecl(
876878
DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File,
877879
unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine,
878880
DINode::DIFlags Flags, DISubprogram::DISPFlags SPFlags,
881+
std::optional<ShortBacktraceAttr> ShortBacktrace,
879882
DITemplateParameterArray TParams, DISubprogram *Decl,
880883
DITypeArray ThrownTypes) {
881884
bool IsDefinition = SPFlags & DISubprogram::SPFlagDefinition;
882885
return DISubprogram::getTemporary(VMContext, getNonCompileUnitScope(Context),
883886
Name, LinkageName, File, LineNo, Ty,
884-
ScopeLine, nullptr, 0, 0, Flags, SPFlags,
887+
ScopeLine, nullptr, 0, 0, Flags, SPFlags, ShortBacktrace,
885888
IsDefinition ? CUNode : nullptr, TParams,
886889
Decl, nullptr, ThrownTypes)
887890
.release();
@@ -891,7 +894,9 @@ DISubprogram *DIBuilder::createMethod(
891894
DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
892895
unsigned LineNo, DISubroutineType *Ty, unsigned VIndex, int ThisAdjustment,
893896
DIType *VTableHolder, DINode::DIFlags Flags,
894-
DISubprogram::DISPFlags SPFlags, DITemplateParameterArray TParams,
897+
DISubprogram::DISPFlags SPFlags,
898+
std::optional<ShortBacktraceAttr> ShortBacktrace,
899+
DITemplateParameterArray TParams,
895900
DITypeArray ThrownTypes) {
896901
assert(getNonCompileUnitScope(Context) &&
897902
"Methods should have both a Context and a context that isn't "
@@ -901,7 +906,7 @@ DISubprogram *DIBuilder::createMethod(
901906
auto *SP = getSubprogram(
902907
/*IsDistinct=*/IsDefinition, VMContext, cast<DIScope>(Context), Name,
903908
LinkageName, F, LineNo, Ty, LineNo, VTableHolder, VIndex, ThisAdjustment,
904-
Flags, SPFlags, IsDefinition ? CUNode : nullptr, TParams, nullptr,
909+
Flags, SPFlags, ShortBacktrace, IsDefinition ? CUNode : nullptr, TParams, nullptr,
905910
nullptr, ThrownTypes);
906911

907912
if (IsDefinition)

llvm/lib/IR/DebugInfo.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -677,7 +677,7 @@ class DebugTypeInfoRemoval {
677677
MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
678678
FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(),
679679
ContainingType, MDS->getVirtualIndex(), MDS->getThisAdjustment(),
680-
MDS->getFlags(), MDS->getSPFlags(), Unit, TemplateParams, Declaration,
680+
MDS->getFlags(), MDS->getSPFlags(), MDS->getShortBacktrace(), Unit, TemplateParams, Declaration,
681681
Variables);
682682
};
683683

@@ -688,7 +688,7 @@ class DebugTypeInfoRemoval {
688688
MDS->getContext(), FileAndScope, MDS->getName(), LinkageName,
689689
FileAndScope, MDS->getLine(), Type, MDS->getScopeLine(), ContainingType,
690690
MDS->getVirtualIndex(), MDS->getThisAdjustment(), MDS->getFlags(),
691-
MDS->getSPFlags(), Unit, TemplateParams, Declaration, Variables);
691+
MDS->getSPFlags(), MDS->getShortBacktrace(), Unit, TemplateParams, Declaration, Variables);
692692

693693
StringRef OldLinkageName = MDS->getLinkageName();
694694

@@ -1125,7 +1125,7 @@ LLVMMetadataRef LLVMDIBuilderCreateFunction(
11251125
unwrapDI<DIScope>(Scope), {Name, NameLen}, {LinkageName, LinkageNameLen},
11261126
unwrapDI<DIFile>(File), LineNo, unwrapDI<DISubroutineType>(Ty), ScopeLine,
11271127
map_from_llvmDIFlags(Flags),
1128-
pack_into_DISPFlags(IsLocalToUnit, IsDefinition, IsOptimized), nullptr,
1128+
pack_into_DISPFlags(IsLocalToUnit, IsDefinition, IsOptimized), {},
11291129
nullptr, nullptr));
11301130
}
11311131

llvm/lib/IR/DebugInfoMetadata.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,10 +1022,11 @@ const char *DICompileUnit::nameTableKindString(DebugNameTableKind NTK) {
10221022
DISubprogram::DISubprogram(LLVMContext &C, StorageType Storage, unsigned Line,
10231023
unsigned ScopeLine, unsigned VirtualIndex,
10241024
int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags,
1025+
std::optional<ShortBacktraceAttr> ShortBacktrace,
10251026
ArrayRef<Metadata *> Ops)
10261027
: DILocalScope(C, DISubprogramKind, Storage, dwarf::DW_TAG_subprogram, Ops),
10271028
Line(Line), ScopeLine(ScopeLine), VirtualIndex(VirtualIndex),
1028-
ThisAdjustment(ThisAdjustment), Flags(Flags), SPFlags(SPFlags) {
1029+
ThisAdjustment(ThisAdjustment), Flags(Flags), SPFlags(SPFlags), ShortBacktrace(ShortBacktrace) {
10291030
static_assert(dwarf::DW_VIRTUALITY_max < 4, "Virtuality out of range");
10301031
}
10311032
DISubprogram::DISPFlags
@@ -1124,7 +1125,7 @@ DISubprogram *DISubprogram::getImpl(
11241125
LLVMContext &Context, Metadata *Scope, MDString *Name,
11251126
MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
11261127
unsigned ScopeLine, Metadata *ContainingType, unsigned VirtualIndex,
1127-
int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
1128+
int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, std::optional<ShortBacktraceAttr> ShortBacktrace, Metadata *Unit,
11281129
Metadata *TemplateParams, Metadata *Declaration, Metadata *RetainedNodes,
11291130
Metadata *ThrownTypes, Metadata *Annotations, MDString *TargetFuncName,
11301131
StorageType Storage, bool ShouldCreate) {
@@ -1158,7 +1159,7 @@ DISubprogram *DISubprogram::getImpl(
11581159
}
11591160
DEFINE_GETIMPL_STORE_N(
11601161
DISubprogram,
1161-
(Line, ScopeLine, VirtualIndex, ThisAdjustment, Flags, SPFlags), Ops,
1162+
(Line, ScopeLine, VirtualIndex, ThisAdjustment, Flags, SPFlags, ShortBacktrace), Ops,
11621163
Ops.size());
11631164
}
11641165

0 commit comments

Comments
 (0)