diff options
author | Yabin Cui <yabinc@google.com> | 2021-07-13 14:18:06 -0700 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2021-07-13 14:23:37 -0700 |
commit | 078e0c4a3d00d170da578d51719f7684f43a2768 (patch) | |
tree | 8426ef5af325b98c90d4b2278284065ca4328a6b | |
parent | efe810de08f8224f40bc88ebdf2d8fc0e1f264be (diff) | |
download | extras-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.cpp | 4 | ||||
-rw-r--r-- | simpleperf/cmd_dumprecord_test.cpp | 4 | ||||
-rw-r--r-- | simpleperf/perf_regs.cpp | 7 | ||||
-rw-r--r-- | simpleperf/testdata/perf_with_arm_regs.data | bin | 0 -> 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 Binary files differnew file mode 100644 index 00000000..b12ac506 --- /dev/null +++ b/simpleperf/testdata/perf_with_arm_regs.data |