dbghelp: Properly declare variables with thread storage from codeview debug format.

This commit is contained in:
Eric Pouech 2011-01-29 20:38:15 +01:00 committed by Alexandre Julliard
parent 031cce8e77
commit 935ac12d04
1 changed files with 54 additions and 11 deletions

View File

@ -1523,17 +1523,16 @@ static inline void codeview_add_variable(const struct msc_debug_info* msc_dbg,
struct symt_compiland* compiland,
const char* name,
unsigned segment, unsigned offset,
unsigned symtype, BOOL is_local, BOOL force)
unsigned symtype, BOOL is_local, BOOL in_tls, BOOL force)
{
if (name && *name)
{
unsigned long address = codeview_get_address(msc_dbg, segment, offset);
struct location loc;
loc.kind = loc_absolute;
loc.kind = in_tls ? loc_tlsrel : loc_absolute;
loc.reg = 0;
loc.offset = address;
if (force || !symt_find_nearest(msc_dbg->module, address))
loc.offset = in_tls ? offset : codeview_get_address(msc_dbg, segment, offset);
if (force || in_tls || !symt_find_nearest(msc_dbg->module, loc.offset))
{
symt_new_global_variable(msc_dbg->module, compiland,
name, is_local, loc, 0,
@ -1576,21 +1575,44 @@ static int codeview_snarf(const struct msc_debug_info* msc_dbg, const BYTE* root
if (do_globals)
codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->data_v1.p_name),
sym->data_v1.segment, sym->data_v1.offset, sym->data_v1.symtype,
sym->generic.id == S_LDATA_V1, TRUE);
sym->generic.id == S_LDATA_V1, FALSE, TRUE);
break;
case S_GDATA_V2:
case S_LDATA_V2:
if (do_globals)
codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->data_v2.p_name),
sym->data_v2.segment, sym->data_v2.offset, sym->data_v2.symtype,
sym->generic.id == S_LDATA_V2, TRUE);
sym->generic.id == S_LDATA_V2, FALSE, TRUE);
break;
case S_GDATA_V3:
case S_LDATA_V3:
if (do_globals)
codeview_add_variable(msc_dbg, compiland, sym->data_v3.name,
sym->data_v3.segment, sym->data_v3.offset, sym->data_v3.symtype,
sym->generic.id == S_LDATA_V3, TRUE);
sym->generic.id == S_LDATA_V3, FALSE, TRUE);
break;
/* variables with thread storage */
case S_GTHREAD_V1:
case S_LTHREAD_V1:
if (do_globals)
codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->thread_v1.p_name),
sym->thread_v1.segment, sym->thread_v1.offset, sym->thread_v1.symtype,
sym->generic.id == S_LTHREAD_V1, TRUE, TRUE);
break;
case S_GTHREAD_V2:
case S_LTHREAD_V2:
if (do_globals)
codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->thread_v2.p_name),
sym->thread_v2.segment, sym->thread_v2.offset, sym->thread_v2.symtype,
sym->generic.id == S_LTHREAD_V2, TRUE, TRUE);
break;
case S_GTHREAD_V3:
case S_LTHREAD_V3:
if (do_globals)
codeview_add_variable(msc_dbg, compiland, sym->thread_v3.name,
sym->thread_v3.segment, sym->thread_v3.offset, sym->thread_v3.symtype,
sym->generic.id == S_LTHREAD_V3, TRUE, TRUE);
break;
/* Public symbols */
@ -2026,20 +2048,41 @@ static int codeview_snarf_public(const struct msc_debug_info* msc_dbg, const BYT
case S_LDATA_V1:
codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->data_v1.p_name),
sym->data_v1.segment, sym->data_v1.offset, sym->data_v1.symtype,
sym->generic.id == S_LDATA_V1, FALSE);
sym->generic.id == S_LDATA_V1, FALSE, FALSE);
break;
case S_GDATA_V2:
case S_LDATA_V2:
codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->data_v2.p_name),
sym->data_v2.segment, sym->data_v2.offset, sym->data_v2.symtype,
sym->generic.id == S_LDATA_V2, FALSE);
sym->generic.id == S_LDATA_V2, FALSE, FALSE);
break;
case S_GDATA_V3:
case S_LDATA_V3:
codeview_add_variable(msc_dbg, compiland, sym->data_v3.name,
sym->data_v3.segment, sym->data_v3.offset, sym->data_v3.symtype,
sym->generic.id == S_LDATA_V3, FALSE);
sym->generic.id == S_LDATA_V3, FALSE, FALSE);
break;
/* variables with thread storage */
case S_GTHREAD_V1:
case S_LTHREAD_V1:
codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->thread_v1.p_name),
sym->thread_v1.segment, sym->thread_v1.offset, sym->thread_v1.symtype,
sym->generic.id == S_LTHREAD_V1, TRUE, FALSE);
break;
case S_GTHREAD_V2:
case S_LTHREAD_V2:
codeview_add_variable(msc_dbg, compiland, terminate_string(&sym->thread_v2.p_name),
sym->thread_v2.segment, sym->thread_v2.offset, sym->thread_v2.symtype,
sym->generic.id == S_LTHREAD_V2, TRUE, FALSE);
break;
case S_GTHREAD_V3:
case S_LTHREAD_V3:
codeview_add_variable(msc_dbg, compiland, sym->thread_v3.name,
sym->thread_v3.segment, sym->thread_v3.offset, sym->thread_v3.symtype,
sym->generic.id == S_LTHREAD_V3, TRUE, FALSE);
break;
/*
* These are special, in that they are always followed by an
* additional length-prefixed string which is *not* included