1 /**************************************************************************
3 * Copyright 2010 VMware, Inc.
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 **************************************************************************/
26 #ifndef _TRACE_PARSER_HPP_
27 #define _TRACE_PARSER_HPP_
33 #include "trace_file.hpp"
34 #include "trace_format.hpp"
35 #include "trace_model.hpp"
44 unsigned next_call_no;
53 typedef std::list<Call *> CallList;
56 // Helper template that extends a base signature structure, with additional
57 // parsing information.
59 struct SigState : public T {
60 // Offset in the file of where signature was defined. It is used when
61 // reparsing to determine whether the signature definition is to be
62 // expected next or not.
66 typedef SigState<FunctionSig> FunctionSigState;
67 typedef SigState<StructSig> StructSigState;
68 typedef SigState<EnumSig> EnumSigState;
69 typedef SigState<BitmaskSig> BitmaskSigState;
71 typedef std::vector<FunctionSigState *> FunctionMap;
72 typedef std::vector<StructSigState *> StructMap;
73 typedef std::vector<EnumSigState *> EnumMap;
74 typedef std::vector<BitmaskSigState *> BitmaskMap;
76 FunctionMap functions;
81 bool m_supportsSeeking;
83 unsigned next_call_no;
86 unsigned long long version;
92 bool open(const char *filename);
96 Call *parse_call(void);
98 bool supportsOffsets() const
100 return file->supportsOffsets();
103 void getBookmark(ParseBookmark &bookmark) {
104 bookmark.offset = file->currentOffset();
105 bookmark.next_call_no = next_call_no;
108 void setBookmark(const ParseBookmark &bookmark) {
109 file->setCurrentOffset(bookmark.offset);
110 next_call_no = bookmark.next_call_no;
115 return file->percentRead();
121 FunctionSig *parse_function_sig(void);
122 StructSig *parse_struct_sig();
123 EnumSig *parse_enum_sig();
124 BitmaskSig *parse_bitmask_sig();
126 void parse_enter(void);
127 void scan_enter(void);
129 Call *parse_leave(void);
130 Call *scan_leave(void);
132 bool parse_call_details(Call *call);
133 bool scan_call_details(Call *call);
135 void parse_arg(Call *call);
136 void scan_arg(Call *call);
138 Value *parse_value(void);
139 void scan_value(void);
147 Value *parse_float();
150 Value *parse_double();
153 Value *parse_string();
159 Value *parse_bitmask();
162 Value *parse_array(void);
163 void scan_array(void);
165 Value *parse_blob(void);
166 void scan_blob(void);
168 Value *parse_struct();
171 Value *parse_opaque();
174 const char * read_string(void);
175 void skip_string(void);
177 unsigned long long read_uint(void);
178 void skip_uint(void);
180 inline int read_byte(void);
181 inline void skip_byte(void);
185 } /* namespace Trace */
187 #endif /* _TRACE_PARSER_HPP_ */