summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2019-02-06 00:50:35 +0000
committerZachary Turner <zturner@google.com>2019-02-06 00:50:35 +0000
commitc5d68d499ab6c2b05652c0476008f0005b5730c6 (patch)
tree19c3e8897bf7f945c67a564c809541ca18391bc7
parent997b2aba58ddbf6038fc52f20d5ed94edcfe8d00 (diff)
downloadbcm5719-llvm-c5d68d499ab6c2b05652c0476008f0005b5730c6.tar.gz
bcm5719-llvm-c5d68d499ab6c2b05652c0476008f0005b5730c6.zip
[PDB] Remove dots and normalize slashes with /PDBSOURCEPATH.
In a previous patch, I made changes so that PDBs which were generated on non-Windows platforms contained sensical paths for the host. While this is an esoteric use case, we need it to be supported for certain cross compilation scenarios especially with LLDB, which can debug things on non-Windows platforms. However, this regressed a case where you specify /PDBSOURCEPATH and use a windows-style path. Previously, we would still remove dots and canonicalize slashes to backslashes, but since my change intentionally tried to support non-backslash paths, this was broken. This patch fixes the situation by trying to guess which path style the user is specifying when /PDBSOURCEPATH is passed. It is intentionally conservative, erring on the side of a Windows path style unless absolutely certain. All dots are removed and slashes canonicalized to whatever the deduced path style is after appending the file path to the /PDBSOURCEPATH argument. Differential Revision: https://reviews.llvm.org/D57769 llvm-svn: 353250
-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