1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===-- SymbolDumper.cpp - CodeView symbol info dumper ----------*- C++ -*-===//
2de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
3de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
4de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
5de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
6de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// License. See LICENSE.TXT for details.
7de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
8de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/SymbolDumper.h"
11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/DenseMap.h"
12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/SmallString.h"
13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/EnumTables.h"
15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/SymbolDumpDelegate.h"
16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/SymbolRecord.h"
17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/TypeDumper.h"
18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/TypeIndex.h"
19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/ScopedPrinter.h"
20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <system_error>
22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing namespace llvm;
24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing namespace llvm::codeview;
25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace {
27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// Use this private dumper implementation to keep implementation details about
28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// the visitor out of SymbolDumper.h.
29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass CVSymbolDumperImpl : public CVSymbolVisitor<CVSymbolDumperImpl> {
30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVSymbolDumperImpl(CVTypeDumper &CVTD, SymbolDumpDelegate *ObjDelegate,
32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     ScopedPrinter &W, bool PrintRecordBytes)
33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      : CVSymbolVisitor(ObjDelegate), CVTD(CVTD), ObjDelegate(ObjDelegate),
34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        W(W), PrintRecordBytes(PrintRecordBytes), InFunctionScope(false) {}
35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// CVSymbolVisitor overrides.
37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define SYMBOL_RECORD(EnumName, EnumVal, Name)                                 \
38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void visit##Name(SymbolKind Kind, Name &Record);
39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/CVSymbolTypes.def"
41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void visitSymbolBegin(SymbolKind Kind, ArrayRef<uint8_t> Data);
43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void visitSymbolEnd(SymbolKind Kind, ArrayRef<uint8_t> OriginalSymData);
44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void visitUnknownSymbol(SymbolKind Kind, ArrayRef<uint8_t> Data);
45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprivate:
47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printLocalVariableAddrRange(const LocalVariableAddrRange &Range,
48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                   uint32_t RelocationOffset);
49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  void printLocalVariableAddrGap(ArrayRef<LocalVariableAddrGap> Gaps);
50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVTypeDumper &CVTD;
52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  SymbolDumpDelegate *ObjDelegate;
53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ScopedPrinter &W;
54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool PrintRecordBytes;
56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool InFunctionScope;
57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::printLocalVariableAddrRange(
61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const LocalVariableAddrRange &Range, uint32_t RelocationOffset) {
62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "LocalVariableAddrRange");
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ObjDelegate)
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ObjDelegate->printRelocatedField("OffsetStart", RelocationOffset,
65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                     Range.OffsetStart);
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("ISectStart", Range.ISectStart);
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Range", Range.Range);
68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::printLocalVariableAddrGap(
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ArrayRef<LocalVariableAddrGap> Gaps) {
72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto &Gap : Gaps) {
73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ListScope S(W, "LocalVariableAddrGap");
74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("GapStartOffset", Gap.GapStartOffset);
75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printHex("Range", Gap.Range);
76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitSymbolBegin(SymbolKind Kind,
80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          ArrayRef<uint8_t> Data) {}
81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitSymbolEnd(SymbolKind Kind,
83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                        ArrayRef<uint8_t> OriginalSymData) {
84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (PrintRecordBytes && ObjDelegate)
85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ObjDelegate->printBinaryBlockWithRelocs("SymData", OriginalSymData);
86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitBlockSym(SymbolKind Kind, BlockSym &Block) {
89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "BlockStart");
90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef LinkageName;
92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("PtrParent", Block.Header.PtrParent);
93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("PtrEnd", Block.Header.PtrEnd);
94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("CodeSize", Block.Header.CodeSize);
95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ObjDelegate) {
96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ObjDelegate->printRelocatedField("CodeOffset", Block.getRelocationOffset(),
97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                     Block.Header.CodeOffset, &LinkageName);
98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Segment", Block.Header.Segment);
100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("BlockName", Block.Name);
101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("LinkageName", LinkageName);
102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitThunk32Sym(SymbolKind Kind, Thunk32Sym &Thunk) {
105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "Thunk32");
106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Parent", Thunk.Header.Parent);
107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("End", Thunk.Header.End);
108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Next", Thunk.Header.Next);
109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Off", Thunk.Header.Off);
110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Seg", Thunk.Header.Seg);
111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Len", Thunk.Header.Len);
112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printEnum("Ordinal", Thunk.Header.Ord, getThunkOrdinalNames());
113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitTrampolineSym(SymbolKind Kind,
116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            TrampolineSym &Tramp) {
117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "Trampoline");
118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printEnum("Type", Tramp.Header.Type, getTrampolineNames());
119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Size", Tramp.Header.Size);
120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("ThunkOff", Tramp.Header.ThunkOff);
121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("TargetOff", Tramp.Header.TargetOff);
122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("ThunkSection", Tramp.Header.ThunkSection);
123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("TargetSection", Tramp.Header.TargetSection);
124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitSectionSym(SymbolKind Kind, SectionSym &Section) {
127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "Section");
128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("SectionNumber", Section.Header.SectionNumber);
129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Alignment", Section.Header.Alignment);
130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Reserved", Section.Header.Reserved);
131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Rva", Section.Header.Rva);
132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Length", Section.Header.Length);
133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printFlags("Characteristics", Section.Header.Characteristics,
134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               getImageSectionCharacteristicNames(),
135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               COFF::SectionCharacteristics(0x00F00000));
136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("Name", Section.Name);
138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitCoffGroupSym(SymbolKind Kind,
141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           CoffGroupSym &CoffGroup) {
142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "COFF Group");
143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Size", CoffGroup.Header.Size);
144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printFlags("Characteristics", CoffGroup.Header.Characteristics,
145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               getImageSectionCharacteristicNames(),
146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               COFF::SectionCharacteristics(0x00F00000));
147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Offset", CoffGroup.Header.Offset);
148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Segment", CoffGroup.Header.Segment);
149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("Name", CoffGroup.Name);
150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitBPRelativeSym(SymbolKind Kind,
153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            BPRelativeSym &BPRel) {
154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "BPRelativeSym");
155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Offset", BPRel.Header.Offset);
157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVTD.printTypeIndex("Type", BPRel.Header.Type);
158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("VarName", BPRel.Name);
159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitBuildInfoSym(SymbolKind Kind,
162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           BuildInfoSym &BuildInfo) {
163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "BuildInfo");
164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("BuildId", BuildInfo.Header.BuildId);
166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitCallSiteInfoSym(SymbolKind Kind,
169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                              CallSiteInfoSym &CallSiteInfo) {
170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "CallSiteInfo");
171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef LinkageName;
173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ObjDelegate) {
174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ObjDelegate->printRelocatedField(
175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        "CodeOffset", CallSiteInfo.getRelocationOffset(),
176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        CallSiteInfo.Header.CodeOffset, &LinkageName);
177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Segment", CallSiteInfo.Header.Segment);
179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Reserved", CallSiteInfo.Header.Reserved);
180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVTD.printTypeIndex("Type", CallSiteInfo.Header.Type);
181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!LinkageName.empty())
182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printString("LinkageName", LinkageName);
183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitEnvBlockSym(SymbolKind Kind,
186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          EnvBlockSym &EnvBlock) {
187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "EnvBlock");
188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Reserved", EnvBlock.Header.Reserved);
190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ListScope L(W, "Entries");
191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto Entry : EnvBlock.Fields) {
192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printString(Entry);
193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitFileStaticSym(SymbolKind Kind,
197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            FileStaticSym &FileStatic) {
198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "FileStatic");
199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Index", FileStatic.Header.Index);
200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("ModFilenameOffset", FileStatic.Header.ModFilenameOffset);
201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printFlags("Flags", uint16_t(FileStatic.Header.Flags), getLocalFlagNames());
202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("Name", FileStatic.Name);
203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitExportSym(SymbolKind Kind, ExportSym &Export) {
206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "Export");
207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Ordinal", Export.Header.Ordinal);
208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printFlags("Flags", Export.Header.Flags, getExportSymFlagNames());
209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("Name", Export.Name);
210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitCompile2Sym(SymbolKind Kind,
213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          Compile2Sym &Compile2) {
214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "CompilerFlags2");
215de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
216de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printEnum("Language", Compile2.Header.getLanguage(),
217de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              getSourceLanguageNames());
218de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printFlags("Flags", Compile2.Header.flags & ~0xff,
219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               getCompileSym2FlagNames());
220de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printEnum("Machine", unsigned(Compile2.Header.Machine), getCPUTypeNames());
221de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string FrontendVersion;
222de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {
223de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    raw_string_ostream Out(FrontendVersion);
224de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Out << Compile2.Header.VersionFrontendMajor << '.'
225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        << Compile2.Header.VersionFrontendMinor << '.'
226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        << Compile2.Header.VersionFrontendBuild;
227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string BackendVersion;
229de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {
230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    raw_string_ostream Out(BackendVersion);
231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Out << Compile2.Header.VersionBackendMajor << '.'
232de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        << Compile2.Header.VersionBackendMinor << '.'
233de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        << Compile2.Header.VersionBackendBuild;
234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("FrontendVersion", FrontendVersion);
236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("BackendVersion", BackendVersion);
237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("VersionName", Compile2.Version);
238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitCompile3Sym(SymbolKind Kind,
241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          Compile3Sym &Compile3) {
242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "CompilerFlags3");
243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printEnum("Language", Compile3.Header.getLanguage(),
245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              getSourceLanguageNames());
246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printFlags("Flags", Compile3.Header.flags & ~0xff,
247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               getCompileSym3FlagNames());
248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printEnum("Machine", unsigned(Compile3.Header.Machine), getCPUTypeNames());
249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string FrontendVersion;
250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {
251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    raw_string_ostream Out(FrontendVersion);
252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Out << Compile3.Header.VersionFrontendMajor << '.'
253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        << Compile3.Header.VersionFrontendMinor << '.'
254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        << Compile3.Header.VersionFrontendBuild << '.'
255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        << Compile3.Header.VersionFrontendQFE;
256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::string BackendVersion;
258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  {
259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    raw_string_ostream Out(BackendVersion);
260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Out << Compile3.Header.VersionBackendMajor << '.'
261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        << Compile3.Header.VersionBackendMinor << '.'
262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        << Compile3.Header.VersionBackendBuild << '.'
263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        << Compile3.Header.VersionBackendQFE;
264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("FrontendVersion", FrontendVersion);
266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("BackendVersion", BackendVersion);
267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("VersionName", Compile3.Version);
268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitConstantSym(SymbolKind Kind,
271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          ConstantSym &Constant) {
272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "Constant");
273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVTD.printTypeIndex("Type", Constant.Header.Type);
275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Value", Constant.Value);
276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("Name", Constant.Name);
277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitDataSym(SymbolKind Kind, DataSym &Data) {
280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "DataSym");
281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printEnum("Kind", uint16_t(Kind), getSymbolTypeNames());
283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef LinkageName;
284de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ObjDelegate) {
285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                     Data.Header.DataOffset, &LinkageName);
287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVTD.printTypeIndex("Type", Data.Header.Type);
289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("DisplayName", Data.Name);
290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!LinkageName.empty())
291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printString("LinkageName", LinkageName);
292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
294de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitDefRangeFramePointerRelFullScopeSym(
295de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SymbolKind Kind,
296de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    DefRangeFramePointerRelFullScopeSym &DefRangeFramePointerRelFullScope) {
297de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "DefRangeFramePointerRelFullScope");
298de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Offset", DefRangeFramePointerRelFullScope.Header.Offset);
299de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
300de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
301de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitDefRangeFramePointerRelSym(
302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SymbolKind Kind, DefRangeFramePointerRelSym &DefRangeFramePointerRel) {
303de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "DefRangeFramePointerRel");
304de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
305de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Offset", DefRangeFramePointerRel.Header.Offset);
306de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printLocalVariableAddrRange(DefRangeFramePointerRel.Header.Range,
307de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                              DefRangeFramePointerRel.getRelocationOffset());
308de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printLocalVariableAddrGap(DefRangeFramePointerRel.Gaps);
309de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
310de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
311de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitDefRangeRegisterRelSym(
312de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SymbolKind Kind, DefRangeRegisterRelSym &DefRangeRegisterRel) {
313de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "DefRangeRegisterRel");
314de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
315de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("BaseRegister", DefRangeRegisterRel.Header.BaseRegister);
316de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printBoolean("HasSpilledUDTMember",
317de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                 DefRangeRegisterRel.hasSpilledUDTMember());
318de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("OffsetInParent", DefRangeRegisterRel.offsetInParent());
319de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("BasePointerOffset",
320de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                DefRangeRegisterRel.Header.BasePointerOffset);
321de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printLocalVariableAddrRange(DefRangeRegisterRel.Header.Range,
322de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                              DefRangeRegisterRel.getRelocationOffset());
323de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printLocalVariableAddrGap(DefRangeRegisterRel.Gaps);
324de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
325de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
326de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitDefRangeRegisterSym(
327de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SymbolKind Kind, DefRangeRegisterSym &DefRangeRegister) {
328de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "DefRangeRegister");
329de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
330de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Register", DefRangeRegister.Header.Register);
331de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("MayHaveNoName", DefRangeRegister.Header.MayHaveNoName);
332de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printLocalVariableAddrRange(DefRangeRegister.Header.Range,
333de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                              DefRangeRegister.getRelocationOffset());
334de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printLocalVariableAddrGap(DefRangeRegister.Gaps);
335de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
336de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
337de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitDefRangeSubfieldRegisterSym(
338de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SymbolKind Kind, DefRangeSubfieldRegisterSym &DefRangeSubfieldRegister) {
339de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "DefRangeSubfieldRegister");
340de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
341de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Register", DefRangeSubfieldRegister.Header.Register);
342de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("MayHaveNoName", DefRangeSubfieldRegister.Header.MayHaveNoName);
343de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("OffsetInParent",
344de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                DefRangeSubfieldRegister.Header.OffsetInParent);
345de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printLocalVariableAddrRange(DefRangeSubfieldRegister.Header.Range,
346de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                              DefRangeSubfieldRegister.getRelocationOffset());
347de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printLocalVariableAddrGap(DefRangeSubfieldRegister.Gaps);
348de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
349de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
350de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitDefRangeSubfieldSym(
351de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SymbolKind Kind, DefRangeSubfieldSym &DefRangeSubfield) {
352de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "DefRangeSubfield");
353de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
354de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ObjDelegate) {
355de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef StringTable = ObjDelegate->getStringTable();
356de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    auto ProgramStringTableOffset = DefRangeSubfield.Header.Program;
357de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (ProgramStringTableOffset >= StringTable.size())
358de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return parseError();
359de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Program =
360de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        StringTable.drop_front(ProgramStringTableOffset).split('\0').first;
361de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printString("Program", Program);
362de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
363de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("OffsetInParent", DefRangeSubfield.Header.OffsetInParent);
364de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printLocalVariableAddrRange(DefRangeSubfield.Header.Range,
365de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                              DefRangeSubfield.getRelocationOffset());
366de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printLocalVariableAddrGap(DefRangeSubfield.Gaps);
367de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
368de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
369de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitDefRangeSym(SymbolKind Kind,
370de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          DefRangeSym &DefRange) {
371de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "DefRange");
372de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
373de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ObjDelegate) {
374de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef StringTable = ObjDelegate->getStringTable();
375de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    auto ProgramStringTableOffset = DefRange.Header.Program;
376de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (ProgramStringTableOffset >= StringTable.size())
377de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return parseError();
378de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    StringRef Program =
379de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        StringTable.drop_front(ProgramStringTableOffset).split('\0').first;
380de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printString("Program", Program);
381de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
382de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printLocalVariableAddrRange(DefRange.Header.Range,
383de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                              DefRange.getRelocationOffset());
384de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  printLocalVariableAddrGap(DefRange.Gaps);
385de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
386de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
387de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitFrameCookieSym(SymbolKind Kind,
388de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                             FrameCookieSym &FrameCookie) {
389de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "FrameCookie");
390de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
391de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef LinkageName;
392de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ObjDelegate) {
393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ObjDelegate->printRelocatedField(
394de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        "CodeOffset", FrameCookie.getRelocationOffset(),
395de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        FrameCookie.Header.CodeOffset, &LinkageName);
396de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Register", FrameCookie.Header.Register);
398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printEnum("CookieKind", uint16_t(FrameCookie.Header.CookieKind),
399de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar              getFrameCookieKindNames());
400de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Flags", FrameCookie.Header.Flags);
401de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
402de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
403de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitFrameProcSym(SymbolKind Kind,
404de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                           FrameProcSym &FrameProc) {
405de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "FrameProc");
406de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
407de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("TotalFrameBytes", FrameProc.Header.TotalFrameBytes);
408de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("PaddingFrameBytes", FrameProc.Header.PaddingFrameBytes);
409de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("OffsetToPadding", FrameProc.Header.OffsetToPadding);
410de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("BytesOfCalleeSavedRegisters",
411de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar             FrameProc.Header.BytesOfCalleeSavedRegisters);
412de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("OffsetOfExceptionHandler",
413de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar             FrameProc.Header.OffsetOfExceptionHandler);
414de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("SectionIdOfExceptionHandler",
415de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar             FrameProc.Header.SectionIdOfExceptionHandler);
416de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printFlags("Flags", FrameProc.Header.Flags, getFrameProcSymFlagNames());
417de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
418de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
419de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitHeapAllocationSiteSym(
420de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    SymbolKind Kind, HeapAllocationSiteSym &HeapAllocSite) {
421de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "HeapAllocationSite");
422de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
423de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef LinkageName;
424de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ObjDelegate) {
425de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ObjDelegate->printRelocatedField(
426de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        "CodeOffset", HeapAllocSite.getRelocationOffset(),
427de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        HeapAllocSite.Header.CodeOffset, &LinkageName);
428de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
429de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Segment", HeapAllocSite.Header.Segment);
430de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("CallInstructionSize", HeapAllocSite.Header.CallInstructionSize);
431de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVTD.printTypeIndex("Type", HeapAllocSite.Header.Type);
432de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!LinkageName.empty())
433de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printString("LinkageName", LinkageName);
434de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
435de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
436de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitInlineSiteSym(SymbolKind Kind,
437de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            InlineSiteSym &InlineSite) {
438de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "InlineSite");
439de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
440de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("PtrParent", InlineSite.Header.PtrParent);
441de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("PtrEnd", InlineSite.Header.PtrEnd);
442de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVTD.printTypeIndex("Inlinee", InlineSite.Header.Inlinee);
443de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ListScope BinaryAnnotations(W, "BinaryAnnotations");
445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto &Annotation : InlineSite.annotations()) {
446de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    switch (Annotation.OpCode) {
447de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::Invalid:
448de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return parseError();
449de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::CodeOffset:
450de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeCodeOffset:
451de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeCodeLength:
452de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printHex(Annotation.Name, Annotation.U1);
453de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
454de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeCodeOffsetBase:
455de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeLineEndDelta:
456de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeRangeKind:
457de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeColumnStart:
458de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeColumnEnd:
459de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printNumber(Annotation.Name, Annotation.U1);
460de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
461de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeLineOffset:
462de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeColumnEndDelta:
463de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.printNumber(Annotation.Name, Annotation.S1);
464de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
465de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeFile:
466de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      if (ObjDelegate) {
467de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        W.printHex("ChangeFile",
468de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                   ObjDelegate->getFileNameForFileOffset(Annotation.U1),
469de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                   Annotation.U1);
470de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      } else {
471de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar        W.printHex("ChangeFile", Annotation.U1);
472de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      }
473de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
474de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
475de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeCodeOffsetAndLineOffset: {
476de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.startLine() << "ChangeCodeOffsetAndLineOffset: {CodeOffset: "
477de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    << W.hex(Annotation.U1) << ", LineOffset: " << Annotation.S1
478de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    << "}\n";
479de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
480de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
481de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    case BinaryAnnotationsOpCode::ChangeCodeLengthAndCodeOffset: {
482de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      W.startLine() << "ChangeCodeLengthAndCodeOffset: {CodeOffset: "
483de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    << W.hex(Annotation.U2)
484de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    << ", Length: " << W.hex(Annotation.U1) << "}\n";
485de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      break;
486de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
487de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
488de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
489de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
490de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
491de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitRegisterSym(SymbolKind Kind,
492de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          RegisterSym &Register) {
493de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "RegisterSym");
494de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Type", Register.Header.Index);
495de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printEnum("Seg", uint16_t(Register.Header.Register), getRegisterNames());
496de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("Name", Register.Name);
497de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
498de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
499de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitPublicSym32(SymbolKind Kind,
500de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          PublicSym32 &Public) {
501de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "PublicSym");
502de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Type", Public.Header.Index);
503de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Seg", Public.Header.Seg);
504de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Off", Public.Header.Off);
505de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("Name", Public.Name);
506de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
507de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
508de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitProcRefSym(SymbolKind Kind, ProcRefSym &ProcRef) {
509de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "ProcRef");
510de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("SumName", ProcRef.Header.SumName);
511de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("SymOffset", ProcRef.Header.SymOffset);
512de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Mod", ProcRef.Header.Mod);
513de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("Name", ProcRef.Name);
514de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
515de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
516de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitLabelSym(SymbolKind Kind, LabelSym &Label) {
517de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "Label");
518de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
519de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef LinkageName;
520de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ObjDelegate) {
521de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ObjDelegate->printRelocatedField("CodeOffset", Label.getRelocationOffset(),
522de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                     Label.Header.CodeOffset, &LinkageName);
523de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
524de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Segment", Label.Header.Segment);
525de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Flags", Label.Header.Flags);
526de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printFlags("Flags", Label.Header.Flags, getProcSymFlagNames());
527de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("DisplayName", Label.Name);
528de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!LinkageName.empty())
529de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printString("LinkageName", LinkageName);
530de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
531de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
532de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitLocalSym(SymbolKind Kind, LocalSym &Local) {
533de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "Local");
534de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
535de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVTD.printTypeIndex("Type", Local.Header.Type);
536de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printFlags("Flags", uint16_t(Local.Header.Flags), getLocalFlagNames());
537de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("VarName", Local.Name);
538de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
539de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
540de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitObjNameSym(SymbolKind Kind, ObjNameSym &ObjName) {
541de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "ObjectName");
542de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
543de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Signature", ObjName.Header.Signature);
544de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("ObjectName", ObjName.Name);
545de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
546de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
547de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitProcSym(SymbolKind Kind, ProcSym &Proc) {
548de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "ProcStart");
549de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
550de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (InFunctionScope)
551de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return parseError();
552de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
553de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  InFunctionScope = true;
554de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
555de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef LinkageName;
556de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printEnum("Kind", uint16_t(Kind), getSymbolTypeNames());
557de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("PtrParent", Proc.Header.PtrParent);
558de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("PtrEnd", Proc.Header.PtrEnd);
559de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("PtrNext", Proc.Header.PtrNext);
560de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("CodeSize", Proc.Header.CodeSize);
561de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("DbgStart", Proc.Header.DbgStart);
562de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("DbgEnd", Proc.Header.DbgEnd);
563de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVTD.printTypeIndex("FunctionType", Proc.Header.FunctionType);
564de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ObjDelegate) {
565de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ObjDelegate->printRelocatedField("CodeOffset", Proc.getRelocationOffset(),
566de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                     Proc.Header.CodeOffset, &LinkageName);
567de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
568de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Segment", Proc.Header.Segment);
569de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printFlags("Flags", static_cast<uint8_t>(Proc.Header.Flags),
570de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar               getProcSymFlagNames());
571de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("DisplayName", Proc.Name);
572de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!LinkageName.empty())
573de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printString("LinkageName", LinkageName);
574de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
575de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
576de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitScopeEndSym(SymbolKind Kind,
577de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                          ScopeEndSym &ScopeEnd) {
578de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Kind == SymbolKind::S_END)
579de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    DictScope S(W, "BlockEnd");
580de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else if (Kind == SymbolKind::S_PROC_ID_END)
581de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    DictScope S(W, "ProcEnd");
582de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  else if (Kind == SymbolKind::S_INLINESITE_END)
583de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    DictScope S(W, "InlineSiteEnd");
584de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
585de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  InFunctionScope = false;
586de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
587de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
588de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitCallerSym(SymbolKind Kind, CallerSym &Caller) {
589de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ListScope S(W, Kind == S_CALLEES ? "Callees" : "Callers");
590de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (auto FuncID : Caller.Indices)
591de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CVTD.printTypeIndex("FuncID", FuncID);
592de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
593de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
594de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitRegRelativeSym(SymbolKind Kind,
595de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                             RegRelativeSym &RegRel) {
596de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "RegRelativeSym");
597de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
598de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Offset", RegRel.Header.Offset);
599de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVTD.printTypeIndex("Type", RegRel.Header.Type);
600de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printHex("Register", RegRel.Header.Register);
601de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("VarName", RegRel.Name);
602de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
603de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
604de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitThreadLocalDataSym(SymbolKind Kind,
605de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                 ThreadLocalDataSym &Data) {
606de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "ThreadLocalDataSym");
607de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
608de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef LinkageName;
609de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (ObjDelegate) {
610de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    ObjDelegate->printRelocatedField("DataOffset", Data.getRelocationOffset(),
611de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                     Data.Header.DataOffset, &LinkageName);
612de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
613de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVTD.printTypeIndex("Type", Data.Header.Type);
614de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("DisplayName", Data.Name);
615de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (!LinkageName.empty())
616de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    W.printString("LinkageName", LinkageName);
617de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
618de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
619de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitUDTSym(SymbolKind Kind, UDTSym &UDT) {
620de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "UDT");
621de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVTD.printTypeIndex("Type", UDT.Header.Type);
622de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printString("UDTName", UDT.Name);
623de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
624de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
625de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarvoid CVSymbolDumperImpl::visitUnknownSymbol(SymbolKind Kind,
626de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            ArrayRef<uint8_t> Data) {
627de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  DictScope S(W, "UnknownSym");
628de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printEnum("Kind", uint16_t(Kind), getSymbolTypeNames());
629de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  W.printNumber("Length", uint32_t(Data.size()));
630de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
631de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
632de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool CVSymbolDumper::dump(const CVRecord<SymbolKind> &Record) {
633de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVSymbolDumperImpl Dumper(CVTD, ObjDelegate.get(), W, PrintRecordBytes);
634de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Dumper.visitSymbolRecord(Record);
635de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return !Dumper.hadError();
636de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
637de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
638de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool CVSymbolDumper::dump(const CVSymbolArray &Symbols) {
639de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CVSymbolDumperImpl Dumper(CVTD, ObjDelegate.get(), W, PrintRecordBytes);
640de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Dumper.visitSymbolStream(Symbols);
641de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return !Dumper.hadError();
642de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
643