1diff --git a/binutils/size.c b/binutils/size.c
2index 3697087714..f99d45a6bf 100644
3--- a/binutils/size.c
4+++ b/binutils/size.c
5@@ -51,7 +51,8 @@ enum output_format
6 {
7 FORMAT_BERKLEY,
8 FORMAT_SYSV,
9- FORMAT_GNU
10+ FORMAT_GNU,
11+ FORMAT_AVR
12 };
13 static enum output_format selected_output_format =
14 #if BSD_DEFAULT
15@@ -74,6 +75,246 @@ static bfd_size_type total_textsize;
16 /* Program exit status. */
17 static int return_code = 0;
18
19+
20+/* AVR Size specific stuff */
21+
22+#define AVR64 64UL
23+#define AVR128 128UL
24+#define AVR256 256UL
25+#define AVR512 512UL
26+#define AVR1K 1024UL
27+#define AVR2K 2048UL
28+#define AVR4K 4096UL
29+#define AVR8K 8192UL
30+#define AVR16K 16384UL
31+#define AVR20K 20480UL
32+#define AVR24K 24576UL
33+#define AVR32K 32768UL
34+#define AVR36K 36864UL
35+#define AVR40K 40960UL
36+#define AVR64K 65536UL
37+#define AVR68K 69632UL
38+#define AVR128K 131072UL
39+#define AVR136K 139264UL
40+#define AVR200K 204800UL
41+#define AVR256K 262144UL
42+#define AVR264K 270336UL
43+
44+typedef struct
45+{
46+ char *name;
47+ long flash;
48+ long ram;
49+ long eeprom;
50+} avr_device_t;
51+
52+avr_device_t avr[] =
53+{
54+ {"atxmega256a3", AVR264K, AVR16K, AVR4K},
55+ {"atxmega256a3b", AVR264K, AVR16K, AVR4K},
56+ {"atxmega256d3", AVR264K, AVR16K, AVR4K},
57+
58+ {"atmega2560", AVR256K, AVR8K, AVR4K},
59+ {"atmega2561", AVR256K, AVR8K, AVR4K},
60+
61+ {"atxmega192a3", AVR200K, AVR16K, AVR2K},
62+ {"atxmega192d3", AVR200K, AVR16K, AVR2K},
63+
64+ {"atxmega128a1", AVR136K, AVR8K, AVR2K},
65+ {"atxmega128a1u", AVR136K, AVR8K, AVR2K},
66+ {"atxmega128a3", AVR136K, AVR8K, AVR2K},
67+ {"atxmega128d3", AVR136K, AVR8K, AVR2K},
68+
69+ {"at43usb320", AVR128K, 608UL, 0UL},
70+ {"at90can128", AVR128K, AVR4K, AVR4K},
71+ {"at90usb1286", AVR128K, AVR8K, AVR4K},
72+ {"at90usb1287", AVR128K, AVR8K, AVR4K},
73+ {"atmega128", AVR128K, AVR4K, AVR4K},
74+ {"atmega1280", AVR128K, AVR8K, AVR4K},
75+ {"atmega1281", AVR128K, AVR8K, AVR4K},
76+ {"atmega1284p", AVR128K, AVR16K, AVR4K},
77+ {"atmega128rfa1", AVR128K, AVR16K, AVR4K},
78+ {"atmega103", AVR128K, 4000UL, AVR4K},
79+
80+ {"atxmega64a1", AVR68K, AVR4K, AVR2K},
81+ {"atxmega64a1u", AVR68K, AVR4K, AVR2K},
82+ {"atxmega64a3", AVR68K, AVR4K, AVR2K},
83+ {"atxmega64d3", AVR68K, AVR4K, AVR2K},
84+
85+ {"at90can64", AVR64K, AVR4K, AVR2K},
86+ {"at90scr100", AVR64K, AVR4K, AVR2K},
87+ {"at90usb646", AVR64K, AVR4K, AVR2K},
88+ {"at90usb647", AVR64K, AVR4K, AVR2K},
89+ {"atmega64", AVR64K, AVR4K, AVR2K},
90+ {"atmega640", AVR64K, AVR8K, AVR4K},
91+ {"atmega644", AVR64K, AVR4K, AVR2K},
92+ {"atmega644a", AVR64K, AVR4K, AVR2K},
93+ {"atmega644p", AVR64K, AVR4K, AVR2K},
94+ {"atmega644pa", AVR64K, AVR4K, AVR2K},
95+ {"atmega645", AVR64K, AVR4K, AVR2K},
96+ {"atmega645a", AVR64K, AVR4K, AVR2K},
97+ {"atmega645p", AVR64K, AVR4K, AVR2K},
98+ {"atmega6450", AVR64K, AVR4K, AVR2K},
99+ {"atmega6450a", AVR64K, AVR4K, AVR2K},
100+ {"atmega6450p", AVR64K, AVR4K, AVR2K},
101+ {"atmega649", AVR64K, AVR4K, AVR2K},
102+ {"atmega649a", AVR64K, AVR4K, AVR2K},
103+ {"atmega649p", AVR64K, AVR4K, AVR2K},
104+ {"atmega6490", AVR64K, AVR4K, AVR2K},
105+ {"atmega6490a", AVR64K, AVR4K, AVR2K},
106+ {"atmega6490p", AVR64K, AVR4K, AVR2K},
107+ {"atmega64c1", AVR64K, AVR4K, AVR2K},
108+ {"atmega64hve", AVR64K, AVR4K, AVR1K},
109+ {"atmega64m1", AVR64K, AVR4K, AVR2K},
110+ {"m3000", AVR64K, AVR4K, 0UL},
111+
112+ {"atmega406", AVR40K, AVR2K, AVR512},
113+
114+ {"atxmega32a4", AVR36K, AVR4K, AVR1K},
115+ {"atxmega32d4", AVR36K, AVR4K, AVR1K},
116+
117+ {"at90can32", AVR32K, AVR2K, AVR1K},
118+ {"at94k", AVR32K, AVR4K, 0UL},
119+ {"atmega32", AVR32K, AVR2K, AVR1K},
120+ {"atmega323", AVR32K, AVR2K, AVR1K},
121+ {"atmega324a", AVR32K, AVR2K, AVR1K},
122+ {"atmega324p", AVR32K, AVR2K, AVR1K},
123+ {"atmega324pa", AVR32K, AVR2K, AVR1K},
124+ {"atmega325", AVR32K, AVR2K, AVR1K},
125+ {"atmega325a", AVR32K, AVR2K, AVR1K},
126+ {"atmega325p", AVR32K, AVR2K, AVR1K},
127+ {"atmega3250", AVR32K, AVR2K, AVR1K},
128+ {"atmega3250a", AVR32K, AVR2K, AVR1K},
129+ {"atmega3250p", AVR32K, AVR2K, AVR1K},
130+ {"atmega328", AVR32K, AVR2K, AVR1K},
131+ {"atmega328p", AVR32K, AVR2K, AVR1K},
132+ {"atmega329", AVR32K, AVR2K, AVR1K},
133+ {"atmega329a", AVR32K, AVR2K, AVR1K},
134+ {"atmega329p", AVR32K, AVR2K, AVR1K},
135+ {"atmega329pa", AVR32K, AVR2K, AVR1K},
136+ {"atmega3290", AVR32K, AVR2K, AVR1K},
137+ {"atmega3290a", AVR32K, AVR2K, AVR1K},
138+ {"atmega3290p", AVR32K, AVR2K, AVR1K},
139+ {"atmega32hvb", AVR32K, AVR2K, AVR1K},
140+ {"atmega32c1", AVR32K, AVR2K, AVR1K},
141+ {"atmega32hvb", AVR32K, AVR2K, AVR1K},
142+ {"atmega32m1", AVR32K, AVR2K, AVR1K},
143+ {"atmega32u2", AVR32K, AVR1K, AVR1K},
144+ {"atmega32u4", AVR32K, 2560UL, AVR1K},
145+ {"atmega32u6", AVR32K, 2560UL, AVR1K},
146+
147+ {"at43usb355", AVR24K, 1120UL, 0UL},
148+
149+ {"atxmega16a4", AVR20K, AVR2K, AVR1K},
150+ {"atxmega16d4", AVR20K, AVR2K, AVR1K},
151+
152+ {"at76c711", AVR16K, AVR2K, 0UL},
153+ {"at90pwm216", AVR16K, AVR1K, AVR512},
154+ {"at90pwm316", AVR16K, AVR1K, AVR512},
155+ {"at90usb162", AVR16K, AVR512, AVR512},
156+ {"atmega16", AVR16K, AVR1K, AVR512},
157+ {"atmega16a", AVR16K, AVR1K, AVR512},
158+ {"atmega161", AVR16K, AVR1K, AVR512},
159+ {"atmega162", AVR16K, AVR1K, AVR512},
160+ {"atmega163", AVR16K, AVR1K, AVR512},
161+ {"atmega164", AVR16K, AVR1K, AVR512},
162+ {"atmega164a", AVR16K, AVR1K, AVR512},
163+ {"atmega164p", AVR16K, AVR1K, AVR512},
164+ {"atmega165a", AVR16K, AVR1K, AVR512},
165+ {"atmega165", AVR16K, AVR1K, AVR512},
166+ {"atmega165p", AVR16K, AVR1K, AVR512},
167+ {"atmega168", AVR16K, AVR1K, AVR512},
168+ {"atmega168a", AVR16K, AVR1K, AVR512},
169+ {"atmega168p", AVR16K, AVR1K, AVR512},
170+ {"atmega169", AVR16K, AVR1K, AVR512},
171+ {"atmega169a", AVR16K, AVR1K, AVR512},
172+ {"atmega169p", AVR16K, AVR1K, AVR512},
173+ {"atmega169pa", AVR16K, AVR1K, AVR512},
174+ {"atmega16hva", AVR16K, 768UL, AVR256},
175+ {"atmega16hva2", AVR16K, AVR1K, AVR256},
176+ {"atmega16hvb", AVR16K, AVR1K, AVR512},
177+ {"atmega16m1", AVR16K, AVR1K, AVR512},
178+ {"atmega16u2", AVR16K, AVR512, AVR512},
179+ {"atmega16u4", AVR16K, 1280UL, AVR512},
180+ {"attiny167", AVR16K, AVR512, AVR512},
181+
182+ {"at90c8534", AVR8K, 352UL, AVR512},
183+ {"at90pwm1", AVR8K, AVR512, AVR512},
184+ {"at90pwm2", AVR8K, AVR512, AVR512},
185+ {"at90pwm2b", AVR8K, AVR512, AVR512},
186+ {"at90pwm3", AVR8K, AVR512, AVR512},
187+ {"at90pwm3b", AVR8K, AVR512, AVR512},
188+ {"at90pwm81", AVR8K, AVR256, AVR512},
189+ {"at90s8515", AVR8K, AVR512, AVR512},
190+ {"at90s8535", AVR8K, AVR512, AVR512},
191+ {"at90usb82", AVR8K, AVR512, AVR512},
192+ {"ata6289", AVR8K, AVR512, 320UL},
193+ {"atmega8", AVR8K, AVR1K, AVR512},
194+ {"atmega8515", AVR8K, AVR512, AVR512},
195+ {"atmega8535", AVR8K, AVR512, AVR512},
196+ {"atmega88", AVR8K, AVR1K, AVR512},
197+ {"atmega88a", AVR8K, AVR1K, AVR512},
198+ {"atmega88p", AVR8K, AVR1K, AVR512},
199+ {"atmega88pa", AVR8K, AVR1K, AVR512},
200+ {"atmega8hva", AVR8K, 768UL, AVR256},
201+ {"atmega8u2", AVR8K, AVR512, AVR512},
202+ {"attiny84", AVR8K, AVR512, AVR512},
203+ {"attiny84a", AVR8K, AVR512, AVR512},
204+ {"attiny85", AVR8K, AVR512, AVR512},
205+ {"attiny861", AVR8K, AVR512, AVR512},
206+ {"attiny861a", AVR8K, AVR512, AVR512},
207+ {"attiny87", AVR8K, AVR512, AVR512},
208+ {"attiny88", AVR8K, AVR512, AVR64},
209+
210+ {"at90s4414", AVR4K, 352UL, AVR256},
211+ {"at90s4433", AVR4K, AVR128, AVR256},
212+ {"at90s4434", AVR4K, 352UL, AVR256},
213+ {"atmega48", AVR4K, AVR512, AVR256},
214+ {"atmega48a", AVR4K, AVR512, AVR256},
215+ {"atmega48p", AVR4K, AVR512, AVR256},
216+ {"attiny4313", AVR4K, AVR256, AVR256},
217+ {"attiny43u", AVR4K, AVR256, AVR64},
218+ {"attiny44", AVR4K, AVR256, AVR256},
219+ {"attiny44a", AVR4K, AVR256, AVR256},
220+ {"attiny45", AVR4K, AVR256, AVR256},
221+ {"attiny461", AVR4K, AVR256, AVR256},
222+ {"attiny461a", AVR4K, AVR256, AVR256},
223+ {"attiny48", AVR4K, AVR256, AVR64},
224+
225+ {"at86rf401", AVR2K, 224UL, AVR128},
226+ {"at90s2313", AVR2K, AVR128, AVR128},
227+ {"at90s2323", AVR2K, AVR128, AVR128},
228+ {"at90s2333", AVR2K, 224UL, AVR128},
229+ {"at90s2343", AVR2K, AVR128, AVR128},
230+ {"attiny20", AVR2K, AVR128, 0UL},
231+ {"attiny22", AVR2K, 224UL, AVR128},
232+ {"attiny2313", AVR2K, AVR128, AVR128},
233+ {"attiny2313a", AVR2K, AVR128, AVR128},
234+ {"attiny24", AVR2K, AVR128, AVR128},
235+ {"attiny24a", AVR2K, AVR128, AVR128},
236+ {"attiny25", AVR2K, AVR128, AVR128},
237+ {"attiny26", AVR2K, AVR128, AVR128},
238+ {"attiny261", AVR2K, AVR128, AVR128},
239+ {"attiny261a", AVR2K, AVR128, AVR128},
240+ {"attiny28", AVR2K, 0UL, 0UL},
241+ {"attiny40", AVR2K, AVR256, 0UL},
242+
243+ {"at90s1200", AVR1K, 0UL, AVR64},
244+ {"attiny9", AVR1K, 32UL, 0UL},
245+ {"attiny10", AVR1K, 32UL, 0UL},
246+ {"attiny11", AVR1K, 0UL, AVR64},
247+ {"attiny12", AVR1K, 0UL, AVR64},
248+ {"attiny13", AVR1K, AVR64, AVR64},
249+ {"attiny13a", AVR1K, AVR64, AVR64},
250+ {"attiny15", AVR1K, 0UL, AVR64},
251+
252+ {"attiny4", AVR512, 32UL, 0UL},
253+ {"attiny5", AVR512, 32UL, 0UL},
254+};
255+
256+static char *avrmcu = NULL;
257+
258+
259 static char *target = NULL;
260
261 /* Forward declarations. */
262@@ -89,7 +330,8 @@ usage (FILE *stream, int status)
263 fprintf (stream, _(" Displays the sizes of sections inside binary files\n"));
264 fprintf (stream, _(" If no input file(s) are specified, a.out is assumed\n"));
265 fprintf (stream, _(" The options are:\n\
266- -A|-B|-G --format={sysv|berkeley|gnu} Select output style (default is %s)\n\
267+ -A|-B|-G|-C --format={sysv|berkeley|gnu|avr} Select output style (default is %s)\n\
268+ --mcu=<avrmcu> MCU name for AVR format only\n\
269 -o|-d|-x --radix={8|10|16} Display numbers in octal, decimal or hex\n\
270 -t --totals Display the total sizes (Berkeley only)\n\
271 --common Display total size for *COM* syms\n\
272@@ -113,6 +355,7 @@ usage (FILE *stream, int status)
273 #define OPTION_FORMAT (200)
274 #define OPTION_RADIX (OPTION_FORMAT + 1)
275 #define OPTION_TARGET (OPTION_RADIX + 1)
276+#define OPTION_MCU (OPTION_TARGET + 1)
277
278 static struct option long_options[] =
279 {
280@@ -120,6 +363,7 @@ static struct option long_options[] =
281 {"format", required_argument, 0, OPTION_FORMAT},
282 {"radix", required_argument, 0, OPTION_RADIX},
283 {"target", required_argument, 0, OPTION_TARGET},
284+ {"mcu", required_argument, 0, 203},
285 {"totals", no_argument, &show_totals, 1},
286 {"version", no_argument, &show_version, 1},
287 {"help", no_argument, &show_help, 1},
288@@ -153,7 +397,7 @@ main (int argc, char **argv)
289 fatal (_("fatal error: libbfd ABI mismatch"));
290 set_default_bfd_target ();
291
292- while ((c = getopt_long (argc, argv, "ABGHhVvdfotx", long_options,
293+ while ((c = getopt_long (argc, argv, "ABCGHhVvdfotx", long_options,
294 (int *) 0)) != EOF)
295 switch (c)
296 {
297@@ -172,12 +416,20 @@ main (int argc, char **argv)
298 case 'g':
299 selected_output_format = FORMAT_GNU;
300 break;
301+ case 'A':
302+ case 'a':
303+ selected_output_format = FORMAT_AVR;
304+ break;
305 default:
306 non_fatal (_("invalid argument to --format: %s"), optarg);
307 usage (stderr, 1);
308 }
309 break;
310
311+ case OPTION_MCU:
312+ avrmcu = optarg;
313+ break;
314+
315 case OPTION_TARGET:
316 target = optarg;
317 break;
318@@ -214,6 +466,9 @@ main (int argc, char **argv)
319 case 'G':
320 selected_output_format = FORMAT_GNU;
321 break;
322+ case 'C':
323+ selected_output_format = FORMAT_AVR;
324+ break;
325 case 'v':
326 case 'V':
327 show_version = 1;
328@@ -656,6 +911,98 @@ print_sysv_format (bfd *file)
329 printf ("\n\n");
330 }
331
332+static avr_device_t *
333+avr_find_device (void)
334+{
335+ unsigned int i;
336+ if (avrmcu != NULL)
337+ {
338+ for (i = 0; i < sizeof(avr) / sizeof(avr[0]); i++)
339+ {
340+ if (strcmp(avr[i].name, avrmcu) == 0)
341+ {
342+ /* Match found */
343+ return (&avr[i]);
344+ }
345+ }
346+ }
347+ return (NULL);
348+}
349+
350+static void
351+print_avr_format (bfd *file)
352+{
353+ char *avr_name = "Unknown";
354+ int flashmax = 0;
355+ int rammax = 0;
356+ int eeprommax = 0;
357+ asection *section;
358+ bfd_size_type my_datasize = 0;
359+ bfd_size_type my_textsize = 0;
360+ bfd_size_type my_bsssize = 0;
361+ bfd_size_type bootloadersize = 0;
362+ bfd_size_type noinitsize = 0;
363+ bfd_size_type eepromsize = 0;
364+
365+ avr_device_t *avrdevice = avr_find_device();
366+ if (avrdevice != NULL)
367+ {
368+ avr_name = avrdevice->name;
369+ flashmax = avrdevice->flash;
370+ rammax = avrdevice->ram;
371+ eeprommax = avrdevice->eeprom;
372+ }
373+
374+ if ((section = bfd_get_section_by_name (file, ".data")) != NULL)
375+ my_datasize = bfd_section_size (section);
376+ if ((section = bfd_get_section_by_name (file, ".text")) != NULL)
377+ my_textsize = bfd_section_size (section);
378+ if ((section = bfd_get_section_by_name (file, ".bss")) != NULL)
379+ my_bsssize = bfd_section_size (section);
380+ if ((section = bfd_get_section_by_name (file, ".bootloader")) != NULL)
381+ bootloadersize = bfd_section_size (section);
382+ if ((section = bfd_get_section_by_name (file, ".noinit")) != NULL)
383+ noinitsize = bfd_section_size (section);
384+ if ((section = bfd_get_section_by_name (file, ".eeprom")) != NULL)
385+ eepromsize = bfd_section_size (section);
386+
387+ bfd_size_type text = my_textsize + my_datasize + bootloadersize;
388+ bfd_size_type data = my_datasize + my_bsssize + noinitsize;
389+ bfd_size_type eeprom = eepromsize;
390+
391+ printf ("AVR Memory Usage\n"
392+ "----------------\n"
393+ "Device: %s\n\n", avr_name);
394+
395+ /* Text size */
396+ printf ("Program:%8ld bytes", text);
397+ if (flashmax > 0)
398+ {
399+ printf (" (%2.1f%% Full)", ((float)text / flashmax) * 100);
400+ }
401+ printf ("\n(.text + .data + .bootloader)\n\n");
402+
403+ /* Data size */
404+ printf ("Data: %8ld bytes", data);
405+ if (rammax > 0)
406+ {
407+ printf (" (%2.1f%% Full)", ((float)data / rammax) * 100);
408+ }
409+ printf ("\n(.data + .bss + .noinit)\n\n");
410+
411+ /* EEPROM size */
412+ if (eeprom > 0)
413+ {
414+ printf ("EEPROM: %8ld bytes", eeprom);
415+ if (eeprommax > 0)
416+ {
417+ printf (" (%2.1f%% Full)", ((float)eeprom / eeprommax) * 100);
418+ }
419+ printf ("\n(.eeprom)\n\n");
420+ }
421+}
422+
423+
424 static void
425 print_sizes (bfd *file)
426 {
427@@ -663,6 +1010,8 @@ print_sizes (bfd *file)
428 calculate_common_size (file);
429 if (selected_output_format == FORMAT_SYSV)
430 print_sysv_format (file);
431+ else if (selected_output_format == FORMAT_AVR)
432+ print_avr_format (file);
433 else
434 print_berkeley_or_gnu_format (file);
435 }