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 } 65