winedump: Update support for S_COMPILE* records.

Don't mix up S_COMPILE records with compiland information.

Signed-off-by: Eric Pouech <eric.pouech@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Eric Pouech 2021-08-21 10:23:13 +02:00 committed by Alexandre Julliard
parent 001c8bdb03
commit 7499b98ec8
3 changed files with 127 additions and 80 deletions

View File

@ -1826,23 +1826,24 @@ static BOOL codeview_snarf(const struct msc_debug_info* msc_dbg, const BYTE* roo
break;
case S_COMPILE:
TRACE("S-Compiland-V1 %x %s\n",
sym->compiland_v1.unknown, terminate_string(&sym->compiland_v1.p_name));
TRACE("S-Compile-V1 machine:%x language:%x %s\n",
sym->compile_v1.machine, sym->compile_v1.flags.language, terminate_string(&sym->compile_v1.p_name));
break;
case S_COMPILE2_ST:
TRACE("S-Compiland-V2 %s\n", terminate_string(&sym->compiland_v2.p_name));
if (TRACE_ON(dbghelp_msc))
{
const char* ptr1 = sym->compiland_v2.p_name.name + sym->compiland_v2.p_name.namelen;
const char* ptr2;
while (*ptr1)
{
ptr2 = ptr1 + strlen(ptr1) + 1;
TRACE("\t%s => %s\n", ptr1, debugstr_a(ptr2));
ptr1 = ptr2 + strlen(ptr2) + 1;
}
}
TRACE("S-Compile-V2 machine:%x language:%x %s\n",
sym->compile2_v2.machine, sym->compile2_v2.flags.iLanguage, terminate_string(&sym->compile2_v2.p_name));
break;
case S_COMPILE2:
TRACE("S-Compile-V3 machine:%x language:%x %s\n", sym->compile2_v3.machine, sym->compile2_v3.flags.iLanguage, sym->compile2_v3.name);
break;
case S_COMPILE3:
TRACE("S-Compile3-V3 machine:%x language:%x %s\n", sym->compile3_v3.machine, sym->compile3_v3.flags.iLanguage, sym->compile3_v3.name);
break;
case S_ENVBLOCK:
break;
case S_OBJNAME:
@ -1983,11 +1984,6 @@ static BOOL codeview_snarf(const struct msc_debug_info* msc_dbg, const BYTE* roo
break;
}
case S_COMPILE2: /* just to silence a few warnings */
case S_COMPILE3:
case S_ENVBLOCK:
break;
case S_SSEARCH:
TRACE("Start search: seg=0x%x at offset 0x%08x\n",
sym->ssearch_v1.segment, sym->ssearch_v1.offset);

View File

@ -1573,26 +1573,74 @@ union codeview_symbol
{
unsigned short int len;
unsigned short int id;
unsigned int unknown;
unsigned char machine;
struct
{
unsigned char language : 8;
unsigned char _dome : 8; /* other missing fields */
unsigned char pad : 8;
} flags;
struct p_string p_name;
} compiland_v1;
} compile_v1;
struct
{
unsigned short int len;
unsigned short int id;
unsigned unknown1[4];
unsigned short unknown2;
struct {
unsigned int iLanguage : 8;
unsigned int _dome : 9; /* other missing fields */
unsigned int pad : 15;
} flags;
unsigned short machine;
unsigned short fe_major;
unsigned short fe_minor;
unsigned short fe_build;
unsigned short be_major;
unsigned short be_minor;
unsigned short be_build;
struct p_string p_name;
} compiland_v2;
} compile2_v2;
struct
{
unsigned short int len;
unsigned short int id;
unsigned int unknown;
struct {
unsigned int iLanguage : 8;
unsigned int _dome : 9; /* other missing fields */
unsigned int pad : 15;
} flags;
unsigned short machine;
unsigned short fe_major;
unsigned short fe_minor;
unsigned short fe_build;
unsigned short be_major;
unsigned short be_minor;
unsigned short be_build;
char name[1];
} compiland_v3;
} compile2_v3;
struct
{
unsigned short int len;
unsigned short int id;
struct {
unsigned int iLanguage : 8;
unsigned int _dome : 12; /* other missing fields */
unsigned int pad : 12;
} flags;
unsigned short machine;
unsigned short fe_major;
unsigned short fe_minor;
unsigned short fe_build;
unsigned short fe_qfe;
unsigned short be_major;
unsigned short be_minor;
unsigned short be_build;
unsigned short be_qfe;
char name[1];
} compile3_v3;
struct
{

View File

@ -1330,19 +1330,23 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
break;
case S_COMPILE:
printf("\tS-Compiland V1 '%s' %s %s unk:%x\n",
p_string(&sym->compiland_v1.p_name),
get_machine(sym->compiland_v1.unknown & 0xFF),
get_language((sym->compiland_v1.unknown >> 8) & 0xFF),
sym->compiland_v1.unknown >> 16);
printf("\tS-Compile V1 machine:%s lang:%s _unk:%x '%s'\n",
get_machine(sym->compile_v1.machine),
get_language(sym->compile_v1.flags.language),
sym->compile_v1.flags._dome,
p_string(&sym->compile_v1.p_name));
break;
case S_COMPILE2_ST:
printf("\tS-Compiland V2 '%s'\n",
p_string(&sym->compiland_v2.p_name));
dump_data((const void*)sym, sym->generic.len + 2, " ");
printf("\tS-Compile2-V2 lang:%s machine:%s _unk:%x front-end:%d.%d.%d back-end:%d.%d.%d '%s'\n",
get_language(sym->compile2_v2.flags.iLanguage),
get_machine(sym->compile2_v2.machine),
sym->compile2_v2.flags._dome,
sym->compile2_v2.fe_major, sym->compile2_v2.fe_minor, sym->compile2_v2.fe_build,
sym->compile2_v2.be_major, sym->compile2_v2.be_minor, sym->compile2_v2.be_build,
p_string(&sym->compile2_v2.p_name));
{
const char* ptr = sym->compiland_v2.p_name.name + sym->compiland_v2.p_name.namelen;
const char* ptr = sym->compile2_v2.p_name.name + sym->compile2_v2.p_name.namelen;
while (*ptr)
{
printf("\t\t%s => ", ptr); ptr += strlen(ptr) + 1;
@ -1351,6 +1355,50 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
}
break;
case S_COMPILE2:
printf("\tS-Compile2-V3 lang:%s machine:%s _unk:%x front-end:%d.%d.%d back-end:%d.%d.%d '%s'\n",
get_language(sym->compile2_v3.flags.iLanguage),
get_machine(sym->compile2_v3.machine),
sym->compile2_v3.flags._dome,
sym->compile2_v3.fe_major, sym->compile2_v3.fe_minor, sym->compile2_v3.fe_build,
sym->compile2_v3.be_major, sym->compile2_v3.be_minor, sym->compile2_v3.be_build,
sym->compile2_v3.name);
{
const char* ptr = sym->compile2_v3.name + strlen(sym->compile2_v3.name) + 1;
while (*ptr)
{
printf("\t\t%s => ", ptr); ptr += strlen(ptr) + 1;
printf("%s\n", ptr); ptr += strlen(ptr) + 1;
}
}
break;
case S_COMPILE3:
printf("\tS-Compile3-V3 lang:%s machine:%s _unk:%x front-end:%d.%d.%d back-end:%d.%d.%d '%s'\n",
get_language(sym->compile3_v3.flags.iLanguage),
get_machine(sym->compile3_v3.machine),
sym->compile3_v3.flags._dome,
sym->compile3_v3.fe_major, sym->compile3_v3.fe_minor, sym->compile3_v3.fe_build,
sym->compile3_v3.be_major, sym->compile3_v3.be_minor, sym->compile3_v3.be_build,
sym->compile3_v3.name);
break;
case S_ENVBLOCK:
{
const char* x1 = (const char*)sym + 4 + 1;
const char* x2;
printf("\tTool conf V3\n");
while (*x1)
{
x2 = x1 + strlen(x1) + 1;
if (!*x2) break;
printf("\t\t%s: %s\n", x1, x2);
x1 = x2 + strlen(x2) + 1;
}
}
break;
case S_OBJNAME:
printf("\tS-ObjName V3 sig:%x '%s'\n",
sym->objname_v3.signature, sym->objname_v3.name);
@ -1433,51 +1481,6 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
p_string(pname));
}
break;
case S_COMPILE2: /* info about tool used to create CU */
{
const unsigned short* ptr = ((const unsigned short*)sym) + 2;
const char* x1;
const char* x2 = (const char*)&ptr[9];
/* FIXME: what are all those values for ? */
printf("\tTool V3 unk=%04x%04x%04x front=%d.%d.%d.0 back=%d.%d.%d.0 %s\n",
ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7],
ptr[8], x2);
while (*(x1 = x2 + strlen(x2) + 1))
{
x2 = x1 + strlen(x1) + 1;
if (!*x2) break;
printf("\t\t%s: %s\n", x1, x2);
}
}
break;
case S_COMPILE3:
{
const unsigned short* ptr = ((const unsigned short*)sym) + 2;
printf("\tTool info V3: unk=%04x%04x%04x front=%d.%d.%d.%d back=%d.%d.%d.%d %s\n",
ptr[0], ptr[1], ptr[2],
ptr[3], ptr[4], ptr[5], ptr[6],
ptr[7], ptr[8], ptr[9], ptr[10],
(const char*)(ptr + 11));
}
break;
case S_ENVBLOCK:
{
const char* x1 = (const char*)sym + 4 + 1;
const char* x2;
printf("\tTool conf V3\n");
while (*x1)
{
x2 = x1 + strlen(x1) + 1;
if (!*x2) break;
printf("\t\t%s: %s\n", x1, x2);
x1 = x2 + strlen(x2) + 1;
}
}
break;
case S_ALIGN:
/* simply skip it */