[cfe-commits] r150137 - in /cfe/trunk: include/clang/AST/DeclBase.h lib/AST/DeclBase.cpp lib/Serialization/ASTReaderDecl.cpp

Ted Kremenek kremenek at apple.com
Wed Feb 8 20:30:30 PST 2012


Thanks Argiris.  As a follow up patch, I think some comments in the code here would be helpful describing why you are doing this.  Otherwise it would be very easy for someone to undo this later.

On Feb 8, 2012, at 6:44 PM, Argyrios Kyrtzidis <akyrtzi at gmail.com> wrote:

> Author: akirtzidis
> Date: Wed Feb  8 20:44:08 2012
> New Revision: 150137
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=150137&view=rev
> Log:
> [PCH] Avoid using Decl::setAttrs() and Decl::setLexicalDeclContext() from the ASTReaderDecl
> directly; they internally call Decl::getASTContext() which may crash if a declaration context
> parent is still deserializing.
> 
> Modified:
>    cfe/trunk/include/clang/AST/DeclBase.h
>    cfe/trunk/lib/AST/DeclBase.cpp
>    cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
> 
> Modified: cfe/trunk/include/clang/AST/DeclBase.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=150137&r1=150136&r2=150137&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/AST/DeclBase.h (original)
> +++ cfe/trunk/include/clang/AST/DeclBase.h Wed Feb  8 20:44:08 2012
> @@ -389,7 +389,9 @@
>   }
> 
>   bool hasAttrs() const { return HasAttrs; }
> -  void setAttrs(const AttrVec& Attrs);
> +  void setAttrs(const AttrVec& Attrs) {
> +    return setAttrsImpl(Attrs, getASTContext());
> +  }
>   AttrVec &getAttrs() {
>     return const_cast<AttrVec&>(const_cast<const Decl*>(this)->getAttrs());
>   }
> @@ -852,6 +854,9 @@
> 
> private:
>   const Attr *getAttrsImpl() const;
> +  void setAttrsImpl(const AttrVec& Attrs, ASTContext &Ctx);
> +  void setDeclContextsImpl(DeclContext *SemaDC, DeclContext *LexicalDC,
> +                           ASTContext &Ctx);
> 
> protected:
>   ASTMutationListener *getASTMutationListener() const;
> 
> Modified: cfe/trunk/lib/AST/DeclBase.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=150137&r1=150136&r2=150137&view=diff
> ==============================================================================
> --- cfe/trunk/lib/AST/DeclBase.cpp (original)
> +++ cfe/trunk/lib/AST/DeclBase.cpp Wed Feb  8 20:44:08 2012
> @@ -203,15 +203,24 @@
>     return;
> 
>   if (isInSemaDC()) {
> -    MultipleDC *MDC = new (getASTContext()) MultipleDC();
> -    MDC->SemanticDC = getDeclContext();
> -    MDC->LexicalDC = DC;
> -    DeclCtx = MDC;
> +    setDeclContextsImpl(getDeclContext(), DC, getASTContext());
>   } else {
>     getMultipleDC()->LexicalDC = DC;
>   }
> }
> 
> +void Decl::setDeclContextsImpl(DeclContext *SemaDC, DeclContext *LexicalDC,
> +                               ASTContext &Ctx) {
> +  if (SemaDC == LexicalDC) {
> +    DeclCtx = SemaDC;
> +  } else {
> +    Decl::MultipleDC *MDC = new (Ctx) Decl::MultipleDC();
> +    MDC->SemanticDC = SemaDC;
> +    MDC->LexicalDC = LexicalDC;
> +    DeclCtx = MDC;
> +  }
> +}
> +
> bool Decl::isInAnonymousNamespace() const {
>   const DeclContext *DC = getDeclContext();
>   do {
> @@ -532,10 +541,10 @@
>   llvm_unreachable("Invalid DeclKind!");
> }
> 
> -void Decl::setAttrs(const AttrVec &attrs) {
> +void Decl::setAttrsImpl(const AttrVec &attrs, ASTContext &Ctx) {
>   assert(!HasAttrs && "Decl already contains attrs.");
> 
> -  AttrVec &AttrBlank = getASTContext().getDeclAttrs(this);
> +  AttrVec &AttrBlank = Ctx.getDeclAttrs(this);
>   assert(AttrBlank.empty() && "HasAttrs was wrong?");
> 
>   AttrBlank = attrs;
> 
> Modified: cfe/trunk/lib/Serialization/ASTReaderDecl.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReaderDecl.cpp?rev=150137&r1=150136&r2=150137&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Serialization/ASTReaderDecl.cpp (original)
> +++ cfe/trunk/lib/Serialization/ASTReaderDecl.cpp Wed Feb  8 20:44:08 2012
> @@ -324,12 +324,11 @@
>   } else if (D->isTemplateParameter()) {
>     // If we have a fully initialized template parameter, we can now
>     // set its DeclContext.
> -    D->setDeclContext(
> -          cast_or_null<DeclContext>(
> -                            Reader.GetDecl(DeclContextIDForTemplateParmDecl)));
> -    D->setLexicalDeclContext(
> -          cast_or_null<DeclContext>(
> -                      Reader.GetDecl(LexicalDeclContextIDForTemplateParmDecl)));
> +    DeclContext *SemaDC = cast<DeclContext>(
> +                              Reader.GetDecl(DeclContextIDForTemplateParmDecl));
> +    DeclContext *LexicalDC = cast<DeclContext>(
> +                       Reader.GetDecl(LexicalDeclContextIDForTemplateParmDecl));
> +    D->setDeclContextsImpl(SemaDC, LexicalDC, Reader.getContext());
>   }
> }
> 
> @@ -343,15 +342,16 @@
>     LexicalDeclContextIDForTemplateParmDecl = ReadDeclID(Record, Idx);
>     D->setDeclContext(Reader.getContext().getTranslationUnitDecl()); 
>   } else {
> -    D->setDeclContext(ReadDeclAs<DeclContext>(Record, Idx));
> -    D->setLexicalDeclContext(ReadDeclAs<DeclContext>(Record, Idx));
> +    DeclContext *SemaDC = ReadDeclAs<DeclContext>(Record, Idx);
> +    DeclContext *LexicalDC = ReadDeclAs<DeclContext>(Record, Idx);
> +    D->setDeclContextsImpl(SemaDC, LexicalDC, Reader.getContext());
>   }
>   D->setLocation(Reader.ReadSourceLocation(F, RawLocation));
>   D->setInvalidDecl(Record[Idx++]);
>   if (Record[Idx++]) { // hasAttrs
>     AttrVec Attrs;
>     Reader.ReadAttributes(F, Attrs, Record, Idx);
> -    D->setAttrs(Attrs);
> +    D->setAttrsImpl(Attrs, Reader.getContext());
>   }
>   D->setImplicit(Record[Idx++]);
>   D->setUsed(Record[Idx++]);
> 
> 
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits




More information about the cfe-commits mailing list