blob: f218cc15d9c417a05493b0ca68034051e3c0243e [file] [log] [blame]
The Android Open Source Project5c118522008-10-21 07:00:00 -07001// Copyright 2006 The Android Open Source Project
2
3#ifndef PARSE_OPTIONS_INL_H
4#define PARSE_OPTIONS_INL_H
5
6// Define a typedef for TraceReaderType and include "parse_options.h"
7// before including this header file in a C++ source file.
8//
9// For example:
10//
11// struct symbol {
12// int elapsed;
13// };
14//
15// typedef TraceReader<symbol> TraceReaderType;
16
17
18typedef TraceReaderType::symbol_type symbol_type;
19typedef TraceReaderType::region_type region_type;
20typedef TraceReaderType::ProcessState ProcessState;
21
22symbol_type *kernel_sym;
23symbol_type *library_sym;
24
25// Returns true if the given event is included (or not excluded)
26// from the list of valid events specified by the user on the
27// command line.
28inline bool IsValidEvent(BBEvent *event, symbol_type *sym)
29{
30 if (include_some_pids && pid_include_vector.GetBit(event->pid) == 0)
31 return false;
32 if (exclude_some_pids && pid_exclude_vector.GetBit(event->pid))
33 return false;
34 if (include_some_procedures) {
35 if (sym == NULL || included_procedures.Find(sym->name) == 0)
36 return false;
37 }
38 if (exclude_some_procedures) {
39 if (sym == NULL || excluded_procedures.Find(sym->name))
40 return false;
41 }
42 return true;
43}
44
45inline symbol_type *GetSymbol(TraceReaderType *trace, int pid, uint32_t addr,
46 uint64_t time)
47{
48 symbol_type *sym = trace->LookupFunction(pid, addr, time);
49
50 if (lump_kernel && (sym->region->flags & region_type::kIsKernelRegion)) {
51 if (kernel_sym == NULL) {
52 kernel_sym = sym;
53 sym->name = ":kernel";
54 } else {
55 sym = kernel_sym;
56 }
57 }
58
59 if (lump_libraries && (sym->region->flags & region_type::kIsLibraryRegion)) {
60 if (library_sym == NULL) {
61 library_sym = sym;
62 sym->name = ":libs";
63 } else {
64 sym = library_sym;
65 }
66 }
67
68 return sym;
69}
70
71inline bool IsIncludedProcedure(symbol_type *sym)
72{
73 if (include_kernel_syms && (sym->region->flags & region_type::kIsKernelRegion))
74 return true;
75 if (include_library_syms && (sym->region->flags & region_type::kIsLibraryRegion))
76 return true;
77 return included_procedures.Find(sym->name);
78}
79
80inline bool IsExcludedProcedure(symbol_type *sym)
81{
82 if (exclude_kernel_syms && (sym->region->flags & region_type::kIsKernelRegion))
83 return true;
84 if (exclude_library_syms && (sym->region->flags & region_type::kIsLibraryRegion))
85 return true;
86 return excluded_procedures.Find(sym->name);
87}
88
89// Returns true on end-of-file.
90inline bool GetNextValidEvent(TraceReaderType *trace,
91 BBEvent *event,
92 BBEvent *first_ignored_event,
93 symbol_type **sym_ptr)
94{
95 symbol_type *sym = NULL;
96 first_ignored_event->time = 0;
97 if (trace->ReadBB(event))
98 return true;
99 bool recheck = true;
100 while (recheck) {
101 recheck = false;
102 if (include_some_pids) {
103 while (pid_include_vector.GetBit(event->pid) == 0) {
104 if (first_ignored_event->time == 0)
105 *first_ignored_event = *event;
106 if (trace->ReadBB(event))
107 return true;
108 }
109 } else if (exclude_some_pids) {
110 while (pid_exclude_vector.GetBit(event->pid)) {
111 if (first_ignored_event->time == 0)
112 *first_ignored_event = *event;
113 if (trace->ReadBB(event))
114 return true;
115 }
116 }
117
118 if (include_some_procedures) {
119 sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
120 while (!IsIncludedProcedure(sym)) {
121 if (first_ignored_event->time == 0)
122 *first_ignored_event = *event;
123 if (trace->ReadBB(event))
124 return true;
125 recheck = true;
126 sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
127 }
128 } else if (exclude_some_procedures) {
129 sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
130 while (IsExcludedProcedure(sym)) {
131 if (first_ignored_event->time == 0)
132 *first_ignored_event = *event;
133 if (trace->ReadBB(event))
134 return true;
135 recheck = true;
136 sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
137 }
138 }
139 }
140 if (sym == NULL)
141 sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
142
143 *sym_ptr = sym;
144 return false;
145}
146
147#endif // PARSE_OPTIONS_INL_H