summaryrefslogtreecommitdiff
path: root/simpleperf/record_file_reader.cpp
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2015-07-14 02:08:23 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-07-14 02:08:24 +0000
commitf1732eeda661c221ce52a1d9506e9e52db8bf377 (patch)
tree7456e190fdc72d1f6391470838b26702a36c2292 /simpleperf/record_file_reader.cpp
parentdfff022dd84587666909c518123b55a7f73accca (diff)
parent76769e502d8f0ebf5d2c81b00246727fb0a59925 (diff)
downloadextras-f1732eeda661c221ce52a1d9506e9e52db8bf377.tar.gz
Merge "Simpleperf: Support dwarf callgraph recording."
Diffstat (limited to 'simpleperf/record_file_reader.cpp')
-rw-r--r--simpleperf/record_file_reader.cpp40
1 files changed, 29 insertions, 11 deletions
diff --git a/simpleperf/record_file_reader.cpp b/simpleperf/record_file_reader.cpp
index 6c528015..5336b80d 100644
--- a/simpleperf/record_file_reader.cpp
+++ b/simpleperf/record_file_reader.cpp
@@ -174,15 +174,24 @@ const std::map<int, SectionDesc>& RecordFileReader::FeatureSectionDescriptors()
return feature_sections_;
}
-std::vector<std::string> RecordFileReader::ReadCmdlineFeature() {
+bool RecordFileReader::GetFeatureSection(int feature, const char** pstart, const char** pend) {
const std::map<int, SectionDesc>& section_map = FeatureSectionDescriptors();
- auto it = section_map.find(FEAT_CMDLINE);
+ auto it = section_map.find(feature);
if (it == section_map.end()) {
- return std::vector<std::string>();
+ return false;
}
SectionDesc section = it->second;
- const char* p = DataAtOffset(section.offset);
- const char* end = DataAtOffset(section.offset + section.size);
+ *pstart = DataAtOffset(section.offset);
+ *pend = DataAtOffset(section.offset + section.size);
+ return true;
+}
+
+std::vector<std::string> RecordFileReader::ReadCmdlineFeature() {
+ const char* p;
+ const char* end;
+ if (!GetFeatureSection(FEAT_CMDLINE, &p, &end)) {
+ return std::vector<std::string>();
+ }
std::vector<std::string> cmdline;
uint32_t arg_count;
MoveFromBinaryFormat(arg_count, p);
@@ -198,14 +207,11 @@ std::vector<std::string> RecordFileReader::ReadCmdlineFeature() {
}
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()) {
+ const char* p;
+ const char* end;
+ if (!GetFeatureSection(FEAT_BUILD_ID, &p, &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);
@@ -218,3 +224,15 @@ std::vector<BuildIdRecord> RecordFileReader::ReadBuildIdFeature() {
}
return result;
}
+
+std::string RecordFileReader::ReadFeatureString(int feature) {
+ const char* p;
+ const char* end;
+ if (!GetFeatureSection(feature, &p, &end)) {
+ return std::string();
+ }
+ uint32_t len;
+ MoveFromBinaryFormat(len, p);
+ CHECK_LE(p + len, end);
+ return p;
+}