#include <memory>
#include <string>
+#include <regex>
#include "ETMDecoder.h"
#include "command.h"
: Command("inject", "convert etm instruction tracing data into instr ranges",
// clang-format off
"Usage: simpleperf inject [options]\n"
-"--binary binary_name Generate data only for binaries containing binary_name.\n"
+"--binary binary_name Generate data only for binaries matching binary_name regex.\n"
"-i <file> input perf.data, generated by recording cs-etm event type.\n"
" Default is perf.data.\n"
"-o <file> output file. Default is perf_inject.data.\n"
if (!NextArgumentOrError(args, &i)) {
return false;
}
- binary_name_filter_ = args[i];
+ binary_name_regex_ = args[i];
} else if (args[i] == "-i") {
if (!NextArgumentOrError(args, &i)) {
return false;
}
void ProcessInstrRange(const ETMInstrRange& instr_range) {
- if (instr_range.dso->GetDebugFilePath().find(binary_name_filter_) == std::string::npos) {
+ if (!std::regex_search(instr_range.dso->GetDebugFilePath(), binary_name_regex_)) {
return;
}
auto& binary = binary_map_[instr_range.dso->GetDebugFilePath()];
}
}
- std::string binary_name_filter_;
+ std::regex binary_name_regex_{""}; // Default to match everything.
std::string input_filename_ = "perf.data";
std::string output_filename_ = "perf_inject.data";
ThreadTree thread_tree_;
ASSERT_TRUE(android::base::ReadFileToString(tmpfile.path, &data));
ASSERT_NE(data.find("etm_test_loop"), std::string::npos);
+ // Test that data for etm_test_loop is generated when selected by regex.
+ ASSERT_TRUE(InjectCmd()->Run({"--symdir", GetTestDataDir() + "etm", "-i",
+ GetTestData(PERF_DATA_ETM_TEST_LOOP), "--binary", "etm_t.*_loop",
+ "-o", tmpfile.path}));
+ ASSERT_TRUE(android::base::ReadFileToString(tmpfile.path, &data));
+ ASSERT_NE(data.find("etm_test_loop"), std::string::npos);
+
// Test that data for etm_test_loop isn't generated when not selected by --binary.
ASSERT_TRUE(InjectCmd()->Run({"--symdir", GetTestDataDir() + "etm", "-i",
GetTestData(PERF_DATA_ETM_TEST_LOOP), "--binary",
"no_etm_test_loop", "-o", tmpfile.path}));
ASSERT_TRUE(android::base::ReadFileToString(tmpfile.path, &data));
ASSERT_EQ(data.find("etm_test_loop"), std::string::npos);
+
+ // Test that data for etm_test_loop isn't generated when not selected by regex.
+ ASSERT_TRUE(InjectCmd()->Run({"--symdir", GetTestDataDir() + "etm", "-i",
+ GetTestData(PERF_DATA_ETM_TEST_LOOP), "--binary",
+ "no_etm_test_.*", "-o", tmpfile.path}));
+ ASSERT_TRUE(android::base::ReadFileToString(tmpfile.path, &data));
+ ASSERT_EQ(data.find("etm_test_loop"), std::string::npos);
}