#!/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