[llvm] r188188 - Misc enhancements to LTO:

Shuxin Yang shuxin.llvm at gmail.com
Mon Aug 12 15:00:48 PDT 2013


On 8/12/13 2:32 PM, Nick Lewycky wrote:
> On 12 August 2013 13:29, Shuxin Yang <shuxin.llvm at gmail.com 
> <mailto:shuxin.llvm at gmail.com>> wrote:
>
>     On 8/12/13 1:03 PM, Nick Lewycky wrote:
>>     On 12 August 2013 12:22, Shuxin Yang <shuxin.llvm at gmail.com
>>     <mailto:shuxin.llvm at gmail.com>> wrote:
>>
>>         On 8/12/13 12:16 PM, Nick Lewycky wrote:
>>
>>             Shuxin Yang wrote:
>>
>>                 Author: shuxin_yang
>>                 Date: Mon Aug 12 13:29:43 2013
>>                 New Revision: 188188
>>
>>                 URL:
>>                 http://llvm.org/viewvc/llvm-project?rev=188188&view=rev
>>                 Log:
>>                 Misc enhancements to LTO:
>>
>>                    1. Add some helper classes for partitions. They
>>                 are designed in a
>>                       way such that the top-level LTO driver will not
>>                 see much difference
>>                       with or without partitioning.
>>
>>                    2. Introduce work-dir. Now all intermediate files
>>                 generated during
>>                       LTO phases will be saved under work-dir. User
>>                 can specify the workdir
>>                       via -lto-workdir=/path/to/dir. By default the
>>                 work-dir will be
>>                       erased before linker exit. To keep the workdir,
>>                 do -lto-keep, or -lto-keep=1.
>>
>>                      TODO: Erase the workdir, if the linker exit
>>                 prematurely.
>>                        We are currently not able to remove directory
>>                 on signal. The support
>>                        routines simply ignore directory.
>>
>>                    3. Add one new API
>>                 lto_codegen_get_files_need_remove().
>>                       Linker and LTO plugin will communicate via this
>>                 API about which files
>>                      (including directories) need to removed before
>>                 linker exit.
>>
>>
>>             Please revert. Adding new flags to libLTO is the wrong
>>             direction (in spite of the ones that exist -- consider
>>             those grandfathered in).
>>
>>         It dose not make sense. Without flags, how do you manage to
>>         triage the correctness and performance problem?
>>
>>
>>     Something else has flags,
>
>     What are "something else"?  As far as I know, there are only two
>     fall into this category:
>
>        - Apple linker, and
>        - GNU gold.
>
>       The former communicate with the libLTO directly with these APIs,
>     while GNU gold communicate
>     with the libLTO via, which I called adapter.
>
>
> You committed the patch, you tell me. What did this patch intend to 
> change the behaviour of?
As I already told you, the only "something else" I'm aware of are Apple 
linker and GNU linker.

How can change their behavior, they are released as binary.

I did a new API, which dose not affect Apple ld. Of course, it dose not 
change GNU ld either.
However, we need to change gold-plugin (tool/gold/gold-plugin.cpp) a 
lit, such that,

    it get a list of files to be removed from libLTO.xxx.

    Prior to my change, the gold-plugin.cpp delete the intermediate 
object file as it has only
one intermediate file. It was working ok, but not anymore.

   The linker see no difference.



>
>        Directly calling these APIs is really bad idea. I manage to
>     convince the black-belt guru Nick @ Apple to
>     not directly calling these APIs in the new ld design. The linker's
>     should be LTO oblivious, the linker
>     should expose symbol-related interface instead of LTO-control
>     interfaces.
>
>
> Directly calling which APIs?
>
> What do you mean by "LTO oblivious"? Oblivious towards whether 
> optimization is being performed?

The linker dose not have any functions regarding lto,  take a look of 
GNU gold API or tool/gold/*.cpp

>
>     >which in turn drives libLTO through the API.
>
>     Depending on the what kind of info "something" else need to drive
>     the libLTO.
>     In general it is very bad idea, if "something else" need
>     micro-management.
>
>
> libLTO is part of the linker that uses it.

No! Absolutely not!
> Having a default setting with the ability to override it is a sensible 
> convenience for users of libLTO.


>
>     Take Apple ld as example,  if I want to change LTO in a way such
>     that I don't want to load all module,
>     I just want to load summary info. Current APIs are not sufficient.
>     I have to modify the API, or add new APIs
>     to that matter, in the mean time, I need release the new ld to the
>     user in order to accomodate the change.
>     that is nightmare.
>
>
> The point of libLTO is to provide an ABI-fixed library, isolating the 
> linker from llvm's internals.
It is not "fixed", it is changing constantly. E.g. the APIs used to take 
for granted the libLTO return only one objects,
now I need to return multiple.

> 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.
>
> 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.
>
>     Sure, "something else" can control the libLTO, if it want. In my
>     case, if "something else" want specify
>      a workdir, then go ahead. Otherwise, the libLTO use default one.
>     Is there any wrong here?
>
>
> At a high level that sounds fine to me. The wrong part is using flags 
> to do it.
then how to change the behavior for say, debugging purpose.

>>         Adding flags to linker instead, I think that is wrong
>>         direction. Linker dose not have data structure which libLTO dose.
>>
>>
>>     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?
>     I actually discuss with Nick @ Apple before.  The conclusion is
>     linker must be LTO oblivious,
>     it should think in symbol-way, and talk in symbol way (as with GNU
>     gold). It would otherwise
>      very very troublesome both for linker and libLTO.
>
>
> And now you're discussing it with me. I also agree that the linker 
> should communicate primarily in symbols and about symbols with libLTO.
>
>     On the other hand, we now have two linkers support LTO. There are
>     different way to control
>     the libLTO (even for simple task, like save intermediate files),
>     how messy?
>
>     I'd like to move all these stuff to libLTO to have a unified control.
>
>
> I have no problem with a unified control.
>
>>         libLTO is intended to be used as a library, it may not get a
>>         chance to parse flags.
>>         It has to. Prior to my change, linkers (GNU linker and Apple
>>         ld) pass arch to linker, via a function
>>         confusingly called, something like "add.*debug.*options".
>>
>>
>>     Can't. If we allow this, every flag in every part of LLVM that
>>     libLTO links against is baked into the C ABI forever.
>>
>>     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.
>     addDebugOptions is misnomer. It is also passes essential flags
>     like -arch=x86.  Without such flags,
>     the LTO dose not even compile.
>
>
> 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.

> * Honestly, I looked and couldn't find a -arch flag that libLTO would 
> interpret. How sure are you about this?
Perhaps not -arch flags.
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.


> 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.
I have no alternative.  If I introduce a workdir, I need to have to way 
to inform linker-plugin to get rid of way.
This is another example why those API sucks.


> I'm sorry you decided to land three things together in one patch, 
> please remember not to do that in the future.
>
Ok, tell me how to create temp workding directory right. How to save 
temp files right both for gold and Apple ld.




-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130812/41260297/attachment.html>


More information about the llvm-commits mailing list