1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===-- TypeRecord.cpp ------------------------------------------*- C++ -*-===//
2de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
3de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
4de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
5de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
6de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// License. See LICENSE.TXT for details.
7de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
8de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/TypeRecord.h"
11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/TypeIndex.h"
12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/DebugInfo/CodeView/RecordSerialization.h"
13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing namespace llvm;
15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing namespace llvm::codeview;
16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Type record deserialization
19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<MemberPointerInfo>
22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarMemberPointerInfo::deserialize(ArrayRef<uint8_t> &Data) {
23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (auto EC = consumeObject(Data, L))
25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return EC;
26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  TypeIndex T = L->ClassType;
28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint16_t R = L->Representation;
29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PointerToMemberRepresentation PMR =
30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      static_cast<PointerToMemberRepresentation>(R);
31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return MemberPointerInfo(T, PMR);
32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<ModifierRecord> ModifierRecord::deserialize(TypeRecordKind Kind,
35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                    ArrayRef<uint8_t> &Data) {
36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (auto EC = consumeObject(Data, L))
38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return EC;
39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  TypeIndex M = L->ModifiedType;
41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint16_t O = L->Modifiers;
42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ModifierOptions MO = static_cast<ModifierOptions>(O);
43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return ModifierRecord(M, MO);
44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<ProcedureRecord> ProcedureRecord::deserialize(TypeRecordKind Kind,
47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                      ArrayRef<uint8_t> &Data) {
48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (auto EC = consumeObject(Data, L))
50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return EC;
51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return ProcedureRecord(L->ReturnType, L->CallConv, L->Options,
52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                         L->NumParameters, L->ArgListType);
53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<MemberFunctionRecord>
56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarMemberFunctionRecord::deserialize(TypeRecordKind Kind,
57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                  ArrayRef<uint8_t> &Data) {
58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L);
60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return MemberFunctionRecord(L->ReturnType, L->ClassType, L->ThisType,
61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                              L->CallConv, L->Options, L->NumParameters,
62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                              L->ArgListType, L->ThisAdjustment);
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<MemberFuncIdRecord>
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarMemberFuncIdRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) {
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, Name);
70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return MemberFuncIdRecord(L->ClassType, L->FunctionType, Name);
71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<ArgListRecord> ArgListRecord::deserialize(TypeRecordKind Kind,
74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                  ArrayRef<uint8_t> &Data) {
75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Kind != TypeRecordKind::StringList && Kind != TypeRecordKind::ArgList)
76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return std::make_error_code(std::errc::illegal_byte_sequence);
77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<TypeIndex> Indices;
80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, CV_ARRAY_FIELD_N(Indices, L->NumArgs));
81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return ArgListRecord(Kind, Indices);
82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<PointerRecord> PointerRecord::deserialize(TypeRecordKind Kind,
85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                  ArrayRef<uint8_t> &Data) {
86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (auto EC = consumeObject(Data, L))
88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return EC;
89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PointerKind PtrKind = L->getPtrKind();
91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PointerMode Mode = L->getPtrMode();
92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint32_t Opts = L->Attrs;
93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  PointerOptions Options = static_cast<PointerOptions>(Opts);
94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint8_t Size = L->getPtrSize();
95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (L->isPointerToMember()) {
97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    auto E = MemberPointerInfo::deserialize(Data);
98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (E.getError())
99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return std::make_error_code(std::errc::illegal_byte_sequence);
100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return PointerRecord(L->PointeeType, PtrKind, Mode, Options, Size, *E);
101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return PointerRecord(L->PointeeType, PtrKind, Mode, Options, Size);
104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<NestedTypeRecord>
107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarNestedTypeRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) {
108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, Name);
111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return NestedTypeRecord(L->Type, Name);
112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<ArrayRecord> ArrayRecord::deserialize(TypeRecordKind Kind,
115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                              ArrayRef<uint8_t> &Data) {
116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t Size;
118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, CV_NUMERIC_FIELD(Size), Name);
120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return ArrayRecord(L->ElementType, L->IndexType, Size, Name);
121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<ClassRecord> ClassRecord::deserialize(TypeRecordKind Kind,
124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                              ArrayRef<uint8_t> &Data) {
125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t Size = 0;
126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef UniqueName;
128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint16_t Props;
129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, CV_NUMERIC_FIELD(Size), Name,
132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                 CV_CONDITIONAL_FIELD(UniqueName, L->hasUniqueName()));
133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Props = L->Properties;
135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint16_t WrtValue = (Props & WinRTKindMask) >> WinRTKindShift;
136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  WindowsRTClassKind WRT = static_cast<WindowsRTClassKind>(WrtValue);
137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint16_t HfaMask = (Props & HfaKindMask) >> HfaKindShift;
138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  HfaKind Hfa = static_cast<HfaKind>(HfaMask);
139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ClassOptions Options = static_cast<ClassOptions>(Props);
141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return ClassRecord(Kind, L->MemberCount, Options, Hfa, WRT, L->FieldList,
142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     L->DerivedFrom, L->VShape, Size, Name, UniqueName);
143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<UnionRecord> UnionRecord::deserialize(TypeRecordKind Kind,
146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                              ArrayRef<uint8_t> &Data) {
147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t Size = 0;
148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef UniqueName;
150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint16_t Props;
151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, CV_NUMERIC_FIELD(Size), Name,
154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                 CV_CONDITIONAL_FIELD(UniqueName, L->hasUniqueName()));
155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Props = L->Properties;
157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint16_t HfaMask = (Props & HfaKindMask) >> HfaKindShift;
159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  HfaKind Hfa = static_cast<HfaKind>(HfaMask);
160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ClassOptions Options = static_cast<ClassOptions>(Props);
161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return UnionRecord(L->MemberCount, Options, Hfa, L->FieldList, Size, Name,
162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                     UniqueName);
163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<EnumRecord> EnumRecord::deserialize(TypeRecordKind Kind,
166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                            ArrayRef<uint8_t> &Data) {
167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef UniqueName;
170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, Name,
171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                 CV_CONDITIONAL_FIELD(UniqueName, L->hasUniqueName()));
172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint16_t P = L->Properties;
174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ClassOptions Options = static_cast<ClassOptions>(P);
175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return EnumRecord(L->NumEnumerators, Options, L->FieldListType, Name,
176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                    UniqueName, L->UnderlyingType);
177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<BitFieldRecord> BitFieldRecord::deserialize(TypeRecordKind Kind,
180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                    ArrayRef<uint8_t> &Data) {
181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L);
183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return BitFieldRecord(L->Type, L->BitSize, L->BitOffset);
184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<VFTableShapeRecord>
187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarVFTableShapeRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) {
188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (auto EC = consumeObject(Data, L))
190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return EC;
191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<VFTableSlotKind> Slots;
193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint16_t Count = L->VFEntryCount;
194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  while (Count > 0) {
195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Data.empty())
196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return std::make_error_code(std::errc::illegal_byte_sequence);
197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Process up to 2 nibbles at a time (if there are at least 2 remaining)
199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    uint8_t Value = Data[0] & 0x0F;
200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Slots.push_back(static_cast<VFTableSlotKind>(Value));
201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (--Count > 0) {
202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Value = (Data[0] & 0xF0) >> 4;
203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Slots.push_back(static_cast<VFTableSlotKind>(Value));
204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      --Count;
205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    }
206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Data = Data.slice(1);
207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return VFTableShapeRecord(Slots);
210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<TypeServer2Record>
213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarTypeServer2Record::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) {
214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
215de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
216de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, Name);
217de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return TypeServer2Record(StringRef(L->Guid, 16), L->Age, Name);
218de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
220de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<StringIdRecord> StringIdRecord::deserialize(TypeRecordKind Kind,
221de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                    ArrayRef<uint8_t> &Data) {
222de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
223de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
224de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, Name);
225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return StringIdRecord(L->id, Name);
226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<FuncIdRecord> FuncIdRecord::deserialize(TypeRecordKind Kind,
229de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                ArrayRef<uint8_t> &Data) {
230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
232de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, Name);
233de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return FuncIdRecord(L->ParentScope, L->FunctionType, Name);
234de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
235de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
236de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<UdtSourceLineRecord>
237de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarUdtSourceLineRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) {
238de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
239de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L);
240de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return UdtSourceLineRecord(L->UDT, L->SourceFile, L->LineNumber);
241de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
242de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
243de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<BuildInfoRecord> BuildInfoRecord::deserialize(TypeRecordKind Kind,
244de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                      ArrayRef<uint8_t> &Data) {
245de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
246de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  ArrayRef<TypeIndex> Indices;
247de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, CV_ARRAY_FIELD_N(Indices, L->NumArgs));
248de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return BuildInfoRecord(Indices);
249de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
250de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
251de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<VFTableRecord> VFTableRecord::deserialize(TypeRecordKind Kind,
252de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                  ArrayRef<uint8_t> &Data) {
253de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
254de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
255de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<StringRef> Names;
256de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, Name, CV_ARRAY_FIELD_TAIL(Names));
257de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return VFTableRecord(L->CompleteClass, L->OverriddenVFTable, L->VFPtrOffset,
258de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                       Name, Names);
259de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
260de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
261de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<OneMethodRecord> OneMethodRecord::deserialize(TypeRecordKind Kind,
262de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                      ArrayRef<uint8_t> &Data) {
263de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
264de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
265de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  int32_t VFTableOffset = -1;
266de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
267de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, CV_CONDITIONAL_FIELD(VFTableOffset,
268de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                               L->Attrs.isIntroducedVirtual()),
269de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                 Name);
270de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
271de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MethodOptions Options = L->Attrs.getFlags();
272de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MethodKind MethKind = L->Attrs.getMethodKind();
273de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  MemberAccess Access = L->Attrs.getAccess();
274de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  OneMethodRecord Method(L->Type, MethKind, Options, Access, VFTableOffset,
275de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                         Name);
276de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Validate the vftable offset.
277de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Method.isIntroducingVirtual() && Method.getVFTableOffset() < 0)
278de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return std::make_error_code(std::errc::illegal_byte_sequence);
279de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Method;
280de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
281de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
282de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<MethodOverloadListRecord>
283de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarMethodOverloadListRecord::deserialize(TypeRecordKind Kind,
284de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                      ArrayRef<uint8_t> &Data) {
285de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  std::vector<OneMethodRecord> Methods;
286de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  while (!Data.empty()) {
287de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    const Layout *L = nullptr;
288de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    int32_t VFTableOffset = -1;
289de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    CV_DESERIALIZE(Data, L, CV_CONDITIONAL_FIELD(
290de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                VFTableOffset, L->Attrs.isIntroducedVirtual()));
291de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
292de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    MethodOptions Options = L->Attrs.getFlags();
293de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    MethodKind MethKind = L->Attrs.getMethodKind();
294de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    MemberAccess Access = L->Attrs.getAccess();
295de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
296de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Methods.emplace_back(L->Type, MethKind, Options, Access, VFTableOffset,
297de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                         StringRef());
298de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
299de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    // Validate the vftable offset.
300de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    auto &Method = Methods.back();
301de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Method.isIntroducingVirtual() && Method.getVFTableOffset() < 0)
302de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return std::make_error_code(std::errc::illegal_byte_sequence);
303de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
304de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return MethodOverloadListRecord(Methods);
305de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
306de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
307de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<OverloadedMethodRecord>
308de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarOverloadedMethodRecord::deserialize(TypeRecordKind Kind,
309de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                    ArrayRef<uint8_t> &Data) {
310de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
311de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
312de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, Name);
313de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return OverloadedMethodRecord(L->MethodCount, L->MethList, Name);
314de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
315de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
316de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<DataMemberRecord>
317de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarDataMemberRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) {
318de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
319de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t Offset;
320de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
321de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, CV_NUMERIC_FIELD(Offset), Name);
322de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return DataMemberRecord(L->Attrs.getAccess(), L->Type, Offset, Name);
323de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
324de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
325de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<StaticDataMemberRecord>
326de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarStaticDataMemberRecord::deserialize(TypeRecordKind Kind,
327de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                    ArrayRef<uint8_t> &Data) {
328de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
329de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
330de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, Name);
331de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return StaticDataMemberRecord(L->Attrs.getAccess(), L->Type, Name);
332de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
333de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
334de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<EnumeratorRecord>
335de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarEnumeratorRecord::deserialize(TypeRecordKind Kind, ArrayRef<uint8_t> &Data) {
336de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
337de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  APSInt Value;
338de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Name;
339de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, Value, Name);
340de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return EnumeratorRecord(L->Attrs.getAccess(), Value, Name);
341de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
342de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
343de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<VFPtrRecord> VFPtrRecord::deserialize(TypeRecordKind Kind,
344de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                              ArrayRef<uint8_t> &Data) {
345de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
346de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (auto EC = consumeObject(Data, L))
347de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return EC;
348de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return VFPtrRecord(L->Type);
349de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
350de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
351de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<BaseClassRecord> BaseClassRecord::deserialize(TypeRecordKind Kind,
352de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                                      ArrayRef<uint8_t> &Data) {
353de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
354de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t Offset;
355de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, CV_NUMERIC_FIELD(Offset));
356de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return BaseClassRecord(L->Attrs.getAccess(), L->BaseType, Offset);
357de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
358de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
359de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<VirtualBaseClassRecord>
360de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarVirtualBaseClassRecord::deserialize(TypeRecordKind Kind,
361de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                    ArrayRef<uint8_t> &Data) {
362de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
363de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t Offset;
364de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint64_t Index;
365de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L, CV_NUMERIC_FIELD(Offset), CV_NUMERIC_FIELD(Index));
366de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return VirtualBaseClassRecord(L->Attrs.getAccess(), L->BaseType, L->VBPtrType,
367de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                Offset, Index);
368de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
369de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
370de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarErrorOr<ListContinuationRecord>
371de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarListContinuationRecord::deserialize(TypeRecordKind Kind,
372de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar                                    ArrayRef<uint8_t> &Data) {
373de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  const Layout *L = nullptr;
374de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  CV_DESERIALIZE(Data, L);
375de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return ListContinuationRecord(L->ContinuationIndex);
376de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
377de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
378de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
379de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Type index remapping
380de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
381de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
382de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstatic bool remapIndex(ArrayRef<TypeIndex> IndexMap, TypeIndex &Idx) {
383de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // Simple types are unchanged.
384de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (Idx.isSimple())
385de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
386de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  unsigned MapPos = Idx.getIndex() - TypeIndex::FirstNonSimpleIndex;
387de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (MapPos < IndexMap.size()) {
388de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Idx = IndexMap[MapPos];
389de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return true;
390de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
391de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
392de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // This type index is invalid. Remap this to "not translated by cvpack",
393de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  // and return failure.
394de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Idx = TypeIndex(SimpleTypeKind::NotTranslated, SimpleTypeMode::Direct);
395de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return false;
396de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
397de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
398de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool ModifierRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
399de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return remapIndex(IndexMap, ModifiedType);
400de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
401de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
402de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool ProcedureRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
403de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
404de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, ReturnType);
405de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, ArgumentList);
406de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
407de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
408de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
409de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool MemberFunctionRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
410de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
411de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, ReturnType);
412de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, ClassType);
413de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, ThisType);
414de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, ArgumentList);
415de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
416de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
417de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
418de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool MemberFuncIdRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
419de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
420de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, ClassType);
421de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, FunctionType);
422de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
423de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
424de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
425de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool ArgListRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
426de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
427de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (TypeIndex &Str : StringIndices)
428de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Success &= remapIndex(IndexMap, Str);
429de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
430de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
431de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
432de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool MemberPointerInfo::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
433de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return remapIndex(IndexMap, ContainingType);
434de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
435de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
436de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool PointerRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
437de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
438de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, ReferentType);
439de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  if (isPointerToMember())
440de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Success &= MemberInfo.remapTypeIndices(IndexMap);
441de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
442de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
443de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
444de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool NestedTypeRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
445de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return remapIndex(IndexMap, Type);
446de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
447de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
448de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool ArrayRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
449de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
450de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, ElementType);
451de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, IndexType);
452de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
453de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
454de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
455de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool TagRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
456de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return remapIndex(IndexMap, FieldList);
457de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
458de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
459de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool ClassRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
460de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
461de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= TagRecord::remapTypeIndices(IndexMap);
462de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, DerivationList);
463de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, VTableShape);
464de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
465de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
466de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
467de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool EnumRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
468de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
469de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= TagRecord::remapTypeIndices(IndexMap);
470de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, UnderlyingType);
471de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
472de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
473de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
474de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool BitFieldRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
475de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return remapIndex(IndexMap, Type);
476de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
477de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
478de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool VFTableShapeRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
479de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return true;
480de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
481de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
482de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool TypeServer2Record::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
483de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return true;
484de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
485de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
486de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool StringIdRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
487de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return remapIndex(IndexMap, Id);
488de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
489de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
490de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool FuncIdRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
491de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
492de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, ParentScope);
493de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, FunctionType);
494de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
495de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
496de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
497de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool UdtSourceLineRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
498de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
499de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, UDT);
500de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, SourceFile);
501de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
502de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
503de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
504de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool UdtModSourceLineRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
505de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
506de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, UDT);
507de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, SourceFile);
508de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
509de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
510de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
511de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool BuildInfoRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
512de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
513de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (TypeIndex &Arg : ArgIndices)
514de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Success &= remapIndex(IndexMap, Arg);
515de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
516de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
517de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
518de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool VFTableRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
519de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
520de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, CompleteClass);
521de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, OverriddenVFTable);
522de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
523de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
524de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
525de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool OneMethodRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
526de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
527de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, Type);
528de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
529de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
530de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
531de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool MethodOverloadListRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
532de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
533de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  for (OneMethodRecord &Meth : Methods)
534de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if ((Success = Meth.remapTypeIndices(IndexMap)))
535de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      return Success;
536de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
537de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
538de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
539de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool OverloadedMethodRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
540de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return remapIndex(IndexMap, MethodList);
541de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
542de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
543de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool DataMemberRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
544de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return remapIndex(IndexMap, Type);
545de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
546de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
547de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool StaticDataMemberRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
548de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return remapIndex(IndexMap, Type);
549de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
550de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
551de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool EnumeratorRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
552de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return true;
553de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
554de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
555de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool VFPtrRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
556de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return remapIndex(IndexMap, Type);
557de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
558de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
559de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool BaseClassRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
560de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return remapIndex(IndexMap, Type);
561de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
562de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
563de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool VirtualBaseClassRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
564de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  bool Success = true;
565de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, BaseType);
566de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  Success &= remapIndex(IndexMap, VBPtrType);
567de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return Success;
568de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
569de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
570de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarbool ListContinuationRecord::remapTypeIndices(ArrayRef<TypeIndex> IndexMap) {
571de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  return remapIndex(IndexMap, ContinuationIndex);
572de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
573