summaryrefslogtreecommitdiff
path: root/simpleperf/report_lib_interface.cpp
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2017-03-16 13:00:43 -0700
committerYabin Cui <yabinc@google.com>2017-03-17 18:36:23 -0700
commit129b5d2f72fbee901a504d328da5a9037b03a7b6 (patch)
tree187b6514e605bee21b61733b3ddd3c336a2c2277 /simpleperf/report_lib_interface.cpp
parent5b88b5289af87196d46f71b96817e8f9edd5dc35 (diff)
downloadextras-129b5d2f72fbee901a504d328da5a9037b03a7b6.tar.gz
simpleperf: add script to generate proto data used by pprof.
Also change Addr2Line to support inline functions. Bug: http://b/35726123 Test: run gen_pprof_proto.py manually. Change-Id: Ia2f84ac142e7075ea902f3456235db24567e4fcd
Diffstat (limited to 'simpleperf/report_lib_interface.cpp')
-rw-r--r--simpleperf/report_lib_interface.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/simpleperf/report_lib_interface.cpp b/simpleperf/report_lib_interface.cpp
index cc793074..0d4380f6 100644
--- a/simpleperf/report_lib_interface.cpp
+++ b/simpleperf/report_lib_interface.cpp
@@ -47,11 +47,18 @@ struct Event {
const char* name;
};
+struct Mapping {
+ uint64_t start;
+ uint64_t end;
+ uint64_t pgoff;
+};
+
struct SymbolEntry {
const char* dso_name;
uint64_t vaddr_in_file;
const char* symbol_name;
uint64_t symbol_addr;
+ Mapping* mapping;
};
struct CallChainEntry {
@@ -130,6 +137,7 @@ class ReportLib {
private:
Sample* GetCurrentSample();
bool OpenRecordFileIfNecessary();
+ Mapping* AddMapping(const MapEntry& map);
std::unique_ptr<android::base::ScopedLogSeverity> log_severity_;
std::string record_filename_;
@@ -141,6 +149,7 @@ class ReportLib {
Event current_event_;
SymbolEntry current_symbol_;
CallChain current_callchain_;
+ std::vector<std::unique_ptr<Mapping>> current_mappings_;
std::vector<CallChainEntry> callchain_entries_;
std::string build_id_string_;
int update_flag_;
@@ -198,6 +207,7 @@ Sample* ReportLib::GetNextSample() {
}
}
update_flag_ = 0;
+ current_mappings_.clear();
return GetCurrentSample();
}
@@ -250,6 +260,7 @@ SymbolEntry* ReportLib::GetSymbolOfCurrentSample() {
current_symbol_.vaddr_in_file = vaddr_in_file;
current_symbol_.symbol_name = symbol->DemangledName();
current_symbol_.symbol_addr = symbol->addr;
+ current_symbol_.mapping = AddMapping(*map);
update_flag_ |= UPDATE_FLAG_OF_SYMBOL;
}
return &current_symbol_;
@@ -296,6 +307,7 @@ CallChain* ReportLib::GetCallChainOfCurrentSample() {
entry.symbol.vaddr_in_file = vaddr_in_file;
entry.symbol.symbol_name = symbol->DemangledName();
entry.symbol.symbol_addr = symbol->addr;
+ entry.symbol.mapping = AddMapping(*map);
callchain_entries_.push_back(entry);
}
}
@@ -307,6 +319,15 @@ CallChain* ReportLib::GetCallChainOfCurrentSample() {
return &current_callchain_;
}
+Mapping* ReportLib::AddMapping(const MapEntry& map) {
+ current_mappings_.emplace_back(std::unique_ptr<Mapping>(new Mapping));
+ Mapping* mapping = current_mappings_.back().get();
+ mapping->start = map.start_addr;
+ mapping->end = map.start_addr + map.len;
+ mapping->pgoff = map.pgoff;
+ return mapping;
+}
+
const char* ReportLib::GetBuildIdForPath(const char* path) {
if (!OpenRecordFileIfNecessary()) {
build_id_string_.clear();