]> granicus.if.org Git - clang/commitdiff
switch the VarDecl allocation model to go through ASTContext.
authorChris Lattner <sabre@nondot.org>
Sat, 15 Mar 2008 21:10:16 +0000 (21:10 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 15 Mar 2008 21:10:16 +0000 (21:10 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@48396 91177308-0d34-0410-b5e6-96231b3b80d8

AST/Decl.cpp
Driver/RewriteTest.cpp
Sema/SemaDecl.cpp
Sema/SemaDeclObjC.cpp
include/clang/AST/Decl.h

index aad8f212bfe704d220afe38f4ac350b83db28727..a171589f1358ab8e39e3dd0b6110b71cb0ad1ff4 100644 (file)
@@ -205,6 +205,28 @@ void Decl::addDeclKind(Kind k) {
 // Decl Allocation/Deallocation Method Implementations
 //===----------------------------------------------------------------------===//
 
+BlockVarDecl *BlockVarDecl::Create(SourceLocation L, IdentifierInfo *Id,
+                                   QualType T, StorageClass S,
+                                   ScopedDecl *PrevDecl, ASTContext &C) {
+  void *Mem = C.getAllocator().Allocate<BlockVarDecl>();
+  return new (Mem) BlockVarDecl(L, Id, T, S, PrevDecl);
+}
+
+
+FileVarDecl *FileVarDecl::Create(SourceLocation L, IdentifierInfo *Id,
+                                 QualType T, StorageClass S, 
+                                 ScopedDecl *PrevDecl, ASTContext &C) {
+  void *Mem = C.getAllocator().Allocate<FileVarDecl>();
+  return new (Mem) FileVarDecl(L, Id, T, S, PrevDecl);
+}
+
+ParmVarDecl *ParmVarDecl::Create(SourceLocation L, IdentifierInfo *Id,
+                                 QualType T, StorageClass S, 
+                                 ScopedDecl *PrevDecl, ASTContext &C) {
+  void *Mem = C.getAllocator().Allocate<ParmVarDecl>();
+  return new (Mem) ParmVarDecl(L, Id, T, S, PrevDecl);
+}
+
 EnumConstantDecl *EnumConstantDecl::Create(SourceLocation L, IdentifierInfo *Id,
                                            QualType T, Expr *E, 
                                            const llvm::APSInt &V, 
index 652ce1c82c3256f6e733cdcd24f888cc8ba67b29..dfad8ecccf79e7d3f6e5d623c7e3c7fa670e3d8f 100644 (file)
@@ -1744,9 +1744,9 @@ Stmt *RewriteTest::RewriteObjCStringLiteral(ObjCStringLiteral *Exp) {
   InsertText(SourceLocation::getFileLoc(MainFileID, 0), 
              StrObjDecl.c_str(), StrObjDecl.size());
   
-  FileVarDecl *NewVD = new FileVarDecl(SourceLocation(), 
+  FileVarDecl *NewVD = FileVarDecl::Create(SourceLocation(), 
                                        &Context->Idents.get(S.c_str()), strType, 
-                                       VarDecl::Static, NULL);
+                                       VarDecl::Static, NULL, *Context);
   DeclRefExpr *DRE = new DeclRefExpr(NewVD, strType, SourceLocation());
   Expr *Unop = new UnaryOperator(DRE, UnaryOperator::AddrOf,
                                  Context->getPointerType(DRE->getType()), 
index 90f9133d4b8272a53c15105a25df84fa8200c1be..13d49b09800c96c5b2657a076e9b2bed6f2921b3 100644 (file)
@@ -777,13 +777,13 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) {
     VarDecl *NewVD;
     VarDecl::StorageClass SC;
     switch (D.getDeclSpec().getStorageClassSpec()) {
-      default: assert(0 && "Unknown storage class!");
-      case DeclSpec::SCS_unspecified:    SC = VarDecl::None; break;
-      case DeclSpec::SCS_extern:         SC = VarDecl::Extern; break;
-      case DeclSpec::SCS_static:         SC = VarDecl::Static; break;
-      case DeclSpec::SCS_auto:           SC = VarDecl::Auto; break;
-      case DeclSpec::SCS_register:       SC = VarDecl::Register; break;
-      case DeclSpec::SCS_private_extern: SC = VarDecl::PrivateExtern; break;
+    default: assert(0 && "Unknown storage class!");
+    case DeclSpec::SCS_unspecified:    SC = VarDecl::None; break;
+    case DeclSpec::SCS_extern:         SC = VarDecl::Extern; break;
+    case DeclSpec::SCS_static:         SC = VarDecl::Static; break;
+    case DeclSpec::SCS_auto:           SC = VarDecl::Auto; break;
+    case DeclSpec::SCS_register:       SC = VarDecl::Register; break;
+    case DeclSpec::SCS_private_extern: SC = VarDecl::PrivateExtern; break;
     }    
     if (S->getParent() == 0) {
       // C99 6.9p2: The storage-class specifiers auto and register shall not
@@ -793,9 +793,11 @@ Sema::ActOnDeclarator(Scope *S, Declarator &D, DeclTy *lastDecl) {
              R.getAsString());
         InvalidDecl = true;
       }
-      NewVD = new FileVarDecl(D.getIdentifierLoc(), II, R, SC, LastDeclarator);
+      NewVD = FileVarDecl::Create(D.getIdentifierLoc(), II, R, SC,
+                                  LastDeclarator, Context);
     } else {
-      NewVD = new BlockVarDecl(D.getIdentifierLoc(), II, R, SC, LastDeclarator);
+      NewVD = BlockVarDecl::Create(D.getIdentifierLoc(), II, R, SC,
+                                   LastDeclarator, Context);
     }
     // Handle attributes prior to checking for duplicates in MergeVarDecl
     HandleDeclAttributes(NewVD, D.getDeclSpec().getAttributes(),
@@ -1014,8 +1016,8 @@ Sema::ActOnParamDeclarator(struct DeclaratorChunk::ParamInfo &PI,
   } else if (parmDeclType->isFunctionType())
     parmDeclType = Context.getPointerType(parmDeclType);
   
-  ParmVarDecl *New = new ParmVarDecl(PI.IdentLoc, II, parmDeclType, 
-                                     VarDecl::None, 0);
+  ParmVarDecl *New = ParmVarDecl::Create(PI.IdentLoc, II, parmDeclType, 
+                                         VarDecl::None, 0, Context);
   
   if (PI.InvalidType)
     New->setInvalidDecl();
index 04ce426dec976fdfc0fd19aebdb11e3d82278c46..1e60a3964787d8e5c2c1127925cbd536ca57676d 100644 (file)
@@ -823,8 +823,9 @@ Sema::DeclTy *Sema::ActOnMethodDeclaration(
       argType = QualType::getFromOpaquePtr(ArgTypes[i]);
     else
       argType = Context.getObjCIdType();
-    ParmVarDecl* Param = new ParmVarDecl(SourceLocation(/*FIXME*/), ArgNames[i], 
-                                         argType, VarDecl::None, 0);
+    ParmVarDecl* Param = ParmVarDecl::Create(SourceLocation(/*FIXME*/),
+                                             ArgNames[i], argType,
+                                             VarDecl::None, 0, Context);
     Param->setObjCDeclQualifier(
       CvtQTToAstBitMask(ArgQT[i].getObjCDeclQualifier()));
     Params.push_back(Param);
index 9e8f065ae69685461f9365b9e8d91d7d59497792..df484fbca98dd23eeff1b5472ff67ca1fe5764c5 100644 (file)
@@ -294,6 +294,17 @@ public:
   enum StorageClass {
     None, Auto, Register, Extern, Static, PrivateExtern
   };
+private:
+  Expr *Init;
+  // FIXME: This can be packed into the bitfields in Decl.
+  unsigned SClass : 3;
+  
+  friend class StmtIteratorBase;
+protected:
+  VarDecl(Kind DK, SourceLocation L, IdentifierInfo *Id, QualType T,
+          StorageClass SC, ScopedDecl *PrevDecl)
+    : ValueDecl(DK, L, Id, T, PrevDecl), Init(0) { SClass = SC; }
+public:
   StorageClass getStorageClass() const { return (StorageClass)SClass; }
 
   const Expr *getInit() const { return Init; }
@@ -322,17 +333,7 @@ public:
     return D->getKind() >= VarFirst && D->getKind() <= VarLast;
   }
   static bool classof(const VarDecl *D) { return true; }
-protected:
-  VarDecl(Kind DK, SourceLocation L, IdentifierInfo *Id, QualType T,
-          StorageClass SC, ScopedDecl *PrevDecl)
-    : ValueDecl(DK, L, Id, T, PrevDecl), Init(0) { SClass = SC; }
-private:
-  Expr *Init;
-  // FIXME: This can be packed into the bitfields in Decl.
-  unsigned SClass : 3;
-    
-  friend class StmtIteratorBase;
-  
+
 protected:
   void EmitInRec(llvm::Serializer& S) const;
   void ReadInRec(llvm::Deserializer& D);
@@ -349,11 +350,13 @@ protected:
 
 /// BlockVarDecl - Represent a local variable declaration.
 class BlockVarDecl : public VarDecl {
-public:
   BlockVarDecl(SourceLocation L, IdentifierInfo *Id, QualType T, StorageClass S,
                ScopedDecl *PrevDecl)
     : VarDecl(BlockVar, L, Id, T, S, PrevDecl) {}
-  
+public:
+  static BlockVarDecl *Create(SourceLocation L, IdentifierInfo *Id, QualType T,
+                              StorageClass S, ScopedDecl *PrevDecl,
+                              ASTContext &C);
   // Implement isa/cast/dyncast/etc.
   static bool classof(const Decl *D) { return D->getKind() == BlockVar; }
   static bool classof(const BlockVarDecl *D) { return true; }  
@@ -370,10 +373,13 @@ protected:
 /// definitions (C99 6.9.2p2) using our type system (without storing a
 /// pointer to the decl's scope, which is transient).
 class FileVarDecl : public VarDecl {
-public:
   FileVarDecl(SourceLocation L, IdentifierInfo *Id, QualType T, StorageClass S,
               ScopedDecl *PrevDecl)
     : VarDecl(FileVar, L, Id, T, S, PrevDecl) {}
+public:
+  static FileVarDecl *Create(SourceLocation L, IdentifierInfo *Id, QualType T,
+                             StorageClass S, ScopedDecl *PrevDecl,
+                             ASTContext &C);
   
   // Implement isa/cast/dyncast/etc.
   static bool classof(const Decl *D) { return D->getKind() == FileVar; }
@@ -388,11 +394,19 @@ protected:
 
 /// ParmVarDecl - Represent a parameter to a function.
 class ParmVarDecl : public VarDecl {
-public:
+  // NOTE: VC++ treats enums as signed, avoid using the ObjCDeclQualifier enum
+  /// FIXME: Also can be paced into the bitfields in Decl.
+  /// in, inout, etc.
+  unsigned objcDeclQualifier : 6;
+  
   ParmVarDecl(SourceLocation L, IdentifierInfo *Id, QualType T, StorageClass S,
               ScopedDecl *PrevDecl)
     : VarDecl(ParmVar, L, Id, T, S, PrevDecl), 
     objcDeclQualifier(OBJC_TQ_None) {}
+public:
+  static ParmVarDecl *Create(SourceLocation L, IdentifierInfo *Id, QualType T,
+                             StorageClass S, ScopedDecl *PrevDecl,
+                             ASTContext &C);
   
   ObjCDeclQualifier getObjCDeclQualifier() const {
     return ObjCDeclQualifier(objcDeclQualifier);
@@ -404,12 +418,6 @@ public:
   static bool classof(const Decl *D) { return D->getKind() == ParmVar; }
   static bool classof(const ParmVarDecl *D) { return true; }
   
-private:
-  // NOTE: VC++ treats enums as signed, avoid using the ObjCDeclQualifier enum
-  /// FIXME: Also can be paced into the bitfields in Decl.
-  /// in, inout, etc.
-  unsigned objcDeclQualifier : 6;
-  
 protected:
   /// EmitImpl - Serialize this ParmVarDecl. Called by Decl::Emit.
   virtual void EmitImpl(llvm::Serializer& S) const;