1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_bloat: 2*61c4878aSAndroid Build Coastguard Worker 3*61c4878aSAndroid Build Coastguard Worker======== 4*61c4878aSAndroid Build Coastguard Workerpw_bloat 5*61c4878aSAndroid Build Coastguard Worker======== 6*61c4878aSAndroid Build Coastguard Worker.. pigweed-module:: 7*61c4878aSAndroid Build Coastguard Worker :name: pw_bloat 8*61c4878aSAndroid Build Coastguard Worker 9*61c4878aSAndroid Build Coastguard Worker``pw_bloat`` provides tools and helpers around using 10*61c4878aSAndroid Build Coastguard Worker`Bloaty McBloatface <https://github.com/google/bloaty>`_ including generating 11*61c4878aSAndroid Build Coastguard Workersize report cards for output binaries through :ref:`Pigweed's GN build 12*61c4878aSAndroid Build Coastguard Workersystem <module-pw_build-gn>`. 13*61c4878aSAndroid Build Coastguard Worker 14*61c4878aSAndroid Build Coastguard WorkerBloat report cards allow tracking the memory usage of a system over time as code 15*61c4878aSAndroid Build Coastguard Workerchanges are made and provide a breakdown of which parts of the code have the 16*61c4878aSAndroid Build Coastguard Workerlargest size impact. 17*61c4878aSAndroid Build Coastguard Worker 18*61c4878aSAndroid Build Coastguard Worker------------------------ 19*61c4878aSAndroid Build Coastguard Worker``pw bloat`` CLI command 20*61c4878aSAndroid Build Coastguard Worker------------------------ 21*61c4878aSAndroid Build Coastguard Worker``pw_bloat`` includes a plugin for the Pigweed command line capable of running 22*61c4878aSAndroid Build Coastguard Workersize reports on ELF binaries. 23*61c4878aSAndroid Build Coastguard Worker 24*61c4878aSAndroid Build Coastguard Worker.. note:: 25*61c4878aSAndroid Build Coastguard Worker 26*61c4878aSAndroid Build Coastguard Worker The bloat CLI plugin is still experimental and only supports a small subset 27*61c4878aSAndroid Build Coastguard Worker of ``pw_bloat``'s capabilities. 28*61c4878aSAndroid Build Coastguard Worker 29*61c4878aSAndroid Build Coastguard WorkerBasic usage 30*61c4878aSAndroid Build Coastguard Worker=========== 31*61c4878aSAndroid Build Coastguard Worker 32*61c4878aSAndroid Build Coastguard WorkerRunning a size report on a single executable 33*61c4878aSAndroid Build Coastguard Worker-------------------------------------------- 34*61c4878aSAndroid Build Coastguard WorkerBy default, ``pw bloat`` assumes that 35*61c4878aSAndroid Build Coastguard Worker:ref:`memoryregions <module-pw_bloat-memoryregions>` symbols are defined in 36*61c4878aSAndroid Build Coastguard Workerbinaries, and uses them to automatically generate a Bloaty config file. 37*61c4878aSAndroid Build Coastguard Worker 38*61c4878aSAndroid Build Coastguard Worker.. code-block:: sh 39*61c4878aSAndroid Build Coastguard Worker 40*61c4878aSAndroid Build Coastguard Worker $ pw bloat out/docs/obj/pw_result/size_report/bin/ladder_and_then.elf 41*61c4878aSAndroid Build Coastguard Worker 42*61c4878aSAndroid Build Coastguard Worker ▒█████▄ █▓ ▄███▒ ▒█ ▒█ ░▓████▒ ░▓████▒ ▒▓████▄ 43*61c4878aSAndroid Build Coastguard Worker ▒█░ █░ ░█▒ ██▒ ▀█▒ ▒█░ █ ▒█ ▒█ ▀ ▒█ ▀ ▒█ ▀█▌ 44*61c4878aSAndroid Build Coastguard Worker ▒█▄▄▄█░ ░█▒ █▓░ ▄▄░ ▒█░ █ ▒█ ▒███ ▒███ ░█ █▌ 45*61c4878aSAndroid Build Coastguard Worker ▒█▀ ░█░ ▓█ █▓ ░█░ █ ▒█ ▒█ ▄ ▒█ ▄ ░█ ▄█▌ 46*61c4878aSAndroid Build Coastguard Worker ▒█ ░█░ ░▓███▀ ▒█▓▀▓█░ ░▓████▒ ░▓████▒ ▒▓████▀ 47*61c4878aSAndroid Build Coastguard Worker 48*61c4878aSAndroid Build Coastguard Worker +----------------------+---------+ 49*61c4878aSAndroid Build Coastguard Worker | memoryregions | sizes | 50*61c4878aSAndroid Build Coastguard Worker +======================+=========+ 51*61c4878aSAndroid Build Coastguard Worker |FLASH |1,048,064| 52*61c4878aSAndroid Build Coastguard Worker |RAM | 196,608| 53*61c4878aSAndroid Build Coastguard Worker |VECTOR_TABLE | 512| 54*61c4878aSAndroid Build Coastguard Worker +======================+=========+ 55*61c4878aSAndroid Build Coastguard Worker |Total |1,245,184| 56*61c4878aSAndroid Build Coastguard Worker +----------------------+---------+ 57*61c4878aSAndroid Build Coastguard Worker 58*61c4878aSAndroid Build Coastguard WorkerRunning a size report diff 59*61c4878aSAndroid Build Coastguard Worker-------------------------- 60*61c4878aSAndroid Build Coastguard Worker 61*61c4878aSAndroid Build Coastguard Worker.. code-block:: sh 62*61c4878aSAndroid Build Coastguard Worker 63*61c4878aSAndroid Build Coastguard Worker $ pw bloat out/docs/obj/pw_metric/size_report/bin/one_metric.elf \ 64*61c4878aSAndroid Build Coastguard Worker --diff out/docs/obj/pw_metric/size_report/bin/base.elf \ 65*61c4878aSAndroid Build Coastguard Worker -d symbols 66*61c4878aSAndroid Build Coastguard Worker 67*61c4878aSAndroid Build Coastguard Worker ▒█████▄ █▓ ▄███▒ ▒█ ▒█ ░▓████▒ ░▓████▒ ▒▓████▄ 68*61c4878aSAndroid Build Coastguard Worker ▒█░ █░ ░█▒ ██▒ ▀█▒ ▒█░ █ ▒█ ▒█ ▀ ▒█ ▀ ▒█ ▀█▌ 69*61c4878aSAndroid Build Coastguard Worker ▒█▄▄▄█░ ░█▒ █▓░ ▄▄░ ▒█░ █ ▒█ ▒███ ▒███ ░█ █▌ 70*61c4878aSAndroid Build Coastguard Worker ▒█▀ ░█░ ▓█ █▓ ░█░ █ ▒█ ▒█ ▄ ▒█ ▄ ░█ ▄█▌ 71*61c4878aSAndroid Build Coastguard Worker ▒█ ░█░ ░▓███▀ ▒█▓▀▓█░ ░▓████▒ ░▓████▒ ▒▓████▀ 72*61c4878aSAndroid Build Coastguard Worker 73*61c4878aSAndroid Build Coastguard Worker +-----------------------------------------------------------------------------------+ 74*61c4878aSAndroid Build Coastguard Worker | | 75*61c4878aSAndroid Build Coastguard Worker +-----------------------------------------------------------------------------------+ 76*61c4878aSAndroid Build Coastguard Worker | diff| memoryregions | symbols | sizes| 77*61c4878aSAndroid Build Coastguard Worker +=====+======================+===============================================+======+ 78*61c4878aSAndroid Build Coastguard Worker | |FLASH | | -4| 79*61c4878aSAndroid Build Coastguard Worker | | |[section .FLASH.unused_space] | -408| 80*61c4878aSAndroid Build Coastguard Worker | | |main | +60| 81*61c4878aSAndroid Build Coastguard Worker | | |__sf_fake_stdout | +4| 82*61c4878aSAndroid Build Coastguard Worker | | |pw_boot_PreStaticMemoryInit | -2| 83*61c4878aSAndroid Build Coastguard Worker | | |_isatty | -2| 84*61c4878aSAndroid Build Coastguard Worker | NEW| |_GLOBAL__sub_I_group_foo | +84| 85*61c4878aSAndroid Build Coastguard Worker | NEW| |pw::metric::Group::~Group() | +34| 86*61c4878aSAndroid Build Coastguard Worker | NEW| |pw::intrusive_list_impl::List::insert_after() | +32| 87*61c4878aSAndroid Build Coastguard Worker | NEW| |pw::metric::Metric::Increment() | +32| 88*61c4878aSAndroid Build Coastguard Worker | NEW| |__cxa_atexit | +28| 89*61c4878aSAndroid Build Coastguard Worker | NEW| |pw::metric::Metric::Metric() | +28| 90*61c4878aSAndroid Build Coastguard Worker | NEW| |pw::metric::Metric::as_int() | +28| 91*61c4878aSAndroid Build Coastguard Worker | NEW| |pw::intrusive_list_impl::List::Item::unlist() | +20| 92*61c4878aSAndroid Build Coastguard Worker | NEW| |pw::metric::Group::Group() | +18| 93*61c4878aSAndroid Build Coastguard Worker | NEW| |pw::intrusive_list_impl::List::Item::previous()| +14| 94*61c4878aSAndroid Build Coastguard Worker | NEW| |pw::metric::TypedMetric<>::~TypedMetric() | +14| 95*61c4878aSAndroid Build Coastguard Worker | NEW| |__aeabi_atexit | +12| 96*61c4878aSAndroid Build Coastguard Worker +-----+----------------------+-----------------------------------------------+------+ 97*61c4878aSAndroid Build Coastguard Worker | |RAM | | 0| 98*61c4878aSAndroid Build Coastguard Worker | | |[section .stack] | -32| 99*61c4878aSAndroid Build Coastguard Worker | NEW| |group_foo | +16| 100*61c4878aSAndroid Build Coastguard Worker | NEW| |metric_x | +12| 101*61c4878aSAndroid Build Coastguard Worker | NEW| |[section .static_init_ram] | +4| 102*61c4878aSAndroid Build Coastguard Worker +=====+======================+===============================================+======+ 103*61c4878aSAndroid Build Coastguard Worker |Total| | | -4| 104*61c4878aSAndroid Build Coastguard Worker +-----+----------------------+-----------------------------------------------+------+ 105*61c4878aSAndroid Build Coastguard Worker 106*61c4878aSAndroid Build Coastguard WorkerSpecifying a custom Bloaty config file 107*61c4878aSAndroid Build Coastguard Worker-------------------------------------- 108*61c4878aSAndroid Build Coastguard WorkerIf the linker script for a target does not define memory regions, a custom 109*61c4878aSAndroid Build Coastguard WorkerBloaty config can be provided using the ``-c / --custom-config`` option. 110*61c4878aSAndroid Build Coastguard Worker 111*61c4878aSAndroid Build Coastguard Worker.. code-block:: 112*61c4878aSAndroid Build Coastguard Worker 113*61c4878aSAndroid Build Coastguard Worker $ pw bloat out/pw_strict_host_clang_debug/obj/pw_status/test/status_test -c targets/host/linux.bloaty 114*61c4878aSAndroid Build Coastguard Worker 115*61c4878aSAndroid Build Coastguard Worker ▒█████▄ █▓ ▄███▒ ▒█ ▒█ ░▓████▒ ░▓████▒ ▒▓████▄ 116*61c4878aSAndroid Build Coastguard Worker ▒█░ █░ ░█▒ ██▒ ▀█▒ ▒█░ █ ▒█ ▒█ ▀ ▒█ ▀ ▒█ ▀█▌ 117*61c4878aSAndroid Build Coastguard Worker ▒█▄▄▄█░ ░█▒ █▓░ ▄▄░ ▒█░ █ ▒█ ▒███ ▒███ ░█ █▌ 118*61c4878aSAndroid Build Coastguard Worker ▒█▀ ░█░ ▓█ █▓ ░█░ █ ▒█ ▒█ ▄ ▒█ ▄ ░█ ▄█▌ 119*61c4878aSAndroid Build Coastguard Worker ▒█ ░█░ ░▓███▀ ▒█▓▀▓█░ ░▓████▒ ░▓████▒ ▒▓████▀ 120*61c4878aSAndroid Build Coastguard Worker 121*61c4878aSAndroid Build Coastguard Worker +------------+---------------------+-------+ 122*61c4878aSAndroid Build Coastguard Worker | segments | sections | sizes | 123*61c4878aSAndroid Build Coastguard Worker +============+=====================+=======+ 124*61c4878aSAndroid Build Coastguard Worker |LOAD #3 [RX]| |138,176| 125*61c4878aSAndroid Build Coastguard Worker | |.text |137,524| 126*61c4878aSAndroid Build Coastguard Worker | |.plt | 608| 127*61c4878aSAndroid Build Coastguard Worker | |.init | 24| 128*61c4878aSAndroid Build Coastguard Worker | |.fini | 20| 129*61c4878aSAndroid Build Coastguard Worker +------------+---------------------+-------+ 130*61c4878aSAndroid Build Coastguard Worker |LOAD #2 [R] | | 87,816| 131*61c4878aSAndroid Build Coastguard Worker | |.rela.dyn | 32,664| 132*61c4878aSAndroid Build Coastguard Worker | |.rodata | 23,176| 133*61c4878aSAndroid Build Coastguard Worker | |.eh_frame | 23,152| 134*61c4878aSAndroid Build Coastguard Worker | |.eh_frame_hdr | 4,236| 135*61c4878aSAndroid Build Coastguard Worker | |.gcc_except_table | 1,140| 136*61c4878aSAndroid Build Coastguard Worker | |.dynsym | 1,008| 137*61c4878aSAndroid Build Coastguard Worker | |.rela.plt | 888| 138*61c4878aSAndroid Build Coastguard Worker | |[ELF Program Headers]| 616| 139*61c4878aSAndroid Build Coastguard Worker | |.dynstr | 556| 140*61c4878aSAndroid Build Coastguard Worker | |.gnu.version_r | 116| 141*61c4878aSAndroid Build Coastguard Worker | |.gnu.version | 84| 142*61c4878aSAndroid Build Coastguard Worker | |[ELF Header] | 64| 143*61c4878aSAndroid Build Coastguard Worker | |.note.ABI-tag | 32| 144*61c4878aSAndroid Build Coastguard Worker | |.gnu.hash | 28| 145*61c4878aSAndroid Build Coastguard Worker | |.interp | 28| 146*61c4878aSAndroid Build Coastguard Worker | |.note.gnu.build-id | 28| 147*61c4878aSAndroid Build Coastguard Worker +------------+---------------------+-------+ 148*61c4878aSAndroid Build Coastguard Worker |LOAD #5 [RW]| | 20,216| 149*61c4878aSAndroid Build Coastguard Worker | |.bss | 19,824| 150*61c4878aSAndroid Build Coastguard Worker | |.got.plt | 328| 151*61c4878aSAndroid Build Coastguard Worker | |.data | 64| 152*61c4878aSAndroid Build Coastguard Worker +------------+---------------------+-------+ 153*61c4878aSAndroid Build Coastguard Worker |LOAD #4 [RW]| | 15,664| 154*61c4878aSAndroid Build Coastguard Worker | |.data.rel.ro | 12,240| 155*61c4878aSAndroid Build Coastguard Worker | |.relro_padding | 2,872| 156*61c4878aSAndroid Build Coastguard Worker | |.dynamic | 464| 157*61c4878aSAndroid Build Coastguard Worker | |.got | 56| 158*61c4878aSAndroid Build Coastguard Worker | |.fini_array | 16| 159*61c4878aSAndroid Build Coastguard Worker | |.init_array | 16| 160*61c4878aSAndroid Build Coastguard Worker +============+=====================+=======+ 161*61c4878aSAndroid Build Coastguard Worker |Total | |261,872| 162*61c4878aSAndroid Build Coastguard Worker +------------+---------------------+-------+ 163*61c4878aSAndroid Build Coastguard Worker 164*61c4878aSAndroid Build Coastguard Worker.. _bloat-howto: 165*61c4878aSAndroid Build Coastguard Worker 166*61c4878aSAndroid Build Coastguard Worker--------------------------- 167*61c4878aSAndroid Build Coastguard WorkerDefining size reports in GN 168*61c4878aSAndroid Build Coastguard Worker--------------------------- 169*61c4878aSAndroid Build Coastguard Worker 170*61c4878aSAndroid Build Coastguard WorkerDiff size reports 171*61c4878aSAndroid Build Coastguard Worker================= 172*61c4878aSAndroid Build Coastguard WorkerSize reports can be defined using the GN template ``pw_size_diff``. The template 173*61c4878aSAndroid Build Coastguard Workerrequires at least two executable targets on which to perform a size diff. The 174*61c4878aSAndroid Build Coastguard Workerbase for the size diff can be specified either globally through the top-level 175*61c4878aSAndroid Build Coastguard Worker``base`` argument, or individually per-binary within the ``binaries`` list. 176*61c4878aSAndroid Build Coastguard Worker 177*61c4878aSAndroid Build Coastguard WorkerArguments 178*61c4878aSAndroid Build Coastguard Worker--------- 179*61c4878aSAndroid Build Coastguard Worker 180*61c4878aSAndroid Build Coastguard Worker* ``base``: Optional default base target for all listed binaries. 181*61c4878aSAndroid Build Coastguard Worker* ``source_filter``: Optional global regex to filter labels in the diff output. 182*61c4878aSAndroid Build Coastguard Worker* ``data_sources``: Optional global list of datasources from bloaty config file 183*61c4878aSAndroid Build Coastguard Worker* ``binaries``: List of binaries to size diff. Each binary specifies a target, 184*61c4878aSAndroid Build Coastguard Worker a label for the diff, and optionally a base target, source filter, and data 185*61c4878aSAndroid Build Coastguard Worker sources that override the global ones (if specified). 186*61c4878aSAndroid Build Coastguard Worker 187*61c4878aSAndroid Build Coastguard Worker 188*61c4878aSAndroid Build Coastguard Worker.. code-block:: 189*61c4878aSAndroid Build Coastguard Worker 190*61c4878aSAndroid Build Coastguard Worker import("$dir_pw_bloat/bloat.gni") 191*61c4878aSAndroid Build Coastguard Worker 192*61c4878aSAndroid Build Coastguard Worker executable("empty_base") { 193*61c4878aSAndroid Build Coastguard Worker sources = [ "empty_main.cc" ] 194*61c4878aSAndroid Build Coastguard Worker } 195*61c4878aSAndroid Build Coastguard Worker 196*61c4878aSAndroid Build Coastguard Worker executable("hello_world_printf") { 197*61c4878aSAndroid Build Coastguard Worker sources = [ "hello_printf.cc" ] 198*61c4878aSAndroid Build Coastguard Worker } 199*61c4878aSAndroid Build Coastguard Worker 200*61c4878aSAndroid Build Coastguard Worker executable("hello_world_iostream") { 201*61c4878aSAndroid Build Coastguard Worker sources = [ "hello_iostream.cc" ] 202*61c4878aSAndroid Build Coastguard Worker } 203*61c4878aSAndroid Build Coastguard Worker 204*61c4878aSAndroid Build Coastguard Worker pw_size_diff("my_size_report") { 205*61c4878aSAndroid Build Coastguard Worker base = ":empty_base" 206*61c4878aSAndroid Build Coastguard Worker data_sources = "symbols,segments" 207*61c4878aSAndroid Build Coastguard Worker binaries = [ 208*61c4878aSAndroid Build Coastguard Worker { 209*61c4878aSAndroid Build Coastguard Worker target = ":hello_world_printf" 210*61c4878aSAndroid Build Coastguard Worker label = "Hello world using printf" 211*61c4878aSAndroid Build Coastguard Worker }, 212*61c4878aSAndroid Build Coastguard Worker { 213*61c4878aSAndroid Build Coastguard Worker target = ":hello_world_iostream" 214*61c4878aSAndroid Build Coastguard Worker label = "Hello world using iostream" 215*61c4878aSAndroid Build Coastguard Worker data_sources = "symbols" 216*61c4878aSAndroid Build Coastguard Worker }, 217*61c4878aSAndroid Build Coastguard Worker ] 218*61c4878aSAndroid Build Coastguard Worker } 219*61c4878aSAndroid Build Coastguard Worker 220*61c4878aSAndroid Build Coastguard WorkerA sample ``pw_size_diff`` reStructuredText size report table can be found 221*61c4878aSAndroid Build Coastguard Workerwithin module docs. For example, see the :ref:`pw_checksum-size-report` 222*61c4878aSAndroid Build Coastguard Workersection of the ``pw_checksum`` module for more detail. 223*61c4878aSAndroid Build Coastguard Worker 224*61c4878aSAndroid Build Coastguard WorkerSingle binary size reports 225*61c4878aSAndroid Build Coastguard Worker========================== 226*61c4878aSAndroid Build Coastguard WorkerSize reports can also be defined using ``pw_size_report``, which provides 227*61c4878aSAndroid Build Coastguard Workera size report for a single binary. The template requires a target binary. 228*61c4878aSAndroid Build Coastguard Worker 229*61c4878aSAndroid Build Coastguard WorkerArguments 230*61c4878aSAndroid Build Coastguard Worker--------- 231*61c4878aSAndroid Build Coastguard Worker* ``target``: Binary target to run size report on. 232*61c4878aSAndroid Build Coastguard Worker* ``data_sources``: Optional list of data sources to organize outputs. 233*61c4878aSAndroid Build Coastguard Worker* ``source_filter``: Optional regex to filter labels in the output. 234*61c4878aSAndroid Build Coastguard Worker* ``json_key_prefix``: Optional prefix for key names in json size report. 235*61c4878aSAndroid Build Coastguard Worker* ``full_json_summary``: Optional boolean to print json size report by label 236*61c4878aSAndroid Build Coastguard Worker* level hierarchy. Defaults to only use top-level label in size report. 237*61c4878aSAndroid Build Coastguard Worker* ``ignore_unused_labels``: Optional boolean to remove labels that have size of 238*61c4878aSAndroid Build Coastguard Worker* zero in json size report. 239*61c4878aSAndroid Build Coastguard Worker 240*61c4878aSAndroid Build Coastguard Worker.. code-block:: 241*61c4878aSAndroid Build Coastguard Worker 242*61c4878aSAndroid Build Coastguard Worker import("$dir_pw_bloat/bloat.gni") 243*61c4878aSAndroid Build Coastguard Worker 244*61c4878aSAndroid Build Coastguard Worker executable("hello_world_iostream") { 245*61c4878aSAndroid Build Coastguard Worker sources = [ "hello_iostream.cc" ] 246*61c4878aSAndroid Build Coastguard Worker } 247*61c4878aSAndroid Build Coastguard Worker 248*61c4878aSAndroid Build Coastguard Worker pw_size_report("hello_world_iostream_size_report") { 249*61c4878aSAndroid Build Coastguard Worker target = ":hello_iostream" 250*61c4878aSAndroid Build Coastguard Worker data_sources = "segments,symbols" 251*61c4878aSAndroid Build Coastguard Worker source_filter = "pw::hello" 252*61c4878aSAndroid Build Coastguard Worker json_key_prefix = "hello_world_iostream" 253*61c4878aSAndroid Build Coastguard Worker full_json_summary = true 254*61c4878aSAndroid Build Coastguard Worker ignore_unused_labels = true 255*61c4878aSAndroid Build Coastguard Worker } 256*61c4878aSAndroid Build Coastguard Worker 257*61c4878aSAndroid Build Coastguard WorkerExample of the generated ASCII table for a single binary: 258*61c4878aSAndroid Build Coastguard Worker 259*61c4878aSAndroid Build Coastguard Worker.. code-block:: 260*61c4878aSAndroid Build Coastguard Worker 261*61c4878aSAndroid Build Coastguard Worker ┌─────────────┬──────────────────────────────────────────────────┬──────┐ 262*61c4878aSAndroid Build Coastguard Worker │segment_names│ symbols │ sizes│ 263*61c4878aSAndroid Build Coastguard Worker ├═════════════┼══════════════════════════════════════════════════┼══════┤ 264*61c4878aSAndroid Build Coastguard Worker │FLASH │ │12,072│ 265*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::KeyValueStore::InitializeMetadata() │ 684│ 266*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::KeyValueStore::Init() │ 456│ 267*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::internal::EntryCache::Find() │ 444│ 268*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::FakeFlashMemory::Write() │ 240│ 269*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::internal::Entry::VerifyChecksumInFlash() │ 228│ 270*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::KeyValueStore::GarbageCollectSector() │ 220│ 271*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::KeyValueStore::RemoveDeletedKeyEntries() │ 220│ 272*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::KeyValueStore::AppendEntry() │ 204│ 273*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::KeyValueStore::Get() │ 194│ 274*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::internal::Entry::Read() │ 188│ 275*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::ChecksumAlgorithm::Finish() │ 26│ 276*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::internal::Entry::ReadKey() │ 26│ 277*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::internal::Sectors::BaseAddress() │ 24│ 278*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::ChecksumAlgorithm::Update() │ 20│ 279*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::FlashTestPartition() │ 8│ 280*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::FakeFlashMemory::Disable() │ 6│ 281*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::FakeFlashMemory::Enable() │ 6│ 282*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::FlashMemory::SelfTest() │ 6│ 283*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::FlashPartition::Init() │ 6│ 284*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::FlashPartition::sector_size_bytes() │ 6│ 285*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::FakeFlashMemory::IsEnabled() │ 4│ 286*61c4878aSAndroid Build Coastguard Worker ├─────────────┼──────────────────────────────────────────────────┼──────┤ 287*61c4878aSAndroid Build Coastguard Worker │RAM │ │ 1,424│ 288*61c4878aSAndroid Build Coastguard Worker │ │test_kvs │ 992│ 289*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::(anonymous namespace)::test_flash │ 384│ 290*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::(anonymous namespace)::test_partition │ 24│ 291*61c4878aSAndroid Build Coastguard Worker │ │pw::kvs::FakeFlashMemory::no_errors_ │ 12│ 292*61c4878aSAndroid Build Coastguard Worker │ │borrowable_kvs │ 8│ 293*61c4878aSAndroid Build Coastguard Worker │ │kvs_entry_count │ 4│ 294*61c4878aSAndroid Build Coastguard Worker ├═════════════┼══════════════════════════════════════════════════┼══════┤ 295*61c4878aSAndroid Build Coastguard Worker │Total │ │13,496│ 296*61c4878aSAndroid Build Coastguard Worker └─────────────┴──────────────────────────────────────────────────┴──────┘ 297*61c4878aSAndroid Build Coastguard Worker 298*61c4878aSAndroid Build Coastguard Worker 299*61c4878aSAndroid Build Coastguard WorkerSize reports are typically included in reStructuredText, as described in 300*61c4878aSAndroid Build Coastguard Worker`Documentation integration`_. Size reports may also be printed in the build 301*61c4878aSAndroid Build Coastguard Workeroutput if desired. To enable this in the GN build 302*61c4878aSAndroid Build Coastguard Worker(``pigweed/pw_bloat/bloat.gni``), set the ``pw_bloat_SHOW_SIZE_REPORTS`` 303*61c4878aSAndroid Build Coastguard Workerbuild arg to ``true``. 304*61c4878aSAndroid Build Coastguard Worker 305*61c4878aSAndroid Build Coastguard WorkerCollecting size report data 306*61c4878aSAndroid Build Coastguard Worker=========================== 307*61c4878aSAndroid Build Coastguard WorkerEach ``pw_size_report`` target outputs a JSON file containing the sizes of all 308*61c4878aSAndroid Build Coastguard Workertop-level labels in the binary. (By default, this represents "segments", i.e. 309*61c4878aSAndroid Build Coastguard WorkerELF program headers.) If ``full_json_summary`` is set to true, sizes for all 310*61c4878aSAndroid Build Coastguard Workerlabel levels are reported (i.e. default labels would show size of each symbol 311*61c4878aSAndroid Build Coastguard Workerper segment). If a build produces multiple images, it may be useful to collect 312*61c4878aSAndroid Build Coastguard Workerall of their sizes into a single file to provide a snapshot of sizes at some 313*61c4878aSAndroid Build Coastguard Workerpoint in time --- for example, to display per-commit size deltas through CI. 314*61c4878aSAndroid Build Coastguard Worker 315*61c4878aSAndroid Build Coastguard WorkerThe ``pw_size_report_aggregation`` template is provided to collect multiple size 316*61c4878aSAndroid Build Coastguard Workerreports' data into a single JSON file. 317*61c4878aSAndroid Build Coastguard Worker 318*61c4878aSAndroid Build Coastguard WorkerArguments 319*61c4878aSAndroid Build Coastguard Worker--------- 320*61c4878aSAndroid Build Coastguard Worker* ``deps``: List of ``pw_size_report`` targets whose data to collect. 321*61c4878aSAndroid Build Coastguard Worker* ``output``: Path to the output JSON file. 322*61c4878aSAndroid Build Coastguard Worker 323*61c4878aSAndroid Build Coastguard Worker.. code-block:: 324*61c4878aSAndroid Build Coastguard Worker 325*61c4878aSAndroid Build Coastguard Worker import("$dir_pw_bloat/bloat.gni") 326*61c4878aSAndroid Build Coastguard Worker 327*61c4878aSAndroid Build Coastguard Worker pw_size_report_aggregation("image_sizes") { 328*61c4878aSAndroid Build Coastguard Worker deps = [ 329*61c4878aSAndroid Build Coastguard Worker ":app_image_size_report", 330*61c4878aSAndroid Build Coastguard Worker ":bootloader_image_size_report", 331*61c4878aSAndroid Build Coastguard Worker ] 332*61c4878aSAndroid Build Coastguard Worker output = "$root_gen_dir/artifacts/image_sizes.json" 333*61c4878aSAndroid Build Coastguard Worker } 334*61c4878aSAndroid Build Coastguard Worker 335*61c4878aSAndroid Build Coastguard Worker.. _module-pw_bloat-docs: 336*61c4878aSAndroid Build Coastguard Worker 337*61c4878aSAndroid Build Coastguard Worker------------------------- 338*61c4878aSAndroid Build Coastguard WorkerDocumentation integration 339*61c4878aSAndroid Build Coastguard Worker------------------------- 340*61c4878aSAndroid Build Coastguard WorkerBloat reports are easy to add to documentation files. All ``pw_size_diff`` 341*61c4878aSAndroid Build Coastguard Workerand ``pw_size_report`` targets output a file containing a tabular report card. 342*61c4878aSAndroid Build Coastguard WorkerThis file can be imported directly into a reStructuredText file using the 343*61c4878aSAndroid Build Coastguard Worker``include`` directive. 344*61c4878aSAndroid Build Coastguard Worker 345*61c4878aSAndroid Build Coastguard WorkerFor example, the ``simple_bloat_loop`` and ``simple_bloat_function`` size 346*61c4878aSAndroid Build Coastguard Workerreports under ``//pw_bloat/examples`` are imported into this file as follows: 347*61c4878aSAndroid Build Coastguard Worker 348*61c4878aSAndroid Build Coastguard Worker.. code-block:: rst 349*61c4878aSAndroid Build Coastguard Worker 350*61c4878aSAndroid Build Coastguard Worker Simple bloat loop example 351*61c4878aSAndroid Build Coastguard Worker ^^^^^^^^^^^^^^^^^^^^^^^^^ 352*61c4878aSAndroid Build Coastguard Worker .. include:: examples/simple_bloat_loop 353*61c4878aSAndroid Build Coastguard Worker 354*61c4878aSAndroid Build Coastguard Worker Simple bloat function example 355*61c4878aSAndroid Build Coastguard Worker ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 356*61c4878aSAndroid Build Coastguard Worker .. include:: examples/simple_bloat_function 357*61c4878aSAndroid Build Coastguard Worker 358*61c4878aSAndroid Build Coastguard WorkerResulting in this output: 359*61c4878aSAndroid Build Coastguard Worker 360*61c4878aSAndroid Build Coastguard WorkerSimple bloat loop example 361*61c4878aSAndroid Build Coastguard Worker========================= 362*61c4878aSAndroid Build Coastguard Worker.. include:: examples/simple_bloat_loop 363*61c4878aSAndroid Build Coastguard Worker 364*61c4878aSAndroid Build Coastguard WorkerSimple bloat function example 365*61c4878aSAndroid Build Coastguard Worker============================= 366*61c4878aSAndroid Build Coastguard Worker.. include:: examples/simple_bloat_function 367*61c4878aSAndroid Build Coastguard Worker 368*61c4878aSAndroid Build Coastguard Worker.. _module-pw_bloat-sources: 369*61c4878aSAndroid Build Coastguard Worker 370*61c4878aSAndroid Build Coastguard Worker------------------------------ 371*61c4878aSAndroid Build Coastguard WorkerAdditional Bloaty data sources 372*61c4878aSAndroid Build Coastguard Worker------------------------------ 373*61c4878aSAndroid Build Coastguard Worker`Bloaty McBloatface <https://github.com/google/bloaty>`_ by itself cannot help 374*61c4878aSAndroid Build Coastguard Workeranswer some questions which embedded developers frequently face such as 375*61c4878aSAndroid Build Coastguard Workerunderstanding how much space is left. To address this, Pigweed provides Python 376*61c4878aSAndroid Build Coastguard Workertooling (``pw_bloat.bloaty_config``) to generate bloaty configuration files 377*61c4878aSAndroid Build Coastguard Workerbased on the final ELF files through small tweaks in the linker scripts to 378*61c4878aSAndroid Build Coastguard Workerexpose extra information. 379*61c4878aSAndroid Build Coastguard Worker 380*61c4878aSAndroid Build Coastguard WorkerSee the sections below on how to enable the additional data sections through 381*61c4878aSAndroid Build Coastguard Workermodifications in your linker script(s). 382*61c4878aSAndroid Build Coastguard Worker 383*61c4878aSAndroid Build Coastguard WorkerAs an example to generate the helper configuration which enables additional data 384*61c4878aSAndroid Build Coastguard Workersources for ``example.elf`` if you've updated your linker script(s) accordingly, 385*61c4878aSAndroid Build Coastguard Workersimply run 386*61c4878aSAndroid Build Coastguard Worker``python -m pw_bloaty.bloaty_config example.elf > example.bloaty``. The 387*61c4878aSAndroid Build Coastguard Worker``example.bloaty`` can then be used with bloaty using the ``-c`` flag, for 388*61c4878aSAndroid Build Coastguard Workerexample 389*61c4878aSAndroid Build Coastguard Worker``bloaty -c example.bloaty example.elf --domain vm -d memoryregions,utilization`` 390*61c4878aSAndroid Build Coastguard Workerwhich may return something like: 391*61c4878aSAndroid Build Coastguard Worker 392*61c4878aSAndroid Build Coastguard Worker.. code-block:: 393*61c4878aSAndroid Build Coastguard Worker 394*61c4878aSAndroid Build Coastguard Worker 84.2% 1023Ki FLASH 395*61c4878aSAndroid Build Coastguard Worker 94.2% 963Ki Free space 396*61c4878aSAndroid Build Coastguard Worker 5.8% 59.6Ki Used space 397*61c4878aSAndroid Build Coastguard Worker 15.8% 192Ki RAM 398*61c4878aSAndroid Build Coastguard Worker 100.0% 192Ki Used space 399*61c4878aSAndroid Build Coastguard Worker 0.0% 512 VECTOR_TABLE 400*61c4878aSAndroid Build Coastguard Worker 96.9% 496 Free space 401*61c4878aSAndroid Build Coastguard Worker 3.1% 16 Used space 402*61c4878aSAndroid Build Coastguard Worker 0.0% 0 Not resident in memory 403*61c4878aSAndroid Build Coastguard Worker NAN% 0 Used space 404*61c4878aSAndroid Build Coastguard Worker 405*61c4878aSAndroid Build Coastguard Worker.. _module-pw_bloat-utilization: 406*61c4878aSAndroid Build Coastguard Worker 407*61c4878aSAndroid Build Coastguard Worker``utilization`` data source 408*61c4878aSAndroid Build Coastguard Worker=========================== 409*61c4878aSAndroid Build Coastguard WorkerThe most common question many embedded developers face when using ``bloaty`` is 410*61c4878aSAndroid Build Coastguard Workerhow much space you are using and how much space is left. To correctly answer 411*61c4878aSAndroid Build Coastguard Workerthis, section sizes must be used in order to correctly account for section 412*61c4878aSAndroid Build Coastguard Workeralignment requirements. 413*61c4878aSAndroid Build Coastguard Worker 414*61c4878aSAndroid Build Coastguard WorkerThe generated ``utilization`` data source will work with any ELF file, where 415*61c4878aSAndroid Build Coastguard Worker``Used Space`` is reported for the sum of virtual memory size of all sections. 416*61c4878aSAndroid Build Coastguard Worker``Padding`` captures the amount of memory that is utilized to enfore alignment 417*61c4878aSAndroid Build Coastguard Workerrequirements. Tracking ``Padding`` size can help monitor application growth 418*61c4878aSAndroid Build Coastguard Workerfor changes that are too small to force realignment. 419*61c4878aSAndroid Build Coastguard Worker 420*61c4878aSAndroid Build Coastguard WorkerIn order for ``Free Space`` to be reported, your linker scripts must include 421*61c4878aSAndroid Build Coastguard Workerproperly aligned sections which span the unused remaining space for the relevant 422*61c4878aSAndroid Build Coastguard Workermemory region with the ``unused_space`` string anywhere in their name. This 423*61c4878aSAndroid Build Coastguard Workertypically means creating a trailing section which is pinned to span to the end 424*61c4878aSAndroid Build Coastguard Workerof the memory region. 425*61c4878aSAndroid Build Coastguard Worker 426*61c4878aSAndroid Build Coastguard WorkerFor example imagine this partial example GNU LD linker script: 427*61c4878aSAndroid Build Coastguard Worker 428*61c4878aSAndroid Build Coastguard Worker.. code-block:: 429*61c4878aSAndroid Build Coastguard Worker 430*61c4878aSAndroid Build Coastguard Worker MEMORY 431*61c4878aSAndroid Build Coastguard Worker { 432*61c4878aSAndroid Build Coastguard Worker FLASH(rx) : \ 433*61c4878aSAndroid Build Coastguard Worker ORIGIN = PW_BOOT_FLASH_BEGIN, \ 434*61c4878aSAndroid Build Coastguard Worker LENGTH = PW_BOOT_FLASH_SIZE 435*61c4878aSAndroid Build Coastguard Worker RAM(rwx) : \ 436*61c4878aSAndroid Build Coastguard Worker ORIGIN = PW_BOOT_RAM_BEGIN, \ 437*61c4878aSAndroid Build Coastguard Worker LENGTH = PW_BOOT_RAM_SIZE 438*61c4878aSAndroid Build Coastguard Worker } 439*61c4878aSAndroid Build Coastguard Worker 440*61c4878aSAndroid Build Coastguard Worker SECTIONS 441*61c4878aSAndroid Build Coastguard Worker { 442*61c4878aSAndroid Build Coastguard Worker /* Main executable code. */ 443*61c4878aSAndroid Build Coastguard Worker .code : ALIGN(4) 444*61c4878aSAndroid Build Coastguard Worker { 445*61c4878aSAndroid Build Coastguard Worker /* Application code. */ 446*61c4878aSAndroid Build Coastguard Worker *(.text) 447*61c4878aSAndroid Build Coastguard Worker *(.text*) 448*61c4878aSAndroid Build Coastguard Worker KEEP(*(.init)) 449*61c4878aSAndroid Build Coastguard Worker KEEP(*(.fini)) 450*61c4878aSAndroid Build Coastguard Worker 451*61c4878aSAndroid Build Coastguard Worker . = ALIGN(4); 452*61c4878aSAndroid Build Coastguard Worker /* Constants.*/ 453*61c4878aSAndroid Build Coastguard Worker *(.rodata) 454*61c4878aSAndroid Build Coastguard Worker *(.rodata*) 455*61c4878aSAndroid Build Coastguard Worker } >FLASH 456*61c4878aSAndroid Build Coastguard Worker 457*61c4878aSAndroid Build Coastguard Worker /* Explicitly initialized global and static data. (.data)*/ 458*61c4878aSAndroid Build Coastguard Worker .static_init_ram : ALIGN(4) 459*61c4878aSAndroid Build Coastguard Worker { 460*61c4878aSAndroid Build Coastguard Worker *(.data) 461*61c4878aSAndroid Build Coastguard Worker *(.data*) 462*61c4878aSAndroid Build Coastguard Worker . = ALIGN(4); 463*61c4878aSAndroid Build Coastguard Worker } >RAM AT> FLASH 464*61c4878aSAndroid Build Coastguard Worker 465*61c4878aSAndroid Build Coastguard Worker /* Zero initialized global/static data. (.bss) */ 466*61c4878aSAndroid Build Coastguard Worker .zero_init_ram (NOLOAD) : ALIGN(4) 467*61c4878aSAndroid Build Coastguard Worker { 468*61c4878aSAndroid Build Coastguard Worker *(.bss) 469*61c4878aSAndroid Build Coastguard Worker *(.bss*) 470*61c4878aSAndroid Build Coastguard Worker *(COMMON) 471*61c4878aSAndroid Build Coastguard Worker . = ALIGN(4); 472*61c4878aSAndroid Build Coastguard Worker } >RAM 473*61c4878aSAndroid Build Coastguard Worker } 474*61c4878aSAndroid Build Coastguard Worker 475*61c4878aSAndroid Build Coastguard WorkerCould be modified as follows to enable ``Free Space`` reporting: 476*61c4878aSAndroid Build Coastguard Worker 477*61c4878aSAndroid Build Coastguard Worker.. code-block:: 478*61c4878aSAndroid Build Coastguard Worker 479*61c4878aSAndroid Build Coastguard Worker MEMORY 480*61c4878aSAndroid Build Coastguard Worker { 481*61c4878aSAndroid Build Coastguard Worker FLASH(rx) : ORIGIN = PW_BOOT_FLASH_BEGIN, LENGTH = PW_BOOT_FLASH_SIZE 482*61c4878aSAndroid Build Coastguard Worker RAM(rwx) : ORIGIN = PW_BOOT_RAM_BEGIN, LENGTH = PW_BOOT_RAM_SIZE 483*61c4878aSAndroid Build Coastguard Worker 484*61c4878aSAndroid Build Coastguard Worker /* Each memory region above has an associated .*.unused_space section that 485*61c4878aSAndroid Build Coastguard Worker * overlays the unused space at the end of the memory segment. These 486*61c4878aSAndroid Build Coastguard Worker * segments are used by pw_bloat.bloaty_config to create the utilization 487*61c4878aSAndroid Build Coastguard Worker * data source for bloaty size reports. 488*61c4878aSAndroid Build Coastguard Worker * 489*61c4878aSAndroid Build Coastguard Worker * These sections MUST be located immediately after the last section that is 490*61c4878aSAndroid Build Coastguard Worker * placed in the respective memory region or lld will issue a warning like: 491*61c4878aSAndroid Build Coastguard Worker * 492*61c4878aSAndroid Build Coastguard Worker * warning: ignoring memory region assignment for non-allocatable section 493*61c4878aSAndroid Build Coastguard Worker * '.VECTOR_TABLE.unused_space' 494*61c4878aSAndroid Build Coastguard Worker * 495*61c4878aSAndroid Build Coastguard Worker * If this warning occurs, it's also likely that LLD will have created quite 496*61c4878aSAndroid Build Coastguard Worker * large padded regions in the ELF file due to bad cursor operations. This 497*61c4878aSAndroid Build Coastguard Worker * can cause ELF files to balloon from hundreds of kilobytes to hundreds of 498*61c4878aSAndroid Build Coastguard Worker * megabytes. 499*61c4878aSAndroid Build Coastguard Worker * 500*61c4878aSAndroid Build Coastguard Worker * Attempting to add sections to the memory region AFTER the unused_space 501*61c4878aSAndroid Build Coastguard Worker * section will cause the region to overflow. 502*61c4878aSAndroid Build Coastguard Worker */ 503*61c4878aSAndroid Build Coastguard Worker } 504*61c4878aSAndroid Build Coastguard Worker 505*61c4878aSAndroid Build Coastguard Worker SECTIONS 506*61c4878aSAndroid Build Coastguard Worker { 507*61c4878aSAndroid Build Coastguard Worker /* Main executable code. */ 508*61c4878aSAndroid Build Coastguard Worker .code : ALIGN(4) 509*61c4878aSAndroid Build Coastguard Worker { 510*61c4878aSAndroid Build Coastguard Worker /* Application code. */ 511*61c4878aSAndroid Build Coastguard Worker *(.text) 512*61c4878aSAndroid Build Coastguard Worker *(.text*) 513*61c4878aSAndroid Build Coastguard Worker KEEP(*(.init)) 514*61c4878aSAndroid Build Coastguard Worker KEEP(*(.fini)) 515*61c4878aSAndroid Build Coastguard Worker 516*61c4878aSAndroid Build Coastguard Worker . = ALIGN(4); 517*61c4878aSAndroid Build Coastguard Worker /* Constants.*/ 518*61c4878aSAndroid Build Coastguard Worker *(.rodata) 519*61c4878aSAndroid Build Coastguard Worker *(.rodata*) 520*61c4878aSAndroid Build Coastguard Worker } >FLASH 521*61c4878aSAndroid Build Coastguard Worker 522*61c4878aSAndroid Build Coastguard Worker /* Explicitly initialized global and static data. (.data)*/ 523*61c4878aSAndroid Build Coastguard Worker .static_init_ram : ALIGN(4) 524*61c4878aSAndroid Build Coastguard Worker { 525*61c4878aSAndroid Build Coastguard Worker *(.data) 526*61c4878aSAndroid Build Coastguard Worker *(.data*) 527*61c4878aSAndroid Build Coastguard Worker . = ALIGN(4); 528*61c4878aSAndroid Build Coastguard Worker } >RAM AT> FLASH 529*61c4878aSAndroid Build Coastguard Worker 530*61c4878aSAndroid Build Coastguard Worker /* Defines a section representing the unused space in the FLASH segment. 531*61c4878aSAndroid Build Coastguard Worker * This MUST be the last section assigned to the FLASH region. 532*61c4878aSAndroid Build Coastguard Worker */ 533*61c4878aSAndroid Build Coastguard Worker PW_BLOAT_UNUSED_SPACE(FLASH) 534*61c4878aSAndroid Build Coastguard Worker 535*61c4878aSAndroid Build Coastguard Worker /* Zero initialized global/static data. (.bss). */ 536*61c4878aSAndroid Build Coastguard Worker .zero_init_ram (NOLOAD) : ALIGN(4) 537*61c4878aSAndroid Build Coastguard Worker { 538*61c4878aSAndroid Build Coastguard Worker *(.bss) 539*61c4878aSAndroid Build Coastguard Worker *(.bss*) 540*61c4878aSAndroid Build Coastguard Worker *(COMMON) 541*61c4878aSAndroid Build Coastguard Worker . = ALIGN(4); 542*61c4878aSAndroid Build Coastguard Worker } >RAM 543*61c4878aSAndroid Build Coastguard Worker 544*61c4878aSAndroid Build Coastguard Worker /* Defines a section representing the unused space in the RAM segment. This 545*61c4878aSAndroid Build Coastguard Worker * MUST be the last section assigned to the RAM region. 546*61c4878aSAndroid Build Coastguard Worker */ 547*61c4878aSAndroid Build Coastguard Worker PW_BLOAT_UNUSED_SPACE(RAM) 548*61c4878aSAndroid Build Coastguard Worker } 549*61c4878aSAndroid Build Coastguard Worker 550*61c4878aSAndroid Build Coastguard WorkerThe preprocessor macro ``PW_BLOAT_UNUSED_SPACE`` is defined in 551*61c4878aSAndroid Build Coastguard Worker``pw_bloat/bloat_macros.ld``. To use these macros include this file in your 552*61c4878aSAndroid Build Coastguard Worker``pw_linker_script`` as follows: 553*61c4878aSAndroid Build Coastguard Worker 554*61c4878aSAndroid Build Coastguard Worker.. code-block:: 555*61c4878aSAndroid Build Coastguard Worker 556*61c4878aSAndroid Build Coastguard Worker pw_linker_script("my_linker_script") { 557*61c4878aSAndroid Build Coastguard Worker includes = [ "$dir_pw_bloat/bloat_macros.ld" ] 558*61c4878aSAndroid Build Coastguard Worker linker_script = "my_project_linker_script.ld" 559*61c4878aSAndroid Build Coastguard Worker } 560*61c4878aSAndroid Build Coastguard Worker 561*61c4878aSAndroid Build Coastguard WorkerNote that linker scripts are not natively supported by GN and can't be provided 562*61c4878aSAndroid Build Coastguard Workerthrough ``deps``, the ``bloat_macros.ld`` must be passed in the ``includes`` 563*61c4878aSAndroid Build Coastguard Workerlist. 564*61c4878aSAndroid Build Coastguard Worker 565*61c4878aSAndroid Build Coastguard Worker.. _module-pw_bloat-memoryregions: 566*61c4878aSAndroid Build Coastguard Worker 567*61c4878aSAndroid Build Coastguard Worker``memoryregions`` data source 568*61c4878aSAndroid Build Coastguard Worker============================= 569*61c4878aSAndroid Build Coastguard WorkerUnderstanding how symbols, sections, and other data sources can be attributed 570*61c4878aSAndroid Build Coastguard Workerback to the memory regions defined in your linker script is another common 571*61c4878aSAndroid Build Coastguard Workerproblem area. Unfortunately the ELF format does not include the original memory 572*61c4878aSAndroid Build Coastguard Workerregions, meaning ``bloaty`` can not do this today by itself. In addition, it's 573*61c4878aSAndroid Build Coastguard Workerrelatively common that there are multiple memory regions which alias to the same 574*61c4878aSAndroid Build Coastguard Workermemory but through different buses which could make attribution difficult. 575*61c4878aSAndroid Build Coastguard Worker 576*61c4878aSAndroid Build Coastguard WorkerInstead of taking the less portable and brittle approach to parse ``*.map`` 577*61c4878aSAndroid Build Coastguard Workerfiles, ``pw_bloat.bloaty_config`` consumes symbols which are defined in the 578*61c4878aSAndroid Build Coastguard Workerlinker script with a special format to extract this information from the ELF 579*61c4878aSAndroid Build Coastguard Workerfile: ``pw_bloat_config_memory_region_NAME_{start,end}{_N,}``. 580*61c4878aSAndroid Build Coastguard Worker 581*61c4878aSAndroid Build Coastguard WorkerThese symbols are defined by the preprocessor macros ``PW_BLOAT_MEMORY_REGION`` 582*61c4878aSAndroid Build Coastguard Workerand ``PW_BLOAT_MEMORY_REGION_MAP`` with the right address and size for the 583*61c4878aSAndroid Build Coastguard Workerregions. To use these macros include the ``pw_bloat/bloat_macros.ld`` in your 584*61c4878aSAndroid Build Coastguard Worker``pw_linker_script`` as follows: 585*61c4878aSAndroid Build Coastguard Worker 586*61c4878aSAndroid Build Coastguard Worker.. code-block:: 587*61c4878aSAndroid Build Coastguard Worker 588*61c4878aSAndroid Build Coastguard Worker pw_linker_script("my_linker_script") { 589*61c4878aSAndroid Build Coastguard Worker includes = [ "$dir_pw_bloat/bloat_macros.ld" ] 590*61c4878aSAndroid Build Coastguard Worker linker_script = "my_project_linker_script.ld" 591*61c4878aSAndroid Build Coastguard Worker } 592*61c4878aSAndroid Build Coastguard Worker 593*61c4878aSAndroid Build Coastguard WorkerThese symbols are then used to determine how to map segments to these memory 594*61c4878aSAndroid Build Coastguard Workerregions. Note that segments must be used in order to account for inter-section 595*61c4878aSAndroid Build Coastguard Workerpadding which are not attributed against any sections. 596*61c4878aSAndroid Build Coastguard Worker 597*61c4878aSAndroid Build Coastguard WorkerAs an example, if you have a single view in the single memory region named 598*61c4878aSAndroid Build Coastguard Worker``FLASH``, then you should include the following macro in your linker script to 599*61c4878aSAndroid Build Coastguard Workergenerate the symbols needed for the that region: 600*61c4878aSAndroid Build Coastguard Worker 601*61c4878aSAndroid Build Coastguard Worker.. code-block:: 602*61c4878aSAndroid Build Coastguard Worker 603*61c4878aSAndroid Build Coastguard Worker PW_BLOAT_MEMORY_REGION(FLASH) 604*61c4878aSAndroid Build Coastguard Worker 605*61c4878aSAndroid Build Coastguard WorkerAs another example, if you have two aliased memory regions (``DCTM`` and 606*61c4878aSAndroid Build Coastguard Worker``ITCM``) into the same effective memory named you'd like to call ``RAM``, then 607*61c4878aSAndroid Build Coastguard Workeryou should produce the following four symbols in your linker script: 608*61c4878aSAndroid Build Coastguard Worker 609*61c4878aSAndroid Build Coastguard Worker.. code-block:: 610*61c4878aSAndroid Build Coastguard Worker 611*61c4878aSAndroid Build Coastguard Worker PW_BLOAT_MEMORY_REGION_MAP(RAM, ITCM) 612*61c4878aSAndroid Build Coastguard Worker PW_BLOAT_MEMORY_REGION_MAP(RAM, DTCM) 613