Home | History | Annotate | Download | only in CodeView
      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 
     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 
     33   Error visitSymbolBegin(CVSymbol &Record) override {
     34     for (auto Visitor : Pipeline) {
     35       if (auto EC = Visitor->visitSymbolBegin(Record))
     36         return EC;
     37     }
     38     return Error::success();
     39   }
     40 
     41   Error visitSymbolEnd(CVSymbol &Record) override {
     42     for (auto Visitor : Pipeline) {
     43       if (auto EC = Visitor->visitSymbolEnd(Record))
     44         return EC;
     45     }
     46     return Error::success();
     47   }
     48 
     49   void addCallbackToPipeline(SymbolVisitorCallbacks &Callbacks) {
     50     Pipeline.push_back(&Callbacks);
     51   }
     52 
     53 #define SYMBOL_RECORD(EnumName, EnumVal, Name)                                 \
     54   Error visitKnownRecord(CVSymbol &CVR, Name &Record) override {               \
     55     for (auto Visitor : Pipeline) {                                            \
     56       if (auto EC = Visitor->visitKnownRecord(CVR, Record))                    \
     57         return EC;                                                             \
     58     }                                                                          \
     59     return Error::success();                                                   \
     60   }
     61 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
     62 #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
     63 
     64 private:
     65   std::vector<SymbolVisitorCallbacks *> Pipeline;
     66 };
     67 
     68 } // end namespace codeview
     69 } // end namespace llvm
     70 
     71 #endif // LLVM_DEBUGINFO_CODEVIEW_SYMBOLVISITORCALLBACKPIPELINE_H
     72