Skip to content

Commit 4470abc

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 7786266 commit 4470abc

File tree

19 files changed

+347
-246
lines changed

19 files changed

+347
-246
lines changed

clang/lib/CodeGen/CGDebugInfo.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -1786,6 +1786,7 @@ CGDebugInfo::createInlinedTrapSubprogram(StringRef FuncName,
17861786
/*ScopeLine=*/0,
17871787
/*Flags=*/llvm::DINode::FlagArtificial,
17881788
/*SPFlags=*/llvm::DISubprogram::SPFlagDefinition,
1789+
/*ShortBacktrace=*/std::nullopt,
17891790
/*TParams=*/nullptr, /*ThrownTypes=*/nullptr, /*Annotations=*/nullptr);
17901791
}
17911792

@@ -2166,7 +2167,7 @@ llvm::DISubprogram *CGDebugInfo::CreateCXXMemberFunction(
21662167
llvm::DISubprogram *SP = DBuilder.createMethod(
21672168
RecordTy, MethodName, MethodLinkageName, MethodDefUnit, MethodLine,
21682169
MethodTy, VIndex, ThisAdjustment, ContainingType, Flags, SPFlags,
2169-
TParamsArray.get());
2170+
std::nullopt, TParamsArray.get());
21702171

21712172
SPCache[Method->getCanonicalDecl()].reset(SP);
21722173

@@ -4165,13 +4166,13 @@ llvm::DISubprogram *CGDebugInfo::getFunctionFwdDeclOrStub(GlobalDecl GD,
41654166
return DBuilder.createFunction(
41664167
DContext, Name, LinkageName, Unit, Line,
41674168
getOrCreateFunctionType(GD.getDecl(), FnType, Unit), 0, Flags, SPFlags,
4168-
TParamsArray.get(), getFunctionDeclaration(FD));
4169+
std::nullopt, TParamsArray.get(), getFunctionDeclaration(FD));
41694170
}
41704171

