<div dir="ltr">On 12 August 2013 16:41, Shuxin Yang <span dir="ltr"><<a 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:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000">
    <div>Thank you very much for sharing you
      concerns.  I read this mail carefully, it seems we had little
      miscommunications. <br>
      I hope I clarify in this mail:-). See the interleaving text. <br><div>
      <br>
      <br>
      On 8/12/13 3:41 PM, Nick Lewycky wrote:<br>
    </div></div><div>
    <blockquote type="cite">
      <div dir="ltr"><br>
        <div class="gmail_extra">
          <div class="gmail_quote">
            <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
              <div bgcolor="#FFFFFF" text="#000000">
                <div><br>
                  <br>
                  <blockquote type="cite">
                    <div dir="ltr">
                      <div class="gmail_extra">
                        <div class="gmail_quote">
                          <div><br>
                          </div>
                          <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                            <div bgcolor="#FFFFFF" text="#000000">
                              <div> >which in turn drives libLTO
                                through the API.<br>
                                <br>
                              </div>
                              Depending on the what kind of info
                              "something" else need to drive the libLTO.
                              <br>
                              In general it is very bad idea, if
                              "something else" need micro-management.</div>
                          </blockquote>
                          <div><br>
                          </div>
                          <div>libLTO is part of the linker that uses
                            it. </div>
                        </div>
                      </div>
                    </div>
                  </blockquote>
                  <br>
                </div>
                No! Absolutely not!</div>
            </blockquote>
            <div><br>
            </div>
            <div>Fair enough. I meant "libLTO is part of the linker that
              uses it" in the same sense that a networking library is
              part of the web browser that uses it. The library
              shouldn't be off deciding to do things of its own accord,
              it should provide an API that allows something else to
              accomplish its task.</div>
          </div>
        </div>
      </div>
    </blockquote></div>
    I don't think such comparison is precise.  For app with networking
    lib, the "braid" reside at app side because the app define the
    behavior. <br>
    For linker+libLTO, I believe the "brain" should reside at libLTO
    side, as it is far more complicate (although our current implement
    is bit simple). <br></div></blockquote><div><br></div><div>I'm afraid I don't agree. We can agree to disagree on this point, it isn't necessary for us to agree here to make forwards progress.</div><div><br>

</div><div>From my point of view, the program that the user calls is ld. That ld is responsible for fulfilling its promises to the user, who does not know or care what libraries ld is using under the hood. We've taken the direction that we'll add new features to libLTO lazily, when there's a demand from a linker that wants them, but that shouldn't be confused for deliberately hiding functionality from the linker.</div>

<div><br></div><div>And it is confusing because there *are* things that libLTO is deliberately hiding: all the various changes in LLVM's C++ API.</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div bgcolor="#FFFFFF" text="#000000">I believe GNU gold is a good in designing the interface.  In the
    case of gold+libLTO, the "brain" is embodied by "tool/gold/*.cpp."<br></div></blockquote><div><br></div><div>There's very little logic in tools/gold. It's either in llvm proper, or in gold proper. Both libLTO and LLVMgold are thin wrappers.</div>

<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000">
    Anybody can change to whatever he/she like. Although it dose call
    APIs, it dose not have to. I can directly call those c++ code <br>
    dancing behind the API.  This is the "stable API" I'm talking about.
