summaryrefslogtreecommitdiff
path: root/simpleperf/record_file_reader.cpp
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2019-07-25 15:12:58 -0700
committerYabin Cui <yabinc@google.com>2019-07-29 12:21:31 -0700
commit1172d7ea44cb0cc1d3327a7642f7ab770d43e2f0 (patch)
treed07dc0e2e74bc72617539e51fc4931f3db7e1db8 /simpleperf/record_file_reader.cpp
parent14c83fced1518a44f917c71023278acbc053af9f (diff)
downloadextras-1172d7ea44cb0cc1d3327a7642f7ab770d43e2f0.tar.gz
simpleperf: support recording etm data in perf.data.
1. In event_fd.cpp, add functions to create aux buffer and read etm data. 2. In record.h, Add AuxTraceRecord. 2. In RecordReadThread.cpp, wrap etm data into AuxTraceRecords. 3. Add logic to read and write AuxTraceRecords in perf.data. 4. Show recorded etm data size after recording. Bug: 135204414 Test: run simpleperf_unit_test. Change-Id: I3b20fe8f3c786f130f38e34962ca9f86a31fc584
Diffstat (limited to 'simpleperf/record_file_reader.cpp')
-rw-r--r--simpleperf/record_file_reader.cpp22
1 files changed, 16 insertions, 6 deletions
diff --git a/simpleperf/record_file_reader.cpp b/simpleperf/record_file_reader.cpp
index d57d3d8d..88617007 100644
--- a/simpleperf/record_file_reader.cpp
+++ b/simpleperf/record_file_reader.cpp
@@ -240,7 +240,7 @@ bool RecordFileReader::ReadRecord(std::unique_ptr<Record>& record) {
}
record = nullptr;
if (read_record_size_ < header_.data.size) {
- record = ReadRecord(&read_record_size_);
+ record = ReadRecord();
if (record == nullptr) {
return false;
}
@@ -251,7 +251,7 @@ bool RecordFileReader::ReadRecord(std::unique_ptr<Record>& record) {
return true;
}
-std::unique_ptr<Record> RecordFileReader::ReadRecord(uint64_t* nbytes_read) {
+std::unique_ptr<Record> RecordFileReader::ReadRecord() {
char header_buf[Record::header_size()];
if (!Read(header_buf, Record::header_size())) {
return nullptr;
@@ -270,7 +270,7 @@ std::unique_ptr<Record> RecordFileReader::ReadRecord(uint64_t* nbytes_read) {
return nullptr;
}
cur_size += bytes_to_read;
- *nbytes_read += header.size;
+ read_record_size_ += header.size;
if (!Read(header_buf, Record::header_size())) {
return nullptr;
}
@@ -280,7 +280,7 @@ std::unique_ptr<Record> RecordFileReader::ReadRecord(uint64_t* nbytes_read) {
LOG(ERROR) << "SPLIT records are not followed by a SPLIT_END record.";
return nullptr;
}
- *nbytes_read += header.size;
+ read_record_size_ += header.size;
header = RecordHeader(buf.data());
p.reset(new char[header.size]);
memcpy(p.get(), buf.data(), buf.size());
@@ -292,7 +292,7 @@ std::unique_ptr<Record> RecordFileReader::ReadRecord(uint64_t* nbytes_read) {
return nullptr;
}
}
- *nbytes_read += header.size;
+ read_record_size_ += header.size;
}
const perf_event_attr* attr = &file_attrs_[0].attr;
@@ -317,7 +317,17 @@ std::unique_ptr<Record> RecordFileReader::ReadRecord(uint64_t* nbytes_read) {
}
}
}
- return ReadRecordFromOwnedBuffer(*attr, header.type, p.release());
+ auto r = ReadRecordFromOwnedBuffer(*attr, header.type, p.release());
+ if (r->type() == PERF_RECORD_AUXTRACE) {
+ auto auxtrace = static_cast<AuxTraceRecord*>(r.get());
+ auxtrace->location.file_offset = header_.data.offset + read_record_size_;
+ read_record_size_ += auxtrace->data->aux_size;
+ if (fseek(record_fp_, auxtrace->data->aux_size, SEEK_CUR) != 0) {
+ PLOG(ERROR) << "fseek() failed";
+ return nullptr;
+ }
+ }
+ return r;
}
bool RecordFileReader::Read(void* buf, size_t len) {