Skip to content

Commit 53674e2

Browse files
[lldb][docs] Fix plaintext markers in Formatter bytecode doc (#171430)
RST uses double backtick for plain text. For single backtick it will try to resolve it to a reference then fall back to plain text if it doesn't resolve. This leads to a lot of warnings like: formatterbytecode.rst:7: WARNING: 'any' reference target not found: ~/.lldbinit As seen on the publish-sphinx-docs bot.
1 parent 4c7b5df commit 53674e2

File tree

1 file changed

+78
-78
lines changed

1 file changed

+78
-78
lines changed

lldb/docs/resources/formatterbytecode.rst

Lines changed: 78 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ Formatter Bytecode
44
Background
55
----------
66

7-
LLDB provides rich customization options to display data types (see :doc:`/use/variable/`). To use custom data formatters, developers need to edit the global `~/.lldbinit` file to make sure they are found and loaded. In addition to this rather manual workflow, developers or library authors can ship ship data formatters with their code in a format that allows LLDB automatically find them and run them securely.
7+
LLDB provides rich customization options to display data types (see :doc`/use/variable/`). To use custom data formatters, developers need to edit the global ``~/.lldbinit`` file to make sure they are found and loaded. In addition to this rather manual workflow, developers or library authors can ship ship data formatters with their code in a format that allows LLDB automatically find them and run them securely.
88

9-
An end-to-end example of such a workflow is the Swift `DebugDescription` macro (see https://www.swift.org/blog/announcing-swift-6/#debugging ) that translates Swift string interpolation into LLDB summary strings, and puts them into a `.lldbsummaries` section, where LLDB can find them.
9+
An end-to-end example of such a workflow is the Swift ``DebugDescription`` macro (see https://www.swift.org/blog/announcing-swift-6/#debugging ) that translates Swift string interpolation into LLDB summary strings, and puts them into a ``.lldbsummaries`` section, where LLDB can find them.
1010

1111
This document describes a minimal bytecode tailored to running LLDB formatters. It defines a human-readable assembler representation for the language, an efficient binary encoding, a virtual machine for evaluating it, and format for embedding formatters into binary containers.
1212

@@ -35,11 +35,11 @@ All objects on the data stack must have one of the following data types. These d
3535
* *String* (UTF-8)
3636
* *Int* (64 bit)
3737
* *UInt* (64 bit)
38-
* *Object* (Basically an `SBValue`)
39-
* *Type* (Basically an `SBType`)
38+
* *Object* (Basically an ``SBValue``)
39+
* *Type* (Basically an ``SBType``)
4040
* *Selector* (One of the predefine functions)
4141

42-
*Object* and *Type* are opaque, they can only be used as a parameters of `call`.
42+
*Object* and *Type* are opaque, they can only be used as a parameters of ``call``.
4343

4444
Instruction set
4545
---------------
@@ -52,30 +52,30 @@ These instructions manipulate the data stack directly.
5252
======== ========== ===========================
5353
Opcode Mnemonic Stack effect
5454
-------- ---------- ---------------------------
55-
0x00 `dup` `(x -> x x)`
56-
0x01 `drop` `(x y -> x)`
57-
0x02 `pick` `(x ... UInt -> x ... x)`
58-
0x03 `over` `(x y -> x y x)`
59-
0x04 `swap` `(x y -> y x)`
60-
0x05 `rot` `(x y z -> z x y)`
55+
0x00 ``dup`` ``(x -> x x)``
56+
0x01 ``drop`` ``(x y -> x)``
57+
0x02 ``pick`` ``(x ... UInt -> x ... x)``
58+
0x03 ``over`` ``(x y -> x y x)``
59+
0x04 ``swap`` ``(x y -> y x)``
60+
0x05 ``rot`` ``(x y z -> z x y)``
6161
======== ========== ===========================
6262

6363
Control flow
6464
~~~~~~~~~~~~
6565

66-
These manipulate the control stack and program counter. Both `if` and `ifelse` expect a `UInt` at the top of the data stack to represent the condition.
66+
These manipulate the control stack and program counter. Both ``if`` and ``ifelse`` expect a ``UInt`` at the top of the data stack to represent the condition.
6767

6868
======== ========== ============================================================
6969
Opcode Mnemonic Description
7070
-------- ---------- ------------------------------------------------------------
71-
0x10 `{` push a code block address onto the control stack
72-
-- `}` (technically not an opcode) syntax for end of code block
73-
0x11 `if` `(UInt -> )` pop a block from the control stack,
71+
0x10 ``{`` push a code block address onto the control stack
72+
-- ``}`` (technically not an opcode) syntax for end of code block
73+
0x11 ``if`` ``(UInt -> )`` pop a block from the control stack,
7474
if the top of the data stack is nonzero, execute it
75-
0x12 `ifelse` `(UInt -> )` pop two blocks from the control stack, if
75+
0x12 ``ifelse`` ``(UInt -> )`` pop two blocks from the control stack, if
7676
the top of the data stack is nonzero, execute the first,
7777
otherwise the second.
78-
0x13 `return` pop the entire control stack and return
78+
0x13 ``return`` pop the entire control stack and return
7979
======== ========== ============================================================
8080

8181
Literals for basic types
@@ -84,11 +84,11 @@ Literals for basic types
8484
======== =========== ============================================================
8585
Opcode Mnemonic Description
8686
-------- ----------- ------------------------------------------------------------
87-
0x20 `123u` `( -> UInt)` push an unsigned 64-bit host integer
88-
0x21 `123` `( -> Int)` push a signed 64-bit host integer
89-
0x22 `"abc"` `( -> String)` push a UTF-8 host string
90-
0x23 `@strlen` `( -> Selector)` push one of the predefined function
91-
selectors. See `call`.
87+
0x20 ``123u`` ``( -> UInt)`` push an unsigned 64-bit host integer
88+
0x21 ``123`` ``( -> Int)`` push a signed 64-bit host integer
89+
0x22 ``"abc"`` ``( -> String)`` push a UTF-8 host string
90+
0x23 ``@strlen`` ``( -> Selector)`` push one of the predefined function
91+
selectors. See ``call``.
9292
======== =========== ============================================================
9393

9494
Conversion operations
@@ -97,77 +97,77 @@ Conversion operations
9797
======== =========== ================================================================
9898
Opcode Mnemonic Description
9999
-------- ----------- ----------------------------------------------------------------
100-
0x2a `as_int` `( UInt -> Int)` reinterpret a UInt as an Int
101-
0x2b `as_uint` `( Int -> UInt)` reinterpret an Int as a UInt
102-
0x2c `is_null` `( Object -> UInt )` check an object for null `(object ? 0 : 1)`
100+
0x2a ``as_int`` ``( UInt -> Int)`` reinterpret a UInt as an Int
101+
0x2b ``as_uint`` ``( Int -> UInt)`` reinterpret an Int as a UInt
102+
0x2c ``is_null`` ``( Object -> UInt )`` check an object for null ``(object ? 0 : 1)``
103103
======== =========== ================================================================
104104

105105

106106
Arithmetic, logic, and comparison operations
107107
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
108108

109-
All of these operations are only defined for `Int` and `UInt` and both operands need to be of the same type. The `>>` operator is an arithmetic shift if the parameters are of type `Int`, otherwise it's a logical shift to the right.
109+
All of these operations are only defined for ``Int`` and ``UInt`` and both operands need to be of the same type. The ``>>`` operator is an arithmetic shift if the parameters are of type ``Int``, otherwise it's a logical shift to the right.
110110

111111
======== ========== ===========================
112112
Opcode Mnemonic Stack effect
113113
-------- ---------- ---------------------------
114-
0x30 `+` `(x y -> [x+y])`
115-
0x31 `-` etc ...
116-
0x32 `*`
117-
0x33 `/`
118-
0x34 `%`
119-
0x35 `<<`
120-
0x36 `>>`
121-
0x40 `~`
122-
0x41 `|`
123-
0x42 `^`
124-
0x50 `=`
125-
0x51 `!=`
126-
0x52 `<`
127-
0x53 `>`
128-
0x54 `=<`
129-
0x55 `>=`
114+
0x30 ``+`` ``(x y -> [x+y])``
115+
0x31 ``-`` etc ...
116+
0x32 ``*``
117+
0x33 ``/``
118+
0x34 ``%``
119+
0x35 ``<<``
120+
0x36 ``>>``
121+
0x40 ``~``
122+
0x41 ``|``
123+
0x42 ``^``
124+
0x50 ``=``
125+
0x51 ``!=``
126+
0x52 ``<``
127+
0x53 ``>``
128+
0x54 ``=<``
129+
0x55 ``>=``
130130
======== ========== ===========================
131131

132132
Function calls
133133
~~~~~~~~~~~~~~
134134

135-
For security reasons the list of functions callable with `call` is predefined. The supported functions are either existing methods on `SBValue`, or string formatting operations.
135+
For security reasons the list of functions callable with ``call`` is predefined. The supported functions are either existing methods on ``SBValue``, or string formatting operations.
136136

137137
======== ========== ============================================
138138
Opcode Mnemonic Stack effect
139139
-------- ---------- --------------------------------------------
140-
0x60 `call` `(Object argN ... arg0 Selector -> retval)`
140+
0x60 ``call`` ``(Object argN ... arg0 Selector -> retval)``
141141
======== ========== ============================================
142142

143143
Method is one of a predefined set of *Selectors*.
144144

145145
==== ============================ =================================================== ==================================
146146
Sel. Mnemonic Stack Effect Description
147147
---- ---------------------------- --------------------------------------------------- ----------------------------------
148-
0x00 `summary` `(Object @summary -> String)` `SBValue::GetSummary`
149-
0x01 `type_summary` `(Object @type_summary -> String)` `SBValue::GetTypeSummary`
150-
0x10 `get_num_children` `(Object @get_num_children -> UInt)` `SBValue::GetNumChildren`
151-
0x11 `get_child_at_index` `(Object UInt @get_child_at_index -> Object)` `SBValue::GetChildAtIndex`
152-
0x12 `get_child_with_name` `(Object String @get_child_with_name -> Object)` `SBValue::GetChildAtIndex`
153-
0x13 `get_child_index` `(Object String @get_child_index -> UInt)` `SBValue::GetChildIndex`
154-
0x15 `get_type` `(Object @get_type -> Type)` `SBValue::GetType`
155-
0x16 `get_template_argument_type` `(Object UInt @get_template_argument_type -> Type)` `SBValue::GetTemplateArgumentType`
156-
0x17 `cast` `(Object Type @cast -> Object)` `SBValue::Cast`
157-
0x20 `get_value` `(Object @get_value -> Object)` `SBValue::GetValue`
158-
0x21 `get_value_as_unsigned` `(Object @get_value_as_unsigned -> UInt)` `SBValue::GetValueAsUnsigned`
159-
0x22 `get_value_as_signed` `(Object @get_value_as_signed -> Int)` `SBValue::GetValueAsSigned`
160-
0x23 `get_value_as_address` `(Object @get_value_as_address -> UInt)` `SBValue::GetValueAsAddress`
161-
0x40 `read_memory_byte` `(UInt @read_memory_byte -> UInt)` `Target::ReadMemory`
162-
0x41 `read_memory_uint32` `(UInt @read_memory_uint32 -> UInt)` `Target::ReadMemory`
163-
0x42 `read_memory_int32` `(UInt @read_memory_int32 -> Int)` `Target::ReadMemory`
164-
0x43 `read_memory_uint64` `(UInt @read_memory_uint64 -> UInt)` `Target::ReadMemory`
165-
0x44 `read_memory_int64` `(UInt @read_memory_int64 -> Int)` `Target::ReadMemory`
166-
0x45 `read_memory_address` `(UInt @read_memory_uint64 -> UInt)` `Target::ReadMemory`
167-
0x46 `read_memory` `(UInt Type @read_memory -> Object)` `Target::ReadMemory`
168-
0x50 `fmt` `(String arg0 ... @fmt -> String)` `llvm::format`
169-
0x51 `sprintf` `(String arg0 ... sprintf -> String)` `sprintf`
170-
0x52 `strlen` `(String strlen -> String)` `strlen in bytes`
148+
0x00 ``summary`` ``(Object @summary -> String)`` ``SBValue::GetSummary``
149+
0x01 ``type_summary`` ``(Object @type_summary -> String)`` ``SBValue::GetTypeSummary``
150+
0x10 ``get_num_children`` ``(Object @get_num_children -> UInt)`` ``SBValue::GetNumChildren``
151+
0x11 ``get_child_at_index`` ``(Object UInt @get_child_at_index -> Object)`` ``SBValue::GetChildAtIndex``
152+
0x12 ``get_child_with_name`` ``(Object String @get_child_with_name -> Object)`` ``SBValue::GetChildAtIndex``
153+
0x13 ``get_child_index`` ``(Object String @get_child_index -> UInt)`` ``SBValue::GetChildIndex``
154+
0x15 ``get_type`` ``(Object @get_type -> Type)`` ``SBValue::GetType``
155+
0x16 ``get_template_argument_type`` ``(Object UInt @get_template_argument_type -> Type)`` ``SBValue::GetTemplateArgumentType``
156+
0x17 ``cast`` ``(Object Type @cast -> Object)`` ``SBValue::Cast``
157+
0x20 ``get_value`` ``(Object @get_value -> Object)`` ``SBValue::GetValue``
158+
0x21 ``get_value_as_unsigned`` ``(Object @get_value_as_unsigned -> UInt)`` ``SBValue::GetValueAsUnsigned``
159+
0x22 ``get_value_as_signed`` ``(Object @get_value_as_signed -> Int)`` ``SBValue::GetValueAsSigned``
160+
0x23 ``get_value_as_address`` ``(Object @get_value_as_address -> UInt)`` ``SBValue::GetValueAsAddress``
161+
0x40 ``read_memory_byte`` ``(UInt @read_memory_byte -> UInt)`` ``Target::ReadMemory``
162+
0x41 ``read_memory_uint32`` ``(UInt @read_memory_uint32 -> UInt)`` ``Target::ReadMemory``
163+
0x42 ``read_memory_int32`` ``(UInt @read_memory_int32 -> Int)`` ``Target::ReadMemory``
164+
0x43 ``read_memory_uint64`` ``(UInt @read_memory_uint64 -> UInt)`` ``Target::ReadMemory``
165+
0x44 ``read_memory_int64`` ``(UInt @read_memory_int64 -> Int)`` ``Target::ReadMemory``
166+
0x45 ``read_memory_address`` ``(UInt @read_memory_uint64 -> UInt)`` ``Target::ReadMemory``
167+
0x46 ``read_memory`` ``(UInt Type @read_memory -> Object)`` ``Target::ReadMemory``
168+
0x50 ``fmt`` ``(String arg0 ... @fmt -> String)`` ``llvm::format``
169+
0x51 ``sprintf`` ``(String arg0 ... sprintf -> String)`` ``sprintf``
170+
0x52 ``strlen`` ``(String strlen -> String)`` ``strlen in bytes``
171171
==== ============================ =================================================== ==================================
172172

173173
Byte Code
@@ -183,7 +183,7 @@ Most instructions are just a single byte opcode. The only exceptions are the lit
183183
Embedding
184184
~~~~~~~~~
185185

186-
Expression programs are embedded into an `.lldbformatters` section (an evolution of the Swift `.lldbsummaries` section) that is a dictionary of type names/regexes and descriptions. It consists of a list of records. Each record starts with the following header:
186+
Expression programs are embedded into an ``.lldbformatters`` section (an evolution of the Swift ``.lldbsummaries`` section) that is a dictionary of type names/regexes and descriptions. It consists of a list of records. Each record starts with the following header:
187187

188188
* Version number (ULEB128)
189189
* Remaining size of the record (minus the header) (ULEB128)
@@ -197,9 +197,9 @@ In version 1, a record consists of a dictionary key, which is a type name or reg
197197
* Length of the key in bytes (ULEB128)
198198
* The key (UTF-8)
199199

200-
A regex has to start with `^`, which is part of the regular expression.
200+
A regex has to start with ``^``, which is part of the regular expression.
201201

202-
After this comes a flag bitfield, which is a ULEB-encoded `lldb::TypeOptions` bitfield.
202+
After this comes a flag bitfield, which is a ULEB-encoded ``lldb::TypeOptions`` bitfield.
203203

204204
* Flags (ULEB128)
205205

@@ -215,22 +215,22 @@ The possible function signatures are:
215215
========= ====================== ==========================
216216
Signature Mnemonic Stack Effect
217217
--------- ---------------------- --------------------------
218-
0x00 `@summary` `(Object -> String)`
219-
0x01 `@init` `(Object -> Object+)`
220-
0x02 `@get_num_children` `(Object+ -> UInt)`
221-
0x03 `@get_child_index` `(Object+ String -> UInt)`
222-
0x04 `@get_child_at_index` `(Object+ UInt -> Object)`
223-
0x05 `@get_value` `(Object+ -> String)`
218+
0x00 ``@summary`` ``(Object -> String)``
219+
0x01 ``@init`` ``(Object -> Object+)``
220+
0x02 ``@get_num_children`` ``(Object+ -> UInt)``
221+
0x03 ``@get_child_index`` ``(Object+ String -> UInt)``
222+
0x04 ``@get_child_at_index`` ``(Object+ UInt -> Object)``
223+
0x05 ``@get_value`` ``(Object+ -> String)``
224224
========= ====================== ==========================
225225

226-
If not specified, the init function defaults to an empty function that just passes the Object along. Its results may be cached and allow common prep work to be done for an Object that can be reused by subsequent calls to the other methods. This way subsequent calls to `@get_child_at_index` can avoid recomputing shared information, for example.
226+
If not specified, the init function defaults to an empty function that just passes the Object along. Its results may be cached and allow common prep work to be done for an Object that can be reused by subsequent calls to the other methods. This way subsequent calls to ``@get_child_at_index`` can avoid recomputing shared information, for example.
227227

228228
While it is more efficient to store multiple programs per type key, this is not a requirement. LLDB will merge all entries. If there are conflicts the result is undefined.
229229

230230
Execution model
231231
~~~~~~~~~~~~~~~
232232

233-
Execution begins at the first byte in the program. The program counter of the virtual machine starts at offset 0 of the bytecode and may never move outside the range of the program as defined in the header. The data stack starts with one Object or the result of the `@init` function (`Object+` in the table above).
233+
Execution begins at the first byte in the program. The program counter of the virtual machine starts at offset 0 of the bytecode and may never move outside the range of the program as defined in the header. The data stack starts with one Object or the result of the ``@init`` function (``Object+`` in the table above).
234234

235235
Error handling
236236
~~~~~~~~~~~~~~

0 commit comments

Comments
 (0)