Ticket #46442: patch-binutils-avr-size.diff

File patch-binutils-avr-size.diff, 15.9 KB (added by billygr (billy), 10 years ago)
  • binutils-2.24/binutils/size.c

    old new  
    3636#include "getopt.h"
    3737#include "bucomm.h"
    3838
    39 #ifndef BSD_DEFAULT
    40 #define BSD_DEFAULT 1
     39typedef enum
     40{
     41    format_sysv = 0,
     42    format_bsd = 1,
     43    format_avr = 2,
     44} format_type_t;
     45
     46
     47/* Set the default format. */
     48#define FORMAT_DEFAULT_SYSV 0
     49#define FORMAT_DEFAULT_BSD 1
     50#define FORMAT_DEFAULT_AVR 0
     51
     52#if FORMAT_DEFAULT_SYSV
     53    #define FORMAT_DEFAULT format_sysv
     54    #define FORMAT_NAME "sysv"
     55#elif FORMAT_DEFAULT_BSD
     56    #define FORMAT_DEFAULT format_bsd
     57    #define FORMAT_NAME "berkeley"
     58#elif FORMAT_DEFAULT_AVR
     59    #define FORMAT_DEFAULT format_avr
     60    #define FORMAT_NAME "avr"
    4161#endif
    4262
     63
    4364/* Program options.  */
    4465
    4566static enum
     
    4869  }
    4970radix = decimal;
    5071
    51 /* 0 means use AT&T-style output.  */
    52 static int berkeley_format = BSD_DEFAULT;
    5372
     73format_type_t format = FORMAT_DEFAULT;
    5474static int show_version = 0;
    5575static int show_help = 0;
    5676static int show_totals = 0;
     
    6484/* Program exit status.  */
    6585static int return_code = 0;
    6686
     87
     88/* AVR Size specific stuff */
     89
     90#define AVR64 64UL
     91#define AVR128 128UL
     92#define AVR256 256UL
     93#define AVR512 512UL
     94#define AVR1K 1024UL
     95#define AVR2K 2048UL
     96#define AVR4K 4096UL
     97#define AVR8K 8192UL
     98#define AVR16K 16384UL
     99#define AVR20K 20480UL
     100#define AVR24K 24576UL
     101#define AVR32K 32768UL
     102#define AVR36K 36864UL
     103#define AVR40K 40960UL
     104#define AVR64K 65536UL
     105#define AVR68K 69632UL
     106#define AVR128K 131072UL
     107#define AVR136K 139264UL
     108#define AVR200K 204800UL
     109#define AVR256K 262144UL
     110#define AVR264K 270336UL
     111
     112typedef struct
     113{
     114    char *name;
     115        long flash;
     116        long ram;
     117        long eeprom;
     118} avr_device_t;
     119
     120avr_device_t avr[] =
     121{
     122        {"atxmega256a3",  AVR264K, AVR16K, AVR4K},
     123        {"atxmega256a3b", AVR264K, AVR16K, AVR4K},
     124        {"atxmega256d3",  AVR264K, AVR16K, AVR4K},
     125
     126        {"atmega2560",    AVR256K, AVR8K,  AVR4K},
     127        {"atmega2561",    AVR256K, AVR8K,  AVR4K},
     128
     129        {"atxmega192a3",  AVR200K, AVR16K, AVR2K},
     130        {"atxmega192d3",  AVR200K, AVR16K, AVR2K},
     131
     132        {"atxmega128a1",  AVR136K, AVR8K,  AVR2K},
     133        {"atxmega128a1u", AVR136K, AVR8K,  AVR2K},
     134        {"atxmega128a3",  AVR136K, AVR8K,  AVR2K},
     135        {"atxmega128d3",  AVR136K, AVR8K,  AVR2K},
     136
     137        {"at43usb320",    AVR128K, 608UL,  0UL},
     138        {"at90can128",    AVR128K, AVR4K,  AVR4K},
     139        {"at90usb1286",   AVR128K, AVR8K,  AVR4K},
     140        {"at90usb1287",   AVR128K, AVR8K,  AVR4K},
     141        {"atmega128",     AVR128K, AVR4K,  AVR4K},
     142        {"atmega1280",    AVR128K, AVR8K,  AVR4K},
     143        {"atmega1281",    AVR128K, AVR8K,  AVR4K},
     144        {"atmega1284p",   AVR128K, AVR16K, AVR4K},
     145        {"atmega128rfa1", AVR128K, AVR16K, AVR4K},
     146        {"atmega103",     AVR128K, 4000UL, AVR4K},
     147
     148        {"atxmega64a1",   AVR68K,  AVR4K,  AVR2K},
     149        {"atxmega64a1u",  AVR68K,  AVR4K,  AVR2K},
     150        {"atxmega64a3",   AVR68K,  AVR4K,  AVR2K},
     151        {"atxmega64d3",   AVR68K,  AVR4K,  AVR2K},
     152
     153        {"at90can64",     AVR64K,  AVR4K,  AVR2K},
     154        {"at90scr100",    AVR64K,  AVR4K,  AVR2K},
     155        {"at90usb646",    AVR64K,  AVR4K,  AVR2K},
     156        {"at90usb647",    AVR64K,  AVR4K,  AVR2K},
     157        {"atmega64",      AVR64K,  AVR4K,  AVR2K},
     158        {"atmega640",     AVR64K,  AVR8K,  AVR4K},
     159        {"atmega644",     AVR64K,  AVR4K,  AVR2K},
     160        {"atmega644a",    AVR64K,  AVR4K,  AVR2K},
     161        {"atmega644p",    AVR64K,  AVR4K,  AVR2K},
     162        {"atmega644pa",   AVR64K,  AVR4K,  AVR2K},
     163        {"atmega645",     AVR64K,  AVR4K,  AVR2K},
     164        {"atmega645a",    AVR64K,  AVR4K,  AVR2K},
     165        {"atmega645p",    AVR64K,  AVR4K,  AVR2K},
     166        {"atmega6450",    AVR64K,  AVR4K,  AVR2K},
     167        {"atmega6450a",   AVR64K,  AVR4K,  AVR2K},
     168        {"atmega6450p",   AVR64K,  AVR4K,  AVR2K},
     169        {"atmega649",     AVR64K,  AVR4K,  AVR2K},
     170        {"atmega649a",    AVR64K,  AVR4K,  AVR2K},
     171        {"atmega649p",    AVR64K,  AVR4K,  AVR2K},
     172        {"atmega6490",    AVR64K,  AVR4K,  AVR2K},
     173        {"atmega6490a",   AVR64K,  AVR4K,  AVR2K},
     174        {"atmega6490p",   AVR64K,  AVR4K,  AVR2K},
     175        {"atmega64c1",    AVR64K,  AVR4K,  AVR2K},
     176        {"atmega64hve",   AVR64K,  AVR4K,  AVR1K},
     177        {"atmega64m1",    AVR64K,  AVR4K,  AVR2K},
     178   {"m3000",         AVR64K,  AVR4K,  0UL},
     179
     180        {"atmega406",     AVR40K,  AVR2K,  AVR512},
     181
     182        {"atxmega32a4",   AVR36K,  AVR4K,  AVR1K},
     183        {"atxmega32d4",   AVR36K,  AVR4K,  AVR1K},
     184
     185        {"at90can32",     AVR32K,  AVR2K,  AVR1K},
     186        {"at94k",         AVR32K,  AVR4K,  0UL},
     187        {"atmega32",      AVR32K,  AVR2K,  AVR1K},
     188        {"atmega323",     AVR32K,  AVR2K,  AVR1K},
     189        {"atmega324a",    AVR32K,  AVR2K,  AVR1K},
     190        {"atmega324p",    AVR32K,  AVR2K,  AVR1K},
     191        {"atmega324pa",   AVR32K,  AVR2K,  AVR1K},
     192        {"atmega325",     AVR32K,  AVR2K,  AVR1K},
     193        {"atmega325a",    AVR32K,  AVR2K,  AVR1K},
     194        {"atmega325p",    AVR32K,  AVR2K,  AVR1K},
     195        {"atmega3250",    AVR32K,  AVR2K,  AVR1K},
     196        {"atmega3250a",   AVR32K,  AVR2K,  AVR1K},
     197        {"atmega3250p",   AVR32K,  AVR2K,  AVR1K},
     198        {"atmega328",     AVR32K,  AVR2K,  AVR1K},
     199        {"atmega328p",    AVR32K,  AVR2K,  AVR1K},
     200        {"atmega329",     AVR32K,  AVR2K,  AVR1K},
     201        {"atmega329a",    AVR32K,  AVR2K,  AVR1K},
     202        {"atmega329p",    AVR32K,  AVR2K,  AVR1K},
     203        {"atmega329pa",   AVR32K,  AVR2K,  AVR1K},
     204        {"atmega3290",    AVR32K,  AVR2K,  AVR1K},
     205        {"atmega3290a",   AVR32K,  AVR2K,  AVR1K},
     206        {"atmega3290p",   AVR32K,  AVR2K,  AVR1K},
     207        {"atmega32hvb",   AVR32K,  AVR2K,  AVR1K},
     208        {"atmega32c1",    AVR32K,  AVR2K,  AVR1K},
     209   {"atmega32hvb",   AVR32K,  AVR2K,  AVR1K},
     210        {"atmega32m1",    AVR32K,  AVR2K,  AVR1K},
     211        {"atmega32u2",    AVR32K,  AVR1K,  AVR1K},
     212        {"atmega32u4",    AVR32K,  2560UL, AVR1K},
     213        {"atmega32u6",    AVR32K,  2560UL, AVR1K},
     214
     215        {"at43usb355",    AVR24K,  1120UL,   0UL},
     216
     217        {"atxmega16a4",   AVR20K,  AVR2K,  AVR1K},
     218        {"atxmega16d4",   AVR20K,  AVR2K,  AVR1K},
     219
     220        {"at76c711",      AVR16K,  AVR2K,  0UL},
     221        {"at90pwm216",    AVR16K,  AVR1K,  AVR512},
     222        {"at90pwm316",    AVR16K,  AVR1K,  AVR512},
     223        {"at90usb162",    AVR16K,  AVR512, AVR512},
     224        {"atmega16",      AVR16K,  AVR1K,  AVR512},
     225        {"atmega16a",     AVR16K,  AVR1K,  AVR512},
     226        {"atmega161",     AVR16K,  AVR1K,  AVR512},
     227        {"atmega162",     AVR16K,  AVR1K,  AVR512},
     228        {"atmega163",     AVR16K,  AVR1K,  AVR512},
     229        {"atmega164",     AVR16K,  AVR1K,  AVR512},
     230        {"atmega164a",    AVR16K,  AVR1K,  AVR512},
     231        {"atmega164p",    AVR16K,  AVR1K,  AVR512},
     232        {"atmega165a",    AVR16K,  AVR1K,  AVR512},
     233        {"atmega165",     AVR16K,  AVR1K,  AVR512},
     234        {"atmega165p",    AVR16K,  AVR1K,  AVR512},
     235        {"atmega168",     AVR16K,  AVR1K,  AVR512},
     236        {"atmega168a",    AVR16K,  AVR1K,  AVR512},
     237        {"atmega168p",    AVR16K,  AVR1K,  AVR512},
     238        {"atmega169",     AVR16K,  AVR1K,  AVR512},
     239        {"atmega169a",    AVR16K,  AVR1K,  AVR512},
     240        {"atmega169p",    AVR16K,  AVR1K,  AVR512},
     241        {"atmega169pa",   AVR16K,  AVR1K,  AVR512},
     242        {"atmega16hva",   AVR16K,  768UL,  AVR256},
     243        {"atmega16hva2",  AVR16K,  AVR1K,  AVR256},
     244   {"atmega16hvb",   AVR16K,  AVR1K,  AVR512},
     245        {"atmega16m1",    AVR16K,  AVR1K,  AVR512},
     246        {"atmega16u2",    AVR16K,  AVR512, AVR512},
     247        {"atmega16u4",    AVR16K,  1280UL, AVR512},
     248        {"attiny167",     AVR16K,  AVR512, AVR512},
     249
     250        {"at90c8534",     AVR8K,   352UL,  AVR512},
     251        {"at90pwm1",      AVR8K,   AVR512, AVR512},
     252        {"at90pwm2",      AVR8K,   AVR512, AVR512},
     253        {"at90pwm2b",     AVR8K,   AVR512, AVR512},
     254        {"at90pwm3",      AVR8K,   AVR512, AVR512},
     255        {"at90pwm3b",     AVR8K,   AVR512, AVR512},
     256        {"at90pwm81",     AVR8K,   AVR256, AVR512},
     257        {"at90s8515",     AVR8K,   AVR512, AVR512},
     258        {"at90s8535",     AVR8K,   AVR512, AVR512},
     259        {"at90usb82",     AVR8K,   AVR512, AVR512},
     260        {"ata6289",       AVR8K,   AVR512, 320UL},
     261        {"atmega8",       AVR8K,   AVR1K,  AVR512},
     262        {"atmega8515",    AVR8K,   AVR512, AVR512},
     263        {"atmega8535",    AVR8K,   AVR512, AVR512},
     264        {"atmega88",      AVR8K,   AVR1K,  AVR512},
     265        {"atmega88a",     AVR8K,   AVR1K,  AVR512},
     266        {"atmega88p",     AVR8K,   AVR1K,  AVR512},
     267        {"atmega88pa",    AVR8K,   AVR1K,  AVR512},
     268        {"atmega8hva",    AVR8K,   768UL,  AVR256},
     269        {"atmega8u2",     AVR8K,   AVR512, AVR512},
     270        {"attiny84",      AVR8K,   AVR512, AVR512},
     271        {"attiny84a",     AVR8K,   AVR512, AVR512},
     272        {"attiny85",      AVR8K,   AVR512, AVR512},
     273        {"attiny861",     AVR8K,   AVR512, AVR512},
     274        {"attiny861a",    AVR8K,   AVR512, AVR512},
     275        {"attiny87",      AVR8K,   AVR512, AVR512},
     276        {"attiny88",      AVR8K,   AVR512, AVR64},
     277
     278        {"at90s4414",     AVR4K,   352UL,  AVR256},
     279        {"at90s4433",     AVR4K,   AVR128, AVR256},
     280        {"at90s4434",     AVR4K,   352UL,  AVR256},
     281        {"atmega48",      AVR4K,   AVR512, AVR256},
     282        {"atmega48a",     AVR4K,   AVR512, AVR256},
     283        {"atmega48p",     AVR4K,   AVR512, AVR256},
     284        {"attiny4313",    AVR4K,   AVR256, AVR256},
     285        {"attiny43u",     AVR4K,   AVR256, AVR64},
     286        {"attiny44",      AVR4K,   AVR256, AVR256},
     287        {"attiny44a",     AVR4K,   AVR256, AVR256},
     288        {"attiny45",      AVR4K,   AVR256, AVR256},
     289        {"attiny461",     AVR4K,   AVR256, AVR256},
     290        {"attiny461a",    AVR4K,   AVR256, AVR256},
     291        {"attiny48",      AVR4K,   AVR256, AVR64},
     292
     293        {"at86rf401",     AVR2K,   224UL,  AVR128},
     294        {"at90s2313",     AVR2K,   AVR128, AVR128},
     295        {"at90s2323",     AVR2K,   AVR128, AVR128},
     296        {"at90s2333",     AVR2K,   224UL,  AVR128},
     297        {"at90s2343",     AVR2K,   AVR128, AVR128},
     298   {"attiny20",      AVR2K,   AVR128, 0UL},
     299        {"attiny22",      AVR2K,   224UL,  AVR128},
     300        {"attiny2313",    AVR2K,   AVR128, AVR128},
     301        {"attiny2313a",   AVR2K,   AVR128, AVR128},
     302        {"attiny24",      AVR2K,   AVR128, AVR128},
     303        {"attiny24a",     AVR2K,   AVR128, AVR128},
     304        {"attiny25",      AVR2K,   AVR128, AVR128},
     305        {"attiny26",      AVR2K,   AVR128, AVR128},
     306        {"attiny261",     AVR2K,   AVR128, AVR128},
     307        {"attiny261a",    AVR2K,   AVR128, AVR128},
     308        {"attiny28",      AVR2K,   0UL,    0UL},
     309   {"attiny40",      AVR2K,   AVR256, 0UL},
     310
     311        {"at90s1200",     AVR1K,   0UL,    AVR64},
     312   {"attiny9",       AVR1K,   32UL,   0UL},
     313   {"attiny10",      AVR1K,   32UL,   0UL},
     314        {"attiny11",      AVR1K,   0UL,    AVR64},
     315        {"attiny12",      AVR1K,   0UL,    AVR64},
     316        {"attiny13",      AVR1K,   AVR64,  AVR64},
     317        {"attiny13a",     AVR1K,   AVR64,  AVR64},
     318        {"attiny15",      AVR1K,   0UL,    AVR64},
     319
     320   {"attiny4",       AVR512,  32UL,   0UL},
     321   {"attiny5",       AVR512,  32UL,   0UL},
     322};
     323
     324static char *avrmcu = NULL;
     325
     326
    67327static char *target = NULL;
    68328
    69329/* Forward declarations.  */
     
    79339  fprintf (stream, _(" Displays the sizes of sections inside binary files\n"));
    80340  fprintf (stream, _(" If no input file(s) are specified, a.out is assumed\n"));
    81341  fprintf (stream, _(" The options are:\n\
    82   -A|-B     --format={sysv|berkeley}  Select output style (default is %s)\n\
     342  -A|-B|-C  --format={sysv|berkeley|avr}  Select output style (default is %s)\n\
     343            --mcu=<avrmcu>            MCU name for AVR format only\n\
    83344  -o|-d|-x  --radix={8|10|16}         Display numbers in octal, decimal or hex\n\
    84345  -t        --totals                  Display the total sizes (Berkeley only)\n\
    85346            --common                  Display total size for *COM* syms\n\
     
    88349  -h        --help                    Display this information\n\
    89350  -v        --version                 Display the program's version\n\
    90351\n"),
    91 #if BSD_DEFAULT
    92   "berkeley"
    93 #else
    94   "sysv"
    95 #endif
     352FORMAT_NAME
    96353);
    97354  list_supported_targets (program_name, stream);
    98355  if (REPORT_BUGS_TO[0] && status == 0)
     
    103360#define OPTION_FORMAT (200)
    104361#define OPTION_RADIX (OPTION_FORMAT + 1)
    105362#define OPTION_TARGET (OPTION_RADIX + 1)
     363#define OPTION_MCU (OPTION_TARGET + 1)
    106364
    107365static struct option long_options[] =
    108366{
     
    110368  {"format", required_argument, 0, OPTION_FORMAT},
    111369  {"radix", required_argument, 0, OPTION_RADIX},
    112370  {"target", required_argument, 0, OPTION_TARGET},
     371  {"mcu", required_argument, 0, 203},
    113372  {"totals", no_argument, &show_totals, 1},
    114373  {"version", no_argument, &show_version, 1},
    115374  {"help", no_argument, &show_help, 1},
     
    141400  bfd_init ();
    142401  set_default_bfd_target ();
    143402
    144   while ((c = getopt_long (argc, argv, "ABHhVvdfotx", long_options,
     403  while ((c = getopt_long (argc, argv, "ABCHhVvdfotx", long_options,
    145404                           (int *) 0)) != EOF)
    146405    switch (c)
    147406      {
     
    150409          {
    151410          case 'B':
    152411          case 'b':
    153             berkeley_format = 1;
     412            format = format_bsd;
    154413            break;
    155414          case 'S':
    156415          case 's':
    157             berkeley_format = 0;
     416            format = format_sysv;
     417            break;
     418          case 'A':
     419          case 'a':
     420            format = format_avr;
    158421            break;
    159422          default:
    160423            non_fatal (_("invalid argument to --format: %s"), optarg);
     
    162425          }
    163426        break;
    164427
     428      case OPTION_MCU:
     429        avrmcu = optarg;
     430        break;
     431
    165432      case OPTION_TARGET:
    166433        target = optarg;
    167434        break;
     
    190457        break;
    191458
    192459      case 'A':
    193         berkeley_format = 0;
     460        format = format_sysv;
    194461        break;
    195462      case 'B':
    196         berkeley_format = 1;
     463        format = format_bsd;
    197464        break;
     465      case 'C':
     466    format = format_avr;
     467    break;
    198468      case 'v':
    199469      case 'V':
    200470        show_version = 1;
     
    240510    for (; optind < argc;)
    241511      display_file (argv[optind++]);
    242512
    243   if (show_totals && berkeley_format)
     513  if (show_totals && format == format_bsd)
    244514    {
    245515      bfd_size_type total = total_textsize + total_datasize + total_bsssize;
    246516
     
    599869  printf ("\n\n");
    600870}
    601871
     872
     873static avr_device_t *
     874avr_find_device (void)
     875{
     876  unsigned int i;
     877  if (avrmcu != NULL)
     878  {
     879    for (i = 0; i < sizeof(avr) / sizeof(avr[0]); i++)
     880    {
     881      if (strcmp(avr[i].name, avrmcu) == 0)
     882      {
     883        /* Match found */
     884        return (&avr[i]);
     885      }
     886    }
     887  }
     888  return (NULL);
     889}
     890
     891
     892
     893static void
     894print_avr_format (bfd *file)
     895{
     896  char *avr_name = "Unknown";
     897  int flashmax = 0;
     898  int rammax = 0;
     899  int eeprommax = 0;
     900  asection *section;
     901  bfd_size_type avr_datasize = 0;
     902  bfd_size_type avr_textsize = 0;
     903  bfd_size_type avr_bsssize = 0;
     904  bfd_size_type bootloadersize = 0;
     905  bfd_size_type noinitsize = 0;
     906  bfd_size_type eepromsize = 0;
     907
     908  avr_device_t *avrdevice = avr_find_device();
     909  if (avrdevice != NULL)
     910  {
     911    avr_name = avrdevice->name;
     912    flashmax = avrdevice->flash;
     913    rammax = avrdevice->ram;
     914    eeprommax = avrdevice->eeprom;
     915  }
     916
     917  if ((section = bfd_get_section_by_name (file, ".data")) != NULL)
     918    avr_datasize = bfd_section_size (file, section);
     919  if ((section = bfd_get_section_by_name (file, ".text")) != NULL)
     920    avr_textsize = bfd_section_size (file, section);
     921  if ((section = bfd_get_section_by_name (file, ".bss")) != NULL)
     922    avr_bsssize = bfd_section_size (file, section);
     923  if ((section = bfd_get_section_by_name (file, ".bootloader")) != NULL)
     924    bootloadersize = bfd_section_size (file, section);
     925  if ((section = bfd_get_section_by_name (file, ".noinit")) != NULL)
     926    noinitsize = bfd_section_size (file, section);
     927  if ((section = bfd_get_section_by_name (file, ".eeprom")) != NULL)
     928    eepromsize = bfd_section_size (file, section);
     929 
     930  bfd_size_type text = avr_textsize + avr_datasize + bootloadersize;
     931  bfd_size_type data = avr_datasize + avr_bsssize + noinitsize;
     932  bfd_size_type eeprom = eepromsize;
     933 
     934  printf ("AVR Memory Usage\n"
     935          "----------------\n"
     936          "Device: %s\n\n", avr_name);
     937 
     938  /* Text size */
     939  printf ("Program:%8ld bytes", text);
     940  if (flashmax > 0)
     941  {
     942    printf (" (%2.1f%% Full)", ((float)text / flashmax) * 100);
     943  }
     944  printf ("\n(.text + .data + .bootloader)\n\n");
     945 
     946  /* Data size */
     947  printf ("Data:   %8ld bytes", data);
     948  if (rammax > 0)
     949  {
     950    printf (" (%2.1f%% Full)", ((float)data / rammax) * 100);
     951  }
     952  printf ("\n(.data + .bss + .noinit)\n\n");
     953 
     954  /* EEPROM size */
     955  if (eeprom > 0)
     956  {
     957    printf ("EEPROM: %8ld bytes", eeprom);
     958    if (eeprommax > 0)
     959    {
     960      printf (" (%2.1f%% Full)", ((float)eeprom / eeprommax) * 100);
     961    }
     962    printf ("\n(.eeprom)\n\n");
     963  }
     964}
     965
     966
    602967static void
    603968print_sizes (bfd *file)
    604969{
    605970  if (show_common)
    606971    calculate_common_size (file);
    607   if (berkeley_format)
    608     print_berkeley_format (file);
    609   else
    610     print_sysv_format (file);
     972  switch (format)
     973  {
     974    case format_sysv:
     975      print_sysv_format (file);
     976      break;
     977    case format_bsd:
     978      print_berkeley_format (file);
     979      break;
     980    case format_avr:
     981    default:
     982      print_avr_format (file);
     983      break;
     984  }
    611985}