24 using namespace llvm::codeview;
58 : DestStream(DestStream), FieldListBuilder(DestStream) {
63 #define TYPE_RECORD(EnumName, EnumVal, Name) \
64 Error visitKnownRecord(CVType &CVR, Name##Record &Record) override;
65 #define MEMBER_RECORD(EnumName, EnumVal, Name) \
66 Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override;
67 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
68 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
69 #include "llvm/DebugInfo/CodeView/TypeRecords.def"
80 template <
typename RecordType>
82 FoundBadTypeIndex |= !Record.remapTypeIndices(IndexMap);
90 if (
auto EC = Visitor.visitFieldListMemberStream(Record.
Data))
95 template <
typename RecordType>
96 Error visitKnownMemberRecordImpl(RecordType &Record) {
97 FoundBadTypeIndex |= !Record.remapTypeIndices(IndexMap);
98 FieldListBuilder.writeMemberType(Record);
102 bool hadError() {
return FoundBadTypeIndex; }
104 bool FoundBadTypeIndex =
false;
111 bool IsInFieldList{
false};
112 size_t BeginIndexMapSize = 0;
122 if (Rec.
Type == TypeLeafKind::LF_FIELDLIST) {
124 IsInFieldList =
true;
125 FieldListBuilder.begin();
127 BeginIndexMapSize = IndexMap.size();
132 if (Rec.
Type == TypeLeafKind::LF_FIELDLIST) {
133 TypeIndex Index = FieldListBuilder.end();
134 IndexMap.push_back(Index);
135 IsInFieldList =
false;
141 assert(IndexMap.size() == BeginIndexMapSize + 1);
145 #define TYPE_RECORD(EnumName, EnumVal, Name) \
146 Error TypeStreamMerger::visitKnownRecord(CVType &CVR, \
147 Name##Record &Record) { \
148 return visitKnownRecordImpl(Record); \
150 #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
151 #define MEMBER_RECORD(EnumName, EnumVal, Name) \
152 Error TypeStreamMerger::visitKnownMember(CVMemberRecord &CVR, \
153 Name##Record &Record) { \
154 return visitKnownMemberRecordImpl(Record); \
156 #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
157 #include "llvm/DebugInfo/CodeView/TypeRecords.def"
159 Error TypeStreamMerger::visitUnknownType(
CVType &Rec) {
166 bool TypeStreamMerger::mergeStream(
const CVTypeArray &Types) {
171 Pipeline.addCallbackToPipeline(Deserializer);
172 Pipeline.addCallbackToPipeline(*
this);
176 if (
auto EC = Visitor.visitTypeStream(Types)) {
186 return TypeStreamMerger(DestStream).mergeStream(Types);
TypeIndex writeKnownType(T &Record)
Allocate memory in an ever growing pool, as if by bump-pointer.
Greedy Register Allocator
void consumeError(Error Err)
Consume a Error without doing anything.
static ErrorSuccess success()
Create a success value.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
Lightweight error class with error context and mandatory checking.
bool mergeTypeStreams(TypeTableBuilder &DestStream, const CVTypeArray &Types)
Merges one type stream into another. Returns true on success.