Code size analyze tool

These are scripts to dump ARMCLANG complie map file detail information and get the change between two different build results. The features are:

  • Get a database to implement data tables from ARMCLANG or GNUARM map file.

  • Supply an UI for developers to scan sorted information of sections, libraries, object files, functions and data. It can help analyze the biggest or smallest targets in certain image. It can also help search functions or data to locate their address and detail information.

  • Diff two databases to see the code size increasement or decreasement.

Install dependency

Linux

Install curse and database.

sudo apt-get install python3-dev libmysqlclient-dev libncursesw6 libncurses6 libsqlite3-dev
pip install mysqlclient XlsxWriter

Windows

In power shell, use pip to install packages.

pip install mysqlclient XlsxWriter windows-curses

Usage

The commands of code size analyze tool usage are:

usage: code_size_analyze.py [-h] [--gnuarm | --armcc] [--db-name <data.db>]
                            [-u | -S | -s | -l | -o | -f | -d |
                             --dump-sec <sec> | --dump-lib <lib> |
                             --dump-obj <obj> | --dump-func <func> |
                             --dump-data <data> | --search-func <func> |
                             --search-data <data>]
                            [--sort-by-size | --sort-by-name |
                             --sort-by-obj | --sort-by-lib |
                             --sort-by-sec] [--desc | --asc]
                             file_input

positional arguments:
    file_input            map or database file

optional arguments:
    -h, --help            show this help message and exit
    --gnuarm              GNUARM model
    --armcc               ARMCLANG model
    --db-name <data.db>   database name to save
    -u, --ui              start UI to analyze
    -S, --Summary         show summary message
    -s, --list-section    list section
    -l, --list-library    list library
    -o, --list-obj        list object file
    -f, --list-function   list function
    -d, --list-data       list data
    --dump-sec <sec>      dump section
    --dump-lib <lib>      dump library
    --dump-obj <obj>      dump object file
    --dump-func <func>    dump function
    --dump-data <data>    dump data
    --search-func <func>  search function
    --search-data <data>  search data
    --sort-by-size        list by size order
    --sort-by-name        list by name order
    --sort-by-obj         list by object file name order
    --sort-by-lib         list by library file name order
    --sort-by-sec         list by section name order
    --desc                sort with desc order
    --asc                 sort with asc order

Create database

It is required to input map file path for the script before show the UI. One of the options like --gnuarm or --armcc is required.

The default database name created is data.db. Use --db-name to name the output file if necessary. For example, saving two different databases to compare later.

$: python code_size_analyze.py tfm_s.map <--gnuarm|--armcc> --db-name tfm_s.db

UI mode

The script ui.py supplies a menu to choose what developers may be interested. You can enter UI mode by analyzing map file directly or by importing database file path. The latter way is suggested as it runs more quickly.

$: python code_size_analyze.py tfm_s.map <--gnuarm|--armcc> -u
$: python code_size_analyze.py tfm_s.db -u

There are several keys to use UI.

  • UP: Move UP, mouse scrolling up is same.

  • DOWN: Move down, mouse scrolling down is same.

  • RIGHT: Move right.

  • LEFT: Move left.

  • Enter: Move to next page if it can be unfolded.

  • Q or q: Escape to previous page or close script if it in top menu.

  • s or S: Enter output file name to save the content of current page.

  • : : Start search and enter the function or data name.

Terminal mode

In terminal mode, it is better to analyze database file rather than map file.

Dump detail information

You can get the list of all sections, libraries, object files, functions or data. You can also dump the specific symbol with the name.

$: python code_size_analyze.py tfm_s.map --armcc --db-name test.db -S
───────────────────────────────────────────────
Code size       : 56676         55.35   KB
-----------------------------------------------
RO data         : 3732          3.64    KB
RW data         : 204           0.20    KB
ZI data         : 24588         24.01   KB
Flash size      : 60612         59.19   KB = Code + RO + RW
RAM size        : 24792         24.21   KB = RW + ZI
───────────────────────────────────────────────

$: python code_size_analyze.py tfm_s.db -s
$: python code_size_analyze.py tfm_s.db --dump-sec <sec>

Search specific function or data

You can search the target with keyword in command line. For example:

$: python code_size_analyze.py tfm_s.db --search-func <func>
$: python code_size_analyze.py tfm_s.db --search-data <data>

Sort Table

You can sort the messages in terminal mode. The script supplies five options and two orders. For example:

$: python code_size_analyze.py tfm_s.db -l --sort-by-size --asc
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Name                                              Flash size  RAM size    Code        RO data     RW data     ZI data     Inc. data   Debug
--------------------------------------------------------------------------------------------------------------------------------------------------
libtfm_qcbor_s.a                                  758         0           758         0           0           0           4           17046
libtfm_sprt.a                                     1016        0           1016        0           0           0           0           41004
c_w.l                                             1248        96          1248        0           0           96          86          1892
libtfm_psa_rot_partition_attestation.a            2497        557         2492        5           0           557         68          51865
libtfm_spm.a                                      4112        657         3932        136         44          613         168         52958
libtfm_psa_rot_partition_its.a                    5090        116         5030        32          28          88          28          49804
libtfm_psa_rot_partition_crypto.a                 6062        3232        6062        0           0           3232        36          92472
libplatform_s.a                                   6486        316         5582        780         124         192         404         94887
libmbedcrypto.a                                   28408       2292        26138       2262        8           2284        1066        226489
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Not all symbols support to be sorted by the whole five options, refer to the table to get more information.

Options

Section

Library

Object files

Function

Data

–sort-by-size

–sort-by-name

–sort-by-sec

–sort-by-lib

–sort-by-obj

Code size diff tool

Use code_size_diff.py to diff two diffrent build results with same compiler.

usage: code_size_diff.py [-h] (-S | -f | -d | -o | -l) based_db compared_db

positional arguments:
    based_db             based databse
    compared_db          compared databse

optional arguments:
    -h, --help            show this help message and exit
    -S, --diff-Summary    diff summary
    -f, --diff-function   diff function
    -d, --diff-data       diff data
    -o, --diff-obj        diff object file
    -l, --diff-lib        diff library

Firstly, use code_size_analyze.py to prepare two different databases. Then compare two database with the diff tool, the branch1 is base.

$: python code_size_diff.py output/branch1.db output/branch2.db -S
Code size:  +++         48928   B               47.78   KB
RO data:    +++         29440   B               28.75   KB
RW data:    ---         64      B               0.06    KB
ZI data:    ---         500     B               0.49    KB
Flash size: +++         78304   B               76.47   KB
RAM size:   ---         564     B               0.55    KB

Copyright (c) 2021-2022, Arm Limited. All rights reserved.