Index: test/tools/llvm-cov/double_dots.c =================================================================== --- test/tools/llvm-cov/double_dots.c +++ test/tools/llvm-cov/double_dots.c @@ -5,6 +5,8 @@ // RUN: llvm-profdata merge %S/Inputs/double_dots.proftext -o %t.profdata // RUN: llvm-cov show %S/Inputs/double_dots.covmapping -instr-profile=%t.profdata -o %t.dir // RUN: FileCheck -input-file=%t.dir/index.txt %s +// RUN: llvm-cov show -format=html %S/Inputs/double_dots.covmapping -instr-profile=%t.profdata -o %t.dir +// RUN: FileCheck -input-file=%t.dir/index.html %s // CHECK-NOT: coverage{{.*}}dots{{.*}}..{{.*}}dots Index: test/tools/llvm-cov/native_separators.c =================================================================== --- /dev/null +++ test/tools/llvm-cov/native_separators.c @@ -0,0 +1,21 @@ +// To create the covmapping for this file on Linux, copy this file to /tmp +// cd into /tmp. Use llvm-cov convert-for-testing to extract the covmapping. +// This test is Windows-only. It checks that all paths, which are generated +// in the index and source coverage reports, are native path. For example, +// on Windows all '/' are converted to '\'. +// REQUIRES: system-windows + +// RUN: llvm-profdata merge %S/Inputs/double_dots.proftext -o %t.profdata +// RUN: llvm-cov show %S/Inputs/native_separators.covmapping -instr-profile=%t.profdata -o %t.dir +// RUN: FileCheck -check-prefixes=TEXT-INDEX -input-file=%t.dir/index.txt %s +// RUN: llvm-cov show -format=html %S/Inputs/native_separators.covmapping -instr-profile=%t.profdata -filename-equivalence ../llvm-config/../llvm-cov/native_separators.c -o %t.dir +// RUN: FileCheck -check-prefixes=HTML-INDEX -input-file=%t.dir/index.html %s +// RUN: llvm-cov show -format=html %S/Inputs/native_separators.covmapping -instr-profile=%t.profdata -filename-equivalence %s -o %t.dir +// RUN: FileCheck -check-prefixes=HTML -input-file=%t.dir/coverage/tmp/native_separators.c.html %s + +// TEXT-INDEX: \tmp\native_separators.c +// HTML-INDEX: >tmp\native_separators.c +// HTML:
Source: \tmp\native_separators.c+// HTML: tools\llvm-cov\Inputs\native_separators.covmapping + +int main() {} Index: tools/llvm-cov/CodeCoverage.cpp =================================================================== --- tools/llvm-cov/CodeCoverage.cpp +++ tools/llvm-cov/CodeCoverage.cpp @@ -468,6 +468,7 @@ error(EC.message(), this->ObjectFilename); return 1; } + sys::path::native(ObjectFilePath); ViewOpts.ObjectFilename = ObjectFilePath.c_str(); switch (ViewOpts.Format) { case CoverageViewOptions::OutputFormat::Text: Index: tools/llvm-cov/SourceCoverageView.cpp =================================================================== --- tools/llvm-cov/SourceCoverageView.cpp +++ tools/llvm-cov/SourceCoverageView.cpp @@ -46,6 +46,7 @@ auto PathFilename = (sys::path::filename(Path) + "." + Extension).str(); sys::path::append(FullPath, PathFilename); + sys::path::native(FullPath); return FullPath.str(); } Index: tools/llvm-cov/SourceCoverageViewHTML.cpp =================================================================== --- tools/llvm-cov/SourceCoverageViewHTML.cpp +++ tools/llvm-cov/SourceCoverageViewHTML.cpp @@ -308,7 +308,10 @@ OSRef << BeginCenteredDiv << BeginTable; OSRef << BeginSourceNameDiv << "Index" << EndSourceNameDiv; for (StringRef SF : SourceFiles) { - std::string LinkText = escape(sys::path::relative_path(SF), Opts); + SmallString<128> LinkTextStr(sys::path::relative_path(SF)); + sys::path::remove_dots(LinkTextStr, /*remove_dot_dots=*/true); + sys::path::native(LinkTextStr); + std::string LinkText = escape(sys::path::relative_path(LinkTextStr), Opts); std::string LinkTarget = escape(getOutputPath(SF, "html", /*InToplevel=*/false), Opts); OSRef << tag("tr", tag("td", tag("pre", a(LinkTarget, LinkText), "code"))); @@ -340,7 +343,10 @@ // Render the source name for the view. std::string SourceFile = isFunctionView() ? "Function: " : "Source: "; SourceFile += getSourceName().str(); - OS << tag("pre", escape(SourceFile, getOptions())); + SmallString<128> SourceText(SourceFile); + sys::path::remove_dots(SourceText, /*remove_dot_dots=*/true); + sys::path::native(SourceText); + OS << tag("pre", escape(SourceText, getOptions())); // Render the object file name for the view. if (WholeFile) OS << tag("pre",