aboutsummaryrefslogtreecommitdiff
path: root/gas/config/tc-avr.c
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2006-05-24 07:36:12 +0000
committerNick Clifton <nickc@redhat.com>2006-05-24 07:36:12 +0000
commit28c9d252b48e5c262359910389f157de087060d6 (patch)
tree8a03a8b466f84f1857399df1447d6f74e5a1cd5e /gas/config/tc-avr.c
parentf607ec8858a8ce6a1a821257d657db95ee47af2a (diff)
downloadgdb-28c9d252b48e5c262359910389f157de087060d6.zip
gdb-28c9d252b48e5c262359910389f157de087060d6.tar.gz
gdb-28c9d252b48e5c262359910389f157de087060d6.tar.bz2
Add support for AVR6 family
Diffstat (limited to 'gas/config/tc-avr.c')
-rw-r--r--gas/config/tc-avr.c206
1 files changed, 119 insertions, 87 deletions
diff --git a/gas/config/tc-avr.c b/gas/config/tc-avr.c
index 7a95033..cd1e47e 100644
--- a/gas/config/tc-avr.c
+++ b/gas/config/tc-avr.c
@@ -63,89 +63,92 @@ struct mcu_type_s
static struct mcu_type_s mcu_types[] =
{
- {"avr1", AVR_ISA_TINY1, bfd_mach_avr1},
- {"avr2", AVR_ISA_TINY2, bfd_mach_avr2},
- {"avr3", AVR_ISA_M103, bfd_mach_avr3},
- {"avr4", AVR_ISA_M8, bfd_mach_avr4},
- {"avr5", AVR_ISA_ALL, bfd_mach_avr5},
- {"at90s1200", AVR_ISA_1200, bfd_mach_avr1},
- {"attiny10", AVR_ISA_TINY1, bfd_mach_avr1}, /* XXX -> tn11 */
- {"attiny11", AVR_ISA_TINY1, bfd_mach_avr1},
- {"attiny12", AVR_ISA_TINY1, bfd_mach_avr1},
- {"attiny15", AVR_ISA_TINY1, bfd_mach_avr1},
- {"attiny28", AVR_ISA_TINY1, bfd_mach_avr1},
- {"at90s2313", AVR_ISA_2xxx, bfd_mach_avr2},
- {"at90s2323", AVR_ISA_2xxx, bfd_mach_avr2},
- {"at90s2333", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 4433 */
- {"at90s2343", AVR_ISA_2xxx, bfd_mach_avr2},
- {"attiny22", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 2343 */
- {"attiny26", AVR_ISA_2xxx, bfd_mach_avr2},
- {"at90s4433", AVR_ISA_2xxx, bfd_mach_avr2},
- {"at90s4414", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 8515 */
- {"at90s4434", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 8535 */
- {"at90s8515", AVR_ISA_2xxx, bfd_mach_avr2},
- {"at90s8535", AVR_ISA_2xxx, bfd_mach_avr2},
- {"at90c8534", AVR_ISA_2xxx, bfd_mach_avr2},
- {"at86rf401", AVR_ISA_2xxx, bfd_mach_avr2},
- {"attiny13", AVR_ISA_TINY2, bfd_mach_avr2},
- {"attiny2313",AVR_ISA_TINY2, bfd_mach_avr2},
- {"attiny261", AVR_ISA_TINY2, bfd_mach_avr2},
- {"attiny461", AVR_ISA_TINY2, bfd_mach_avr2},
- {"attiny861", AVR_ISA_TINY2, bfd_mach_avr2},
- {"attiny24", AVR_ISA_TINY2, bfd_mach_avr2},
- {"attiny44", AVR_ISA_TINY2, bfd_mach_avr2},
- {"attiny84", AVR_ISA_TINY2, bfd_mach_avr2},
- {"attiny25", AVR_ISA_TINY2, bfd_mach_avr2},
- {"attiny45", AVR_ISA_TINY2, bfd_mach_avr2},
- {"attiny85", AVR_ISA_TINY2, bfd_mach_avr2},
- {"atmega603", AVR_ISA_M603, bfd_mach_avr3}, /* XXX -> m103 */
- {"atmega103", AVR_ISA_M103, bfd_mach_avr3},
- {"at43usb320",AVR_ISA_M103, bfd_mach_avr3},
- {"at43usb355",AVR_ISA_M603, bfd_mach_avr3},
- {"at76c711", AVR_ISA_M603, bfd_mach_avr3},
- {"atmega48", AVR_ISA_PWMx, bfd_mach_avr4},
- {"atmega8", AVR_ISA_M8, bfd_mach_avr4},
- {"atmega83", AVR_ISA_M8, bfd_mach_avr4}, /* XXX -> m8535 */
- {"atmega85", AVR_ISA_M8, bfd_mach_avr4}, /* XXX -> m8 */
- {"atmega88", AVR_ISA_PWMx, bfd_mach_avr4},
- {"atmega8515",AVR_ISA_M8, bfd_mach_avr4},
- {"atmega8535",AVR_ISA_M8, bfd_mach_avr4},
- {"at90pwm2", AVR_ISA_PWMx, bfd_mach_avr4},
- {"at90pwm3", AVR_ISA_PWMx, bfd_mach_avr4},
- {"atmega16", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega161", AVR_ISA_M161, bfd_mach_avr5},
- {"atmega162", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega163", AVR_ISA_M161, bfd_mach_avr5},
- {"atmega164", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega165", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega168", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega169", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega32", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega323", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega324", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega325", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega329", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega3250",AVR_ISA_M323, bfd_mach_avr5},
- {"atmega3290",AVR_ISA_M323, bfd_mach_avr5},
- {"atmega406", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega64", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega640", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega644", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega128", AVR_ISA_M128, bfd_mach_avr5},
- {"atmega1280",AVR_ISA_M128, bfd_mach_avr5},
- {"atmega1281",AVR_ISA_M128, bfd_mach_avr5},
- {"atmega645", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega649", AVR_ISA_M323, bfd_mach_avr5},
- {"atmega6450",AVR_ISA_M323, bfd_mach_avr5},
- {"atmega6490",AVR_ISA_M323, bfd_mach_avr5},
- {"at90can32" ,AVR_ISA_M323, bfd_mach_avr5},
- {"at90can64" ,AVR_ISA_M323, bfd_mach_avr5},
- {"at90can128",AVR_ISA_M128, bfd_mach_avr5},
+ {"avr1", AVR_ISA_TINY1, bfd_mach_avr1},
+ {"avr2", AVR_ISA_TINY2, bfd_mach_avr2},
+ {"avr3", AVR_ISA_M103, bfd_mach_avr3},
+ {"avr4", AVR_ISA_M8, bfd_mach_avr4},
+ {"avr5", AVR_ISA_ALL, bfd_mach_avr5},
+ {"avr6", AVR_ISA_ALL, bfd_mach_avr6},
+ {"at90s1200", AVR_ISA_1200, bfd_mach_avr1},
+ {"attiny10", AVR_ISA_TINY1, bfd_mach_avr1}, /* XXX -> tn11 */
+ {"attiny11", AVR_ISA_TINY1, bfd_mach_avr1},
+ {"attiny12", AVR_ISA_TINY1, bfd_mach_avr1},
+ {"attiny15", AVR_ISA_TINY1, bfd_mach_avr1},
+ {"attiny28", AVR_ISA_TINY1, bfd_mach_avr1},
+ {"at90s2313", AVR_ISA_2xxx, bfd_mach_avr2},
+ {"at90s2323", AVR_ISA_2xxx, bfd_mach_avr2},
+ {"at90s2333", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 4433 */
+ {"at90s2343", AVR_ISA_2xxx, bfd_mach_avr2},
+ {"attiny22", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 2343 */
+ {"attiny26", AVR_ISA_2xxx, bfd_mach_avr2},
+ {"at90s4433", AVR_ISA_2xxx, bfd_mach_avr2},
+ {"at90s4414", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 8515 */
+ {"at90s4434", AVR_ISA_2xxx, bfd_mach_avr2}, /* XXX -> 8535 */
+ {"at90s8515", AVR_ISA_2xxx, bfd_mach_avr2},
+ {"at90s8535", AVR_ISA_2xxx, bfd_mach_avr2},
+ {"at90c8534", AVR_ISA_2xxx, bfd_mach_avr2},
+ {"at86rf401", AVR_ISA_2xxx, bfd_mach_avr2},
+ {"attiny13", AVR_ISA_TINY2, bfd_mach_avr2},
+ {"attiny2313", AVR_ISA_TINY2, bfd_mach_avr2},
+ {"attiny261", AVR_ISA_TINY2, bfd_mach_avr2},
+ {"attiny461", AVR_ISA_TINY2, bfd_mach_avr2},
+ {"attiny861", AVR_ISA_TINY2, bfd_mach_avr2},
+ {"attiny24", AVR_ISA_TINY2, bfd_mach_avr2},
+ {"attiny44", AVR_ISA_TINY2, bfd_mach_avr2},
+ {"attiny84", AVR_ISA_TINY2, bfd_mach_avr2},
+ {"attiny25", AVR_ISA_TINY2, bfd_mach_avr2},
+ {"attiny45", AVR_ISA_TINY2, bfd_mach_avr2},
+ {"attiny85", AVR_ISA_TINY2, bfd_mach_avr2},
+ {"atmega603", AVR_ISA_M603, bfd_mach_avr3}, /* XXX -> m103 */
+ {"atmega103", AVR_ISA_M103, bfd_mach_avr3},
+ {"at43usb320", AVR_ISA_M103, bfd_mach_avr3},
+ {"at43usb355", AVR_ISA_M603, bfd_mach_avr3},
+ {"at76c711", AVR_ISA_M603, bfd_mach_avr3},
+ {"atmega48", AVR_ISA_PWMx, bfd_mach_avr4},
+ {"atmega8", AVR_ISA_M8, bfd_mach_avr4},
+ {"atmega83", AVR_ISA_M8, bfd_mach_avr4}, /* XXX -> m8535 */
+ {"atmega85", AVR_ISA_M8, bfd_mach_avr4}, /* XXX -> m8 */
+ {"atmega88", AVR_ISA_PWMx, bfd_mach_avr4},
+ {"atmega8515", AVR_ISA_M8, bfd_mach_avr4},
+ {"atmega8535", AVR_ISA_M8, bfd_mach_avr4},
+ {"at90pwm2", AVR_ISA_PWMx, bfd_mach_avr4},
+ {"at90pwm3", AVR_ISA_PWMx, bfd_mach_avr4},
+ {"atmega16", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega161", AVR_ISA_M161, bfd_mach_avr5},
+ {"atmega162", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega163", AVR_ISA_M161, bfd_mach_avr5},
+ {"atmega164", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega165", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega168", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega169", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega32", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega323", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega324", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega325", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega329", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega3250", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega3290", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega406", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega64", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega640", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega644", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega128", AVR_ISA_M128, bfd_mach_avr5},
+ {"atmega1280", AVR_ISA_M128, bfd_mach_avr5},
+ {"atmega1281", AVR_ISA_M128, bfd_mach_avr5},
+ {"atmega645", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega649", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega6450", AVR_ISA_M323, bfd_mach_avr5},
+ {"atmega6490", AVR_ISA_M323, bfd_mach_avr5},
+ {"at90can32" , AVR_ISA_M323, bfd_mach_avr5},
+ {"at90can64" , AVR_ISA_M323, bfd_mach_avr5},
+ {"at90can128", AVR_ISA_M128, bfd_mach_avr5},
{"at90usb646", AVR_ISA_M323, bfd_mach_avr5},
{"at90usb647", AVR_ISA_M323, bfd_mach_avr5},
{"at90usb1286",AVR_ISA_M128, bfd_mach_avr5},
{"at90usb1287",AVR_ISA_M128, bfd_mach_avr5},
- {"at94k", AVR_ISA_94K, bfd_mach_avr5},
+ {"at94k", AVR_ISA_94K, bfd_mach_avr5},
+ {"atmega2560", AVR_ISA_ALL, bfd_mach_avr6},
+ {"atmega2561", AVR_ISA_ALL, bfd_mach_avr6},
{NULL, 0, 0}
};
@@ -512,7 +515,7 @@ avr_offset_expression (expressionS *exp)
if (exp->X_op == O_constant)
{
int x = exp->X_add_number;
-
+
if (x < -255 || x > 255)
as_warn (_("constant out of 8-bit range: %d"), x);
}
@@ -544,6 +547,8 @@ avr_ldi_expression (expressionS *exp)
char *tmp;
char op[8];
int mod;
+ int linker_stubs_should_be_generated = 0;
+
tmp = str;
str = extract_word (str, op, sizeof (op));
@@ -551,7 +556,7 @@ avr_ldi_expression (expressionS *exp)
if (op[0])
{
mod_index m;
-
+
m.ptr = hash_find (avr_mod_hash, op);
mod = m.index;
@@ -564,11 +569,14 @@ avr_ldi_expression (expressionS *exp)
if (*str == '(')
{
+ bfd_reloc_code_real_type reloc_to_return;
int neg_p = 0;
++str;
if (strncmp ("pm(", str, 3) == 0
+ || strncmp ("gs(",str,3) == 0
+ || strncmp ("-(gs(",str,5) == 0
|| strncmp ("-(pm(", str, 5) == 0)
{
if (HAVE_PM_P (mod))
@@ -579,6 +587,9 @@ avr_ldi_expression (expressionS *exp)
else
as_bad (_("illegal expression"));
+ if (str[0] == 'g' || str[2] == 'g')
+ linker_stubs_should_be_generated = 1;
+
if (*str == '-')
{
neg_p = 1;
@@ -610,7 +621,24 @@ avr_ldi_expression (expressionS *exp)
}
while (closes--);
- return neg_p ? EXP_MOD_NEG_RELOC (mod) : EXP_MOD_RELOC (mod);
+ reloc_to_return =
+ neg_p ? EXP_MOD_NEG_RELOC (mod) : EXP_MOD_RELOC (mod);
+ if (linker_stubs_should_be_generated)
+ {
+ switch (reloc_to_return)
+ {
+ case BFD_RELOC_AVR_LO8_LDI_PM:
+ reloc_to_return = BFD_RELOC_AVR_LO8_LDI_GS;
+ break;
+ case BFD_RELOC_AVR_HI8_LDI_PM:
+ reloc_to_return = BFD_RELOC_AVR_HI8_LDI_GS;
+ break;
+
+ default:
+ as_warn (_("expression dangerous with linker stubs"));
+ }
+ }
+ return reloc_to_return;
}
}
}
@@ -1227,7 +1255,7 @@ tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED,
return NULL;
}
- /* We are dealing with two symbols defined in the same section.
+ /* We are dealing with two symbols defined in the same section.
Let us fix-up them here. */
value += S_GET_VALUE (fixp->fx_addsy);
value -= S_GET_VALUE (fixp->fx_subsy);
@@ -1310,7 +1338,8 @@ md_assemble (char *str)
static int exp_mod_pm = 0;
/* Parse special CONS expression: pm (expression)
- which is used for addressing to a program memory.
+ or alternatively: gs (expression).
+ These are used for addressing program memory.
Relocation: BFD_RELOC_AVR_16_PM. */
void
@@ -1324,10 +1353,13 @@ avr_parse_cons_expression (expressionS *exp, int nbytes)
if (nbytes == 2)
{
- char *pm_name = "pm";
- int len = strlen (pm_name);
+ char *pm_name1 = "pm";
+ char *pm_name2 = "gs";
+ int len = strlen (pm_name1);
+ /* len must be the same for both pm identifiers. */
- if (strncasecmp (input_line_pointer, pm_name, len) == 0)
+ if (strncasecmp (input_line_pointer, pm_name1, len) == 0
+ || strncasecmp (input_line_pointer, pm_name2, len) == 0)
{
input_line_pointer = skip_space (input_line_pointer + len);