[llvm] r327430 - Handle mixed-OS paths in DWARF reader

Eugene Zemtsov via llvm-commits llvm-commits at lists.llvm.org
Tue Mar 13 10:54:29 PDT 2018


Author: eugene
Date: Tue Mar 13 10:54:29 2018
New Revision: 327430

URL: http://llvm.org/viewvc/llvm-project?rev=327430&view=rev
Log:
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

Added:
    llvm/trunk/test/DebugInfo/debuglineinfo-path.ll
Modified:
    llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugLine.cpp

Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugLine.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugLine.cpp?rev=327430&r1=327429&r2=327430&view=diff
==============================================================================
--- llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugLine.cpp (original)
+++ llvm/trunk/lib/DebugInfo/DWARF/DWARFDebugLine.cpp Tue Mar 13 10:54:29 2018
@@ -956,6 +956,14 @@ Optional<StringRef> DWARFDebugLine::Line
   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::getFileN
   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::getFileN
   // 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.

Added: llvm/trunk/test/DebugInfo/debuglineinfo-path.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/debuglineinfo-path.ll?rev=327430&view=auto
==============================================================================
--- llvm/trunk/test/DebugInfo/debuglineinfo-path.ll (added)
+++ llvm/trunk/test/DebugInfo/debuglineinfo-path.ll Tue Mar 13 10:54:29 2018
@@ -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")
+




More information about the llvm-commits mailing list