| /* | 
 |  * Copyright (C) 2017 The Android Open Source Project | 
 |  * | 
 |  * Licensed under the Apache License, Version 2.0 (the "License"); | 
 |  * you may not use this file except in compliance with the License. | 
 |  * You may obtain a copy of the License at | 
 |  * | 
 |  *      http://www.apache.org/licenses/LICENSE-2.0 | 
 |  * | 
 |  * Unless required by applicable law or agreed to in writing, software | 
 |  * distributed under the License is distributed on an "AS IS" BASIS, | 
 |  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 |  * See the License for the specific language governing permissions and | 
 |  * limitations under the License. | 
 |  */ | 
 |  | 
 | #ifndef SRC_TRACED_PROBES_FTRACE_FORMAT_PARSER_H_ | 
 | #define SRC_TRACED_PROBES_FTRACE_FORMAT_PARSER_H_ | 
 |  | 
 | #include <stdint.h> | 
 | #include <string> | 
 |  | 
 | #include <iosfwd> | 
 | #include <iostream> | 
 | #include <string> | 
 | #include <tuple> | 
 | #include <vector> | 
 |  | 
 | namespace perfetto { | 
 |  | 
 | struct FtraceEvent { | 
 |   struct Field { | 
 |     std::string type_and_name; | 
 |     uint16_t offset; | 
 |     uint16_t size; | 
 |     bool is_signed; | 
 |  | 
 |     bool operator==(const Field& other) const { | 
 |       return std::tie(type_and_name, offset, size, is_signed) == | 
 |              std::tie(other.type_and_name, other.offset, other.size, | 
 |                       other.is_signed); | 
 |     } | 
 |   }; | 
 |  | 
 |   // When making changes / additions to these structs, remember that | 
 |   // proto_translation_table.cc has some fallback code for 'page_header' and | 
 |   // the 'print' event that fill this struct. | 
 |   std::string name; | 
 |   uint32_t id; | 
 |   std::vector<Field> common_fields; | 
 |   std::vector<Field> fields; | 
 | }; | 
 |  | 
 | std::string GetNameFromTypeAndName(const std::string& type_and_name); | 
 |  | 
 | // Allow gtest to pretty print FtraceEvent::Field. | 
 | ::std::ostream& operator<<(::std::ostream& os, const FtraceEvent::Field&); | 
 | void PrintTo(const FtraceEvent::Field& args, ::std::ostream* os); | 
 |  | 
 | // Parses only the body (i.e. contents of format) of an ftrace event format | 
 | // file, e.g. | 
 | // | 
 | //   field:unsigned short common_type;  offset:0;  size:2;  signed:0; | 
 | //   field:unsigned char common_flags;  offset:2;  size:1;  signed:0; | 
 | //   field:unsigned char common_preempt_count;  offset:3;  size:1;  signed:0; | 
 | //   field:int common_pid;  offset:4;  size:4;  signed:1; | 
 | // | 
 | //   field:dev_t dev;  offset:8;  size:4;  signed:0; | 
 | //   field:ino_t ino;  offset:12;  size:4;  signed:0; | 
 | //   field:ino_t dir;  offset:16;  size:4;  signed:0; | 
 | //   field:__u16 mode;  offset:20;  size:2;  signed:0; | 
 | bool ParseFtraceEventBody(std::string input, | 
 |                           std::vector<FtraceEvent::Field>* common_fields, | 
 |                           std::vector<FtraceEvent::Field>* fields, | 
 |                           bool disable_logging_for_testing = false); | 
 | // Parses ftrace event format file. This includes the headers specifying | 
 | // name and ID of the event, e.g. | 
 | // | 
 | // name: ext4_allocate_inode | 
 | // ID: 309 | 
 | // format: | 
 | //   field:unsigned short common_type;  offset:0;  size:2;  signed:0; | 
 | //   field:unsigned char common_flags;  offset:2;  size:1;  signed:0; | 
 | //   field:unsigned char common_preempt_count;  offset:3;  size:1;  signed:0; | 
 | //   field:int common_pid;  offset:4;  size:4;  signed:1; | 
 | // | 
 | //   field:dev_t dev;  offset:8;  size:4;  signed:0; | 
 | //   field:ino_t ino;  offset:12;  size:4;  signed:0; | 
 | //   field:ino_t dir;  offset:16;  size:4;  signed:0; | 
 | //   field:__u16 mode;  offset:20;  size:2;  signed:0; | 
 | bool ParseFtraceEvent(std::string input, FtraceEvent* output = nullptr); | 
 |  | 
 | }  // namespace perfetto | 
 |  | 
 | #endif  // SRC_TRACED_PROBES_FTRACE_FORMAT_PARSER_H_ |