From d8a8b4bb7c0e7fcfd041513fb951b8b78d4bbbef Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Sat, 12 Oct 2019 02:29:26 +0000 Subject: [PATCH] [sancov] Accommodate sancov and coverage report server for use under Windows Summary: This patch makes the following changes to SanCov and its complementary Python script in order to resolve issues pertaining to non-UNIX file paths in JSON symbolization information: * Convert all paths to use forward slash. * Update `coverage-report-server.py` to correctly handle paths to sources which contain spaces. * Remove Linux platform restriction for all SanCov unit tests. All SanCov tests passed when ran on my local Windows machine. Patch by Douglas Gliner. Reviewers: kcc, filcab, phosek, morehouse, vitalybuka, metzman Reviewed By: vitalybuka Subscribers: vsk, Dor1s, llvm-commits Tags: #sanitizers, #llvm Differential Revision: https://reviews.llvm.org/D51018 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@374629 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/tools/sancov/blacklist.test | 2 +- test/tools/sancov/covered_functions.test | 2 +- test/tools/sancov/merge.test | 2 +- test/tools/sancov/not_covered_functions.test | 2 +- test/tools/sancov/print.test | 2 +- test/tools/sancov/stats.test | 2 +- test/tools/sancov/symbolize.test | 8 +++++--- test/tools/sancov/symbolize_noskip_dead_files.test | 2 +- test/tools/sancov/validation.test | 2 +- tools/sancov/coverage-report-server.py | 6 ++++-- tools/sancov/sancov.cpp | 2 +- 11 files changed, 18 insertions(+), 14 deletions(-) diff --git a/test/tools/sancov/blacklist.test b/test/tools/sancov/blacklist.test index 53f48534dc9..e933c76475d 100644 --- a/test/tools/sancov/blacklist.test +++ b/test/tools/sancov/blacklist.test @@ -1,4 +1,4 @@ -REQUIRES: x86_64-linux +REQUIRES: x86-registered-target RUN: sancov -covered-functions %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s --check-prefix=ALL RUN: sancov -covered-functions -blacklist %p/Inputs/fun_blacklist.txt %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s RUN: sancov -covered-functions -blacklist %p/Inputs/src_blacklist.txt %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.1.sancov | FileCheck --check-prefix=CHECK1 %s diff --git a/test/tools/sancov/covered_functions.test b/test/tools/sancov/covered_functions.test index 8126049a0ca..a2de7889431 100644 --- a/test/tools/sancov/covered_functions.test +++ b/test/tools/sancov/covered_functions.test @@ -1,4 +1,4 @@ -REQUIRES: x86_64-linux +REQUIRES: x86-registered-target RUN: sancov -covered-functions %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s RUN: sancov -covered-functions -strip_path_prefix=Inputs/ %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck --check-prefix=STRIP_PATH %s RUN: sancov -demangle=0 -covered-functions %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck --check-prefix=NO_DEMANGLE %s diff --git a/test/tools/sancov/merge.test b/test/tools/sancov/merge.test index 9c5ca9e6244..6c867654583 100644 --- a/test/tools/sancov/merge.test +++ b/test/tools/sancov/merge.test @@ -1,4 +1,4 @@ -REQUIRES: x86_64-linux +REQUIRES: x86-registered-target RUN: sancov -merge %p/Inputs/test-linux_x86_64.0.symcov| FileCheck --check-prefix=MERGE1 %s RUN: sancov -merge %p/Inputs/test-linux_x86_64.0.symcov %p/Inputs/test-linux_x86_64.1.symcov| FileCheck --check-prefix=MERGE2 %s diff --git a/test/tools/sancov/not_covered_functions.test b/test/tools/sancov/not_covered_functions.test index 4e0e81a52c2..921d88ec87a 100644 --- a/test/tools/sancov/not_covered_functions.test +++ b/test/tools/sancov/not_covered_functions.test @@ -1,4 +1,4 @@ -REQUIRES: x86_64-linux +REQUIRES: x86-registered-target RUN: sancov -skip-dead-files=0 -not-covered-functions %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s RUN: sancov -not-covered-functions %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.1.sancov | FileCheck --check-prefix=CHECK1 --allow-empty %s diff --git a/test/tools/sancov/print.test b/test/tools/sancov/print.test index fe94216b051..f0520aead4e 100644 --- a/test/tools/sancov/print.test +++ b/test/tools/sancov/print.test @@ -1,4 +1,4 @@ -REQUIRES: x86_64-linux +REQUIRES: x86-registered-target RUN: sancov -print %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s CHECK: 0x4e132b diff --git a/test/tools/sancov/stats.test b/test/tools/sancov/stats.test index 030d16a9dc6..1c83e93990d 100644 --- a/test/tools/sancov/stats.test +++ b/test/tools/sancov/stats.test @@ -1,4 +1,4 @@ -REQUIRES: x86_64-linux +REQUIRES: x86-registered-target RUN: sancov -print-coverage-stats %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s CHECK: all-edges: 8 diff --git a/test/tools/sancov/symbolize.test b/test/tools/sancov/symbolize.test index 3cc426f919b..83d29ff489a 100644 --- a/test/tools/sancov/symbolize.test +++ b/test/tools/sancov/symbolize.test @@ -1,5 +1,6 @@ -REQUIRES: x86_64-linux -RUN: sancov -symbolize -strip_path_prefix="llvm/" %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s +REQUIRES: x86-registered-target +RUN: sancov -symbolize -strip_path_prefix="llvm/" %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s --check-prefixes=CHECK,STRIP +RUN: sancov -symbolize %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s --check-prefixes=CHECK,NOSTRIP CHECK: { CHECK-NEXT: "covered-points": [ @@ -11,7 +12,8 @@ CHECK-NEXT: "4e1586" CHECK-NEXT: ], CHECK-NEXT: "binary-hash": "BB3CDD5045AED83906F6ADCC1C4DAF7E2596A6B5", CHECK-NEXT: "point-symbol-info": { -CHECK-NEXT: "test/tools/sancov/Inputs/test.cpp": { +STRIP-NEXT: "test/tools/sancov/Inputs/test.cpp": { +NOSTRIP-NEXT: "/usr/local/google/home/aizatsky/src/llvm/test/tools/sancov/Inputs/test.cpp": { CHECK-NEXT: "bar(std::string)": { CHECK-NEXT: "4e132b": "12:0" CHECK-NEXT: }, diff --git a/test/tools/sancov/symbolize_noskip_dead_files.test b/test/tools/sancov/symbolize_noskip_dead_files.test index 9ddf89cbf56..7371f084390 100644 --- a/test/tools/sancov/symbolize_noskip_dead_files.test +++ b/test/tools/sancov/symbolize_noskip_dead_files.test @@ -1,4 +1,4 @@ -REQUIRES: x86_64-linux +REQUIRES: x86-registered-target RUN: sancov -symbolize -skip-dead-files=0 -strip_path_prefix="llvm/" %p/Inputs/test-linux_x86_64 %p/Inputs/test-linux_x86_64.0.sancov | FileCheck %s CHECK: { diff --git a/test/tools/sancov/validation.test b/test/tools/sancov/validation.test index 437870cf597..fdcfd0610f8 100644 --- a/test/tools/sancov/validation.test +++ b/test/tools/sancov/validation.test @@ -1,4 +1,4 @@ -REQUIRES: x86_64-linux +REQUIRES: x86-registered-target RUN: not sancov -covered-functions %p/Inputs/test-linux_x86_64 2>&1 | FileCheck --check-prefix=NOCFILE %s NOCFILE: WARNING: No coverage file for {{.*}}test-linux_x86_64 diff --git a/tools/sancov/coverage-report-server.py b/tools/sancov/coverage-report-server.py index 251d8f1b77b..5ea978fae64 100755 --- a/tools/sancov/coverage-report-server.py +++ b/tools/sancov/coverage-report-server.py @@ -32,6 +32,7 @@ import html import os import string import math +import urllib INDEX_PAGE_TMPL = """ @@ -128,6 +129,7 @@ class ServerHandler(http.server.BaseHTTPRequestHandler): src_path = None def do_GET(self): + norm_path = os.path.normpath(urllib.parse.unquote(self.path[1:])) if self.path == '/': self.send_response(200) self.send_header("Content-type", "text/html; charset=utf-8") @@ -147,8 +149,8 @@ class ServerHandler(http.server.BaseHTTPRequestHandler): response = string.Template(INDEX_PAGE_TMPL).safe_substitute( filenames='\n'.join(filelist)) self.wfile.write(response.encode('UTF-8', 'replace')) - elif self.symcov_data.has_file(self.path[1:]): - filename = self.path[1:] + elif self.symcov_data.has_file(norm_path): + filename = norm_path filepath = os.path.join(self.src_path, filename) if not os.path.exists(filepath): self.send_response(404) diff --git a/tools/sancov/sancov.cpp b/tools/sancov/sancov.cpp index e0cc8a7cf84..09826ec239b 100644 --- a/tools/sancov/sancov.cpp +++ b/tools/sancov/sancov.cpp @@ -469,7 +469,7 @@ static std::unique_ptr createSymbolizer() { static std::string normalizeFilename(const std::string &FileName) { SmallString<256> S(FileName); sys::path::remove_dots(S, /* remove_dot_dot */ true); - return stripPathPrefix(S.str().str()); + return stripPathPrefix(sys::path::convert_to_slash(S.str())); } class Blacklists { -- 2.40.0