[cfe-dev] [LLVMdev] [lldb-dev] What does "debugger tuning" mean?

David Blaikie dblaikie at gmail.com
Tue May 5 20:21:15 PDT 2015


On Tue, May 5, 2015 at 8:16 PM, Adrian Prantl <aprantl at apple.com> wrote:

>
> On May 5, 2015, at 8:12 PM, David Blaikie <dblaikie at gmail.com> wrote:
>
>
>
> On Tue, May 5, 2015 at 4:04 PM, Adrian Prantl <aprantl at apple.com> wrote:
>
>>
>> > On May 1, 2015, at 2:18 PM, Greg Clayton <gclayton at apple.com> wrote:
>> >
>> >
>> >> On May 1, 2015, at 2:00 PM, Robinson, Paul <
>> Paul_Robinson at playstation.sony.com> wrote:
>> >>
>> >>> A few more things that vote for debugger tuning:
>> >>>
>> >>> - LLDB doesn't like to have DWARF that has a class A that inherits
>> from
>> >>> class B, but only a forward declaration of class B is provided.
>> >>
>> >> Hmm do we emit that kind of thing today?  In a naïve test, I'm seeing
>> >> the full description of class B.
>> >
>> > by default for darwin, it doesn't do this. For others you must specify
>> -fno-limit-debug-info or some flag like that.
>>
>> I think the option is -f(no-)standalone-debug-info
>
>
> -fno-limit-debug-info == -fstandalone-debug
> (limit-debug-info was the old name & we had a long discussion and decided
> standalone-debug more aptly described what it should mean/how it should
> generalize)
>
>
> And if my memory serves correctly, what adds to the confusion is that
> -flimit-debug-info used to do more than just this particular optimization,
> but we decided that most of the other optimizations weren’t really helpful,
> so they were removed.
>

Not quite - I refactored the existing optimizations once I figured out what
they did & how it generalized, they are still controlled by the same (both)
flags. There are 3 main optimizations:

1) requires complete type (if a type is referenced, use a declaration
unless the type is required to be complete (eg: it was dereferenced
somewhere, etc))
2) vtable (if a type is dynamic, only emit its definition where the vtable
is emitted)
3) explicit template instantiation (if a type has an explicit template
instantiation declaration, only emit the definition where the explicit
template instantiation definition is)

I really should write a blog post about all this. Seems to create endless
confusion. (so far as I know, GCC only does (2), perhaps it does some other
things that we don't do, but I haven't seen it)


