diff options
| author | Zachary Turner <zturner@google.com> | 2016-09-09 18:03:39 +0000 |
|---|---|---|
| committer | Zachary Turner <zturner@google.com> | 2016-09-09 18:03:39 +0000 |
| commit | 9ba31a5efe21d13030a889113d4e062b9ddf2eef (patch) | |
| tree | fbd28f9d9e15e455d1cdcd25ecb62538edd43715 /llvm/lib/DebugInfo | |
| parent | 00ef27112e267b5fb912b30010f11719fbbe74cc (diff) | |
| download | bcm5719-llvm-9ba31a5efe21d13030a889113d4e062b9ddf2eef.tar.gz bcm5719-llvm-9ba31a5efe21d13030a889113d4e062b9ddf2eef.zip | |
[pdb] Pass CVRecord's through the visitor as non-const references.
This simplifies a lot of code, and will actually be necessary for
an upcoming patch to serialize TPI record hash values.
The idea before was that visitors should be examining records, not
modifying them. But this is no longer true with a visitor that
constructs a CVRecord from Yaml. To handle this until now, we
were doing some fixups on CVRecord objects at a higher level, but
the code is really awkward, and it makes sense to just have the
visitor write the bytes into the CVRecord. In doing so I uncovered
a few bugs related to `Data` and `RawData` and fixed those.
Reviewed By: rnk
Differential Revision: https://reviews.llvm.org/D24362
llvm-svn: 281067
Diffstat (limited to 'llvm/lib/DebugInfo')
| -rw-r--r-- | llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp | 51 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/CodeView/TypeDumper.cpp | 76 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp | 24 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp | 15 |
5 files changed, 85 insertions, 85 deletions
diff --git a/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp b/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp index f14a49c6ca2..cdcc837387f 100644 --- a/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp +++ b/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp @@ -65,7 +65,7 @@ CVTypeVisitor::CVTypeVisitor(TypeVisitorCallbacks &Callbacks) : Callbacks(Callbacks) {} template <typename T> -static Error visitKnownRecord(const CVRecord<TypeLeafKind> &Record, +static Error visitKnownRecord(CVRecord<TypeLeafKind> &Record, TypeVisitorCallbacks &Callbacks) { TypeRecordKind RK = static_cast<TypeRecordKind>(Record.Type); T KnownRecord(RK); @@ -74,24 +74,18 @@ static Error visitKnownRecord(const CVRecord<TypeLeafKind> &Record, return Error::success(); } -Error CVTypeVisitor::visitTypeRecord(const CVRecord<TypeLeafKind> &Record) { - TypeLeafKind Kind; - if (auto ExpectedKind = Callbacks.visitTypeBegin(Record)) - Kind = *ExpectedKind; - else - return ExpectedKind.takeError(); - - CVType RecordCopy = Record; - RecordCopy.Type = Kind; +Error CVTypeVisitor::visitTypeRecord(CVRecord<TypeLeafKind> &Record) { + if (auto EC = Callbacks.visitTypeBegin(Record)) + return EC; - switch (Kind) { + switch (Record.Type) { default: - if (auto EC = Callbacks.visitUnknownType(RecordCopy)) + if (auto EC = Callbacks.visitUnknownType(Record)) return EC; break; #define TYPE_RECORD(EnumName, EnumVal, Name) \ case EnumName: { \ - if (auto EC = visitKnownRecord<Name##Record>(RecordCopy, Callbacks)) \ + if (auto EC = visitKnownRecord<Name##Record>(Record, Callbacks)) \ return EC; \ break; \ } @@ -104,7 +98,7 @@ Error CVTypeVisitor::visitTypeRecord(const CVRecord<TypeLeafKind> &Record) { #include "llvm/DebugInfo/CodeView/TypeRecords.def" } - if (auto EC = Callbacks.visitTypeEnd(RecordCopy)) + if (auto EC = Callbacks.visitTypeEnd(Record)) return EC; return Error::success(); @@ -112,13 +106,29 @@ Error CVTypeVisitor::visitTypeRecord(const CVRecord<TypeLeafKind> &Record) { /// Visits the type records in Data. Sets the error flag on parse failures. Error CVTypeVisitor::visitTypeStream(const CVTypeArray &Types) { - for (const auto &I : Types) { + for (auto I : Types) { if (auto EC = visitTypeRecord(I)) return EC; } return Error::success(); } +template <typename MR> +static Error visitKnownMember(ArrayRef<uint8_t> &Data, TypeLeafKind Leaf, + TypeVisitorCallbacks &Callbacks) { + auto ExpectedRecord = deserializeMemberRecord<MR>(Data, Leaf); + if (!ExpectedRecord) + return ExpectedRecord.takeError(); + CVType &Record = *ExpectedRecord; + if (auto EC = Callbacks.visitTypeBegin(Record)) + return EC; + if (auto EC = visitKnownRecord<MR>(Record, Callbacks)) + return EC; + if (auto EC = Callbacks.visitTypeEnd(Record)) + return EC; + return Error::success(); +} + Error CVTypeVisitor::visitFieldListMemberStream(ArrayRef<uint8_t> Data) { while (!Data.empty()) { const support::ulittle16_t *LeafValue; @@ -135,16 +145,7 @@ Error CVTypeVisitor::visitFieldListMemberStream(ArrayRef<uint8_t> Data) { cv_error_code::unknown_member_record); #define MEMBER_RECORD(EnumName, EnumVal, Name) \ case EnumName: { \ - auto ExpectedRecord = deserializeMemberRecord<Name##Record>(Data, Leaf); \ - if (!ExpectedRecord) \ - return ExpectedRecord.takeError(); \ - auto &Record = *ExpectedRecord; \ - auto ExpectedKind = Callbacks.visitTypeBegin(Record); \ - if (!ExpectedKind || *ExpectedKind != Leaf) \ - return ExpectedKind.takeError(); \ - if (auto EC = visitKnownRecord<Name##Record>(Record, Callbacks)) \ - return EC; \ - if (auto EC = Callbacks.visitTypeEnd(Record)) \ + if (auto EC = visitKnownMember<Name##Record>(Data, Leaf, Callbacks)) \ return EC; \ break; \ } diff --git a/llvm/lib/DebugInfo/CodeView/TypeDumper.cpp b/llvm/lib/DebugInfo/CodeView/TypeDumper.cpp index 43e29b7f451..db805c532a8 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeDumper.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeDumper.cpp @@ -203,8 +203,7 @@ static StringRef getLeafTypeName(TypeLeafKind LT) { return "UnknownLeaf"; } -Expected<TypeLeafKind> -CVTypeDumper::visitTypeBegin(const CVRecord<TypeLeafKind> &Record) { +Error CVTypeDumper::visitTypeBegin(CVRecord<TypeLeafKind> &Record) { // Reset Name to the empty string. If the visitor sets it, we know it. Name = ""; @@ -224,10 +223,10 @@ CVTypeDumper::visitTypeBegin(const CVRecord<TypeLeafKind> &Record) { assert(!IsInFieldList); IsInFieldList = true; } - return Record.Type; + return Error::success(); } -Error CVTypeDumper::visitTypeEnd(const CVRecord<TypeLeafKind> &Record) { +Error CVTypeDumper::visitTypeEnd(CVRecord<TypeLeafKind> &Record) { if (Record.Type == LF_FIELDLIST) { assert(IsInFieldList); IsInFieldList = false; @@ -249,7 +248,7 @@ Error CVTypeDumper::visitTypeEnd(const CVRecord<TypeLeafKind> &Record) { return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, FieldListRecord &FieldList) { TypeDeserializer Deserializer; TypeVisitorCallbackPipeline Pipeline; @@ -264,7 +263,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, StringIdRecord &String) { printTypeIndex("Id", String.getId()); W->printString("StringData", String.getString()); @@ -273,7 +272,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, ArgListRecord &Args) { auto Indices = Args.getIndices(); uint32_t Size = Indices.size(); @@ -292,7 +291,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, ClassRecord &Class) { uint16_t Props = static_cast<uint16_t>(Class.getOptions()); W->printNumber("MemberCount", Class.getMemberCount()); @@ -308,7 +307,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, UnionRecord &Union) { uint16_t Props = static_cast<uint16_t>(Union.getOptions()); W->printNumber("MemberCount", Union.getMemberCount()); @@ -322,7 +321,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, EnumRecord &Enum) { uint16_t Props = static_cast<uint16_t>(Enum.getOptions()); W->printNumber("NumEnumerators", Enum.getMemberCount()); @@ -337,7 +336,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, ArrayRecord &AT) { printTypeIndex("ElementType", AT.getElementType()); printTypeIndex("IndexType", AT.getIndexType()); @@ -347,7 +346,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, VFTableRecord &VFT) { printTypeIndex("CompleteClass", VFT.getCompleteClass()); printTypeIndex("OverriddenVFTable", VFT.getOverriddenVTable()); @@ -359,7 +358,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, MemberFuncIdRecord &Id) { printTypeIndex("ClassType", Id.getClassType()); printTypeIndex("FunctionType", Id.getFunctionType()); @@ -368,7 +367,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, ProcedureRecord &Proc) { printTypeIndex("ReturnType", Proc.getReturnType()); W->printEnum("CallingConvention", uint8_t(Proc.getCallConv()), @@ -387,7 +386,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, MemberFunctionRecord &MF) { printTypeIndex("ReturnType", MF.getReturnType()); printTypeIndex("ClassType", MF.getClassType()); @@ -412,7 +411,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, MethodOverloadListRecord &MethodList) { for (auto &M : MethodList.getMethods()) { ListScope S(*W, "Method"); @@ -424,7 +423,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, FuncIdRecord &Func) { printTypeIndex("ParentScope", Func.getParentScope()); printTypeIndex("FunctionType", Func.getFunctionType()); @@ -433,7 +432,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, TypeServer2Record &TS) { W->printBinary("Signature", TS.getGuid()); W->printNumber("Age", TS.getAge()); @@ -442,7 +441,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, PointerRecord &Ptr) { printTypeIndex("PointeeType", Ptr.getReferentType()); W->printHex("PointerAttributes", uint32_t(Ptr.getOptions())); @@ -494,7 +493,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, ModifierRecord &Mod) { uint16_t Mods = static_cast<uint16_t>(Mod.getModifiers()); printTypeIndex("ModifiedType", Mod.getModifiedType()); @@ -513,7 +512,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, BitFieldRecord &BitField) { printTypeIndex("Type", BitField.getType()); W->printNumber("BitSize", BitField.getBitSize()); @@ -521,14 +520,14 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, VFTableShapeRecord &Shape) { W->printNumber("VFEntryCount", Shape.getEntryCount()); Name = saveName("<vftable " + utostr(Shape.getEntryCount()) + " methods>"); return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, UdtSourceLineRecord &Line) { printTypeIndex("UDT", Line.getUDT()); printTypeIndex("SourceFile", Line.getSourceFile()); @@ -536,7 +535,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, UdtModSourceLineRecord &Line) { printTypeIndex("UDT", Line.getUDT()); printTypeIndex("SourceFile", Line.getSourceFile()); @@ -545,7 +544,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, BuildInfoRecord &Args) { W->printNumber("NumArgs", static_cast<uint32_t>(Args.getArgs().size())); @@ -574,18 +573,18 @@ void CVTypeDumper::printMemberAttributes(MemberAccess Access, MethodKind Kind, } } -Error CVTypeDumper::visitUnknownMember(const CVRecord<TypeLeafKind> &Record) { +Error CVTypeDumper::visitUnknownMember(CVRecord<TypeLeafKind> &Record) { W->printHex("UnknownMember", unsigned(Record.Type)); return Error::success(); } -Error CVTypeDumper::visitUnknownType(const CVRecord<TypeLeafKind> &Record) { +Error CVTypeDumper::visitUnknownType(CVRecord<TypeLeafKind> &Record) { W->printEnum("Kind", uint16_t(Record.Type), makeArrayRef(LeafTypeNames)); W->printNumber("Length", uint32_t(Record.Data.size())); return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, NestedTypeRecord &Nested) { printTypeIndex("Type", Nested.getNestedType()); W->printString("Name", Nested.getName()); @@ -593,7 +592,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, OneMethodRecord &Method) { MethodKind K = Method.getKind(); printMemberAttributes(Method.getAccess(), K, Method.getOptions()); @@ -606,7 +605,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, OverloadedMethodRecord &Method) { W->printHex("MethodCount", Method.getNumOverloads()); printTypeIndex("MethodListIndex", Method.getMethodList()); @@ -615,7 +614,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, DataMemberRecord &Field) { printMemberAttributes(Field.getAccess(), MethodKind::Vanilla, MethodOptions::None); @@ -626,7 +625,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, StaticDataMemberRecord &Field) { printMemberAttributes(Field.getAccess(), MethodKind::Vanilla, MethodOptions::None); @@ -636,13 +635,13 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, VFPtrRecord &VFTable) { printTypeIndex("Type", VFTable.getType()); return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, EnumeratorRecord &Enum) { printMemberAttributes(Enum.getAccess(), MethodKind::Vanilla, MethodOptions::None); @@ -652,7 +651,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, BaseClassRecord &Base) { printMemberAttributes(Base.getAccess(), MethodKind::Vanilla, MethodOptions::None); @@ -661,7 +660,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, VirtualBaseClassRecord &Base) { printMemberAttributes(Base.getAccess(), MethodKind::Vanilla, MethodOptions::None); @@ -672,7 +671,7 @@ Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, return Error::success(); } -Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, +Error CVTypeDumper::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, ListContinuationRecord &Cont) { printTypeIndex("ContinuationIndex", Cont.getContinuationIndex()); return Error::success(); @@ -724,7 +723,8 @@ Error CVTypeDumper::dump(const CVRecord<TypeLeafKind> &Record) { CVTypeVisitor Visitor(Pipeline); - if (auto EC = Visitor.visitTypeRecord(Record)) + CVRecord<TypeLeafKind> RecordCopy = Record; + if (auto EC = Visitor.visitTypeRecord(RecordCopy)) return EC; return Error::success(); } diff --git a/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp b/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp index f2a7298a8d1..096fd38d934 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp @@ -60,19 +60,18 @@ public: /// TypeVisitorCallbacks overrides. #define TYPE_RECORD(EnumName, EnumVal, Name) \ - Error visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, \ - Name##Record &Record) override; + Error visitKnownRecord(CVRecord<TypeLeafKind> &CVR, Name##Record &Record) \ + override; #define MEMBER_RECORD(EnumName, EnumVal, Name) \ TYPE_RECORD(EnumName, EnumVal, Name) #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) #include "llvm/DebugInfo/CodeView/TypeRecords.def" - Error visitUnknownType(const CVRecord<TypeLeafKind> &Record) override; + Error visitUnknownType(CVRecord<TypeLeafKind> &Record) override; - Expected<TypeLeafKind> - visitTypeBegin(const CVRecord<TypeLeafKind> &Record) override; - Error visitTypeEnd(const CVRecord<TypeLeafKind> &Record) override; + Error visitTypeBegin(CVRecord<TypeLeafKind> &Record) override; + Error visitTypeEnd(CVRecord<TypeLeafKind> &Record) override; bool mergeStream(const CVTypeArray &Types); @@ -124,17 +123,16 @@ private: } // end anonymous namespace -Expected<TypeLeafKind> -TypeStreamMerger::visitTypeBegin(const CVRecord<TypeLeafKind> &Rec) { +Error TypeStreamMerger::visitTypeBegin(CVRecord<TypeLeafKind> &Rec) { if (Rec.Type == TypeLeafKind::LF_FIELDLIST) { assert(!IsInFieldList); IsInFieldList = true; } else BeginIndexMapSize = IndexMap.size(); - return Rec.Type; + return Error::success(); } -Error TypeStreamMerger::visitTypeEnd(const CVRecord<TypeLeafKind> &Rec) { +Error TypeStreamMerger::visitTypeEnd(CVRecord<TypeLeafKind> &Rec) { if (Rec.Type == TypeLeafKind::LF_FIELDLIST) { IndexMap.push_back(DestStream.writeFieldList(FieldBuilder)); FieldBuilder.reset(); @@ -146,20 +144,20 @@ Error TypeStreamMerger::visitTypeEnd(const CVRecord<TypeLeafKind> &Rec) { } #define TYPE_RECORD(EnumName, EnumVal, Name) \ - Error TypeStreamMerger::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, \ + Error TypeStreamMerger::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, \ Name##Record &Record) { \ return visitKnownRecordImpl(Record); \ } #define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) #define MEMBER_RECORD(EnumName, EnumVal, Name) \ - Error TypeStreamMerger::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, \ + Error TypeStreamMerger::visitKnownRecord(CVRecord<TypeLeafKind> &CVR, \ Name##Record &Record) { \ return visitKnownMemberRecordImpl(Record); \ } #define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) #include "llvm/DebugInfo/CodeView/TypeRecords.def" -Error TypeStreamMerger::visitUnknownType(const CVRecord<TypeLeafKind> &Rec) { +Error TypeStreamMerger::visitUnknownType(CVRecord<TypeLeafKind> &Rec) { // We failed to translate a type. Translate this index as "not translated". IndexMap.push_back( TypeIndex(SimpleTypeKind::NotTranslated, SimpleTypeMode::Direct)); diff --git a/llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp b/llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp index 45b9b3fe2da..03f8b1d218b 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeTableBuilder.cpp @@ -263,7 +263,9 @@ TypeIndex TypeTableBuilder::writeRecord(TypeRecordBuilder &Builder) { } TypeIndex TypeTableBuilder::writeFieldList(FieldListRecordBuilder &FieldList) { - return FieldList.writeListRecord(*this); + TypeIndex I = FieldList.writeListRecord(*this); + RecordKinds.push_back(TypeRecordKind::FieldList); + return I; } TypeIndex diff --git a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp index ce645eb592e..5560643c864 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp @@ -69,34 +69,33 @@ public: uint32_t NumHashBuckets) : HashValues(HashValues), NumHashBuckets(NumHashBuckets) {} - Error visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, + Error visitKnownRecord(CVRecord<TypeLeafKind> &CVR, UdtSourceLineRecord &Rec) override { return verifySourceLine(Rec); } - Error visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, + Error visitKnownRecord(CVRecord<TypeLeafKind> &CVR, UdtModSourceLineRecord &Rec) override { return verifySourceLine(Rec); } - Error visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, + Error visitKnownRecord(CVRecord<TypeLeafKind> &CVR, ClassRecord &Rec) override { return verify(Rec); } - Error visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, + Error visitKnownRecord(CVRecord<TypeLeafKind> &CVR, EnumRecord &Rec) override { return verify(Rec); } - Error visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, + Error visitKnownRecord(CVRecord<TypeLeafKind> &CVR, UnionRecord &Rec) override { return verify(Rec); } - Expected<TypeLeafKind> - visitTypeBegin(const CVRecord<TypeLeafKind> &Rec) override { + Error visitTypeBegin(CVRecord<TypeLeafKind> &Rec) override { ++Index; RawRecord = Rec; - return Rec.Type; + return Error::success(); } private: |