</div></blockquote><div><br></div><div>Okay. As a matter of terminology, I've been using "stable" to mean "unchanging", synonymous with ABI locked or ABI fixed.</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div bgcolor="#FFFFFF" text="#000000"><div><blockquote type="cite"><div dir="ltr">
<div class="gmail_extra"><div class="gmail_quote"><div>I don't see this as a very bad idea or as
              micro-management.<br></div>
          </div>
        </div>
      </div>
    </blockquote>
    <br></div>
    I didn't see that either until I start implementing stuff.  <br><div>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <div>In this regard, I don't see a difference between libLTO
              and other libraries like libPNG or netlib or freetype.
              (There is a difference in that we want libLTO to be a very
              high-level interface instead of exposing the details of
              .bc files, entirely unlike what libPNG does for PNG or
              freetype does for font files.)</div>
          </div>
        </div>
      </div>
    </blockquote>
    <br></div>
    Similar in concept. Concept only. <br><div>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
              <div bgcolor="#FFFFFF" text="#000000">
                <div>
                  <blockquote type="cite">
                    <div dir="ltr">
                      <div class="gmail_extra">
                        <div class="gmail_quote">
                          <div>Having a default setting with the ability
                            to override it is a sensible convenience for
                            users of libLTO.</div>
                        </div>
                      </div>
                    </div>
                  </blockquote>
                  <br>
                  <br>
                  <blockquote type="cite">
                    <div dir="ltr">
                      <div class="gmail_extra">
                        <div class="gmail_quote">
                          <div><br>
                          </div>
                          <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                            <div bgcolor="#FFFFFF" text="#000000">Take
                              Apple ld as example,  if I want to change
                              LTO in a way such that I don't want to
                              load all module, <br>
                              I just want to load summary info. Current
                              APIs are not sufficient. I have to modify
                              the API, or add new APIs<br>
                              to that matter, in the mean time, I need
                              release the new ld to the user in order to
                              accomodate the change. <br>
                              that is nightmare. </div>
                          </blockquote>
                          <div><br>
                          </div>
                          <div>The point of libLTO is to provide an
                            ABI-fixed library, isolating the linker from
                            llvm's internals. </div>
                        </div>
                      </div>
                    </div>
                  </blockquote>
                </div>
                It is not "fixed", it is changing constantly.</div>
            </blockquote>
            <div><br>
            </div>
            <div>The only reason libLTO exists at all is to give the
              linker something to link against which will have a fixed
              ABI. Same with "libclang" on the clang side.</div>
          </div>
        </div>
      </div>
    </blockquote></div>
    It is slightly different in the case of libLTO+linker. <br>
    <br>
    clang + libclang are tightly bound in terms of release. If you are
    not happy with particular API, you can change to whatever you feel
    more comfortable. <br>
    <br>
    The linker is usually release independently. The compiler has less
    control, if the API between compiler and linker is constantly
    changing.<br>
    Keeping backward compatability is a big problem. <br></div></blockquote><div><br></div><div>Right. libLTO is supposed to be that solution, by giving the linker a stable ABI (and API) to link against, and handling whatever changes in the LLVM C++ API behind the scenes. Put another way, a linker built against libLTO version X should work with version Y for all Y>X forever, without even a recompile (assuming the linker was built to load libLTO dynamically).</div>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000"><div><blockquote type="cite">

