[llvm-dev] ThinLTO promotion is ending up with "invalid" IR before IR-Linking

Duncan P. N. Exon Smith via llvm-dev llvm-dev at lists.llvm.org
Fri Dec 23 11:37:57 PST 2016


> On 2016-Dec-23, at 11:33, Mehdi Amini <mehdi.amini at apple.com> wrote:
> 
> I just hit another issue: before of ODR type uniquing on bitcode loading, we can end-up with a metadata graph that include metadata from the destination module, including a DICompileUnit.
> Unfortunately this compile-unit is not listed in llvm.dbg.cu and this does not pass the verifier.

The verifier won't pass until linking is complete, IIRC.  I had to turn off per-module verification when I added the ODR-type uniquing logic.  DICompositeTypes will, when created, "magically" coalesce with DICompositeTypes in already-loaded modules in the same context that share a UUID ("identifier:").  That means they reference things in that other module.

You need to finish linking before running the verifier.

> CC a few folks more aware of debug info that I am: is there a plan to make llvm.dbg.cu disappear?
> 
>> Mehdi
> 
>> On Dec 23, 2016, at 11:04 AM, Mehdi Amini via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>> 
>> 
>>> On Dec 23, 2016, at 9:34 AM, Teresa Johnson <tejohnson at google.com> wrote:
>>> 
>>> 
>>> 
>>> On Thu, Dec 22, 2016 at 8:55 PM, Mehdi Amini <mehdi.amini at apple.com> wrote:
>>> Hey,
>>> 
>>> As I’m playing with Metadata lazy-loading, I added a verifier right before running the IRLinker in FunctionImport.cpp, and it does not pass (on current trunk) in a few cases. One that I looked at ended up with aliases pointing to available_externally functions for instance.
>>> 
>>> How do these look after IRLinking (in the dest module)? I looked at the logic in renameModuleForThinLTO and all the conversions to available_externally are predicated on it being in the provided GlobalsToImport set. But in FunctionImport.cpp selectCallee() we specifically prevent importing of aliases that would result in the aliasee becoming available_externally. Presumably the resulting IRLinked dest module looks legit, otherwise we would have later verifier failures.
>> 
>> So the source module is:
>> 
>> @weakalias = weak alias void (...), bitcast (void ()* @globalfunc1 to void (...)*)
>> define void @globalfunc1() #0 {
>> entry:
>>   ret void
>> }
>> 
>> But we turn globalfunc1 into available_externally in renameModuleForThinLTO(), which make the alias invalid.
>> 
>> We don’t import the IR so the destination module is OK.
>> 36
>> 
>> 
>>> 
>>> 
>>> I’m hesitant about breaking the IR verifier like that before calling the IRLinker. The alternative I can see now would be:
>>> - to perform any handling that requires breaking the verifier as part of the IRLinker process,
>>> - or to perform the verifier-breaking changes that we do as a pre-process step to the IRLinker as a post-process step on the linked module.
>>> 
>>> Wouldn't this second option result in verification errors on the resulting dest module?
>> 
>> Not sure why? Since currently the destination module is valid, the post-process should be OK as well?
>> 
>>>> Mehdi
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> 



More information about the llvm-dev mailing list