41714172
llvm::DISubprogram *SP = DBuilder.createTempFunctionFwdDecl(
41724173
DContext, Name, LinkageName, Unit, Line,
41734174
getOrCreateFunctionType(GD.getDecl(), FnType, Unit), 0, Flags, SPFlags,
4174-
TParamsArray.get(), getFunctionDeclaration(FD));
4175+
std::nullopt, TParamsArray.get(), getFunctionDeclaration(FD));
41754176
const FunctionDecl *CanonDecl = FD->getCanonicalDecl();
41764177
FwdDeclReplaceMap.emplace_back(std::piecewise_construct,
41774178
std::make_tuple(CanonDecl),
@@ -4501,8 +4502,8 @@ void CGDebugInfo::emitFunctionStart(GlobalDecl GD, SourceLocation Loc,
45014502
// are emitted as CU level entities by the backend.
45024503
llvm::DISubprogram *SP = DBuilder.createFunction(
45034504
FDContext, Name, LinkageName, Unit, LineNo, DIFnType, ScopeLine,
4504-
FlagsForDef, SPFlagsForDef, TParamsArray.get(), Decl, nullptr,
4505-
Annotations);
4505+
FlagsForDef, SPFlagsForDef, std::nullopt, TParamsArray.get(), Decl,
4506+
nullptr, Annotations);
45064507
Fn->setSubprogram(SP);
45074508
// We might get here with a VarDecl in the case we're generating
45084509
// code for the initialization of globals. Do not record these decls
@@ -4565,7 +4566,7 @@ void CGDebugInfo::EmitFunctionDecl(GlobalDecl GD, SourceLocation Loc,
45654566
llvm::DISubroutineType *STy = getOrCreateFunctionType(D, FnType, Unit);
45664567
llvm::DISubprogram *SP = DBuilder.createFunction(
45674568
FDContext, Name, LinkageName, Unit, LineNo, STy, ScopeLine, Flags,
4568-
SPFlags, TParamsArray.get(), nullptr, nullptr, Annotations);
4569+
SPFlags, std::nullopt, TParamsArray.get(), nullptr, nullptr, Annotations);
45694570

45704571
// Preserve btf_decl_tag attributes for parameters of extern functions
45714572
// for BPF target. The parameters created in this loop are attached as

llvm/include/llvm/BinaryFormat/Dwarf.def

+4
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

+1
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/IR/DIBuilder.h

+19-19
Original file line numberDiff line numberDiff line change
@@ -808,16 +808,15 @@ namespace llvm {
808808
/// \param Annotations Attribute Annotations.
809809
/// \param TargetFuncName The name of the target function if this is
810810
/// a trampoline.
811-
DISubprogram *
812-
createFunction(DIScope *Scope, StringRef Name, StringRef LinkageName,
813-
DIFile *File, unsigned LineNo, DISubroutineType *Ty,
814-
unsigned ScopeLine, DINode::DIFlags Flags = DINode::FlagZero,
815-
DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagZero,
816-
DITemplateParameterArray TParams = nullptr,
817-
DISubprogram *Decl = nullptr,
818-
DITypeArray ThrownTypes = nullptr,
819-
DINodeArray Annotations = nullptr,
820-
StringRef TargetFuncName = "");
811+
DISubprogram *createFunction(
812+
DIScope *Scope, StringRef Name, StringRef LinkageName, DIFile *File,
813+
unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine,
814+
DINode::DIFlags Flags = DINode::FlagZero,
815+
DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagZero,
816+
std::optional<ShortBacktraceAttr> ShortBacktrace = std::nullopt,
817+
DITemplateParameterArray TParams = nullptr,
818+
DISubprogram *Decl = nullptr, DITypeArray ThrownTypes = nullptr,
819+
DINodeArray Annotations = nullptr, StringRef TargetFuncName = "");
821820

822821
/// Identical to createFunction,
823822
/// except that the resulting DbgNode is meant to be RAUWed.
@@ -826,6 +825,7 @@ namespace llvm {
826825
unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine,
827826
DINode::DIFlags Flags = DINode::FlagZero,
828827
DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagZero,
828+
std::optional<ShortBacktraceAttr> ShortBacktrace = std::nullopt,
829829
DITemplateParameterArray TParams = nullptr,
830830
DISubprogram *Decl = nullptr, DITypeArray ThrownTypes = nullptr);
831831

@@ -848,15 +848,15 @@ namespace llvm {
848848
/// \param SPFlags Additional flags specific to subprograms.
849849
/// \param TParams Function template parameters.
850850
/// \param ThrownTypes Exception types this function may throw.
851-
DISubprogram *
852-
createMethod(DIScope *Scope, StringRef Name, StringRef LinkageName,
853-
DIFile *File, unsigned LineNo, DISubroutineType *Ty,
854-
unsigned VTableIndex = 0, int ThisAdjustment = 0,
855-
DIType *VTableHolder = nullptr,
856-
DINode::DIFlags Flags = DINode::FlagZero,
857-
DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagZero,
858-
DITemplateParameterArray TParams = nullptr,
859-
DITypeArray ThrownTypes = nullptr);
851+
DISubprogram *createMethod(
852+
DIScope *Scope, StringRef Name, StringRef LinkageName, DIFile *File,
853+
unsigned LineNo, DISubroutineType *Ty, unsigned VTableIndex = 0,
854+
int ThisAdjustment = 0, DIType *VTableHolder = nullptr,
855+
DINode::DIFlags Flags = DINode::FlagZero,
856+
DISubprogram::DISPFlags SPFlags = DISubprogram::SPFlagZero,
857+
std::optional<ShortBacktraceAttr> ShortBacktrace = std::nullopt,
858+
DITemplateParameterArray TParams = nullptr,
859+
DITypeArray ThrownTypes = nullptr);
860860

861861
/// Create common block entry for a Fortran common block.
862862
/// \param Scope Scope of this common block.

llvm/include/llvm/IR/DebugInfoMetadata.h

+42-23
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_*,
@@ -1750,35 +1757,40 @@ class DISubprogram : public DILocalScope {
17501757
private:
17511758
DIFlags Flags;
17521759
DISPFlags SPFlags;
1760+
std::optional<ShortBacktraceAttr> ShortBacktrace;
17531761

17541762
DISubprogram(LLVMContext &C, StorageType Storage, unsigned Line,
17551763
unsigned ScopeLine, unsigned VirtualIndex, int ThisAdjustment,
1756-
DIFlags Flags, DISPFlags SPFlags, ArrayRef<Metadata *> Ops);
1764+
DIFlags Flags, DISPFlags SPFlags,
1765+
std::optional<ShortBacktraceAttr> ShortBacktrace,
1766+
ArrayRef<Metadata *> Ops);
17571767
~DISubprogram() = default;
17581768

17591769
static DISubprogram *
17601770
getImpl(LLVMContext &Context, DIScope *Scope, StringRef Name,
17611771
StringRef LinkageName, DIFile *File, unsigned Line,
17621772
DISubroutineType *Type, unsigned ScopeLine, DIType *ContainingType,
17631773
unsigned VirtualIndex, int ThisAdjustment, DIFlags Flags,
1764-
DISPFlags SPFlags, DICompileUnit *Unit,
1765-
DITemplateParameterArray TemplateParams, DISubprogram *Declaration,
1766-
DINodeArray RetainedNodes, DITypeArray ThrownTypes,
1767-
DINodeArray Annotations, StringRef TargetFuncName,
1768-
StorageType Storage, bool ShouldCreate = true) {
1769-
return getImpl(Context, Scope, getCanonicalMDString(Context, Name),
1770-
getCanonicalMDString(Context, LinkageName), File, Line, Type,
1771-
ScopeLine, ContainingType, VirtualIndex, ThisAdjustment,
1772-
Flags, SPFlags, Unit, TemplateParams.get(), Declaration,
1773-
RetainedNodes.get(), ThrownTypes.get(), Annotations.get(),
1774-
getCanonicalMDString(Context, TargetFuncName),
1775-
Storage, ShouldCreate);
1774+
DISPFlags SPFlags, std::optional<ShortBacktraceAttr> ShortBacktrace,
1775+
DICompileUnit *Unit, DITemplateParameterArray TemplateParams,
1776+
DISubprogram *Declaration, DINodeArray RetainedNodes,
1777+
DITypeArray ThrownTypes, DINodeArray Annotations,
1778+
StringRef TargetFuncName, StorageType Storage,
1779+
bool ShouldCreate = true) {
1780+
return getImpl(
1781+
Context, Scope, getCanonicalMDString(Context, Name),
1782+
getCanonicalMDString(Context, LinkageName), File, Line, Type, ScopeLine,
1783+
ContainingType, VirtualIndex, ThisAdjustment, Flags, SPFlags,
1784+
ShortBacktrace, Unit, TemplateParams.get(), Declaration,
1785+
RetainedNodes.get(), ThrownTypes.get(), Annotations.get(),
1786+
getCanonicalMDString(Context, TargetFuncName), Storage, ShouldCreate);
17761787
}
17771788
static DISubprogram *
17781789
getImpl(LLVMContext &Context, Metadata *Scope, MDString *Name,
17791790
MDString *LinkageName, Metadata *File, unsigned Line, Metadata *Type,
17801791
unsigned ScopeLine, Metadata *ContainingType, unsigned VirtualIndex,
1781-
int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
1792+
int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags,
1793+
std::optional<ShortBacktraceAttr> ShortBacktrace, Metadata *Unit,
17821794
Metadata *TemplateParams, Metadata *Declaration,
17831795
Metadata *RetainedNodes, Metadata *ThrownTypes, Metadata *Annotations,
17841796
MDString *TargetFuncName, StorageType Storage,
@@ -1789,9 +1801,9 @@ class DISubprogram : public DILocalScope {
17891801
getFile(), getLine(), getType(), getScopeLine(),
17901802
getContainingType(), getVirtualIndex(),
17911803
getThisAdjustment(), getFlags(), getSPFlags(),
1792-
getUnit(), getTemplateParams(), getDeclaration(),
1793-
getRetainedNodes(), getThrownTypes(), getAnnotations(),
1794-
getTargetFuncName());
1804+
getShortBacktrace(), getUnit(), getTemplateParams(),
1805+
getDeclaration(), getRetainedNodes(), getThrownTypes(),
1806+
getAnnotations(), getTargetFuncName());
17951807
}
17961808

17971809
public:
@@ -1800,27 +1812,31 @@ class DISubprogram : public DILocalScope {
18001812
(DIScope * Scope, StringRef Name, StringRef LinkageName, DIFile *File,
18011813
unsigned Line, DISubroutineType *Type, unsigned ScopeLine,
18021814
DIType *ContainingType, unsigned VirtualIndex, int ThisAdjustment,
1803-
DIFlags Flags, DISPFlags SPFlags, DICompileUnit *Unit,
1815+
DIFlags Flags, DISPFlags SPFlags,
1816+
std::optional<ShortBacktraceAttr> ShortBacktrace, DICompileUnit *Unit,
18041817
DITemplateParameterArray TemplateParams = nullptr,
18051818
DISubprogram *Declaration = nullptr, DINodeArray RetainedNodes = nullptr,
18061819
DITypeArray ThrownTypes = nullptr, DINodeArray Annotations = nullptr,
18071820
StringRef TargetFuncName = ""),
18081821
(Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType,
1809-
VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams,
1810-
Declaration, RetainedNodes, ThrownTypes, Annotations, TargetFuncName))
1822+
VirtualIndex, ThisAdjustment, Flags, SPFlags, ShortBacktrace, Unit,
1823+
TemplateParams, Declaration, RetainedNodes, ThrownTypes, Annotations,
1824+
TargetFuncName))
18111825

