diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp @@ -2394,12 +2394,12 @@ 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 @@ 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.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.h @@ -83,12 +83,12 @@ 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/DWARFDIE.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDIE.cpp @@ -439,8 +439,9 @@ 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/DWARFDebugInfoEntry.h b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.h @@ -103,8 +103,10 @@ 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/DWARFDebugInfoEntry.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp --- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfoEntry.cpp @@ -234,9 +234,10 @@ // 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 @@ 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/SymbolFileDWARF.cpp b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp --- a/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp +++ b/lldb/source/Plugins/SymbolFile/DWARF/SymbolFileDWARF.cpp @@ -1284,12 +1284,12 @@ 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 @@ 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 --- /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 --- /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