aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AST/DeclSerialization.cpp4
-rw-r--r--AST/TypeSerialization.cpp14
-rw-r--r--include/clang/AST/Type.h8
3 files changed, 15 insertions, 11 deletions
diff --git a/AST/DeclSerialization.cpp b/AST/DeclSerialization.cpp
index 555c33edf6..208e81ca0f 100644
--- a/AST/DeclSerialization.cpp
+++ b/AST/DeclSerialization.cpp
@@ -295,8 +295,8 @@ void FieldDecl::EmitImpl(Serializer& S) const {
}
FieldDecl* FieldDecl::CreateImpl(Deserializer& D) {
- QualType DeclType = QualType::ReadVal(D);
- FieldDecl* decl = new FieldDecl(SourceLocation(),NULL,DeclType);
+ FieldDecl* decl = new FieldDecl(SourceLocation(),NULL,QualType());
+ decl->DeclType.ReadBackpatch(D);
decl->ReadInRec(D);
decl->BitWidth = D.ReadOwnedPtr<Expr>();
return decl;
diff --git a/AST/TypeSerialization.cpp b/AST/TypeSerialization.cpp
index 08d3194f19..e46abe4df1 100644
--- a/AST/TypeSerialization.cpp
+++ b/AST/TypeSerialization.cpp
@@ -35,6 +35,11 @@ QualType QualType::ReadVal(Deserializer& D) {
return Q;
}
+void QualType::ReadBackpatch(Deserializer& D) {
+ D.ReadUIntPtr(ThePtr,true);
+ ThePtr |= D.ReadInt();
+}
+
//===----------------------------------------------------------------------===//
// Type Serialization: Dispatch code to handle specific types.
//===----------------------------------------------------------------------===//
@@ -87,7 +92,7 @@ void Type::Create(ASTContext& Context, unsigned i, Deserializer& D) {
break;
case Type::Tagged:
- TagType::CreateImpl(Context,PtrID,D);
+ D.RegisterPtr(PtrID,TagType::CreateImpl(Context,D));
break;
case Type::TypeName:
@@ -193,18 +198,13 @@ void TagType::EmitImpl(Serializer& S) const {
S.EmitOwnedPtr(getDecl());
}
-Type* TagType::CreateImpl(ASTContext& Context, SerializedPtrID& PtrID,
- Deserializer& D) {
-
+Type* TagType::CreateImpl(ASTContext& Context, Deserializer& D) {
std::vector<Type*>& Types =
const_cast<std::vector<Type*>&>(Context.getTypes());
TagType* T = new TagType(NULL,QualType());
Types.push_back(T);
- // Forward register the type pointer before deserializing the decl.
- D.RegisterPtr(PtrID,T);
-
// Deserialize the decl.
T->decl = cast<TagDecl>(D.ReadOwnedPtr<Decl>());
diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h
index c42a1b00c9..d6dc5f7d6b 100644
--- a/include/clang/AST/Type.h
+++ b/include/clang/AST/Type.h
@@ -32,6 +32,7 @@ namespace clang {
class TagDecl;
class RecordDecl;
class EnumDecl;
+ class FieldDecl;
class ObjcInterfaceDecl;
class ObjcProtocolDecl;
class ObjcMethodDecl;
@@ -161,6 +162,10 @@ public:
/// Read - Deserialize a QualType from Bitcode.
static QualType ReadVal(llvm::Deserializer& D);
+
+private:
+ void ReadBackpatch(llvm::Deserializer& D);
+ friend class FieldDecl;
};
} // end clang.
@@ -888,8 +893,7 @@ public:
protected:
virtual void EmitImpl(llvm::Serializer& S) const;
- static Type* CreateImpl(ASTContext& Context, llvm::SerializedPtrID& PtrID,
- llvm::Deserializer& D);
+ static Type* CreateImpl(ASTContext& Context, llvm::Deserializer& D);
friend class Type;
};