[PATCH 05/14] tools/winedump: now dumping CodeView records about site information
Eric Pouech
eric.pouech at gmail.com
Tue Aug 24 04:11:49 CDT 2021
Signed-off-by: Eric Pouech <eric.pouech at gmail.com>
---
include/wine/mscvpdb.h | 51 +++++++++++++++++++++++
tools/winedump/msc.c | 107 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 158 insertions(+)
diff --git a/include/wine/mscvpdb.h b/include/wine/mscvpdb.h
index ca3f120a5d6..20b3314ea04 100644
--- a/include/wine/mscvpdb.h
+++ b/include/wine/mscvpdb.h
@@ -110,6 +110,7 @@ struct p_string
typedef unsigned short cv_typ16_t;
typedef unsigned int cv_typ_t;
+typedef cv_typ_t cv_itemid_t;
/* ======================================== *
* Type information
@@ -1819,6 +1820,56 @@ union codeview_symbol
struct cv_addr_range range;
struct cv_addr_gap gaps[0];
} defrange_registerrel_v3;
+
+ struct
+ {
+ unsigned short int len;
+ unsigned short int id;
+ unsigned int pParent;
+ unsigned int pEnd;
+ cv_itemid_t inlinee;
+ unsigned char binaryAnnotations[0];
+ } inline_site_v3;
+
+ struct
+ {
+ unsigned short int len;
+ unsigned short int typ;
+ unsigned int off;
+ unsigned short sect;
+ unsigned short _pad0;
+ cv_typ_t typind;
+ } callsiteinfo_v3;
+
+ struct
+ {
+ unsigned short int len;
+ unsigned short int id;
+ unsigned int pParent;
+ unsigned int pEnd;
+ cv_itemid_t inlinee;
+ unsigned int invocations;
+ unsigned char binaryAnnotations[0];
+ } inline_site2_v3;
+
+};
+
+enum BinaryAnnotationOpcode
+{
+ BA_OP_Invalid,
+ BA_OP_CodeOffset,
+ BA_OP_ChangeCodeOffsetBase,
+ BA_OP_ChangeCodeOffset,
+ BA_OP_ChangeCodeLength,
+ BA_OP_ChangeFile,
+ BA_OP_ChangeLineOffset,
+ BA_OP_ChangeLineEndDelta,
+ BA_OP_ChangeRangeKind,
+ BA_OP_ChangeColumnStart,
+ BA_OP_ChangeColumnEndDelta,
+ BA_OP_ChangeCodeOffsetAndLineOffset,
+ BA_OP_ChangeCodeLengthAndCodeOffset,
+ BA_OP_ChangeColumnEnd,
};
#define S_COMPILE 0x0001
diff --git a/tools/winedump/msc.c b/tools/winedump/msc.c
index d1d3674daca..aba14af8643 100644
--- a/tools/winedump/msc.c
+++ b/tools/winedump/msc.c
@@ -1151,6 +1151,93 @@ static inline const char* get_last(const union codeview_symbol* sym)
return (const char*)sym + sym->generic.len + 2;
}
+static unsigned binannot_uncompress(const unsigned char** pptr)
+{
+ unsigned res = (unsigned)(-1);
+ const unsigned char* ptr = *pptr;
+
+ if ((*ptr & 0x80) == 0x00)
+ res = (unsigned)(*ptr++);
+ else if ((*ptr & 0xC0) == 0x80)
+ {
+ res = (unsigned)((*ptr++ & 0x3f) << 8);
+ res |= *ptr++;
+ }
+ else if ((*ptr & 0xE0) == 0xC0)
+ {
+ res = (*ptr++ & 0x1f) << 24;
+ res |= *ptr++ << 16;
+ res |= *ptr++ << 8;
+ res |= *ptr++;
+ }
+ else res = (unsigned)(-1);
+ *pptr = ptr;
+ return res;
+}
+
+static void dump_binannot(const unsigned char* ba, const char* last, const char* pfx)
+{
+ while (ba < (const unsigned char*)last)
+ {
+ unsigned opcode = binannot_uncompress(&ba);
+ switch (opcode)
+ {
+ case BA_OP_Invalid:
+ /* not clear if param? */
+ printf("%sInvalid\n", pfx);
+ break;
+ case BA_OP_CodeOffset:
+ printf("%sCodeOffset %u\n", pfx, binannot_uncompress(&ba));
+ break;
+ case BA_OP_ChangeCodeOffsetBase:
+ printf("%sChangeCodeOffsetBase %u\n", pfx, binannot_uncompress(&ba));
+ break;
+ case BA_OP_ChangeCodeOffset:
+ printf("%sChangeCodeOffset %u\n", pfx, binannot_uncompress(&ba));
+ break;
+ case BA_OP_ChangeCodeLength:
+ printf("%sChangeCodeLength %u\n", pfx, binannot_uncompress(&ba));
+ break;
+ case BA_OP_ChangeFile:
+ printf("%sChangeFile %u\n", pfx, binannot_uncompress(&ba));
+ break;
+ case BA_OP_ChangeLineOffset:
+ printf("%sChangeLineOffset %d\n", pfx, binannot_uncompress(&ba));
+ break;
+ case BA_OP_ChangeLineEndDelta:
+ printf("%sChangeLineEndDelta %u\n", pfx, binannot_uncompress(&ba));
+ break;
+ case BA_OP_ChangeRangeKind:
+ printf("%sChangeRangeKind %u\n", pfx, binannot_uncompress(&ba));
+ break;
+ case BA_OP_ChangeColumnStart:
+ printf("%sChangeColumnStart %u\n", pfx, binannot_uncompress(&ba));
+ break;
+ case BA_OP_ChangeColumnEndDelta:
+ printf("%sChangeColumnEndDelta %u\n", pfx, binannot_uncompress(&ba));
+ break;
+ case BA_OP_ChangeCodeOffsetAndLineOffset:
+ {
+ unsigned p1 = binannot_uncompress(&ba);
+ printf("%sChangeCodeOffsetAndLineOffset %u %u (0x%x)\n", pfx, p1 & 0xf, p1 >> 4, p1);
+ }
+ break;
+ case BA_OP_ChangeCodeLengthAndCodeOffset:
+ {
+ unsigned p1 = binannot_uncompress(&ba);
+ unsigned p2 = binannot_uncompress(&ba);
+ printf("%sChangeCodeLengthAndCodeOffset %u %u\n", pfx, p1, p2);
+ }
+ break;
+ case BA_OP_ChangeColumnEnd:
+ printf("%sChangeColumnEnd %u\n", pfx, binannot_uncompress(&ba));
+ break;
+
+ default: printf("%sUnsupported op %d %x\n", pfx, opcode, opcode); /* may cause issues because of param */
+ }
+ }
+}
+
BOOL codeview_dump_symbols(const void* root, unsigned long size)
{
unsigned int i;
@@ -1651,6 +1738,26 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size)
dump_defrange(&sym->defrange_registerrel_v3.range, get_last(sym), "\t\t");
break;
+ case S_CALLSITEINFO:
+ printf("Call-site-info V3 %04x:%08x typeindex:%x\n",
+ sym->callsiteinfo_v3.sect, sym->callsiteinfo_v3.off, sym->callsiteinfo_v3.typind);
+ break;
+
+ case S_INLINESITE:
+ printf("Inline-site V3 parent:%x end:%x inlinee:%x\n",
+ sym->inline_site_v3.pParent, sym->inline_site_v3.pEnd, sym->inline_site_v3.inlinee);
+ dump_binannot(sym->inline_site_v3.binaryAnnotations, get_last(sym), "\t\t");
+ break;
+ case S_INLINESITE2:
+ printf("Inline-site2 V3 parent:%x end:%x inlinee:%x #inv:%u\n",
+ sym->inline_site2_v3.pParent, sym->inline_site2_v3.pEnd, sym->inline_site2_v3.inlinee,
+ sym->inline_site2_v3.invocations);
+ dump_binannot(sym->inline_site2_v3.binaryAnnotations, get_last(sym), "\t\t");
+ break;
+ case S_INLINESITE_END:
+ printf("Inline-site-end\n");
+ break;
+
default:
printf("\n\t\t>>> Unsupported symbol-id %x sz=%d\n", sym->generic.id, sym->generic.len + 2);
dump_data((const void*)sym, sym->generic.len + 2, " ");
More information about the wine-devel
mailing list