xref: /aosp_15_r20/external/pigweed/pw_bloat/docs.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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