LLVM  10.0.0svn
TypeVisitorCallbackPipeline.h
Go to the documentation of this file.
1 //===- TypeVisitorCallbackPipeline.h ----------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_DEBUGINFO_CODEVIEW_TYPEVISITORCALLBACKPIPELINE_H
10 #define LLVM_DEBUGINFO_CODEVIEW_TYPEVISITORCALLBACKPIPELINE_H
11 
15 #include "llvm/Support/Error.h"
16 #include <vector>
17 
18 namespace llvm {
19 namespace codeview {
20 
22 public:
23  TypeVisitorCallbackPipeline() = default;
24 
26  for (auto Visitor : Pipeline) {
27  if (auto EC = Visitor->visitUnknownType(Record))
28  return EC;
29  }
30  return Error::success();
31  }
32 
34  for (auto Visitor : Pipeline) {
35  if (auto EC = Visitor->visitUnknownMember(Record))
36  return EC;
37  }
38  return Error::success();
39  }
40 
42  for (auto Visitor : Pipeline) {
43  if (auto EC = Visitor->visitTypeBegin(Record))
44  return EC;
45  }
46  return Error::success();
47  }
48 
50  for (auto Visitor : Pipeline) {
51  if (auto EC = Visitor->visitTypeBegin(Record, Index))
52  return EC;
53  }
54  return Error::success();
55  }
56 
58  for (auto Visitor : Pipeline) {
59  if (auto EC = Visitor->visitTypeEnd(Record))
60  return EC;
61  }
62  return Error::success();
63  }
64 
66  for (auto Visitor : Pipeline) {
67  if (auto EC = Visitor->visitMemberBegin(Record))
68  return EC;
69  }
70  return Error::success();
71  }
72 
74  for (auto Visitor : Pipeline) {
75  if (auto EC = Visitor->visitMemberEnd(Record))
76  return EC;
77  }
78  return Error::success();
79  }
80 
82  Pipeline.push_back(&Callbacks);
83  }
84 
85 #define TYPE_RECORD(EnumName, EnumVal, Name) \
86  Error visitKnownRecord(CVType &CVR, Name##Record &Record) override { \
87  return visitKnownRecordImpl(CVR, Record); \
88  }
89 #define MEMBER_RECORD(EnumName, EnumVal, Name) \
90  Error visitKnownMember(CVMemberRecord &CVMR, Name##Record &Record) \
91  override { \
92  return visitKnownMemberImpl(CVMR, Record); \
93  }
94 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
95 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
96 #include "llvm/DebugInfo/CodeView/CodeViewTypes.def"
97 
98 private:
99  template <typename T> Error visitKnownRecordImpl(CVType &CVR, T &Record) {
100  for (auto Visitor : Pipeline) {
101  if (auto EC = Visitor->visitKnownRecord(CVR, Record))
102  return EC;
103  }
104  return Error::success();
105  }
106 
107  template <typename T>
108  Error visitKnownMemberImpl(CVMemberRecord &CVMR, T &Record) {
109  for (auto Visitor : Pipeline) {
110  if (auto EC = Visitor->visitKnownMember(CVMR, Record))
111  return EC;
112  }
113  return Error::success();
114  }
115  std::vector<TypeVisitorCallbacks *> Pipeline;
116 };
117 
118 } // end namespace codeview
119 } // end namespace llvm
120 
121 #endif // LLVM_DEBUGINFO_CODEVIEW_TYPEVISITORCALLBACKPIPELINE_H
This class represents lattice values for constants.
Definition: AllocatorList.h:23
CVRecord< TypeLeafKind > CVType
Definition: TypeRecord.h:35
Error visitUnknownMember(CVMemberRecord &Record) override
A 32-bit type reference.
Definition: TypeIndex.h:95
Error visitTypeBegin(CVType &Record) override
Paired begin/end actions for all types.
Error visitMemberBegin(CVMemberRecord &Record) override
static ErrorSuccess success()
Create a success value.
Definition: Error.h:326
Error visitTypeBegin(CVType &Record, TypeIndex Index) override
Lightweight error class with error context and mandatory checking.
Definition: Error.h:157
Error visitMemberEnd(CVMemberRecord &Record) override
void addCallbackToPipeline(TypeVisitorCallbacks &Callbacks)
Error visitUnknownType(CVRecord< TypeLeafKind > &Record) override