| #!/bin/sh |
| # generate_codesize_stats.sh |
| # |
| # This file is part of mbed TLS (https://tls.mbed.org) |
| # |
| # Copyright (c) 2019, ARM Limited, All Rights Reserved |
| # |
| # Purpose |
| # |
| # Generate static memory usage statistics for an Mbed TLS build. |
| # |
| |
| set -eu |
| |
| if [ -d include/mbedtls ]; then :; else |
| echo "$0: must be run from root" >&2 |
| exit 1 |
| fi |
| |
| if grep -i cmake Makefile >/dev/null; then |
| echo "$0: not compatible with cmake" >&2 |
| exit 1 |
| fi |
| |
| BUILD_DIR="./library" |
| |
| LIBFILES=$( ls $BUILD_DIR/*.a ) |
| OBJFILES=$( ls $BUILD_DIR/*.o ) |
| |
| SUMMARY_ONLY=0 |
| LIMIT=9999 |
| |
| print_usage() { |
| echo "\nExtract static memory usage statistics for an Mbed TLS build.\n" |
| echo "Usage: $0 [options]" |
| echo " --files\tGenerate per-file code-size statistics." |
| echo " --syms\tGenerate per-symbol code-size statistics." |
| echo " -l|--limit num\tPrint only the largest 'num' symbols of the given type. (Default: $LIMIT) " |
| echo " -h|--help\tPrint this help." |
| echo " -d|--dir=BUILD_DIR\tThe build directory containing the 'library' folder (default: ${BUILD_DIR})" |
| } |
| |
| get_options() { |
| while [ $# -gt 0 ]; do |
| case "$1" in |
| -d|--dir) |
| shift; BUILD_DIR=$1 |
| ;; |
| -h|--help) |
| print_usage |
| exit 0 |
| ;; |
| --files) |
| FILE_STATS=1 |
| ;; |
| --syms) |
| SYM_STATS=1 |
| ;; |
| -l|--limit) |
| shift; LIMIT=$1 |
| ;; |
| -n|--name) |
| shift; name=$1 |
| ;; |
| -i|--info) |
| shift; info=$1 |
| ;; |
| *) |
| echo "Unknown argument: $1" |
| print_usage |
| exit 1 |
| ;; |
| esac |
| shift |
| done |
| } |
| |
| FILE_STATS=0 |
| SYM_STATS=0 |
| name="unnamed" |
| info="noinfo" |
| get_options "$@" |
| |
| date=$( date +%Y-%m-%d-%H-%M-%S ) |
| |
| report_syms() { |
| file=$(basename $1) |
| type=$2 |
| stat=$(nm --line-numbers --radix=d --size-sort --reverse $1 | |
| grep " [$3] " | |
| sort --reverse | |
| head -n $LIMIT | |
| awk -v type="$type" -v info="$info" -v name="$name" -v date="$date" -v file="$file" \ |
| '{ printf( "%10s %42s %12s %20s %8s %6d %s\n", date, name, info, file, type, $1, $3 ); }') |
| if [ -n "$stat" ]; then |
| echo "$stat" |
| fi |
| } |
| |
| # Report static memory usage (RAM and ROM) |
| if [ $FILE_STATS -eq 1 ]; then |
| for file_full in $LIBFILES; do |
| file=$(basename $file_full) |
| size --radix=10 $file_full | |
| sort -s -n -k 1,1 | |
| tail -n +2 | |
| sed -n '/^[ ]*0/!p' | |
| awk -v info="$info" -v name="$name" -v date="$date" '{ printf( "%10s %42s %12s %20s %6d %6d %6d\n", date, name, info, $6, $1, $2, $3 ); }' | |
| awk -v info="$info" -v name="$name" -v date="$date" -v file="$file" '{print $0; sum_text += $5; sum_data += $6; sum_bss += $7} |
| END { printf( "%10s %42s %12s %20s %6d %6d %6d\n\n", date, name, info, file, sum_text, sum_data, sum_bss ); }' |
| done |
| fi |
| |
| if [ $SYM_STATS -eq 1 ]; then |
| SYMTYPES="CODE-tT DATA-dD RODATA-rR BSS-bB" |
| for symtype in $SYMTYPES; do |
| type=${symtype%*-*} |
| specifier=${symtype#*-*} |
| for file_full in $OBJFILES; do |
| report_syms "$file_full" $type $specifier |
| done |
| done |
| fi |