Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
June 2022
- 68 participants
- 3274 messages
[PATCH v4 2/6] dlls/dbghelp{pdb}: rely on first/last index from type header
by Eric Pouech
From: Eric Pouech <eric.pouech(a)gmail.com>
(mainly code cleanup)
code now follows these guidelines:
- first type index comes from type header (instead of being hard coded as
FIRST_DEFINABLE_TYPE)
- define PDB & Codeview internals in cvconst.h and mscvinfo.h (instead
of having definitions in .c files, some of them being duplicate of .h
content, and their "duplicate" values eventually diverged over time)
- use last_type index from type header (instead of guessing the right value
when parsing types)
Signed-off-by: Eric Pouech <eric.pouech(a)gmail.com>
---
dlls/dbghelp/msc.c | 105 ++++++++++++++++++-----------------------
include/wine/mscvpdb.h | 3 +-
2 files changed, 48 insertions(+), 60 deletions(-)
diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c
index 2be648ca578..cec4602e0b3 100644
--- a/dlls/dbghelp/msc.c
+++ b/dlls/dbghelp/msc.c
@@ -132,15 +132,13 @@ static void dump(const void* ptr, unsigned len)
* Process CodeView type information.
*/
-#define MAX_BUILTIN_TYPES 0x06FF
-#define FIRST_DEFINABLE_TYPE 0x1000
-
-static struct symt* cv_basic_types[MAX_BUILTIN_TYPES];
+static struct symt* cv_basic_types[T_MAXPREDEFINEDTYPE];
struct cv_defined_module
{
BOOL allowed;
- unsigned int num_defined_types;
+ unsigned int first_type_index;
+ unsigned int last_type_index;
struct symt** defined_types;
};
/* FIXME: don't make it static */
@@ -532,15 +530,12 @@ static struct symt* codeview_get_type(unsigned int typeno, BOOL quiet)
/*
* Convert Codeview type numbers into something we can grok internally.
- * Numbers < FIRST_DEFINABLE_TYPE are all fixed builtin types.
- * Numbers from FIRST_DEFINABLE_TYPE and up are all user defined (structs, etc).
+ * Numbers < T_MAXPREDEFINEDTYPE all fixed builtin types.
+ * Numbers from T_FIRSTDEFINABLETYPE and up are all user defined (structs, etc).
*/
- if (typeno < FIRST_DEFINABLE_TYPE)
- {
- if (typeno < MAX_BUILTIN_TYPES)
- symt = cv_basic_types[typeno];
- }
- else
+ if (typeno < T_MAXPREDEFINEDTYPE)
+ symt = cv_basic_types[typeno];
+ else if (typeno >= T_FIRSTDEFINABLETYPE)
{
unsigned mod_index = typeno >> 24;
unsigned mod_typeno = typeno & 0x00FFFFFF;
@@ -548,12 +543,12 @@ static struct symt* codeview_get_type(unsigned int typeno, BOOL quiet)
mod = (mod_index == 0) ? cv_current_module : &cv_zmodules[mod_index];
- if (mod_index >= CV_MAX_MODULES || !mod->allowed)
+ if (mod_index >= CV_MAX_MODULES || !mod->allowed)
FIXME("Module of index %d isn't loaded yet (%x)\n", mod_index, typeno);
else
{
- if (mod_typeno - FIRST_DEFINABLE_TYPE < mod->num_defined_types)
- symt = mod->defined_types[mod_typeno - FIRST_DEFINABLE_TYPE];
+ if (mod_typeno >= mod->first_type_index && mod_typeno < mod->last_type_index)
+ symt = mod->defined_types[mod_typeno - mod->first_type_index];
}
}
if (!quiet && !symt && typeno) FIXME("Returning NULL symt for type-id %x\n", typeno);
@@ -563,22 +558,20 @@ static struct symt* codeview_get_type(unsigned int typeno, BOOL quiet)
struct codeview_type_parse
{
struct module* module;
+ PDB_TYPES header;
const BYTE* table;
const DWORD* offset;
- DWORD num;
};
static inline const void* codeview_jump_to_type(const struct codeview_type_parse* ctp, DWORD idx)
{
- if (idx < FIRST_DEFINABLE_TYPE) return NULL;
- idx -= FIRST_DEFINABLE_TYPE;
- return (idx >= ctp->num) ? NULL : (ctp->table + ctp->offset[idx]);
+ return (idx >= ctp->header.first_index && idx < ctp->header.last_index) ?
+ ctp->table + ctp->offset[idx - ctp->header.first_index] : NULL;
}
static int codeview_add_type(unsigned int typeno, struct symt* dt)
{
- if (typeno < FIRST_DEFINABLE_TYPE)
- FIXME("What the heck\n");
+ unsigned idx;
if (!cv_current_module)
{
FIXME("Adding %x to non allowed module\n", typeno);
@@ -587,31 +580,18 @@ static int codeview_add_type(unsigned int typeno, struct symt* dt)
if ((typeno >> 24) != 0)
FIXME("No module index while inserting type-id assumption is wrong %x\n",
typeno);
- if (typeno - FIRST_DEFINABLE_TYPE >= cv_current_module->num_defined_types)
+ if (typeno < cv_current_module->first_type_index || typeno >= cv_current_module->last_type_index)
{
- if (cv_current_module->defined_types)
- {
- cv_current_module->num_defined_types = max( cv_current_module->num_defined_types * 2,
- typeno - FIRST_DEFINABLE_TYPE + 1 );
- cv_current_module->defined_types = HeapReAlloc(GetProcessHeap(),
- HEAP_ZERO_MEMORY, cv_current_module->defined_types,
- cv_current_module->num_defined_types * sizeof(struct symt*));
- }
- else
- {
- cv_current_module->num_defined_types = max( 256, typeno - FIRST_DEFINABLE_TYPE + 1 );
- cv_current_module->defined_types = HeapAlloc(GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- cv_current_module->num_defined_types * sizeof(struct symt*));
- }
- if (cv_current_module->defined_types == NULL) return FALSE;
+ FIXME("Adding type index %x out of bounds\n", typeno);
+ return FALSE;
}
- if (cv_current_module->defined_types[typeno - FIRST_DEFINABLE_TYPE])
+ idx = typeno - cv_current_module->first_type_index;
+ if (cv_current_module->defined_types[idx])
{
- if (cv_current_module->defined_types[typeno - FIRST_DEFINABLE_TYPE] != dt)
+ if (cv_current_module->defined_types[idx] != dt)
FIXME("Overwriting at %x\n", typeno);
}
- cv_current_module->defined_types[typeno - FIRST_DEFINABLE_TYPE] = dt;
+ cv_current_module->defined_types[idx] = dt;
return TRUE;
}
@@ -622,10 +602,11 @@ static void codeview_clear_type_table(void)
for (i = 0; i < CV_MAX_MODULES; i++)
{
if (cv_zmodules[i].allowed)
- HeapFree(GetProcessHeap(), 0, cv_zmodules[i].defined_types);
+ free(cv_zmodules[i].defined_types);
cv_zmodules[i].allowed = FALSE;
cv_zmodules[i].defined_types = NULL;
- cv_zmodules[i].num_defined_types = 0;
+ cv_zmodules[i].first_type_index = 0;
+ cv_zmodules[i].last_type_index = 0;
}
cv_current_module = NULL;
}
@@ -1381,10 +1362,15 @@ static struct symt* codeview_parse_one_type(struct codeview_type_parse* ctp,
static BOOL codeview_parse_type_table(struct codeview_type_parse* ctp)
{
- unsigned int curr_type = FIRST_DEFINABLE_TYPE;
+ unsigned int curr_type;
const union codeview_type* type;
- for (curr_type = FIRST_DEFINABLE_TYPE; curr_type < FIRST_DEFINABLE_TYPE + ctp->num; curr_type++)
+ cv_current_module->first_type_index = ctp->header.first_index;
+ cv_current_module->last_type_index = ctp->header.last_index;
+ cv_current_module->defined_types = calloc(ctp->header.last_index - ctp->header.first_index,
+ sizeof(*cv_current_module->defined_types));
+
+ for (curr_type = ctp->header.first_index; curr_type < ctp->header.last_index; curr_type++)
{
type = codeview_jump_to_type(ctp, curr_type);
@@ -3053,15 +3039,14 @@ static BOOL pdb_init_type_parse(const struct msc_debug_info* msc_dbg,
struct codeview_type_parse* ctp,
BYTE* image)
{
- PDB_TYPES types;
- DWORD total;
const BYTE* ptr;
DWORD* offset;
+ int i;
- pdb_convert_types_header(&types, image);
+ pdb_convert_types_header(&ctp->header, image);
/* Check for unknown versions */
- switch (types.version)
+ switch (ctp->header.version)
{
case 19950410: /* VC 4.0 */
case 19951122:
@@ -3070,22 +3055,22 @@ static BOOL pdb_init_type_parse(const struct msc_debug_info* msc_dbg,
case 20040203: /* VC 8.0 */
break;
default:
- ERR("-Unknown type info version %d\n", types.version);
+ ERR("-Unknown type info version %d\n", ctp->header.version);
return FALSE;
}
ctp->module = msc_dbg->module;
/* reconstruct the types offset...
- * FIXME: maybe it's present in the newest PDB_TYPES structures
+ * Note: the hash subfile of the PDB_TYPES only contains a partial table
+ * (not all the indexes are present, so it requires search in table +
+ * linear search from previous index...)
*/
- total = types.last_index - types.first_index + 1;
- offset = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD) * total);
+ offset = HeapAlloc(GetProcessHeap(), 0, sizeof(DWORD) * (ctp->header.last_index - ctp->header.first_index));
if (!offset) return FALSE;
- ctp->table = ptr = image + types.type_offset;
- ctp->num = 0;
- while (ptr < ctp->table + types.type_size && ctp->num < total)
+ ctp->table = ptr = image + ctp->header.type_offset;
+ for (i = ctp->header.first_index; i < ctp->header.last_index; i++)
{
- offset[ctp->num++] = ptr - ctp->table;
+ offset[i - ctp->header.first_index] = ptr - ctp->table;
ptr += ((const union codeview_type*)ptr)->generic.len + 2;
}
ctp->offset = offset;
@@ -3882,7 +3867,9 @@ static BOOL codeview_process_info(const struct process* pcs,
types = (const OMFGlobalTypes*)(msc_dbg->root + ent->lfo);
ctp.module = msc_dbg->module;
ctp.offset = (const DWORD*)(types + 1);
- ctp.num = types->cTypes;
+ memset(&ctp.header, 0, sizeof(ctp.header));
+ ctp.header.first_index = T_FIRSTDEFINABLETYPE;
+ ctp.header.last_index = ctp.header.first_index + types->cTypes;
ctp.table = (const BYTE*)(ctp.offset + types->cTypes);
cv_current_module = &cv_zmodules[0];
diff --git a/include/wine/mscvpdb.h b/include/wine/mscvpdb.h
index f0fbfa92b39..e0f524ca46f 100644
--- a/include/wine/mscvpdb.h
+++ b/include/wine/mscvpdb.h
@@ -1172,7 +1172,8 @@ union codeview_fieldtype
#define T_64PCHAR8 0x067c /* 64 near pointer to 8-bit unicode char */
/* counts, bit masks, and shift values needed to access various parts of the built-in type numbers */
-#define T_MAXPREDEFINEDTYPE 0x0580 /* maximum type index for all built-in types */
+#define T_FIRSTDEFINABLETYPE 0x1000 /* first type index that's not predefined */
+#define T_MAXPREDEFINEDTYPE 0x0680 /* maximum type index for all built-in types */
#define T_MAXBASICTYPE 0x0080 /* maximum type index all non-pointer built-in types */
#define T_BASICTYPE_MASK 0x00ff /* mask of bits that can potentially identify a non-pointer basic type */
#define T_BASICTYPE_SHIFT 8 /* shift count to push out the basic type bits from a type number */
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/73
June 2, 2022
[PATCH v4 1/6] tools/winedump{pdb}: explore a bit more TPI hash elements
by Eric Pouech
From: Eric Pouech <eric.pouech(a)gmail.com>
Renamed of couple of fields in PDB structures for clarity
Signed-off-by: Eric Pouech <eric.pouech(a)gmail.com>
---
dlls/dbghelp/msc.c | 2 +-
include/wine/mscvpdb.h | 10 +--
tools/winedump/pdb.c | 190 +++++++++++++++++++++++++++++++++++------
3 files changed, 169 insertions(+), 33 deletions(-)
diff --git a/dlls/dbghelp/msc.c b/dlls/dbghelp/msc.c
index 5b45c474160..2be648ca578 100644
--- a/dlls/dbghelp/msc.c
+++ b/dlls/dbghelp/msc.c
@@ -2954,7 +2954,7 @@ static void pdb_convert_types_header(PDB_TYPES* types, const BYTE* image)
types->type_size = old->type_size;
types->first_index = old->first_index;
types->last_index = old->last_index;
- types->file = old->file;
+ types->hash_file = old->hash_file;
}
else
{
diff --git a/include/wine/mscvpdb.h b/include/wine/mscvpdb.h
index 1772e6d10df..f0fbfa92b39 100644
--- a/include/wine/mscvpdb.h
+++ b/include/wine/mscvpdb.h
@@ -2403,7 +2403,7 @@ typedef struct _PDB_TYPES_OLD
unsigned short first_index;
unsigned short last_index;
unsigned int type_size;
- unsigned short file;
+ unsigned short hash_file;
unsigned short pad;
} PDB_TYPES_OLD, *PPDB_TYPES_OLD;
@@ -2414,16 +2414,16 @@ typedef struct _PDB_TYPES
unsigned int first_index;
unsigned int last_index;
unsigned int type_size;
- unsigned short file;
+ unsigned short hash_file;
unsigned short pad;
unsigned int hash_size;
- unsigned int hash_base;
+ unsigned int hash_num_buckets;
unsigned int hash_offset;
unsigned int hash_len;
unsigned int search_offset;
unsigned int search_len;
- unsigned int unknown_offset;
- unsigned int unknown_len;
+ unsigned int type_remap_offset;
+ unsigned int type_remap_len;
} PDB_TYPES, *PPDB_TYPES;
typedef struct _PDB_SYMBOL_RANGE
diff --git a/tools/winedump/pdb.c b/tools/winedump/pdb.c
index 2277e6556f9..89769765e4b 100644
--- a/tools/winedump/pdb.c
+++ b/tools/winedump/pdb.c
@@ -608,18 +608,154 @@ static void pdb_dump_symbols(struct pdb_reader* reader, PDB_STREAM_INDEXES* sidx
free(filesimage);
}
-static void pdb_dump_types_hash(struct pdb_reader* reader, unsigned file, const char* strmname)
+static BOOL is_bit_set(const unsigned* dw, unsigned len, unsigned i)
{
- void* hash = NULL;
- DWORD size;
+ if (i >= len * sizeof(unsigned) * 8) return FALSE;
+ return (dw[i >> 5] & (1u << (i & 31u))) != 0;
+}
- hash = reader->read_file(reader, file);
- if (!hash) return;
+static void pdb_dump_hash_value(const BYTE* ptr, unsigned len)
+{
+ int i;
- size = pdb_get_file_size(reader, file);
+ printf("[");
+ for (i = len - 1; i >= 0; i--)
+ printf("%02x", ptr[i]);
+ printf("]");
+}
+
+static struct
+{
+ const BYTE* hash;
+ unsigned hash_size;
+} collision_arg;
+
+static int collision_compar(const void *p1, const void *p2)
+{
+ unsigned idx1 = *(unsigned*)p1;
+ unsigned idx2 = *(unsigned*)p2;
+ return memcmp(collision_arg.hash + idx1 * collision_arg.hash_size,
+ collision_arg.hash + idx2 * collision_arg.hash_size,
+ collision_arg.hash_size);
+}
+
+static void pdb_dump_types_hash(struct pdb_reader* reader, const PDB_TYPES* types, const char* strmname)
+{
+ void* hash = NULL;
+ unsigned i, strmsize;
+ const unsigned* table;
+ char* strbase;
+ unsigned *collision;
+ hash = reader->read_file(reader, types->hash_file);
+ if (!hash) return;
printf("Types (%s) hash:\n", strmname);
- dump_data(hash, size, " ");
+ strmsize = pdb_get_file_size(reader, types->hash_file);
+ if (types->hash_offset + types->hash_len > strmsize ||
+ (types->last_index - types->first_index) * types->hash_size != types->hash_len ||
+ types->search_offset + types->search_len > strmsize ||
+ types->type_remap_offset + types->type_remap_len > strmsize)
+ {
+ printf("\nIncoherent sizes... skipping\n");
+ return;
+ }
+ printf("\n\tIndexes => hash value:\n");
+ for (i = types->first_index; i < types->last_index; i++)
+ {
+ printf("\t\t%08x => ", i);
+ pdb_dump_hash_value((const BYTE*)hash + types->hash_offset + (i - types->first_index) * types->hash_size, types->hash_size);
+ printf("\n");
+ }
+ /* print collisions in hash table (if any) */
+ collision = malloc((types->last_index - types->first_index) * sizeof(unsigned));
+ if (collision)
+ {
+ unsigned head_printed = 0;
+
+ collision_arg.hash = (const BYTE*)hash + types->hash_offset;
+ collision_arg.hash_size = types->hash_size;
+
+ for (i = 0; i < types->last_index - types->first_index; i++) collision[i] = i;
+ qsort(collision, types->last_index - types->first_index, sizeof(unsigned), collision_compar);
+ for (i = 0; i < types->last_index - types->first_index; i++)
+ {
+ unsigned j;
+ for (j = i + 1; j < types->last_index - types->first_index; j++)
+ if (memcmp((const BYTE*)hash + types->hash_offset + collision[i] * types->hash_size,
+ (const BYTE*)hash + types->hash_offset + collision[j] * types->hash_size,
+ types->hash_size))
+ break;
+ if (j > i + 1)
+ {
+ unsigned k;
+ if (!head_printed)
+ {
+ printf("\n\t\tCollisions:\n");
+ head_printed = 1;
+ }
+ printf("\t\t\tHash ");
+ pdb_dump_hash_value((const BYTE*)hash + types->hash_offset + collision[i] * types->hash_size, types->hash_size);
+ printf(":");
+ for (k = i; k < j; k++)
+ printf(" %x", types->first_index + collision[k]);
+ printf("\n");
+ i = j - 1;
+ }
+ }
+ free(collision);
+ }
+ printf("\n\tIndexes => offsets:\n");
+ table = (const unsigned*)((const BYTE*)hash + types->search_offset);
+ for (i = 0; i < types->search_len / (2 * sizeof(unsigned)); i += 2)
+ {
+ printf("\t\t%08x => %08x\n", table[2 * i + 0], table[2 * i + 1]);
+ }
+ if (types->type_remap_len && (strbase = read_string_table(reader)))
+ {
+ unsigned num, capa, count_present, count_deleted;
+ const unsigned* present_bitset;
+ const unsigned* deleted_bitset;
+
+ printf("\n\tType remap:\n");
+ table = (const unsigned*)((const BYTE*)hash + types->type_remap_offset);
+ /* dump_data((const BYTE*)table, types->type_remap_len, "\t\t"); */
+ num = *table++;
+ capa = *table++;
+ count_present = *table++;
+ present_bitset = table;
+ table += count_present;
+ count_deleted = *table++;
+ deleted_bitset = table;
+ table += count_deleted;
+ printf("\t\tNumber of present entries: %u\n", num);
+ printf("\t\tCapacity: %u\n", capa);
+ printf("\t\tBitset present:\n");
+ printf("\t\t\tCount: %u\n", count_present);
+ printf("\t\t\tBitset: ");
+ pdb_dump_hash_value((const BYTE*)present_bitset, count_present * sizeof(unsigned));
+ printf("\n");
+ printf("\t\tBitset deleted:\n");
+ printf("\t\t\tCount: %u\n", count_deleted);
+ printf("\t\t\tBitset: ");
+ pdb_dump_hash_value((const BYTE*)deleted_bitset, count_deleted * sizeof(unsigned));
+ printf("\n");
+ for (i = 0; i < capa; ++i)
+ {
+ printf("\t\t%2u) %c",
+ i,
+ is_bit_set(present_bitset, count_present, i) ? 'P' :
+ is_bit_set(deleted_bitset, count_deleted, i) ? 'D' : '_');
+ if (is_bit_set(present_bitset, count_present, i))
+ {
+ printf(" %s => ", strbase + 12 + *table++);
+ pdb_dump_hash_value((const BYTE*)table, types->hash_size);
+ table = (const unsigned*)((const BYTE*)table + types->hash_size);
+ }
+ printf("\n");
+ }
+ free(strbase);
+ printf("\n");
+ }
free(hash);
}
@@ -657,39 +793,39 @@ static void pdb_dump_types(struct pdb_reader* reader, unsigned strmidx, const ch
/* Read type table */
printf("Types (%s):\n"
- "\tversion: %u\n"
- "\ttype_offset: %08x\n"
- "\tfirst_index: %x\n"
- "\tlast_index: %x\n"
- "\ttype_size: %x\n"
- "\tfile: %x\n"
- "\tpad: %x\n"
- "\thash_size: %x\n"
- "\thash_base: %x\n"
- "\thash_offset: %x\n"
- "\thash_len: %x\n"
- "\tsearch_offset: %x\n"
- "\tsearch_len: %x\n"
- "\tunknown_offset: %x\n"
- "\tunknown_len: %x\n",
+ "\tversion: %u\n"
+ "\ttype_offset: %08x\n"
+ "\tfirst_index: %x\n"
+ "\tlast_index: %x\n"
+ "\ttype_size: %x\n"
+ "\thash_file: %x\n"
+ "\tpad: %x\n"
+ "\thash_size: %x\n"
+ "\thash_buckets %x\n"
+ "\thash_offset: %x\n"
+ "\thash_len: %x\n"
+ "\tsearch_offset: %x\n"
+ "\tsearch_len: %x\n"
+ "\ttype_remap_offset: %x\n"
+ "\ttype_remap_len: %x\n",
strmname,
types->version,
types->type_offset,
types->first_index,
types->last_index,
types->type_size,
- types->file,
+ types->hash_file,
types->pad,
types->hash_size,
- types->hash_base,
+ types->hash_num_buckets,
types->hash_offset,
types->hash_len,
types->search_offset,
types->search_len,
- types->unknown_offset,
- types->unknown_len);
+ types->type_remap_offset,
+ types->type_remap_len);
codeview_dump_types_from_block((const char*)types + types->type_offset, types->type_size);
- pdb_dump_types_hash(reader, types->file, strmname);
+ pdb_dump_types_hash(reader, types, strmname);
free(types);
}
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/73
June 2, 2022
[PATCH v4 0/6] MR73: Improvement in PDB's types record handling
by eric pouech (@epo)
This serie tackles several issues encountered while loading PDB files through dbghelp.
It happens that PDB allows to have several type records for user defined types (struct / enums)
with the same name.
This seems to be generated by a) compiler (when modifying a structure definition between several
compilation phases), b) the incremental linker (likely an optimisation of previous case, but
not 100% certain when it's triggered).
Wine's dbghelp ended up not picking the right record, hence generating errneous outputs.
This series:
- cleans up some PDB related code
- update winedump to display the PDB hash table internals
- fixes dbghelp to preserve in Wine's dbghelp hash table the partial order between type
records of same name.
v2:
- rebased
- removed a bunch of stray comments
--
v4: dlls/dbghelp{pdb}: use remap table from PDB hash stream
dlls/dbghelp{pdb}: ensure dbghelp's list order in hash table matches PDB's
dlls/dbghelp{pdb}: clearly separate the type loading into two passes
include/wine/mscvpdb.h: redefine property with bitfields
dlls/dbghelp{pdb}: rely on first/last index from type header
tools/winedump{pdb}: explore a bit more TPI hash elements
https://gitlab.winehq.org/wine/wine/-/merge_requests/73
June 2, 2022
Re: [PATCH 0/6] MR170: winemac: PE conversion preparation - approved
by Huw Davies (@huw)
This merge request was approved by Huw Davies.
--
https://gitlab.winehq.org/wine/wine/-/merge_requests/170
June 2, 2022
Re: [PATCH 2/2] d2d1/tests: Test unregistering effect which has existing instance.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=115998
Your paranoid android.
=== w8 (32 bit report) ===
d2d1:
d2d1.c:11016: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11133: Test failed: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11133: Test failed: Got unexpected hr 0.
=== w8adm (32 bit report) ===
d2d1:
d2d1.c:11016: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11133: Test failed: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11133: Test failed: Got unexpected hr 0.
=== w864 (32 bit report) ===
d2d1:
d2d1.c:11016: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11133: Test failed: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11133: Test failed: Got unexpected hr 0.
=== w864 (64 bit report) ===
d2d1:
d2d1.c:11016: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11133: Test failed: Got unexpected hr 0.
d2d1.c:11037: Test failed: d2d1.c:11400: Tests skipped: ID2D1Factory3 is not supported.
d2d1.c:11040: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11016: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11037: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11040: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11133: Test failed: Got unexpected hr 0.
June 2, 2022
Re: [PATCH v2 6/8] ntdll: Improve block size rounding compatibility.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=115986
Your paranoid android.
=== debian11 (64 bit WoW report) ===
ntdll:
env.c:461: Test failed: wrong end ptr 000000000085195C/0000000000851960
June 2, 2022
Re: [PATCH 1/2] d2d1/tests: Test custom effect properties.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=115997
Your paranoid android.
=== w8 (32 bit report) ===
d2d1:
d2d1.c:11011: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11128: Test failed: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11128: Test failed: Got unexpected hr 0.
=== w8adm (32 bit report) ===
d2d1:
d2d1.c:11011: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11128: Test failed: d2d1.c:11011: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 2: d2d1.c:11395: Tests skipped: ID2D1Factory3 is not supported.
d2d1.c:11035: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11128: Test failed: Got unexpected hr 0.
=== w864 (32 bit report) ===
d2d1:
d2d1.c:11011: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11128: Test failed: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11128: Test failed: Got unexpected hr 0.
=== w864 (64 bit report) ===
d2d1:
d2d1.c:11011: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 0: Got unexpected hr 0.
d2d1.c:11128: Test failed: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 1: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 2: d2d1.c:10313: Tests skipped: ID2D1Factory3 is not supported.
d2d1.c:11032: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 2: Got unexpected hr 0.
d2d1.c:11011: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11032: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11035: Test failed: Test 3: Got unexpected hr 0.
d2d1.c:11128: Test failed: Got unexpected hr 0.
=== debian11 (32 bit Chinese:China report) ===
d2d1:
Unhandled exception: page fault on read access to 0x00000000 in 32-bit code (0x7d86a2f9).
June 2, 2022
Re: [PATCH 5/5] dinput/tests: Add a test for multiple top-level collections.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=116003
Your paranoid android.
=== build (build log) ===
WineRunBuild.pl:error: The build timed out
June 2, 2022
Re: [PATCH v2 2/2] xmllite: Increase depth in reader_set_current_attribute().
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
June 2, 2022
Re: [PATCH v2 1/2] xmllite/tests: Test depth for MoveToAttributeByName().
by Nikolay Sivov
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
June 2, 2022