<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">
            <div>Thus far it's LLVM policy that the *whole and entire* C
              API is ABI-fixed forever, and I've argued a few times on
              the mailing list that this can't be right, and that only
              libLTO and libClang ought to be ABI locked.</div>
            <div><br>
            </div>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
              <div bgcolor="#FFFFFF" text="#000000"> E.g. the APIs used
                to take for granted the libLTO return only one objects,
                <br>
                now I need to return multiple.<br>
              </div>
            </blockquote>
            <div><br>
            </div>
            <div>Yes, and that's a problem. Not your problem really,
              except to the degree that you inherited it. The existing
              APIs in libLTO weren't nearly forwards-compatible enough,
              and now we're in trouble.</div>
            <div><br>
            </div>
            <div>Unless we figure out something clever, we may have to
              add a whole new set of functions to libLTO, and not
              deprecate the existing ones (at least, not unless we get
              consensus on llvm-dev that it's okay to break our previous
              ABI promise).</div>
            <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
              <div bgcolor="#FFFFFF" text="#000000">
                <div>
                  <blockquote type="cite">
                    <div dir="ltr">
                      <div class="gmail_extra">
                        <div class="gmail_quote">
                          <div>That in turn leads to a few design
                            decisions. The API is designed to refer to
                            high-level concepts instead of the details
                            of llvm's actual behaviour. Things like
                            module lazy loading or setting the
                            datalayout are excluded from the API. Flags
                            are even more private, surely we should be
                            able to change flags in LLVM's libraries
                            without worrying about breaking linkers.</div>
                          <div><br>
                          </div>
                          <div>If the linker needs to do something where
                            it matters how llvm is implemented -- you
                            mention loading summary info, I'll assume
                            you mean lazy-loading the module such that
                            function bodies aren't loaded -- then the
                            linker doesn't use libLTO at all, but uses
                            llvm directly. Conversely, libLTO knows all
                            about llvm and will lazy-load .bc files
                            without being asked to.</div>
                          <div><br>
                          </div>
                          <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                            <div bgcolor="#FFFFFF" text="#000000">Sure,
                              "something else" can control the libLTO,
                              if it want. In my case, if "something
                              else" want specify <br>
                               a workdir, then go ahead. Otherwise, the
                              libLTO use default one. Is there any wrong
                              here?</div>
                          </blockquote>
                          <div><br>
                          </div>
                          <div>At a high level that sounds fine to me.
                            The wrong part is using flags to do it.</div>
                        </div>
                      </div>
                    </div>
                  </blockquote>
                </div>
                then how to change the behavior for say, debugging
                purpose. <br>
              </div>
            </blockquote>
            <div><br>
            </div>
            <div>Debugging is special. In theory, you don't even need to
              commit to upstream for debugging, but it's fine to add
              features that are helpful. We have that sort of thin all
              over llvm. libLTO has addDebugOptions to permit this sort
              of debugging usage, but it shouldn't be used in the
              non-debugging case.</div>
          </div>
        </div>
      </div>
    </blockquote>
    <br></div>
    Passing flags LTO is annoying and it is a sort of high-tech. <br>
    Bill's attribute-stuff is a way to pass some flags down the roads. <br>
    <br>
    How about passing -O3 -floop-vecotroize to make LTO and post-LTO
    code works. (The opt-level is -O2, had vectorize-flags is off by
    default). <br></div></blockquote><div><br></div><div>Right, this is a great example. I would argue that we absolutely should not offer such control to libLTO, not by flags or environment variables or C API or anything. Why? Because it locks the entirety of LLVM to offering a "loop vectorizer" forever. What happens in LLVM 4.0 when we have a "global vectorizer" or "common vectorizer" or some other name? We've removed optimizations before (global common subexpression elimination, gvnpre, ...) and we should have the freedom to continue to do so.</div>

<div><br></div><div>Now, suppose along comes a linker vendor who says "as a feature, my users can specify -floop-vectorize or other flags to control which optimizations get run at link time". Do we refuse? Do we tell them it's okay, but we reserve the right to break these flags at any time (and then what, we can't catch typos because they could just be names of old optz'ns we don't support)? But I actually don't think giving control of this is a *feature* -- it can only really used as a workaround for bugs (or exotic stuff like kernel code where the vector register unit hasn't been initialized yet, but I am okay with having a flag to control whether we're allowed to use a certain class of instructions -- yet not okay with disabling individual optimizations).</div>

<div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000">We may (likely) have better way in the future to pass these flags to
    LTO, <br>
    but we have to pass the these flags the it to make the existing code
    work, at least for the time being. <br><div><div>
    <br>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
              <div bgcolor="#FFFFFF" text="#000000">
                <div>
                  <blockquote type="cite">
                    <div dir="ltr">
                      <div class="gmail_extra">
                        <div class="gmail_quote">
                          <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                            <div bgcolor="#FFFFFF" text="#000000">
                              <div>
                                <blockquote type="cite">
                                  <div dir="ltr">
                                    <div class="gmail_extra">
                                      <div class="gmail_quote">
                                        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Adding

                                          flags to linker instead, I
                                          think that is wrong direction.
                                          Linker dose not have data
                                          structure which libLTO dose.</blockquote>
                                        <div><br>
                                        </div>
                                        <div>This is the discussion to
                                          have. What things do you need
                                          here which you don't think
                                          should be exposed through the
                                          API, and yet you want to be
                                          exposed for you?</div>
                                      </div>
                                    </div>
                                  </div>
                                </blockquote>
                              </div>
                              I actually discuss with Nick @ Apple
                              before.  The conclusion is linker must be
                              LTO oblivious, <br>
                              it should think in symbol-way, and talk in
                              symbol way (as with GNU gold). It would
                              otherwise<br>
                               very very troublesome both for linker and
                              libLTO. <br>
                            </div>
                          </blockquote>
                          <div><br>
                          </div>
                          <div>And now you're discussing it with me. I
                            also agree that the linker should
                            communicate primarily in symbols and about
                            symbols with libLTO.</div>
                          <div><br>
                          </div>
                          <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                            <div bgcolor="#FFFFFF" text="#000000">On the
                              other hand, we now have two linkers
                              support LTO. There are different way to
                              control <br>
                              the libLTO (even for simple task, like
                              save intermediate files), how messy?<br>
                              <br>
                              I'd like to move all these stuff to libLTO
                              to have a unified control. <br>
                            </div>
                          </blockquote>
                          <div><br>
                          </div>
                          <div>I have no problem with a unified control.</div>
                          <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                            <div bgcolor="#FFFFFF" text="#000000">
                              <div>
                                <blockquote type="cite">
                                  <div dir="ltr">
                                    <div class="gmail_extra">
                                      <div class="gmail_quote">
                                        <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
                                          <div>libLTO is intended to be
                                            used as a library, it may
                                            not get a chance to parse
                                            flags.<br>
                                          </div>
                                          It has to. Prior to my change,
                                          linkers (GNU linker and Apple
                                          ld) pass arch to linker, via a
                                          function<br>
                                          confusingly called, something
                                          like "add.*debug.*options".</blockquote>
                                        <div><br>
                                        </div>
                                        <div>Can't. If we allow this,
                                          every flag in every part of
                                          LLVM that libLTO links against
                                          is baked into the C ABI
                                          forever.</div>
                                        <div><br>
                                        </div>
                                        <div>Of course addDebugOptions
                                          does allow this, but it's
                                          named (and I thought
                                          documented in the comments)
                                          such that anybody using it
                                          knows they're using a
                                          non-stable non-production
                                          debugging API. Anybody using
                                          addDebugOptions for something
                                          other than debugging libLTO is
                                          living outside the ABI
                                          guarantees.</div>
                                      </div>
                                    </div>
                                  </div>
                                </blockquote>
                              </div>
                              addDebugOptions is misnomer. It is also
                              passes essential flags like -arch=x86. 
                              Without such flags, <br>
                              the LTO dose not even compile. <br>
                            </div>
                          </blockquote>
                          <div><br>
                          </div>
                          <div>That sounds like a nice bug you've got
                            there! Wouldn't want anything to happen to
                            it. It'd be a shame if breaks before you
                            manage to add a liblto_set_arch() function
                            for it.</div>
                        </div>
                      </div>
                    </div>
                  </blockquote>
                  <br>
                  <blockquote type="cite">
                    <div dir="ltr">
                      <div class="gmail_extra">
                        <div class="gmail_quote">
                          <div>* Honestly, I looked and couldn't find a
                            -arch flag that libLTO would interpret. How
                            sure are you about this?</div>
                        </div>
                      </div>
                    </div>
                  </blockquote>
                </div>
                Perhaps not -arch flags.<br>
                But at least some flags are passed this way.  I remember
                we use this way to pass -fast-math before Bill's
                attribute-stuff is working. <br>
                <div> <br>
                  <br>
                  <blockquote type="cite">
                    <div dir="ltr">
                      <div class="gmail_extra">
                        <div class="gmail_quote">
                          <div>In case it isn't completely clear, flags
                            are absolutely right out. Either you will
                            revert this patch, or I will revert it for
                            you.</div>
                        </div>
                      </div>
                    </div>
                  </blockquote>
                </div>
                I have no alternative.  If I introduce a workdir, I need
                to have to way to inform linker-plugin to get rid of
                way. <br>
                This is another example why those API sucks.<br>
              </div>
            </blockquote>
            <div><br>
            </div>
            <div>You don't have the source code to the linker?</div>
          </div>
        </div>
      </div>
    </blockquote></div></div>
    I can modify linker source code. The problem is how to make sure all
    users get the modified linker to work with the new compilers. <br>
    It going to be very messy. right? <br></div></blockquote><div><br></div><div>True. You have a deployment problem where instead of shipping just a new libLTO, you ship a new libLTO (and all older linkers must continue to work with it), and then ship a new linker taking advantage of the new libLTO APIs. Sorry, but I think this is a natural consequence of the fact that libLTO needs to be ABI-locked.</div>