18121826
DEFINE_MDNODE_GET(
18131827
DISubprogram,
18141828
(Metadata * Scope, MDString *Name, MDString *LinkageName, Metadata *File,
18151829
unsigned Line, Metadata *Type, unsigned ScopeLine,
18161830
Metadata *ContainingType, unsigned VirtualIndex, int ThisAdjustment,
1817-
DIFlags Flags, DISPFlags SPFlags, Metadata *Unit,
1831+
DIFlags Flags, DISPFlags SPFlags,
1832+
std::optional<ShortBacktraceAttr> ShortBacktrace, Metadata *Unit,
18181833
Metadata *TemplateParams = nullptr, Metadata *Declaration = nullptr,
18191834
Metadata *RetainedNodes = nullptr, Metadata *ThrownTypes = nullptr,
18201835
Metadata *Annotations = nullptr, MDString *TargetFuncName = nullptr),
18211836
(Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType,
1822-
VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams,
1823-
Declaration, RetainedNodes, ThrownTypes, Annotations, TargetFuncName))
1837+
VirtualIndex, ThisAdjustment, Flags, SPFlags, ShortBacktrace, Unit,
1838+
TemplateParams, Declaration, RetainedNodes, ThrownTypes, Annotations,
1839+
TargetFuncName))
18241840

