dbghelp: Speed up vector iteration by directly using for().

This commit is contained in:
Markus Amsler 2007-05-15 02:05:12 +02:00 committed by Alexandre Julliard
parent a2968c8fab
commit 8bc839a816
6 changed files with 46 additions and 76 deletions

View File

@ -60,9 +60,6 @@ void vector_init(struct vector* v, unsigned elt_sz, unsigned bucket_sz);
unsigned vector_length(const struct vector* v); unsigned vector_length(const struct vector* v);
void* vector_at(const struct vector* v, unsigned pos); void* vector_at(const struct vector* v, unsigned pos);
void* vector_add(struct vector* v, struct pool* pool); void* vector_add(struct vector* v, struct pool* pool);
/*void vector_pool_normalize(struct vector* v, struct pool* pool); */
void* vector_iter_up(const struct vector* v, const void* elt);
void* vector_iter_down(const struct vector* v, const void* elt);
struct sparse_array struct sparse_array
{ {

View File

@ -1004,8 +1004,8 @@ static struct symt* dwarf2_parse_array_type(dwarf2_parse_context_t* ctx,
struct symt* ref_type; struct symt* ref_type;
struct symt* idx_type = NULL; struct symt* idx_type = NULL;
struct attribute min, max, cnt; struct attribute min, max, cnt;
dwarf2_debug_info_t** pchild = NULL;
dwarf2_debug_info_t* child; dwarf2_debug_info_t* child;
int i;
if (di->symt) return di->symt; if (di->symt) return di->symt;
@ -1018,9 +1018,9 @@ static struct symt* dwarf2_parse_array_type(dwarf2_parse_context_t* ctx,
} }
ref_type = dwarf2_lookup_type(ctx, di); ref_type = dwarf2_lookup_type(ctx, di);
while ((pchild = vector_iter_up(&di->children, pchild))) for (i=0; i<vector_length(&di->children); i++)
{ {
child = *pchild; child = *(dwarf2_debug_info_t**)vector_at(&di->children, i);
switch (child->abbrev->tag) switch (child->abbrev->tag)
{ {
case DW_TAG_subrange_type: case DW_TAG_subrange_type:
@ -1162,12 +1162,12 @@ static struct symt* dwarf2_parse_udt_type(dwarf2_parse_context_t* ctx,
if (di->abbrev->have_child) /** any interest to not have child ? */ if (di->abbrev->have_child) /** any interest to not have child ? */
{ {
dwarf2_debug_info_t** pchild = NULL;
dwarf2_debug_info_t* child; dwarf2_debug_info_t* child;
int i;
while ((pchild = vector_iter_up(&di->children, pchild))) for (i=0; i<vector_length(&di->children); i++)
{ {
child = *pchild; child = *(dwarf2_debug_info_t**)vector_at(&di->children, i);
switch (child->abbrev->tag) switch (child->abbrev->tag)
{ {
@ -1227,13 +1227,13 @@ static struct symt* dwarf2_parse_enumeration_type(dwarf2_parse_context_t* ctx,
if (di->abbrev->have_child) /* any interest to not have child ? */ if (di->abbrev->have_child) /* any interest to not have child ? */
{ {
dwarf2_debug_info_t** pchild = NULL;
dwarf2_debug_info_t* child; dwarf2_debug_info_t* child;
int i;
/* FIXME: should we use the sibling stuff ?? */ /* FIXME: should we use the sibling stuff ?? */
while ((pchild = vector_iter_up(&di->children, pchild))) for (i=0; i<vector_length(&di->children); i++)
{ {
child = *pchild; child = *(dwarf2_debug_info_t**)vector_at(&di->children, i);
switch (child->abbrev->tag) switch (child->abbrev->tag)
{ {
@ -1411,12 +1411,12 @@ static void dwarf2_parse_inlined_subroutine(dwarf2_subprogram_t* subpgm,
if (di->abbrev->have_child) /** any interest to not have child ? */ if (di->abbrev->have_child) /** any interest to not have child ? */
{ {
dwarf2_debug_info_t** pchild = NULL;
dwarf2_debug_info_t* child; dwarf2_debug_info_t* child;
int i;
while ((pchild = vector_iter_up(&di->children, pchild))) for (i=0; i<vector_length(&di->children); i++)
{ {
child = *pchild; child = *(dwarf2_debug_info_t**)vector_at(&di->children, i);
switch (child->abbrev->tag) switch (child->abbrev->tag)
{ {
@ -1464,12 +1464,12 @@ static void dwarf2_parse_subprogram_block(dwarf2_subprogram_t* subpgm,
if (di->abbrev->have_child) /** any interest to not have child ? */ if (di->abbrev->have_child) /** any interest to not have child ? */
{ {
dwarf2_debug_info_t** pchild = NULL;
dwarf2_debug_info_t* child; dwarf2_debug_info_t* child;
int i;
while ((pchild = vector_iter_up(&di->children, pchild))) for (i=0; i<vector_length(&di->children); i++)
{ {
child = *pchild; child = *(dwarf2_debug_info_t**)vector_at(&di->children, i);
switch (child->abbrev->tag) switch (child->abbrev->tag)
{ {
@ -1581,12 +1581,12 @@ static struct symt* dwarf2_parse_subprogram(dwarf2_parse_context_t* ctx,
if (di->abbrev->have_child) /** any interest to not have child ? */ if (di->abbrev->have_child) /** any interest to not have child ? */
{ {
dwarf2_debug_info_t** pchild = NULL;
dwarf2_debug_info_t* child; dwarf2_debug_info_t* child;
int i;
while ((pchild = vector_iter_up(&di->children, pchild))) for (i=0; i<vector_length(&di->children); i++)
{ {
child = *pchild; child = *(dwarf2_debug_info_t**)vector_at(&di->children, i);
switch (child->abbrev->tag) switch (child->abbrev->tag)
{ {
@ -1653,12 +1653,12 @@ static struct symt* dwarf2_parse_subroutine_type(dwarf2_parse_context_t* ctx,
if (di->abbrev->have_child) /** any interest to not have child ? */ if (di->abbrev->have_child) /** any interest to not have child ? */
{ {
dwarf2_debug_info_t** pchild = NULL;
dwarf2_debug_info_t* child; dwarf2_debug_info_t* child;
int i;
while ((pchild = vector_iter_up(&di->children, pchild))) for (i=0; i<vector_length(&di->children); i++)
{ {
child = *pchild; child = *(dwarf2_debug_info_t**)vector_at(&di->children, i);
switch (child->abbrev->tag) switch (child->abbrev->tag)
{ {
@ -2005,8 +2005,10 @@ static BOOL dwarf2_parse_compilation_unit(const dwarf2_section_t* sections,
if (di->abbrev->have_child) if (di->abbrev->have_child)
{ {
while ((pdi = vector_iter_up(&di->children, pdi))) int i;
for (i=0; i<vector_length(&di->children); i++)
{ {
pdi = vector_at(&di->children, i);
dwarf2_load_one_entry(&ctx, *pdi, (struct symt_compiland*)di->symt); dwarf2_load_one_entry(&ctx, *pdi, (struct symt_compiland*)di->symt);
} }
} }
@ -2059,9 +2061,11 @@ static enum location_error loc_compute_frame(struct process* pcs,
struct location* pframe; struct location* pframe;
dwarf2_traverse_context_t lctx; dwarf2_traverse_context_t lctx;
enum location_error err; enum location_error err;
int i;
while ((psym = vector_iter_up(&func->vchildren, psym))) for (i=0; i<vector_length(&func->vchildren); i++)
{ {
psym = vector_at(&func->vchildren, i);
if ((*psym)->tag == SymTagCustom) if ((*psym)->tag == SymTagCustom)
{ {
pframe = &((struct symt_function_point*)*psym)->loc; pframe = &((struct symt_function_point*)*psym)->loc;

View File

@ -190,13 +190,15 @@ BOOL WINAPI SymEnumLines(HANDLE hProcess, ULONG64 base, PCSTR compiland,
hash_table_iter_init(&pair.effective->ht_symbols, &hti, NULL); hash_table_iter_init(&pair.effective->ht_symbols, &hti, NULL);
while ((ptr = hash_table_iter_up(&hti))) while ((ptr = hash_table_iter_up(&hti)))
{ {
int i;
sym = GET_ENTRY(ptr, struct symt_ht, hash_elt); sym = GET_ENTRY(ptr, struct symt_ht, hash_elt);
if (sym->symt.tag != SymTagFunction) continue; if (sym->symt.tag != SymTagFunction) continue;
dli = NULL;
sci.FileName[0] = '\0'; sci.FileName[0] = '\0';
while ((dli = vector_iter_up(&((struct symt_function*)sym)->vlines, dli))) for (i=0; i<vector_length(&((struct symt_function*)sym)->vlines); i++)
{ {
dli = vector_at(&((struct symt_function*)sym)->vlines, i);
if (dli->is_source_file) if (dli->is_source_file)
{ {
file = source_get(pair.effective, dli->u.source_file); file = source_get(pair.effective, dli->u.source_file);

View File

@ -174,42 +174,6 @@ void* vector_add(struct vector* v, struct pool* pool)
return vector_at(v, ncurr); return vector_at(v, ncurr);
} }
static unsigned vector_position(const struct vector* v, const void* elt)
{
int i;
for (i = 0; i < v->num_buckets; i++)
{
if (v->buckets[i] <= elt &&
(const char*)elt < (const char*)v->buckets[i] + (v->elt_size << v->shift))
{
return (i << v->shift) +
((const char*)elt - (const char*)v->buckets[i]) / v->elt_size;
}
}
assert(0);
return 0;
}
void* vector_iter_up(const struct vector* v, const void* elt)
{
unsigned pos;
if (!elt) return vector_at(v, 0);
pos = vector_position(v, elt) + 1;
if (pos >= vector_length(v)) return NULL;
return vector_at(v, pos);
}
void* vector_iter_down(const struct vector* v, const void* elt)
{
unsigned pos;
if (!elt) return vector_at(v, vector_length(v) - 1);
pos = vector_position(v, elt);
if (pos == 0) return NULL;
return vector_at(v, pos - 1);
}
/* We construct the sparse array as two vectors (of equal size) /* We construct the sparse array as two vectors (of equal size)
* The first vector (key2index) is the lookup table between the key and * The first vector (key2index) is the lookup table between the key and
* an index in the second vector (elements) * an index in the second vector (elements)

View File

@ -253,6 +253,7 @@ void symt_add_func_line(struct module* module, struct symt_function* func,
{ {
struct line_info* dli; struct line_info* dli;
BOOL last_matches = FALSE; BOOL last_matches = FALSE;
int i;
if (func == NULL || !(dbghelp_options & SYMOPT_LOAD_LINES)) return; if (func == NULL || !(dbghelp_options & SYMOPT_LOAD_LINES)) return;
@ -262,9 +263,9 @@ void symt_add_func_line(struct module* module, struct symt_function* func,
assert(func->symt.tag == SymTagFunction); assert(func->symt.tag == SymTagFunction);
dli = NULL; for (i=vector_length(&func->vlines)-1; i>=0; i--)
while ((dli = vector_iter_down(&func->vlines, dli)))
{ {
dli = vector_at(&func->vlines, i);
if (dli->is_source_file) if (dli->is_source_file)
{ {
last_matches = (source_idx == dli->u.source_file); last_matches = (source_idx == dli->u.source_file);
@ -754,13 +755,13 @@ static BOOL symt_enum_locals_helper(struct module_pair* pair,
regex_t* preg, const struct sym_enum* se, regex_t* preg, const struct sym_enum* se,
struct symt_function* func, const struct vector* v) struct symt_function* func, const struct vector* v)
{ {
struct symt** plsym = NULL;
struct symt* lsym = NULL; struct symt* lsym = NULL;
DWORD pc = pair->pcs->ctx_frame.InstructionOffset; DWORD pc = pair->pcs->ctx_frame.InstructionOffset;
int i;
while ((plsym = vector_iter_up(v, plsym))) for (i=0; i<vector_length(v); i++)
{ {
lsym = *plsym; lsym = *(struct symt**)vector_at(v, i);
switch (lsym->tag) switch (lsym->tag)
{ {
case SymTagBlock: case SymTagBlock:
@ -1228,11 +1229,13 @@ BOOL symt_fill_func_line_info(const struct module* module, const struct symt_fun
{ {
struct line_info* dli = NULL; struct line_info* dli = NULL;
BOOL found = FALSE; BOOL found = FALSE;
int i;
assert(func->symt.tag == SymTagFunction); assert(func->symt.tag == SymTagFunction);
while ((dli = vector_iter_down(&func->vlines, dli))) for (i=vector_length(&func->vlines)-1; i>=0; i--)
{ {
dli = vector_at(&func->vlines, i);
if (!dli->is_source_file) if (!dli->is_source_file)
{ {
if (found || dli->u.pc_offset > addr) continue; if (found || dli->u.pc_offset > addr) continue;

View File

@ -215,10 +215,10 @@ BOOL symt_add_udt_element(struct module* module, struct symt_udt* udt_type,
TRACE_(dbghelp_symt)("Adding %s to UDT %s\n", name, udt_type->hash_elt.name); TRACE_(dbghelp_symt)("Adding %s to UDT %s\n", name, udt_type->hash_elt.name);
if (name) if (name)
{ {
p = NULL; int i;
while ((p = vector_iter_up(&udt_type->vchildren, p))) for (i=0; i<vector_length(&udt_type->vchildren); i++)
{ {
m = (struct symt_data*)*p; m = *(struct symt_data**)vector_at(&udt_type->vchildren, i);
assert(m); assert(m);
assert(m->symt.tag == SymTagData); assert(m->symt.tag == SymTagData);
if (strcmp(m->hash_elt.name, name) == 0) if (strcmp(m->hash_elt.name, name) == 0)
@ -379,8 +379,8 @@ BOOL WINAPI SymEnumTypes(HANDLE hProcess, ULONG64 BaseOfDll,
SYMBOL_INFO* sym_info = (SYMBOL_INFO*)buffer; SYMBOL_INFO* sym_info = (SYMBOL_INFO*)buffer;
const char* tmp; const char* tmp;
struct symt* type; struct symt* type;
void* pos = NULL;
DWORD64 size; DWORD64 size;
int i;
TRACE("(%p %s %p %p)\n", TRACE("(%p %s %p %p)\n",
hProcess, wine_dbgstr_longlong(BaseOfDll), EnumSymbolsCallback, hProcess, wine_dbgstr_longlong(BaseOfDll), EnumSymbolsCallback,
@ -393,9 +393,9 @@ BOOL WINAPI SymEnumTypes(HANDLE hProcess, ULONG64 BaseOfDll,
sym_info->SizeOfStruct = sizeof(SYMBOL_INFO); sym_info->SizeOfStruct = sizeof(SYMBOL_INFO);
sym_info->MaxNameLen = sizeof(buffer) - sizeof(SYMBOL_INFO); sym_info->MaxNameLen = sizeof(buffer) - sizeof(SYMBOL_INFO);
while ((pos = vector_iter_up(&pair.effective->vtypes, pos))) for (i=0; i<vector_length(&pair.effective->vtypes); i++)
{ {
type = *(struct symt**)pos; type = *(struct symt**)vector_at(&pair.effective->vtypes, i);
sym_info->TypeIndex = (DWORD)type; sym_info->TypeIndex = (DWORD)type;
sym_info->info = 0; /* FIXME */ sym_info->info = 0; /* FIXME */
symt_get_info(type, TI_GET_LENGTH, &size); symt_get_info(type, TI_GET_LENGTH, &size);