[llvm-dev] Why does a DISubprogram need to be distinct?

Adrian Prantl via llvm-dev llvm-dev at lists.llvm.org
Fri Sep 25 17:24:57 PDT 2020



> On Sep 25, 2020, at 5:20 PM, Adrian Prantl <aprantl at apple.com> wrote:
> 
> 
> 
>> On Sep 25, 2020, at 4:36 PM, David Blaikie <dblaikie at gmail.com <mailto:dblaikie at gmail.com>> wrote:
>> 
>> On Fri, Sep 25, 2020 at 4:08 PM Adrian Prantl <aprantl at apple.com <mailto:aprantl at apple.com>> wrote:
>>> 
>>> First — thanks for fixing the test for me!
>> 
>> I'm a bit curious about the test - any idea how it came to be, if it's
>> invalid? Did we produce such bitcode in the past and don't anymore -
>> what's the rule about backwards compatibility here, then? It seems
>> like any time we regenerate a bitcode compat test that's questionable
>> because it means we won't be compatible with that bitcode we said we
>> should be compatible with?
> 

I didn't answer the bitcode part: Adding the Verifier check *is* the bitcode compatibility. If an AssertDI fires, the debug info is stripped from the CU with a warning about invalid debug info. We don't need be implement a bitcode upgrade for a buggy version of clang, particularly not in this case, since I also cherry-picked the bugfix to that same branch.

-- adrian

> I think I mentioned in the commit message — we had a short period in clang with a bug
> 
> >>> Clang right before https://reviews.llvm.org/D79967 <https://reviews.llvm.org/D79967> would generate this kind of broken IR.
> 
> and the swift-5.3 branch happened to be cut in that unlucky window. To trigger it you need to markup a function with NoDebug (the bug was introduced  maybe a month earlier).
> 
>> 
>>> We have two kinds of DISubprograms:
>>> - uniqued DISubprograms are part of the type system and describe function *types*. They don't have a unit: field, because they want to be uniqued across compile units.
>>> - distinct DISubprograms describe one specific function definition. They belong to a compile unit and thus have a unit: field.
>>> 
>>> You are only supposed to attach distinct DISubprograms to function definitions. Several places in CodeGen will unconditionally dereference the unit: field and crash if it isn't there.
>> 
>> But do they have to be distinct? They have different fields (as you
>> say, declaration DISubprograms don't have a "unit:" field, definition
>> DISubprograms do have a unit: field that refers to a (itself distinct)
>> DICompileUnit)
> 
> IIRC, DIBuilder lets you either create a distinct one with a unit or a uniqued one without. I don't know if the backend would survive the same uniqued DISubprogram node being attached to multiple llvm::Functions or if that would invalidate some assumptions... In any case distinct seems to be a reasonable proxy for what we mean.
> 
> -- adrian
> 
>> 
>>> We actually had a weaker form of the check I added to Verifier already in place (https://github.com/llvm/llvm-project/blob/51cad041e0cb26597c7ccc0fbfaa349b8fffbcda/llvm/lib/IR/Verifier.cpp#L1186 <https://github.com/llvm/llvm-project/blob/51cad041e0cb26597c7ccc0fbfaa349b8fffbcda/llvm/lib/IR/Verifier.cpp#L1186>), but it didn't cover the specific testcase I added in https://reviews.llvm.org/rGe17f52d623cc146b7d9bf5a2e02965043508b4c4 <https://reviews.llvm.org/rGe17f52d623cc146b7d9bf5a2e02965043508b4c4>.
>>> 
>>> -- adrian
> 

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200925/65336414/attachment-0001.html>


More information about the llvm-dev mailing list