[PATCH] -Wprofile-instr-out-of-date warnings due to certain destructor types not being assigned increment intrinsics

Justin Bogner mail at justinbogner.com
Wed May 20 09:20:32 PDT 2015


"Betul Buyukkurt" <betulb at codeaurora.org> writes:
> Hi Justin, 
>
> I do not have commit rights. Could you please direct how I should commit or
> commit the change on my behalf?

r237804.

> Thanks,
> -Betul
>
> -----Original Message-----
> From: Justin Bogner [mailto:justin at justinbogner.com] On Behalf Of Justin
> Bogner
> Sent: Tuesday, May 19, 2015 11:05 PM
> To: Betul Buyukkurt
> Cc: dsule at codeaurora.org; davidxl at google.com;
> reviews+d9861+public+a0e96a4b284ffb06 at reviews.llvm.org;
> cfe-commits at cs.uiuc.edu
> Subject: Re: [PATCH] -Wprofile-instr-out-of-date warnings due to certain
> destructor types not being assigned increment intrinsics
>
> "Betul Buyukkurt" <betulb at codeaurora.org> writes:
>>> "Betul Buyukkurt" <betulb at codeaurora.org> writes:
>>>>> Betul Buyukkurt <betulb at codeaurora.org> writes:
>>>>>> Hi bogner, dsule, davidxl,
>>>>>>
>>>>>> -fprofile-instr-generate does not emit counter increment 
>>>>>> intrinsics for Dtor_Deleting and Dtor_Complete destructors with 
>>>>>> assigned counters. This causes unnecessary 
>>>>>> [-Wprofile-instr-out-of-date] warnings during profile-use runs 
>>>>>> even if the source has never been modified since profile collection.
>>>>>>
>>>>>> http://reviews.llvm.org/D9861
>>>>>>
>>>>>> Files:
>>>>>>   lib/CodeGen/CGClass.cpp
>>>>>>   test/Profile/cxx-virtual-destructor-calls.cpp
>>>>>>
>>>>>> Index: lib/CodeGen/CGClass.cpp
>>>>>> ==================================================================
>>>>>> =
>>>>>> --- lib/CodeGen/CGClass.cpp
>>>>>> +++ lib/CodeGen/CGClass.cpp
>>>>>> @@ -1366,6 +1366,10 @@
>>>>>>    const CXXDestructorDecl *Dtor = 
>>>>>> cast<CXXDestructorDecl>(CurGD.getDecl());
>>>>>>    CXXDtorType DtorType = CurGD.getDtorType();
>>>>>>
>>>>>> +  Stmt *Body = Dtor->getBody();
>>>>>> +  if (Body)
>>>>>> +    incrementProfileCounter(Body);
>>>>>> +
>>>>>
>>>>> I think it makes more sense to do this after the delegation and 
>>>>> entering the try body, like we do in constructors, no?
>>>>
>>>> I've been observing plenty warnings emitted from C++ codes. Tracking 
>>>> the issue I saw that the Dtor_Deleting and other Dtor types have 
>>>> counters assigned to them but no counter increment code is emitted. 
>>>> This causes no profile data structures to be emitted for those 
>>>> functions as well. In CodeGenPGO.cpp line 649, it says that:
>>>>
>>>> " Clang emits several functions for the constructor and the 
>>>> destructor of a class. Every function is instrumented, but we only 
>>>> want to provide coverage for one of them. Because of that we only 
>>>> emit the coverage mapping for the base constructor/destructor. "
>>>>
>>>> I also see that the counter increment is currently done for base 
>>>> destructor only. This patch removes all the 
>>>> [-Wprofile-instr-out-of-date] warnings from the spec2000/2006 
>>>> benchmarks.
>>>
>>> Well, yes. You explained that in the commit message. What I mean is, 
>>> I think this belongs slightly later in the function to match how we 
>>> do it in the constructor, ie:
>>>
>>> from CodeGenFunction::EmitDestructorBody(FunctionArgList &Args):
>>>> // The call to operator delete in a deleting destructor happens // 
>>>> outside of the function-try-block, which means it's always // 
>>>> possible to delegate the destructor body to the complete // 
>>>> destructor.  Do so.
>>>> if (DtorType == Dtor_Deleting) {
>>>>   EnterDtorCleanups(Dtor, Dtor_Deleting);
>>>>   EmitCXXDestructorCall(Dtor, Dtor_Complete, /*ForVirtualBase=*/false,
>>>>                         /*Delegating=*/false, LoadCXXThis());
>>>>   PopCleanupBlock();
>>>>   return;
>>>> }
>>
>> Dtor_Deleting returns here. So the increment also has to be inside the 
>> above if statement, if the other location were to be below where you 
>> proposed. The above location would diminish the code duplication.
>
> Hm, I guess I wasn't thinking clearly - in the case where we delegate the
> call, we should still instrument the calling function. Your change is
> correct - feel free to commit.
>
> However, could you please look at EmitConstructorBody as well? It does not
> emit a counter increment today in the case where it delegates from the
> complete constructor to the base constructor. I suspect that's another
> instance of this same problem.



More information about the cfe-commits mailing list