Supporting custom debug formats

I’d be curious to know how difficult it would be to support a language-specific debugging format in lldb. Let’s say I have a language that supports reflection, which means that the executable file contains a complete description of all data types and functions. Rather than write this information out twice (once as reflection metadata, and once as DWARD DIEs), I’d like to make it so that the debugger can interpret the reflection data directly, avoiding the need to use DWARF at all.

I’d also like to support the idea of “source libraries”, similar to Java’s concept of “source jars”, in other words, packed archives of source files that are reachable via the library search path, which can be shipped along with a binary for a library and allow convenient access to the source code for debugging.

How difficult would it be to extend lldb to do this?

I'd be curious to know how difficult it would be to support a language-specific debugging format in lldb. Let's say I have a language that supports reflection, which means that the executable file contains a complete description of all data types and functions. Rather than write this information out twice (once as reflection metadata, and once as DWARD DIEs), I'd like to make it so that the debugger can interpret the reflection data directly, avoiding the need to use DWARF at all.

This wouldn't be too hard. You would need to subclass lldb_private::SymbolFile and implement the items in the API. The hardest part is converting the types in the debug info into Clang types, but we abstracted this into classes that aren't part of the DWARF parser, so that shouldn't be too hard. We also parse class/struct/unions types as forward declaration types first, and have the DWARF parser implement an AST external source so the classes can complete themselves lazily as needed.

I'd also like to support the idea of "source libraries", similar to Java's concept of "source jars", in other words, packed archives of source files that are reachable via the library search path, which can be shipped along with a binary for a library and allow convenient access to the source code for debugging.

This depends on where the bits for the "source libraries" would live. Would they be a stand alone file that is referenced from the debug info? If so we can make a lldb_private::SourceBundle class that could be subclassed for different source jar implementations. Then the "SymbolFile" classes can have a functions added to them like:

SourceBundleSP
SymbolFile::GetSourceBundle();

If the symbol file knows about a source bundle, it can return a new non-NULL shared pointer, or an empty SourceBundleSP if the symbol file does not have a reference to one. This can alternately be put into the lldb_private::ObjectFile class if the source bundle reference is in the object file. Then this can be exposed via the lldb_private::Module that owns both the lldb_private::ObjectFile and lldb_private::SymbolVendor (which owns the lldb_private::SymbolFile).

How difficult would it be to extend lldb to do this?

This wouldn't be too hard. The lldb_private::SourceManager can then be modified to look for the file in a Module's SourceBundle when looking for sources.

Awesome, thanks for the quick and detailed response!