diff options
author | Nick Clifton <nickc@redhat.com> | 2006-05-24 07:36:12 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2006-05-24 07:36:12 +0000 |
commit | 28c9d252b48e5c262359910389f157de087060d6 (patch) | |
tree | 8a03a8b466f84f1857399df1447d6f74e5a1cd5e /gas/config | |
parent | f607ec8858a8ce6a1a821257d657db95ee47af2a (diff) | |
download | gdb-28c9d252b48e5c262359910389f157de087060d6.zip gdb-28c9d252b48e5c262359910389f157de087060d6.tar.gz gdb-28c9d252b48e5c262359910389f157de087060d6.tar.bz2 |
Add support for AVR6 family
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-avr.c | 206 | ||||
-rw-r--r-- | gas/config/tc-avr.h | 29 |
2 files changed, 136 insertions, 99 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); diff --git a/gas/config/tc-avr.h b/gas/config/tc-avr.h index b79fc05..0723519 100644 --- a/gas/config/tc-avr.h +++ b/gas/config/tc-avr.h @@ -125,16 +125,21 @@ extern long md_pcrel_from_section (struct fix *, segT); We will need them in case that we want to do linker relaxation. We could in principle keep these fixups in gas when not relaxing. However, there is no serious performance penilty when making the linker - make the fixup work. */ -#define TC_VALIDATE_FIX(FIXP,SEG,SKIP) \ - if ( (FIXP->fx_r_type == BFD_RELOC_AVR_7_PCREL \ - || FIXP->fx_r_type == BFD_RELOC_AVR_13_PCREL \ - || FIXP->fx_r_type == BFD_RELOC_AVR_LO8_LDI_PM \ - || FIXP->fx_r_type == BFD_RELOC_AVR_HI8_LDI_PM \ - || FIXP->fx_r_type == BFD_RELOC_AVR_HH8_LDI_PM \ - || FIXP->fx_r_type == BFD_RELOC_AVR_16_PM) \ - && (FIXP->fx_addsy)) \ - { \ - goto SKIP; \ + make the fixup work. Check also that fx_addsy is not NULL, in order to make + sure that the fixup refers to some sort of lable. */ +#define TC_VALIDATE_FIX(FIXP,SEG,SKIP) \ + if ( (FIXP->fx_r_type == BFD_RELOC_AVR_7_PCREL \ + || FIXP->fx_r_type == BFD_RELOC_AVR_13_PCREL \ + || FIXP->fx_r_type == BFD_RELOC_AVR_LO8_LDI_PM \ + || FIXP->fx_r_type == BFD_RELOC_AVR_LO8_LDI_GS \ + || FIXP->fx_r_type == BFD_RELOC_AVR_HI8_LDI_PM \ + || FIXP->fx_r_type == BFD_RELOC_AVR_HI8_LDI_GS \ + || FIXP->fx_r_type == BFD_RELOC_AVR_HH8_LDI_PM \ + || FIXP->fx_r_type == BFD_RELOC_AVR_LO8_LDI_PM_NEG \ + || FIXP->fx_r_type == BFD_RELOC_AVR_HI8_LDI_PM_NEG \ + || FIXP->fx_r_type == BFD_RELOC_AVR_HH8_LDI_PM_NEG \ + || FIXP->fx_r_type == BFD_RELOC_AVR_16_PM) \ + && (FIXP->fx_addsy)) \ + { \ + goto SKIP; \ } - |