diff options
Diffstat (limited to 'bfd')
-rw-r--r-- | bfd/ChangeLog | 14 | ||||
-rw-r--r-- | bfd/archures.c | 4 | ||||
-rw-r--r-- | bfd/bfd-in2.h | 4 | ||||
-rw-r--r-- | bfd/cpu-avr.c | 76 | ||||
-rw-r--r-- | bfd/elf32-avr.c | 29 |
5 files changed, 109 insertions, 18 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog index a705ca7..14cbb10 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,17 @@ +2008-08-08 Anatoly Sokolov <aesok@post.ru> + + * archures.c (bfd_mach_avr25, bfd_mach_avr31, bfd_mach_avr35, + bfd_mach_avr51): New. + * bfd-in2.h: Regenerate. + * cpu-avr.c (arch_info_struct): Add avr25, avr31, avr35, and avr51 + architectures. Change comments to match architecture comments in GCC. + (compatible): Add test for new AVR architectures. + * elf32-avr.c (bfd_elf_avr_final_write_processing): Recognize + bfd_mach_avr25, bfd_mach_avr31, bfd_mach_avr35 and bfd_mach_avr51. + (elf32_avr_object_p): Recognize E_AVR_MACH_AVR25, E_AVR_MACH_AVR31, + E_AVR_MACH_AVR35 and E_AVR_MACH_AVR51. + + 2008-08-08 Richard Sandiford <rdsandiford@googlemail.com> Daniel Jacobowitz <dan@codesourcery.com> Catherine Moore <clm@codesourcery.com> diff --git a/bfd/archures.c b/bfd/archures.c index fec83e5..aa49499 100644 --- a/bfd/archures.c +++ b/bfd/archures.c @@ -349,9 +349,13 @@ DESCRIPTION . bfd_arch_avr, {* Atmel AVR microcontrollers. *} .#define bfd_mach_avr1 1 .#define bfd_mach_avr2 2 +.#define bfd_mach_avr25 25 .#define bfd_mach_avr3 3 +.#define bfd_mach_avr31 31 +.#define bfd_mach_avr35 35 .#define bfd_mach_avr4 4 .#define bfd_mach_avr5 5 +.#define bfd_mach_avr51 51 .#define bfd_mach_avr6 6 . bfd_arch_bfin, {* ADI Blackfin *} .#define bfd_mach_bfin 1 diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h index 9b0dcff..8868e7d 100644 --- a/bfd/bfd-in2.h +++ b/bfd/bfd-in2.h @@ -1971,9 +1971,13 @@ enum bfd_architecture bfd_arch_avr, /* Atmel AVR microcontrollers. */ #define bfd_mach_avr1 1 #define bfd_mach_avr2 2 +#define bfd_mach_avr25 25 #define bfd_mach_avr3 3 +#define bfd_mach_avr31 31 +#define bfd_mach_avr35 35 #define bfd_mach_avr4 4 #define bfd_mach_avr5 5 +#define bfd_mach_avr51 51 #define bfd_mach_avr6 6 bfd_arch_bfin, /* ADI Blackfin */ #define bfd_mach_bfin 1 diff --git a/bfd/cpu-avr.c b/bfd/cpu-avr.c index 51472a3..364f64e 100644 --- a/bfd/cpu-avr.c +++ b/bfd/cpu-avr.c @@ -35,20 +35,44 @@ compatible (const bfd_arch_info_type * a, if (a->arch != b->arch) return NULL; - /* Special case for ATmega[16]03 (avr:3) and ATmega83 (avr:4). */ - if ((a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr4) - || (a->mach == bfd_mach_avr4 && b->mach == bfd_mach_avr3)) - return NULL; + if (a->mach == b->mach) + return a; - /* So far all newer AVR architecture cores are supersets of previous - cores. */ - if (a->mach <= b->mach) + if (a->mach <= bfd_mach_avr6 && b->mach <= bfd_mach_avr6) + { + /* Special case for ATmega[16]03 (avr:3) and ATmega83 (avr:4). */ + if ((a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr4) + || (a->mach == bfd_mach_avr4 && b->mach == bfd_mach_avr3)) + return NULL; + + if (a->mach <= b->mach) + return b; + + if (a->mach >= b->mach) + return a; + } + + if (a->mach == bfd_mach_avr2 && b->mach == bfd_mach_avr25) + return a; + if (a->mach == bfd_mach_avr25 && b->mach == bfd_mach_avr2) + return b; + + if (a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr31) + return a; + if (a->mach == bfd_mach_avr31 && b->mach == bfd_mach_avr3) return b; - if (a->mach >= b->mach) + if (a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr35) return a; + if (a->mach == bfd_mach_avr35 && b->mach == bfd_mach_avr3) + return b; + + if (a->mach == bfd_mach_avr5 && b->mach == bfd_mach_avr51) + return a; + if (a->mach == bfd_mach_avr51 && b->mach == bfd_mach_avr5) + return b; + - /* Never reached! */ return NULL; } @@ -70,22 +94,38 @@ compatible (const bfd_arch_info_type * a, static const bfd_arch_info_type arch_info_struct[] = { - /* AT90S1200, ATtiny1x, ATtiny28. */ + /* Assembler only. */ N (16, bfd_mach_avr1, "avr:1", FALSE, & arch_info_struct[1]), - /* AT90S2xxx, AT90S4xxx, AT90S8xxx, ATtiny22. */ + /* Classic, <= 8K. */ N (16, bfd_mach_avr2, "avr:2", FALSE, & arch_info_struct[2]), - /* ATmega103, ATmega603. */ - N (22, bfd_mach_avr3, "avr:3", FALSE, & arch_info_struct[3]), + /* Classic + MOVW, <= 8K. */ + N (16, bfd_mach_avr25, "avr:25", FALSE, & arch_info_struct[3]), + + /* Classic, > 8K, <= 64K. */ + /* TODO: addr_bits should be 16, but set to 22 for some following + version of GCC (from 4.3) for backward compatibility. */ + N (22, bfd_mach_avr3, "avr:3", FALSE, & arch_info_struct[4]), + + /* Classic, == 128K. */ + N (22, bfd_mach_avr31, "avr:31", FALSE, & arch_info_struct[5]), + + /* Classic + MOVW + JMP/CALL, > 8K, <= 64K. */ + N (16, bfd_mach_avr35, "avr:35", FALSE, & arch_info_struct[6]), - /* ATmega83, ATmega85. */ - N (16, bfd_mach_avr4, "avr:4", FALSE, & arch_info_struct[4]), + /* Enhanced, <= 8K. */ + N (16, bfd_mach_avr4, "avr:4", FALSE, & arch_info_struct[7]), - /* ATmega161, ATmega163, ATmega32, AT94K. */ - N (22, bfd_mach_avr5, "avr:5", FALSE, & arch_info_struct[5]), + /* Enhanced, > 8K, <= 64K. */ + /* TODO: addr_bits should be 16, but set to 22 for some following + version of GCC (from 4.3) for backward compatibility. */ + N (22, bfd_mach_avr5, "avr:5", FALSE, & arch_info_struct[8]), + + /* Enhanced, == 128K. */ + N (22, bfd_mach_avr51, "avr:51", FALSE, & arch_info_struct[9]), - /* ATmega256x. */ + /* 3-Byte PC. */ N (22, bfd_mach_avr6, "avr:6", FALSE, NULL) }; diff --git a/bfd/elf32-avr.c b/bfd/elf32-avr.c index bab5ca0..fffd040 100644 --- a/bfd/elf32-avr.c +++ b/bfd/elf32-avr.c @@ -1296,10 +1296,19 @@ bfd_elf_avr_final_write_processing (bfd *abfd, val = E_AVR_MACH_AVR1; break; + case bfd_mach_avr25: + val = E_AVR_MACH_AVR25; + case bfd_mach_avr3: val = E_AVR_MACH_AVR3; break; + case bfd_mach_avr31: + val = E_AVR_MACH_AVR31; + + case bfd_mach_avr35: + val = E_AVR_MACH_AVR35; + case bfd_mach_avr4: val = E_AVR_MACH_AVR4; break; @@ -1308,6 +1317,10 @@ bfd_elf_avr_final_write_processing (bfd *abfd, val = E_AVR_MACH_AVR5; break; + case bfd_mach_avr51: + val = E_AVR_MACH_AVR51; + break; + case bfd_mach_avr6: val = E_AVR_MACH_AVR6; break; @@ -1342,10 +1355,22 @@ elf32_avr_object_p (bfd *abfd) e_set = bfd_mach_avr1; break; + case E_AVR_MACH_AVR25: + e_set = bfd_mach_avr25; + break; + case E_AVR_MACH_AVR3: e_set = bfd_mach_avr3; break; + case E_AVR_MACH_AVR31: + e_set = bfd_mach_avr31; + break; + + case E_AVR_MACH_AVR35: + e_set = bfd_mach_avr35; + break; + case E_AVR_MACH_AVR4: e_set = bfd_mach_avr4; break; @@ -1354,6 +1379,10 @@ elf32_avr_object_p (bfd *abfd) e_set = bfd_mach_avr5; break; + case E_AVR_MACH_AVR51: + e_set = bfd_mach_avr51; + break; + case E_AVR_MACH_AVR6: e_set = bfd_mach_avr6; break; |