diff options
author | Yabin Cui <yabinc@google.com> | 2015-07-14 02:08:23 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-07-14 02:08:24 +0000 |
commit | f1732eeda661c221ce52a1d9506e9e52db8bf377 (patch) | |
tree | 7456e190fdc72d1f6391470838b26702a36c2292 /simpleperf/record_file_reader.cpp | |
parent | dfff022dd84587666909c518123b55a7f73accca (diff) | |
parent | 76769e502d8f0ebf5d2c81b00246727fb0a59925 (diff) | |
download | extras-f1732eeda661c221ce52a1d9506e9e52db8bf377.tar.gz |
Merge "Simpleperf: Support dwarf callgraph recording."
Diffstat (limited to 'simpleperf/record_file_reader.cpp')
-rw-r--r-- | simpleperf/record_file_reader.cpp | 40 |
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; +} |