18251841
TempDISubprogram clone() const { return cloneImpl(); }
18261842

@@ -1843,6 +1859,9 @@ class DISubprogram : public DILocalScope {
18431859
}
18441860
DIFlags getFlags() const { return Flags; }
18451861
DISPFlags getSPFlags() const { return SPFlags; }
1862+
const std::optional<ShortBacktraceAttr> getShortBacktrace() const {
1863+
return ShortBacktrace;
1864+
}
18461865
bool isLocalToUnit() const { return getSPFlags() & SPFlagLocalToUnit; }
18471866
bool isDefinition() const { return getSPFlags() & SPFlagDefinition; }
18481867
bool isOptimized() const { return getSPFlags() & SPFlagOptimized; }

llvm/lib/AsmParser/LLParser.cpp

+25-6
Original file line numberDiff line numberDiff line change
@@ -5630,9 +5630,9 @@ bool LLParser::parseDICompileUnit(MDNode *&Result, bool IsDistinct) {
56305630
/// isDefinition: true, scopeLine: 8, containingType: !3,
56315631
/// virtuality: DW_VIRTUALTIY_pure_virtual,
56325632
/// virtualIndex: 10, thisAdjustment: 4, flags: 11,
5633-
/// spFlags: 10, isOptimized: false, templateParams: !4,
5634-
/// declaration: !5, retainedNodes: !6, thrownTypes: !7,
5635-
/// annotations: !8)
5633+
/// spFlags: 10, shortBacktrace: 0, isOptimized: false,
5634+
/// templateParams: !4, declaration: !5, retainedNodes: !6,
5635+
/// thrownTypes: !7, annotations: !8)
56365636
bool LLParser::parseDISubprogram(MDNode *&Result, bool IsDistinct) {
56375637
auto Loc = Lex.getLoc();
56385638
#define VISIT_MD_FIELDS(OPTIONAL, REQUIRED) \
@@ -5658,10 +5658,29 @@ bool LLParser::parseDISubprogram(MDNode *&Result, bool IsDistinct) {
56585658
OPTIONAL(retainedNodes, MDField, ); \
56595659
OPTIONAL(thrownTypes, MDField, ); \
56605660
OPTIONAL(annotations, MDField, ); \
5661+
OPTIONAL(shortBacktrace, MDSignedField, (-1, -1, 2)); \
56615662
OPTIONAL(targetFuncName, MDStringField, );
56625663
PARSE_MD_FIELDS();
56635664
#undef VISIT_MD_FIELDS
56645665

5666+
std::optional<ShortBacktraceAttr> parsedShortBacktrace;
5667+
switch (shortBacktrace.Val) {
5668+
case -1:
5669+
parsedShortBacktrace = std::nullopt;
5670+
break;
5671+
case 0:
5672+
parsedShortBacktrace = ShortBacktraceAttr::SkipFrame;
5673+
break;
5674+
case 1:
5675+
parsedShortBacktrace = ShortBacktraceAttr::StartShortBacktrace;
5676+
break;
5677+
case 2:
5678+
parsedShortBacktrace = ShortBacktraceAttr::EndShortBacktrace;
5679+
break;
5680+
default:
5681+
llvm_unreachable("shortBacktrace debuginfo attribute must be in range [-1, 2]");
5682+
}
5683+
56655684
// An explicit spFlags field takes precedence over individual fields in
56665685
// older IR versions.
56675686
DISubprogram::DISPFlags SPFlags =
@@ -5676,9 +5695,9 @@ bool LLParser::parseDISubprogram(MDNode *&Result, bool IsDistinct) {
56765695
DISubprogram,
56775696
(Context, scope.Val, name.Val, linkageName.Val, file.Val, line.Val,
56785697
type.Val, scopeLine.Val, containingType.Val, virtualIndex.Val,
5679-
thisAdjustment.Val, flags.Val, SPFlags, unit.Val, templateParams.Val,
5680-
declaration.Val, retainedNodes.Val, thrownTypes.Val, annotations.Val,
5681-
targetFuncName.Val));
5698+
thisAdjustment.Val, flags.Val, SPFlags, parsedShortBacktrace, unit.Val,
5699+
templateParams.Val, declaration.Val, retainedNodes.Val, thrownTypes.Val,
5700+
annotations.Val, targetFuncName.Val));
56825701
return false;
56835702
}
56845703

