| Scripting Bridge API | 
 | ==================== | 
 |  | 
 | The SB APIs constitute the stable C++ API that lldb presents to external | 
 | clients, and which get processed by SWIG to produce the Python bindings to | 
 | lldb. As such it is important that they not suffer from the binary | 
 | incompatibilities that C++ is so susceptible to. We've established a few rules | 
 | to ensure that this happens. | 
 |  | 
 | Extending the SB API | 
 | -------------------- | 
 |  | 
 | The classes in the SB API's are all called SB<SomeName>, where SomeName is in | 
 | CamelCase starting with an upper case letter. The method names are all | 
 | CamelCase with initial capital letter as well. | 
 |  | 
 | All the SB API classes are non-virtual, single inheritance classes. They should | 
 | only include SBDefines.h or other SB headers as needed. There should be no | 
 | inlined method implementations in the header files, they should all be in the | 
 | implementation files. And there should be no direct ivar access. | 
 |  | 
 | You also need to choose the ivars for the class with care, since you can't add | 
 | or remove ivars without breaking binary compatibility. In some cases, the SB | 
 | class is a thin wrapper around an internal lldb_private object. In that case, | 
 | the class can have a single ivar, which is either a pointer, shared_ptr or | 
 | unique_ptr to the object in the lldb_private API. All the lldb_private classes | 
 | that get used this way are declared as opaque classes in lldb_forward.h, which | 
 | is included in SBDefines.h. So if you need an SB class to wrap an lldb_private | 
 | class that isn't in lldb_forward.h, add it there rather than making a direct | 
 | opaque declaration in the SB classes .h file. | 
 |  | 
 | If the SB Class needs some state of its own, as well as the backing object, | 
 | don't include that as a direct ivar in the SB Class. Instead, make an Impl | 
 | class in the SB's .cpp file, and then make the SB object hold a shared or | 
 | unique pointer to the Impl object. The theory behind this is that if you need | 
 | more state in the SB object, those needs are likely to change over time, and | 
 | this way the Impl class can pick up members without changing the size of the | 
 | object. An example of this is the SBValue class. Please note that you should | 
 | not put this Impl class in the lldb namespace. Failure to do so leads to | 
 | leakage of weak-linked symbols in the SBAPI. | 
 |  | 
 | In order to fit into the Python API's, we need to be able to default construct | 
 | all the SB objects. Since the ivars of the classes are all pointers of one sort | 
 | or other, this can easily be done, but it means all the methods must be | 
 | prepared to handle their opaque implementation pointer being empty, and doing | 
 | something reasonable. We also always have an "IsValid" method on all the SB | 
 | classes to report whether the object is empty or not. | 
 |  | 
 | Another piece of the SB API infrastructure is the Python (or other script | 
 | interpreter) customization. SWIG allows you to add property access, iterators | 
 | and documentation to classes. We place the property accessors and iterators in | 
 | a file dedicated to extensions to existing SB classes at | 
 | "bindings/interface/SB<ClassName>Extensions.i". The documentation is similarly | 
 | located at "bindings/interface/SB<ClassName>Docstrings.i". These two files, in | 
 | addition to the actual header SB<ClassName>.h, forms the interface that lldb | 
 | exposes to users through the scripting languages. | 
 |  | 
 | There are some situations where you may want to add functionality to the SB API | 
 | only for use in C++. To prevent SWIG from generating bindings to these | 
 | functions, you can use a C macro guard, like so: | 
 |  | 
 | :: | 
 |  | 
 |   #ifndef SWIG | 
 |   int GetResourceCPPOnly() const; | 
 |   #endif | 
 |  | 
 | In this case, ``GetResourceCPPOnly`` will not be generated for Python or other | 
 | scripting languages. If you wanted to add a resource specifically only for the | 
 | SWIG case, you can invert the condition and use ``#ifdef SWIG`` instead. When | 
 | building the LLDB framework for macOS, the headers are processed with | 
 | ``unifdef`` prior to being copied into the framework bundle to remove macros | 
 | involving SWIG. | 
 |  | 
 | Another good principle when adding SB API methods is: if you find yourself | 
 | implementing a significant algorithm in the SB API method, you should not do | 
 | that, but instead look for and then add it - if not found - as a method in the | 
 | underlying lldb_private class, and then call that from your SB API method. | 
 | If it was a useful algorithm, it's very likely it already exists | 
 | because the lldb_private code also needed to do it.  And if it doesn't at | 
 | present, if it was a useful thing to do, it's likely someone will later need | 
 | it in lldb_private and then we end up with two implementations of the same | 
 | algorithm.  If we keep the SB API code to just what's needed to manage the SB | 
 | objects and requests, we won't get into this situation. | 
 |  | 
 | Lifetime | 
 | -------- | 
 | Many SB API methods will return strings in the form of ``const char *`` values. | 
 | Once created, these strings are guaranteed to live until the end of the | 
 | debugging session. LLDB owns these strings, clients should not attempt to free | 
 | them. Doing so may cause LLDB to crash. | 
 | Note that this only affects the C++ API as scripting languages usually | 
 | will usually create native string types from the ``const char *`` value. | 
 |  | 
 | API Instrumentation | 
 | ------------------- | 
 |  | 
 | The reproducer infrastructure requires API methods to be instrumented so that | 
 | they can be captured and replayed. Instrumentation consists of two macros, | 
 | ``LLDB_REGISTER`` and ``LLDB_RECORD``. Both can be automatically generated with | 
 | the ``lldb-instr`` utility. | 
 |  | 
 | To add instrumentation for a given file, pass it to the ``lldb-instr`` tool. | 
 | Like other clang-based tools it requires a compilation database | 
 | (``compile_commands.json``) to be present in the current working directory. | 
 |  | 
 | :: | 
 |  | 
 |    $ ./bin/lldb-instr /path/to/lldb/source/API/SBDebugger.cpp | 
 |  | 
 |  | 
 | The tool will automatically insert ``LLDB_RECORD`` macros inline, however you | 
 | will need to run ``clang-format`` over the processed file, as the tool | 
 | (intentionally) makes no attempt to get that right. | 
 |  | 
 | The ``LLDB_REGISTER`` macros are printed to standard out between curly braces. | 
 | You'll have to copy-paste those into the corresponding ``RegisterMethods`` | 
 | function in the implementation file. This function is fully specialized in the | 
 | corresponding type. | 
 |  | 
 | :: | 
 |  | 
 |   template <> void RegisterMethods<SBDebugger>(Registry &R) { | 
 |     ... | 
 |   } | 
 |  | 
 |  | 
 | When adding a new class, you'll also have to add a call to ``RegisterMethods`` | 
 | in the ``SBRegistry`` constructor. | 
 |  | 
 | The tool can be used incrementally. However, it will ignore existing macros | 
 | even if their signature is wrong. It will only generate a ``LLDB_REGISTER`` if | 
 | it emitted a corresponding ``LLDB_RECORD`` macro. |