diff --git a/include/wine/mscvpdb.h b/include/wine/mscvpdb.h index f7dcbcb6625..b0021ed3c25 100644 --- a/include/wine/mscvpdb.h +++ b/include/wine/mscvpdb.h @@ -482,6 +482,17 @@ union codeview_reftype unsigned num; cv_typ_t drvdcls[1]; } derived_v2; + + struct + { + unsigned short int len; + unsigned short int id; + cv_typ_t type; + cv_typ_t baseVftable; + unsigned offsetInObjectLayout; + unsigned cbstr; + char names[1]; /* array of len 0-terminated strings (size of cbstr in char:s) */ + } vftable_v3; }; union codeview_fieldtype @@ -1287,6 +1298,7 @@ union codeview_fieldtype #define LF_METHOD_V3 0x150f #define LF_NESTTYPE_V3 0x1510 #define LF_ONEMETHOD_V3 0x1511 +#define LF_VFTABLE_V3 0x151d /* leaves found in second type type (aka IPI) * for simplicity, stored in the same union as other TPI leaves @@ -1988,6 +2000,30 @@ union codeview_symbol unsigned short int id; char name[1]; } unamespace_v3; + + struct + { + unsigned short int len; + unsigned short int id; + unsigned int pParent; + unsigned int pEnd; + unsigned int length; + unsigned int scf; /* CV_SEPCODEFLAGS */ + unsigned int off; + unsigned int offParent; + unsigned short int sect; + unsigned short int sectParent; + } sepcode_v3; + + struct + { + unsigned short int len; + unsigned short int id; + unsigned int off; + unsigned short int seg; + unsigned short int csz; /* number of bytes in following array */ + char rgsz[1]; /* array of null terminated strings (bounded by csz) */ + } annotation_v3; }; enum BinaryAnnotationOpcode @@ -2061,6 +2097,7 @@ enum BinaryAnnotationOpcode #define S_GTHREAD32_ST 0x100f #define S_FRAMEPROC 0x1012 #define S_COMPILE2_ST 0x1013 +#define S_ANNOTATION 0x1019 #define S_UNAMESPACE_ST 0x1029 #define S_OBJNAME 0x1101 diff --git a/tools/winedump/msc.c b/tools/winedump/msc.c index 40daf4d50d5..cd91ea63634 100644 --- a/tools/winedump/msc.c +++ b/tools/winedump/msc.c @@ -1102,6 +1102,20 @@ static void codeview_dump_one_type(unsigned curr_type, const union codeview_type printf("\n"); break; + case LF_VFTABLE_V3: + printf("\t%x => VFTable V3 base:%x baseVfTable:%x offset%u\n", + curr_type, reftype->vftable_v3.type, reftype->vftable_v3.baseVftable, reftype->vftable_v3.offsetInObjectLayout); + { + const char* str = reftype->vftable_v3.names; + const char* last = str + reftype->vftable_v3.cbstr; + while (str < last) + { + printf("\t\t%s\n", str); + str += strlen(str) + 1; + } + } + break; + /* types from IPI (aka #4) stream */ case LF_FUNC_ID: printf("\t%x => FuncId %s scopeId:%04x type:%04x\n", @@ -1867,6 +1881,24 @@ BOOL codeview_dump_symbols(const void* root, unsigned long size) printf("UNameSpace V3 '%s'\n", sym->unamespace_v3.name); break; + case S_SEPCODE: + printf("SepCode V3 pParent:%x pEnd:%x separated:%04x:%08x (#%u) from %04x:%08x\n", + sym->sepcode_v3.pParent, sym->sepcode_v3.pEnd, + sym->sepcode_v3.sect, sym->sepcode_v3.off, sym->sepcode_v3.length, + sym->sepcode_v3.sectParent, sym->sepcode_v3.offParent); + break; + + case S_ANNOTATION: + printf("Annotation V3 %04x:%08x\n", + sym->annotation_v3.seg, sym->annotation_v3.off); + { + const char* ptr = sym->annotation_v3.rgsz; + const char* last = ptr + sym->annotation_v3.csz; + for (; ptr < last; ptr += strlen(ptr) + 1) + printf("\t%s\n", ptr); + } + 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, " ");