1*288bf522SAndroid Build Coastguard Worker /* 2*288bf522SAndroid Build Coastguard Worker * Copyright (C) 2016 The Android Open Source Project 3*288bf522SAndroid Build Coastguard Worker * 4*288bf522SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*288bf522SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*288bf522SAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*288bf522SAndroid Build Coastguard Worker * 8*288bf522SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*288bf522SAndroid Build Coastguard Worker * 10*288bf522SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*288bf522SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*288bf522SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*288bf522SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*288bf522SAndroid Build Coastguard Worker * limitations under the License. 15*288bf522SAndroid Build Coastguard Worker */ 16*288bf522SAndroid Build Coastguard Worker 17*288bf522SAndroid Build Coastguard Worker #ifndef SIMPLE_PERF_TRACING_H_ 18*288bf522SAndroid Build Coastguard Worker #define SIMPLE_PERF_TRACING_H_ 19*288bf522SAndroid Build Coastguard Worker 20*288bf522SAndroid Build Coastguard Worker #include <optional> 21*288bf522SAndroid Build Coastguard Worker #include <set> 22*288bf522SAndroid Build Coastguard Worker #include <vector> 23*288bf522SAndroid Build Coastguard Worker 24*288bf522SAndroid Build Coastguard Worker #include <android-base/logging.h> 25*288bf522SAndroid Build Coastguard Worker 26*288bf522SAndroid Build Coastguard Worker #include "event_type.h" 27*288bf522SAndroid Build Coastguard Worker #include "utils.h" 28*288bf522SAndroid Build Coastguard Worker 29*288bf522SAndroid Build Coastguard Worker namespace simpleperf { 30*288bf522SAndroid Build Coastguard Worker 31*288bf522SAndroid Build Coastguard Worker struct TracingField { 32*288bf522SAndroid Build Coastguard Worker std::string name; 33*288bf522SAndroid Build Coastguard Worker size_t offset = 0; 34*288bf522SAndroid Build Coastguard Worker size_t elem_size = 0; 35*288bf522SAndroid Build Coastguard Worker size_t elem_count = 1; 36*288bf522SAndroid Build Coastguard Worker bool is_signed = false; 37*288bf522SAndroid Build Coastguard Worker bool is_dynamic = false; 38*288bf522SAndroid Build Coastguard Worker 39*288bf522SAndroid Build Coastguard Worker bool operator==(const TracingField& other) const { 40*288bf522SAndroid Build Coastguard Worker return name == other.name && offset == other.offset && elem_size == other.elem_size && 41*288bf522SAndroid Build Coastguard Worker elem_count == other.elem_count && is_signed == other.is_signed && 42*288bf522SAndroid Build Coastguard Worker is_dynamic == other.is_dynamic; 43*288bf522SAndroid Build Coastguard Worker } 44*288bf522SAndroid Build Coastguard Worker }; 45*288bf522SAndroid Build Coastguard Worker 46*288bf522SAndroid Build Coastguard Worker struct TracingFieldPlace { 47*288bf522SAndroid Build Coastguard Worker uint32_t offset; 48*288bf522SAndroid Build Coastguard Worker uint32_t size; 49*288bf522SAndroid Build Coastguard Worker ReadFromDataTracingFieldPlace50*288bf522SAndroid Build Coastguard Worker uint64_t ReadFromData(const char* raw_data) { 51*288bf522SAndroid Build Coastguard Worker return ConvertBytesToValue(raw_data + offset, size); 52*288bf522SAndroid Build Coastguard Worker } 53*288bf522SAndroid Build Coastguard Worker }; 54*288bf522SAndroid Build Coastguard Worker 55*288bf522SAndroid Build Coastguard Worker struct StringTracingFieldPlace { 56*288bf522SAndroid Build Coastguard Worker uint32_t offset; 57*288bf522SAndroid Build Coastguard Worker uint32_t size; 58*288bf522SAndroid Build Coastguard Worker ReadFromDataStringTracingFieldPlace59*288bf522SAndroid Build Coastguard Worker std::string ReadFromData(const char* raw_data) { 60*288bf522SAndroid Build Coastguard Worker char s[size + 1]; 61*288bf522SAndroid Build Coastguard Worker s[size] = '\0'; 62*288bf522SAndroid Build Coastguard Worker memcpy(s, raw_data + offset, size); 63*288bf522SAndroid Build Coastguard Worker return s; 64*288bf522SAndroid Build Coastguard Worker } 65*288bf522SAndroid Build Coastguard Worker }; 66*288bf522SAndroid Build Coastguard Worker 67*288bf522SAndroid Build Coastguard Worker struct TracingFormat { 68*288bf522SAndroid Build Coastguard Worker std::string system_name; 69*288bf522SAndroid Build Coastguard Worker std::string name; 70*288bf522SAndroid Build Coastguard Worker uint64_t id = 0; 71*288bf522SAndroid Build Coastguard Worker std::vector<TracingField> fields; 72*288bf522SAndroid Build Coastguard Worker GetFieldTracingFormat73*288bf522SAndroid Build Coastguard Worker void GetField(const std::string& name, TracingFieldPlace& place) const { 74*288bf522SAndroid Build Coastguard Worker const TracingField& field = GetField(name); 75*288bf522SAndroid Build Coastguard Worker place.offset = field.offset; 76*288bf522SAndroid Build Coastguard Worker place.size = field.elem_size; 77*288bf522SAndroid Build Coastguard Worker } 78*288bf522SAndroid Build Coastguard Worker GetFieldTracingFormat79*288bf522SAndroid Build Coastguard Worker void GetField(const std::string& name, StringTracingFieldPlace& place) const { 80*288bf522SAndroid Build Coastguard Worker const TracingField& field = GetField(name); 81*288bf522SAndroid Build Coastguard Worker place.offset = field.offset; 82*288bf522SAndroid Build Coastguard Worker place.size = field.elem_count; 83*288bf522SAndroid Build Coastguard Worker } 84*288bf522SAndroid Build Coastguard Worker 85*288bf522SAndroid Build Coastguard Worker private: GetFieldTracingFormat86*288bf522SAndroid Build Coastguard Worker const TracingField& GetField(const std::string& name) const { 87*288bf522SAndroid Build Coastguard Worker for (const auto& field : fields) { 88*288bf522SAndroid Build Coastguard Worker if (field.name == name) { 89*288bf522SAndroid Build Coastguard Worker return field; 90*288bf522SAndroid Build Coastguard Worker } 91*288bf522SAndroid Build Coastguard Worker } 92*288bf522SAndroid Build Coastguard Worker LOG(FATAL) << "Couldn't find field " << name << "in TracingFormat of " << this->name; 93*288bf522SAndroid Build Coastguard Worker return fields[0]; 94*288bf522SAndroid Build Coastguard Worker } 95*288bf522SAndroid Build Coastguard Worker }; 96*288bf522SAndroid Build Coastguard Worker 97*288bf522SAndroid Build Coastguard Worker class TracingFile; 98*288bf522SAndroid Build Coastguard Worker 99*288bf522SAndroid Build Coastguard Worker class Tracing { 100*288bf522SAndroid Build Coastguard Worker public: 101*288bf522SAndroid Build Coastguard Worker static std::unique_ptr<Tracing> Create(const std::vector<char>& data); 102*288bf522SAndroid Build Coastguard Worker ~Tracing(); 103*288bf522SAndroid Build Coastguard Worker void Dump(size_t indent); 104*288bf522SAndroid Build Coastguard Worker std::optional<TracingFormat> GetTracingFormatHavingId(uint64_t trace_event_id); 105*288bf522SAndroid Build Coastguard Worker std::string GetTracingEventNameHavingId(uint64_t trace_event_id); 106*288bf522SAndroid Build Coastguard Worker const std::string& GetKallsyms() const; 107*288bf522SAndroid Build Coastguard Worker uint32_t GetPageSize() const; 108*288bf522SAndroid Build Coastguard Worker 109*288bf522SAndroid Build Coastguard Worker private: 110*288bf522SAndroid Build Coastguard Worker Tracing(); 111*288bf522SAndroid Build Coastguard Worker 112*288bf522SAndroid Build Coastguard Worker std::unique_ptr<TracingFile> tracing_file_; 113*288bf522SAndroid Build Coastguard Worker std::vector<TracingFormat> tracing_formats_; 114*288bf522SAndroid Build Coastguard Worker }; 115*288bf522SAndroid Build Coastguard Worker 116*288bf522SAndroid Build Coastguard Worker bool GetTracingData(const std::vector<const EventType*>& event_types, std::vector<char>* data); 117*288bf522SAndroid Build Coastguard Worker 118*288bf522SAndroid Build Coastguard Worker // use_quote: whether or not to use quotes in string operands 119*288bf522SAndroid Build Coastguard Worker // used_fields: field names used in the filter 120*288bf522SAndroid Build Coastguard Worker // Return adjusted filter on success, otherwise return std::nullopt. 121*288bf522SAndroid Build Coastguard Worker using FieldNameSet = std::set<std::string>; 122*288bf522SAndroid Build Coastguard Worker std::optional<std::string> AdjustTracepointFilter(const std::string& filter, bool use_quote, 123*288bf522SAndroid Build Coastguard Worker FieldNameSet* used_fields); 124*288bf522SAndroid Build Coastguard Worker std::optional<FieldNameSet> GetFieldNamesForTracepointEvent(const EventType& event); 125*288bf522SAndroid Build Coastguard Worker TracingFormat ParseTracingFormat(const std::string& data); 126*288bf522SAndroid Build Coastguard Worker 127*288bf522SAndroid Build Coastguard Worker } // namespace simpleperf 128*288bf522SAndroid Build Coastguard Worker 129*288bf522SAndroid Build Coastguard Worker #endif // SIMPLE_PERF_TRACING_H_ 130