1 //===- CVSymbolVisitor.cpp --------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/DebugInfo/CodeView/CVSymbolVisitor.h"
12 #include "llvm/DebugInfo/CodeView/CodeViewError.h"
13 #include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h"
14 #include "llvm/Support/BinaryByteStream.h"
17 using namespace llvm::codeview;
19 CVSymbolVisitor::CVSymbolVisitor(SymbolVisitorCallbacks &Callbacks)
20 : Callbacks(Callbacks) {}
23 static Error visitKnownRecord(CVSymbol &Record,
24 SymbolVisitorCallbacks &Callbacks) {
25 SymbolRecordKind RK = static_cast<SymbolRecordKind>(Record.Type);
27 if (auto EC = Callbacks.visitKnownRecord(Record, KnownRecord))
29 return Error::success();
32 Error CVSymbolVisitor::visitSymbolRecord(CVSymbol &Record) {
33 if (auto EC = Callbacks.visitSymbolBegin(Record))
36 switch (Record.Type) {
38 if (auto EC = Callbacks.visitUnknownSymbol(Record))
41 #define SYMBOL_RECORD(EnumName, EnumVal, Name) \
43 if (auto EC = visitKnownRecord<Name>(Record, Callbacks)) \
47 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
48 SYMBOL_RECORD(EnumVal, EnumVal, AliasName)
49 #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
52 if (auto EC = Callbacks.visitSymbolEnd(Record))
55 return Error::success();
58 Error CVSymbolVisitor::visitSymbolStream(const CVSymbolArray &Symbols) {
59 for (auto I : Symbols) {
60 if (auto EC = visitSymbolRecord(I))
63 return Error::success();