[llvm-dev] [DebugInfo] RFC: Introduce LLVM DI Checker utility

Djordje via llvm-dev llvm-dev at lists.llvm.org
Fri Jun 19 00:33:44 PDT 2020


On 19.6.20. 08:27, Vedant Kumar wrote:
>
>
>> On Jun 18, 2020, at 1:58 AM, Djordje <djordje.todorovic at syrmia.com 
>> <mailto:djordje.todorovic at syrmia.com>> wrote:
>>
>> Hi Vedant,
>>
>> Thanks a lot for your comments!
>>
>> >It looks like a lot of the new infrastructure introduced here 
>> <https://github.com/djolertrk/llvm-di-checker/commit/9d26ac2557c584f6cf82ac5535fc47f8bd267a27> consists 
>> of logic copied from the debugify implementation. Why is introducing 
>> a new pair of passes better than extending the ones we have? The core 
>> infrastructure needed to track location loss for real (non-synthetic) 
>> source variables is is in place already.
>>
>> Since it is a proposal, I thought it'd easier to understand the idea 
>> if I duplicate things. Ideally, we can make an API that could be used 
>> from both tools. Initially, I made a few patches locally turning the 
>> real debug info into debugify ones, but I realized it breaks the 
>> original idea/design of the debugify & that is why I decided to make 
>> a separate pass(es). This cannot stay as is with the respect to the 
>> implementation, it should be either merged into debugify file(s) or 
>> refactored using the API mentioned above.
>>
> Oh, this wasn’t clear to me. In the future, please describe what 
> is/isn’t part of the proposal. It’d be especially helpful to include 
> some discussion of the pros & cons of the prototype design and its 
> alternatives.
>
Sorry If I wasn't clear enough. I thought if I write [PROPOSAL], all of 
it is considered as a proposal.
>>
>> Another reason for implementing it as a different pass was the fact 
>> the debugify is meant to be used from 'opt' level only, but if we 
>> want to invoke the option from front end level, we need to merge it 
>> into the IR library.
>>
> The debugify passes are now linked by llc via the Transforms library 
> as part of the -mir-debugify implementation. A frontend should be able 
> to use them.
I'll try that, thanks.
>
>> >Stepping back a bit, I’m also surprised by the decision to move away 
>> from synthetic testing when there’s still so much low-hanging fruit 
>> to pick using that technique. The example from 
>> https://reviews.llvm.org/D81939 illustrates this perfectly: in this 
>> case it’s not necessary to invent a new testing technique to uncover 
>> the bug, because simply running `./bin/llvm-lit -Dopt="opt 
>> -debugify-each" test/Transforms/DeadArgElim` finds the same issue.
>>
>> As I mentioned in the previous mail, I do really think the debugify 
>> technique is great & I use it. But, in order to detect that variable 
>> "x" was optimized-out starting from pass Y, I only run the di-checker 
>> option (that performs analysis only) & find the variable in the final 
>> html report. I think that is very user friendly concept.
>>
> About the analysis — why not emit a report in -check-debugify when the 
> # of non-undef debug uses of a variable drops to 0? This doesn’t 
> require the -debugify step. The list of local variables is preserved 
> via DISubprogram::retainedNodes.

Hmm, good idea. But we'd need to workaround the fact/condition the 
debugify(& check-debugify) works with/expects the synthetic debug info 
only. Let me try merging these ideas into the code, by removing the 
duplicated code (I'll try to use the debugify/check-debugify as much as 
possible by performing analysis only).

>
>> At the end, when we detected what was the spot of loosing the 
>> location, we can run debugify on the pass-directory-tests (but there 
>> is a concern the tests does not cover all the possible cases; and the 
>> case found from the high level could be new to the pass). In 
>> addition, the di-checker detects issues for metadata other than 
>> locations (currently, the preservation map keeps the disubprograms 
>> only, but it should keep other kinds too).
>>
> Note that it’s possible to to increase code coverage by running a 
> -debugify-each pipeline on -g0 IR produced by a frontend.
>
> Is it common for a pass to drop an entire DISubprogram? I would hope 
> this either never happens or is extremely rare.

