diff options
author | Eugene Zemtsov <ezemtsov@google.com> | 2018-03-13 17:54:29 +0000 |
---|---|---|
committer | Eugene Zemtsov <ezemtsov@google.com> | 2018-03-13 17:54:29 +0000 |
commit | 82d60d6b29808baf25cfd488306a79899b83aa5b (patch) | |
tree | 2a5bcbb587885c76d33aa52805ae8f10bdae213a | |
parent | c6cbbc899b4560d0fa452ebf81fe52fd027efcf6 (diff) | |
download | bcm5719-llvm-82d60d6b29808baf25cfd488306a79899b83aa5b.tar.gz bcm5719-llvm-82d60d6b29808baf25cfd488306a79899b83aa5b.zip |
Handle mixed-OS paths in DWARF reader
Make sure that DWARF line information generated by Windows can be properly read by Posix OS and vice versa.
Differential Revision: https://reviews.llvm.org/D44290
llvm-svn: 327430
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp | 12 | ||||
-rw-r--r-- | llvm/test/DebugInfo/debuglineinfo-path.ll | 78 |
2 files changed, 88 insertions, 2 deletions
diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp index efc1870fd8c..c91b95cbc11 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDebugLine.cpp @@ -956,6 +956,14 @@ Optional<StringRef> DWARFDebugLine::LineTable::getSourceByIndex(uint64_t FileInd return None; } +static bool isPathAbsoluteOnWindowsOrPosix(const Twine &Path) { + // Debug info can contain paths from any OS, not necessarily + // an OS we're currently running on. Moreover different compilation units can + // be compiled on different operating systems and linked together later. + return sys::path::is_absolute(Path, sys::path::Style::posix) || + sys::path::is_absolute(Path, sys::path::Style::windows); +} + bool DWARFDebugLine::LineTable::getFileNameByIndex(uint64_t FileIndex, const char *CompDir, FileLineInfoKind Kind, @@ -965,7 +973,7 @@ bool DWARFDebugLine::LineTable::getFileNameByIndex(uint64_t FileIndex, const FileNameEntry &Entry = Prologue.FileNames[FileIndex - 1]; StringRef FileName = Entry.Name.getAsCString().getValue(); if (Kind != FileLineInfoKind::AbsoluteFilePath || - sys::path::is_absolute(FileName)) { + isPathAbsoluteOnWindowsOrPosix(FileName)) { Result = FileName; return true; } @@ -984,7 +992,7 @@ bool DWARFDebugLine::LineTable::getFileNameByIndex(uint64_t FileIndex, // 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 && Kind == FileLineInfoKind::AbsoluteFilePath && - sys::path::is_relative(IncludeDir)) + !isPathAbsoluteOnWindowsOrPosix(IncludeDir)) sys::path::append(FilePath, CompDir); // sys::path::append skips empty strings. diff --git a/llvm/test/DebugInfo/debuglineinfo-path.ll b/llvm/test/DebugInfo/debuglineinfo-path.ll new file mode 100644 index 00000000000..830f6705c96 --- /dev/null +++ b/llvm/test/DebugInfo/debuglineinfo-path.ll @@ -0,0 +1,78 @@ +; Make sure that absolute source dir is detected correctly regardless of the platform. +; REQUIRES: object-emission +; RUN: %llc_dwarf -filetype=obj -o %t < %s +; RUN: echo -n 0x > %t.posix_relative_func +; RUN: echo -n 0x > %t.posix_absolute_func +; RUN: echo -n 0x > %t.win_func +; RUN: llvm-nm %t | grep posix_absolute_func >> %t.posix_absolute_func +; RUN: llvm-nm %t | grep posix_relative_func >> %t.posix_relative_func +; RUN: llvm-nm %t | grep win_func >> %t.win_func +; RUN: llvm-symbolizer --functions=linkage --inlining --demangle=false --obj %t < %t.posix_absolute_func | FileCheck %s --check-prefix=POSIX_A +; RUN: llvm-symbolizer --functions=linkage --inlining --demangle=false --obj %t < %t.posix_relative_func | FileCheck %s --check-prefix=POSIX_R +; RUN: llvm-symbolizer --functions=linkage --inlining --demangle=false --obj %t < %t.win_func | FileCheck %s --check-prefix=WIN + +;POSIX_A: posix_absolute_func +;POSIX_A: /absolute/posix/path{{[\/]}}posix.c + +;POSIX_R: posix_relative_func +;POSIX_R: /ABSOLUTE/CU/PATH{{[\/]}}relative/posix/path{{[\/]}}posix2.c + +;WIN: win_func +;WIN: E:\absolute\windows\path{{[\/]}}win.c + + +target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" +target triple = "x86_64-pc-linux-gnu" + +define i32 @win_func() #0 !dbg !54 { + ret i32 5, !dbg !511 +} + +define i32 @posix_absolute_func() #0 !dbg !34 { + ret i32 3, !dbg !311 +} + +define i32 @posix_relative_func() #0 !dbg !44 { + ret i32 4, !dbg !411 +} + +!llvm.dbg.cu = !{!50, !30, !40} +!llvm.module.flags = !{!8, !9} +!llvm.ident = !{!10} +!8 = !{i32 2, !"Dwarf Version", i32 4} +!9 = !{i32 2, !"Debug Info Version", i32 3} +!10 = !{!"clang"} + +!50 = distinct !DICompileUnit(language: DW_LANG_C99, file: !512, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: 1, enums: !52) +!51 = !DIFile(filename: "win.c", directory: "E:\\absolute\\windows\\path") +!52 = !{} +!53 = !{!54} +!54 = distinct !DISubprogram(name: "win_func", scope: !51, file: !51, line: 55, type: !55, unit: !50, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: false, variables: !52) +!55 = !DISubroutineType(types: !56) +!56 = !{!57} +!57 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) +!511 = !DILocation(line: 55, column: 2, scope: !54) +!512 = !DIFile(filename: "a.c", directory: "/WIN_CU/PATH") + +!30 = distinct !DICompileUnit(language: DW_LANG_C99, file: !312, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: 1, enums: !32) +!31 = !DIFile(filename: "posix.c", directory: "/absolute/posix/path") +!32 = !{} +!33 = !{!34} +!34 = distinct !DISubprogram(name: "posix_absolute_func", scope: !31, file: !31, line: 33, type: !35, unit: !30, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: false, variables: !32) +!35 = !DISubroutineType(types: !36) +!36 = !{!37} +!37 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) +!311 = !DILocation(line: 33, column: 2, scope: !34) +!312 = !DIFile(filename: "b.c", directory: "/POSIX_CU/PATH") + +!40 = distinct !DICompileUnit(language: DW_LANG_C99, file: !412, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: 1, enums: !42) +!41 = !DIFile(filename: "posix2.c", directory: "relative/posix/path") +!42 = !{} +!43 = !{!44} +!44 = distinct !DISubprogram(name: "posix_relative_func", scope: !41, file: !41, line: 44, type: !45, unit: !40, isLocal: false, isDefinition: true, scopeLine: 1, isOptimized: false, variables: !42) +!45 = !DISubroutineType(types: !46) +!46 = !{!47} +!47 = !DIBasicType(name: "int", size: 32, align: 32, encoding: DW_ATE_signed) +!411 = !DILocation(line: 44, column: 2, scope: !44) +!412 = !DIFile(filename: "c.c", directory: "/ABSOLUTE/CU/PATH") + |