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

Mehdi Amini via llvm-dev llvm-dev at lists.llvm.org
Fri Dec 23 11:33:31 PST 2016


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.

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 <mailto:tejohnson at google.com>> wrote:
>> 
>> 
>> 
>> On Thu, Dec 22, 2016 at 8:55 PM, Mehdi Amini <mehdi.amini at apple.com <mailto: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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20161223/428a2b57/attachment.html>


More information about the llvm-dev mailing list