Line 1... |
Line 1... |
/* BFD library support routines for the AVR architecture.
|
/* BFD library support routines for the AVR architecture.
|
Copyright 1999, 2000, 2002, 2006, 2007 Free Software Foundation, Inc.
|
Copyright 1999, 2000, 2002, 2005, 2006, 2007, 2008
|
|
Free Software Foundation, Inc.
|
Contributed by Denis Chertykov <denisc@overta.ru>
|
Contributed by Denis Chertykov <denisc@overta.ru>
|
|
|
This file is part of BFD, the Binary File Descriptor library.
|
This file is part of BFD, the Binary File Descriptor library.
|
|
|
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
Line 33... |
Line 34... |
{
|
{
|
/* If a & b are for different architectures we can do nothing. */
|
/* If a & b are for different architectures we can do nothing. */
|
if (a->arch != b->arch)
|
if (a->arch != b->arch)
|
return NULL;
|
return NULL;
|
|
|
|
if (a->mach == b->mach)
|
|
return a;
|
|
|
|
/* avr-6 is compatible only with itself as its call convention is not
|
|
compatible with other avr (the mcu saves the return address on 3 bytes
|
|
instead of 2). */
|
|
if (a->mach == bfd_mach_avr6 || b->mach == bfd_mach_avr6)
|
|
return NULL;
|
|
|
|
if (a->mach < bfd_mach_avr6 && b->mach < bfd_mach_avr6)
|
|
{
|
/* Special case for ATmega[16]03 (avr:3) and ATmega83 (avr:4). */
|
/* Special case for ATmega[16]03 (avr:3) and ATmega83 (avr:4). */
|
if ((a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr4)
|
if ((a->mach == bfd_mach_avr3 && b->mach == bfd_mach_avr4)
|
|| (a->mach == bfd_mach_avr4 && b->mach == bfd_mach_avr3))
|
|| (a->mach == bfd_mach_avr4 && b->mach == bfd_mach_avr3))
|
return NULL;
|
return NULL;
|
|
|
/* So far all newer AVR architecture cores are supersets of previous
|
|
cores. */
|
|
if (a->mach <= b->mach)
|
if (a->mach <= b->mach)
|
return b;
|
return b;
|
|
|
if (a->mach >= b->mach)
|
if (a->mach >= b->mach)
|
return a;
|
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 == 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;
|
return NULL;
|
}
|
}
|
|
|
#define N(addr_bits, machine, print, default, next) \
|
#define N(addr_bits, machine, print, default, next) \
|
{ \
|
{ \
|
Line 68... |
Line 99... |
next \
|
next \
|
}
|
}
|
|
|
static const bfd_arch_info_type arch_info_struct[] =
|
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]),
|
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]),
|
N (16, bfd_mach_avr2, "avr:2", FALSE, & arch_info_struct[2]),
|
|
|
/* ATmega103, ATmega603. */
|
/* Classic + MOVW, <= 8K. */
|
N (22, bfd_mach_avr3, "avr:3", FALSE, & arch_info_struct[3]),
|
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]),
|
|
|
|
/* Enhanced, <= 8K. */
|
|
N (16, bfd_mach_avr4, "avr:4", FALSE, & arch_info_struct[7]),
|
|
|
/* ATmega83, ATmega85. */
|
/* Enhanced, > 8K, <= 64K. */
|
N (16, bfd_mach_avr4, "avr:4", FALSE, & arch_info_struct[4]),
|
/* 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]),
|
|
|
/* ATmega161, ATmega163, ATmega32, AT94K. */
|
/* Enhanced, == 128K. */
|
N (22, bfd_mach_avr5, "avr:5", FALSE, & arch_info_struct[5]),
|
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)
|
N (22, bfd_mach_avr6, "avr:6", FALSE, NULL)
|
};
|
};
|
|
|
const bfd_arch_info_type bfd_avr_arch =
|
const bfd_arch_info_type bfd_avr_arch =
|
N (16, bfd_mach_avr2, "avr", TRUE, & arch_info_struct[0]);
|
N (16, bfd_mach_avr2, "avr", TRUE, & arch_info_struct[0]);
|