Line data Source code
1 : //===- CVSymbolVisitor.cpp --------------------------------------*- C++ -*-===//
2 : //
3 : // The LLVM Compiler Infrastructure
4 : //
5 : // This file is distributed under the University of Illinois Open Source
6 : // License. See LICENSE.TXT for details.
7 : //
8 : //===----------------------------------------------------------------------===//
9 :
10 : #include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
11 :
12 : #include "llvm/DebugInfo/CodeView/CodeViewError.h"
13 : #include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h"
14 :
15 : using namespace llvm;
16 : using namespace llvm::codeview;
17 :
18 501 : CVSymbolVisitor::CVSymbolVisitor(SymbolVisitorCallbacks &Callbacks)
19 501 : : Callbacks(Callbacks) {}
20 :
21 : template <typename T>
22 2048 : static Error visitKnownRecord(CVSymbol &Record,
23 : SymbolVisitorCallbacks &Callbacks) {
24 2048 : SymbolRecordKind RK = static_cast<SymbolRecordKind>(Record.Type);
25 : T KnownRecord(RK);
26 4096 : if (auto EC = Callbacks.visitKnownRecord(Record, KnownRecord))
27 : return EC;
28 : return Error::success();
29 : }
30 9 :
31 : static Error finishVisitation(CVSymbol &Record,
32 9 : SymbolVisitorCallbacks &Callbacks) {
33 : switch (Record.Type) {
34 18 : default:
35 : if (auto EC = Callbacks.visitUnknownSymbol(Record))
36 : return EC;
37 : break;
38 7 : #define SYMBOL_RECORD(EnumName, EnumVal, Name) \
39 : case EnumName: { \
40 7 : if (auto EC = visitKnownRecord<Name>(Record, Callbacks)) \
41 : return EC; \
42 14 : break; \
43 : }
44 : #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
45 : SYMBOL_RECORD(EnumVal, EnumVal, AliasName)
46 153 : #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
47 : }
48 153 :
49 : if (auto EC = Callbacks.visitSymbolEnd(Record))
50 306 : return EC;
51 :
52 : return Error::success();
53 : }
54 45 :
55 : Error CVSymbolVisitor::visitSymbolRecord(CVSymbol &Record) {
56 45 : if (auto EC = Callbacks.visitSymbolBegin(Record))
57 : return EC;
58 90 : return finishVisitation(Record, Callbacks);
59 : }
60 :
61 : Error CVSymbolVisitor::visitSymbolRecord(CVSymbol &Record, uint32_t Offset) {
62 0 : if (auto EC = Callbacks.visitSymbolBegin(Record, Offset))
63 : return EC;
64 0 : return finishVisitation(Record, Callbacks);
65 : }
66 0 :
67 : Error CVSymbolVisitor::visitSymbolStream(const CVSymbolArray &Symbols) {
68 : for (auto I : Symbols) {
69 : if (auto EC = visitSymbolRecord(I))
70 0 : return EC;
71 : }
72 0 : return Error::success();
73 : }
74 0 :
75 : Error CVSymbolVisitor::visitSymbolStream(const CVSymbolArray &Symbols,
76 : uint32_t InitialOffset) {
77 : for (auto I : Symbols) {
78 202 : if (auto EC = visitSymbolRecord(I, InitialOffset))
79 : return EC;
80 202 : InitialOffset += I.length();
81 : }
82 404 : return Error::success();
83 : }
|