OSDN Git Service

simpleperf: Accept --binary option as regex in inject cmd
authorYi Kong <yikong@google.com>
Mon, 6 Jan 2020 23:22:55 +0000 (15:22 -0800)
committerYi Kong <yikong@google.com>
Mon, 6 Jan 2020 23:26:28 +0000 (15:26 -0800)
This would allow us to more efficiently generate AudoFDO profiles for
multiple binaries.

Test: simpleperf_unit_test
Bug: 79161490
Change-Id: I45b444b8cffd8eb72e4079dcf66a176da0da5b6d

simpleperf/cmd_inject.cpp
simpleperf/cmd_inject_test.cpp

index 9cf40b9..bbf9448 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <memory>
 #include <string>
+#include <regex>
 
 #include "ETMDecoder.h"
 #include "command.h"
@@ -51,7 +52,7 @@ class InjectCommand : public Command {
       : 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"
@@ -91,7 +92,7 @@ class InjectCommand : public Command {
         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;
@@ -147,7 +148,7 @@ class InjectCommand : public Command {
   }
 
   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()];
@@ -192,7 +193,7 @@ class InjectCommand : public Command {
     }
   }
 
-  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_;
index 3401360..0d66d6c 100644 (file)
@@ -43,10 +43,24 @@ TEST(cmd_inject, binary_option) {
   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);
 }