diff --git a/llvm/test/tools/sancov/print_coverage_pcs.test b/llvm/test/tools/sancov/print_coverage_pcs.test new file mode 100644 index 000000000000..572bce807ba1 --- /dev/null +++ b/llvm/test/tools/sancov/print_coverage_pcs.test @@ -0,0 +1,20 @@ +REQUIRES: x86_64-linux +RUN: sancov -print-coverage-pcs %p/Inputs/test-linux_x86_64 | FileCheck %s + +CHECK: 0x4cced1 +CHECK: 0x4ccf01 +CHECK: 0x4dbe2b +CHECK: 0x4dbf72 +CHECK: 0x4dbfc2 +CHECK: 0x4dbfec +CHECK: 0x4dc033 +CHECK: 0x4dc06a +CHECK: 0x4dc09d +CHECK: 0x4dc0d0 +CHECK: 0x4dc17f +CHECK: 0x4dc1c6 +CHECK: 0x4dc20d +CHECK: 0x4dc237 +CHECK: 0x4dc265 +CHECK: 0x4dc34c + diff --git a/llvm/tools/sancov/sancov.cc b/llvm/tools/sancov/sancov.cc index 7aa2e051b146..3d2e49e47bcf 100644 --- a/llvm/tools/sancov/sancov.cc +++ b/llvm/tools/sancov/sancov.cc @@ -59,6 +59,7 @@ namespace { enum ActionType { PrintAction, + PrintCovPointsAction, CoveredFunctionsAction, NotCoveredFunctionsAction, HtmlReportAction @@ -67,6 +68,8 @@ enum ActionType { cl::opt Action( cl::desc("Action (required)"), cl::Required, cl::values(clEnumValN(PrintAction, "print", "Print coverage addresses"), + clEnumValN(PrintCovPointsAction, "print-coverage-pcs", + "Print coverage instrumentation points addresses."), clEnumValN(CoveredFunctionsAction, "covered-functions", "Print all covered funcions."), clEnumValN(NotCoveredFunctionsAction, "not-covered-functions", @@ -449,6 +452,14 @@ std::set getCoveragePoints(std::string FileName) { return Result; } +static void printCovPoints(std::string ObjFile, raw_ostream &OS) { + for (uint64_t Addr : getCoveragePoints(ObjFile)) { + OS << "0x"; + OS.write_hex(Addr); + OS << "\n"; + } +} + static std::string escapeHtml(const std::string &S) { std::string Result; Result.reserve(S.size()); @@ -1092,6 +1103,12 @@ int main(int argc, char **argv) { FailIfError(CovData); CovData.get()->printAddrs(outs()); return 0; + } else if (Action == PrintCovPointsAction) { + // -print-coverage-points doesn't need coverage files. + for (std::string ObjFile : ClInputFiles) { + printCovPoints(ObjFile, outs()); + } + return 0; } auto CovDataSet = CoverageDataSet::readCmdArguments(ClInputFiles); @@ -1115,6 +1132,7 @@ int main(int argc, char **argv) { return 0; } case PrintAction: + case PrintCovPointsAction: llvm_unreachable("unsupported action"); } }