From: Ted Kremenek Date: Wed, 31 Oct 2007 17:50:23 +0000 (+0000) Subject: Implemented serialization of Variable Array Types (VLAs). X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2e7d352dbec06755105237afba183492d31d03cb;p=clang Implemented serialization of Variable Array Types (VLAs). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@43561 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/AST/ASTContext.cpp b/AST/ASTContext.cpp index 9d6af2d1bb..c46efa91e7 100644 --- a/AST/ASTContext.cpp +++ b/AST/ASTContext.cpp @@ -1308,15 +1308,15 @@ void ASTContext::Emit(llvm::Serializer& S) const { EmitSet(PointerTypes,S); EmitSet(ReferenceTypes,S); EmitSet(ConstantArrayTypes,S); - // FIXME EmitSet(IncompleteVariableArrayTypes,S); - /* FIXME: Emit for VLAs + EmitSet(IncompleteVariableArrayTypes,S); + S.EmitInt(CompleteVariableArrayTypes.size()); for (unsigned i = 0; i < CompleteVariableArrayTypes.size(); ++i) - S.Emit(*CompleteVariableArrayTypes[i]); */ + S.Emit(*CompleteVariableArrayTypes[i]); EmitSet(VectorTypes,S); - // FIXME: EmitSet(FunctionTypeNoProtos); - // FIXME: EmitSet(FunctionTypeProtos); + EmitSet(FunctionTypeNoProtos,S); + EmitSet(FunctionTypeProtos,S); // FIXME: EmitSet(ObjcQualifiedInterfaceTypes,S); // FIXME: RecourdLayoutInfo // FIXME: Builtins. diff --git a/AST/TypeSerialization.cpp b/AST/TypeSerialization.cpp index ef3dc7931f..d21ce6bb94 100644 --- a/AST/TypeSerialization.cpp +++ b/AST/TypeSerialization.cpp @@ -12,6 +12,7 @@ //===----------------------------------------------------------------------===// #include "clang/AST/Type.h" +#include "clang/AST/Expr.h" #include "llvm/Bitcode/Serialize.h" #include "llvm/Bitcode/Deserialize.h" @@ -140,6 +141,23 @@ ConstantArrayType* ConstantArrayType::Materialize(llvm::Deserializer& D) { return T; } +void VariableArrayType::Emit(llvm::Serializer& S) const { + EmitArrayTypeInternal(S); + S.EmitOwnedPtr(SizeExpr); +} + +VariableArrayType* VariableArrayType::Materialize(llvm::Deserializer& D) { + // "Default" construct the array type. + VariableArrayType* T = + new VariableArrayType(QualType(), QualType(), NULL, ArrayType::Normal, 0); + + // Deserialize the internal values. + T->ReadArrayTypeInternal(D); + T->SizeExpr = D.ReadOwnedPtr(); + + return T; +} + void VectorType::Emit(llvm::Serializer& S) const { EmitTypeInternal(S); S.Emit(ElementType); diff --git a/include/clang/AST/Expr.h b/include/clang/AST/Expr.h index 819996ba12..d19abe3034 100644 --- a/include/clang/AST/Expr.h +++ b/include/clang/AST/Expr.h @@ -110,6 +110,14 @@ public: T->getStmtClass() <= lastExprConstant; } static bool classof(const Expr *) { return true; } + + void Emit(llvm::Serializer& S) const { + llvm::SerializeTrait::Emit(S,*this); + } + + static inline Expr* Materialize(llvm::Deserializer& D) { + return cast(llvm::SerializeTrait::Materialize(D)); + } }; //===----------------------------------------------------------------------===// diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h index 93f6850977..fa0dc9d234 100644 --- a/include/clang/AST/Stmt.h +++ b/include/clang/AST/Stmt.h @@ -668,7 +668,7 @@ public: namespace llvm { template<> struct SerializeTrait { - static void Emit(Serializer& S, clang::Stmt& stmt); + static void Emit(Serializer& S, const clang::Stmt& stmt); static clang::Stmt* Materialize(Deserializer& D); }; diff --git a/include/clang/AST/Type.h b/include/clang/AST/Type.h index 052f5801c4..6d7a6d7ce7 100644 --- a/include/clang/AST/Type.h +++ b/include/clang/AST/Type.h @@ -484,7 +484,7 @@ public: /// ArrayType - C99 6.7.5.2 - Array Declarators. /// -class ArrayType : public Type { +class ArrayType : public Type, public llvm::FoldingSetNode { public: /// ArraySizeModifier - Capture whether this is a normal array (e.g. int X[4]) /// an array with a static size (e.g. int X[static 4]), or with a star size @@ -532,7 +532,7 @@ protected: void ReadArrayTypeInternal(llvm::Deserializer& S); }; -class ConstantArrayType : public ArrayType, public llvm::FoldingSetNode { +class ConstantArrayType : public ArrayType { llvm::APInt Size; // Allows us to unique the type. ConstantArrayType(QualType et, QualType can, llvm::APInt sz, @@ -573,7 +573,7 @@ public: }; // FIXME: VariableArrayType's aren't uniqued (since expressions aren't). -class VariableArrayType : public ArrayType, public llvm::FoldingSetNode { +class VariableArrayType : public ArrayType { /// SizeExpr - An assignment expression. VLA's are only permitted within /// a function block. Expr *SizeExpr; @@ -605,8 +605,8 @@ public: ID.AddPointer(ET.getAsOpaquePtr()); } - // FIXME: Who owns VariableArrayType's? What are the semantics - // for serialization. + void Emit(llvm::Serializer& S) const; + static VariableArrayType* Materialize(llvm::Deserializer& D); }; /// VectorType - GCC generic vector type. This type is created using