summaryrefslogtreecommitdiff
path: root/simpleperf/record_file_reader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'simpleperf/record_file_reader.cpp')
-rw-r--r--simpleperf/record_file_reader.cpp154
1 files changed, 25 insertions, 129 deletions
diff --git a/simpleperf/record_file_reader.cpp b/simpleperf/record_file_reader.cpp
index b17086a3..4e246b91 100644
--- a/simpleperf/record_file_reader.cpp
+++ b/simpleperf/record_file_reader.cpp
@@ -49,7 +49,6 @@ static const std::map<int, std::string> feature_name_map = {
{FEAT_BRANCH_STACK, "branch_stack"},
{FEAT_PMU_MAPPINGS, "pmu_mappings"},
{FEAT_GROUP_DESC, "group_desc"},
- {FEAT_AUXTRACE, "auxtrace"},
{FEAT_FILE, "file"},
{FEAT_META_INFO, "meta_info"},
};
@@ -79,10 +78,9 @@ std::unique_ptr<RecordFileReader> RecordFileReader::CreateInstance(const std::st
}
auto reader = std::unique_ptr<RecordFileReader>(new RecordFileReader(filename, fp));
if (!reader->ReadHeader() || !reader->ReadAttrSection() ||
- !reader->ReadFeatureSectionDescriptors() || !reader->ReadMetaInfoFeature()) {
+ !reader->ReadFeatureSectionDescriptors()) {
return nullptr;
}
- reader->UseRecordingEnvironment();
return reader;
}
@@ -207,17 +205,6 @@ bool RecordFileReader::ReadIdsForAttr(const FileAttr& attr, std::vector<uint64_t
return true;
}
-void RecordFileReader::UseRecordingEnvironment() {
- std::string arch = ReadFeatureString(FEAT_ARCH);
- if (!arch.empty()) {
- scoped_arch_.reset(new ScopedCurrentArch(GetArchType(arch)));
- }
- auto& meta_info = GetMetaInfoFeature();
- if (auto it = meta_info.find("event_type_info"); it != meta_info.end()) {
- scoped_event_types_.reset(new ScopedEventTypes(it->second));
- }
-}
-
bool RecordFileReader::ReadDataSection(
const std::function<bool(std::unique_ptr<Record>)>& callback) {
std::unique_ptr<Record> record;
@@ -241,7 +228,7 @@ bool RecordFileReader::ReadRecord(std::unique_ptr<Record>& record) {
}
record = nullptr;
if (read_record_size_ < header_.data.size) {
- record = ReadRecord();
+ record = ReadRecord(&read_record_size_);
if (record == nullptr) {
return false;
}
@@ -252,7 +239,7 @@ bool RecordFileReader::ReadRecord(std::unique_ptr<Record>& record) {
return true;
}
-std::unique_ptr<Record> RecordFileReader::ReadRecord() {
+std::unique_ptr<Record> RecordFileReader::ReadRecord(uint64_t* nbytes_read) {
char header_buf[Record::header_size()];
if (!Read(header_buf, Record::header_size())) {
return nullptr;
@@ -271,7 +258,7 @@ std::unique_ptr<Record> RecordFileReader::ReadRecord() {
return nullptr;
}
cur_size += bytes_to_read;
- read_record_size_ += header.size;
+ *nbytes_read += header.size;
if (!Read(header_buf, Record::header_size())) {
return nullptr;
}
@@ -281,7 +268,7 @@ std::unique_ptr<Record> RecordFileReader::ReadRecord() {
LOG(ERROR) << "SPLIT records are not followed by a SPLIT_END record.";
return nullptr;
}
- read_record_size_ += header.size;
+ *nbytes_read += header.size;
header = RecordHeader(buf.data());
p.reset(new char[header.size]);
memcpy(p.get(), buf.data(), buf.size());
@@ -293,7 +280,7 @@ std::unique_ptr<Record> RecordFileReader::ReadRecord() {
return nullptr;
}
}
- read_record_size_ += header.size;
+ *nbytes_read += header.size;
}
const perf_event_attr* attr = &file_attrs_[0].attr;
@@ -318,17 +305,7 @@ std::unique_ptr<Record> RecordFileReader::ReadRecord() {
}
}
}
- 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;
+ return ReadRecordFromOwnedBuffer(*attr, header.type, p.release());
}
bool RecordFileReader::Read(void* buf, size_t len) {
@@ -339,14 +316,6 @@ bool RecordFileReader::Read(void* buf, size_t len) {
return true;
}
-bool RecordFileReader::ReadAtOffset(uint64_t offset, void* buf, size_t len) {
- if (fseek(record_fp_, offset, SEEK_SET) != 0) {
- PLOG(ERROR) << "failed to seek to " << offset;
- return false;
- }
- return Read(buf, len);
-}
-
void RecordFileReader::ProcessEventIdRecord(const EventIdRecord& r) {
for (size_t i = 0; i < r.count; ++i) {
event_ids_for_file_attrs_[r.data[i].attr_id].push_back(r.data[i].event_id);
@@ -373,7 +342,11 @@ bool RecordFileReader::ReadFeatureSection(int feature, std::vector<char>* data)
if (section.size == 0) {
return true;
}
- if (!ReadAtOffset(section.offset, data->data(), data->size())) {
+ if (fseek(record_fp_, section.offset, SEEK_SET) != 0) {
+ PLOG(ERROR) << "fseek() failed";
+ return false;
+ }
+ if (!Read(data->data(), data->size())) {
return false;
}
return true;
@@ -436,25 +409,6 @@ std::string RecordFileReader::ReadFeatureString(int feature) {
return p;
}
-std::vector<uint64_t> RecordFileReader::ReadAuxTraceFeature() {
- std::vector<char> buf;
- if (!ReadFeatureSection(FEAT_AUXTRACE, &buf)) {
- return {};
- }
- std::vector<uint64_t> auxtrace_offset;
- const char* p = buf.data();
- const char* end = buf.data() + buf.size();
- while (p < end) {
- uint64_t offset;
- uint64_t size;
- MoveFromBinaryFormat(offset, p);
- auxtrace_offset.push_back(offset);
- MoveFromBinaryFormat(size, p);
- CHECK_EQ(size, AuxTraceRecord::Size());
- }
- return auxtrace_offset;
-}
-
bool RecordFileReader::ReadFileFeature(size_t& read_pos,
std::string* file_path,
uint32_t* file_type,
@@ -517,21 +471,19 @@ bool RecordFileReader::ReadFileFeature(size_t& read_pos,
return true;
}
-bool RecordFileReader::ReadMetaInfoFeature() {
- if (feature_section_descriptors_.count(FEAT_META_INFO)) {
- std::vector<char> buf;
- if (!ReadFeatureSection(FEAT_META_INFO, &buf)) {
- return false;
- }
- const char* p = buf.data();
- const char* end = buf.data() + buf.size();
- while (p < end) {
- const char* key = p;
- const char* value = key + strlen(key) + 1;
- CHECK(value < end);
- meta_info_[p] = value;
- p = value + strlen(value) + 1;
- }
+bool RecordFileReader::ReadMetaInfoFeature(std::unordered_map<std::string, std::string>* info_map) {
+ std::vector<char> buf;
+ if (!ReadFeatureSection(FEAT_META_INFO, &buf)) {
+ return false;
+ }
+ const char* p = buf.data();
+ const char* end = buf.data() + buf.size();
+ while (p < end) {
+ const char* key = p;
+ const char* value = key + strlen(key) + 1;
+ CHECK(value < end);
+ (*info_map)[p] = value;
+ p = value + strlen(value) + 1;
}
return true;
}
@@ -560,62 +512,6 @@ void RecordFileReader::LoadBuildIdAndFileFeatures(ThreadTree& thread_tree) {
}
}
-bool RecordFileReader::ReadAuxData(uint32_t cpu, uint64_t aux_offset, void* buf, size_t size) {
- long saved_pos = ftell(record_fp_);
- if (saved_pos == -1) {
- PLOG(ERROR) << "ftell() failed";
- return false;
- }
- if (aux_data_location_.empty() && !BuildAuxDataLocation()) {
- return false;
- }
- AuxDataLocation* location = nullptr;
- auto it = aux_data_location_.find(cpu);
- if (it != aux_data_location_.end()) {
- auto comp = [](uint64_t aux_offset, const AuxDataLocation& location) {
- return aux_offset < location.aux_offset;
- };
- auto location_it = std::upper_bound(it->second.begin(), it->second.end(), aux_offset, comp);
- if (location_it != it->second.begin()) {
- --location_it;
- if (location_it->aux_offset + location_it->aux_size >= aux_offset + size) {
- location = &*location_it;
- }
- }
- }
- if (location == nullptr) {
- LOG(ERROR) << "failed to find file offset of aux data: cpu " << cpu << ", aux_offset "
- << aux_offset << ", size " << size;
- return false;
- }
- if (!ReadAtOffset(aux_offset - location->aux_offset + location->file_offset, buf, size)) {
- return false;
- }
- if (fseek(record_fp_, saved_pos, SEEK_SET) != 0) {
- PLOG(ERROR) << "fseek() failed";
- return false;
- }
- return true;
-}
-
-bool RecordFileReader::BuildAuxDataLocation() {
- std::vector<uint64_t> auxtrace_offset = ReadAuxTraceFeature();
- if (auxtrace_offset.empty()) {
- LOG(ERROR) << "failed to read auxtrace feature section";
- return false;
- }
- std::unique_ptr<char[]> buf(new char[AuxTraceRecord::Size()]);
- for (auto offset : auxtrace_offset) {
- if (!ReadAtOffset(offset, buf.get(), AuxTraceRecord::Size())) {
- return false;
- }
- AuxTraceRecord auxtrace(buf.get());
- aux_data_location_[auxtrace.data->cpu].emplace_back(
- auxtrace.data->offset, auxtrace.data->aux_size, offset + auxtrace.size());
- }
- return true;
-}
-
std::vector<std::unique_ptr<Record>> RecordFileReader::DataSection() {
std::vector<std::unique_ptr<Record>> records;
ReadDataSection([&](std::unique_ptr<Record> record) {