From 2447b0131bd0eacb5d1be441a0e2f0fbd4cb9295 Mon Sep 17 00:00:00 2001 From: Eric Pouech Date: Wed, 10 Nov 2021 16:43:22 +0100 Subject: [PATCH] winedump: Properly indent multi lines symbol records. Signed-off-by: Eric Pouech Signed-off-by: Alexandre Julliard --- tools/winedump/msc.c | 84 +++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 41 deletions(-) diff --git a/tools/winedump/msc.c b/tools/winedump/msc.c index 2fefa36381a..07691e5be6a 100644 --- a/tools/winedump/msc.c +++ b/tools/winedump/msc.c @@ -1196,13 +1196,13 @@ BOOL codeview_dump_types_from_block(const void* table, unsigned long len) return TRUE; } -static void dump_defrange(const struct cv_addr_range* range, const void* last, const char* pfx) +static void dump_defrange(const struct cv_addr_range* range, const void* last, unsigned indent) { const struct cv_addr_gap* gap; - printf("%s%04x:%08x range:#%x\n", pfx, range->isectStart, range->offStart, range->cbRange); + printf("%*s\\- %04x:%08x range:#%x\n", indent, "", range->isectStart, range->offStart, range->cbRange); for (gap = (const struct cv_addr_gap*)(range + 1); (const void*)(gap + 1) <= last; ++gap) - printf("%s\toffset:%x range:#%x\n", pfx, gap->gapStartOffset, gap->cbRange); + printf("%*s | offset:%x range:#%x\n", indent, "", gap->gapStartOffset, gap->cbRange); } /* return address of first byte after the symbol */ @@ -1240,7 +1240,7 @@ static inline int binannot_getsigned(unsigned i) return (i & 1) ? -(int)(i >> 1) : (i >> 1); } -static void dump_binannot(const unsigned char* ba, const char* last, const char* pfx) +static void dump_binannot(const unsigned char* ba, const char* last, unsigned indent) { while (ba < (const unsigned char*)last) { @@ -1249,56 +1249,56 @@ static void dump_binannot(const unsigned char* ba, const char* last, const char* { case BA_OP_Invalid: /* not clear if param? */ - printf("%sInvalid\n", pfx); + printf("%*s | Invalid\n", indent, ""); break; case BA_OP_CodeOffset: - printf("%sCodeOffset %u\n", pfx, binannot_uncompress(&ba)); + printf("%*s | CodeOffset %u\n", indent, "", binannot_uncompress(&ba)); break; case BA_OP_ChangeCodeOffsetBase: - printf("%sChangeCodeOffsetBase %u\n", pfx, binannot_uncompress(&ba)); + printf("%*s | ChangeCodeOffsetBase %u\n", indent, "", binannot_uncompress(&ba)); break; case BA_OP_ChangeCodeOffset: - printf("%sChangeCodeOffset %u\n", pfx, binannot_uncompress(&ba)); + printf("%*s | ChangeCodeOffset %u\n", indent, "", binannot_uncompress(&ba)); break; case BA_OP_ChangeCodeLength: - printf("%sChangeCodeLength %u\n", pfx, binannot_uncompress(&ba)); + printf("%*s | ChangeCodeLength %u\n", indent, "", binannot_uncompress(&ba)); break; case BA_OP_ChangeFile: - printf("%sChangeFile %u\n", pfx, binannot_uncompress(&ba)); + printf("%*s | ChangeFile %u\n", indent, "", binannot_uncompress(&ba)); break; case BA_OP_ChangeLineOffset: - printf("%sChangeLineOffset %d\n", pfx, binannot_getsigned(binannot_uncompress(&ba))); + printf("%*s | ChangeLineOffset %d\n", indent, "", binannot_getsigned(binannot_uncompress(&ba))); break; case BA_OP_ChangeLineEndDelta: - printf("%sChangeLineEndDelta %u\n", pfx, binannot_uncompress(&ba)); + printf("%*s | ChangeLineEndDelta %u\n", indent, "", binannot_uncompress(&ba)); break; case BA_OP_ChangeRangeKind: - printf("%sChangeRangeKind %u\n", pfx, binannot_uncompress(&ba)); + printf("%*s | ChangeRangeKind %u\n", indent, "", binannot_uncompress(&ba)); break; case BA_OP_ChangeColumnStart: - printf("%sChangeColumnStart %u\n", pfx, binannot_uncompress(&ba)); + printf("%*s | ChangeColumnStart %u\n", indent, "", binannot_uncompress(&ba)); break; case BA_OP_ChangeColumnEndDelta: - printf("%sChangeColumnEndDelta %u\n", pfx, binannot_uncompress(&ba)); + printf("%*s | ChangeColumnEndDelta %u\n", indent, "", binannot_uncompress(&ba)); break; case BA_OP_ChangeCodeOffsetAndLineOffset: { unsigned p1 = binannot_uncompress(&ba); - printf("%sChangeCodeOffsetAndLineOffset %u %u (0x%x)\n", pfx, p1 & 0xf, binannot_getsigned(p1 >> 4), p1); + printf("%*s | ChangeCodeOffsetAndLineOffset %u %u (0x%x)\n", indent, "", p1 & 0xf, binannot_getsigned(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); + printf("%*s | ChangeCodeLengthAndCodeOffset %u %u\n", indent, "", p1, p2); } break; case BA_OP_ChangeColumnEnd: - printf("%sChangeColumnEnd %u\n", pfx, binannot_uncompress(&ba)); + printf("%*s | ChangeColumnEnd %u\n", indent, "", binannot_uncompress(&ba)); break; - default: printf("%sUnsupported op %d %x\n", pfx, opcode, opcode); /* may cause issues because of param */ + default: printf(">>> Unsupported op %d %x\n", opcode, opcode); /* may cause issues because of param */ } } } @@ -1315,9 +1315,11 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long for (i = start; i < size; i += length) { const union codeview_symbol* sym = (const union codeview_symbol*)((const char*)root + i); + unsigned indent; + length = sym->generic.len + 2; if (!sym->generic.id || length < 4) break; - printf("\t%04x => ", i); + indent = printf(" %04x => ", i); switch (sym->generic.id) { @@ -1402,8 +1404,8 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long sym->proc_v1.segment, sym->proc_v1.offset, sym->proc_v1.proc_len, sym->proc_v1.proctype, sym->proc_v1.flags); - printf("\t\tDebug: start=%08x end=%08x\n", - sym->proc_v1.debug_start, sym->proc_v1.debug_end); + printf("%*s\\- Debug: start=%08x end=%08x\n", + indent, "", sym->proc_v1.debug_start, sym->proc_v1.debug_end); if (nest_block) { printf(">>> prev func still has nest_block %u count\n", nest_block); @@ -1422,8 +1424,8 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long sym->proc_v2.segment, sym->proc_v2.offset, sym->proc_v2.proc_len, sym->proc_v2.proctype, sym->proc_v2.flags); - printf("\t\tDebug: start=%08x end=%08x\n", - sym->proc_v2.debug_start, sym->proc_v2.debug_end); + printf("%*s\\- Debug: start=%08x end=%08x\n", + indent, "", sym->proc_v2.debug_start, sym->proc_v2.debug_end); if (nest_block) { printf(">>> prev func still has nest_block %u count\n", nest_block); @@ -1442,8 +1444,8 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long sym->proc_v3.segment, sym->proc_v3.offset, sym->proc_v3.proc_len, sym->proc_v3.proctype, sym->proc_v3.flags); - printf("\t\tDebug: start=%08x end=%08x\n", - sym->proc_v3.debug_start, sym->proc_v3.debug_end); + printf("%*s\\- Debug: start=%08x end=%08x\n", + indent, "", sym->proc_v3.debug_start, sym->proc_v3.debug_end); if (nest_block) { printf(">>> prev func still has nest_block %u count\n", nest_block); @@ -1559,7 +1561,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long 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; + printf("%*s| %s => ", indent, "", ptr); ptr += strlen(ptr) + 1; printf("%s\n", ptr); ptr += strlen(ptr) + 1; } } @@ -1577,7 +1579,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long 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| %s => ", indent, "", ptr); ptr += strlen(ptr) + 1; printf("%s\n", ptr); ptr += strlen(ptr) + 1; } } @@ -1598,12 +1600,12 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long const char* x1 = (const char*)sym + 4 + 1; const char* x2; - printf("\tTool conf V3\n"); + printf("Tool conf V3\n"); while (*x1) { x2 = x1 + strlen(x1) + 1; if (!*x2) break; - printf("\t\t%s: %s\n", x1, x2); + printf("%*s| %s: %s\n", indent, "", x1, x2); x1 = x2 + strlen(x2) + 1; } } @@ -1696,7 +1698,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long pname = PSTRING(sym, length); length += (pname->namelen + 1 + 3) & ~3; - printf("\t%08x %08x %08x '%s'\n", + printf("%08x %08x %08x '%s'\n", *(((const DWORD*)sym) + 1), *(((const DWORD*)sym) + 2), *(((const DWORD*)sym) + 3), p_string(pname)); } @@ -1766,22 +1768,22 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long case S_DEFRANGE: printf("DefRange dia:%x\n", sym->defrange_v3.program); - dump_defrange(&sym->defrange_v3.range, get_last(sym), "\t\t"); + dump_defrange(&sym->defrange_v3.range, get_last(sym), indent); break; case S_DEFRANGE_SUBFIELD: printf("DefRange-subfield V3 dia:%x off-parent:%x\n", sym->defrange_subfield_v3.program, sym->defrange_subfield_v3.offParent); - dump_defrange(&sym->defrange_subfield_v3.range, get_last(sym), "\t\t"); + dump_defrange(&sym->defrange_subfield_v3.range, get_last(sym), indent); break; case S_DEFRANGE_REGISTER: printf("DefRange-register V3 reg:%x attr-unk:%x\n", sym->defrange_register_v3.reg, sym->defrange_register_v3.attr); - dump_defrange(&sym->defrange_register_v3.range, get_last(sym), "\t\t"); + dump_defrange(&sym->defrange_register_v3.range, get_last(sym), indent); break; case S_DEFRANGE_FRAMEPOINTER_REL: printf("DefRange-framepointer-rel V3 offFP:%x\n", sym->defrange_frameptrrel_v3.offFramePointer); - dump_defrange(&sym->defrange_frameptrrel_v3.range, get_last(sym), "\t\t"); + dump_defrange(&sym->defrange_frameptrrel_v3.range, get_last(sym), indent); break; case S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: printf("DefRange-framepointer-rel-fullscope V3 offFP:%x\n", @@ -1792,13 +1794,13 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long sym->defrange_subfield_register_v3.reg, sym->defrange_subfield_register_v3.attr, sym->defrange_subfield_register_v3.offParent); - dump_defrange(&sym->defrange_subfield_register_v3.range, get_last(sym), "\t\t"); + dump_defrange(&sym->defrange_subfield_register_v3.range, get_last(sym), indent); break; case S_DEFRANGE_REGISTER_REL: printf("DefRange-register-rel V3 reg:%x off-parent:%x off-BP:%x\n", sym->defrange_registerrel_v3.baseReg, sym->defrange_registerrel_v3.offsetParent, sym->defrange_registerrel_v3.offBasePointer); - dump_defrange(&sym->defrange_registerrel_v3.range, get_last(sym), "\t\t"); + dump_defrange(&sym->defrange_registerrel_v3.range, get_last(sym), indent); break; case S_CALLSITEINFO: @@ -1813,13 +1815,13 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long 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"); + dump_binannot(sym->inline_site_v3.binaryAnnotations, get_last(sym), indent); 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"); + dump_binannot(sym->inline_site2_v3.binaryAnnotations, get_last(sym), indent); break; case S_INLINESITE_END: printf("Inline-site-end\n"); @@ -1841,7 +1843,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long ninvoc = (const unsigned*)get_last(sym) - invoc; for (i = 0; i < sym->function_list_v3.count; ++i) - printf("\t\tfunc:%x invoc:%u\n", sym->function_list_v3.funcs[i], i < ninvoc ? invoc[i] : 0); + printf("%*s| func:%x invoc:%u\n", indent, "", sym->function_list_v3.funcs[i], i < ninvoc ? invoc[i] : 0); } break; @@ -1883,7 +1885,7 @@ BOOL codeview_dump_symbols(const void* root, unsigned long start, unsigned long 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); + printf("%*s| %s\n", indent, "", ptr); } break;