blob: d058f48649754464507db585b4a230cf10cc8b3d [file] [log] [blame]
Zachary Turner0d840742016-10-07 21:34:46 +00001//===- 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"
Zachary Turnerd9dc2822017-03-02 20:52:51 +000014#include "llvm/Support/BinaryByteStream.h"
Zachary Turner0d840742016-10-07 21:34:46 +000015
16using namespace llvm;
17using namespace llvm::codeview;
18
Zachary Turner0d840742016-10-07 21:34:46 +000019CVSymbolVisitor::CVSymbolVisitor(SymbolVisitorCallbacks &Callbacks)
20 : Callbacks(Callbacks) {}
21
22template <typename T>
23static Error visitKnownRecord(CVSymbol &Record,
24 SymbolVisitorCallbacks &Callbacks) {
25 SymbolRecordKind RK = static_cast<SymbolRecordKind>(Record.Type);
26 T KnownRecord(RK);
27 if (auto EC = Callbacks.visitKnownRecord(Record, KnownRecord))
28 return EC;
29 return Error::success();
30}
31
32Error CVSymbolVisitor::visitSymbolRecord(CVSymbol &Record) {
33 if (auto EC = Callbacks.visitSymbolBegin(Record))
34 return EC;
35
36 switch (Record.Type) {
37 default:
38 if (auto EC = Callbacks.visitUnknownSymbol(Record))
39 return EC;
40 break;
41#define SYMBOL_RECORD(EnumName, EnumVal, Name) \
42 case EnumName: { \
43 if (auto EC = visitKnownRecord<Name>(Record, Callbacks)) \
44 return EC; \
45 break; \
46 }
47#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) \
48 SYMBOL_RECORD(EnumVal, EnumVal, AliasName)
Zachary Turnerd4273832017-05-30 21:53:05 +000049#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
Zachary Turner0d840742016-10-07 21:34:46 +000050 }
51
52 if (auto EC = Callbacks.visitSymbolEnd(Record))
53 return EC;
54
55 return Error::success();
56}
57
58Error CVSymbolVisitor::visitSymbolStream(const CVSymbolArray &Symbols) {
59 for (auto I : Symbols) {
60 if (auto EC = visitSymbolRecord(I))
61 return EC;
62 }
63 return Error::success();
64}