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