Enums and constants are currently missing in the new LLDB Python API docs. In theory we could just let them be autogenerated like the SB API classes, but sadly the generated documentation suffers from a bunch of problems. Most of these problems come from the way SWIG is representing enums, which is done by translating every single enum case into its own constant. This has a bunch of nasty effects: * Because SWIG throws away the enum types, we can't actually reference the enum type itself in the API. Also because automodapi is impossible to script, this can't be fixed in post (at least without running like sed over the output files). * The lack of enum types also causes that every enum *case* has its own full doc page. Having a full doc page that just shows a single enum case is pointless and it really slows down sphinx. * There is no SWIG code for the enums, so there is also no place to write documentation strings for them. Also there is no support for copying the doxygen strings (which would be in the wrong format, but better than nothing) for enums (let alone our defines), so we can't really document all this code. * Because the enum cases are just forwards to the native lldb module (which we mock), automodapi actually takes the `Mock` docstrings and adds it to every single enum case. I don't see any way to solve this via automodapi or SWIG. The most reasonable way to solve this is IMHO to write a simple Clang tool that just parses our enum/constant headers and emits an *.rst file that we check in. This way we can do all the LLDB-specific enum case and constant grouping that we need to make a readable documentation page. As we're without any real documentation until I get around to write that tool, I wrote a doc page for the enums/constants as a stop gap measure. Most of this is done by just grepping our enum header and then manually cleaning up all the artifacts and copying the few doc strings we have. Reviewed By: JDevlieghere Differential Revision: https://reviews.llvm.org/D94959
150 lines
4.7 KiB
Plaintext
150 lines
4.7 KiB
Plaintext
/*
|
|
lldb.swig
|
|
|
|
This is the input file for SWIG, to create the appropriate C++ wrappers and
|
|
functions for various scripting languages, to enable them to call the
|
|
liblldb Script Bridge functions.
|
|
*/
|
|
|
|
/* Define our module docstring. */
|
|
%define DOCSTRING
|
|
"The lldb module contains the public APIs for Python binding.
|
|
|
|
Some of the important classes are described here:
|
|
|
|
* :py:class:`SBTarget`: Represents the target program running under the debugger.
|
|
* :py:class:`SBProcess`: Represents the process associated with the target program.
|
|
* :py:class:`SBThread`: Represents a thread of execution. :py:class:`SBProcess` contains SBThreads.
|
|
* :py:class:`SBFrame`: Represents one of the stack frames associated with a thread. :py:class:`SBThread`
|
|
contains SBFrame(s).
|
|
* :py:class:`SBSymbolContext`: A container that stores various debugger related info.
|
|
* :py:class:`SBValue`: Represents the value of a variable, a register, or an expression.
|
|
* :py:class:`SBModule`: Represents an executable image and its associated object and symbol
|
|
files. :py:class:`SBTarget` contains SBModule.
|
|
* :py:class:`SBBreakpoint`: Represents a logical breakpoint and its associated settings.
|
|
:py:class:`SBTarget` contains SBBreakpoints.
|
|
* :py:class:`SBSymbol`: Represents the symbol possibly associated with a stack frame.
|
|
* :py:class:`SBCompileUnit`: Represents a compilation unit, or compiled source file.
|
|
* :py:class:`SBFunction`: Represents a generic function, which can be inlined or not.
|
|
* :py:class:`SBBlock`: Represents a lexical block. :py:class:`SBFunction` contains SBBlocks.
|
|
* :py:class:`SBLineEntry`: Specifies an association with a contiguous range of instructions
|
|
and a source file location. :py:class:`SBCompileUnit` contains SBLineEntry.
|
|
|
|
The different enums in the `lldb` module are described in :doc:`python_api_enums`.
|
|
|
|
"
|
|
%enddef
|
|
|
|
/*
|
|
Since version 3.0.9, swig's logic for importing the native module has changed in
|
|
a way that is incompatible with our usage of the python module as __init__.py
|
|
(See swig bug #769). Fortunately, since version 3.0.11, swig provides a way for
|
|
us to override the module import logic to suit our needs. This does that.
|
|
|
|
Older swig versions will simply ignore this setting.
|
|
*/
|
|
%define MODULEIMPORT
|
|
"try:
|
|
# Try an absolute import first. If we're being loaded from lldb,
|
|
# _lldb should be a built-in module.
|
|
import $module
|
|
except ImportError:
|
|
# Relative import should work if we are being loaded by Python.
|
|
from . import $module"
|
|
%enddef
|
|
// These versions will not generate working python modules, so error out early.
|
|
#if SWIG_VERSION >= 0x030009 && SWIG_VERSION < 0x030011
|
|
#error Swig versions 3.0.9 and 3.0.10 are incompatible with lldb.
|
|
#endif
|
|
|
|
// The name of the module to be created.
|
|
%module(docstring=DOCSTRING, moduleimport=MODULEIMPORT) lldb
|
|
|
|
// Parameter types will be used in the autodoc string.
|
|
%feature("autodoc", "1");
|
|
|
|
%define ARRAYHELPER(type,name)
|
|
%inline %{
|
|
type *new_ ## name (int nitems) {
|
|
return (type *) malloc(sizeof(type)*nitems);
|
|
}
|
|
void delete_ ## name(type *t) {
|
|
free(t);
|
|
}
|
|
type name ## _get(type *t, int index) {
|
|
return t[index];
|
|
}
|
|
void name ## _set(type *t, int index, type val) {
|
|
t[index] = val;
|
|
}
|
|
%}
|
|
%enddef
|
|
|
|
%pythoncode%{
|
|
import uuid
|
|
import re
|
|
import os
|
|
|
|
import six
|
|
%}
|
|
|
|
// Include the version of swig that was used to generate this interface.
|
|
%define EMBED_VERSION(VERSION)
|
|
%pythoncode%{
|
|
# SWIG_VERSION is written as a single hex number, but the components of it are
|
|
# meant to be interpreted in decimal. So, 0x030012 is swig 3.0.12, and not
|
|
# 3.0.18.
|
|
def _to_int(hex):
|
|
return hex // 0x10 % 0x10 * 10 + hex % 0x10
|
|
swig_version = (_to_int(VERSION // 0x10000), _to_int(VERSION // 0x100), _to_int(VERSION))
|
|
del _to_int
|
|
%}
|
|
%enddef
|
|
EMBED_VERSION(SWIG_VERSION)
|
|
|
|
%pythoncode%{
|
|
# ===================================
|
|
# Iterator for lldb container objects
|
|
# ===================================
|
|
def lldb_iter(obj, getsize, getelem):
|
|
"""A generator adaptor to support iteration for lldb container objects."""
|
|
size = getattr(obj, getsize)
|
|
elem = getattr(obj, getelem)
|
|
for i in range(size()):
|
|
yield elem(i)
|
|
%}
|
|
|
|
%include <std_string.i>
|
|
%include "python-typemaps.swig"
|
|
%include "macros.swig"
|
|
%include "headers.swig"
|
|
|
|
%{
|
|
#include "../source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h"
|
|
#include "../bindings/python/python-swigsafecast.swig"
|
|
using namespace lldb_private;
|
|
using namespace lldb_private::python;
|
|
using namespace lldb;
|
|
%}
|
|
|
|
%include "interfaces.swig"
|
|
%include "python-extensions.swig"
|
|
%include "python-wrapper.swig"
|
|
|
|
%pythoncode%{
|
|
_initialize = True
|
|
try:
|
|
import lldbconfig
|
|
_initialize = lldbconfig.INITIALIZE
|
|
except ImportError:
|
|
pass
|
|
debugger_unique_id = 0
|
|
if _initialize:
|
|
SBDebugger.Initialize()
|
|
debugger = None
|
|
target = None
|
|
process = None
|
|
thread = None
|
|
frame = None
|
|
%}
|