<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <br>
    <div class="moz-cite-prefix">On 5/13/13 10:37 AM, Manuel Klimek
      wrote:<br>
    </div>
    <blockquote
cite="mid:CAOsfVvnt+Aw3gV_3Z87EjBYdqqy-uPXfwTN6g24XTYr8v5gUdw@mail.gmail.com"
      type="cite">
      <div dir="ltr">On Mon, May 13, 2013 at 6:26 PM, Shuxin Yang <span
          dir="ltr"><<a moz-do-not-send="true"
            href="mailto:shuxin.llvm@gmail.com" target="_blank">shuxin.llvm@gmail.com</a>></span>
        wrote:<br>
        <div class="gmail_extra">
          <div class="gmail_quote">
            <blockquote class="gmail_quote" style="margin:0 0 0
              .8ex;border-left:1px #ccc solid;padding-left:1ex">
              <div bgcolor="#FFFFFF" text="#000000">
                <div class="im"> <br>
                  <div>On 5/13/13 10:21 AM, Manuel Klimek wrote:<br>
                  </div>
                  <blockquote type="cite">
                    <div dir="ltr">+richard smith, who proposed to
                      implement it this way
                      <div class="gmail_extra"><br>
                        <div class="gmail_quote">On Mon, May 13, 2013 at
                          6:08 PM, Shuxin Yang <span dir="ltr"><<a
                              moz-do-not-send="true"
                              href="mailto:shuxin.llvm@gmail.com"
                              target="_blank">shuxin.llvm@gmail.com</a>></span>
                          wrote:<br>
                          <blockquote class="gmail_quote"
                            style="margin:0 0 0 .8ex;border-left:1px
                            #ccc solid;padding-left:1ex">
                            <div bgcolor="#FFFFFF" text="#000000"> I'm
                              afraid this change is going to open a big
                              can of worms. You are essentially promote
                              <br>
                              private member function to be public. Such
                              practice should be generally avoided even
                              for <br>
                              the local/private class which is used in
                              small scope, let alone these fundamental
                              structures <br>
                              which are extensively used in the
                              compiler. <br>
                              <div> <br>
                                > object needs the destructor called
                                after its memory was freed <br>
                                <br>
                              </div>
                              If the block of memory containing
                              APFloat/APInt is already freed, how do you
                              know <br>
                              the state of these objects are still
                              valid? Depending on the implementation,
                              free-operation <br>
                              might clobber the memory with some special
                              value for debugging purpose. If it were
                              safe<br>
                              to call needsCleanup(), why not directly
                              call the destructor? Is needsCleanup()
                              sufficient <br>
                              and/or necessary condition for calling the
                              destructor? How do we keep them in sync in
                              the <br>
                              future?<br>
                            </div>
                          </blockquote>
                          <div><br>
                          </div>
                          <div>APFloat/APInt is placement new'ed in the
                            code in question, and thus we need to call
                            the destructors of any objects that do
                            memory allocation themselves. We can save
                            those destructor calls otherwise.</div>
                        </div>
                      </div>
                    </div>
                  </blockquote>
                </div>
                I understand that if you place a non-plain-old-data in a
                union, you have to construct it via placement new, <br>
                and explicitly destruct it.  I come across similar
                problem when I implement unsafe fadd/fsub optimization <br>
                half year ago. <br>
                <br>
                My questions are : <br>
                  - why do you need to call function xyz() before
                calling the destructor. <br>
                  - if the memory is already freed, why do you know it
                is safe to call syz(). <br>
                     The object may not in valid state.<br>
              </div>
            </blockquote>
            <div><br>
            </div>
            <div style="">Ah, now I understand the question :)</div>
            <div style=""><br>
            </div>
            <div style="">So, in clang, the lifetime of the placement
              new'ed APFloat/APInt is basically coupled to the buffer of
              where they are placement new'ed into, which is very
              different from where the objects are created. Thus, when
              the objects are placement-new'ed, clang registers cleanup
              callbacks with that structure (which basically just calls
              the destructor for those objects before the underlying
              placement-new-buffer is deallocated). Since there might be
              a ton of APFloat/APInt values constructed inside a C++
              AST, we want to minimize the number of registered
              callbacks (all of them use memory and precious runtime).</div>
          </div>
        </div>
      </div>
    </blockquote>
    I'm sorry, I don't know the internal of clang.<br>
    How about using a enum is keep track of the state of the buffer (if
    it contains a valid APFloat/APInt/whatever), and so <br>
    you just need to register one call-back like this:<br>
    <br>
     my-call-back(the-buffer) {<br>
         switch(buffer-state) <br>
         case is_APFloat:<br>
              ((APFloat*)&buffer-state->data)::~APFloat();<br>
              buffer-state = invalid;<br>
         case is_APint:<br>
               ...<br>
         case is_plain-old-data:<br>
              do nothing<br>
     }<br>
    <br>
    <blockquote
cite="mid:CAOsfVvnt+Aw3gV_3Z87EjBYdqqy-uPXfwTN6g24XTYr8v5gUdw@mail.gmail.com"
      type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <div style="">To that end, we call needsCleanup() in order
              to check whether we need to register a "destructor
              callback" that needs to be called before throwing away the
              memory. (see the clang review CL I pointed to)</div>
            <div style=""><br>
            </div>
            <br>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
  </body>
</html>