diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp @@ -1230,13 +1230,17 @@ StringRef IncludeDir; // Be defensive about the contents of Entry. if (getVersion() >= 5) { - if (Entry.DirIdx < IncludeDirectories.size()) + // DirIdx 0 is the compilation directory, so don't include it for + // relative names. + if ((Entry.DirIdx != 0 || Kind != FileLineInfoKind::RelativeFilePath) && + Entry.DirIdx < IncludeDirectories.size()) IncludeDir = IncludeDirectories[Entry.DirIdx].getAsCString().getValue(); } else { if (0 < Entry.DirIdx && Entry.DirIdx <= IncludeDirectories.size()) IncludeDir = IncludeDirectories[Entry.DirIdx - 1].getAsCString().getValue(); } + // For absolute paths only, include the compilation directory of compile unit. // We know that FileName is not absolute, the only way to have an absolute // path at this point would be if IncludeDir is absolute. diff --git a/llvm/test/tools/llvm-symbolizer/relativenames.s b/llvm/test/tools/llvm-symbolizer/relativenames.s --- a/llvm/test/tools/llvm-symbolizer/relativenames.s +++ b/llvm/test/tools/llvm-symbolizer/relativenames.s @@ -1,18 +1,108 @@ # REQUIRES: x86-registered-target -foo: - nop +## Test that the relative names option to llvm-symbolizer works properly. +## See llvm/docs/CommandGuide/llvm-symbolizer.rst for commands +## that would produce this test case -# RUN: llvm-mc --filetype=obj --triple=x86_64-pc-linux %s -o %t.o -g +# RUN: llvm-mc %s -filetype obj -triple x86_64-pc-linux -o %t.o # RUN: llvm-symbolizer 0 --relativenames --obj=%t.o \ # RUN: | FileCheck %s -DDIR=%p --check-prefix=RELATIVENAMES +## Sanity check for default. +# RUN: llvm-symbolizer 0 --obj=%t.o \ +# RUN: | FileCheck %s -DDIR=%p --check-prefix=ABSOLUTENAMES + ## Ensure last option wins. # RUN: llvm-symbolizer 0 --basenames --relativenames --obj=%t.o \ # RUN: | FileCheck %s -DDIR=%p --check-prefix=RELATIVENAMES # RUN: llvm-symbolizer 0 --relativenames --basenames --obj=%t.o \ # RUN: | FileCheck %s --check-prefix=BASENAMES -# RELATIVENAMES: [[DIR]]{{\\|/}}relativenames.s:4 +# ABSOLUTENAMES: {{\\|/}}tmp{{\\|/}}foo{{\\|/}}relativenames.s:4 +# RELATIVENAMES: {{^}}foo{{\\|/}}relativenames.s:4 # BASENAMES: {{^}}relativenames.s:4 + +## Provide just enough info in debug info for the symbolizer +## to find the line table. +.section .debug_abbrev,"",@progbits + .byte 0x01 ## Abbreviation Code + .byte 0x11 ## DW_TAG_compile_unit + .byte 0x01 ## DW_CHILDREN_yes + .byte 0x10 ## DW_AT_stmt_list + .byte 0x17 ## DW_FORM_sec_offset + .byte 0x11 ## DW_AT_low_pc + .byte 0x01 ## DW_FORM_addr + .byte 0x12 ## DW_AT_high_pc + .byte 0x01 ## DW_FORM_addr + .byte 0x1b ## DW_AT_comp_dir + .byte 0x08 ## DW_FORM_string + .byte 0x03 ## DW_AT_name + .byte 0x08 ## DW_FORM_string + .byte 0x00 ## EOM(1) + .byte 0x00 ## EOM(2) + .byte 0x02 ## Abbreviation Code + .byte 0x2e ## DW_TAG_subprogram + .byte 0x0 ## DW_CHILDREN_no + .byte 0x11 ## DW_AT_low_pc + .byte 0x01 ## DW_FORM_addr + .byte 0x12 ## DW_AT_high_pc + .byte 0x01 ## DW_FORM_addr + .byte 0x00 ## EOM(1) + .byte 0x00 ## EOM(2) + .byte 0x00 ## EOM(3) + +.section .debug_info,"",@progbits + .long .Ldebug_info_end-.Ldebug_info_start ## length +.Ldebug_info_start: + .short 0x05 ## version + .byte 0x01 ## DW_TAG_compile_unit + .byte 0x08 ## address size + .long .debug_abbrev ## offset into abbrev section + .byte 0x01 ## cu abbrev code + .long .debug_line ## DW_AT_stmt_list + .quad 0x00 ## DW_AT_low_pc + .quad 0x01 ## DW_AT_high_pc + .asciz "/tmp" ## DW_AT_comp_dir + .asciz "foo/relativenames.s" ## DW_AT_name + .byte 0x02 ## subprog abbrev code + .quad 0x00 ## DW_AT_low_pc + .quad 0x01 ## DW_AT_high_pc +.Ldebug_info_end: + + +.section .debug_line,"",@progbits + .long .Lunit_end - .Lunit_begin ## unit_length +.Lunit_begin: + .short 0x05 ## version + .byte 0x08 ## address_size + .byte 0x00 ## segment_selector_size + .long .Lheader_end - .Lheader_begin ## header_length +.Lheader_begin: + .byte 0x01 ## minimum_instruction_length + .byte 0x01 ## maximum_operations_per_instruction + .byte 0x01 ## default_is_stmt + .byte 0xfb ## line_base + .byte 0x0e ## line_range + .byte 0x0d ## opcode_base and lengths + .byte 0x00, 0x01, 0x01, 0x01, 0x01, 0x00 + .byte 0x00, 0x00, 0x01, 0x00, 0x00, 0x01 + .byte 0x01 ## directory entry format count + .byte 0x01, 0x8 ## DW_LNCT_path, DW_FORM_string + .byte 0x01 ## directories count + .asciz "/tmp" ## directory entry 0 + .byte 0x02 ## file_name_entry_format_count + .byte 0x02, 0x0B ## DW_LNCT_directory_index, DW_FORM_data1 + .byte 0x01, 0x08 ## DW_LNCT_path, DW_FORM_string + .byte 0x01 ## filname count + .byte 0x00 ## directory index + .asciz "foo/relativenames.s" +.Lheader_end: + .byte 0x04, 0x00 ## set file to zero + ## set address to 0x0 + .byte 0x00, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00 + .byte 0x00, 0x00, 0x00, 0x00 + .byte 0x15 ## Advance Address by 0 and line by 3 + .byte 0x02, 0x01 ## Advance PC by 1 + .byte 0x0, 0x1, 0x1 ## DW_LNE_end_sequence +.Lunit_end: