r230580 - Improvement on sized deallocation from r230160:

H.J. Lu hjl.tools at gmail.com
Fri Mar 20 11:49:23 PDT 2015


r232788 caused:

--
Exit Code: 1

Command Output (stderr):
--
error: unknown argument: '-fdefine-sized-deallocation'

in compiler-rt test: TestCases/Linux/sized_delete_test.cc

On Fri, Mar 20, 2015 at 10:15 AM, Reid Kleckner <rnk at google.com> wrote:
> This code ultimately went away in r232731 and we took a new approach in
> r232788.
>
> On Fri, Mar 6, 2015 at 12:08 PM, John McCall <rjmccall at apple.com> wrote:
>>
>> > On Feb 26, 2015, at 12:08 PM, John McCall <rjmccall at apple.com> wrote:
>> >
>> >> On Feb 25, 2015, at 3:48 PM, Larisse Voufo <lvoufo at google.com> wrote:
>> >> Author: lvoufo
>> >> Date: Wed Feb 25 17:48:43 2015
>> >> New Revision: 230580
>> >>
>> >> URL: http://llvm.org/viewvc/llvm-project?rev=230580&view=rev
>> >> Log:
>> >> Improvement on sized deallocation from r230160:
>> >> Do not declare sized deallocation functions dependently on whether it
>> >> is found in global scope. Instead, enforce the branching in emitted code by
>> >> (1) declaring the functions extern_weak and (2) emitting sized delete
>> >> expressions as a branching between both forms delete.
>> >>
>> >> Modified:
>> >>   cfe/trunk/lib/CodeGen/CGExprCXX.cpp
>> >>   cfe/trunk/lib/Sema/SemaExprCXX.cpp
>> >>   cfe/trunk/test/CodeGenCXX/cxx1y-sized-deallocation.cpp
>> >>   cfe/trunk/test/CodeGenCXX/implicit-allocation-functions.cpp
>> >>   cfe/trunk/test/CodeGenCXX/pr21754.cpp
>> >>
>> >> Modified: cfe/trunk/lib/CodeGen/CGExprCXX.cpp
>> >> URL:
>> >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprCXX.cpp?rev=230580&r1=230579&r2=230580&view=diff
>> >>
>> >> ==============================================================================
>> >> --- cfe/trunk/lib/CodeGen/CGExprCXX.cpp (original)
>> >> +++ cfe/trunk/lib/CodeGen/CGExprCXX.cpp Wed Feb 25 17:48:43 2015
>> >> @@ -1422,6 +1422,71 @@ CodeGenFunction::pushCallObjectDeleteCle
>> >>                                        OperatorDelete, ElementType);
>> >> }
>> >>
>> >> +static void EmitDelete(CodeGenFunction &CGF,
>> >> +                              const CXXDeleteExpr *DE,
>> >> +                              llvm::Value *Ptr,
>> >> +                              QualType ElementType);
>> >> +
>> >> +static void EmitSizedDelete(CodeGenFunction &CGF,
>> >> +                            const CXXDeleteExpr *DE,
>> >> +                            llvm::Value *Ptr,
>> >> +                            QualType ElementType,
>> >> +                            FunctionDecl* UnsizedDealloc) {
>> >> +
>> >> +  if (CGF.getLangOpts().DefineSizedDeallocation) {
>> >> +    // The delete operator in use is fixed. So simply emit the delete
>> >> expr.
>> >> +    EmitDelete(CGF, DE, Ptr, ElementType);
>> >> +    return;
>> >> +  }
>> >> +
>> >> +  assert(UnsizedDealloc && "We must be emiting a 'sized' delete
>> >> expr");
>> >> +
>> >> +  // Branch off over the value of operator delete:
>> >> +  // Use the sized form if available, and default on the unsized form
>> >> otherwise.
>> >> +  llvm::BasicBlock *ThenBlock = CGF.createBasicBlock("if.then");
>> >> +  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("if.end");
>> >> +  llvm::BasicBlock *ElseBlock = CGF.createBasicBlock("if.else");
>> >> +
>> >> +  // Emit the condition.
>> >> +  const FunctionDecl *OpDelFD = DE->getOperatorDelete();
>> >> +  llvm::Value *OpDelAddr = CGF.CGM.GetAddrOfFunction(OpDelFD);
>> >> +  //llvm::Function *OpDel = dyn_cast<llvm::Function>(OpDelAddr);
>> >> +  llvm::Value *SDE = CGF.Builder.CreateIsNotNull(OpDelAddr,
>> >> "sized.del.exists");
>> >> +  CGF.Builder.CreateCondBr(SDE, ThenBlock, ElseBlock);
>> >> +
>> >> +  // Emit the 'then' code.
>> >> +  CGF.EmitBlock(ThenBlock);
>> >> +  EmitDelete(CGF, DE, Ptr, ElementType);
>> >> +  CGF.EmitBranch(ContBlock);
>> >> +
>> >> +  // Compute the 'unsized' delete expr.
>> >> +  CXXDeleteExpr * E = const_cast<CXXDeleteExpr*>(DE);
>> >> +  CXXDeleteExpr *UnsizedDE =
>> >> +  new (CGF.getContext()) CXXDeleteExpr(CGF.getContext().VoidTy,
>> >> +                                       E->isGlobalDelete(),
>> >> +                                       E->isArrayForm(),
>> >> +                                       E->isArrayFormAsWritten(),
>> >> +
>> >> E->doesUsualArrayDeleteWantSize(),
>> >> +                                       UnsizedDealloc,
>> >> +                                       E->getArgument(),
>> >> +                                       E->getLocStart());
>> >
>> > Instead of doing it this way, please introduce a common function to call
>> > from EmitDeleteCall and the CallArrayDelete cleanup.
>> >
>> > Doing it this way unnecessarily clones the object / array destruction
>> > code,
>> > causes a useless branch when making a virtual call to the deleting
>> > destructor,
>> > and fails to branch appropriately within a deleting destructor.
>> >
>> > The common function will also be a natural place in the future to check
>> > the
>> > language that elides the dynamic check and assumes that the sized
>> > deallocation function exists.  (The reverse option will be implemented
>> > by
>> > having Sema just specify an unsized deallocation function.)
>>
>> Ping.
>>
>> John.
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>



-- 
H.J.



More information about the cfe-commits mailing list