>
>
>
>> which only emits full definitions of classes in the object file that
>> holds and object’s vtable.
>>
>> -- adrian
>> >
>> >>> - LLDB wants the .apple_XXX accelerator tables, GDB wants
>> >>> .debug_pubnames/.debug_pubtypes
>> >>
>> >> Agreed.
>> >>
>> >>> So it would be great to have a "-debugger" flag that could be
>> specified
>> >>>
>> >>> -debugger=lldb
>> >>> -debugger=gdb
>> >>>
>> >>> Not sure on the option name, but I do like the idea.
>> >>
>> >> We'll bikeshed the name later but yes, that's the plan.
>> >> Thanks,
>> >> --paulr
>> >>
>> >>>
>> >>> Greg
>> >>>
>> >>>> On May 1, 2015, at 1:06 PM, Robinson, Paul
>> >>> <Paul_Robinson at playstation.sony.com> wrote:
>> >>>>
>> >>>> This is basically a reboot of the previous thread titled
>> >>>> About the "debugger target"
>> >>>> except that "target" was really too strong a term for what I had
>> >>> intended
>> >>>> to use this feature for.  "Debugger tuning" is more like it.  You
>> don't
>> >>>> need to have read the previous thread, I'll recap here.
>> >>>>
>> >>>> Fundamentally, Clang/LLVM uses DWARF as the specification for the
>> >>> _format_
>> >>>> of information provided by the compiler to a variety of "consumers,"
>> >>> which
>> >>>> primarily means debuggers (but not exclusively).  [For a long time it
>> >>> was
>> >>>> the only format supported by LLVM. Lately, Microsoft debug info has
>> >>> started
>> >>>> appearing, but being a less widely used format, the issues that DWARF
>> >>> runs
>> >>>> into aren't a concern for that format.  So "debugger tuning" is
>> unlikely
>> >>>> to be an issue for Microsoft debug info.]
>> >>>>
>> >>>> DWARF is a permissive standard, meaning that it does not rigidly
>> require
>> >>>> that source-language construct X must be described using the DWARF
>> >>>> construct Y.  Instead, DWARF says something more like, "If you have a
>> >>>> source construct that means something like X, here's a mechanism Y
>> that
>> >>>> you could use to describe it."  While this gives compilers a lot of
>> nice
>> >>>> flexibility, it does mean that there's a lot of wiggle room for how a
>> >>>> compiler describes something and in how a debugger interprets that
>> >>>> description.  Compilers and debuggers therefore need to do a bit of
>> >>>> negotiation in determining how the debug-info "contract" will work,
>> when
>> >>>> it comes to nitty-gritty details.  DWARF itself (the standard, as
>> well
>> >>>> as the committee that owns the standard) refuses to get involved in
>> this
>> >>>> negotiation, referring to all that as "quality of implementation
>> >>> issues."
>> >>>>
>> >>>> It is readily apparent that different debuggers have different ideas
>> >>>> about certain DWARF features, for example whether they are useful or
>> >>>> irrelevant, or whether a certain source construct should be described
>> >>>> this way or that way.  As these generally fall into the QOI realm,
>> the
>> >>>> DWARF spec itself is no help, and it comes down to a matter of
>> opinion
>> >>>> about whether "the debugger should just know this" or "the compiler
>> >>>> really ought to just emit it that way."
>> >>>>
>> >>>> Clang/LLVM is in the position of being a compiler that wants to
>> support
>> >>>> several different debuggers, all of which have slightly different
>> ideas
>> >>>> about what they want from the DWARF info for a program.  Our first
>> line
>> >>>> of defense of course is the DWARF standard itself, but as we've seen,
>> >>>> that is not a universally definitive reference.
>> >>>>
>> >>>> LLVM already emits DWARF slightly differently for different
>> *targets*;
>> >>>> primarily Darwin, in a few cases PS4.  But in at least some cases,
>> the
>> >>>> target is just a (somewhat unreliable) proxy for which *debugger* the
>> >>>> compiler expects to be consuming the DWARF.  The most instructive
>> case
>> >>>> is the exact DWARF expression used to describe the location of a
>> thread-
>> >>>> local variable.  DWARF v3 defined an operator to find the base
>> address
>> >>>> of the thread-local storage area; however, GDB has never learned to
>> >>>> recognize it.  Therefore, for targets where we "know" GDB isn't used,
>> >>>> we can emit the standard operator; for targets where GDB *might* be
>> >>>> used, we need to emit the equivalent (non-standard) GNU operator.
>> >>>>
>> >>>> It would be semantically more meaningful to base decisions like this
>> on
>> >>>> whether we expected the debugger to be X or Y or Z.  Therefore I've
>> >>>> proposed (http://reviews.llvm.org/D8506) a "debugger tuning" option
>> that
>> >>>> will make the reasoning behind these choices more obvious, and
>> >>> ultimately
>> >>>> give users a way to control the tuning themselves, when the
>> platform's
>> >>>> default isn't what they want. (I'll have a follow-up patch exposing
>> the
>> >>>> tuning option to the Clang driver.)
>> >>>>
>> >>>> So, what kinds of things should be based on the debugger tuning
>> option?
>> >>>> Are there still things that should be based on the target platform?
>> >>>> Simplest to consider these questions together, because it is often
>> clear
>> >>>> which criterion is important if you consider (a) the same debugger
>> run
>> >>>> on different targets, versus (b) different debuggers running on the
>> same
>> >>>> target.  Basically, if the same debugger on different targets wants
>> to
>> >>>> have something a certain way, that's probably a debugger-tuning
>> thing.
>> >>>> And if different debuggers on the same target doesn't mean you should
>> >>>> change how the DWARF looks, that's likely a platform-specific thing.
>> >>>>
>> >>>> The most obvious example of a debugger-tuning consideration is the
>> TLS
>> >>>> operator mentioned above. That's something that GDB insists on
>> having.
>> >>>> (It turns out that the standard operator was defined in DWARF 3, so
>> we
>> >>>> also have to emit the GNU operator if we're producing DWARF 2.
>> Tuning
>> >>>> considerations don't trump what the standard says.)
>> >>>>
>> >>>> Another example would be .debug_pubnames and .debug_pubtypes
>> sections.
>> >>>> Currently these default to omitted for Darwin and PS4, but included
>> >>>> everywhere else. My initial patch for "tuning" changes the PS4
>> platform
>> >>>> criterion to the SCE debugger predicate; quite likely the "not
>> Darwin"
>> >>>> criterion ought to be "not LLDB" or in other words "on for GDB only."
>> >>>> And having the code actually reflect the correct semantic purpose
>> seems
>> >>>> like an overall goodness.
>> >>>>
>> >>>> An example of a target-dependent feature might be the .debug_aranges
>> >>>> section. As it happens, we don't emit this section by default,
>> because
>> >>>> apparently no debugger finds it useful, although there's a
>> command-line
>> >>>> option (-gdwarf-aranges) for it.  But, for PS4 we do want to emit it,
>> >>>> because we have non-debugger tools that find it useful.  We haven't
>> yet
>> >>>> done the work to make that change on llvm.org, but it's on the list.
>> >>>> I would conditionalize this on the target, not the debugger, because
>> >>>> the debugger is not why we want to generate the section.
>> >>>>
>> >>>> Okay, so I've been pretty long-winded about all this, can I possibly
>> >>>> codify it all into a reasonably succinct set of guidelines?  (which
>> >>>> ought to be committed to the repo somewhere, although whether it's as
>> >>>> a lump of text in a docs webpage or a lump of commentary in some
>> source
>> >>>> file is not clear; opinions welcome.)
>> >>>>
>> >>>> o Emit standard DWARF if possible.
>> >>>> o Omitting standard DWARF features that nobody uses is fine.
>> >>>> (example: DW_AT_sibling)
>> >>>> o Extensions are okay, but think about the circumstances where they
>> >>>> would be useful (versus just wasting space).  These are probably a
>> >>>> debugger tuning decision, but might be a target-based decision.
>> >>>> (example: DW_AT_APPLE_* attributes)
>> >>>> o If some debugger can't tolerate some piece of standard DWARF,
>> that's
>> >>>> a missing feature or a bug in the debugger.  Accommodating that in
>> >>>> the compiler is a debugger tuning decision.
>> >>>> (example: DW_OP_form_tls_address not understood by GDB)
>> >>>> o If some debugger has no use for some piece of standard DWARF, and
>> >>>> it saves space to omit it, that's a debugger tuning decision.
>> >>>> (example: .debug_pubnames/.debug_pubtypes sections)
>> >>>> o If a debugger wants things a certain way regardless of the target,
>> >>>> that's probably a debugger tuning decision.
>> >>>> o If "system" software on a target (other than the debugger) wants
>> >>>> things a certain way regardless of which debugger you're using,
>> >>>> that's NOT a debugger tuning decision, but a target-based decision.
>> >>>> (example: .debug_aranges section)
>> >>>>
>> >>>> Let me know if this all seems reasonable, and especially if you have
>> >>>> a good idea where to keep the guidelines.
>> >>>> Thanks,
>> >>>> --paulr
>> >>>>
>> >>>>
>> >>>> _______________________________________________
>> >>>> lldb-dev mailing list
>> >>>> lldb-dev at cs.uiuc.edu
>> >>>> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-dev
>> >>
>> >
>> >
>> > _______________________________________________
>> > LLVM Developers mailing list
>> > LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
>> > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>>
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-dev
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20150505/2063780d/attachment.html>


More information about the cfe-dev mailing list