1 //===- TypeVisitorCallbackPipeline.h ----------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef LLVM_DEBUGINFO_CODEVIEW_TYPEVISITORCALLBACKPIPELINE_H
11 #define LLVM_DEBUGINFO_CODEVIEW_TYPEVISITORCALLBACKPIPELINE_H
13 #include "llvm/DebugInfo/CodeView/CodeView.h"
14 #include "llvm/DebugInfo/CodeView/TypeRecord.h"
15 #include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
16 #include "llvm/Support/Error.h"
22 class TypeVisitorCallbackPipeline : public TypeVisitorCallbacks {
24 TypeVisitorCallbackPipeline() = default;
26 Error visitUnknownType(CVRecord<TypeLeafKind> &Record) override {
27 for (auto Visitor : Pipeline) {
28 if (auto EC = Visitor->visitUnknownType(Record))
31 return Error::success();
34 Error visitUnknownMember(CVMemberRecord &Record) override {
35 for (auto Visitor : Pipeline) {
36 if (auto EC = Visitor->visitUnknownMember(Record))
39 return Error::success();
42 Error visitTypeBegin(CVType &Record) override {
43 for (auto Visitor : Pipeline) {
44 if (auto EC = Visitor->visitTypeBegin(Record))
47 return Error::success();
50 Error visitTypeEnd(CVType &Record) override {
51 for (auto Visitor : Pipeline) {
52 if (auto EC = Visitor->visitTypeEnd(Record))
55 return Error::success();
58 Error visitMemberBegin(CVMemberRecord &Record) override {
59 for (auto Visitor : Pipeline) {
60 if (auto EC = Visitor->visitMemberBegin(Record))
63 return Error::success();
66 Error visitMemberEnd(CVMemberRecord &Record) override {
67 for (auto Visitor : Pipeline) {
68 if (auto EC = Visitor->visitMemberEnd(Record))
71 return Error::success();
74 void addCallbackToPipeline(TypeVisitorCallbacks &Callbacks) {
75 Pipeline.push_back(&Callbacks);
78 #define TYPE_RECORD(EnumName, EnumVal, Name) \
79 Error visitKnownRecord(CVType &CVR, Name##Record &Record) override { \
80 return visitKnownRecordImpl(CVR, Record); \
82 #define MEMBER_RECORD(EnumName, EnumVal, Name) \
83 Error visitKnownMember(CVMemberRecord &CVMR, Name##Record &Record) \
85 return visitKnownMemberImpl(CVMR, Record); \
87 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
88 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
89 #include "llvm/DebugInfo/CodeView/TypeRecords.def"
92 template <typename T> Error visitKnownRecordImpl(CVType &CVR, T &Record) {
93 for (auto Visitor : Pipeline) {
94 if (auto EC = Visitor->visitKnownRecord(CVR, Record))
97 return Error::success();
100 template <typename T>
101 Error visitKnownMemberImpl(CVMemberRecord &CVMR, T &Record) {
102 for (auto Visitor : Pipeline) {
103 if (auto EC = Visitor->visitKnownMember(CVMR, Record))
106 return Error::success();
108 std::vector<TypeVisitorCallbacks *> Pipeline;
111 } // end namespace codeview
112 } // end namespace llvm
114 #endif // LLVM_DEBUGINFO_CODEVIEW_TYPEVISITORCALLBACKPIPELINE_H