xref: /aosp_15_r20/external/stg/doc/tutorial.md (revision 9e3b08ae94a55201065475453d799e8b1378bea6)
1*9e3b08aeSAndroid Build Coastguard Worker# Tutorial
2*9e3b08aeSAndroid Build Coastguard Worker
3*9e3b08aeSAndroid Build Coastguard WorkerThe simplest use for the STG tools is to extract, store and compare ABI
4*9e3b08aeSAndroid Build Coastguard Workerrepresentations.
5*9e3b08aeSAndroid Build Coastguard Worker
6*9e3b08aeSAndroid Build Coastguard WorkerThis tutorial uses long options throughout. Equivalent short options can be
7*9e3b08aeSAndroid Build Coastguard Workerfound in the manual pages for [`stg`](stg.md) and [`stgdiff`](stgdiff.md). Both
8*9e3b08aeSAndroid Build Coastguard Workertools understand `-` as a shorthand for `/dev/stdout`.
9*9e3b08aeSAndroid Build Coastguard Worker
10*9e3b08aeSAndroid Build Coastguard Worker<details>
11*9e3b08aeSAndroid Build Coastguard Worker<summary>Working Example - code and compilation</summary>
12*9e3b08aeSAndroid Build Coastguard Worker
13*9e3b08aeSAndroid Build Coastguard WorkerThis small code sample will be used as a working example. Copy it into a file
14*9e3b08aeSAndroid Build Coastguard Workercalled `tree.c`.
15*9e3b08aeSAndroid Build Coastguard Worker
16*9e3b08aeSAndroid Build Coastguard Worker```c
17*9e3b08aeSAndroid Build Coastguard Workerstruct N {
18*9e3b08aeSAndroid Build Coastguard Worker  struct N * left;
19*9e3b08aeSAndroid Build Coastguard Worker  struct N * right;
20*9e3b08aeSAndroid Build Coastguard Worker  int value;
21*9e3b08aeSAndroid Build Coastguard Worker};
22*9e3b08aeSAndroid Build Coastguard Worker
23*9e3b08aeSAndroid Build Coastguard Workerunsigned int count(struct N * tree) {
24*9e3b08aeSAndroid Build Coastguard Worker  return tree ? count(tree->left) + count(tree->right) + 1 : 0;
25*9e3b08aeSAndroid Build Coastguard Worker}
26*9e3b08aeSAndroid Build Coastguard Worker
27*9e3b08aeSAndroid Build Coastguard Workerint sum(struct N * tree) {
28*9e3b08aeSAndroid Build Coastguard Worker  return tree ? sum(tree->left) + sum(tree->right) + tree->value : 0;
29*9e3b08aeSAndroid Build Coastguard Worker}
30*9e3b08aeSAndroid Build Coastguard Worker```
31*9e3b08aeSAndroid Build Coastguard Worker
32*9e3b08aeSAndroid Build Coastguard WorkerCompile it:
33*9e3b08aeSAndroid Build Coastguard Worker
34*9e3b08aeSAndroid Build Coastguard Worker```shell
35*9e3b08aeSAndroid Build Coastguard Workergcc -Wall -Wextra -g -c tree.c -o tree.o
36*9e3b08aeSAndroid Build Coastguard Worker```
37*9e3b08aeSAndroid Build Coastguard Worker
38*9e3b08aeSAndroid Build Coastguard Worker</details>
39*9e3b08aeSAndroid Build Coastguard Worker
40*9e3b08aeSAndroid Build Coastguard Worker## Extraction from ELF / DWARF
41*9e3b08aeSAndroid Build Coastguard Worker
42*9e3b08aeSAndroid Build Coastguard Worker`stg` is the tool for extracting ABI representations, though it can do more
43*9e3b08aeSAndroid Build Coastguard Workersophisticated things as well. The simplest invocation of `stg` looks something
44*9e3b08aeSAndroid Build Coastguard Workerlike this:
45*9e3b08aeSAndroid Build Coastguard Worker
46*9e3b08aeSAndroid Build Coastguard Worker```shell
47*9e3b08aeSAndroid Build Coastguard Workerstg --elf library.so --output library.stg
48*9e3b08aeSAndroid Build Coastguard Worker```
49*9e3b08aeSAndroid Build Coastguard Worker
50*9e3b08aeSAndroid Build Coastguard WorkerAdding the `--annotate` option can be useful, especially if trying to debug ABI
51*9e3b08aeSAndroid Build Coastguard Workerissues or when experimenting with the tools, like now.
52*9e3b08aeSAndroid Build Coastguard Worker
53*9e3b08aeSAndroid Build Coastguard WorkerIf the output consists of just symbols and you get a warning about missing DWARF
54*9e3b08aeSAndroid Build Coastguard Workerinformation, this means that `library.so` has no DWARF debugging information.
55*9e3b08aeSAndroid Build Coastguard WorkerFor meaningful results, `stg` should be run on an *unstripped* ELF file which
56*9e3b08aeSAndroid Build Coastguard Workermay require build system adjustments.
57*9e3b08aeSAndroid Build Coastguard Worker
58*9e3b08aeSAndroid Build Coastguard Worker<details>
59*9e3b08aeSAndroid Build Coastguard Worker<summary>Working Example - ABI extraction</summary>
60*9e3b08aeSAndroid Build Coastguard Worker
61*9e3b08aeSAndroid Build Coastguard WorkerRun this:
62*9e3b08aeSAndroid Build Coastguard Worker
63*9e3b08aeSAndroid Build Coastguard Worker```shell
64*9e3b08aeSAndroid Build Coastguard Workerstg --elf tree.o --annotate --output -
65*9e3b08aeSAndroid Build Coastguard Worker```
66*9e3b08aeSAndroid Build Coastguard Worker
67*9e3b08aeSAndroid Build Coastguard WorkerAnd you should get something like this:
68*9e3b08aeSAndroid Build Coastguard Worker
69*9e3b08aeSAndroid Build Coastguard Worker<details>
70*9e3b08aeSAndroid Build Coastguard Worker<summary>Output</summary>
71*9e3b08aeSAndroid Build Coastguard Worker
72*9e3b08aeSAndroid Build Coastguard Worker```proto
73*9e3b08aeSAndroid Build Coastguard Workerversion: 0x00000002
74*9e3b08aeSAndroid Build Coastguard Workerroot_id: 0x84ea5130  # interface
75*9e3b08aeSAndroid Build Coastguard Workerpointer_reference {
76*9e3b08aeSAndroid Build Coastguard Worker  id: 0x32b38621
77*9e3b08aeSAndroid Build Coastguard Worker  kind: POINTER
78*9e3b08aeSAndroid Build Coastguard Worker  pointee_type_id: 0xe08efe1a  # struct N
79*9e3b08aeSAndroid Build Coastguard Worker}
80*9e3b08aeSAndroid Build Coastguard Workerprimitive {
81*9e3b08aeSAndroid Build Coastguard Worker  id: 0x4585663f
82*9e3b08aeSAndroid Build Coastguard Worker  name: "unsigned int"
83*9e3b08aeSAndroid Build Coastguard Worker  encoding: UNSIGNED_INTEGER
84*9e3b08aeSAndroid Build Coastguard Worker  bytesize: 0x00000004
85*9e3b08aeSAndroid Build Coastguard Worker}
86*9e3b08aeSAndroid Build Coastguard Workerprimitive {
87*9e3b08aeSAndroid Build Coastguard Worker  id: 0x6720d32f
88*9e3b08aeSAndroid Build Coastguard Worker  name: "int"
89*9e3b08aeSAndroid Build Coastguard Worker  encoding: SIGNED_INTEGER
90*9e3b08aeSAndroid Build Coastguard Worker  bytesize: 0x00000004
91*9e3b08aeSAndroid Build Coastguard Worker}
92*9e3b08aeSAndroid Build Coastguard Workermember {
93*9e3b08aeSAndroid Build Coastguard Worker  id: 0x35cbdb23
94*9e3b08aeSAndroid Build Coastguard Worker  name: "left"
95*9e3b08aeSAndroid Build Coastguard Worker  type_id: 0x32b38621  # struct N*
96*9e3b08aeSAndroid Build Coastguard Worker}
97*9e3b08aeSAndroid Build Coastguard Workermember {
98*9e3b08aeSAndroid Build Coastguard Worker  id: 0x0b440ffb
99*9e3b08aeSAndroid Build Coastguard Worker  name: "right"
100*9e3b08aeSAndroid Build Coastguard Worker  type_id: 0x32b38621  # struct N*
101*9e3b08aeSAndroid Build Coastguard Worker  offset: 64
102*9e3b08aeSAndroid Build Coastguard Worker}
103*9e3b08aeSAndroid Build Coastguard Workermember {
104*9e3b08aeSAndroid Build Coastguard Worker  id: 0xa06f75d5
105*9e3b08aeSAndroid Build Coastguard Worker  name: "value"
106*9e3b08aeSAndroid Build Coastguard Worker  type_id: 0x6720d32f  # int
107*9e3b08aeSAndroid Build Coastguard Worker  offset: 128
108*9e3b08aeSAndroid Build Coastguard Worker}
109*9e3b08aeSAndroid Build Coastguard Workerstruct_union {
110*9e3b08aeSAndroid Build Coastguard Worker  id: 0xe08efe1a
111*9e3b08aeSAndroid Build Coastguard Worker  kind: STRUCT
112*9e3b08aeSAndroid Build Coastguard Worker  name: "N"
113*9e3b08aeSAndroid Build Coastguard Worker  definition {
114*9e3b08aeSAndroid Build Coastguard Worker    bytesize: 24
115*9e3b08aeSAndroid Build Coastguard Worker    member_id: 0x35cbdb23  # struct N* left
116*9e3b08aeSAndroid Build Coastguard Worker    member_id: 0x0b440ffb  # struct N* right
117*9e3b08aeSAndroid Build Coastguard Worker    member_id: 0xa06f75d5  # int value
118*9e3b08aeSAndroid Build Coastguard Worker  }
119*9e3b08aeSAndroid Build Coastguard Worker}
120*9e3b08aeSAndroid Build Coastguard Workerfunction {
121*9e3b08aeSAndroid Build Coastguard Worker  id: 0x912c02a7
122*9e3b08aeSAndroid Build Coastguard Worker  return_type_id: 0x6720d32f  # int
123*9e3b08aeSAndroid Build Coastguard Worker  parameter_id: 0x32b38621  # struct N*
124*9e3b08aeSAndroid Build Coastguard Worker}
125*9e3b08aeSAndroid Build Coastguard Workerfunction {
126*9e3b08aeSAndroid Build Coastguard Worker  id: 0xc2779f73
127*9e3b08aeSAndroid Build Coastguard Worker  return_type_id: 0x4585663f  # unsigned int
128*9e3b08aeSAndroid Build Coastguard Worker  parameter_id: 0x32b38621  # struct N*
129*9e3b08aeSAndroid Build Coastguard Worker}
130*9e3b08aeSAndroid Build Coastguard Workerelf_symbol {
131*9e3b08aeSAndroid Build Coastguard Worker  id: 0xbb237197
132*9e3b08aeSAndroid Build Coastguard Worker  name: "count"
133*9e3b08aeSAndroid Build Coastguard Worker  is_defined: true
134*9e3b08aeSAndroid Build Coastguard Worker  symbol_type: FUNCTION
135*9e3b08aeSAndroid Build Coastguard Worker  type_id: 0xc2779f73  # unsigned int(struct N*)
136*9e3b08aeSAndroid Build Coastguard Worker  full_name: "count"
137*9e3b08aeSAndroid Build Coastguard Worker}
138*9e3b08aeSAndroid Build Coastguard Workerelf_symbol {
139*9e3b08aeSAndroid Build Coastguard Worker  id: 0x4fdeca38
140*9e3b08aeSAndroid Build Coastguard Worker  name: "sum"
141*9e3b08aeSAndroid Build Coastguard Worker  is_defined: true
142*9e3b08aeSAndroid Build Coastguard Worker  symbol_type: FUNCTION
143*9e3b08aeSAndroid Build Coastguard Worker  type_id: 0x912c02a7  # int(struct N*)
144*9e3b08aeSAndroid Build Coastguard Worker  full_name: "sum"
145*9e3b08aeSAndroid Build Coastguard Worker}
146*9e3b08aeSAndroid Build Coastguard Workerinterface {
147*9e3b08aeSAndroid Build Coastguard Worker  id: 0x84ea5130
148*9e3b08aeSAndroid Build Coastguard Worker  symbol_id: 0xbb237197  # unsigned int count(struct N*)
149*9e3b08aeSAndroid Build Coastguard Worker  symbol_id: 0x4fdeca38  # int sum(struct N*)
150*9e3b08aeSAndroid Build Coastguard Worker}
151*9e3b08aeSAndroid Build Coastguard Worker```
152*9e3b08aeSAndroid Build Coastguard Worker
153*9e3b08aeSAndroid Build Coastguard Worker</details>
154*9e3b08aeSAndroid Build Coastguard Worker
155*9e3b08aeSAndroid Build Coastguard Worker</details>
156*9e3b08aeSAndroid Build Coastguard Worker
157*9e3b08aeSAndroid Build Coastguard Worker## Filtering
158*9e3b08aeSAndroid Build Coastguard Worker
159*9e3b08aeSAndroid Build Coastguard WorkerOne issue when first starting to manage the ABI of a binary is the wish to
160*9e3b08aeSAndroid Build Coastguard Workerrestrict the interface surface to just the necessary minimum. Any superfluous
161*9e3b08aeSAndroid Build Coastguard Workersymbols or type definitions in the ABI representation can result in spurious ABI
162*9e3b08aeSAndroid Build Coastguard Workerdifferences in reports later on.
163*9e3b08aeSAndroid Build Coastguard Worker
164*9e3b08aeSAndroid Build Coastguard WorkerWhen it comes to the symbols exposed, it's common to control symbol
165*9e3b08aeSAndroid Build Coastguard Worker*visibility*. Type definitions can be either exposed in public header files or
166*9e3b08aeSAndroid Build Coastguard Workerhidden in private header files, with perhaps only public forward declarations,
167*9e3b08aeSAndroid Build Coastguard Workerbut this does not remove any type definitions in the DWARF information.
168*9e3b08aeSAndroid Build Coastguard Worker
169*9e3b08aeSAndroid Build Coastguard WorkerSTG provides filtering facilities for both symbols and types, for example:
170*9e3b08aeSAndroid Build Coastguard Worker
171*9e3b08aeSAndroid Build Coastguard Worker```shell
172*9e3b08aeSAndroid Build Coastguard Workerstg --files '*.h' --elf library.so --output library.stg
173*9e3b08aeSAndroid Build Coastguard Worker```
174*9e3b08aeSAndroid Build Coastguard Worker
175*9e3b08aeSAndroid Build Coastguard WorkerThis will ensure that definitions of any types defined outside any header files,
176*9e3b08aeSAndroid Build Coastguard Workerand perhaps used as opaque pointer handles, are omitted from the ABI
177*9e3b08aeSAndroid Build Coastguard Workerrepresentation. If you separate public and private headers, then use an
178*9e3b08aeSAndroid Build Coastguard Workerappropriate glob pattern that distinguishes the two.
179*9e3b08aeSAndroid Build Coastguard Worker
180*9e3b08aeSAndroid Build Coastguard WorkerSets of symbol or file names can be read from a file. In this example, all
181*9e3b08aeSAndroid Build Coastguard Workersymbols whose names begin with `api_`, except those in the `obsolete` file, are
182*9e3b08aeSAndroid Build Coastguard Workerkept.
183*9e3b08aeSAndroid Build Coastguard Worker
184*9e3b08aeSAndroid Build Coastguard Worker```shell
185*9e3b08aeSAndroid Build Coastguard Workerstg --symbols 'api_* & ! :obsolete' --elf library.so --output library.stg
186*9e3b08aeSAndroid Build Coastguard Worker```
187*9e3b08aeSAndroid Build Coastguard Worker
188*9e3b08aeSAndroid Build Coastguard WorkerFor historical reasons, the literal filter file format is compatible with
189*9e3b08aeSAndroid Build Coastguard Workerlibabigail's symbol list one, but this is subject to change.
190*9e3b08aeSAndroid Build Coastguard Worker
191*9e3b08aeSAndroid Build Coastguard Worker```ini
192*9e3b08aeSAndroid Build Coastguard Worker[list]
193*9e3b08aeSAndroid Build Coastguard Worker # one symbol per line
194*9e3b08aeSAndroid Build Coastguard Worker foo # comments, whitespace and empty lines are all ignored
195*9e3b08aeSAndroid Build Coastguard Worker bar
196*9e3b08aeSAndroid Build Coastguard Worker
197*9e3b08aeSAndroid Build Coastguard Worker baz
198*9e3b08aeSAndroid Build Coastguard Worker```
199*9e3b08aeSAndroid Build Coastguard Worker
200*9e3b08aeSAndroid Build Coastguard Worker<details>
201*9e3b08aeSAndroid Build Coastguard Worker<summary>Working Example - filtering the ABI</summary>
202*9e3b08aeSAndroid Build Coastguard Worker
203*9e3b08aeSAndroid Build Coastguard WorkerLet's say that `struct N` is supposed to be an opaque type that user code only
204*9e3b08aeSAndroid Build Coastguard Workergets pointers to and, additionally, the function `count` should be excluded from
205*9e3b08aeSAndroid Build Coastguard Workerthe ABI (perhaps due to an argument over its return type). We can exclude the
206*9e3b08aeSAndroid Build Coastguard Workerdefinition of `struct N`, along with that of any other types defined in
207*9e3b08aeSAndroid Build Coastguard Worker`tree.c`, using a file filter. The symbol can be excluded by name.
208*9e3b08aeSAndroid Build Coastguard Worker
209*9e3b08aeSAndroid Build Coastguard WorkerRun this:
210*9e3b08aeSAndroid Build Coastguard Worker
211*9e3b08aeSAndroid Build Coastguard Worker```shell
212*9e3b08aeSAndroid Build Coastguard Workerstg --elf tree.o --files '*.h' --symbols '!count' --output -
213*9e3b08aeSAndroid Build Coastguard Worker```
214*9e3b08aeSAndroid Build Coastguard Worker
215*9e3b08aeSAndroid Build Coastguard WorkerThe result should be something like this:
216*9e3b08aeSAndroid Build Coastguard Worker
217*9e3b08aeSAndroid Build Coastguard Worker<details>
218*9e3b08aeSAndroid Build Coastguard Worker<summary>Output</summary>
219*9e3b08aeSAndroid Build Coastguard Worker
220*9e3b08aeSAndroid Build Coastguard Worker```proto
221*9e3b08aeSAndroid Build Coastguard Workerversion: 0x00000002
222*9e3b08aeSAndroid Build Coastguard Workerroot_id: 0x84ea5130
223*9e3b08aeSAndroid Build Coastguard Workerpointer_reference {
224*9e3b08aeSAndroid Build Coastguard Worker  id: 0x26944aa7
225*9e3b08aeSAndroid Build Coastguard Worker  kind: POINTER
226*9e3b08aeSAndroid Build Coastguard Worker  pointee_type_id: 0xb011cc02
227*9e3b08aeSAndroid Build Coastguard Worker}
228*9e3b08aeSAndroid Build Coastguard Workerprimitive {
229*9e3b08aeSAndroid Build Coastguard Worker  id: 0x6720d32f
230*9e3b08aeSAndroid Build Coastguard Worker  name: "int"
231*9e3b08aeSAndroid Build Coastguard Worker  encoding: SIGNED_INTEGER
232*9e3b08aeSAndroid Build Coastguard Worker  bytesize: 0x00000004
233*9e3b08aeSAndroid Build Coastguard Worker}
234*9e3b08aeSAndroid Build Coastguard Workerstruct_union {
235*9e3b08aeSAndroid Build Coastguard Worker  id: 0xb011cc02
236*9e3b08aeSAndroid Build Coastguard Worker  kind: STRUCT
237*9e3b08aeSAndroid Build Coastguard Worker  name: "N"
238*9e3b08aeSAndroid Build Coastguard Worker}
239*9e3b08aeSAndroid Build Coastguard Workerfunction {
240*9e3b08aeSAndroid Build Coastguard Worker  id: 0x9425f186
241*9e3b08aeSAndroid Build Coastguard Worker  return_type_id: 0x6720d32f
242*9e3b08aeSAndroid Build Coastguard Worker  parameter_id: 0x26944aa7
243*9e3b08aeSAndroid Build Coastguard Worker}
244*9e3b08aeSAndroid Build Coastguard Workerelf_symbol {
245*9e3b08aeSAndroid Build Coastguard Worker  id: 0x4fdeca38
246*9e3b08aeSAndroid Build Coastguard Worker  name: "sum"
247*9e3b08aeSAndroid Build Coastguard Worker  is_defined: true
248*9e3b08aeSAndroid Build Coastguard Worker  symbol_type: FUNCTION
249*9e3b08aeSAndroid Build Coastguard Worker  type_id: 0x9425f186
250*9e3b08aeSAndroid Build Coastguard Worker  full_name: "sum"
251*9e3b08aeSAndroid Build Coastguard Worker}
252*9e3b08aeSAndroid Build Coastguard Workerinterface {
253*9e3b08aeSAndroid Build Coastguard Worker  id: 0x84ea5130
254*9e3b08aeSAndroid Build Coastguard Worker  symbol_id: 0x4fdeca38
255*9e3b08aeSAndroid Build Coastguard Worker}
256*9e3b08aeSAndroid Build Coastguard Worker```
257*9e3b08aeSAndroid Build Coastguard Worker
258*9e3b08aeSAndroid Build Coastguard Worker</details>
259*9e3b08aeSAndroid Build Coastguard Worker
260*9e3b08aeSAndroid Build Coastguard Worker</details>
261*9e3b08aeSAndroid Build Coastguard Worker
262*9e3b08aeSAndroid Build Coastguard Worker## ABI Comparison
263*9e3b08aeSAndroid Build Coastguard Worker
264*9e3b08aeSAndroid Build Coastguard Worker`stgdiff` is the tool for comparing ABI representations and reporting
265*9e3b08aeSAndroid Build Coastguard Workerdifferences, though it has some other, more specialised, uses. The simplest
266*9e3b08aeSAndroid Build Coastguard Workerinvocation of `stgdiff` looks something like this:
267*9e3b08aeSAndroid Build Coastguard Worker
268*9e3b08aeSAndroid Build Coastguard Worker```shell
269*9e3b08aeSAndroid Build Coastguard Workerstgdiff --stg old/library.stg new/library.stg --output -
270*9e3b08aeSAndroid Build Coastguard Worker```
271*9e3b08aeSAndroid Build Coastguard Worker
272*9e3b08aeSAndroid Build Coastguard WorkerThis will report ABI differences in the default (`small`) format.
273*9e3b08aeSAndroid Build Coastguard Worker
274*9e3b08aeSAndroid Build Coastguard Worker<details>
275*9e3b08aeSAndroid Build Coastguard Worker<summary>Working Example - ABI differences - small format</summary>
276*9e3b08aeSAndroid Build Coastguard Worker
277*9e3b08aeSAndroid Build Coastguard WorkerThe function `sum` has a type that depends on `struct N`. Any change to either
278*9e3b08aeSAndroid Build Coastguard Workermight affect the ABI exposed via `sum`. For example, if the type of the `value`
279*9e3b08aeSAndroid Build Coastguard Workermember is changed to `short` and the file is recompiled, STG can detect this
280*9e3b08aeSAndroid Build Coastguard Workerdifference.
281*9e3b08aeSAndroid Build Coastguard Worker
282*9e3b08aeSAndroid Build Coastguard WorkerFirst rerun the STG extraction, specifying `--output tree-old.stg`. Make the
283*9e3b08aeSAndroid Build Coastguard Workersource code change, recompile and extract the ABI with `--output tree-new.stg`.
284*9e3b08aeSAndroid Build Coastguard Worker
285*9e3b08aeSAndroid Build Coastguard WorkerThen run this:
286*9e3b08aeSAndroid Build Coastguard Worker
287*9e3b08aeSAndroid Build Coastguard Worker```shell
288*9e3b08aeSAndroid Build Coastguard Workerstgdiff --stg tree-old.stg tree-new.stg --output -
289*9e3b08aeSAndroid Build Coastguard Worker```
290*9e3b08aeSAndroid Build Coastguard Worker
291*9e3b08aeSAndroid Build Coastguard WorkerTo get this:
292*9e3b08aeSAndroid Build Coastguard Worker
293*9e3b08aeSAndroid Build Coastguard Worker```text
294*9e3b08aeSAndroid Build Coastguard Workertype 'struct N' changed
295*9e3b08aeSAndroid Build Coastguard Worker  member changed from 'int value' to 'short int value'
296*9e3b08aeSAndroid Build Coastguard Worker    type changed from 'int' to 'short int'
297*9e3b08aeSAndroid Build Coastguard Worker
298*9e3b08aeSAndroid Build Coastguard Worker```
299*9e3b08aeSAndroid Build Coastguard Worker
300*9e3b08aeSAndroid Build Coastguard Worker</details>
301*9e3b08aeSAndroid Build Coastguard Worker
302*9e3b08aeSAndroid Build Coastguard WorkerThe `small` format omits parts of the ABI graph which haven't changed.[^1] To
303*9e3b08aeSAndroid Build Coastguard Workersee all impacted nodes, use `--format flat` instead.
304*9e3b08aeSAndroid Build Coastguard Worker
305*9e3b08aeSAndroid Build Coastguard Worker[^1]: The similarly named `short` format goes a bit further and will omit and
306*9e3b08aeSAndroid Build Coastguard Worker    summarise certain repetitive differences.
307*9e3b08aeSAndroid Build Coastguard Worker
308*9e3b08aeSAndroid Build Coastguard Worker<details>
309*9e3b08aeSAndroid Build Coastguard Worker<summary>Working Example - ABI differences - flat format</summary>
310*9e3b08aeSAndroid Build Coastguard Worker
311*9e3b08aeSAndroid Build Coastguard Worker```text
312*9e3b08aeSAndroid Build Coastguard Workerfunction symbol 'int sum(struct N*)' changed
313*9e3b08aeSAndroid Build Coastguard Worker  type 'int(struct N*)' changed
314*9e3b08aeSAndroid Build Coastguard Worker    parameter 1 type 'struct N*' changed
315*9e3b08aeSAndroid Build Coastguard Worker      pointed-to type 'struct N' changed
316*9e3b08aeSAndroid Build Coastguard Worker
317*9e3b08aeSAndroid Build Coastguard Workertype 'struct N' changed
318*9e3b08aeSAndroid Build Coastguard Worker  member 'struct N* left' changed
319*9e3b08aeSAndroid Build Coastguard Worker    type 'struct N*' changed
320*9e3b08aeSAndroid Build Coastguard Worker      pointed-to type 'struct N' changed
321*9e3b08aeSAndroid Build Coastguard Worker  member 'struct N* right' changed
322*9e3b08aeSAndroid Build Coastguard Worker    type 'struct N*' changed
323*9e3b08aeSAndroid Build Coastguard Worker      pointed-to type 'struct N' changed
324*9e3b08aeSAndroid Build Coastguard Worker  member changed from 'int value' to 'short int value'
325*9e3b08aeSAndroid Build Coastguard Worker    type changed from 'int' to 'short int'
326*9e3b08aeSAndroid Build Coastguard Worker
327*9e3b08aeSAndroid Build Coastguard Worker```
328*9e3b08aeSAndroid Build Coastguard Worker
329*9e3b08aeSAndroid Build Coastguard Worker</details>
330*9e3b08aeSAndroid Build Coastguard Worker
331*9e3b08aeSAndroid Build Coastguard WorkerAnd if you really want to see more of the graph structure, use `--format plain`.
332*9e3b08aeSAndroid Build Coastguard Worker
333*9e3b08aeSAndroid Build Coastguard Worker<details>
334*9e3b08aeSAndroid Build Coastguard Worker<summary>Working Example - ABI differences - plain format</summary>
335*9e3b08aeSAndroid Build Coastguard Worker
336*9e3b08aeSAndroid Build Coastguard Worker```text
337*9e3b08aeSAndroid Build Coastguard Workerfunction symbol 'int sum(struct N*)' changed
338*9e3b08aeSAndroid Build Coastguard Worker  type 'int(struct N*)' changed
339*9e3b08aeSAndroid Build Coastguard Worker    parameter 1 type 'struct N*' changed
340*9e3b08aeSAndroid Build Coastguard Worker      pointed-to type 'struct N' changed
341*9e3b08aeSAndroid Build Coastguard Worker        member 'struct N* left' changed
342*9e3b08aeSAndroid Build Coastguard Worker          type 'struct N*' changed
343*9e3b08aeSAndroid Build Coastguard Worker            pointed-to type 'struct N' changed
344*9e3b08aeSAndroid Build Coastguard Worker              (being reported)
345*9e3b08aeSAndroid Build Coastguard Worker        member 'struct N* right' changed
346*9e3b08aeSAndroid Build Coastguard Worker          type 'struct N*' changed
347*9e3b08aeSAndroid Build Coastguard Worker            pointed-to type 'struct N' changed
348*9e3b08aeSAndroid Build Coastguard Worker              (being reported)
349*9e3b08aeSAndroid Build Coastguard Worker        member changed from 'int value' to 'short int value'
350*9e3b08aeSAndroid Build Coastguard Worker          type changed from 'int' to 'short int'
351*9e3b08aeSAndroid Build Coastguard Worker
352*9e3b08aeSAndroid Build Coastguard Worker```
353*9e3b08aeSAndroid Build Coastguard Worker
354*9e3b08aeSAndroid Build Coastguard Worker</details>
355*9e3b08aeSAndroid Build Coastguard Worker
356*9e3b08aeSAndroid Build Coastguard WorkerOr just use `--format viz` which generates input for
357*9e3b08aeSAndroid Build Coastguard Worker[Graphviz](https://graphviz.org/).
358*9e3b08aeSAndroid Build Coastguard Worker
359*9e3b08aeSAndroid Build Coastguard Worker<details>
360*9e3b08aeSAndroid Build Coastguard Worker<summary>Working Example - ABI differences - viz format</summary>
361*9e3b08aeSAndroid Build Coastguard Worker
362*9e3b08aeSAndroid Build Coastguard Worker```dot
363*9e3b08aeSAndroid Build Coastguard Workerdigraph "ABI diff" {
364*9e3b08aeSAndroid Build Coastguard Worker  "0" [shape=rectangle, label="'interface'"]
365*9e3b08aeSAndroid Build Coastguard Worker  "1" [label="'int sum(struct N*)'"]
366*9e3b08aeSAndroid Build Coastguard Worker  "2" [label="'int(struct N*)'"]
367*9e3b08aeSAndroid Build Coastguard Worker  "3" [label="'struct N*'"]
368*9e3b08aeSAndroid Build Coastguard Worker  "4" [shape=rectangle, label="'struct N'"]
369*9e3b08aeSAndroid Build Coastguard Worker  "5" [label="'struct N* left'"]
370*9e3b08aeSAndroid Build Coastguard Worker  "5" -> "3" [label=""]
371*9e3b08aeSAndroid Build Coastguard Worker  "4" -> "5" [label=""]
372*9e3b08aeSAndroid Build Coastguard Worker  "6" [label="'struct N* right'"]
373*9e3b08aeSAndroid Build Coastguard Worker  "6" -> "3" [label=""]
374*9e3b08aeSAndroid Build Coastguard Worker  "4" -> "6" [label=""]
375*9e3b08aeSAndroid Build Coastguard Worker  "7" [label="'int value' → 'short int value'"]
376*9e3b08aeSAndroid Build Coastguard Worker  "8" [color=red, label="'int' → 'short int'"]
377*9e3b08aeSAndroid Build Coastguard Worker  "7" -> "8" [label=""]
378*9e3b08aeSAndroid Build Coastguard Worker  "4" -> "7" [label=""]
379*9e3b08aeSAndroid Build Coastguard Worker  "3" -> "4" [label="pointed-to"]
380*9e3b08aeSAndroid Build Coastguard Worker  "2" -> "3" [label="parameter 1"]
381*9e3b08aeSAndroid Build Coastguard Worker  "1" -> "2" [label=""]
382*9e3b08aeSAndroid Build Coastguard Worker  "0" -> "1" [label=""]
383*9e3b08aeSAndroid Build Coastguard Worker}
384*9e3b08aeSAndroid Build Coastguard Worker```
385*9e3b08aeSAndroid Build Coastguard Worker
386*9e3b08aeSAndroid Build Coastguard Worker</details>
387