summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2021-07-13 14:18:06 -0700
committerYabin Cui <yabinc@google.com>2021-07-13 14:23:37 -0700
commit078e0c4a3d00d170da578d51719f7684f43a2768 (patch)
tree8426ef5af325b98c90d4b2278284065ca4328a6b
parentefe810de08f8224f40bc88ebdf2d8fc0e1f264be (diff)
downloadextras-078e0c4a3d00d170da578d51719f7684f43a2768.tar.gz
simpleperf: fix dumping arm regs.
In perf.data recorded for 32-bit processes on arm64, the register data contains both arm registers and arm64 registers. So GetRegName() needs to support arm64 registers when arch == ARCH_ARM. Also remove an unneeded warning in dump cmd. Bug: none Test: run simpleperf_unit_test Change-Id: I2c73a422f2965efd1686fec62a8b6ddd43fa2687
-rw-r--r--simpleperf/cmd_dumprecord.cpp4
-rw-r--r--simpleperf/cmd_dumprecord_test.cpp4
-rw-r--r--simpleperf/perf_regs.cpp7
-rw-r--r--simpleperf/testdata/perf_with_arm_regs.databin0 -> 11496 bytes
4 files changed, 8 insertions, 7 deletions
diff --git a/simpleperf/cmd_dumprecord.cpp b/simpleperf/cmd_dumprecord.cpp
index 9a5586bb..142ae5cb 100644
--- a/simpleperf/cmd_dumprecord.cpp
+++ b/simpleperf/cmd_dumprecord.cpp
@@ -284,10 +284,6 @@ void DumpRecordCommand::DumpFileHeader() {
<< "doesn't match expected header size " << sizeof(header);
}
printf("attr_size: %" PRId64 "\n", header.attr_size);
- if (header.attr_size != sizeof(FileAttr)) {
- LOG(WARNING) << "record file attr size " << header.attr_size
- << " doesn't match expected attr size " << sizeof(FileAttr);
- }
printf("attrs[file section]: offset %" PRId64 ", size %" PRId64 "\n", header.attrs.offset,
header.attrs.size);
printf("data[file section]: offset %" PRId64 ", size %" PRId64 "\n", header.data.offset,
diff --git a/simpleperf/cmd_dumprecord_test.cpp b/simpleperf/cmd_dumprecord_test.cpp
index e6dc5c65..e6cc5e23 100644
--- a/simpleperf/cmd_dumprecord_test.cpp
+++ b/simpleperf/cmd_dumprecord_test.cpp
@@ -77,3 +77,7 @@ TEST(cmd_dump, etm_data) {
// Check if we can decode etm data into instruction range elements.
ASSERT_NE(data.find("OCSD_GEN_TRC_ELEM_INSTR_RANGE"), std::string::npos);
}
+
+TEST(cmd_dump, dump_arm_regs_recorded_in_arm64) {
+ ASSERT_TRUE(DumpCmd()->Run({GetTestData("perf_with_arm_regs.data")}));
+}
diff --git a/simpleperf/perf_regs.cpp b/simpleperf/perf_regs.cpp
index cccd136f..59db45f6 100644
--- a/simpleperf/perf_regs.cpp
+++ b/simpleperf/perf_regs.cpp
@@ -144,9 +144,10 @@ std::string GetRegName(size_t regno, ArchType arch) {
if (reg >= PERF_REG_ARM_R0 && reg <= PERF_REG_ARM_R10) {
return android::base::StringPrintf("r%d", reg - PERF_REG_ARM_R0);
}
- auto it = arm_reg_map.find(reg);
- CHECK(it != arm_reg_map.end()) << "unknown reg " << reg;
- return it->second;
+ if (auto it = arm_reg_map.find(reg); it != arm_reg_map.end()) {
+ return it->second;
+ }
+ FALLTHROUGH_INTENDED;
}
case ARCH_ARM64: {
if (reg >= PERF_REG_ARM64_X0 && reg <= PERF_REG_ARM64_X29) {
diff --git a/simpleperf/testdata/perf_with_arm_regs.data b/simpleperf/testdata/perf_with_arm_regs.data
new file mode 100644
index 00000000..b12ac506
--- /dev/null
+++ b/simpleperf/testdata/perf_with_arm_regs.data
Binary files differ