From 017d31fc312d446c35b77764a4a3453dbf6f3d3e Mon Sep 17 00:00:00 2001 From: DianQK Date: Tue, 1 Aug 2023 06:38:28 +0800 Subject: [PATCH] [Backtracing][Linux] Support the DW_AT_specification attribute. Support parsing the following format: ``` 0x0000104b: DW_TAG_subprogram DW_AT_specification (0x00000d23 "$s8CrashOpt6level1yyF") DW_AT_inline (DW_INL_inlined) ``` --- stdlib/public/Backtracing/Dwarf.swift | 30 +++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/stdlib/public/Backtracing/Dwarf.swift b/stdlib/public/Backtracing/Dwarf.swift index 7d9fba1e44733..b908b94043097 100644 --- a/stdlib/public/Backtracing/Dwarf.swift +++ b/stdlib/public/Backtracing/Dwarf.swift @@ -1538,7 +1538,7 @@ struct DwarfReader { var cursor = ImageSourceCursor(source: infoSection, offset: abstractOrigin) - let abbrev = try cursor.readULEB128() + var abbrev = try cursor.readULEB128() if abbrev == 0 { return } @@ -1553,13 +1553,39 @@ struct DwarfReader { return } - let refAttrs = try readDieAttributes( + var refAttrs = try readDieAttributes( at: &cursor, unit: unit, abbrevInfo: abbrevInfo, shouldFetchIndirect: true ) + if let specificationVal = refAttrs[.DW_AT_specification], + case let .reference(specification) = specificationVal { + cursor = ImageSourceCursor(source: infoSection, + offset: specification) + abbrev = try cursor.readULEB128() + if abbrev == 0 { + return + } + + guard let abbrevInfo = unit.abbrevs[abbrev] else { + throw DwarfError.missingAbbrev(abbrev) + } + + let tag = abbrevInfo.tag + if tag != .DW_TAG_subprogram { + return + } + + refAttrs = try readDieAttributes( + at: &cursor, + unit: unit, + abbrevInfo: abbrevInfo, + shouldFetchIndirect: true + ) + } + var name: String? = nil var rawName: String? = nil