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 <[email protected]> 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
> [email protected]
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to