[llvm-dev] RFC: LTO should use -disable-llvm-verifier

Mehdi Amini via llvm-dev llvm-dev at lists.llvm.org
Fri Sep 4 15:11:39 PDT 2015


> On Sep 4, 2015, at 11:38 AM, Peter Collingbourne <peter at pcc.me.uk> wrote:
> 
> On Fri, Sep 04, 2015 at 11:13:43AM -0700, Mehdi Amini wrote:
>> 
>>> On Sep 4, 2015, at 11:03 AM, Eric Christopher <echristo at gmail.com> wrote:
>>> 
>>> 
>>> 
>>> On Fri, Sep 4, 2015 at 12:48 AM Mehdi Amini <mehdi.amini at apple.com <mailto:mehdi.amini at apple.com>> wrote:
>>>> On Sep 4, 2015, at 12:22 AM, Eric Christopher <echristo at gmail.com <mailto:echristo at gmail.com>> wrote:
>>>> 
>>>> 
>>>> 
>>>> On Thu, Sep 3, 2015 at 11:45 PM Mehdi Amini <mehdi.amini at apple.com <mailto:mehdi.amini at apple.com>> wrote:
>>>> Hi,
>>>> 
>>>>> On Sep 2, 2015, at 7:31 PM, Peter Collingbourne via llvm-dev <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>>>>> 
>>>>> On Thu, Sep 03, 2015 at 01:10:42AM +0000, Eric Christopher wrote:
>>>>>> On Tue, Sep 1, 2015 at 10:43 AM Duncan P. N. Exon Smith <
>>>>>> dexonsmith at apple.com <mailto:dexonsmith at apple.com>> wrote:
>>>>>> 
>>>>>>> 
>>>>>>>> On 2015-Aug-31, at 18:09, Eric Christopher <echristo at gmail.com <mailto:echristo at gmail.com>> wrote:
>>>>>>>> 
>>>>>>>> 
>>>>>>>> 
>>>>>>>> On Mon, Aug 31, 2015 at 5:50 PM Duncan P. N. Exon Smith <
>>>>>>> dexonsmith at apple.com <mailto:dexonsmith at apple.com>> wrote:
>>>>>>>> 
>>>>>>>>> On 2015-Aug-31, at 12:21, Eric Christopher <echristo at gmail.com <mailto:echristo at gmail.com>> wrote:
>>>>>>>>> Yep. This is where I was going :)
>>>>>>>> 
>>>>>>>> Glad I found consensus, but I want to double-check that this makes
>>>>>>>> sense to add to the driver.  I didn't quite think through the
>>>>>>>> implications myself.
>>>>>>>> 
>>>>>>>> Since the driver doesn't know if there's any bitcode, or if LTO is
>>>>>>>> going to be invoked, it seems like I'll have to change the noasserts
>>>>>>>> driver to *always* pass the option to the linker just in case we are
>>>>>>>> doing LTO.  Is this reasonable?
>>>>>>>> 
>>>>>>>> Also, I realized that passing `-mllvm -disable-llvm-verifier` to ld64
>>>>>>>> is redundant... so I'm thinking `-mllvm -disable-verify`.  Make
>>>>>>>> sense?
>>>>>>>> 
>>>>>>>> *sigh* Reasons to hate the driver interface again...
>>>>>>>> 
>>>>>>>> I guess this is ok. Could possibly add it to the existing terrible
>>>>>>> "enable this pass" interface on liblto as well.
>>>>>>> 
>>>>>>> The linker doesn't know whether clang was built with asserts, though.
>>>>>>> 
>>>>>>> We could just make it implicit: move the decision to libLTO itself.  Given
>>>>>>> that clang and libLTO.dylib are different executables anyway -- and you
>>>>>>> might be interposing an asserts libLTO.dylib to use with an installed clang
>>>>>>> -- maybe it's even better?
>>>>>>> 
>>>>>>> 
>>>>>> *nod* We could do that. Seems better than the alternative.
>>>>> 
>>>>> +1
>>>>> 
>>>>>>>> I don't suppose ld64 could move to a model like we're talking about with
>>>>>>> lld that pcc is working on?
>>>>>>> 
>>>>>>> What specifically?
>>>>>> 
>>>>>> 
>>>>>> Ah, using the C++ interface to handle everything and not using libLTO at
>>>>>> all.
>>>>>> 
>>>>>> He can speak more to this though.
>>>>> 
>>>>> The C++ interface is much more convenient for a C++ program to use, but
>>>>> clients need to revlock themselves to LLVM in order to use it.
>>>>> 
>>>>> In theory the same does not apply to libLTO, but we do end up changing it
>>>>> occasionally to add new APIs which ld64 promptly starts using, so it isn't
>>>>> clear how much ld64 gains by relying on libLTO,
>>>> 
>>>> Backward/Forward compatibility?
>>>> Drop any version of clang/libLTO and still be able to use the system provided linker on any version of OS X?
>>>> Sounds like a valuable feature to me, which is what I believe was (is?) sought by the C API in general (but that’s another story).
>>>> 
>>>> 
>>>> Static linking against the parts of llvm you care about? There's nothing in the ld64 build system that means it can't do this :)
>>> 
>>> I’m not sure how is that supposed to work?
>>> I drop a new clang/libLTO on the system, clang generates bitcode, and libLTO handles it.
>>> 
>>> If ld64 was statically linked against LLVM, it couldn’t read the new bitcode right?
>>> 
>>> 
>>> Well sure, that's what Peter meant when he said revlocked. :)
>> 
>> I’m not sure we’re talking about the same thing, I may have misunderstood his point (“In theory the same does not apply to libLTO, but we do end up changing it
>> occasionally to add new APIs which ld64 promptly starts using, so it isn’t clear how much ld64 gains by relying on libLTO”) ; my take from that was that since the new ld64 starts using the new libLTO interface, there is a revlock anyway and then there is no advantage in keeping the old libLTO entry points.
>> I just described a use case that shows how useful it can be.
>> 
>> Apologize if I misunderstood the point.
> 
> That seems like a potentially valid use case, but if it doesn't actually
> work right now it doesn't really buy you much.

It is working right now AFAIK. At least my understand is that the current situation is that you can drop a clang/libLTO built today on a machine that has ld64 from a few years ago and it will work.


> 
> If this is indeed an abolute requirement, there are better ways of achieving
> this kind of thing without creating an API stability burden in LLVM. For
> example you could make libLTO a build product of ld64 rather than of LLVM by
> copying the tools/lto code into ld64 and using the preprocessor to make the
> code LLVM-version-dependent. This seems like it could be relatively easily
> achievable right now; all you'd need to do is switch the Xcode toolchain
> over to shipping the libLTO build product from ld64 instead of from LLVM
> (or even statically linking as Eric suggested). Any other existing clients
> of libLTO who care about this can do the same thing.

It seems I’m missing something: the system ld64 linker will be shipped with a self-contained libLTO, but the new compiler I’ll drop-in will generate “new" bitcode that will be fed to this “old” libLTO, and that’s not gonna play well.
Unless you are only including the C API wrapper in ld64, but in this case I’m not sure I understand "using the preprocessor to make the code LLVM-version-dependent”. You will be able to build ld64 independently of LLVM, but how about at runtime? The compiler needs to ship a dynamic library that will be loaded by the linker, and there is still a need for a stable API there.

— 
Mehdi


> Another advantage of doing this is that you can change the "stable" libLTO
> API without breaking clients, as ld64 would be the only client.
> 
> Thanks,
> -- 
> Peter



More information about the llvm-dev mailing list