From dfe8474e489d63998c582a96e1504a6152f74321 Mon Sep 17 00:00:00 2001 From: Vitaly Buka Date: Mon, 26 Nov 2018 21:48:55 +0000 Subject: [PATCH] [cfi] Help sanstats to find binary if they are not at the original location Summary: By default sanstats search binaries at the same location where they were when stats was collected. Sometime you can not print report immediately or you need to move post-processing to another workstation. To support this use-case when original binary is missing sanstats will fall-back to directory with sanstats file. Reviewers: pcc Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D53857 llvm-svn: 347601 --- llvm/test/tools/sanstats/elf.test | 10 ++++++++++ llvm/tools/sanstats/sanstats.cpp | 8 +++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/llvm/test/tools/sanstats/elf.test b/llvm/test/tools/sanstats/elf.test index 44a1268a..54878a1 100644 --- a/llvm/test/tools/sanstats/elf.test +++ b/llvm/test/tools/sanstats/elf.test @@ -25,6 +25,16 @@ # RUN: sanstats %t.stats | FileCheck %s +# Test that if binaries are not in the original location then sanstats +# searches them next to the stats file. +# RUN: mkdir -p %t.dir +# RUN: mv -f %t1.o %t2.o %t.dir +# RUN: sanstats %t.stats | FileCheck %s --check-prefix=INVALID +# RUN: mv -f %t.stats %t.dir/copy.stats +# RUN: cd %t.dir && sanstats copy.stats | FileCheck %s + +# INVALID: +# CHECK-NOT: # CHECK: 0x0000000000000000 /tmp{{[/\\]}}f.c:1 f1 cfi-vcall 1 # CHECK: 0x0000000000000010 /tmp{{[/\\]}}f.c:2 f2 cfi-nvcall 2 # CHECK: 0x0000000000000020 /tmp{{[/\\]}}f.c:3 f3 cfi-derived-cast 3 diff --git a/llvm/tools/sanstats/sanstats.cpp b/llvm/tools/sanstats/sanstats.cpp index 214aeea..a345e9f 100644 --- a/llvm/tools/sanstats/sanstats.cpp +++ b/llvm/tools/sanstats/sanstats.cpp @@ -15,7 +15,9 @@ #include "llvm/DebugInfo/Symbolize/Symbolize.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/ErrorOr.h" +#include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Path.h" #include "llvm/Transforms/Utils/SanitizerStats.h" #include @@ -52,7 +54,11 @@ const char *ReadModule(char SizeofPtr, const char *Begin, const char *End) { ++Begin; if (Begin == End) return nullptr; - StringRef Filename(FilenameBegin, Begin - FilenameBegin); + std::string Filename(FilenameBegin, Begin - FilenameBegin); + + if (!llvm::sys::fs::exists(Filename)) + Filename = std::string(llvm::sys::path::parent_path(ClInputFile)) + + std::string(llvm::sys::path::filename(Filename)); ++Begin; if (Begin == End) -- 2.7.4