summaryrefslogtreecommitdiff
path: root/simpleperf/record_file_reader.cpp
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2015-07-01 16:16:57 -0700
committerYabin Cui <yabinc@google.com>2015-07-06 13:11:28 -0700
commit638c558339b7f1ae0ed95f64bcf7dbc5b238ed83 (patch)
treec1d44b5fb66b1ff0cef713bdcc6fb9a1f196230e /simpleperf/record_file_reader.cpp
parent5e007c3d699d6509cc88865b40dfc0c5eda36bfa (diff)
downloadextras-638c558339b7f1ae0ed95f64bcf7dbc5b238ed83.tar.gz
Simpleperf: check build id in report command.
1. refactor BuildId type. 2. check build id before parsing symbols in report command. Bug: 22179177 Change-Id: Iefc797a88d4a168e109db786105120c8d6914369
Diffstat (limited to 'simpleperf/record_file_reader.cpp')
-rw-r--r--simpleperf/record_file_reader.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/simpleperf/record_file_reader.cpp b/simpleperf/record_file_reader.cpp
index 8407d32b..b78af51f 100644
--- a/simpleperf/record_file_reader.cpp
+++ b/simpleperf/record_file_reader.cpp
@@ -196,3 +196,25 @@ std::vector<std::string> RecordFileReader::ReadCmdlineFeature() {
}
return cmdline;
}
+
+std::vector<BuildIdRecord> RecordFileReader::ReadBuildIdFeature() {
+ const std::map<int, SectionDesc>& section_map = FeatureSectionDescriptors();
+ auto it = section_map.find(FEAT_BUILD_ID);
+ if (it == section_map.end()) {
+ return std::vector<BuildIdRecord>();
+ }
+ SectionDesc section = it->second;
+ const char* p = DataAtOffset(section.offset);
+ const char* end = DataAtOffset(section.offset + section.size);
+ std::vector<BuildIdRecord> result;
+ while (p < end) {
+ const perf_event_header* header = reinterpret_cast<const perf_event_header*>(p);
+ CHECK_LE(p + header->size, end);
+ BuildIdRecord record(header);
+ // Set type explicitly as the perf.data produced by perf doesn't set it.
+ record.header.type = PERF_RECORD_BUILD_ID;
+ result.push_back(record);
+ p += header->size;
+ }
+ return result;
+}