diff options
Diffstat (limited to 'simpleperf/record.h')
-rw-r--r-- | simpleperf/record.h | 51 |
1 files changed, 47 insertions, 4 deletions
diff --git a/simpleperf/record.h b/simpleperf/record.h index 85dcbc70..55512b8a 100644 --- a/simpleperf/record.h +++ b/simpleperf/record.h @@ -25,6 +25,8 @@ #include <string> #include <vector> +#include <android-base/logging.h> + #include "build_id.h" #include "perf_event.h" @@ -34,11 +36,15 @@ struct ThreadComm; struct ThreadMmap; enum user_record_type { + PERF_RECORD_USER_DEFINED_TYPE_START = 64, PERF_RECORD_ATTR = 64, PERF_RECORD_EVENT_TYPE, PERF_RECORD_TRACING_DATA, PERF_RECORD_BUILD_ID, PERF_RECORD_FINISHED_ROUND, + + SIMPLE_PERF_RECORD_TYPE_START = 32768, + SIMPLE_PERF_RECORD_KERNEL_SYMBOL, }; struct PerfSampleIpType { @@ -139,24 +145,46 @@ struct Record { perf_event_header header; SampleId sample_id; - Record(); - Record(const perf_event_header* pheader); + Record() { + memset(&header, 0, sizeof(header)); + } + Record(const perf_event_header* pheader) { + header = *pheader; + } virtual ~Record() { } + uint32_t type() const { + return header.type; + } + + uint16_t misc() const { + return header.misc; + } + size_t size() const { return header.size; } - uint32_t type() const { - return header.type; + static uint32_t header_size() { + return sizeof(perf_event_header); } bool InKernel() const { return (header.misc & PERF_RECORD_MISC_CPUMODE_MASK) == PERF_RECORD_MISC_KERNEL; } + void SetTypeAndMisc(uint32_t type, uint16_t misc) { + header.type = type; + header.misc = misc; + } + + void SetSize(uint32_t size) { + CHECK_LT(size, 1u << 16); + header.size = size; + } + void Dump(size_t indent = 0) const; virtual std::vector<char> BinaryFormat() const = 0; virtual uint64_t Timestamp() const; @@ -299,6 +327,20 @@ struct BuildIdRecord : public Record { void DumpData(size_t indent) const override; }; +struct KernelSymbolRecord : public Record { + bool end_of_symbols; + std::string kallsyms; + + KernelSymbolRecord() { + } + + KernelSymbolRecord(const perf_event_header* pheader); + std::vector<char> BinaryFormat() const override; + + protected: + void DumpData(size_t indent) const override; +}; + // UnknownRecord is used for unknown record types, it makes sure all unknown records // are not changed when modifying perf.data. struct UnknownRecord : public Record { @@ -371,5 +413,6 @@ ForkRecord CreateForkRecord(const perf_event_attr& attr, uint32_t pid, uint32_t uint32_t ptid, uint64_t event_id); BuildIdRecord CreateBuildIdRecord(bool in_kernel, pid_t pid, const BuildId& build_id, const std::string& filename); +std::vector<KernelSymbolRecord> CreateKernelSymbolRecords(const std::string& kallsyms); #endif // SIMPLE_PERF_RECORD_H_ |