[llvm-dev] [DebugInfo] RFC: Introduce LLVM DI Checker utility
Djordje Todorovic via llvm-dev
llvm-dev at lists.llvm.org
Mon Jul 6 07:41:31 PDT 2020
Hi Vedant,
I've managed to merge this idea into the existing Debugify Pass by
introducing two modes:
1) synthetic - everything stay as is; this mode deals with the
synthetic debug info
2) original - this is the new mode; it checks debug info metadata
preservation on real/original/-g debug info
The initial patches are: https://reviews.llvm.org/D82545 and
https://reviews.llvm.org/D82546.
There are still TODOs (such as to cover the dbg.values tracking by using
the idea you pointed out in a previous mail; or to cover metadata other
then DILocations and DISubprograms (if there are any that make sense)).
Best regards,
Djordje
On 19.6.20. 09:33, Djordje wrote:
>
>
> 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/20200706/74a71557/attachment-0001.html>
More information about the llvm-dev
mailing list