[cfe-commits] r62605 - in /cfe/trunk: include/clang/AST/DeclBase.h lib/AST/DeclBase.cpp lib/Sema/SemaExpr.cpp

Douglas Gregor dgregor at apple.com
Tue Jan 20 14:03:47 PST 2009


On Jan 20, 2009, at 2:01 PM, steve naroff wrote:

>
> On Jan 20, 2009, at 1:46 PM, Douglas Gregor wrote:
>
>>
>> On Jan 20, 2009, at 1:33 PM, Sebastian Redl wrote:
>>
>>> Steve Naroff wrote:
>>>> Author: snaroff
>>>> Date: Tue Jan 20 13:53:53 2009
>>>> New Revision: 62605
>>>>
>>>> URL: http://llvm.org/viewvc/llvm-project?rev=62605&view=rev
>>>> Log:
>>>> Allocate expresssions through ASTContext (still more work to do).
>>>> =
>>>> ===================================================================
>>>> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
>>>> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Jan 20 13:53:53 2009
>>>> @@ -373,11 +373,14 @@
>>>> DeclRefExpr *Sema::BuildDeclRefExpr(NamedDecl *D, QualType Ty,  
>>>> SourceLocation Loc,
>>>>                                   bool TypeDependent, bool  
>>>> ValueDependent,
>>>>                                   const CXXScopeSpec *SS) {
>>>> -  if (SS && !SS->isEmpty())
>>>> -    return new QualifiedDeclRefExpr(D, Ty, Loc, TypeDependent,  
>>>> ValueDependent,
>>>> -                                    SS->getRange().getBegin());
>>>> -  else
>>>> -    return new DeclRefExpr(D, Ty, Loc, TypeDependent,  
>>>> ValueDependent);
>>>> +  if (SS && !SS->isEmpty()) {
>>>> +    void *Mem = Context.getAllocator 
>>>> ().Allocate<QualifiedDeclRefExpr>();
>>>> +    return new (Mem) QualifiedDeclRefExpr(D, Ty, Loc,  
>>>> TypeDependent,
>>>> +                       ValueDependent, SS->getRange().getBegin());
>>>> +  } else {
>>>> +    void *Mem = Context.getAllocator().Allocate<DeclRefExpr>();
>>>> +    return new (Mem) DeclRefExpr(D, Ty, Loc, TypeDependent,  
>>>> ValueDependent);
>>>> +  }
>>>> }
>>>>
>>>>
>>>
>>> Oh, dear. Shouldn't we write Create() functions like decls use? Or  
>>> are
>>> the few places where Exprs and Stmts are allocated not worth it?
>>>
>>> How about a placement new?
>>>
>>> void *operator new(size_t bytes, ASTContext& C) {
>>> return C.getAllocator().Allocate(bytes, some_default_alignment);
>>> }
>>> // This one is not really necessary, as it cannot be called  
>>> directly. It
>>> is called implicitly
>>> // by the compiler if the constructor in a placement new  
>>> expression throws.
>>> void operator delete(void *ptr, ASTContext& C) {
>>> C.getAllocator().Deallocate(ptr);
>>> }
>>>
>>> This allows this nice syntax for creating the nodes:
>>>
>>> return new (Context) QualifiedDeclRefExpr(D, Ty, Loc, ...);
>>
>>
>> I like this a *lot*.
>>
>
> Fine with me (I was focused more on performance than aesthetics:-)
>
> I can convert over to user-defined placement new's.
>
> Do you think we should convert Decl's over?


For those Decls that don't need to do any special kind of allocation,  
yes, but we need not do it immediately. Let's see if we really like  
this in Exprs as much as we think we will.

   - Doug



More information about the cfe-commits mailing list