[PATCH] Inconsistency in Preprocessor::ReleaseMacroInfo(MacroInfo *MI)

Vassil Vassilev vasil.georgiev.vasilev at cern.ch
Mon Aug 4 00:47:42 PDT 2014


Hi Richard,
   Thanks for the fix!

   Unfortunately it doesn't help for cling case. I implement a 
removeMacro routine using ReleaseMacroInfo. ReleaseMacroInfo allowed me 
to implement efficiently the removal of a macro instead of dragging a 
long def undef chains, for example.
   IIUC it allowed some memory reduction in some cases for clang, too. 
Is there any chance to keep the ReleaseMacroInfo upstream?
Vassil
On 08/04/2014 01:50 AM, Richard Smith wrote:
> Fixed in a much more simple way in r214675. Thanks for reporting!
>
>
> On Sun, Aug 3, 2014 at 11:52 AM, Vassil Vassilev <vvasilev at cern.ch 
> <mailto:vvasilev at cern.ch>> wrote:
>
>     I will try just one more time and then shut up :)
>
>
>     diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp
>     index 5f38387..000ea7a 100644
>     --- a/lib/Lex/PPDirectives.cpp
>     +++ b/lib/Lex/PPDirectives.cpp
>     @@ -94,6 +94,19 @@
>     Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,
>      /// error in the macro definition.
>      void Preprocessor::ReleaseMacroInfo(MacroInfo *MI) {
>        // Don't try to reuse the storage; this only happens on error
>     paths.
>     +
>     +  // If this is on the macro info chain, avoid double deletion on
>     teardown.
>     +  MacroInfoChain *current = MIChainHead;
>     +  while (MacroInfoChain *I = current) {
>     +    if (&(I->MI) == MI) {
>     +      I->Next = (I->Next) ? I->Next->Next : 0;
>     +      if (I == MIChainHead)
>     +        MIChainHead = I->Next;
>
>     +      break;
>     +    }
>     +    current = I->Next;
>     +  }
>     +
>        MI->~MacroInfo();
>      }
>
>
>     On 03/08/14 20:47, Vassil Vassilev wrote:
>>     Hi,
>>       Sorry overlooked, thanks for pointing it out!
>>       I hope this is what we want.
>>     Vassil
>>
>>     diff --git a/lib/Lex/PPDirectives.cpp b/lib/Lex/PPDirectives.cpp
>>     index 5f38387..000ea7a 100644
>>     --- a/lib/Lex/PPDirectives.cpp
>>     +++ b/lib/Lex/PPDirectives.cpp
>>     @@ -94,6 +94,19 @@
>>     Preprocessor::AllocateVisibilityMacroDirective(SourceLocation Loc,
>>      /// error in the macro definition.
>>      void Preprocessor::ReleaseMacroInfo(MacroInfo *MI) {
>>        // Don't try to reuse the storage; this only happens on error
>>     paths.
>>     +
>>     +  // If this is on the macro info chain, avoid double deletion
>>     on teardown.
>>     +  MacroInfoChain *current = MIChainHead;
>>     +  while (MacroInfoChain *I = current) {
>>     +    if (&(I->MI) == MI) {
>>     +      I->Next = (I->Next) ? I->Next->Next : 0;
>>     +      if (I == MIChainHead)
>>     +        MIChainHead = I;
>>     +      break;
>>     +    }
>>     +    current = I->Next;
>>     +  }
>>     +
>>        MI->~MacroInfo();
>>      }
>>
>>     On 03/08/14 20:28, Yaron Keren wrote:
>>>     Hi,
>>>
>>>     MIChainHead is a pointer to the head of a linked list
>>>     of MacroInfoChain nodes, each containing a MacroInfo
>>>     and MacroInfoChain*.
>>>
>>>     Why does the while loop modify MIChainHead on every iteration?
>>>     MIChainHead should be modified only if it points to the node
>>>     containing the removed MacroInfo MI. In all other cases it
>>>     should not change.
>>>
>>>     As it is now, the loop will always terminate with MIChainHead ==
>>>     nullptr.
>>>
>>>     Yaron
>>>
>>>
>>>
>>>     2014-08-03 21:10 GMT+03:00 Vassil Vassilev <vvasilev at cern.ch
>>>     <mailto:vvasilev at cern.ch>>:
>>>
>>>         Hi Yaron,
>>>           Yes I meant double destruction.
>>>         Vassil
>>>
>>>         On 03/08/14 20:08, Yaron Keren wrote:
>>>>         Hi Vassil,
>>>>
>>>>         Do you mean double destruction (not deletion) of MacroInfo
>>>>         first time in ReleaseMacroInfo and the second time in
>>>>         ~Preprocessor via  ~MacroInfoChain?
>>>>
>>>>           while (MacroInfoChain *I = MIChainHead) {
>>>>             MIChainHead = I->Next;
>>>>         I->~MacroInfoChain();
>>>>           }
>>>>
>>>>         or something else?
>>>>
>>>>         Yaron
>>>>
>>>>
>>>>
>>>>         2014-08-02 23:05 GMT+03:00 Vassil Vassilev
>>>>         <vvasilev at cern.ch <mailto:vvasilev at cern.ch>>:
>>>>
>>>>             Hi,
>>>>               In cases where ReleaseMacroInfo gets called and it
>>>>             doesn't cleanup the Preprocessor's MIChainHead can lead
>>>>             to double deletion. I am sending the patch that fixes
>>>>             the problem for me.
>>>>             Vassil
>>>>
>>>>
>>>>             diff --git a/lib/Lex/PPDirectives.cpp
>>>>             b/lib/Lex/PPDirectives.cpp
>>>>             index 5f38387..1a9b5eb 100644
>>>>             --- a/lib/Lex/PPDirectives.cpp
>>>>             +++ b/lib/Lex/PPDirectives.cpp
>>>>             @@ -94,6 +94,14 @@
>>>>             Preprocessor::AllocateVisibilityMacroDirective(SourceLocation
>>>>             Loc,
>>>>              /// error in the macro definition.
>>>>              void Preprocessor::ReleaseMacroInfo(MacroInfo *MI) {
>>>>                // Don't try to reuse the storage; this only happens
>>>>             on error paths.
>>>>             +
>>>>             +  // If this is on the macro info chain, avoid double
>>>>             deletion on teardown.
>>>>             +  while (MacroInfoChain *I = MIChainHead) {
>>>>             +    if (&(I->MI) == MI)
>>>>             +      I->Next = (I->Next) ? I->Next->Next : 0;
>>>>             +    MIChainHead = I->Next;
>>>>             +  }
>>>>             +
>>>>                MI->~MacroInfo();
>>>>              }
>>>>
>>>>             _______________________________________________
>>>>             cfe-commits mailing list
>>>>             cfe-commits at cs.uiuc.edu <mailto: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  <mailto: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 <mailto:cfe-commits at cs.uiuc.edu>
>     http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140804/666b97a4/attachment.html>


More information about the cfe-commits mailing list