About the "debugger target"

While I've already posted reviews for the initial patches for this (see
http://reviews.llvm.org/D8506 and http://reviews.llvm.org/D8599), the
grapevine suggests I should post a lengthier description of my intent
for the "debugger target." The idea was prompted by a suggestion from
Eric Christopher, and I'm running with it.

Various bits of the DWARF we produce are conditional on the target
platform, or on command-line options with defaults based on the target
platform. Other bits aren't but probably ought to be. Some of these
are little things:
- various Apple-defined attributes (DW_AT_APPLE_*)
- TLS opcode (DW_OP_form_tls_address v. DW_OP_GNU_push_tls_address)

Some are bigger things:
- accelerator tables
- pubnames/pubtypes

Really these aren't so much _platform_ specific things as they are
_debugger_ specific things. For example:
- accelerator tables: default on for Darwin, but really on for LLDB.
- pubnames/pubtypes: off for Darwin and PS4, but really on for GDB.

We're co-opting platform as a proxy for the debugger. Sometimes they
are closely tied, but in other cases maybe not so much. I think it is
already the case that LLDB is used in more places than just Darwin?
But the things that look like they ought to be LLDB-specific are actually
implemented as Darwin-specific. That's sub-optimal for the non-Darwin
but LLDB-using platforms. I mean, LLDB will still *work* on those
platforms, because 99% of what's going on is still standard DWARF, it
just won't be "tuned" for how LLDB wants to operate.

In most cases on the LLVM side, control of one of these tuning things
is via a bool flag in DwarfDebug, and the DwarfDebug ctor is where the
actual decision-making takes place. My initial patch to define a
debugger target starts in the direction of setting those flags based on
debugger, not platform. More could be done, but as I'm not clear on
LLDB's scope I didn't want to go too far right away.

For example, it would not make me sad to suppress the DW_AT_APPLE* stuff
except when the debugger would actually understand it. It's not clear
to me whether these really ought to be LLDB attributes, or Darwin, or
what, because currently we emit them unconditionally. :stuck_out_tongue:

And quite frankly, I'm looking ahead to fiddling things for PS4. We have
no use for linkage names in DWARF, for example, so I'd like to turn that
off and save some space. We do want .debug_aranges so I'd like to turn
that on by default. And there's a little bit of fine-tuning on exactly
what -flimit-debug-info applies to, that we'd like to do (that part is
obviously on the Clang side rather than the LLVM side).

I hope this helps explain what's going on with the "debugger target"
and what I want to do with it. (And apologies for not posting this
sooner.)
--paulr

Adding lldb-dev.

LLDB is used in many places other than Darwin; it's used for Linux, Android,
FreeBSD, Hexagon, Kalimba and many others.

The problem with having the compiler build for a specific debugger is you
don't necessarily know at compile which debugger someone will use. There's
nothing that says you can't build an executable with clang and then debug it
with both gdb and lldb. I've done that.

Ted

From: Ted Woodward [mailto:ted.woodward@codeaurora.org]

Adding lldb-dev.

LLDB is used in many places other than Darwin; it's used for Linux,
Android,
FreeBSD, Hexagon, Kalimba and many others.

The problem with having the compiler build for a specific debugger is you
don't necessarily know at compile which debugger someone will use. There's
nothing that says you can't build an executable with clang and then debug
it
with both gdb and lldb. I've done that.

Of course LLDB is fully capable of debugging a GDB-tuned executable; that's
exactly what it does today, on non-Darwin platforms. This proposal doesn't
really introduce anything new, functionally; it's mostly a way of thinking
about what we're already doing, and providing more control to the user.

And, with exactly one exception, GDB ought to be fully capable of debugging
an LLDB-tuned executable; I'm not aware of any environment where it happens
today *by default* but I don't see anything in the compiler that suggests
there would be any problem.

The exactly-one-exception is: GDB has never been taught how to use the
standard DWARF TLS opcode. This is a bug in GDB.
https://sourceware.org/bugzilla/show_bug.cgi?id=11616
If you have thread-local variables and ever expect to use GDB to debug,
you should tune for GDB. Of course that's exactly what you get by default
(with or without my patch) on every non-Darwin non-PS4 platform.

This is *fine-tuning* not an extensive customization. Actually mostly what
I have in mind is leaving out peripheral lumps of DWARF that only one or
another debugger know how to take advantage of; having any of those lumps
exist when you're using a different debugger causes no harm (except making
your object files bigger) and have a lump be missing when a debugger could
use it causes little harm (typically might make the debugger operate a little
slower because some optimized table isn't available).

--paulr