summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/COFF/PDB.cpp18
-rw-r--r--lld/test/COFF/pdb-relative-source-lines.test60
2 files changed, 42 insertions, 36 deletions
diff --git a/lld/COFF/PDB.cpp b/lld/COFF/PDB.cpp
index e8acc181276..4070ad475b5 100644
--- a/lld/COFF/PDB.cpp
+++ b/lld/COFF/PDB.cpp
@@ -287,18 +287,24 @@ static void pdbMakeAbsolute(SmallVectorImpl<char> &FileName) {
// It's not absolute in any path syntax. Relative paths necessarily refer to
// the local file system, so we can make it native without ending up with a
// nonsensical path.
- sys::path::native(FileName);
if (Config->PDBSourcePath.empty()) {
+ sys::path::native(FileName);
sys::fs::make_absolute(FileName);
return;
}
- // Only apply native and dot removal to the relative file path. We want to
- // leave the path the user specified untouched since we assume they specified
- // it for a reason.
- sys::path::remove_dots(FileName, /*remove_dot_dots=*/true);
+ // Try to guess whether /PDBSOURCEPATH is a unix path or a windows path.
+ // Since PDB's are more of a Windows thing, we make this conservative and only
+ // decide that it's a unix path if we're fairly certain. Specifically, if
+ // it starts with a forward slash.
SmallString<128> AbsoluteFileName = Config->PDBSourcePath;
- sys::path::append(AbsoluteFileName, FileName);
+ sys::path::Style GuessedStyle = AbsoluteFileName.startswith("/")
+ ? sys::path::Style::posix
+ : sys::path::Style::windows;
+ sys::path::append(AbsoluteFileName, GuessedStyle, FileName);
+ sys::path::native(AbsoluteFileName, GuessedStyle);
+ sys::path::remove_dots(AbsoluteFileName, true, GuessedStyle);
+
FileName = std::move(AbsoluteFileName);
}
diff --git a/lld/test/COFF/pdb-relative-source-lines.test b/lld/test/COFF/pdb-relative-source-lines.test
index 865d7a6d8a0..54705678596 100644
--- a/lld/test/COFF/pdb-relative-source-lines.test
+++ b/lld/test/COFF/pdb-relative-source-lines.test
@@ -37,26 +37,26 @@ RUN: llvm-pdbutil pdb2yaml -modules -module-files -module-syms -subsections=line
RUN: ./lld-link -debug "-pdbsourcepath:/usr/src" -entry:main -nodefaultlib -out:out.exe -pdb:out.pdb pdb_lines_1_relative.obj pdb_lines_2_relative.obj
RUN: llvm-pdbutil pdb2yaml -modules -module-files -module-syms -subsections=lines,fc %t/out.pdb | FileCheck --check-prefix=POSIX %s
-CHECK-LABEL: - Module: 'c:\src{{[\\/]}}pdb_lines_1_relative.obj'
-CHECK-NEXT: ObjFile: 'c:\src{{[\\/]}}pdb_lines_1_relative.obj'
+CHECK-LABEL: - Module: 'c:\src\pdb_lines_1_relative.obj'
+CHECK-NEXT: ObjFile: 'c:\src\pdb_lines_1_relative.obj'
CHECK: SourceFiles:
-CHECK-NEXT: - 'c:\src{{[\\/]}}pdb_lines_1.c'
-CHECK-NEXT: - 'c:\src{{[\\/]}}foo.h'
+CHECK-NEXT: - 'c:\src\pdb_lines_1.c'
+CHECK-NEXT: - 'c:\src\foo.h'
CHECK: Subsections:
-CHECK: - FileName: 'c:\src{{[\\/]}}pdb_lines_1.c'
-CHECK: - FileName: 'c:\src{{[\\/]}}foo.h'
+CHECK: - FileName: 'c:\src\pdb_lines_1.c'
+CHECK: - FileName: 'c:\src\foo.h'
CHECK: - !FileChecksums
-CHECK: - FileName: 'c:\src{{[\\/]}}pdb_lines_1.c'
-CHECK: - FileName: 'c:\src{{[\\/]}}foo.h'
+CHECK: - FileName: 'c:\src\pdb_lines_1.c'
+CHECK: - FileName: 'c:\src\foo.h'
-CHECK-LABEL: - Module: 'c:\src{{[\\/]}}pdb_lines_2_relative.obj'
-CHECK-NEXT: ObjFile: 'c:\src{{[\\/]}}pdb_lines_2_relative.obj'
+CHECK-LABEL: - Module: 'c:\src\pdb_lines_2_relative.obj'
+CHECK-NEXT: ObjFile: 'c:\src\pdb_lines_2_relative.obj'
CHECK: SourceFiles:
-CHECK-NEXT: - 'c:\src{{[\\/]}}pdb_lines_2.c'
+CHECK-NEXT: - 'c:\src\pdb_lines_2.c'
CHECK: Subsections:
-CHECK: - FileName: 'c:\src{{[\\/]}}pdb_lines_2.c'
+CHECK: - FileName: 'c:\src\pdb_lines_2.c'
CHECK: - !FileChecksums
-CHECK: - FileName: 'c:\src{{[\\/]}}pdb_lines_2.c'
+CHECK: - FileName: 'c:\src\pdb_lines_2.c'
CHECK-LABEL: - Kind: S_ENVBLOCK
CHECK-NEXT: EnvBlockSym:
@@ -64,33 +64,33 @@ CHECK-NEXT: Entries:
CHECK-NEXT: - cwd
CHECK-NEXT: - 'c:\src'
CHECK-NEXT: - exe
-CHECK-NEXT: - 'c:\src{{[\\/]}}lld-link'
+CHECK-NEXT: - 'c:\src\lld-link'
CHECK-NEXT: - pdb
-CHECK-NEXT: - 'c:\src{{[\\/]}}out.pdb'
+CHECK-NEXT: - 'c:\src\out.pdb'
CHECK-NEXT: - cmd
CHECK-NEXT: - '-debug -pdbsourcepath:c:\src -entry:main -nodefaultlib -out:out.exe -pdb:out.pdb pdb_lines_1_relative.obj pdb_lines_2_relative.obj'
-POSIX-LABEL: - Module: '/usr/src{{[\\/]}}pdb_lines_1_relative.obj'
-POSIX-NEXT: ObjFile: '/usr/src{{[\\/]}}pdb_lines_1_relative.obj'
+POSIX-LABEL: - Module: '/usr/src/pdb_lines_1_relative.obj'
+POSIX-NEXT: ObjFile: '/usr/src/pdb_lines_1_relative.obj'
POSIX: SourceFiles:
-POSIX-NEXT: - '/usr/src{{[\\/]}}pdb_lines_1.c'
-POSIX-NEXT: - '/usr/src{{[\\/]}}foo.h'
+POSIX-NEXT: - '/usr/src/pdb_lines_1.c'
+POSIX-NEXT: - '/usr/src/foo.h'
POSIX: Subsections:
-POSIX: - FileName: '/usr/src{{[\\/]}}pdb_lines_1.c'
-POSIX: - FileName: '/usr/src{{[\\/]}}foo.h'
+POSIX: - FileName: '/usr/src/pdb_lines_1.c'
+POSIX: - FileName: '/usr/src/foo.h'
POSIX: - !FileChecksums
-POSIX: - FileName: '/usr/src{{[\\/]}}pdb_lines_1.c'
-POSIX: - FileName: '/usr/src{{[\\/]}}foo.h'
+POSIX: - FileName: '/usr/src/pdb_lines_1.c'
+POSIX: - FileName: '/usr/src/foo.h'
-POSIX-LABEL: - Module: '/usr/src{{[\\/]}}pdb_lines_2_relative.obj'
-POSIX-NEXT: ObjFile: '/usr/src{{[\\/]}}pdb_lines_2_relative.obj'
+POSIX-LABEL: - Module: '/usr/src/pdb_lines_2_relative.obj'
+POSIX-NEXT: ObjFile: '/usr/src/pdb_lines_2_relative.obj'
POSIX: SourceFiles:
-POSIX-NEXT: - '/usr/src{{[\\/]}}pdb_lines_2.c'
+POSIX-NEXT: - '/usr/src/pdb_lines_2.c'
POSIX: Subsections:
-POSIX: - FileName: '/usr/src{{[\\/]}}pdb_lines_2.c'
+POSIX: - FileName: '/usr/src/pdb_lines_2.c'
POSIX: - !FileChecksums
-POSIX: - FileName: '/usr/src{{[\\/]}}pdb_lines_2.c'
+POSIX: - FileName: '/usr/src/pdb_lines_2.c'
POSIX-LABEL: - Kind: S_ENVBLOCK
POSIX-NEXT: EnvBlockSym:
@@ -98,8 +98,8 @@ POSIX-NEXT: Entries:
POSIX-NEXT: - cwd
POSIX-NEXT: - '/usr/src'
POSIX-NEXT: - exe
-POSIX-NEXT: - '/usr/src{{[\\/]}}lld-link'
+POSIX-NEXT: - '/usr/src/lld-link'
POSIX-NEXT: - pdb
-POSIX-NEXT: - '/usr/src{{[\\/]}}out.pdb'
+POSIX-NEXT: - '/usr/src/out.pdb'
POSIX-NEXT: - cmd
POSIX-NEXT: - '-debug -pdbsourcepath:/usr/src -entry:main -nodefaultlib -out:out.exe -pdb:out.pdb pdb_lines_1_relative.obj pdb_lines_2_relative.obj'
OpenPOWER on IntegriCloud