1 //===- SymbolVisitorCallbackPipeline.h --------------------------*- 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 #ifndef LLVM_DEBUGINFO_CODEVIEW_SYMBOLVISITORCALLBACKPIPELINE_H 11 #define LLVM_DEBUGINFO_CODEVIEW_SYMBOLVISITORCALLBACKPIPELINE_H 12 13 #include "llvm/DebugInfo/CodeView/SymbolRecord.h" 14 #include "llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h" 15 #include "llvm/Support/Error.h" 16 #include <vector> 17 18 namespace llvm { 19 namespace codeview { 20 21 class SymbolVisitorCallbackPipeline : public SymbolVisitorCallbacks { 22 public: 23 SymbolVisitorCallbackPipeline() = default; 24 visitUnknownSymbol(CVSymbol & Record)25 Error visitUnknownSymbol(CVSymbol &Record) override { 26 for (auto Visitor : Pipeline) { 27 if (auto EC = Visitor->visitUnknownSymbol(Record)) 28 return EC; 29 } 30 return Error::success(); 31 } 32 visitSymbolBegin(CVSymbol & Record,uint32_t Offset)33 Error visitSymbolBegin(CVSymbol &Record, uint32_t Offset) override { 34 for (auto Visitor : Pipeline) { 35 if (auto EC = Visitor->visitSymbolBegin(Record, Offset)) 36 return EC; 37 } 38 return Error::success(); 39 } 40 visitSymbolBegin(CVSymbol & Record)41 Error visitSymbolBegin(CVSymbol &Record) override { 42 for (auto Visitor : Pipeline) { 43 if (auto EC = Visitor->visitSymbolBegin(Record)) 44 return EC; 45 } 46 return Error::success(); 47 } 48 visitSymbolEnd(CVSymbol & Record)49 Error visitSymbolEnd(CVSymbol &Record) override { 50 for (auto Visitor : Pipeline) { 51 if (auto EC = Visitor->visitSymbolEnd(Record)) 52 return EC; 53 } 54 return Error::success(); 55 } 56 addCallbackToPipeline(SymbolVisitorCallbacks & Callbacks)57 void addCallbackToPipeline(SymbolVisitorCallbacks &Callbacks) { 58 Pipeline.push_back(&Callbacks); 59 } 60 61 #define SYMBOL_RECORD(EnumName, EnumVal, Name) \ 62 Error visitKnownRecord(CVSymbol &CVR, Name &Record) override { \ 63 for (auto Visitor : Pipeline) { \ 64 if (auto EC = Visitor->visitKnownRecord(CVR, Record)) \ 65 return EC; \ 66 } \ 67 return Error::success(); \ 68 } 69 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) 70 #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def" 71 72 private: 73 std::vector<SymbolVisitorCallbacks *> Pipeline; 74 }; 75 76 } // end namespace codeview 77 } // end namespace llvm 78 79 #endif // LLVM_DEBUGINFO_CODEVIEW_SYMBOLVISITORCALLBACKPIPELINE_H 80