[Lldb-commits] [lldb] 98c3dc3 - [lldb] Make GetDIENamesAndRanges() allow 0-valued decl and call lines
David Stenberg via lldb-commits
lldb-commits at lists.llvm.org
Mon Mar 6 05:37:20 PST 2023
Author: David Stenberg
Date: 2023-03-06T14:23:29+01:00
New Revision: 98c3dc3fa748072fc42054fb90b295c2d5190bfe
URL: https://github.com/llvm/llvm-project/commit/98c3dc3fa748072fc42054fb90b295c2d5190bfe
DIFF: https://github.com/llvm/llvm-project/commit/98c3dc3fa748072fc42054fb90b295c2d5190bfe.diff
LOG: [lldb] Make GetDIENamesAndRanges() allow 0-valued decl and call lines
In an upcoming patch, D142556, Clang is proposed to be changed to emit
line locations that are inlined at line 0. This clashed with the behavior of
GetDIENamesAndRanges() which used 0 as a default value to determine if
file, line or column numbers had been set. Users of that function then
checked for any non-0 values when setting up the call site:
if (call_file != 0 || call_line != 0 || call_column != 0)
[...]
which did not work with the Clang change since all three values then
could be 0.
This changes the function to use std::optional to catch non-set values
instead.
Reviewed By: clayborg
Differential Revision: https://reviews.llvm.org/D142552
Added:
lldb/test/Shell/SymbolFile/DWARF/Inputs/inlined-file0-line0-col0.yaml
lldb/test/Shell/SymbolFile/DWARF/inlined-file0-line0-col0.test
Modified:
lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h
lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
Removed:
################################################################################
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
index ca0982c1f900..cf794854c843 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
@@ -2394,12 +2394,12 @@ DWARFASTParserClang::ParseFunctionFromDWARF(CompileUnit &comp_unit,
DWARFRangeList func_ranges;
const char *name = nullptr;
const char *mangled = nullptr;
- int decl_file = 0;
- int decl_line = 0;
- int decl_column = 0;
- int call_file = 0;
- int call_line = 0;
- int call_column = 0;
+ std::optional<int> decl_file;
+ std::optional<int> decl_line;
+ std::optional<int> decl_column;
+ std::optional<int> call_file;
+ std::optional<int> call_line;
+ std::optional<int> call_column;
DWARFExpressionList frame_base;
const dw_tag_t tag = die.Tag();
@@ -2429,9 +2429,10 @@ DWARFASTParserClang::ParseFunctionFromDWARF(CompileUnit &comp_unit,
FunctionSP func_sp;
std::unique_ptr<Declaration> decl_up;
- if (decl_file != 0 || decl_line != 0 || decl_column != 0)
- decl_up = std::make_unique<Declaration>(die.GetCU()->GetFile(decl_file),
- decl_line, decl_column);
+ if (decl_file || decl_line || decl_column)
+ decl_up = std::make_unique<Declaration>(
+ die.GetCU()->GetFile(decl_file ? *decl_file : 0),
+ decl_line ? *decl_line : 0, decl_column ? *decl_column : 0);
SymbolFileDWARF *dwarf = die.GetDWARF();
// Supply the type _only_ if it has already been parsed
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
index 7b9da6fa166f..65fab503deb2 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp
@@ -439,8 +439,9 @@ bool DWARFDIE::IsMethod() const {
bool DWARFDIE::GetDIENamesAndRanges(
const char *&name, const char *&mangled, DWARFRangeList &ranges,
- int &decl_file, int &decl_line, int &decl_column, int &call_file,
- int &call_line, int &call_column,
+ std::optional<int> &decl_file, std::optional<int> &decl_line,
+ std::optional<int> &decl_column, std::optional<int> &call_file,
+ std::optional<int> &call_line, std::optional<int> &call_column,
lldb_private::DWARFExpressionList *frame_base) const {
if (IsValid()) {
return m_die->GetDIENamesAndRanges(
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
index 3564f757dbd8..031ea26ad405 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h
@@ -83,12 +83,12 @@ class DWARFDIE : public DWARFBaseDIE {
DWARFDIE
GetAttributeValueAsReferenceDIE(const dw_attr_t attr) const;
- bool
- GetDIENamesAndRanges(const char *&name, const char *&mangled,
- DWARFRangeList &ranges, int &decl_file, int &decl_line,
- int &decl_column, int &call_file, int &call_line,
- int &call_column,
- lldb_private::DWARFExpressionList *frame_base) const;
+ bool GetDIENamesAndRanges(
+ const char *&name, const char *&mangled, DWARFRangeList &ranges,
+ std::optional<int> &decl_file, std::optional<int> &decl_line,
+ std::optional<int> &decl_column, std::optional<int> &call_file,
+ std::optional<int> &call_line, std::optional<int> &call_column,
+ lldb_private::DWARFExpressionList *frame_base) const;
/// The range of all the children of this DIE.
llvm::iterator_range<child_iterator> children() const;
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
index d1450d90dce1..bd2bb3d839c6 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp
@@ -234,9 +234,10 @@ static DWARFRangeList GetRangesOrReportError(DWARFUnit &unit,
// DW_AT_low_pc/DW_AT_high_pc pair, DW_AT_entry_pc, or DW_AT_ranges attributes.
bool DWARFDebugInfoEntry::GetDIENamesAndRanges(
DWARFUnit *cu, const char *&name, const char *&mangled,
- DWARFRangeList &ranges, int &decl_file, int &decl_line, int &decl_column,
- int &call_file, int &call_line, int &call_column,
- DWARFExpressionList *frame_base) const {
+ DWARFRangeList &ranges, std::optional<int> &decl_file,
+ std::optional<int> &decl_line, std::optional<int> &decl_column,
+ std::optional<int> &call_file, std::optional<int> &call_line,
+ std::optional<int> &call_column, DWARFExpressionList *frame_base) const {
dw_addr_t lo_pc = LLDB_INVALID_ADDRESS;
dw_addr_t hi_pc = LLDB_INVALID_ADDRESS;
std::vector<DWARFDIE> dies;
@@ -315,32 +316,32 @@ bool DWARFDebugInfoEntry::GetDIENamesAndRanges(
break;
case DW_AT_decl_file:
- if (decl_file == 0)
+ if (!decl_file)
decl_file = form_value.Unsigned();
break;
case DW_AT_decl_line:
- if (decl_line == 0)
+ if (!decl_line)
decl_line = form_value.Unsigned();
break;
case DW_AT_decl_column:
- if (decl_column == 0)
+ if (!decl_column)
decl_column = form_value.Unsigned();
break;
case DW_AT_call_file:
- if (call_file == 0)
+ if (!call_file)
call_file = form_value.Unsigned();
break;
case DW_AT_call_line:
- if (call_line == 0)
+ if (!call_line)
call_line = form_value.Unsigned();
break;
case DW_AT_call_column:
- if (call_column == 0)
+ if (!call_column)
call_column = form_value.Unsigned();
break;
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h
index 67bd0c2f3cca..e1378952efbc 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h
@@ -103,8 +103,10 @@ class DWARFDebugInfoEntry {
bool GetDIENamesAndRanges(
DWARFUnit *cu, const char *&name, const char *&mangled,
- DWARFRangeList &rangeList, int &decl_file, int &decl_line,
- int &decl_column, int &call_file, int &call_line, int &call_column,
+ DWARFRangeList &rangeList, std::optional<int> &decl_file,
+ std::optional<int> &decl_line, std::optional<int> &decl_column,
+ std::optional<int> &call_file, std::optional<int> &call_line,
+ std::optional<int> &call_column,
lldb_private::DWARFExpressionList *frame_base = nullptr) const;
const DWARFAbbreviationDeclaration *
diff --git a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
index 689046443bdd..99a0152eaf6e 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp
@@ -1284,12 +1284,12 @@ size_t SymbolFileDWARF::ParseBlocksRecursive(
const char *name = nullptr;
const char *mangled_name = nullptr;
- int decl_file = 0;
- int decl_line = 0;
- int decl_column = 0;
- int call_file = 0;
- int call_line = 0;
- int call_column = 0;
+ std::optional<int> decl_file;
+ std::optional<int> decl_line;
+ std::optional<int> decl_column;
+ std::optional<int> call_file;
+ std::optional<int> call_line;
+ std::optional<int> call_column;
if (die.GetDIENamesAndRanges(name, mangled_name, ranges, decl_file,
decl_line, decl_column, call_file, call_line,
call_column, nullptr)) {
@@ -1332,16 +1332,18 @@ size_t SymbolFileDWARF::ParseBlocksRecursive(
if (tag != DW_TAG_subprogram &&
(name != nullptr || mangled_name != nullptr)) {
std::unique_ptr<Declaration> decl_up;
- if (decl_file != 0 || decl_line != 0 || decl_column != 0)
+ if (decl_file || decl_line || decl_column)
decl_up = std::make_unique<Declaration>(
- comp_unit.GetSupportFiles().GetFileSpecAtIndex(decl_file),
- decl_line, decl_column);
+ comp_unit.GetSupportFiles().GetFileSpecAtIndex(
+ decl_file ? *decl_file : 0),
+ decl_line ? *decl_line : 0, decl_column ? *decl_column : 0);
std::unique_ptr<Declaration> call_up;
- if (call_file != 0 || call_line != 0 || call_column != 0)
+ if (call_file || call_line || call_column)
call_up = std::make_unique<Declaration>(
- comp_unit.GetSupportFiles().GetFileSpecAtIndex(call_file),
- call_line, call_column);
+ comp_unit.GetSupportFiles().GetFileSpecAtIndex(
+ call_file ? *call_file : 0),
+ call_line ? *call_line : 0, call_column ? *call_column : 0);
block->SetInlinedFunctionInfo(name, mangled_name, decl_up.get(),
call_up.get());
diff --git a/lldb/test/Shell/SymbolFile/DWARF/Inputs/inlined-file0-line0-col0.yaml b/lldb/test/Shell/SymbolFile/DWARF/Inputs/inlined-file0-line0-col0.yaml
new file mode 100644
index 000000000000..0064b73c6969
--- /dev/null
+++ b/lldb/test/Shell/SymbolFile/DWARF/Inputs/inlined-file0-line0-col0.yaml
@@ -0,0 +1,699 @@
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x1000007
+ cpusubtype: 0x3
+ filetype: 0x1
+ ncmds: 3
+ sizeofcmds: 736
+ flags: 0x2000
+ reserved: 0x0
+LoadCommands:
+ - cmd: LC_SEGMENT_64
+ cmdsize: 632
+ segname: ''
+ vmaddr: 0
+ vmsize: 814
+ fileoff: 768
+ filesize: 814
+ maxprot: 7
+ initprot: 7
+ nsects: 7
+ flags: 0
+ Sections:
+ - sectname: __text
+ segname: __TEXT
+ addr: 0x0
+ size: 31
+ offset: 0x300
+ align: 4
+ reloff: 0x630
+ nreloc: 3
+ flags: 0x80000400
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: 554889E5833DFFFFFFFF067D0D833DFFFFFFFF067D0431C05DC3E800000000
+ relocations:
+ - address: 0x1B
+ symbolnum: 3
+ pcrel: true
+ length: 2
+ extern: true
+ type: 2
+ scattered: false
+ value: 0
+ - address: 0xF
+ symbolnum: 1
+ pcrel: true
+ length: 2
+ extern: true
+ type: 6
+ scattered: false
+ value: 0
+ - address: 0x6
+ symbolnum: 0
+ pcrel: true
+ length: 2
+ extern: true
+ type: 6
+ scattered: false
+ value: 0
+ - sectname: __data
+ segname: __DATA
+ addr: 0x20
+ size: 8
+ offset: 0x320
+ align: 2
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x0
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: '0400000006000000'
+ - sectname: __debug_abbrev
+ segname: __DWARF
+ addr: 0x28
+ size: 182
+ offset: 0x328
+ align: 0
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x2000000
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ - sectname: __debug_info
+ segname: __DWARF
+ addr: 0xDE
+ size: 300
+ offset: 0x3DE
+ align: 0
+ reloff: 0x648
+ nreloc: 11
+ flags: 0x2000000
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ relocations:
+ - address: 0x11B
+ symbolnum: 1
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - address: 0x106
+ symbolnum: 1
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - address: 0xF3
+ symbolnum: 1
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - address: 0xDE
+ symbolnum: 1
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - address: 0xCA
+ symbolnum: 1
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - address: 0xB5
+ symbolnum: 1
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - address: 0xA1
+ symbolnum: 1
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - address: 0x84
+ symbolnum: 1
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - address: 0x53
+ symbolnum: 2
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - address: 0x37
+ symbolnum: 2
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - address: 0x1E
+ symbolnum: 1
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - sectname: __debug_str
+ segname: __DWARF
+ addr: 0x20A
+ size: 106
+ offset: 0x50A
+ align: 0
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x2000000
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ - sectname: __eh_frame
+ segname: __TEXT
+ addr: 0x278
+ size: 72
+ offset: 0x578
+ align: 3
+ reloff: 0x0
+ nreloc: 0
+ flags: 0x6800000B
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ content: 1400000000000000017A520001781001100C0708900100002C0000001C00000068FDFFFFFFFFFFFF1F0000000000000000410E108602430D06550C0708410C061000000000000000
+ - sectname: __debug_line
+ segname: __DWARF
+ addr: 0x2C0
+ size: 110
+ offset: 0x5C0
+ align: 0
+ reloff: 0x6A0
+ nreloc: 1
+ flags: 0x2000000
+ reserved1: 0x0
+ reserved2: 0x0
+ reserved3: 0x0
+ relocations:
+ - address: 0x3F
+ symbolnum: 1
+ pcrel: false
+ length: 3
+ extern: false
+ type: 0
+ scattered: false
+ value: 0
+ - cmd: LC_SYMTAB
+ cmdsize: 24
+ symoff: 1704
+ nsyms: 4
+ stroff: 1768
+ strsize: 24
+ - cmd: LC_DYSYMTAB
+ cmdsize: 80
+ ilocalsym: 0
+ nlocalsym: 0
+ iextdefsym: 0
+ nextdefsym: 3
+ iundefsym: 3
+ nundefsym: 1
+ tocoff: 0
+ ntoc: 0
+ modtaboff: 0
+ nmodtab: 0
+ extrefsymoff: 0
+ nextrefsyms: 0
+ indirectsymoff: 0
+ nindirectsyms: 0
+ extreloff: 0
+ nextrel: 0
+ locreloff: 0
+ nlocrel: 0
+LinkEditData:
+ NameList:
+ - n_strx: 18
+ n_type: 0xF
+ n_sect: 2
+ n_desc: 0
+ n_value: 32
+ - n_strx: 14
+ n_type: 0xF
+ n_sect: 2
+ n_desc: 0
+ n_value: 36
+ - n_strx: 8
+ n_type: 0xF
+ n_sect: 1
+ n_desc: 0
+ n_value: 0
+ - n_strx: 1
+ n_type: 0x1
+ n_sect: 0
+ n_desc: 0
+ n_value: 0
+ StringTable:
+ - ''
+ - _abort
+ - _main
+ - _g2
+ - _g1
+ - ''
+ - ''
+DWARF:
+ debug_str:
+ - clang version 16.0.0.prerel
+ - inlined-file0-line0-col0.c
+ - '/tmp/tmp.o5FdSk4Xkz'
+ - g1
+ - int
+ - g2
+ - bar
+ - q
+ - foo
+ - abort
+ - main
+ debug_abbrev:
+ - ID: 0
+ Table:
+ - Code: 0x1
+ Tag: DW_TAG_compile_unit
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_producer
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_language
+ Form: DW_FORM_data2
+ - Attribute: DW_AT_name
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_stmt_list
+ Form: DW_FORM_sec_offset
+ - Attribute: DW_AT_comp_dir
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_low_pc
+ Form: DW_FORM_addr
+ - Attribute: DW_AT_high_pc
+ Form: DW_FORM_data4
+ - Code: 0x2
+ Tag: DW_TAG_variable
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_name
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_type
+ Form: DW_FORM_ref4
+ - Attribute: DW_AT_external
+ Form: DW_FORM_flag_present
+ - Attribute: DW_AT_decl_file
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_decl_line
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_location
+ Form: DW_FORM_exprloc
+ - Code: 0x3
+ Tag: DW_TAG_base_type
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_name
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_encoding
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_byte_size
+ Form: DW_FORM_data1
+ - Code: 0x4
+ Tag: DW_TAG_subprogram
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_name
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_decl_file
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_decl_line
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_prototyped
+ Form: DW_FORM_flag_present
+ - Attribute: DW_AT_external
+ Form: DW_FORM_flag_present
+ - Attribute: DW_AT_inline
+ Form: DW_FORM_data1
+ - Code: 0x5
+ Tag: DW_TAG_formal_parameter
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_name
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_decl_file
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_decl_line
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_type
+ Form: DW_FORM_ref4
+ - Code: 0x6
+ Tag: DW_TAG_subprogram
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_low_pc
+ Form: DW_FORM_addr
+ - Attribute: DW_AT_high_pc
+ Form: DW_FORM_data4
+ - Attribute: DW_AT_frame_base
+ Form: DW_FORM_exprloc
+ - Attribute: DW_AT_GNU_all_call_sites
+ Form: DW_FORM_flag_present
+ - Attribute: DW_AT_name
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_decl_file
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_decl_line
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_type
+ Form: DW_FORM_ref4
+ - Attribute: DW_AT_external
+ Form: DW_FORM_flag_present
+ - Code: 0x7
+ Tag: DW_TAG_inlined_subroutine
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_abstract_origin
+ Form: DW_FORM_ref4
+ - Attribute: DW_AT_low_pc
+ Form: DW_FORM_addr
+ - Attribute: DW_AT_high_pc
+ Form: DW_FORM_data4
+ - Attribute: DW_AT_call_file
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_call_line
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_call_column
+ Form: DW_FORM_data1
+ - Code: 0x8
+ Tag: DW_TAG_inlined_subroutine
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_abstract_origin
+ Form: DW_FORM_ref4
+ - Attribute: DW_AT_low_pc
+ Form: DW_FORM_addr
+ - Attribute: DW_AT_high_pc
+ Form: DW_FORM_data4
+ - Attribute: DW_AT_call_file
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_call_line
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_call_column
+ Form: DW_FORM_data1
+ - Code: 0x9
+ Tag: DW_TAG_inlined_subroutine
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_abstract_origin
+ Form: DW_FORM_ref4
+ - Attribute: DW_AT_low_pc
+ Form: DW_FORM_addr
+ - Attribute: DW_AT_high_pc
+ Form: DW_FORM_data4
+ - Attribute: DW_AT_call_file
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_call_line
+ Form: DW_FORM_data1
+ - Code: 0xA
+ Tag: DW_TAG_GNU_call_site
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_abstract_origin
+ Form: DW_FORM_ref4
+ - Attribute: DW_AT_low_pc
+ Form: DW_FORM_addr
+ - Code: 0xB
+ Tag: DW_TAG_subprogram
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_name
+ Form: DW_FORM_strp
+ - Attribute: DW_AT_decl_file
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_decl_line
+ Form: DW_FORM_data1
+ - Attribute: DW_AT_prototyped
+ Form: DW_FORM_flag_present
+ - Attribute: DW_AT_declaration
+ Form: DW_FORM_flag_present
+ - Attribute: DW_AT_external
+ Form: DW_FORM_flag_present
+ - Attribute: DW_AT_noreturn
+ Form: DW_FORM_flag_present
+ debug_info:
+ - Length: 0x128
+ Version: 4
+ AbbrevTableID: 0
+ AbbrOffset: 0x0
+ AddrSize: 8
+ Entries:
+ - AbbrCode: 0x1
+ Values:
+ - Value: 0x0
+ - Value: 0x1D
+ - Value: 0x1C
+ - Value: 0x0
+ - Value: 0x37
+ - Value: 0x0
+ - Value: 0x1F
+ - AbbrCode: 0x2
+ Values:
+ - Value: 0x4B
+ - Value: 0x3F
+ - Value: 0x1
+ - Value: 0x1
+ - Value: 0x2
+ - Value: 0x9
+ BlockData: [ 0x3, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0 ]
+ - AbbrCode: 0x3
+ Values:
+ - Value: 0x4E
+ - Value: 0x5
+ - Value: 0x4
+ - AbbrCode: 0x2
+ Values:
+ - Value: 0x52
+ - Value: 0x3F
+ - Value: 0x1
+ - Value: 0x1
+ - Value: 0x2
+ - Value: 0x9
+ BlockData: [ 0x3, 0x24, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
+ 0x0 ]
+ - AbbrCode: 0x4
+ Values:
+ - Value: 0x55
+ - Value: 0x1
+ - Value: 0x4
+ - Value: 0x1
+ - Value: 0x1
+ - Value: 0x1
+ - AbbrCode: 0x5
+ Values:
+ - Value: 0x59
+ - Value: 0x1
+ - Value: 0x4
+ - Value: 0x3F
+ - AbbrCode: 0x0
+ - AbbrCode: 0x4
+ Values:
+ - Value: 0x5B
+ - Value: 0x1
+ - Value: 0x9
+ - Value: 0x1
+ - Value: 0x1
+ - Value: 0x1
+ - AbbrCode: 0x5
+ Values:
+ - Value: 0x59
+ - Value: 0x1
+ - Value: 0x9
+ - Value: 0x3F
+ - AbbrCode: 0x0
+ - AbbrCode: 0x6
+ Values:
+ - Value: 0x0
+ - Value: 0x1F
+ - Value: 0x1
+ BlockData: [ 0x56 ]
+ - Value: 0x1
+ - Value: 0x65
+ - Value: 0x1
+ - Value: 0xD
+ - Value: 0x3F
+ - Value: 0x1
+ - AbbrCode: 0x7
+ Values:
+ - Value: 0x6F
+ - Value: 0x4
+ - Value: 0x9
+ - Value: 0x1
+ - Value: 0xE
+ - Value: 0x3
+ - AbbrCode: 0x8
+ Values:
+ - Value: 0x5B
+ - Value: 0x4
+ - Value: 0x9
+ - Value: 0x1
+ - Value: 0xA
+ - Value: 0x3
+ - AbbrCode: 0x0
+ - AbbrCode: 0x7
+ Values:
+ - Value: 0x6F
+ - Value: 0xD
+ - Value: 0x9
+ - Value: 0x1
+ - Value: 0xF
+ - Value: 0x3
+ - AbbrCode: 0x8
+ Values:
+ - Value: 0x5B
+ - Value: 0xD
+ - Value: 0x9
+ - Value: 0x1
+ - Value: 0xA
+ - Value: 0x3
+ - AbbrCode: 0x0
+ - AbbrCode: 0x9
+ Values:
+ - Value: 0x6F
+ - Value: 0x1A
+ - Value: 0x5
+ - Value: 0x1
+ - Value: 0x0
+ - AbbrCode: 0x8
+ Values:
+ - Value: 0x5B
+ - Value: 0x1A
+ - Value: 0x5
+ - Value: 0x1
+ - Value: 0xA
+ - Value: 0x3
+ - AbbrCode: 0x0
+ - AbbrCode: 0xA
+ Values:
+ - Value: 0x124
+ - Value: 0x1F
+ - AbbrCode: 0x0
+ - AbbrCode: 0xB
+ Values:
+ - Value: 0x5F
+ - Value: 0x1
+ - Value: 0x1
+ - Value: 0x1
+ - Value: 0x1
+ - Value: 0x1
+ - Value: 0x1
+ - AbbrCode: 0x0
+ debug_line:
+ - Length: 106
+ Version: 4
+ PrologueLength: 50
+ MinInstLength: 1
+ MaxOpsPerInst: 1
+ DefaultIsStmt: 1
+ LineBase: 251
+ LineRange: 14
+ OpcodeBase: 13
+ StandardOpcodeLengths: [ 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 1 ]
+ Files:
+ - Name: inlined-file0-line0-col0.c
+ DirIdx: 0
+ ModTime: 0
+ Length: 0
+ Opcodes:
+ - Opcode: DW_LNS_extended_op
+ ExtLen: 9
+ SubOpcode: DW_LNE_set_address
+ Data: 0
+ - Opcode: DW_LNS_advance_line
+ SData: 12
+ Data: 0
+ - Opcode: DW_LNS_copy
+ Data: 0
+ - Opcode: DW_LNS_set_column
+ Data: 9
+ - Opcode: DW_LNS_set_prologue_end
+ Data: 0
+ - Opcode: DW_LNS_advance_line
+ SData: -8
+ Data: 0
+ - Opcode: 0x4A
+ Data: 0
+ - Opcode: DW_LNS_set_column
+ Data: 7
+ - Opcode: DW_LNS_negate_stmt
+ Data: 0
+ - Opcode: 0x74
+ Data: 0
+ - Opcode: DW_LNS_set_column
+ Data: 9
+ - Opcode: 0x2E
+ Data: 0
+ - Opcode: DW_LNS_set_column
+ Data: 7
+ - Opcode: 0x74
+ Data: 0
+ - Opcode: DW_LNS_set_column
+ Data: 3
+ - Opcode: DW_LNS_negate_stmt
+ Data: 0
+ - Opcode: DW_LNS_advance_line
+ SData: 11
+ Data: 0
+ - Opcode: 0x2E
+ Data: 0
+ - Opcode: DW_LNS_negate_stmt
+ Data: 0
+ - Opcode: DW_LNS_set_epilogue_begin
+ Data: 0
+ - Opcode: 0x2E
+ Data: 0
+ - Opcode: DW_LNS_set_column
+ Data: 5
+ - Opcode: DW_LNS_negate_stmt
+ Data: 0
+ - Opcode: DW_LNS_advance_line
+ SData: -10
+ Data: 0
+ - Opcode: 0x2E
+ Data: 0
+ - Opcode: DW_LNS_advance_pc
+ Data: 5
+ - Opcode: DW_LNS_extended_op
+ ExtLen: 1
+ SubOpcode: DW_LNE_end_sequence
+ Data: 0
+...
diff --git a/lldb/test/Shell/SymbolFile/DWARF/inlined-file0-line0-col0.test b/lldb/test/Shell/SymbolFile/DWARF/inlined-file0-line0-col0.test
new file mode 100644
index 000000000000..cd56e6715f5a
--- /dev/null
+++ b/lldb/test/Shell/SymbolFile/DWARF/inlined-file0-line0-col0.test
@@ -0,0 +1,34 @@
+# RUN: yaml2obj %S/Inputs/inlined-file0-line0-col0.yaml -o %t
+# RUN: %lldb %t -s %s -o exit | FileCheck %s
+
+# 1 void abort(void);
+# 2 int g1 = 4, g2 = 6;
+# 3
+# 4 inline __attribute__((always_inline)) void bar(int q) {
+# 5 if (q > 5)
+# 6 abort();
+# 7 }
+# 8
+# 9 inline __attribute__((always_inline)) void foo(int q) {
+# 10 bar(q);
+# 11 }
+# 12
+# 13 int main() {
+# 14 foo(g1);
+# 15 foo(g2);
+# 16 return 0;
+# 17 }
+
+# The input object file contains a single abort invocation for the two inlined
+# instances of foo() in main() at line 0. As the file, line and column numbers
+# are all 0, file and line number information would be missing for foo and main
+# in the lookup information.
+#
+# A line number 0 is not printed for main in this case, but the same holds
+# for a non-inlined location with line number 0.
+
+# CHECK: Summary: inlined-file0-line0-col0.test.tmp`main + 30 [inlined] bar + 4 at inlined-file0-line0-col0.c:6:5
+# CHECK-NEXT: inlined-file0-line0-col0.test.tmp`main + 26 [inlined] foo at inlined-file0-line0-col0.c:10:3
+# CHECK-NEXT: inlined-file0-line0-col0.test.tmp`main + 26 at inlined-file0-line0-col0.c
+
+image lookup -a 0x1e
More information about the lldb-commits
mailing list