Index: llvm/trunk/test/CMakeLists.txt =================================================================== --- llvm/trunk/test/CMakeLists.txt +++ llvm/trunk/test/CMakeLists.txt @@ -19,11 +19,12 @@ # Set the depends list as a variable so that it can grow conditionally. # NOTE: Sync the substitutions in test/lit.cfg when adding to this list. set(LLVM_TEST_DEPENDS - llvm-config - UnitTests BugpointPasses + FileCheck LLVMHello + UnitTests bugpoint + count llc lli lli-child-target @@ -31,6 +32,7 @@ llvm-as llvm-bcanalyzer llvm-c-test + llvm-config llvm-cov llvm-cxxdump llvm-diff @@ -54,14 +56,13 @@ llvm-split llvm-symbolizer llvm-tblgen - opt - FileCheck - count not - yaml-bench - yaml2obj obj2yaml + opt + sancov verify-uselistorder + yaml-bench + yaml2obj ) # If Intel JIT events are supported, depend on a tool that tests the listener. Index: llvm/trunk/test/tools/sancov/Inputs/foo.cpp =================================================================== --- llvm/trunk/test/tools/sancov/Inputs/foo.cpp +++ llvm/trunk/test/tools/sancov/Inputs/foo.cpp @@ -0,0 +1,5 @@ +#include +#include + +__attribute__((noinline)) +void foo() { printf("foo\n"); } Index: llvm/trunk/test/tools/sancov/Inputs/test.cpp =================================================================== --- llvm/trunk/test/tools/sancov/Inputs/test.cpp +++ llvm/trunk/test/tools/sancov/Inputs/test.cpp @@ -0,0 +1,19 @@ +// compile & generate coverage data using: +// clang++ -g -o test-linux_x86_64 -fsanitize=address -fsanitize-coverage=edge *.cpp +// ASAN_OPTIONS="coverage=1" ./test-linux_x86_64 && mv test-linux_x86_64.*.sancov test-linux_x86_64.sancov +// ASAN_OPTIONS="coverage=1" ./test-linux_x86_64 1 && mv test-linux_x86_64.*.sancov test-linux_x86_64-1.sancov + +#include +#include + +void foo(); + +__attribute__((noinline)) +std::string bar(std::string str) { printf("bar\n"); return str; } + +int main(int argc, char **argv) { + if (argc == 2) + foo(); + bar("str"); + printf("main\n"); +} Index: llvm/trunk/test/tools/sancov/covered_functions.test =================================================================== --- llvm/trunk/test/tools/sancov/covered_functions.test +++ llvm/trunk/test/tools/sancov/covered_functions.test @@ -0,0 +1,13 @@ +RUN: sancov -obj %p/Inputs/test-linux_x86_64 -covered_functions %p/Inputs/test-linux_x86_64.sancov | FileCheck %s +RUN: sancov -obj %p/Inputs/test-linux_x86_64 -covered_functions %p/Inputs/test-linux_x86_64-1.sancov | FileCheck --check-prefix=MULTIPLE_FILES %s +RUN: sancov -obj %p/Inputs/test-linux_x86_64 -demangle=0 -covered_functions %p/Inputs/test-linux_x86_64.sancov | FileCheck --check-prefix=NO_DEMANGLE %s + +CHECK: Inputs/test.cpp:12 bar(std::string) +CHECK: Inputs/test.cpp:14 main + +MULTIPLE_FILES: {{^}}foo.cpp:5 foo() +MULTIPLE_FILES: {{^}}test.cpp:12 bar(std::string) +MULTIPLE_FILES: {{^}}test.cpp:14 main + +NO_DEMANGLE: Inputs/test.cpp:12 _Z3barSs +NO_DEMANGLE: Inputs/test.cpp:14 main Index: llvm/trunk/test/tools/sancov/print.test =================================================================== --- llvm/trunk/test/tools/sancov/print.test +++ llvm/trunk/test/tools/sancov/print.test @@ -0,0 +1,10 @@ +RUN: sancov -obj %p/Inputs/test-linux_x86_64 -print %p/Inputs/test-linux_x86_64.sancov | FileCheck %s + +CHECK: 0x4db18b +CHECK: 0x4db2d2 +CHECK: 0x4db322 +CHECK: 0x4db376 +CHECK: 0x4db3bd +CHECK: 0x4db3f4 +CHECK: 0x4db427 +CHECK: 0x4db45a Index: llvm/trunk/tools/sancov/sancov.cc =================================================================== --- llvm/trunk/tools/sancov/sancov.cc +++ llvm/trunk/tools/sancov/sancov.cc @@ -178,7 +178,7 @@ return; symbolize::LLVMSymbolizer::Options SymbolizerOptions; SymbolizerOptions.Demangle = ClDemangle; - symbolize::LLVMSymbolizer Symbolizer; + symbolize::LLVMSymbolizer Symbolizer(SymbolizerOptions); struct FileLoc { std::string FileName; @@ -226,8 +226,11 @@ if (!ProcessedFunctions.insert(FunctionName).second) continue; - out << FileName.substr(FilePrefix.size()) << ":" << Line << " " - << FunctionName << "\n"; + // Don't strip prefix if we only have a single file. + if (FileName.size() > FilePrefix.size()) + FileName = FileName.substr(FilePrefix.size()); + + out << FileName << ":" << Line << " " << FunctionName << "\n"; } } }