keith created this revision. keith requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
On unix systems this logic would not separate the file and directory of the DIFile unless they shared more components at the start than just the root path character. The logic to do this was unix specific so it didn't work on Windows. Now we check if the entire root_path is the same as what you were going to set as the Dir and use the full filepath in that case. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D111579 Files: clang/lib/CodeGen/CGDebugInfo.cpp clang/test/CodeGen/debug-prefix-map.c Index: clang/test/CodeGen/debug-prefix-map.c =================================================================== --- clang/test/CodeGen/debug-prefix-map.c +++ clang/test/CodeGen/debug-prefix-map.c @@ -19,23 +19,21 @@ vprintf("string", argp); } -// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "{{/|C:\\\\|()}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}<stdin>" -// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "{{/|C:\\\\|()}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}{{.*}}", -// On POSIX systems "Dir" should actually be empty, but on Windows we -// can't recognize "/UNLIKELY_PATH" as being an absolute path. -// CHECK-NO-MAIN-FILE-NAME-SAME: directory: "{{()|(.*:.*)}}") -// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "{{/|C:\\\\|()}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}Inputs{{/|\\\\}}stdio.h", -// CHECK-NO-MAIN-FILE-NAME-SAME: directory: "{{()|(.*:.*)}}") +// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "{{/|C:\\\\}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}<stdin>" +// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "{{/|C:\\\\}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}{{.*}}", +// CHECK-NO-MAIN-FILE-NAME-SAME: directory: "") +// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "{{/|C:\\\\}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}Inputs{{/|\\\\}}stdio.h", +// CHECK-NO-MAIN-FILE-NAME-SAME: directory: "") // CHECK-NO-MAIN-FILE-NAME-NOT: !DIFile(filename: -// CHECK-EVIL: !DIFile(filename: "{{/|C:\\\\|()}}UNLIKELY_PATH=empty{{/|\\\\}}{{.*}}" -// CHECK-EVIL: !DIFile(filename: "{{/|C:\\\\|()}}UNLIKELY_PATH=empty{{/|\\\\}}{{.*}}Inputs{{/|\\\\}}stdio.h", -// CHECK-EVIL-SAME: directory: "{{()|(.*:.*)}}") +// CHECK-EVIL: !DIFile(filename: "{{/|C:\\\\}}UNLIKELY_PATH=empty{{/|\\\\}}{{.*}}" +// CHECK-EVIL: !DIFile(filename: "{{/|C:\\\\}}UNLIKELY_PATH=empty{{/|\\\\}}{{.*}}Inputs{{/|\\\\}}stdio.h", +// CHECK-EVIL-SAME: directory: "") // CHECK-EVIL-NOT: !DIFile(filename: -// CHECK: !DIFile(filename: "{{/|C:\\\\|()}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}{{.*}}" -// CHECK: !DIFile(filename: "{{/|C:\\\\|()}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}{{.*}}Inputs{{/|\\\\}}stdio.h", -// CHECK-SAME: directory: "{{()|(.*:.*)}}") +// CHECK: !DIFile(filename: "{{/|C:\\\\}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}{{.*}}" +// CHECK: !DIFile(filename: "{{/|C:\\\\}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}{{.*}}Inputs{{/|\\\\}}stdio.h", +// CHECK-SAME: directory: "" // CHECK-NOT: !DIFile(filename: // CHECK-COMPILATION-DIR: !DIFile(filename: "{{.*}}", directory: "{{/|C:\\\\}}UNLIKELY_PATH{{/|\\\\}}empty") Index: clang/lib/CodeGen/CGDebugInfo.cpp =================================================================== --- clang/lib/CodeGen/CGDebugInfo.cpp +++ clang/lib/CodeGen/CGDebugInfo.cpp @@ -427,16 +427,16 @@ SmallString<128> DirBuf; SmallString<128> FileBuf; if (llvm::sys::path::is_absolute(RemappedFile)) { - // Strip the common prefix (if it is more than just "/") from current - // directory and FileName for a more space-efficient encoding. + // Strip the common prefix (if it is more than just "/" or "C:\") from + // current directory and FileName for a more space-efficient encoding. auto FileIt = llvm::sys::path::begin(RemappedFile); auto FileE = llvm::sys::path::end(RemappedFile); auto CurDirIt = llvm::sys::path::begin(CurDir); auto CurDirE = llvm::sys::path::end(CurDir); for (; CurDirIt != CurDirE && *CurDirIt == *FileIt; ++CurDirIt, ++FileIt) llvm::sys::path::append(DirBuf, *CurDirIt); - if (std::distance(llvm::sys::path::begin(CurDir), CurDirIt) == 1) { - // Don't strip the common prefix if it is only the root "/" + if (llvm::sys::path::root_path(DirBuf) == DirBuf) { + // Don't strip the common prefix if it is only the root ("/" or "C:\") // since that would make LLVM diagnostic locations confusing. Dir = {}; File = RemappedFile;
Index: clang/test/CodeGen/debug-prefix-map.c =================================================================== --- clang/test/CodeGen/debug-prefix-map.c +++ clang/test/CodeGen/debug-prefix-map.c @@ -19,23 +19,21 @@ vprintf("string", argp); } -// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "{{/|C:\\\\|()}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}<stdin>" -// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "{{/|C:\\\\|()}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}{{.*}}", -// On POSIX systems "Dir" should actually be empty, but on Windows we -// can't recognize "/UNLIKELY_PATH" as being an absolute path. -// CHECK-NO-MAIN-FILE-NAME-SAME: directory: "{{()|(.*:.*)}}") -// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "{{/|C:\\\\|()}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}Inputs{{/|\\\\}}stdio.h", -// CHECK-NO-MAIN-FILE-NAME-SAME: directory: "{{()|(.*:.*)}}") +// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "{{/|C:\\\\}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}<stdin>" +// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "{{/|C:\\\\}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}{{.*}}", +// CHECK-NO-MAIN-FILE-NAME-SAME: directory: "") +// CHECK-NO-MAIN-FILE-NAME: !DIFile(filename: "{{/|C:\\\\}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}Inputs{{/|\\\\}}stdio.h", +// CHECK-NO-MAIN-FILE-NAME-SAME: directory: "") // CHECK-NO-MAIN-FILE-NAME-NOT: !DIFile(filename: -// CHECK-EVIL: !DIFile(filename: "{{/|C:\\\\|()}}UNLIKELY_PATH=empty{{/|\\\\}}{{.*}}" -// CHECK-EVIL: !DIFile(filename: "{{/|C:\\\\|()}}UNLIKELY_PATH=empty{{/|\\\\}}{{.*}}Inputs{{/|\\\\}}stdio.h", -// CHECK-EVIL-SAME: directory: "{{()|(.*:.*)}}") +// CHECK-EVIL: !DIFile(filename: "{{/|C:\\\\}}UNLIKELY_PATH=empty{{/|\\\\}}{{.*}}" +// CHECK-EVIL: !DIFile(filename: "{{/|C:\\\\}}UNLIKELY_PATH=empty{{/|\\\\}}{{.*}}Inputs{{/|\\\\}}stdio.h", +// CHECK-EVIL-SAME: directory: "") // CHECK-EVIL-NOT: !DIFile(filename: -// CHECK: !DIFile(filename: "{{/|C:\\\\|()}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}{{.*}}" -// CHECK: !DIFile(filename: "{{/|C:\\\\|()}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}{{.*}}Inputs{{/|\\\\}}stdio.h", -// CHECK-SAME: directory: "{{()|(.*:.*)}}") +// CHECK: !DIFile(filename: "{{/|C:\\\\}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}{{.*}}" +// CHECK: !DIFile(filename: "{{/|C:\\\\}}UNLIKELY_PATH{{/|\\\\}}empty{{/|\\\\}}{{.*}}Inputs{{/|\\\\}}stdio.h", +// CHECK-SAME: directory: "" // CHECK-NOT: !DIFile(filename: // CHECK-COMPILATION-DIR: !DIFile(filename: "{{.*}}", directory: "{{/|C:\\\\}}UNLIKELY_PATH{{/|\\\\}}empty") Index: clang/lib/CodeGen/CGDebugInfo.cpp =================================================================== --- clang/lib/CodeGen/CGDebugInfo.cpp +++ clang/lib/CodeGen/CGDebugInfo.cpp @@ -427,16 +427,16 @@ SmallString<128> DirBuf; SmallString<128> FileBuf; if (llvm::sys::path::is_absolute(RemappedFile)) { - // Strip the common prefix (if it is more than just "/") from current - // directory and FileName for a more space-efficient encoding. + // Strip the common prefix (if it is more than just "/" or "C:\") from + // current directory and FileName for a more space-efficient encoding. auto FileIt = llvm::sys::path::begin(RemappedFile); auto FileE = llvm::sys::path::end(RemappedFile); auto CurDirIt = llvm::sys::path::begin(CurDir); auto CurDirE = llvm::sys::path::end(CurDir); for (; CurDirIt != CurDirE && *CurDirIt == *FileIt; ++CurDirIt, ++FileIt) llvm::sys::path::append(DirBuf, *CurDirIt); - if (std::distance(llvm::sys::path::begin(CurDir), CurDirIt) == 1) { - // Don't strip the common prefix if it is only the root "/" + if (llvm::sys::path::root_path(DirBuf) == DirBuf) { + // Don't strip the common prefix if it is only the root ("/" or "C:\") // since that would make LLVM diagnostic locations confusing. Dir = {}; File = RemappedFile;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits