================ @@ -0,0 +1,436 @@ +Data Formatters +=============== + +This page is an introduction to the design of the LLDB data formatters +subsystem. The intended target audience are people interested in understanding +or modifying the formatters themselves rather than writing a specific data +formatter. For this latter purpose, the user documentation about formatters is +the main relevant document which one should refer to. + +This page also highlights some open areas for improvement to the general +subsystem, and more evolutions not anticipated here are certainly possible. + +Overview +-------- + +The LLDB data formatters subsystem is used to allow the debugger as well as the +end-users to customize the way their variables look upon inspection in the user +interface (be it the command line tool, or one of the several GUIs that are +backed by LLDB) + +To this aim, they are hooked into the ValueObjects model, in order to provide +entry points through which such customization questions can be answered. For +example what format should this number be printed as? How many child elements +does this ``std::vector`` have? + +The architecture of the subsystem is layered, with the highest level layer +being the user visible interaction features (e.g. the ``type ***`` commands, +the SB classes, ...). Other layers of interest that will be analyzed in this +document include + +* Classes implementing individual data formatter types +* Classes implementing formatters navigation, discovery and categorization +* The ``FormatManager`` layer +* The ``DataVisualization`` layer +* The SWIG <> LLDB communication layer + +Data Formatter Types +-------------------- + +As described in the user documentation, there are four types of formatters: + +* Formats +* Summaries +* Filters +* Synthetic children + +Formatters have descriptor classes, ``Type*Impl``, which contain at least a +"Flags" nested object, which contains both rules to be used by the matching +algorithm (e.g. should the formatter for type Foo apply to a Foo*?) or rules to +be used by the formatter itself (e.g. is this summary a oneliner?). + +Individual formatter descriptor classes then also contain data items useful to +them for performing their functionality. For instance ``TypeFormatImpl`` +(backing formats) contains an ``lldb::Format`` that is the format to then be +applied were this formatter to be selected. Upon issuing a ``type format add`` +a new ``TypeFormatImpl`` is created that wraps the user-specified format, and +matching options: + +:: + + entry.reset(new TypeFormatImpl( + format, TypeFormatImpl::Flags() + .SetCascades(m_command_options.m_cascade) + .SetSkipPointers(m_command_options.m_skip_pointers) + .SetSkipReferences(m_command_options.m_skip_references))); + + +While formats are fairly simple and only implemented by one class, the other +formatter types are backed by a class hierarchy. + +Summaries, for instance, can exist in one of three "flavors": + +* Summary strings +* Python script +* Native C++ + +The base class for summaries, ``TypeSummaryImpl``, is a pure virtual class that +wraps, again, the Flags, and exports among others: + +:: + + virtual bool FormatObject (ValueObject *valobj, std::string& dest) = 0; + + +This is the core entry point, which allows subclasses to specify their mode of +operation. + +``StringSummaryFormat``, which is the class that implements summary strings, +does a check as to whether the summary is a one-liner, and if not, then uses +its stored summary string to call into ``Debugger::FormatPrompt``, and obtain a +string back, which it returns in ``dest`` as the resulting summary. + +For a Python summary, implemented in ``ScriptSummaryFormat``, +``FormatObject()`` calls into the ``ScriptInterpreter`` which is supposed to +hold the knowledge on how to bridge back and forth with the scripting language +(Python in the case of LLDB) in order to produce a valid string. Implementors +of new ``ScriptInterpreters`` for other languages are expected to provide a +``GetScriptedSummary()`` entrypoint for this purpose, if they desire to allow ---------------- walter-erquinigo wrote:
```suggestion ``GetScriptedSummary()`` entry point for this purpose, if they desire to allow ``` https://github.com/llvm/llvm-project/pull/66527 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits