blob: 33d1c7bb6a8b01ff72dfd6eafc9e812020331492 [file] [log] [blame]
Hanno Becker43fa8d62019-03-18 17:12:05 +00001#!/bin/sh
2# generate_codesize_stats.sh
3#
4# This file is part of mbed TLS (https://tls.mbed.org)
5#
6# Copyright (c) 2019, ARM Limited, All Rights Reserved
7#
8# Purpose
9#
10# Generate static memory usage statistics for an Mbed TLS build.
11#
12
13set -eu
14
15if [ -d include/mbedtls ]; then :; else
16 echo "$0: must be run from root" >&2
17 exit 1
18fi
19
20if grep -i cmake Makefile >/dev/null; then
21 echo "$0: not compatible with cmake" >&2
22 exit 1
23fi
24
25BUILD_DIR="./library"
26
27LIBFILES=$( ls $BUILD_DIR/*.a )
28OBJFILES=$( ls $BUILD_DIR/*.o )
29
30SUMMARY_ONLY=0
31LIMIT=9999
32
33print_usage() {
34 echo "\nExtract static memory usage statistics for an Mbed TLS build.\n"
35 echo "Usage: $0 [options]"
36 echo " --files\tGenerate per-file code-size statistics."
37 echo " --syms\tGenerate per-symbol code-size statistics."
38 echo " -l|--limit num\tPrint only the largest 'num' symbols of the given type. (Default: $LIMIT) "
39 echo " -h|--help\tPrint this help."
40 echo " -d|--dir=BUILD_DIR\tThe build directory containing the 'library' folder (default: ${BUILD_DIR})"
41}
42
43get_options() {
44 while [ $# -gt 0 ]; do
45 case "$1" in
46 -d|--dir)
47 shift; BUILD_DIR=$1
48 ;;
49 -h|--help)
50 print_usage
51 exit 0
52 ;;
53 --files)
54 FILE_STATS=1
55 ;;
56 --syms)
57 SYM_STATS=1
58 ;;
59 -l|--limit)
60 shift; LIMIT=$1
61 ;;
62 -n|--name)
63 shift; name=$1
64 ;;
65 -i|--info)
66 shift; info=$1
67 ;;
68 *)
69 echo "Unknown argument: $1"
70 print_usage
71 exit 1
72 ;;
73 esac
74 shift
75 done
76}
77
78FILE_STATS=0
79SYM_STATS=0
80name="unnamed"
81info="noinfo"
82get_options "$@"
83
84date=$( date +%Y-%m-%d-%H-%M-%S )
85
86report_syms() {
87 file=$(basename $1)
88 type=$2
89 stat=$(nm --line-numbers --radix=d --size-sort --reverse $1 |
90 grep " [$3] " |
91 sort --reverse |
92 head -n $LIMIT |
93 awk -v type="$type" -v info="$info" -v name="$name" -v date="$date" -v file="$file" \
94 '{ printf( "%10s %42s %12s %20s %8s %6d %s\n", date, name, info, file, type, $1, $3 ); }')
95 if [ -n "$stat" ]; then
96 echo "$stat"
97 fi
98}
99
100# Report static memory usage (RAM and ROM)
101if [ $FILE_STATS -eq 1 ]; then
102 for file_full in $LIBFILES; do
103 file=$(basename $file_full)
104 size --radix=10 $file_full |
105 sort -s -n -k 1,1 |
106 tail -n +2 |
107 sed -n '/^[ ]*0/!p' |
108 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 ); }' |
109 awk -v info="$info" -v name="$name" -v date="$date" -v file="$file" '{print $0; sum_text += $5; sum_data += $6; sum_bss += $7}
110 END { printf( "%10s %42s %12s %20s %6d %6d %6d\n\n", date, name, info, file, sum_text, sum_data, sum_bss ); }'
111 done
112fi
113
114if [ $SYM_STATS -eq 1 ]; then
115 SYMTYPES="CODE-tT DATA-dD RODATA-rR BSS-bB"
116 for symtype in $SYMTYPES; do
117 type=${symtype%*-*}
118 specifier=${symtype#*-*}
119 for file_full in $OBJFILES; do
120 report_syms "$file_full" $type $specifier
121 done
122 done
123fi