llvm/lib/Bitcode/Reader/MetadataLoader.cpp

+6-4
Original file line numberDiff line numberDiff line change
@@ -1881,10 +1881,12 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
18811881
HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment
18821882
Flags, // flags
18831883
SPFlags, // SPFlags
1884-
HasUnit ? CUorFn : nullptr, // unit
1885-
getMDOrNull(Record[13 + OffsetB]), // templateParams
1886-
getMDOrNull(Record[14 + OffsetB]), // declaration
1887-
getMDOrNull(Record[15 + OffsetB]), // retainedNodes
1884+
// TODO: parse this from the record
1885+
std::nullopt, // shortBacktrace
1886+
HasUnit ? CUorFn : nullptr, // unit
1887+
getMDOrNull(Record[13 + OffsetB]), // templateParams
1888+
getMDOrNull(Record[14 + OffsetB]), // declaration
1889+
getMDOrNull(Record[15 + OffsetB]), // retainedNodes
18881890
HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
18891891
: nullptr, // thrownTypes
18901892
HasAnnotations ? getMDOrNull(Record[18 + OffsetB])

llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -2552,6 +2552,7 @@ void DwarfDebug::endFunctionImpl(const MachineFunction *MF) {
25522552
// subroutines inside it. But with -fdebug-info-for-profiling, the subprogram
25532553
// is still needed as we need its source location.
25542554
if (!TheCU.getCUNode()->getDebugInfoForProfiling() &&
2555+
!SP->getShortBacktrace().has_value() &&
25552556
TheCU.getCUNode()->getEmissionKind() == DICompileUnit::LineTablesOnly &&
25562557
LScopes.getAbstractScopesList().empty() && !IsDarwin) {
25572558
for (const auto &R : Asm->MBBSectionRanges)

llvm/lib/CodeGen/AsmPrinter/DwarfUnit.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -1320,6 +1320,11 @@ void DwarfUnit::applySubprogramAttributes(const DISubprogram *SP, DIE &SPDie,
13201320
if (!SkipSPSourceLocation)
13211321
addSourceLine(SPDie, SP);
13221322

1323+
if (SP->getShortBacktrace().has_value()) {
1324+
addUInt(SPDie, dwarf::DW_AT_RUST_short_backtrace, dwarf::DW_FORM_data1,
1325+
static_cast<uint64_t>(*SP->getShortBacktrace()));
1326+
}
1327+
13231328
// Skip the rest of the attributes under -gmlt to save space.
13241329
if (SkipSPAttributes)
13251330
return;

llvm/lib/IR/AsmWriter.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -2334,6 +2334,10 @@ static void writeDISubprogram(raw_ostream &Out, const DISubprogram *N,
23342334
Printer.printInt("thisAdjustment", N->getThisAdjustment());
23352335
Printer.printDIFlags("flags", N->getFlags());
23362336
Printer.printDISPFlags("spFlags", N->getSPFlags());
2337+
if (N->getShortBacktrace().has_value())
2338+
Printer.printInt("shortBacktrace",
2339+
static_cast<signed>(N->getShortBacktrace().value()),
2340+
/* ShouldSkipZero */ false);
23372341
Printer.printMetadata("unit", N->getRawUnit());
23382342
Printer.printMetadata("templateParams", N->getRawTemplateParams());
23392343
Printer.printMetadata("declaration", N->getRawDeclaration());

0 commit comments

Comments
 (0)