Commit 790a2852 authored by Eric Pouech's avatar Eric Pouech Committed by Alexandre Julliard

dbghelp: Use addr_range for storing symt_function address and size.

parent c576b0c7
...@@ -694,7 +694,7 @@ BOOL WINAPI SymSetScopeFromIndex(HANDLE hProcess, ULONG64 addr, DWORD index) ...@@ -694,7 +694,7 @@ BOOL WINAPI SymSetScopeFromIndex(HANDLE hProcess, ULONG64 addr, DWORD index)
sym = symt_index2ptr(pair.effective, index); sym = symt_index2ptr(pair.effective, index);
if (!symt_check_tag(sym, SymTagFunction)) return FALSE; if (!symt_check_tag(sym, SymTagFunction)) return FALSE;
pair.pcs->localscope_pc = ((struct symt_function*)sym)->address; /* FIXME of FuncDebugStart when it exists? */ pair.pcs->localscope_pc = ((struct symt_function*)sym)->ranges[0].low; /* FIXME of FuncDebugStart when it exists? */
pair.pcs->localscope_symt = sym; pair.pcs->localscope_symt = sym;
return TRUE; return TRUE;
......
...@@ -120,6 +120,11 @@ struct addr_range ...@@ -120,6 +120,11 @@ struct addr_range
DWORD64 high; /* absolute address of first byte after the range */ DWORD64 high; /* absolute address of first byte after the range */
}; };
static inline DWORD64 addr_range_size(const struct addr_range* ar)
{
return ar->high - ar->low;
}
/* tests whether ar2 is inside ar1 */ /* tests whether ar2 is inside ar1 */
static inline BOOL addr_range_inside(const struct addr_range* ar1, const struct addr_range* ar2) static inline BOOL addr_range_inside(const struct addr_range* ar1, const struct addr_range* ar2)
{ {
...@@ -281,13 +286,12 @@ struct symt_function ...@@ -281,13 +286,12 @@ struct symt_function
{ {
struct symt symt; /* SymTagFunction (or SymTagInlineSite when embedded in symt_inlinesite) */ struct symt symt; /* SymTagFunction (or SymTagInlineSite when embedded in symt_inlinesite) */
struct hash_table_elt hash_elt; /* if global symbol */ struct hash_table_elt hash_elt; /* if global symbol */
ULONG_PTR address;
struct symt* container; /* compiland */ struct symt* container; /* compiland */
struct symt* type; /* points to function_signature */ struct symt* type; /* points to function_signature */
ULONG_PTR size;
struct vector vlines; struct vector vlines;
struct vector vchildren; /* locals, params, blocks, start/end, labels, inline sites */ struct vector vchildren; /* locals, params, blocks, start/end, labels, inline sites */
struct symt_inlinesite* next_inlinesite;/* linked list of inline sites in this function */ struct symt_inlinesite* next_inlinesite;/* linked list of inline sites in this function */
struct addr_range ranges[1];
}; };
/* a symt_inlinesite* can be casted to a symt_function* to access all function bits */ /* a symt_inlinesite* can be casted to a symt_function* to access all function bits */
......
...@@ -2093,7 +2093,7 @@ static void dwarf2_parse_subprogram_label(dwarf2_subprogram_t* subpgm, ...@@ -2093,7 +2093,7 @@ static void dwarf2_parse_subprogram_label(dwarf2_subprogram_t* subpgm,
if (dwarf2_find_attribute(di, DW_AT_low_pc, &low_pc)) if (dwarf2_find_attribute(di, DW_AT_low_pc, &low_pc))
{ {
loc.kind = loc_absolute; loc.kind = loc_absolute;
loc.offset = subpgm->ctx->module_ctx->load_offset + low_pc.u.uvalue - subpgm->top_func->address; loc.offset = subpgm->ctx->module_ctx->load_offset + low_pc.u.uvalue - subpgm->top_func->ranges[0].low;
symt_add_function_point(subpgm->ctx->module_ctx->module, subpgm->top_func, SymTagLabel, symt_add_function_point(subpgm->ctx->module_ctx->module, subpgm->top_func, SymTagLabel,
&loc, name.u.string); &loc, name.u.string);
} }
...@@ -2150,7 +2150,7 @@ static void dwarf2_parse_inlined_subroutine(dwarf2_subprogram_t* subpgm, ...@@ -2150,7 +2150,7 @@ static void dwarf2_parse_inlined_subroutine(dwarf2_subprogram_t* subpgm,
inlined->num_ranges = 0; inlined->num_ranges = 0;
} }
/* temporary: update address field */ /* temporary: update address field */
inlined->func.address = inlined->ranges[0].low; inlined->func.ranges[0].low = inlined->ranges[0].low;
children = dwarf2_get_di_children(di); children = dwarf2_get_di_children(di);
if (children) for (i = 0; i < vector_length(children); i++) if (children) for (i = 0; i < vector_length(children); i++)
......
...@@ -841,6 +841,7 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table ...@@ -841,6 +841,7 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table
struct symt_ht* sym; struct symt_ht* sym;
const struct elf_sym* symp; const struct elf_sym* symp;
struct elf_module_info* elf_info = module->format_info[DFI_ELF]->u.elf_info; struct elf_module_info* elf_info = module->format_info[DFI_ELF]->u.elf_info;
DWORD64 size;
hash_table_iter_init(&module->ht_symbols, &hti, NULL); hash_table_iter_init(&module->ht_symbols, &hti, NULL);
while ((ptr = hash_table_iter_up(&hti))) while ((ptr = hash_table_iter_up(&hti)))
...@@ -849,8 +850,8 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table ...@@ -849,8 +850,8 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table
switch (sym->symt.tag) switch (sym->symt.tag)
{ {
case SymTagFunction: case SymTagFunction:
if (((struct symt_function*)sym)->address != elf_info->elf_addr && size = addr_range_size(&((struct symt_function*)sym)->ranges[0]);
((struct symt_function*)sym)->size) if (((struct symt_function*)sym)->ranges[0].low != elf_info->elf_addr && size)
{ {
break; break;
} }
...@@ -858,19 +859,19 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table ...@@ -858,19 +859,19 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table
((struct symt_function*)sym)->container); ((struct symt_function*)sym)->container);
if (symp) if (symp)
{ {
if (((struct symt_function*)sym)->address != elf_info->elf_addr && if (((struct symt_function*)sym)->ranges[0].low != elf_info->elf_addr &&
((struct symt_function*)sym)->address != elf_info->elf_addr + symp->st_value) ((struct symt_function*)sym)->ranges[0].low != elf_info->elf_addr + symp->st_value)
FIXME("Changing address for %p/%s!%s from %08Ix to %I64x\n", FIXME("Changing address for %p/%s!%s from %I64x to %I64x\n",
sym, debugstr_w(module->modulename), sym->hash_elt.name, sym, debugstr_w(module->modulename), sym->hash_elt.name,
((struct symt_function*)sym)->address, ((struct symt_function*)sym)->ranges[0].low,
elf_info->elf_addr + symp->st_value); elf_info->elf_addr + symp->st_value);
if (((struct symt_function*)sym)->size && ((struct symt_function*)sym)->size != symp->st_size) if (size && size != symp->st_size)
FIXME("Changing size for %p/%s!%s from %08Ix to %08x\n", FIXME("Changing size for %p/%s!%s from %I64x to %I64x\n",
sym, debugstr_w(module->modulename), sym->hash_elt.name, sym, debugstr_w(module->modulename), sym->hash_elt.name,
((struct symt_function*)sym)->size, (unsigned int)symp->st_size); size, symp->st_size);
((struct symt_function*)sym)->address = elf_info->elf_addr + symp->st_value; ((struct symt_function*)sym)->ranges[0].low = elf_info->elf_addr + symp->st_value;
((struct symt_function*)sym)->size = symp->st_size; ((struct symt_function*)sym)->ranges[0].high = elf_info->elf_addr + symp->st_value + symp->st_size;
} else } else
FIXME("Couldn't find %s!%s\n", FIXME("Couldn't find %s!%s\n",
debugstr_w(module->modulename), sym->hash_elt.name); debugstr_w(module->modulename), sym->hash_elt.name);
...@@ -889,9 +890,9 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table ...@@ -889,9 +890,9 @@ static void elf_finish_stabs_info(struct module* module, const struct hash_table
{ {
if (((struct symt_data*)sym)->u.var.offset != elf_info->elf_addr && if (((struct symt_data*)sym)->u.var.offset != elf_info->elf_addr &&
((struct symt_data*)sym)->u.var.offset != elf_info->elf_addr + symp->st_value) ((struct symt_data*)sym)->u.var.offset != elf_info->elf_addr + symp->st_value)
FIXME("Changing address for %p/%s!%s from %08Ix to %I64x\n", FIXME("Changing address for %p/%s!%s from %I64x to %I64x\n",
sym, debugstr_w(module->modulename), sym->hash_elt.name, sym, debugstr_w(module->modulename), sym->hash_elt.name,
((struct symt_function*)sym)->address, ((struct symt_function*)sym)->ranges[0].low,
elf_info->elf_addr + symp->st_value); elf_info->elf_addr + symp->st_value);
((struct symt_data*)sym)->u.var.offset = elf_info->elf_addr + symp->st_value; ((struct symt_data*)sym)->u.var.offset = elf_info->elf_addr + symp->st_value;
((struct symt_data*)sym)->kind = elf_is_local_symbol(symp->st_info) ? ((struct symt_data*)sym)->kind = elf_is_local_symbol(symp->st_info) ?
......
...@@ -1063,15 +1063,16 @@ static void macho_finish_stabs(struct module* module, struct hash_table* ht_symt ...@@ -1063,15 +1063,16 @@ static void macho_finish_stabs(struct module* module, struct hash_table* ht_symt
{ {
case SymTagFunction: case SymTagFunction:
func = (struct symt_function*)sym; func = (struct symt_function*)sym;
if (func->address == module->format_info[DFI_MACHO]->u.macho_info->load_addr) if (func->ranges[0].low == module->format_info[DFI_MACHO]->u.macho_info->load_addr)
{ {
TRACE("Adjusting function %p/%s!%s from 0x%08Ix to 0x%08Ix\n", func, TRACE("Adjusting function %p/%s!%s from %#I64x to %#Ix\n", func,
debugstr_w(module->modulename), sym->hash_elt.name, debugstr_w(module->modulename), sym->hash_elt.name,
func->address, ste->addr); func->ranges[0].low, ste->addr);
func->address = ste->addr; func->ranges[0].high += ste->addr - func->ranges[0].low;
func->ranges[0].low = ste->addr;
adjusted = TRUE; adjusted = TRUE;
} }
if (func->address == ste->addr) if (func->ranges[0].low == ste->addr)
ste->used = 1; ste->used = 1;
break; break;
case SymTagData: case SymTagData:
......
...@@ -1614,7 +1614,7 @@ static void codeview_snarf_linetab(const struct msc_debug_info* msc_dbg, const B ...@@ -1614,7 +1614,7 @@ static void codeview_snarf_linetab(const struct msc_debug_info* msc_dbg, const B
/* unfortunately, we can have several functions in the same block, if there's no /* unfortunately, we can have several functions in the same block, if there's no
* gap between them... find the new function if needed * gap between them... find the new function if needed
*/ */
if (!func || addr >= func->address + func->size) if (!func || addr >= func->ranges[0].high)
{ {
func = (struct symt_function*)symt_find_symbol_at(msc_dbg->module, addr); func = (struct symt_function*)symt_find_symbol_at(msc_dbg->module, addr);
/* FIXME: at least labels support line numbers */ /* FIXME: at least labels support line numbers */
...@@ -1927,8 +1927,8 @@ static unsigned codeview_transform_defrange(const struct msc_debug_info* msc_dbg ...@@ -1927,8 +1927,8 @@ static unsigned codeview_transform_defrange(const struct msc_debug_info* msc_dbg
break; break;
case S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: case S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:
locinfo->offset = symrange->defrange_frameptr_relfullscope_v3.offFramePointer; locinfo->offset = symrange->defrange_frameptr_relfullscope_v3.offFramePointer;
locinfo->start = curr_func->address; locinfo->start = curr_func->ranges[0].low;
locinfo->rangelen = curr_func->size; locinfo->rangelen = addr_range_size(&curr_func->ranges[0]);
break; break;
case S_DEFRANGE_REGISTER_REL: case S_DEFRANGE_REGISTER_REL:
locinfo->reg = symrange->defrange_registerrel_v3.baseReg; locinfo->reg = symrange->defrange_registerrel_v3.baseReg;
...@@ -2192,11 +2192,11 @@ static struct symt_inlinesite* codeview_create_inline_site(const struct msc_debu ...@@ -2192,11 +2192,11 @@ static struct symt_inlinesite* codeview_create_inline_site(const struct msc_debu
break; break;
case BA_OP_ChangeCodeOffset: case BA_OP_ChangeCodeOffset:
offset += cvba.arg1; offset += cvba.arg1;
inline_site_update_last_range(inlined, index, top_func->address + offset); inline_site_update_last_range(inlined, index, top_func->ranges[0].low + offset);
if (srcok) if (srcok)
symt_add_func_line(msc_dbg->module, &inlined->func, srcfile, line, top_func->address + offset); symt_add_func_line(msc_dbg->module, &inlined->func, srcfile, line, top_func->ranges[0].low + offset);
inlined->ranges[index ].low = top_func->address + offset; inlined->ranges[index ].low = top_func->ranges[0].low + offset;
inlined->ranges[index++].high = top_func->address + offset; inlined->ranges[index++].high = top_func->ranges[0].low + offset;
break; break;
case BA_OP_ChangeCodeLength: case BA_OP_ChangeCodeLength:
/* this op doesn't seem widely used... */ /* this op doesn't seem widely used... */
...@@ -2213,19 +2213,19 @@ static struct symt_inlinesite* codeview_create_inline_site(const struct msc_debu ...@@ -2213,19 +2213,19 @@ static struct symt_inlinesite* codeview_create_inline_site(const struct msc_debu
case BA_OP_ChangeCodeOffsetAndLineOffset: case BA_OP_ChangeCodeOffsetAndLineOffset:
line += binannot_getsigned(cvba.arg2); line += binannot_getsigned(cvba.arg2);
offset += cvba.arg1; offset += cvba.arg1;
inline_site_update_last_range(inlined, index, top_func->address + offset); inline_site_update_last_range(inlined, index, top_func->ranges[0].low + offset);
if (srcok) if (srcok)
symt_add_func_line(msc_dbg->module, &inlined->func, srcfile, line, top_func->address + offset); symt_add_func_line(msc_dbg->module, &inlined->func, srcfile, line, top_func->ranges[0].low + offset);
inlined->ranges[index ].low = top_func->address + offset; inlined->ranges[index ].low = top_func->ranges[0].low + offset;
inlined->ranges[index++].high = top_func->address + offset; inlined->ranges[index++].high = top_func->ranges[0].low + offset;
break; break;
case BA_OP_ChangeCodeLengthAndCodeOffset: case BA_OP_ChangeCodeLengthAndCodeOffset:
offset += cvba.arg2; offset += cvba.arg2;
inline_site_update_last_range(inlined, index, top_func->address + offset); inline_site_update_last_range(inlined, index, top_func->ranges[0].low + offset);
if (srcok) if (srcok)
symt_add_func_line(msc_dbg->module, &inlined->func, srcfile, line, top_func->address + offset); symt_add_func_line(msc_dbg->module, &inlined->func, srcfile, line, top_func->ranges[0].low + offset);
inlined->ranges[index ].low = top_func->address + offset; inlined->ranges[index ].low = top_func->ranges[0].low + offset;
inlined->ranges[index++].high = top_func->address + offset + cvba.arg1; inlined->ranges[index++].high = top_func->ranges[0].low + offset + cvba.arg1;
break; break;
default: default:
WARN("Unsupported op %d\n", cvba.opcode); WARN("Unsupported op %d\n", cvba.opcode);
...@@ -2241,7 +2241,7 @@ static struct symt_inlinesite* codeview_create_inline_site(const struct msc_debu ...@@ -2241,7 +2241,7 @@ static struct symt_inlinesite* codeview_create_inline_site(const struct msc_debu
inlined->func.hash_elt.name, inlined->func.hash_elt.name,
top_func->hash_elt.name); top_func->hash_elt.name);
/* temporary: update address field */ /* temporary: update address field */
inlined->func.address = inlined->ranges[0].low; inlined->func.ranges[0].low = inlined->ranges[0].low;
} }
return inlined; return inlined;
} }
...@@ -2534,7 +2534,7 @@ static BOOL codeview_snarf(const struct msc_debug_info* msc_dbg, ...@@ -2534,7 +2534,7 @@ static BOOL codeview_snarf(const struct msc_debug_info* msc_dbg,
if (curr_func) if (curr_func)
{ {
loc.kind = loc_absolute; loc.kind = loc_absolute;
loc.offset = codeview_get_address(msc_dbg, sym->label_v1.segment, sym->label_v1.offset) - curr_func->address; loc.offset = codeview_get_address(msc_dbg, sym->label_v1.segment, sym->label_v1.offset) - curr_func->ranges[0].low;
symt_add_function_point(msc_dbg->module, curr_func, SymTagLabel, &loc, symt_add_function_point(msc_dbg->module, curr_func, SymTagLabel, &loc,
terminate_string(&sym->label_v1.p_name)); terminate_string(&sym->label_v1.p_name));
} }
...@@ -2546,7 +2546,7 @@ static BOOL codeview_snarf(const struct msc_debug_info* msc_dbg, ...@@ -2546,7 +2546,7 @@ static BOOL codeview_snarf(const struct msc_debug_info* msc_dbg,
if (curr_func) if (curr_func)
{ {
loc.kind = loc_absolute; loc.kind = loc_absolute;
loc.offset = codeview_get_address(msc_dbg, sym->label_v3.segment, sym->label_v3.offset) - curr_func->address; loc.offset = codeview_get_address(msc_dbg, sym->label_v3.segment, sym->label_v3.offset) - curr_func->ranges[0].low;
symt_add_function_point(msc_dbg->module, curr_func, SymTagLabel, symt_add_function_point(msc_dbg->module, curr_func, SymTagLabel,
&loc, sym->label_v3.name); &loc, sym->label_v3.name);
} }
...@@ -2798,8 +2798,8 @@ static BOOL codeview_is_inside(const struct cv_local_info* locinfo, const struct ...@@ -2798,8 +2798,8 @@ static BOOL codeview_is_inside(const struct cv_local_info* locinfo, const struct
/* ip must be in local_info range, but not in any of its gaps */ /* ip must be in local_info range, but not in any of its gaps */
if (ip < locinfo->start || ip >= locinfo->start + locinfo->rangelen) return FALSE; if (ip < locinfo->start || ip >= locinfo->start + locinfo->rangelen) return FALSE;
for (i = 0; i < locinfo->ngaps; ++i) for (i = 0; i < locinfo->ngaps; ++i)
if (func->address + locinfo->gaps[i].gapStartOffset <= ip && if (func->ranges[0].low + locinfo->gaps[i].gapStartOffset <= ip &&
ip < func->address + locinfo->gaps[i].gapStartOffset + locinfo->gaps[i].cbRange) ip < func->ranges[0].low + locinfo->gaps[i].gapStartOffset + locinfo->gaps[i].cbRange)
return FALSE; return FALSE;
return TRUE; return TRUE;
} }
......
...@@ -1166,9 +1166,9 @@ static void pending_flush(struct pending_list* pending, struct module* module, ...@@ -1166,9 +1166,9 @@ static void pending_flush(struct pending_list* pending, struct module* module,
break; break;
case PENDING_LINE: case PENDING_LINE:
if (module->type == DMT_MACHO) if (module->type == DMT_MACHO)
pending->objs[i].u.line.offset -= func->address - pending->objs[i].u.line.load_offset; pending->objs[i].u.line.offset -= func->ranges[0].low - pending->objs[i].u.line.load_offset;
symt_add_func_line(module, func, pending->objs[i].u.line.source_idx, symt_add_func_line(module, func, pending->objs[i].u.line.source_idx,
pending->objs[i].u.line.line_num, func->address + pending->objs[i].u.line.offset); pending->objs[i].u.line.line_num, func->ranges[0].low + pending->objs[i].u.line.offset);
break; break;
default: default:
ERR("Unknown pending object tag %u\n", (unsigned)pending->objs[i].tag); ERR("Unknown pending object tag %u\n", (unsigned)pending->objs[i].tag);
...@@ -1199,15 +1199,15 @@ static void stabs_finalize_function(struct module* module, struct symt_function* ...@@ -1199,15 +1199,15 @@ static void stabs_finalize_function(struct module* module, struct symt_function*
* Not 100% bullet proof, but better than nothing * Not 100% bullet proof, but better than nothing
*/ */
il.SizeOfStruct = sizeof(il); il.SizeOfStruct = sizeof(il);
if (SymGetLineFromAddr64(module->process->handle, func->address, &disp, &il) && if (SymGetLineFromAddr64(module->process->handle, func->ranges[0].low, &disp, &il) &&
SymGetLineNext64(module->process->handle, &il)) SymGetLineNext64(module->process->handle, &il))
{ {
loc.kind = loc_absolute; loc.kind = loc_absolute;
loc.offset = il.Address - func->address; loc.offset = il.Address - func->ranges[0].low;
symt_add_function_point(module, func, SymTagFuncDebugStart, symt_add_function_point(module, func, SymTagFuncDebugStart,
&loc, NULL); &loc, NULL);
} }
if (size) func->size = size; if (size) func->ranges[0].high = func->ranges[0].low + size;
} }
static inline void stabbuf_append(char **buf, unsigned *buf_size, const char *str) static inline void stabbuf_append(char **buf, unsigned *buf_size, const char *str)
...@@ -1375,7 +1375,7 @@ BOOL stabs_parse(struct module* module, ULONG_PTR load_offset, ...@@ -1375,7 +1375,7 @@ BOOL stabs_parse(struct module* module, ULONG_PTR load_offset,
if (curr_func) if (curr_func)
{ {
block = symt_open_func_block(module, curr_func, block, 1); block = symt_open_func_block(module, curr_func, block, 1);
block->ranges[0].low = curr_func->address + n_value; block->ranges[0].low = curr_func->ranges[0].low + n_value;
block->ranges[0].high = 0; /* will be set by N_RBRAC */ block->ranges[0].high = 0; /* will be set by N_RBRAC */
pending_flush(&pending_block, module, curr_func, block); pending_flush(&pending_block, module, curr_func, block);
} }
...@@ -1383,7 +1383,7 @@ BOOL stabs_parse(struct module* module, ULONG_PTR load_offset, ...@@ -1383,7 +1383,7 @@ BOOL stabs_parse(struct module* module, ULONG_PTR load_offset,
case N_RBRAC: case N_RBRAC:
if (curr_func) if (curr_func)
{ {
block->ranges[0].high = curr_func->address + n_value; block->ranges[0].high = curr_func->ranges[0].low + n_value;
block = symt_close_func_block(module, curr_func, block); block = symt_close_func_block(module, curr_func, block);
} }
break; break;
...@@ -1493,9 +1493,9 @@ BOOL stabs_parse(struct module* module, ULONG_PTR load_offset, ...@@ -1493,9 +1493,9 @@ BOOL stabs_parse(struct module* module, ULONG_PTR load_offset,
{ {
ULONG_PTR offset = n_value; ULONG_PTR offset = n_value;
if (module->type == DMT_MACHO) if (module->type == DMT_MACHO)
offset -= curr_func->address - load_offset; offset -= curr_func->ranges[0].low - load_offset;
symt_add_func_line(module, curr_func, source_idx, symt_add_func_line(module, curr_func, source_idx,
stab_ptr->n_desc, curr_func->address + offset); stab_ptr->n_desc, curr_func->ranges[0].low + offset);
} }
else pending_add_line(&pending_func, source_idx, stab_ptr->n_desc, else pending_add_line(&pending_func, source_idx, stab_ptr->n_desc,
n_value, load_offset); n_value, load_offset);
...@@ -1531,7 +1531,7 @@ BOOL stabs_parse(struct module* module, ULONG_PTR load_offset, ...@@ -1531,7 +1531,7 @@ BOOL stabs_parse(struct module* module, ULONG_PTR load_offset,
*/ */
stabs_finalize_function(module, curr_func, stabs_finalize_function(module, curr_func,
n_value ? n_value ?
(load_offset + n_value - curr_func->address) : 0); (load_offset + n_value - curr_func->ranges[0].low) : 0);
} }
func_type = symt_new_function_signature(module, func_type = symt_new_function_signature(module,
stabs_parse_type(ptr), -1); stabs_parse_type(ptr), -1);
......
...@@ -326,9 +326,9 @@ static void init_function_or_inlinesite(struct symt_function* sym, ...@@ -326,9 +326,9 @@ static void init_function_or_inlinesite(struct symt_function* sym,
sym->symt.tag = tag; sym->symt.tag = tag;
sym->hash_elt.name = pool_strdup(&module->pool, name); sym->hash_elt.name = pool_strdup(&module->pool, name);
sym->container = container; sym->container = container;
sym->address = addr; sym->ranges[0].low = addr;
sym->ranges[0].high = addr + size;
sym->type = sig_type; sym->type = sig_type;
sym->size = size;
vector_init(&sym->vlines, sizeof(struct line_info), 64); vector_init(&sym->vlines, sizeof(struct line_info), 64);
vector_init(&sym->vchildren, sizeof(struct symt*), 8); vector_init(&sym->vchildren, sizeof(struct symt*), 8);
} }
...@@ -2685,7 +2685,7 @@ BOOL WINAPI SymFromInlineContext(HANDLE hProcess, DWORD64 addr, ULONG inline_ctx ...@@ -2685,7 +2685,7 @@ BOOL WINAPI SymFromInlineContext(HANDLE hProcess, DWORD64 addr, ULONG inline_ctx
if (inlined) if (inlined)
{ {
symt_fill_sym_info(&pair, NULL, &inlined->func.symt, si); symt_fill_sym_info(&pair, NULL, &inlined->func.symt, si);
if (disp) *disp = addr - inlined->func.address; if (disp) *disp = addr - inlined->func.ranges[0].low;
return TRUE; return TRUE;
} }
/* fall through */ /* fall through */
......
...@@ -153,10 +153,10 @@ BOOL symt_get_address(const struct symt* type, ULONG64* addr) ...@@ -153,10 +153,10 @@ BOOL symt_get_address(const struct symt* type, ULONG64* addr)
*addr = ((const struct symt_block*)type)->ranges[0].low; *addr = ((const struct symt_block*)type)->ranges[0].low;
break; break;
case SymTagFunction: case SymTagFunction:
*addr = ((const struct symt_function*)type)->address; *addr = ((const struct symt_function*)type)->ranges[0].low;
break; break;
case SymTagInlineSite: case SymTagInlineSite:
*addr = ((const struct symt_inlinesite*)type)->func.address; *addr = ((const struct symt_inlinesite*)type)->func.ranges[0].low;
break; break;
case SymTagPublicSymbol: case SymTagPublicSymbol:
*addr = ((const struct symt_public*)type)->address; *addr = ((const struct symt_public*)type)->address;
...@@ -816,7 +816,7 @@ BOOL symt_get_info(struct module* module, const struct symt* type, ...@@ -816,7 +816,7 @@ BOOL symt_get_info(struct module* module, const struct symt* type,
X(DWORD64) = ((const struct symt_basic*)type)->size; X(DWORD64) = ((const struct symt_basic*)type)->size;
break; break;
case SymTagFunction: case SymTagFunction:
X(DWORD64) = ((const struct symt_function*)type)->size; X(DWORD64) = addr_range_size(&((const struct symt_function*)type)->ranges[0]);
break; break;
case SymTagBlock: case SymTagBlock:
/* When there are several ranges available, we can only return one contiguous chunk of memory. /* When there are several ranges available, we can only return one contiguous chunk of memory.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment