Index: llvm/trunk/test/tools/sanstats/elf.test =================================================================== --- llvm/trunk/test/tools/sanstats/elf.test +++ llvm/trunk/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 Index: llvm/trunk/tools/sanstats/sanstats.cpp =================================================================== --- llvm/trunk/tools/sanstats/sanstats.cpp +++ llvm/trunk/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 @@ ++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)