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 <vvasi...@cern.ch <mailto:vvasi...@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 <vvasi...@cern.ch
    <mailto:vvasi...@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
        <vvasi...@cern.ch <mailto:vvasi...@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@cs.uiuc.edu <mailto:cfe-commits@cs.uiuc.edu>
            http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits







    _______________________________________________
    cfe-commits mailing list
    cfe-commits@cs.uiuc.edu  <mailto:cfe-commits@cs.uiuc.edu>
    http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits


    _______________________________________________
    cfe-commits mailing list
    cfe-commits@cs.uiuc.edu <mailto:cfe-commits@cs.uiuc.edu>
    http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits



_______________________________________________
cfe-commits mailing list
cfe-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to