| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> |
| <html xmlns="http://www.w3.org/1999/xhtml"> |
| <head> |
| <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> |
| <link href="style.css" rel="stylesheet" type="text/css" /> |
| <title>Adding Programming Language Support to LLDB</title> |
| </head> |
| |
| <body> |
| <div class="www_title"> |
| The <strong>LLDB</strong> Debugger |
| </div> |
| <div id="container"> |
| <div id="content"> |
| <!--#include virtual="sidebar.incl"--> |
| <div id="middle"> |
| <div class="post"> |
| <h1 class="postheader">Adding Programming Language Support to LLDB</h1> |
| <div class="postcontent"> |
| <p> |
| LLDB has been architected to make it straightforward to |
| add support for a programming language. Only a small |
| enum in core LLDB needs to be modified to make LLDB |
| aware of a new programming language. Everything else can |
| be supplied in derived classes that need not even be |
| present in the core LLDB repository. This makes it |
| convenient for developers adding language support either |
| in branches or downstream repositories since it |
| practically eliminates the potential for merge |
| conflicts. |
| </p> |
| <p> |
| The basic steps needed are as follows: |
| <ul> |
| <li>Add the language to the LanguageType enum</li> |
| <li>Add a TypeSystem for the language</li> |
| <li>Add expression evaluation support</li> |
| </ul> |
| </p> |
| <p> |
| Additionally, you may want to create a Language and LanguageRuntime plugin for your language, which enables support for advanced features like dynamic typing and data formatting. |
| </div> |
| <div class="postfooter"></div> |
| </div> |
| <!-- block for adding a new section |
| <div class="post"> |
| <h1 class="postheader">Section Title</h1> |
| <div class="postcontent"> |
| <p>...</p> |
| </div> |
| <div class="postfooter"></div> |
| </div> |
| --> |
| <div class="post"> |
| <h1 class="postheader">Add the Language to the LanguageType enum</h1> |
| <div class="postcontent"> |
| <p> |
| The LanguageType enum |
| (see <a href="http://llvm.org/svn/llvm-project/lldb/trunk/include/lldb/lldb-enumerations.h">lldb-enumerations.h</a>) |
| contains a list of every language known to LLDB. It is |
| the one place where support for a language must live |
| that will need to merge cleanly with core LLDB if you |
| are developing your language support in a separate |
| branch. When adding support for a language previously |
| unknown to LLDB, start by adding an enumeration entry to |
| LanguageType. |
| </p> |
| </div> |
| <div class="postfooter"></div> |
| </div> |
| <div class="post"> |
| <h1 class="postheader">Add a TypeSystem for the Language</h1> |
| <div class="postcontent"> |
| <p> |
| Both <a href="http://llvm.org/svn/llvm-project/lldb/trunk/include/lldb/Core/Module.h">Module</a> |
| and <a href="http://llvm.org/svn/llvm-project/lldb/trunk/include/lldb/Target/Target.h">Target</a> |
| support the retrieval of a TypeSystem instance via |
| GetTypeSystemForLanguage(). For Module, this method is |
| directly on the Module instance. For Target, this is |
| retrieved indirectly via the TypeSystemMap for the |
| Target instance. |
| </p> |
| <p> |
| The TypeSystem instance returned by the Target is |
| expected to be capable of evaluating expressions, while |
| the TypeSystem instance returned by the Module is not. |
| If you will support expression evaluation for your |
| language, you could consider following one of these |
| approaches: |
| <ul> |
| <li> |
| implement a single TypeSystem class that supports |
| evaluation when given an optional Target, |
| implementing all the expression evaluation methods |
| on the TypeSystem in this case, OR |
| </li> |
| <li> |
| create multiple TypeSystem classes, one for |
| evaluation and one for static Module usage. |
| </li> |
| </ul> |
| |
| For clang and Swift, we chose to go with the latter, |
| primarily to make it clearer that evaluation with the |
| static Module-returned TypeSystem instances make no |
| sense, and have them error out on those calls. But |
| either approach is fine to pursue. |
| </p> |
| </div> |
| <div class="postfooter"></div> |
| </div> |
| <div class="post"> |
| <h1 class="postheader">Add Expression Evaluation Support</h1> |
| <div class="postcontent"> |
| <p> |
| Expression Evaluation support is enabled by implementing |
| the relevant methods on a TypeSystem-derived class. |
| Search for "Expression" in the |
| <a href="http://llvm.org/svn/llvm-project/lldb/trunk/include/lldb/Symbol/TypeSystem.h">TypeSystem header</a> |
| to find relevant |
| methods to implement. |
| </p> |
| </div> |
| <div class="postfooter"></div> |
| </div> |
| <div class="post"> |
| <h1 class="postheader">Type Completion</h1> |
| <div class="postcontent"> |
| <p> |
| There are three levels of type completion, each |
| requiring more type information: |
| <ol> |
| <li> |
| Pointer size: when you have a forward decl or a |
| reference, and that's all you need. At this stage, |
| the pointer size is all you need. |
| </li> |
| <li> |
| Layout info: you need the size of an instance of the |
| type, but you still don't need to know all the guts |
| of the type. |
| </li> |
| <li> |
| Full type info. Here you need everything, because |
| you're playing with internals of it, such as |
| modifying a member variable. |
| </li> |
| </ol> |
| Ensure you never complete more of a type than is needed |
| for a given situation. This will keep your type system |
| from doing more work than necessary. |
| </p> |
| </div> |
| <div class="postfooter"></div> |
| </div> |
| <div class="post"> |
| <h1 class="postheader">Creating Types</h1> |
| <div class="postcontent"> |
| <p> |
| Your TypeSystem will need an approach for creating types |
| based on a set of Modules. If your type info is going |
| to come from DWARF info, you will want to subclass |
| <a href="http://llvm.org/svn/llvm-project/lldb/trunk/source/Plugins/SymbolFile/DWARF/DWARFASTParser.h">DWARFASTParser</a>. |
| </p> |
| </div> |
| <div class="postfooter"></div> |
| </div> |
| |
| <div class="post"> |
| <h1 class="postheader">Language and LanguageRuntime plugins</h1> |
| <div class="postcontent"> |
| <p> |
| If you followed the steps outlined above, you already have taught LLDB a great deal about your language. And if your language's runtime model and fundamental data types don't differ much from the C model, you are pretty much done. |
| <br/> |
| However, it is likely that your language offers its own data types for things like strings, arrays, ..., and probably has a notion of dynamic types, where the effective type of a variable can only be known at runtime. |
| </p> |
| <p> |
| These tasks are covered by two plugins: |
| <ul> |
| <li>a LanguageRuntime plugin, which provides LLDB with a dynamic view of your language; this plugin answers questions that require a live process to acquire information (e.g. dynamic type resolution)</li> |
| <li>a Language plugin, which provides LLDB with a static view of your language; questions that are statically knoawble and do not require a process are answered by this plugin (e.g. data formatters)</li> |
| </ul> |
| </p> |
| </div> |
| <div class="postfooter"></div> |
| </div> |
| </div> |
| |
| </div> |
| </div> |
| </div> |
| </body> |
| </html> |