]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/llvm/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp
Merge llvm, clang, lld, lldb, compiler-rt and libc++ r304460, and update
[FreeBSD/FreeBSD.git] / contrib / llvm / lib / DebugInfo / CodeView / CVSymbolVisitor.cpp
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 #include "llvm/Support/BinaryByteStream.h"
15
16 using namespace llvm;
17 using namespace llvm::codeview;
18
19 CVSymbolVisitor::CVSymbolVisitor(SymbolVisitorCallbacks &Callbacks)
20     : Callbacks(Callbacks) {}
21
22 template <typename T>
23 static 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
32 Error 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)
49 #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
50   }
51
52   if (auto EC = Callbacks.visitSymbolEnd(Record))
53     return EC;
54
55   return Error::success();
56 }
57
58 Error 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 }