diff options
| author | Fangrui Song <maskray@google.com> | 2019-05-06 08:03:46 +0000 |
|---|---|---|
| committer | Fangrui Song <maskray@google.com> | 2019-05-06 08:03:46 +0000 |
| commit | 7e55672b225640fa19f92e9ae73f53d0718b3ad6 (patch) | |
| tree | d9c03512d970075f4123b89b10b9fd175c58dee8 | |
| parent | 2a0cfcce6a272f64432d6eb18fa922e6f4631f77 (diff) | |
| download | bcm5719-llvm-7e55672b225640fa19f92e9ae73f53d0718b3ad6.tar.gz bcm5719-llvm-7e55672b225640fa19f92e9ae73f53d0718b3ad6.zip | |
DWARF v5: fix directory index in the line table
Summary:
Prior to DWARF v5, a directory index of 0 represents DW_AT_comp_dir.
In DWARF v5, the index starts with 0 and Entry.DirIdx is the index into
Prologue.IncludeDirectories.
Reviewed By: labath
Differential Revision: https://reviews.llvm.org/D61253
llvm-svn: 360015
| -rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp | 28 | ||||
| -rw-r--r-- | llvm/test/DebugInfo/symbolize-directory.s | 62 |
2 files changed, 78 insertions, 12 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp index 1f18973f1d4..9f9aaabf1e8 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp @@ -1020,20 +1020,24 @@ bool DWARFDebugLine::LineTable::getFileNameByIndex(uint64_t FileIndex, } SmallString<16> FilePath; - uint64_t IncludeDirIndex = Entry.DirIdx; StringRef IncludeDir; // Be defensive about the contents of Entry. - if (IncludeDirIndex > 0 && - IncludeDirIndex <= Prologue.IncludeDirectories.size()) - IncludeDir = Prologue.IncludeDirectories[IncludeDirIndex - 1] - .getAsCString() - .getValue(); - - // We may still need to append 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. - if (CompDir && !isPathAbsoluteOnWindowsOrPosix(IncludeDir)) - sys::path::append(FilePath, CompDir); + if (Prologue.getVersion() >= 5) { + if (Entry.DirIdx < Prologue.IncludeDirectories.size()) + IncludeDir = + Prologue.IncludeDirectories[Entry.DirIdx].getAsCString().getValue(); + } else { + if (0 < Entry.DirIdx && Entry.DirIdx <= Prologue.IncludeDirectories.size()) + IncludeDir = Prologue.IncludeDirectories[Entry.DirIdx - 1] + .getAsCString() + .getValue(); + + // We may still need to append 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. + if (CompDir && !isPathAbsoluteOnWindowsOrPosix(IncludeDir)) + sys::path::append(FilePath, CompDir); + } // sys::path::append skips empty strings. sys::path::append(FilePath, IncludeDir, FileName); diff --git a/llvm/test/DebugInfo/symbolize-directory.s b/llvm/test/DebugInfo/symbolize-directory.s new file mode 100644 index 00000000000..5dbd0b57ca6 --- /dev/null +++ b/llvm/test/DebugInfo/symbolize-directory.s @@ -0,0 +1,62 @@ +# REQUIRES: x86-registered-target + +# RUN: llvm-mc -filetype=obj -triple=x86_64 -dwarf-version=5 %s -o %t.o +# RUN: llvm-symbolizer --obj=%t.o --functions=none 0 1 | FileCheck %s + +# CHECK: /home/0.cc:1:0 +# CHECK: /tmp/1.cc:2:1 + +.Lfunc_begin0: + .file 0 "/home" "0.cc" + .file 1 "/tmp" "1.cc" + .loc 0 1 0 # 0.cc:1:0 + nop + .loc 1 2 1 # 1.cc:2:1 + nop + .loc 0 1 1 prologue_end # 0.cc:1:1 +.Lfunc_end0: + +.section .debug_abbrev,"",@progbits + .byte 1 # Abbreviation Code + .byte 17 # DW_TAG_compile_unit + .byte 1 # DW_children_yes + .byte 16 # DW_AT_stmt_list + .byte 23 # DW_FROM_sec_offset + .byte 17 # DW_AT_low_pc + .byte 1 # DW_FORM_addr + .byte 18 # DW_AT_high_pc + .byte 6 # DW_FORM_data4 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + + .byte 2 # Abbreviation Code + .byte 46 # DW_TAG_subprogram + .byte 0 # DW_children_no + .byte 3 # DW_AT_name + .byte 8 # DW_FORM_string + .byte 17 # DW_AT_low_pc + .byte 1 # DW_FORM_addr + .byte 18 # DW_AT_high_pc + .byte 6 # DW_FORM_data4 + .byte 0 # EOM(1) + .byte 0 # EOM(2) + + .byte 0 # EOM(3) + +.section .debug_info,"",@progbits +.Lcu_begin0: + .long .Lcu_end0-.Lcu_begin0-4 # Length of Unit + .short 5 # DWARF version number + .byte 1 # DWARF Unit Type + .byte 8 # Address Size (in bytes) + .long .debug_abbrev # Offset Into Abbrev. + .byte 1 # Abbrev [1] + .long 0 # DW_AT_stmt_list + .quad 0 # DW_AT_low_pc + .long 2 # DW_AT_high_pc + .byte 2 # Abbrev [2] DW_TAG_subprogram + .asciz "0.c" # DW_AT_name + .quad 0 # DW_AT_low_pc + .long 2 # DW_AT_high_pc + .byte 0 +.Lcu_end0: |

