diff options
author | Zachary Turner <zturner@google.com> | 2016-08-04 19:39:55 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2016-08-04 19:39:55 +0000 |
commit | 660230eba420afe66178bd8895a64327e290a3fc (patch) | |
tree | 88975a4090e6d5ebd91a85a2d5773323eeb3f9c7 /llvm/lib/DebugInfo/CodeView | |
parent | 7a0088bbae10f867a842b02d3e49047b3c350d35 (diff) | |
download | bcm5719-llvm-660230eba420afe66178bd8895a64327e290a3fc.tar.gz bcm5719-llvm-660230eba420afe66178bd8895a64327e290a3fc.zip |
[CodeView] Use llvm::Error instead of std::error_code.
This eliminates the remnants of std::error_code from the
DebugInfo libraries.
llvm-svn: 277758
Diffstat (limited to 'llvm/lib/DebugInfo/CodeView')
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp | 16 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/RecordSerialization.cpp | 87 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/TypeRecord.cpp | 126 |
3 files changed, 126 insertions, 103 deletions
diff --git a/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp b/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp index f1f9acf570d..a7b7f3a2793 100644 --- a/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp +++ b/llvm/lib/DebugInfo/CodeView/CVTypeVisitor.cpp @@ -45,10 +45,10 @@ Error CVTypeVisitor::visitTypeRecord(const CVRecord<TypeLeafKind> &Record) { #define TYPE_RECORD(EnumName, EnumVal, Name) \ case EnumName: { \ TypeRecordKind RK = static_cast<TypeRecordKind>(EnumName); \ - auto Result = Name##Record::deserialize(RK, LeafData); \ - if (Result.getError()) \ - return llvm::make_error<CodeViewError>(cv_error_code::corrupt_record); \ - if (auto EC = Callbacks.visit##Name(*Result)) \ + auto ExpectedRecord = Name##Record::deserialize(RK, LeafData); \ + if (!ExpectedRecord) \ + return ExpectedRecord.takeError(); \ + if (auto EC = Callbacks.visit##Name(*ExpectedRecord)) \ return EC; \ break; \ } @@ -106,10 +106,10 @@ Error CVTypeVisitor::visitFieldList(const CVRecord<TypeLeafKind> &Record) { #define MEMBER_RECORD(EnumName, EnumVal, Name) \ case EnumName: { \ TypeRecordKind RK = static_cast<TypeRecordKind>(EnumName); \ - auto Result = Name##Record::deserialize(RK, RecordData); \ - if (Result.getError()) \ - return llvm::make_error<CodeViewError>(cv_error_code::corrupt_record); \ - if (auto EC = Callbacks.visit##Name(*Result)) \ + auto ExpectedRecord = Name##Record::deserialize(RK, RecordData); \ + if (!ExpectedRecord) \ + return ExpectedRecord.takeError(); \ + if (auto EC = Callbacks.visit##Name(*ExpectedRecord)) \ return EC; \ break; \ } diff --git a/llvm/lib/DebugInfo/CodeView/RecordSerialization.cpp b/llvm/lib/DebugInfo/CodeView/RecordSerialization.cpp index ab9206a33ec..9386d29f223 100644 --- a/llvm/lib/DebugInfo/CodeView/RecordSerialization.cpp +++ b/llvm/lib/DebugInfo/CodeView/RecordSerialization.cpp @@ -14,6 +14,7 @@ #include "llvm/DebugInfo/CodeView/RecordSerialization.h" #include "llvm/ADT/APInt.h" #include "llvm/ADT/APSInt.h" +#include "llvm/DebugInfo/CodeView/CodeViewError.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" using namespace llvm; @@ -31,87 +32,104 @@ StringRef llvm::codeview::getBytesAsCString(ArrayRef<uint8_t> LeafData) { return getBytesAsCharacters(LeafData).split('\0').first; } -std::error_code llvm::codeview::consume(ArrayRef<uint8_t> &Data, APSInt &Num) { +Error llvm::codeview::consume(ArrayRef<uint8_t> &Data, APSInt &Num) { // Used to avoid overload ambiguity on APInt construtor. bool FalseVal = false; if (Data.size() < 2) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>( + cv_error_code::insufficient_buffer, + "Buffer does not contain enough data for an APSInt"); uint16_t Short = *reinterpret_cast<const ulittle16_t *>(Data.data()); Data = Data.drop_front(2); if (Short < LF_NUMERIC) { Num = APSInt(APInt(/*numBits=*/16, Short, /*isSigned=*/false), /*isUnsigned=*/true); - return std::error_code(); + return Error::success(); } switch (Short) { case LF_CHAR: if (Data.size() < 1) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>( + cv_error_code::insufficient_buffer, + "Buffer does not contain enough data for an LF_CHAR"); Num = APSInt(APInt(/*numBits=*/8, *reinterpret_cast<const int8_t *>(Data.data()), /*isSigned=*/true), /*isUnsigned=*/false); Data = Data.drop_front(1); - return std::error_code(); + return Error::success(); case LF_SHORT: if (Data.size() < 2) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>( + cv_error_code::insufficient_buffer, + "Buffer does not contain enough data for an LF_SHORT"); Num = APSInt(APInt(/*numBits=*/16, *reinterpret_cast<const little16_t *>(Data.data()), /*isSigned=*/true), /*isUnsigned=*/false); Data = Data.drop_front(2); - return std::error_code(); + return Error::success(); case LF_USHORT: if (Data.size() < 2) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>( + cv_error_code::insufficient_buffer, + "Buffer does not contain enough data for an LF_USHORT"); Num = APSInt(APInt(/*numBits=*/16, *reinterpret_cast<const ulittle16_t *>(Data.data()), /*isSigned=*/false), /*isUnsigned=*/true); Data = Data.drop_front(2); - return std::error_code(); + return Error::success(); case LF_LONG: if (Data.size() < 4) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>( + cv_error_code::insufficient_buffer, + "Buffer does not contain enough data for an LF_LONG"); Num = APSInt(APInt(/*numBits=*/32, *reinterpret_cast<const little32_t *>(Data.data()), /*isSigned=*/true), /*isUnsigned=*/false); Data = Data.drop_front(4); - return std::error_code(); + return Error::success(); case LF_ULONG: if (Data.size() < 4) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>( + cv_error_code::insufficient_buffer, + "Buffer does not contain enough data for an LF_ULONG"); Num = APSInt(APInt(/*numBits=*/32, *reinterpret_cast<const ulittle32_t *>(Data.data()), /*isSigned=*/FalseVal), /*isUnsigned=*/true); Data = Data.drop_front(4); - return std::error_code(); + return Error::success(); case LF_QUADWORD: if (Data.size() < 8) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>( + cv_error_code::insufficient_buffer, + "Buffer does not contain enough data for an LF_QUADWORD"); Num = APSInt(APInt(/*numBits=*/64, *reinterpret_cast<const little64_t *>(Data.data()), /*isSigned=*/true), /*isUnsigned=*/false); Data = Data.drop_front(8); - return std::error_code(); + return Error::success(); case LF_UQUADWORD: if (Data.size() < 8) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>( + cv_error_code::insufficient_buffer, + "Buffer does not contain enough data for an LF_UQUADWORD"); Num = APSInt(APInt(/*numBits=*/64, *reinterpret_cast<const ulittle64_t *>(Data.data()), /*isSigned=*/false), /*isUnsigned=*/true); Data = Data.drop_front(8); - return std::error_code(); + return Error::success(); } - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>(cv_error_code::corrupt_record, + "Buffer contains invalid APSInt type"); } -std::error_code llvm::codeview::consume(StringRef &Data, APSInt &Num) { +Error llvm::codeview::consume(StringRef &Data, APSInt &Num) { ArrayRef<uint8_t> Bytes(Data.bytes_begin(), Data.bytes_end()); auto EC = consume(Bytes, Num); Data = StringRef(reinterpret_cast<const char *>(Bytes.data()), Bytes.size()); @@ -119,53 +137,52 @@ std::error_code llvm::codeview::consume(StringRef &Data, APSInt &Num) { } /// Decode a numeric leaf value that is known to be a uint64_t. -std::error_code llvm::codeview::consume_numeric(ArrayRef<uint8_t> &Data, - uint64_t &Num) { +Error llvm::codeview::consume_numeric(ArrayRef<uint8_t> &Data, uint64_t &Num) { APSInt N; if (auto EC = consume(Data, N)) return EC; if (N.isSigned() || !N.isIntN(64)) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>(cv_error_code::corrupt_record, + "Data is not a numeric value!"); Num = N.getLimitedValue(); - return std::error_code(); + return Error::success(); } -std::error_code llvm::codeview::consume(ArrayRef<uint8_t> &Data, - uint32_t &Item) { +Error llvm::codeview::consume(ArrayRef<uint8_t> &Data, uint32_t &Item) { const support::ulittle32_t *IntPtr; if (auto EC = consumeObject(Data, IntPtr)) return EC; Item = *IntPtr; - return std::error_code(); + return Error::success(); } -std::error_code llvm::codeview::consume(StringRef &Data, uint32_t &Item) { +Error llvm::codeview::consume(StringRef &Data, uint32_t &Item) { ArrayRef<uint8_t> Bytes(Data.bytes_begin(), Data.bytes_end()); auto EC = consume(Bytes, Item); Data = StringRef(reinterpret_cast<const char *>(Bytes.data()), Bytes.size()); return EC; } -std::error_code llvm::codeview::consume(ArrayRef<uint8_t> &Data, - int32_t &Item) { +Error llvm::codeview::consume(ArrayRef<uint8_t> &Data, int32_t &Item) { const support::little32_t *IntPtr; if (auto EC = consumeObject(Data, IntPtr)) return EC; Item = *IntPtr; - return std::error_code(); + return Error::success(); } -std::error_code llvm::codeview::consume(ArrayRef<uint8_t> &Data, - StringRef &Item) { +Error llvm::codeview::consume(ArrayRef<uint8_t> &Data, StringRef &Item) { if (Data.empty()) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>(cv_error_code::corrupt_record, + "Null terminated string buffer is empty!"); StringRef Rest; std::tie(Item, Rest) = getBytesAsCharacters(Data).split('\0'); // We expect this to be null terminated. If it was not, it is an error. if (Data.size() == Item.size()) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>(cv_error_code::corrupt_record, + "Expected null terminator!"); Data = ArrayRef<uint8_t>(Rest.bytes_begin(), Rest.bytes_end()); - return std::error_code(); + return Error::success(); } diff --git a/llvm/lib/DebugInfo/CodeView/TypeRecord.cpp b/llvm/lib/DebugInfo/CodeView/TypeRecord.cpp index f63371e8c14..4bbd2616bb5 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeRecord.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeRecord.cpp @@ -18,11 +18,11 @@ using namespace llvm::codeview; // Type record deserialization //===----------------------------------------------------------------------===// -ErrorOr<MemberPointerInfo> +Expected<MemberPointerInfo> MemberPointerInfo::deserialize(ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; if (auto EC = consumeObject(Data, L)) - return EC; + return std::move(EC); TypeIndex T = L->ClassType; uint16_t R = L->Representation; @@ -31,11 +31,11 @@ MemberPointerInfo::deserialize(ArrayRef<uint8_t> &Data) { return MemberPointerInfo(T, PMR); } -ErrorOr<ModifierRecord> ModifierRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<ModifierRecord> ModifierRecord::deserialize(TypeRecordKind Kind, + ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; if (auto EC = consumeObject(Data, L)) - return EC; + return std::move(EC); TypeIndex M = L->ModifiedType; uint16_t O = L->Modifiers; @@ -43,16 +43,16 @@ ErrorOr<ModifierRecord> ModifierRecord::deserialize(TypeRecordKind Kind, return ModifierRecord(M, MO); } -ErrorOr<ProcedureRecord> ProcedureRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<ProcedureRecord> +ProcedureRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; if (auto EC = consumeObject(Data, L)) - return EC; + return std::move(EC); return ProcedureRecord(L->ReturnType, L->CallConv, L->Options, L->NumParameters, L->ArgListType); } -ErrorOr<MemberFunctionRecord> +Expected<MemberFunctionRecord> MemberFunctionRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; @@ -62,7 +62,7 @@ MemberFunctionRecord::deserialize(TypeRecordKind Kind, L->ArgListType, L->ThisAdjustment); } -ErrorOr<MemberFuncIdRecord> +Expected<MemberFuncIdRecord> MemberFuncIdRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; StringRef Name; @@ -70,10 +70,12 @@ MemberFuncIdRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { return MemberFuncIdRecord(L->ClassType, L->FunctionType, Name); } -ErrorOr<ArgListRecord> ArgListRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<ArgListRecord> ArgListRecord::deserialize(TypeRecordKind Kind, + ArrayRef<uint8_t> &Data) { if (Kind != TypeRecordKind::StringList && Kind != TypeRecordKind::ArgList) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>( + cv_error_code::corrupt_record, + "ArgListRecord contains unexpected TypeRecordKind"); const Layout *L = nullptr; ArrayRef<TypeIndex> Indices; @@ -81,11 +83,11 @@ ErrorOr<ArgListRecord> ArgListRecord::deserialize(TypeRecordKind Kind, return ArgListRecord(Kind, Indices); } -ErrorOr<PointerRecord> PointerRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<PointerRecord> PointerRecord::deserialize(TypeRecordKind Kind, + ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; if (auto EC = consumeObject(Data, L)) - return EC; + return std::move(EC); PointerKind PtrKind = L->getPtrKind(); PointerMode Mode = L->getPtrMode(); @@ -94,16 +96,17 @@ ErrorOr<PointerRecord> PointerRecord::deserialize(TypeRecordKind Kind, uint8_t Size = L->getPtrSize(); if (L->isPointerToMember()) { - auto E = MemberPointerInfo::deserialize(Data); - if (E.getError()) - return std::make_error_code(std::errc::illegal_byte_sequence); - return PointerRecord(L->PointeeType, PtrKind, Mode, Options, Size, *E); + if (auto ExpectedMPI = MemberPointerInfo::deserialize(Data)) + return PointerRecord(L->PointeeType, PtrKind, Mode, Options, Size, + *ExpectedMPI); + else + return ExpectedMPI.takeError(); } return PointerRecord(L->PointeeType, PtrKind, Mode, Options, Size); } -ErrorOr<NestedTypeRecord> +Expected<NestedTypeRecord> NestedTypeRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; StringRef Name; @@ -111,8 +114,8 @@ NestedTypeRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { return NestedTypeRecord(L->Type, Name); } -ErrorOr<ArrayRecord> ArrayRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<ArrayRecord> ArrayRecord::deserialize(TypeRecordKind Kind, + ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; uint64_t Size; StringRef Name; @@ -120,8 +123,8 @@ ErrorOr<ArrayRecord> ArrayRecord::deserialize(TypeRecordKind Kind, return ArrayRecord(L->ElementType, L->IndexType, Size, Name); } -ErrorOr<ClassRecord> ClassRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<ClassRecord> ClassRecord::deserialize(TypeRecordKind Kind, + ArrayRef<uint8_t> &Data) { uint64_t Size = 0; StringRef Name; StringRef UniqueName; @@ -142,8 +145,8 @@ ErrorOr<ClassRecord> ClassRecord::deserialize(TypeRecordKind Kind, L->DerivedFrom, L->VShape, Size, Name, UniqueName); } -ErrorOr<UnionRecord> UnionRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<UnionRecord> UnionRecord::deserialize(TypeRecordKind Kind, + ArrayRef<uint8_t> &Data) { uint64_t Size = 0; StringRef Name; StringRef UniqueName; @@ -162,8 +165,8 @@ ErrorOr<UnionRecord> UnionRecord::deserialize(TypeRecordKind Kind, UniqueName); } -ErrorOr<EnumRecord> EnumRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<EnumRecord> EnumRecord::deserialize(TypeRecordKind Kind, + ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; StringRef Name; StringRef UniqueName; @@ -176,24 +179,25 @@ ErrorOr<EnumRecord> EnumRecord::deserialize(TypeRecordKind Kind, UniqueName, L->UnderlyingType); } -ErrorOr<BitFieldRecord> BitFieldRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<BitFieldRecord> BitFieldRecord::deserialize(TypeRecordKind Kind, + ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; CV_DESERIALIZE(Data, L); return BitFieldRecord(L->Type, L->BitSize, L->BitOffset); } -ErrorOr<VFTableShapeRecord> +Expected<VFTableShapeRecord> VFTableShapeRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; if (auto EC = consumeObject(Data, L)) - return EC; + return std::move(EC); std::vector<VFTableSlotKind> Slots; uint16_t Count = L->VFEntryCount; while (Count > 0) { if (Data.empty()) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>(cv_error_code::corrupt_record, + "VTableShapeRecord contains no entries"); // Process up to 2 nibbles at a time (if there are at least 2 remaining) uint8_t Value = Data[0] & 0x0F; @@ -209,7 +213,7 @@ VFTableShapeRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { return VFTableShapeRecord(Slots); } -ErrorOr<TypeServer2Record> +Expected<TypeServer2Record> TypeServer2Record::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; StringRef Name; @@ -217,39 +221,39 @@ TypeServer2Record::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { return TypeServer2Record(StringRef(L->Guid, 16), L->Age, Name); } -ErrorOr<StringIdRecord> StringIdRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<StringIdRecord> StringIdRecord::deserialize(TypeRecordKind Kind, + ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; StringRef Name; CV_DESERIALIZE(Data, L, Name); return StringIdRecord(L->id, Name); } -ErrorOr<FuncIdRecord> FuncIdRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<FuncIdRecord> FuncIdRecord::deserialize(TypeRecordKind Kind, + ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; StringRef Name; CV_DESERIALIZE(Data, L, Name); return FuncIdRecord(L->ParentScope, L->FunctionType, Name); } -ErrorOr<UdtSourceLineRecord> +Expected<UdtSourceLineRecord> UdtSourceLineRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; CV_DESERIALIZE(Data, L); return UdtSourceLineRecord(L->UDT, L->SourceFile, L->LineNumber); } -ErrorOr<BuildInfoRecord> BuildInfoRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<BuildInfoRecord> +BuildInfoRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; ArrayRef<TypeIndex> Indices; CV_DESERIALIZE(Data, L, CV_ARRAY_FIELD_N(Indices, L->NumArgs)); return BuildInfoRecord(Indices); } -ErrorOr<VFTableRecord> VFTableRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<VFTableRecord> VFTableRecord::deserialize(TypeRecordKind Kind, + ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; StringRef Name; std::vector<StringRef> Names; @@ -258,8 +262,8 @@ ErrorOr<VFTableRecord> VFTableRecord::deserialize(TypeRecordKind Kind, Name, Names); } -ErrorOr<OneMethodRecord> OneMethodRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<OneMethodRecord> +OneMethodRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; StringRef Name; int32_t VFTableOffset = -1; @@ -275,11 +279,12 @@ ErrorOr<OneMethodRecord> OneMethodRecord::deserialize(TypeRecordKind Kind, Name); // Validate the vftable offset. if (Method.isIntroducingVirtual() && Method.getVFTableOffset() < 0) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>(cv_error_code::corrupt_record, + "Invalid VFTableOffset"); return Method; } -ErrorOr<MethodOverloadListRecord> +Expected<MethodOverloadListRecord> MethodOverloadListRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { std::vector<OneMethodRecord> Methods; @@ -299,12 +304,13 @@ MethodOverloadListRecord::deserialize(TypeRecordKind Kind, // Validate the vftable offset. auto &Method = Methods.back(); if (Method.isIntroducingVirtual() && Method.getVFTableOffset() < 0) - return std::make_error_code(std::errc::illegal_byte_sequence); + return make_error<CodeViewError>(cv_error_code::corrupt_record, + "Invalid VFTableOffset"); } return MethodOverloadListRecord(Methods); } -ErrorOr<OverloadedMethodRecord> +Expected<OverloadedMethodRecord> OverloadedMethodRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; @@ -313,7 +319,7 @@ OverloadedMethodRecord::deserialize(TypeRecordKind Kind, return OverloadedMethodRecord(L->MethodCount, L->MethList, Name); } -ErrorOr<DataMemberRecord> +Expected<DataMemberRecord> DataMemberRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; uint64_t Offset; @@ -322,7 +328,7 @@ DataMemberRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { return DataMemberRecord(L->Attrs.getAccess(), L->Type, Offset, Name); } -ErrorOr<StaticDataMemberRecord> +Expected<StaticDataMemberRecord> StaticDataMemberRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; @@ -331,7 +337,7 @@ StaticDataMemberRecord::deserialize(TypeRecordKind Kind, return StaticDataMemberRecord(L->Attrs.getAccess(), L->Type, Name); } -ErrorOr<EnumeratorRecord> +Expected<EnumeratorRecord> EnumeratorRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; APSInt Value; @@ -340,23 +346,23 @@ EnumeratorRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { return EnumeratorRecord(L->Attrs.getAccess(), Value, Name); } -ErrorOr<VFPtrRecord> VFPtrRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<VFPtrRecord> VFPtrRecord::deserialize(TypeRecordKind Kind, + ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; if (auto EC = consumeObject(Data, L)) - return EC; + return std::move(EC); return VFPtrRecord(L->Type); } -ErrorOr<BaseClassRecord> BaseClassRecord::deserialize(TypeRecordKind Kind, - ArrayRef<uint8_t> &Data) { +Expected<BaseClassRecord> +BaseClassRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; uint64_t Offset; CV_DESERIALIZE(Data, L, CV_NUMERIC_FIELD(Offset)); return BaseClassRecord(L->Attrs.getAccess(), L->BaseType, Offset); } -ErrorOr<VirtualBaseClassRecord> +Expected<VirtualBaseClassRecord> VirtualBaseClassRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; @@ -367,7 +373,7 @@ VirtualBaseClassRecord::deserialize(TypeRecordKind Kind, Offset, Index); } -ErrorOr<ListContinuationRecord> +Expected<ListContinuationRecord> ListContinuationRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) { const Layout *L = nullptr; |