mbedtls/scripts/generate_codesize_stats.sh

124 lines
3.4 KiB
Bash
Executable File

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