It is extremely rare, but there are passes that create new functions, 
and it possible to forget to update/attach the subprogram on that (the 
similar situation we face with locations when someone forgets to set 
debugloc on an instruction).


Best,

Djordje

>
> best,
> vedant
>
>> >In D81939, you discuss finding the new tool useful when responding 
>> to bug reports about optimized-out variables or missing locations. We 
>> sorely do need something better than -opt-bisect-limit, but why not 
>> start with something simple? -check-debugify already knows how to 
>> report when & where a location is dropped, it would be simple to 
>> teach it to emit a report when a variable is fully optimized-out.
>>
>> I agree. We can do that and that could be used from both utilities.
>>
>>
>> Best regards,
>>
>> Djordje
>>
>>
>> On 17.6.20. 21:14, Vedant Kumar wrote:
>>> Hey Djordje,
>>>
>>> It looks like a lot of the new infrastructure introduced here 
>>> <https://github.com/djolertrk/llvm-di-checker/commit/9d26ac2557c584f6cf82ac5535fc47f8bd267a27> consists 
>>> of logic copied from the debugify implementation. Why is introducing 
>>> a new pair of passes better than extending the ones we have? The 
>>> core infrastructure needed to track location loss for real 
>>> (non-synthetic) source variables is is in place already.
>>>
>>> Stepping back a bit, I’m also surprised by the decision to move away 
>>> from synthetic testing when there’s still so much low-hanging fruit 
>>> to pick using that technique. The example from 
>>> https://reviews.llvm.org/D81939 illustrates this perfectly: in this 
>>> case it’s not necessary to invent a new testing technique to uncover 
>>> the bug, because simply running `./bin/llvm-lit -Dopt="opt 
>>> -debugify-each" test/Transforms/DeadArgElim` finds the same issue.
>>>
>>> In D81939, you discuss finding the new tool useful when responding 
>>> to bug reports about optimized-out variables or missing locations. 
>>> We sorely do need something better than -opt-bisect-limit, but why 
>>> not start with something simple? -check-debugify already knows how 
>>> to report when & where a location is dropped, it would be simple to 
>>> teach it to emit a report when a variable is fully optimized-out.
>>>
>>>
>>>> On Jun 17, 2020, at 2:10 AM, Djordje <djordje.todorovic at syrmia.com 
>>>> <mailto:djordje.todorovic at syrmia.com>> wrote:
>>>>
>>>> I am sharing the proposal [0] which gives a brief introduction for 
>>>> the implementation of the LLVM DI Checker utility. On a very high 
>>>> level, it is a pair of LLVM (IR) Passes that check the preservation 
>>>> of the original debug info in the optimizations. There are options 
>>>> controlling the passes, that could be invoked from ``clang`` as 
>>>> well as from ``opt`` level.
>>>>
>>>> By testing the utility on the GDB 7.11 project (using it as a 
>>>> testbed), it has found a certain number of potential issues 
>>>> regarding the DILocations (using it on LLVM project build itself, 
>>>> it has found one bug regarding DISubprogram metadata). Please take 
>>>> a look into the final report (on the GDB 7.11 testbed) generated 
>>>> from the script that collects the data at [1]. By looking at these 
>>>> data, it looks that the utility like this could be useful when 
>>>> trying to detect the real issues related to debug info production 
>>>> by the compiler.
>>>
>>> Thanks for sharing these results. The data here is older (from the 
>>> 2018 debug info BoF) and from a different project (sqlite3), but we 
>>> saw some similar patterns: 
>>> https://llvm.org/devmtg/2018-10/slides/Prantl-Kumar-debug-info-bof-2018.pdf
>>>
>>> best
>>> vedant
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200619/ca5cbd87/attachment.html>


More information about the llvm-dev mailing list