void CVSymbolDumperImpl::visitProcSym(SymbolKind Kind, ProcSym &Proc) { DictScope S(W, "ProcStart"); if (InFunctionScope) return parseError(); InFunctionScope = true; StringRef LinkageName; W.printEnum("Kind", uint16_t(Kind), getSymbolTypeNames()); W.printHex("PtrParent", Proc.Header.PtrParent); W.printHex("PtrEnd", Proc.Header.PtrEnd); W.printHex("PtrNext", Proc.Header.PtrNext); W.printHex("CodeSize", Proc.Header.CodeSize); W.printHex("DbgStart", Proc.Header.DbgStart); W.printHex("DbgEnd", Proc.Header.DbgEnd); CVTD.printTypeIndex("FunctionType", Proc.Header.FunctionType); if (ObjDelegate) { ObjDelegate->printRelocatedField("CodeOffset", Proc.getRelocationOffset(), Proc.Header.CodeOffset, &LinkageName); } W.printHex("Segment", Proc.Header.Segment); W.printFlags("Flags", static_cast<uint8_t>(Proc.Header.Flags), getProcSymFlagNames()); W.printString("DisplayName", Proc.Name); if (!LinkageName.empty()) W.printString("LinkageName", LinkageName); }
Error CVSymbolDumperImpl::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) { if (InFunctionScope) return llvm::make_error<CodeViewError>( "Visiting a ProcSym while inside function scope!"); InFunctionScope = true; StringRef LinkageName; W.printHex("PtrParent", Proc.Parent); W.printHex("PtrEnd", Proc.End); W.printHex("PtrNext", Proc.Next); W.printHex("CodeSize", Proc.CodeSize); W.printHex("DbgStart", Proc.DbgStart); W.printHex("DbgEnd", Proc.DbgEnd); printTypeIndex("FunctionType", Proc.FunctionType); if (ObjDelegate) { ObjDelegate->printRelocatedField("CodeOffset", Proc.getRelocationOffset(), Proc.CodeOffset, &LinkageName); } W.printHex("Segment", Proc.Segment); W.printFlags("Flags", static_cast<uint8_t>(Proc.Flags), getProcSymFlagNames()); W.printString("DisplayName", Proc.Name); if (!LinkageName.empty()) W.printString("LinkageName", LinkageName); return Error::success(); }
Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) { P.format(" `{0}`", Proc.Name); AutoIndent Indent(P, 7); P.formatLine("parent = {0}, end = {1}, addr = {2}, code size = {3}", Proc.Parent, Proc.End, formatSegmentOffset(Proc.Segment, Proc.CodeOffset), Proc.CodeSize); bool IsType = true; switch (Proc.getKind()) { case SymbolRecordKind::GlobalProcIdSym: case SymbolRecordKind::ProcIdSym: case SymbolRecordKind::DPCProcIdSym: IsType = false; break; default: break; } P.formatLine("type = `{0}`, debug start = {1}, debug end = {2}, flags = {3}", typeOrIdIndex(Proc.FunctionType, IsType), Proc.DbgStart, Proc.DbgEnd, formatProcSymFlags(P.getIndentLevel() + 9, Proc.Flags)); return Error::success(); }