148 lines
4.2 KiB
C
148 lines
4.2 KiB
C
// Copyright 2006 The Android Open Source Project
|
|
|
|
#ifndef PARSE_OPTIONS_INL_H
|
|
#define PARSE_OPTIONS_INL_H
|
|
|
|
// Define a typedef for TraceReaderType and include "parse_options.h"
|
|
// before including this header file in a C++ source file.
|
|
//
|
|
// For example:
|
|
//
|
|
// struct symbol {
|
|
// int elapsed;
|
|
// };
|
|
//
|
|
// typedef TraceReader<symbol> TraceReaderType;
|
|
|
|
|
|
typedef TraceReaderType::symbol_type symbol_type;
|
|
typedef TraceReaderType::region_type region_type;
|
|
typedef TraceReaderType::ProcessState ProcessState;
|
|
|
|
symbol_type *kernel_sym;
|
|
symbol_type *library_sym;
|
|
|
|
// Returns true if the given event is included (or not excluded)
|
|
// from the list of valid events specified by the user on the
|
|
// command line.
|
|
inline bool IsValidEvent(BBEvent *event, symbol_type *sym)
|
|
{
|
|
if (include_some_pids && pid_include_vector.GetBit(event->pid) == 0)
|
|
return false;
|
|
if (exclude_some_pids && pid_exclude_vector.GetBit(event->pid))
|
|
return false;
|
|
if (include_some_procedures) {
|
|
if (sym == NULL || included_procedures.Find(sym->name) == 0)
|
|
return false;
|
|
}
|
|
if (exclude_some_procedures) {
|
|
if (sym == NULL || excluded_procedures.Find(sym->name))
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
inline symbol_type *GetSymbol(TraceReaderType *trace, int pid, uint32_t addr,
|
|
uint64_t time)
|
|
{
|
|
symbol_type *sym = trace->LookupFunction(pid, addr, time);
|
|
|
|
if (lump_kernel && (sym->region->flags & region_type::kIsKernelRegion)) {
|
|
if (kernel_sym == NULL) {
|
|
kernel_sym = sym;
|
|
sym->name = ":kernel";
|
|
} else {
|
|
sym = kernel_sym;
|
|
}
|
|
}
|
|
|
|
if (lump_libraries && (sym->region->flags & region_type::kIsLibraryRegion)) {
|
|
if (library_sym == NULL) {
|
|
library_sym = sym;
|
|
sym->name = ":libs";
|
|
} else {
|
|
sym = library_sym;
|
|
}
|
|
}
|
|
|
|
return sym;
|
|
}
|
|
|
|
inline bool IsIncludedProcedure(symbol_type *sym)
|
|
{
|
|
if (include_kernel_syms && (sym->region->flags & region_type::kIsKernelRegion))
|
|
return true;
|
|
if (include_library_syms && (sym->region->flags & region_type::kIsLibraryRegion))
|
|
return true;
|
|
return included_procedures.Find(sym->name);
|
|
}
|
|
|
|
inline bool IsExcludedProcedure(symbol_type *sym)
|
|
{
|
|
if (exclude_kernel_syms && (sym->region->flags & region_type::kIsKernelRegion))
|
|
return true;
|
|
if (exclude_library_syms && (sym->region->flags & region_type::kIsLibraryRegion))
|
|
return true;
|
|
return excluded_procedures.Find(sym->name);
|
|
}
|
|
|
|
// Returns true on end-of-file.
|
|
inline bool GetNextValidEvent(TraceReaderType *trace,
|
|
BBEvent *event,
|
|
BBEvent *first_ignored_event,
|
|
symbol_type **sym_ptr)
|
|
{
|
|
symbol_type *sym = NULL;
|
|
first_ignored_event->time = 0;
|
|
if (trace->ReadBB(event))
|
|
return true;
|
|
bool recheck = true;
|
|
while (recheck) {
|
|
recheck = false;
|
|
if (include_some_pids) {
|
|
while (pid_include_vector.GetBit(event->pid) == 0) {
|
|
if (first_ignored_event->time == 0)
|
|
*first_ignored_event = *event;
|
|
if (trace->ReadBB(event))
|
|
return true;
|
|
}
|
|
} else if (exclude_some_pids) {
|
|
while (pid_exclude_vector.GetBit(event->pid)) {
|
|
if (first_ignored_event->time == 0)
|
|
*first_ignored_event = *event;
|
|
if (trace->ReadBB(event))
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (include_some_procedures) {
|
|
sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
|
|
while (!IsIncludedProcedure(sym)) {
|
|
if (first_ignored_event->time == 0)
|
|
*first_ignored_event = *event;
|
|
if (trace->ReadBB(event))
|
|
return true;
|
|
recheck = true;
|
|
sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
|
|
}
|
|
} else if (exclude_some_procedures) {
|
|
sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
|
|
while (IsExcludedProcedure(sym)) {
|
|
if (first_ignored_event->time == 0)
|
|
*first_ignored_event = *event;
|
|
if (trace->ReadBB(event))
|
|
return true;
|
|
recheck = true;
|
|
sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
|
|
}
|
|
}
|
|
}
|
|
if (sym == NULL)
|
|
sym = GetSymbol(trace, event->pid, event->bb_addr, event->time);
|
|
|
|
*sym_ptr = sym;
|
|
return false;
|
|
}
|
|
|
|
#endif // PARSE_OPTIONS_INL_H
|