codesize_profiling.sh 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. INPUT_FILE=$1
  2. OUTPUT_FILE=$2
  3. AWK_ARG=""
  4. if [[ $(awk --version) = GNU* ]]; then
  5. AWK_ARG="--non-decimal-data"
  6. fi
  7. echo "Symbol,Address,Size,Object" > ${OUTPUT_FILE}.tmp
  8. awk ${AWK_ARG} '/^ .text/ {
  9. if ($2 != "" && $2 >= "0x00200000") {
  10. $4 = substr($4, match($4, /[^\/]+$/));
  11. printf("%s,%s,%d,%s\n", $1, $2, $3, $4);
  12. }
  13. }' ${INPUT_FILE} >> ${OUTPUT_FILE}.tmp
  14. awk ${AWK_ARG} '/^ .text/ {
  15. if ($2 == "") {
  16. A = $1;
  17. getline;
  18. $3 = substr($3, match($3, /[^\/]+$/));
  19. A = A "," sprintf("%s,%d,%s", $1, $2, $3);
  20. if ($1 >= "0x00200000")
  21. print A;
  22. A = "";
  23. }
  24. }' ${INPUT_FILE} >> ${OUTPUT_FILE}.tmp
  25. awk ${AWK_ARG} '/^ .data/ {
  26. if ($2 != "" && $2 >= "0x00200000") {
  27. $4 = substr($4, match($4, /[^\/]+$/));
  28. printf("%s,%s,%d,%s\n", $1, $2, $3, $4);
  29. }
  30. }' ${INPUT_FILE} >> ${OUTPUT_FILE}.tmp
  31. awk ${AWK_ARG} '/^ .data/ {
  32. if ($2 == "") {
  33. A = $1;
  34. getline;
  35. $3 = substr($3, match($3, /[^\/]+$/));
  36. A = A "," sprintf("%s,%d,%s", $1, $2, $3);
  37. if ($1 >= "0x00200000")
  38. print A;
  39. A = "";
  40. }
  41. }' ${INPUT_FILE} >> ${OUTPUT_FILE}.tmp
  42. awk ${AWK_ARG} '/^ .rodata/ {
  43. if ($2 != "" && $2 >= "0x00200000") {
  44. $4 = substr($4, match($4, /[^\/]+$/));
  45. printf("%s,%s,%d,%s\n", $1, $2, $3, $4);
  46. }
  47. }' ${INPUT_FILE} >> ${OUTPUT_FILE}.tmp
  48. awk ${AWK_ARG} '/^ .rodata/ {
  49. if ($2 == "") {
  50. A = $1;
  51. getline;
  52. $3 = substr($3, match($3, /[^\/]+$/));
  53. A = A "," sprintf("%s,%d,%s", $1, $2, $3);
  54. if ($1 >= "0x00200000")
  55. print A;
  56. A = "";
  57. }
  58. }' ${INPUT_FILE} >> ${OUTPUT_FILE}.tmp
  59. awk ${AWK_ARG} '/^ .bss/ {
  60. if ($2 != "" && ($2 >= "0x00200000" || $2 >= "0x00100000")) {
  61. $4 = substr($4, match($4, /[^\/]+$/));
  62. printf("%s,%s,%d,%s\n", $1, $2, $3, $4);
  63. }
  64. }' ${INPUT_FILE} >> ${OUTPUT_FILE}.tmp
  65. awk ${AWK_ARG} '/^ .bss/ {
  66. if ($2 == "") {
  67. A = $1;
  68. getline;
  69. $3 = substr($3, match($3, /[^\/]+$/));
  70. A = A "," sprintf("%s,%d,%s", $1, $2, $3);
  71. if (($1 >= "0x00200000") || ($1 >= "0x00100000"))
  72. print A;
  73. A = "";
  74. }
  75. }' ${INPUT_FILE} >> ${OUTPUT_FILE}.tmp
  76. awk ${AWK_ARG} '/^ \*\* merge strings/ {
  77. A = $1" "$2" "$3;
  78. getline;
  79. A = A "," sprintf("%s,%d", $1, $2);
  80. if ($1 >= "0x00200000")
  81. print A;
  82. A = "";
  83. }' ${INPUT_FILE} >> ${OUTPUT_FILE}.tmp
  84. awk ${AWK_ARG} '/^.got/ {
  85. printf("%s,%s,%d\n", $1, $2, $3, $4);
  86. }' ${INPUT_FILE} >> ${OUTPUT_FILE}.tmp
  87. awk '
  88. BEGIN {
  89. FS = ",";
  90. print "Object,Symbol,Size";
  91. }
  92. {
  93. if (NR > 1) {
  94. obj_sym = $4 " " $1; # use object + symbol as key
  95. object[obj_sym] = $4;
  96. size[obj_sym] = $3;
  97. total += $3;
  98. }
  99. }
  100. END {
  101. for (obj_sym in object) {
  102. sum[object[obj_sym]] += size[obj_sym];
  103. }
  104. PROCINFO["sorted_in"] = "@val_num_desc"
  105. for (filename in sum) {
  106. print filename",," sum[filename];
  107. for (obj_sym in object) {
  108. if (object[obj_sym] == filename) {
  109. symbol = substr(obj_sym, match(obj_sym, / /) + 1);
  110. print "," symbol "," size[obj_sym]
  111. }
  112. }
  113. }
  114. print "Total,," total;
  115. }
  116. ' ${OUTPUT_FILE}.tmp > ${OUTPUT_FILE}
  117. rm ${OUTPUT_FILE}.tmp
  118. echo "End of Profiling..."