<div><br></div><div>(Also, in reality, if you can solve the deployment problem for libLTO, then you can solve the deployment problem for libLTO+ld. Yes it'll be more work.)</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

<div bgcolor="#FFFFFF" text="#000000">Unlike the clang and clanglib, they are so "close" in terms of
    release.  We can change at will. <br><div>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <div><br>
            </div>
            <div>Let's focus on this, it sounds like this is the key
              problem. What's wrong with modifying the linker if you
              want to change the behaviour of your linker?</div>
          </div>
        </div>
      </div>
    </blockquote></div>
    How often dose a user check if the linker is up-to-minute? <br><div>
    <br>
    <br>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
              <div bgcolor="#FFFFFF" text="#000000">
                <div>
                  <blockquote type="cite">
                    <div dir="ltr">
                      <div class="gmail_extra">
                        <div class="gmail_quote">
                          <div> I'm sorry you decided to land three
                            things together in one patch, please
                            remember not to do that in the future.<br>
                          </div>
                          <br>
                        </div>
                      </div>
                    </div>
                  </blockquote>
                </div>
                Ok, tell me how to create temp workding directory right.
                How to save temp files right both for gold and Apple ld.
                <br>
              </div>
            </blockquote>
            <div><br>
            </div>
            <div>*Why*? Are you implementing this as a linker feature
              you intend to ship in the real linker? Or is this to debug
              the innards of libLTO?</div>
          </div>
        </div>
      </div>
    </blockquote>
    <br></div>
    It is not linker's feature, it is absolutely libLTO's own biz.
    Creating a workdir is neat way to organize intermediate files, <br>
    we can certainly use a messy way to organize the intermediate files
    without creating workdir.  <br><div>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <div><br>
            </div>
            <div>The only case I *am* okay with flags is when we all
              agree they're flags for debugging the internals of libLTO,
            </div>
          </div>
        </div>
      </div>
    </blockquote></div>
    To large extend, it is for trouble-shooting purpose. <br><div>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <div>and that we don't ship products that rely on them. </div>
          </div>
        </div>
      </div>
    </blockquote></div>
    The product will not rely on it.</div></blockquote><div><br></div><div><br></div><div>Okay. Got it. So I have a few thoughts on this.</div><div><br></div><div>First of all, why don't we expose the fact that we produce native .o files? Because we don't want to necessarily require files. lto_codegen_compile returns a pointer to the memory containing the file in memory. Hilariously this means the libLTO writes out to disk, loads it into memory, hands it off to LLVMgold which writes it back down to disk again and hands it off to gold, which reads it back into memory. And yet it's still the right interface. libLTO should stop writing to disk and actually produce .o in RAM directly, and gold should learn to read from RAM directly.*</div>

<div><br></div><div>Secondly, if we aren't exposing the fact that we produce native .o files, should we be exposing a knob that lets us control the working directory? Probably not, but it's not unreasonable. If we're going to write to disk it's polite to let the caller choose where. If we don't write to disk, the API can be trivially implemented by doing nothing.</div>

<div><br></div><div>You suggest $PWD/unique-tmp-workdir instead of /tmp. Consider $TMP, or on Windows $TEMP? I don't mind if we're smart enough to pick good defaults, but I can absolutely imagine a linker that to keep its temp files in a specific directory. Suppose a mobile OS that runs the linker on the phone, where they have strict disk quotas. It's important to put the files in the right places, so they get counted against the right quotas. Also, for cleanup in the event of a crash (assume it wipes the whole directory tree). I really think lto_set_tempdir would be a good API to have in libLTO, and poses no risk of being unimplementable in the future.</div>

<div><br></div><div><span style="font-family:arial,sans-serif;font-size:13px">Thirdly, I'm not convinced that lto_codegen_get_files_need_</span><span style="font-family:arial,sans-serif;font-size:13px">remove needs to exist. Why not do the file deletion in lto_codegen_dispose?</span><br>

</div><div><br></div><div>* Actually, Rafael added lto_codegen_compile_to_file in r128108 and we've had numerous LLVM release since then. Now we have to support writing to files forever; even if we support writing to memory, we can't remove the writing-to-file path. Fortunately we can continue to implement this API in the future by codegen'ing to memory plus a small amount of code to write to disk. Still, I'm a little bit sad inside.</div>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000"><div><blockquote type="cite">

<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>I explicitly called that out. If the only purpose of
              these was to implement debugging features, then I'm sorry
              for the miscommunication!</div>
            <div><br>
            </div>
            <div>If the intention is to let libLTO run on machines that
              don't have /tmp (this is what I thought), we should give
              libLTO an API that lets the linker decide where the files
              go. </div>
          </div>
        </div>
      </div>
    </blockquote></div>
    I choose $PWD/unique-tmp-workdir instead of /tmp/xxx. <br>
    I should try /tmp/xxx if $PWD/unique-tmp-workdir dose not work. <br><div>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <div>Maybe it wants to do smart things like putting it in a
              directory with the right permissions, or which is
              scheduled for cleanup in the event of a crash.</div>
          </div>
        </div>
      </div>
    </blockquote></div>
    That is in TODO list. I try to install the sig handler, but the
    supporting routines ignore directory (it only delete regular file on
    signal).<br></div></blockquote><div><br></div><div>Hold on, what if the linker installs its own signal handler? If lto_codegen_dispose/lto_module_dispose aren't safe to call during a signal handler, what do you think about providing a signal-safe-emergency-shutdown API to libLTO? It should only be as hard to implement as factoring out the code you were going to write anyways.</div>

<div><br></div><div>Nick</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div bgcolor="#FFFFFF" text="#000000">

<div><blockquote type="cite"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div>If the intention is to implement something like -r, or
              to implement some new feature like -shared but which emits
              a shared-bitcode file instead of a shared-object,</div>
          </div>
        </div>
      </div>
    </blockquote></div>
    I'm not sure if bit-code can be encapsulated in *.so (*.a sure
    work), and if it's good practice to do so. <br>
    At least, I'm not happy to see a *.so is not binary, the app will
    sure complains.<div><br>
    <br>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <div> then I don't think that controlling the working
              directory then pulling out intermediate files is the right
              design anyways.</div>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div class="gmail_extra">
          <div class="gmail_quote">
            <div><br>
            </div>
            <div>Or are you doing something else?</div>
          </div>
        </div>
      </div>
    </blockquote>
    <br></div>
    I guess I'm doing something else.  Suppose you are building libmy.so
    from a.o b.o. c.o d.o, where c.o d.o is bit-code.<br>
    the LTO manage to compile c.o+d.o into t.o. Or if the c.o + d.o is
    huge, the LTO split them into several partitions, <br>
    the compile partitions in to t1.o t2.o ... tn.o. <br>
    <br>
    The intermediate files I'm talking about are those t*.o. libLTO hand
    these intermediate files to linker, *NOT* know they<br>
    they will die. It is up to linker to get rid of them. <br>
    <br>
    After linker get these intermediate files, and move on the linker
    the final libmy.so. Before exit, it remove all these intermediate
    files. <br>
    <br>
    As you can see, we certainly can live without workdir. It is just a
    neat way to organize them, and also obviate the need to <br>
    create unique name for each intermediate file to avoid name
    conflict. This is especially handy if we want to compare <br>
    performances etc. <br>
    <br>
    <br>
    <br>
  </div>

</blockquote></div><br></div></div>