* config/avr/avr.opt (mmcu=): Change to have a string value.
(mn-flash=, mskip-bug, march=, mrmw): New options.
(HeaderInclude): New.
(mmcu=): Remove Var / Init clauses.
* config/avr/avr.h (DRIVER_SELF_SPECS): Translate -mmcu into a
-specs option.
(SYMBOL_FLAG_IO, SYMBOL_FLAG_ADDRESS): Define.
(ASM_OUTPUT_ALIGNED_BSS): Use avr_asm_asm_output_aligned_bss.
(SYMBOL_FLAG_IO_LOW): Define.
(avr_device_to_as, avr_device_to_ld): Don't declare.
(avr_device_to_data_start, avr_device_to_startfiles): Likewise.
(avr_device_to_devicelib, avr_device_to_sp8): Likewise.
(EXTRA_SPEC_FUNCTIONS): Don't define.
(ASM_SPEC): Translate -arch= option to -mmcu= option.
(LINK_SPEC): Translate -arch= option to -m= option.
Don't use device_to_ld / device_to_data_start.
(STARTFILE_SPEC): Now empty.
(ASM_SPEC): Add -%{mrelax: --mlink-relax}.
* config/avr/gen-avr-mmcu-specs.c: New file.
* config/avr/t-avr (gen-avr-mmcu-specs$(build_exeext)): New rule.
(s-device-specs): Likewise.
(GCC_PASSES): Add s-device-specs.
(install-driver): Depend on install-device-specs.
(install-device-specs): New rule.
* config/avr/avr.c (avr_option_override): Look up mcu arch by
avr_arch_index and provide fallback initialization for avr_n_flash.
(varasm.h): #include.
(avr_print_operand) <i>: Allow SYMBOL_REF with SYMBOL_FLAG_IO;
(avr_handle_addr_attribute, avr_eval_addr_attrib): New functions.
(avr_attribute_table): Add "io", "address" and "io_low".
(avr_asm_output_aligned_decl_common): Change type of decl to tree.
Add special handling for symbols with "io" and/or "address" attributes.
(avr_asm_asm_output_aligned_bss): New function.
(avr_encode_section_info): Set SYMBOL_FLAG_IO and SYMBOL_FLAG_ADDRESS
as appropriate. Handle io_low attribute.
(avr_out_sbxx_branch): Handle symbolic io addresses.
(avr_xload_libgcc_p, avr_nonconst_pointer_addrspace): Use
avr_n_flash instead of avr_current_device->n_flash.
(avr_pgm_check_var_decl, avr_insert_attributes): Likewise.
(avr_emit_movmemhi): Likewise.
* config/avr/avr-c.c (avr_cpu_cpp_builtins): Likewise.
Use TARGET_RMW instead of avr_current_device->dev_attributes.
Don't define avr_current_device->macro (that's the specfile's job).
Use TARGET_SKIP_BUG instead of avr_current_device->errata_skip.
* config/avr/avr.c (avr_2word_insn_p): Likewise.
* config/avr/avr.md (*cpse.ne): Likewise.
(mov<mode>): Use avr_eval_addr_attrib.
(cbi): Change constraint for low_io_address_operand operand to "i".
(sbi, sbix_branch, sbix_branch_bit7, insv.io, insv.not.io): Likewise.
* config/avr/predicates.md (io_address_operand):
Allow SYMBOL_REF with SYMBOL_FLAG_IO.
(low_io_address_operand): Allow SYMBOL_REF with SYMBOL_FLAG_IO_LOW.
* config/avr/avr-protos.h (avr_asm_output_aligned_decl_common):
Update prototype.
(avr_eval_addr_attrib, avr_asm_asm_output_aligned_bss): Prototype.
* config/avr/genmultilib.awk: Use -march=.
Remove Multilib matches processing.
* config/avr/t-multilib, config/avr/avr-tables.opt: Regenerate.
* config/avr/avr-arch.h: Add double include guard.
(avr_mcu_t) <library_name>: Update comment.
* config/avr/driver-avr.c (avr_device_to_as): Delete.
(avr_device_to_ld, avr_device_to_data_start): Likewise.
(avr_device_to_startfiles, avr_device_to_devicelib): Likewise.
(avr_device_to_sp8): Likewise.
* config/avr/genopt.sh: Instead avr_mcu, emit an Enum for avr_arch.
* doc/extend.texi (io, address): Document new AVR variable attributes.
(io_low): Likewise.
From-SVN: r216034
+2014-10-09 Joern Rennecke <joern.rennecke@embecosm.com>
+
+ * config/avr/avr.opt (mmcu=): Change to have a string value.
+ (mn-flash=, mskip-bug, march=, mrmw): New options.
+ (HeaderInclude): New.
+ (mmcu=): Remove Var / Init clauses.
+ * config/avr/avr.h (DRIVER_SELF_SPECS): Translate -mmcu into a
+ -specs option.
+ (SYMBOL_FLAG_IO, SYMBOL_FLAG_ADDRESS): Define.
+ (ASM_OUTPUT_ALIGNED_BSS): Use avr_asm_asm_output_aligned_bss.
+ (SYMBOL_FLAG_IO_LOW): Define.
+ (avr_device_to_as, avr_device_to_ld): Don't declare.
+ (avr_device_to_data_start, avr_device_to_startfiles): Likewise.
+ (avr_device_to_devicelib, avr_device_to_sp8): Likewise.
+ (EXTRA_SPEC_FUNCTIONS): Don't define.
+ (ASM_SPEC): Translate -arch= option to -mmcu= option.
+ (LINK_SPEC): Translate -arch= option to -m= option.
+ Don't use device_to_ld / device_to_data_start.
+ (STARTFILE_SPEC): Now empty.
+ (ASM_SPEC): Add -%{mrelax: --mlink-relax}.
+ * config/avr/gen-avr-mmcu-specs.c: New file.
+ * config/avr/t-avr (gen-avr-mmcu-specs$(build_exeext)): New rule.
+ (s-device-specs): Likewise.
+ (GCC_PASSES): Add s-device-specs.
+ (install-driver): Depend on install-device-specs.
+ (install-device-specs): New rule.
+ * config/avr/avr.c (avr_option_override): Look up mcu arch by
+ avr_arch_index and provide fallback initialization for avr_n_flash.
+ (varasm.h): #include.
+ (avr_print_operand) <i>: Allow SYMBOL_REF with SYMBOL_FLAG_IO;
+ (avr_handle_addr_attribute, avr_eval_addr_attrib): New functions.
+ (avr_attribute_table): Add "io", "address" and "io_low".
+ (avr_asm_output_aligned_decl_common): Change type of decl to tree.
+ Add special handling for symbols with "io" and/or "address" attributes.
+ (avr_asm_asm_output_aligned_bss): New function.
+ (avr_encode_section_info): Set SYMBOL_FLAG_IO and SYMBOL_FLAG_ADDRESS
+ as appropriate. Handle io_low attribute.
+ (avr_out_sbxx_branch): Handle symbolic io addresses.
+ (avr_xload_libgcc_p, avr_nonconst_pointer_addrspace): Use
+ avr_n_flash instead of avr_current_device->n_flash.
+ (avr_pgm_check_var_decl, avr_insert_attributes): Likewise.
+ (avr_emit_movmemhi): Likewise.
+ * config/avr/avr-c.c (avr_cpu_cpp_builtins): Likewise.
+ Use TARGET_RMW instead of avr_current_device->dev_attributes.
+ Don't define avr_current_device->macro (that's the specfile's job).
+ Use TARGET_SKIP_BUG instead of avr_current_device->errata_skip.
+ * config/avr/avr.c (avr_2word_insn_p): Likewise.
+ * config/avr/avr.md (*cpse.ne): Likewise.
+ (mov<mode>): Use avr_eval_addr_attrib.
+ (cbi): Change constraint for low_io_address_operand operand to "i".
+ (sbi, sbix_branch, sbix_branch_bit7, insv.io, insv.not.io): Likewise.
+ * config/avr/predicates.md (io_address_operand):
+ Allow SYMBOL_REF with SYMBOL_FLAG_IO.
+ (low_io_address_operand): Allow SYMBOL_REF with SYMBOL_FLAG_IO_LOW.
+ * config/avr/avr-protos.h (avr_asm_output_aligned_decl_common):
+ Update prototype.
+ (avr_eval_addr_attrib, avr_asm_asm_output_aligned_bss): Prototype.
+ * config/avr/genmultilib.awk: Use -march=.
+ Remove Multilib matches processing.
+ * config/avr/t-multilib, config/avr/avr-tables.opt: Regenerate.
+ * config/avr/avr-arch.h: Add double include guard.
+ (avr_mcu_t) <library_name>: Update comment.
+ * config/avr/driver-avr.c (avr_device_to_as): Delete.
+ (avr_device_to_ld, avr_device_to_data_start): Likewise.
+ (avr_device_to_startfiles, avr_device_to_devicelib): Likewise.
+ (avr_device_to_sp8): Likewise.
+ * config/avr/genopt.sh: Instead avr_mcu, emit an Enum for avr_arch.
+
+ * doc/extend.texi (io, address): Document new AVR variable attributes.
+ (io_low): Likewise.
+
2014-10-09 Marek Polacek <polacek@redhat.com>
* doc/invoke.texi: Document -fsanitize=bool and -fsanitize=enum.
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
+#ifndef AVR_ARCH_H
+#define AVR_ARCH_H
/* This enum supplies indices into the avr_arch_types[] table below. */
/* Number of 64k segments in the flash. */
int n_flash;
- /* Name of device library. */
+ /* Old name of device library. */
const char *const library_name;
} avr_mcu_t;
extern const avr_mcu_t avr_mcu_types[];
extern const avr_mcu_t *avr_current_device;
+
+#endif /* AVR_ARCH_H */
if (avr_current_arch->macro)
cpp_define_formatted (pfile, "__AVR_ARCH__=%s", avr_current_arch->macro);
- if (avr_current_device->macro)
- {
- cpp_define (pfile, avr_current_device->macro);
- cpp_define_formatted (pfile, "__AVR_DEVICE_NAME__=%s",
- avr_current_device->name);
- }
if (AVR_HAVE_RAMPD) cpp_define (pfile, "__AVR_HAVE_RAMPD__");
if (AVR_HAVE_RAMPX) cpp_define (pfile, "__AVR_HAVE_RAMPX__");
if (AVR_HAVE_RAMPY) cpp_define (pfile, "__AVR_HAVE_RAMPY__");
if (TARGET_NO_INTERRUPTS)
cpp_define (pfile, "__NO_INTERRUPTS__");
- if (avr_current_device->dev_attribute & AVR_ERRATA_SKIP)
+ if (TARGET_SKIP_BUG)
{
cpp_define (pfile, "__AVR_ERRATA_SKIP__");
cpp_define (pfile, "__AVR_ERRATA_SKIP_JMP_CALL__");
}
- if (avr_current_device->dev_attribute & AVR_ISA_RMW)
+ if (TARGET_RMW)
cpp_define (pfile, "__AVR_ISA_RMW__");
cpp_define_formatted (pfile, "__AVR_SFR_OFFSET__=0x%x",
/* Only supply __FLASH<n> macro if the address space is reasonable
for this target. The address space qualifier itself is still
supported, but using it will throw an error. */
- && avr_addrspace[i].segment < avr_current_device->n_flash)
+ && avr_addrspace[i].segment < avr_n_flash)
{
const char *name = avr_addrspace[i].name;
char *Name = (char*) alloca (1 + strlen (name));
extern void avr_init_expanders (void);
#ifdef TREE_CODE
-extern void avr_asm_output_aligned_decl_common (FILE*, const_tree, const char*, unsigned HOST_WIDE_INT, unsigned int, bool);
+extern void avr_asm_output_aligned_decl_common (FILE*, tree, const char*, unsigned HOST_WIDE_INT, unsigned int, bool);
+extern void avr_asm_asm_output_aligned_bss (FILE *, tree, const char *, unsigned HOST_WIDE_INT, int, void (*) (FILE *, tree, const char *, unsigned HOST_WIDE_INT, int));
extern void asm_output_external (FILE *file, tree decl, char *name);
extern int avr_progmem_p (tree decl, tree attributes);
extern bool avr_mem_memx_p (rtx);
extern bool avr_load_libgcc_p (rtx);
extern bool avr_xload_libgcc_p (enum machine_mode);
+extern rtx avr_eval_addr_attrib (rtx x);
extern rtx lpm_reg_rtx;
extern rtx lpm_addr_reg_rtx;
; <http://www.gnu.org/licenses/>.
Enum
-Name(avr_mcu) Type(int)
-Known MCU names:
+Name(avr_arch) Type(enum avr_arch)
+Known MCU architectures:
EnumValue
-Enum(avr_mcu) String(avr2) Value(0)
+Enum(avr_arch) String(avr2) Value(ARCH_AVR2)
EnumValue
-Enum(avr_mcu) String(at90s2313) Value(1)
+Enum(avr_arch) String(avr25) Value(ARCH_AVR25)
EnumValue
-Enum(avr_mcu) String(at90s2323) Value(2)
+Enum(avr_arch) String(avr3) Value(ARCH_AVR3)
EnumValue
-Enum(avr_mcu) String(at90s2333) Value(3)
+Enum(avr_arch) String(avr31) Value(ARCH_AVR31)
EnumValue
-Enum(avr_mcu) String(at90s2343) Value(4)
+Enum(avr_arch) String(avr35) Value(ARCH_AVR35)
EnumValue
-Enum(avr_mcu) String(attiny22) Value(5)
+Enum(avr_arch) String(avr4) Value(ARCH_AVR4)
EnumValue
-Enum(avr_mcu) String(attiny26) Value(6)
+Enum(avr_arch) String(avr5) Value(ARCH_AVR5)
EnumValue
-Enum(avr_mcu) String(at90s4414) Value(7)
+Enum(avr_arch) String(avr51) Value(ARCH_AVR51)
EnumValue
-Enum(avr_mcu) String(at90s4433) Value(8)
+Enum(avr_arch) String(avr6) Value(ARCH_AVR6)
EnumValue
-Enum(avr_mcu) String(at90s4434) Value(9)
+Enum(avr_arch) String(avrxmega2) Value(ARCH_AVRXMEGA2)
EnumValue
-Enum(avr_mcu) String(at90s8515) Value(10)
+Enum(avr_arch) String(avrxmega4) Value(ARCH_AVRXMEGA4)
EnumValue
-Enum(avr_mcu) String(at90c8534) Value(11)
+Enum(avr_arch) String(avrxmega5) Value(ARCH_AVRXMEGA5)
EnumValue
-Enum(avr_mcu) String(at90s8535) Value(12)
+Enum(avr_arch) String(avrxmega6) Value(ARCH_AVRXMEGA6)
EnumValue
-Enum(avr_mcu) String(avr25) Value(13)
+Enum(avr_arch) String(avrxmega7) Value(ARCH_AVRXMEGA7)
EnumValue
-Enum(avr_mcu) String(ata5272) Value(14)
-
-EnumValue
-Enum(avr_mcu) String(ata6616c) Value(15)
-
-EnumValue
-Enum(avr_mcu) String(attiny13) Value(16)
-
-EnumValue
-Enum(avr_mcu) String(attiny13a) Value(17)
-
-EnumValue
-Enum(avr_mcu) String(attiny2313) Value(18)
-
-EnumValue
-Enum(avr_mcu) String(attiny2313a) Value(19)
-
-EnumValue
-Enum(avr_mcu) String(attiny24) Value(20)
-
-EnumValue
-Enum(avr_mcu) String(attiny24a) Value(21)
-
-EnumValue
-Enum(avr_mcu) String(attiny4313) Value(22)
-
-EnumValue
-Enum(avr_mcu) String(attiny44) Value(23)
-
-EnumValue
-Enum(avr_mcu) String(attiny44a) Value(24)
-
-EnumValue
-Enum(avr_mcu) String(attiny441) Value(25)
-
-EnumValue
-Enum(avr_mcu) String(attiny84) Value(26)
-
-EnumValue
-Enum(avr_mcu) String(attiny84a) Value(27)
-
-EnumValue
-Enum(avr_mcu) String(attiny25) Value(28)
-
-EnumValue
-Enum(avr_mcu) String(attiny45) Value(29)
-
-EnumValue
-Enum(avr_mcu) String(attiny85) Value(30)
-
-EnumValue
-Enum(avr_mcu) String(attiny261) Value(31)
-
-EnumValue
-Enum(avr_mcu) String(attiny261a) Value(32)
-
-EnumValue
-Enum(avr_mcu) String(attiny461) Value(33)
-
-EnumValue
-Enum(avr_mcu) String(attiny461a) Value(34)
-
-EnumValue
-Enum(avr_mcu) String(attiny861) Value(35)
-
-EnumValue
-Enum(avr_mcu) String(attiny861a) Value(36)
-
-EnumValue
-Enum(avr_mcu) String(attiny43u) Value(37)
-
-EnumValue
-Enum(avr_mcu) String(attiny87) Value(38)
-
-EnumValue
-Enum(avr_mcu) String(attiny48) Value(39)
-
-EnumValue
-Enum(avr_mcu) String(attiny88) Value(40)
-
-EnumValue
-Enum(avr_mcu) String(attiny828) Value(41)
-
-EnumValue
-Enum(avr_mcu) String(attiny841) Value(42)
-
-EnumValue
-Enum(avr_mcu) String(at86rf401) Value(43)
-
-EnumValue
-Enum(avr_mcu) String(avr3) Value(44)
-
-EnumValue
-Enum(avr_mcu) String(at43usb355) Value(45)
-
-EnumValue
-Enum(avr_mcu) String(at76c711) Value(46)
-
-EnumValue
-Enum(avr_mcu) String(avr31) Value(47)
-
-EnumValue
-Enum(avr_mcu) String(atmega103) Value(48)
-
-EnumValue
-Enum(avr_mcu) String(at43usb320) Value(49)
-
-EnumValue
-Enum(avr_mcu) String(avr35) Value(50)
-
-EnumValue
-Enum(avr_mcu) String(ata5505) Value(51)
-
-EnumValue
-Enum(avr_mcu) String(ata6617c) Value(52)
-
-EnumValue
-Enum(avr_mcu) String(ata664251) Value(53)
-
-EnumValue
-Enum(avr_mcu) String(at90usb82) Value(54)
-
-EnumValue
-Enum(avr_mcu) String(at90usb162) Value(55)
-
-EnumValue
-Enum(avr_mcu) String(atmega8u2) Value(56)
-
-EnumValue
-Enum(avr_mcu) String(atmega16u2) Value(57)
-
-EnumValue
-Enum(avr_mcu) String(atmega32u2) Value(58)
-
-EnumValue
-Enum(avr_mcu) String(attiny167) Value(59)
-
-EnumValue
-Enum(avr_mcu) String(attiny1634) Value(60)
-
-EnumValue
-Enum(avr_mcu) String(avr4) Value(61)
-
-EnumValue
-Enum(avr_mcu) String(ata6285) Value(62)
-
-EnumValue
-Enum(avr_mcu) String(ata6286) Value(63)
-
-EnumValue
-Enum(avr_mcu) String(ata6289) Value(64)
-
-EnumValue
-Enum(avr_mcu) String(ata6612c) Value(65)
-
-EnumValue
-Enum(avr_mcu) String(atmega8) Value(66)
-
-EnumValue
-Enum(avr_mcu) String(atmega8a) Value(67)
-
-EnumValue
-Enum(avr_mcu) String(atmega48) Value(68)
-
-EnumValue
-Enum(avr_mcu) String(atmega48a) Value(69)
-
-EnumValue
-Enum(avr_mcu) String(atmega48p) Value(70)
-
-EnumValue
-Enum(avr_mcu) String(atmega48pa) Value(71)
-
-EnumValue
-Enum(avr_mcu) String(atmega88) Value(72)
-
-EnumValue
-Enum(avr_mcu) String(atmega88a) Value(73)
-
-EnumValue
-Enum(avr_mcu) String(atmega88p) Value(74)
-
-EnumValue
-Enum(avr_mcu) String(atmega88pa) Value(75)
-
-EnumValue
-Enum(avr_mcu) String(atmega8515) Value(76)
-
-EnumValue
-Enum(avr_mcu) String(atmega8535) Value(77)
-
-EnumValue
-Enum(avr_mcu) String(atmega8hva) Value(78)
-
-EnumValue
-Enum(avr_mcu) String(at90pwm1) Value(79)
-
-EnumValue
-Enum(avr_mcu) String(at90pwm2) Value(80)
-
-EnumValue
-Enum(avr_mcu) String(at90pwm2b) Value(81)
-
-EnumValue
-Enum(avr_mcu) String(at90pwm3) Value(82)
-
-EnumValue
-Enum(avr_mcu) String(at90pwm3b) Value(83)
-
-EnumValue
-Enum(avr_mcu) String(at90pwm81) Value(84)
-
-EnumValue
-Enum(avr_mcu) String(avr5) Value(85)
-
-EnumValue
-Enum(avr_mcu) String(ata5702m322) Value(86)
-
-EnumValue
-Enum(avr_mcu) String(ata5782) Value(87)
-
-EnumValue
-Enum(avr_mcu) String(ata5790) Value(88)
-
-EnumValue
-Enum(avr_mcu) String(ata5790n) Value(89)
-
-EnumValue
-Enum(avr_mcu) String(ata5795) Value(90)
-
-EnumValue
-Enum(avr_mcu) String(ata5831) Value(91)
-
-EnumValue
-Enum(avr_mcu) String(ata6613c) Value(92)
-
-EnumValue
-Enum(avr_mcu) String(ata6614q) Value(93)
-
-EnumValue
-Enum(avr_mcu) String(atmega16) Value(94)
-
-EnumValue
-Enum(avr_mcu) String(atmega16a) Value(95)
-
-EnumValue
-Enum(avr_mcu) String(atmega161) Value(96)
-
-EnumValue
-Enum(avr_mcu) String(atmega162) Value(97)
-
-EnumValue
-Enum(avr_mcu) String(atmega163) Value(98)
-
-EnumValue
-Enum(avr_mcu) String(atmega164a) Value(99)
-
-EnumValue
-Enum(avr_mcu) String(atmega164p) Value(100)
-
-EnumValue
-Enum(avr_mcu) String(atmega164pa) Value(101)
-
-EnumValue
-Enum(avr_mcu) String(atmega165) Value(102)
-
-EnumValue
-Enum(avr_mcu) String(atmega165a) Value(103)
-
-EnumValue
-Enum(avr_mcu) String(atmega165p) Value(104)
-
-EnumValue
-Enum(avr_mcu) String(atmega165pa) Value(105)
-
-EnumValue
-Enum(avr_mcu) String(atmega168) Value(106)
-
-EnumValue
-Enum(avr_mcu) String(atmega168a) Value(107)
-
-EnumValue
-Enum(avr_mcu) String(atmega168p) Value(108)
-
-EnumValue
-Enum(avr_mcu) String(atmega168pa) Value(109)
-
-EnumValue
-Enum(avr_mcu) String(atmega169) Value(110)
-
-EnumValue
-Enum(avr_mcu) String(atmega169a) Value(111)
-
-EnumValue
-Enum(avr_mcu) String(atmega169p) Value(112)
-
-EnumValue
-Enum(avr_mcu) String(atmega169pa) Value(113)
-
-EnumValue
-Enum(avr_mcu) String(atmega16hvb) Value(114)
-
-EnumValue
-Enum(avr_mcu) String(atmega16hvbrevb) Value(115)
-
-EnumValue
-Enum(avr_mcu) String(atmega16m1) Value(116)
-
-EnumValue
-Enum(avr_mcu) String(atmega16u4) Value(117)
-
-EnumValue
-Enum(avr_mcu) String(atmega32a) Value(118)
-
-EnumValue
-Enum(avr_mcu) String(atmega32) Value(119)
-
-EnumValue
-Enum(avr_mcu) String(atmega323) Value(120)
-
-EnumValue
-Enum(avr_mcu) String(atmega324a) Value(121)
-
-EnumValue
-Enum(avr_mcu) String(atmega324p) Value(122)
-
-EnumValue
-Enum(avr_mcu) String(atmega324pa) Value(123)
-
-EnumValue
-Enum(avr_mcu) String(atmega325) Value(124)
-
-EnumValue
-Enum(avr_mcu) String(atmega325a) Value(125)
-
-EnumValue
-Enum(avr_mcu) String(atmega325p) Value(126)
-
-EnumValue
-Enum(avr_mcu) String(atmega325pa) Value(127)
-
-EnumValue
-Enum(avr_mcu) String(atmega3250) Value(128)
-
-EnumValue
-Enum(avr_mcu) String(atmega3250a) Value(129)
-
-EnumValue
-Enum(avr_mcu) String(atmega3250p) Value(130)
-
-EnumValue
-Enum(avr_mcu) String(atmega3250pa) Value(131)
-
-EnumValue
-Enum(avr_mcu) String(atmega328) Value(132)
-
-EnumValue
-Enum(avr_mcu) String(atmega328p) Value(133)
-
-EnumValue
-Enum(avr_mcu) String(atmega329) Value(134)
-
-EnumValue
-Enum(avr_mcu) String(atmega329a) Value(135)
-
-EnumValue
-Enum(avr_mcu) String(atmega329p) Value(136)
-
-EnumValue
-Enum(avr_mcu) String(atmega329pa) Value(137)
-
-EnumValue
-Enum(avr_mcu) String(atmega3290) Value(138)
-
-EnumValue
-Enum(avr_mcu) String(atmega3290a) Value(139)
-
-EnumValue
-Enum(avr_mcu) String(atmega3290p) Value(140)
-
-EnumValue
-Enum(avr_mcu) String(atmega3290pa) Value(141)
-
-EnumValue
-Enum(avr_mcu) String(atmega32c1) Value(142)
-
-EnumValue
-Enum(avr_mcu) String(atmega32m1) Value(143)
-
-EnumValue
-Enum(avr_mcu) String(atmega32u4) Value(144)
-
-EnumValue
-Enum(avr_mcu) String(atmega32u6) Value(145)
-
-EnumValue
-Enum(avr_mcu) String(atmega406) Value(146)
-
-EnumValue
-Enum(avr_mcu) String(atmega64) Value(147)
-
-EnumValue
-Enum(avr_mcu) String(atmega64a) Value(148)
-
-EnumValue
-Enum(avr_mcu) String(atmega640) Value(149)
-
-EnumValue
-Enum(avr_mcu) String(atmega644) Value(150)
-
-EnumValue
-Enum(avr_mcu) String(atmega644a) Value(151)
-
-EnumValue
-Enum(avr_mcu) String(atmega644p) Value(152)
-
-EnumValue
-Enum(avr_mcu) String(atmega644pa) Value(153)
-
-EnumValue
-Enum(avr_mcu) String(atmega645) Value(154)
-
-EnumValue
-Enum(avr_mcu) String(atmega645a) Value(155)
-
-EnumValue
-Enum(avr_mcu) String(atmega645p) Value(156)
-
-EnumValue
-Enum(avr_mcu) String(atmega6450) Value(157)
-
-EnumValue
-Enum(avr_mcu) String(atmega6450a) Value(158)
-
-EnumValue
-Enum(avr_mcu) String(atmega6450p) Value(159)
-
-EnumValue
-Enum(avr_mcu) String(atmega649) Value(160)
-
-EnumValue
-Enum(avr_mcu) String(atmega649a) Value(161)
-
-EnumValue
-Enum(avr_mcu) String(atmega649p) Value(162)
-
-EnumValue
-Enum(avr_mcu) String(atmega6490) Value(163)
-
-EnumValue
-Enum(avr_mcu) String(atmega16hva) Value(164)
-
-EnumValue
-Enum(avr_mcu) String(atmega16hva2) Value(165)
-
-EnumValue
-Enum(avr_mcu) String(atmega32hvb) Value(166)
-
-EnumValue
-Enum(avr_mcu) String(atmega6490a) Value(167)
-
-EnumValue
-Enum(avr_mcu) String(atmega6490p) Value(168)
-
-EnumValue
-Enum(avr_mcu) String(atmega64c1) Value(169)
-
-EnumValue
-Enum(avr_mcu) String(atmega64m1) Value(170)
-
-EnumValue
-Enum(avr_mcu) String(atmega64hve) Value(171)
-
-EnumValue
-Enum(avr_mcu) String(atmega64hve2) Value(172)
-
-EnumValue
-Enum(avr_mcu) String(atmega64rfr2) Value(173)
-
-EnumValue
-Enum(avr_mcu) String(atmega644rfr2) Value(174)
-
-EnumValue
-Enum(avr_mcu) String(atmega32hvbrevb) Value(175)
-
-EnumValue
-Enum(avr_mcu) String(at90can32) Value(176)
-
-EnumValue
-Enum(avr_mcu) String(at90can64) Value(177)
-
-EnumValue
-Enum(avr_mcu) String(at90pwm161) Value(178)
-
-EnumValue
-Enum(avr_mcu) String(at90pwm216) Value(179)
-
-EnumValue
-Enum(avr_mcu) String(at90pwm316) Value(180)
-
-EnumValue
-Enum(avr_mcu) String(at90scr100) Value(181)
-
-EnumValue
-Enum(avr_mcu) String(at90usb646) Value(182)
-
-EnumValue
-Enum(avr_mcu) String(at90usb647) Value(183)
-
-EnumValue
-Enum(avr_mcu) String(at94k) Value(184)
-
-EnumValue
-Enum(avr_mcu) String(m3000) Value(185)
-
-EnumValue
-Enum(avr_mcu) String(avr51) Value(186)
-
-EnumValue
-Enum(avr_mcu) String(atmega128) Value(187)
-
-EnumValue
-Enum(avr_mcu) String(atmega128a) Value(188)
-
-EnumValue
-Enum(avr_mcu) String(atmega1280) Value(189)
-
-EnumValue
-Enum(avr_mcu) String(atmega1281) Value(190)
-
-EnumValue
-Enum(avr_mcu) String(atmega1284) Value(191)
-
-EnumValue
-Enum(avr_mcu) String(atmega1284p) Value(192)
-
-EnumValue
-Enum(avr_mcu) String(atmega128rfa1) Value(193)
-
-EnumValue
-Enum(avr_mcu) String(atmega128rfr2) Value(194)
-
-EnumValue
-Enum(avr_mcu) String(atmega1284rfr2) Value(195)
-
-EnumValue
-Enum(avr_mcu) String(at90can128) Value(196)
-
-EnumValue
-Enum(avr_mcu) String(at90usb1286) Value(197)
-
-EnumValue
-Enum(avr_mcu) String(at90usb1287) Value(198)
-
-EnumValue
-Enum(avr_mcu) String(avr6) Value(199)
-
-EnumValue
-Enum(avr_mcu) String(atmega2560) Value(200)
-
-EnumValue
-Enum(avr_mcu) String(atmega2561) Value(201)
-
-EnumValue
-Enum(avr_mcu) String(atmega256rfr2) Value(202)
-
-EnumValue
-Enum(avr_mcu) String(atmega2564rfr2) Value(203)
-
-EnumValue
-Enum(avr_mcu) String(avrxmega2) Value(204)
-
-EnumValue
-Enum(avr_mcu) String(atxmega8e5) Value(205)
-
-EnumValue
-Enum(avr_mcu) String(atxmega16a4) Value(206)
-
-EnumValue
-Enum(avr_mcu) String(atxmega16d4) Value(207)
-
-EnumValue
-Enum(avr_mcu) String(atxmega16e5) Value(208)
-
-EnumValue
-Enum(avr_mcu) String(atxmega32a4) Value(209)
-
-EnumValue
-Enum(avr_mcu) String(atxmega32c3) Value(210)
-
-EnumValue
-Enum(avr_mcu) String(atxmega32d3) Value(211)
-
-EnumValue
-Enum(avr_mcu) String(atxmega32d4) Value(212)
-
-EnumValue
-Enum(avr_mcu) String(atxmega16a4u) Value(213)
-
-EnumValue
-Enum(avr_mcu) String(atxmega16c4) Value(214)
-
-EnumValue
-Enum(avr_mcu) String(atxmega32a4u) Value(215)
-
-EnumValue
-Enum(avr_mcu) String(atxmega32c4) Value(216)
-
-EnumValue
-Enum(avr_mcu) String(atxmega32e5) Value(217)
-
-EnumValue
-Enum(avr_mcu) String(avrxmega4) Value(218)
-
-EnumValue
-Enum(avr_mcu) String(atxmega64a3) Value(219)
-
-EnumValue
-Enum(avr_mcu) String(atxmega64d3) Value(220)
-
-EnumValue
-Enum(avr_mcu) String(atxmega64a3u) Value(221)
-
-EnumValue
-Enum(avr_mcu) String(atxmega64a4u) Value(222)
-
-EnumValue
-Enum(avr_mcu) String(atxmega64b1) Value(223)
-
-EnumValue
-Enum(avr_mcu) String(atxmega64b3) Value(224)
-
-EnumValue
-Enum(avr_mcu) String(atxmega64c3) Value(225)
-
-EnumValue
-Enum(avr_mcu) String(atxmega64d4) Value(226)
-
-EnumValue
-Enum(avr_mcu) String(avrxmega5) Value(227)
-
-EnumValue
-Enum(avr_mcu) String(atxmega64a1) Value(228)
-
-EnumValue
-Enum(avr_mcu) String(atxmega64a1u) Value(229)
-
-EnumValue
-Enum(avr_mcu) String(avrxmega6) Value(230)
-
-EnumValue
-Enum(avr_mcu) String(atxmega128a3) Value(231)
-
-EnumValue
-Enum(avr_mcu) String(atxmega128d3) Value(232)
-
-EnumValue
-Enum(avr_mcu) String(atxmega192a3) Value(233)
-
-EnumValue
-Enum(avr_mcu) String(atxmega192d3) Value(234)
-
-EnumValue
-Enum(avr_mcu) String(atxmega256a3) Value(235)
-
-EnumValue
-Enum(avr_mcu) String(atxmega256a3b) Value(236)
-
-EnumValue
-Enum(avr_mcu) String(atxmega256a3bu) Value(237)
-
-EnumValue
-Enum(avr_mcu) String(atxmega256d3) Value(238)
-
-EnumValue
-Enum(avr_mcu) String(atxmega128a3u) Value(239)
-
-EnumValue
-Enum(avr_mcu) String(atxmega128b1) Value(240)
-
-EnumValue
-Enum(avr_mcu) String(atxmega128b3) Value(241)
-
-EnumValue
-Enum(avr_mcu) String(atxmega128c3) Value(242)
-
-EnumValue
-Enum(avr_mcu) String(atxmega128d4) Value(243)
-
-EnumValue
-Enum(avr_mcu) String(atxmega192a3u) Value(244)
-
-EnumValue
-Enum(avr_mcu) String(atxmega192c3) Value(245)
-
-EnumValue
-Enum(avr_mcu) String(atxmega256a3u) Value(246)
-
-EnumValue
-Enum(avr_mcu) String(atxmega256c3) Value(247)
-
-EnumValue
-Enum(avr_mcu) String(atxmega384c3) Value(248)
-
-EnumValue
-Enum(avr_mcu) String(atxmega384d3) Value(249)
-
-EnumValue
-Enum(avr_mcu) String(avrxmega7) Value(250)
-
-EnumValue
-Enum(avr_mcu) String(atxmega128a1) Value(251)
-
-EnumValue
-Enum(avr_mcu) String(atxmega128a1u) Value(252)
-
-EnumValue
-Enum(avr_mcu) String(atxmega128a4u) Value(253)
-
-EnumValue
-Enum(avr_mcu) String(avr1) Value(254)
-
-EnumValue
-Enum(avr_mcu) String(at90s1200) Value(255)
-
-EnumValue
-Enum(avr_mcu) String(attiny11) Value(256)
-
-EnumValue
-Enum(avr_mcu) String(attiny12) Value(257)
-
-EnumValue
-Enum(avr_mcu) String(attiny15) Value(258)
-
-EnumValue
-Enum(avr_mcu) String(attiny28) Value(259)
+Enum(avr_arch) String(avr1) Value(ARCH_AVR1)
#include "flags.h"
#include "reload.h"
#include "tree.h"
+#include "varasm.h"
#include "print-tree.h"
#include "calls.h"
#include "stor-layout.h"
if (flag_pie == 2)
warning (OPT_fPIE, "-fPIE is not supported");
- avr_current_device = &avr_mcu_types[avr_mcu_index];
- avr_current_arch = &avr_arch_types[avr_current_device->arch];
+ /* Search for mcu arch.
+ ??? We should probably just put the architecture-default device
+ settings in the architecture struct and remove any notion of a current
+ device from gcc. */
+
+ for (avr_current_device = avr_mcu_types; ; avr_current_device++)
+ {
+ if (!avr_current_device->name)
+ fatal_error ("mcu not found");
+ if (!avr_current_device->macro
+ && avr_current_device->arch == avr_arch_index)
+ break;
+ }
+
+ avr_current_arch = &avr_arch_types[avr_arch_index];
+ if (avr_n_flash < 0)
+ avr_n_flash = avr_current_device->n_flash;
/* RAM addresses of some SFRs common to all devices in respective arch. */
}
else if (code == 'i')
{
- fatal_insn ("bad address, not an I/O address:", x);
+ if (GET_CODE (x) == SYMBOL_REF && (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_IO))
+ avr_print_operand_address
+ (file, plus_constant (HImode, x, -avr_current_arch->sfr_offset));
+ else
+ fatal_insn ("bad address, not an I/O address:", x);
}
else if (code == 'x')
{
int n_bytes = GET_MODE_SIZE (mode);
return (n_bytes > 1
- || avr_current_device->n_flash > 1);
+ || avr_n_flash > 1);
}
return NULL_TREE;
}
+static tree
+avr_handle_addr_attribute (tree *node, tree name, tree args,
+ int flags ATTRIBUTE_UNUSED, bool *no_add)
+{
+ bool io_p = (strncmp (IDENTIFIER_POINTER (name), "io", 2) == 0);
+ location_t loc = DECL_SOURCE_LOCATION (*node);
+
+ if (TREE_CODE (*node) != VAR_DECL)
+ {
+ warning_at (loc, 0, "%qE attribute only applies to variables", name);
+ *no_add = true;
+ }
+
+ if (args != NULL_TREE)
+ {
+ if (TREE_CODE (TREE_VALUE (args)) == NON_LVALUE_EXPR)
+ TREE_VALUE (args) = TREE_OPERAND (TREE_VALUE (args), 0);
+ tree arg = TREE_VALUE (args);
+ if (TREE_CODE (arg) != INTEGER_CST)
+ {
+ warning (0, "%qE attribute allows only an integer constant argument",
+ name);
+ *no_add = true;
+ }
+ else if (io_p
+ && (!tree_fits_shwi_p (arg)
+ || !(strcmp (IDENTIFIER_POINTER (name), "io_low") == 0
+ ? low_io_address_operand : io_address_operand)
+ (GEN_INT (TREE_INT_CST_LOW (arg)), QImode)))
+ {
+ warning_at (loc, 0, "%qE attribute address out of range", name);
+ *no_add = true;
+ }
+ else
+ {
+ tree attribs = DECL_ATTRIBUTES (*node);
+ const char *names[] = { "io", "io_low", "address", NULL } ;
+ for (const char **p = names; *p; p++)
+ {
+ tree other = lookup_attribute (*p, attribs);
+ if (other && TREE_VALUE (other))
+ {
+ warning_at (loc, 0,
+ "both %s and %qE attribute provide address",
+ *p, name);
+ *no_add = true;
+ break;
+ }
+ }
+ }
+ }
+
+ if (*no_add == false && io_p && !TREE_THIS_VOLATILE (*node))
+ warning_at (loc, 0, "%qE attribute on non-volatile variable", name);
+
+ return NULL_TREE;
+}
+
+rtx
+avr_eval_addr_attrib (rtx x)
+{
+ if (GET_CODE (x) == SYMBOL_REF
+ && (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_ADDRESS))
+ {
+ tree decl = SYMBOL_REF_DECL (x);
+ tree attr = NULL_TREE;
+
+ if (SYMBOL_REF_FLAGS (x) & SYMBOL_FLAG_IO)
+ {
+ attr = lookup_attribute ("io", DECL_ATTRIBUTES (decl));
+ gcc_assert (attr);
+ }
+ if (!attr || !TREE_VALUE (attr))
+ attr = lookup_attribute ("address", DECL_ATTRIBUTES (decl));
+ gcc_assert (attr && TREE_VALUE (attr) && TREE_VALUE (TREE_VALUE (attr)));
+ return GEN_INT (TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (attr))));
+ }
+ return x;
+}
+
/* AVR attributes. */
static const struct attribute_spec
false },
{ "OS_main", 0, 0, false, true, true, avr_handle_fntype_attribute,
false },
+ { "io", 0, 1, false, false, false, avr_handle_addr_attribute,
+ false },
+ { "io_low", 0, 1, false, false, false, avr_handle_addr_attribute,
+ false },
+ { "address", 1, 1, false, false, false, avr_handle_addr_attribute,
+ false },
{ NULL, 0, 0, false, false, false, NULL, false }
};
if (!ADDR_SPACE_GENERIC_P (as)
&& (!TYPE_READONLY (target)
- || avr_addrspace[as].segment >= avr_current_device->n_flash))
+ || avr_addrspace[as].segment >= avr_n_flash))
{
return as;
}
if (reason)
{
- if (avr_addrspace[as].segment >= avr_current_device->n_flash)
+ if (avr_addrspace[as].segment >= avr_n_flash)
{
if (TYPE_P (node))
error ("%qT uses address space %qs beyond flash of %qs",
as = TYPE_ADDR_SPACE (TREE_TYPE (node));
- if (avr_addrspace[as].segment >= avr_current_device->n_flash)
+ if (avr_addrspace[as].segment >= avr_n_flash)
{
error ("variable %q+D located in address space %qs"
" beyond flash of %qs",
void
avr_asm_output_aligned_decl_common (FILE * stream,
- const_tree decl ATTRIBUTE_UNUSED,
+ tree decl,
const char *name,
unsigned HOST_WIDE_INT size,
unsigned int align, bool local_p)
{
+ rtx mem = decl == NULL_TREE ? NULL_RTX : DECL_RTL (decl);
+ rtx symbol;
+
+ if (mem != NULL_RTX && MEM_P (mem)
+ && GET_CODE ((symbol = XEXP (mem, 0))) == SYMBOL_REF
+ && (SYMBOL_REF_FLAGS (symbol) & (SYMBOL_FLAG_IO | SYMBOL_FLAG_ADDRESS)))
+ {
+
+ if (!local_p)
+ {
+ fprintf (stream, "\t.globl\t");
+ assemble_name (stream, name);
+ fprintf (stream, "\n");
+ }
+ if (SYMBOL_REF_FLAGS (symbol) & SYMBOL_FLAG_ADDRESS)
+ {
+ assemble_name (stream, name);
+ fprintf (stream, " = %ld\n",
+ (long) INTVAL (avr_eval_addr_attrib (symbol)));
+ }
+ else if (local_p)
+ error_at (DECL_SOURCE_LOCATION (decl),
+ "static IO declaration for %q+D needs an address", decl);
+ return;
+ }
+
/* __gnu_lto_v1 etc. are just markers for the linker injected by toplev.c.
There is no need to trigger __do_clear_bss code for them. */
ASM_OUTPUT_ALIGNED_COMMON (stream, name, size, align);
}
+void
+avr_asm_asm_output_aligned_bss (FILE *file, tree decl, const char *name,
+ unsigned HOST_WIDE_INT size, int align,
+ void (*default_func)
+ (FILE *, tree, const char *,
+ unsigned HOST_WIDE_INT, int))
+{
+ rtx mem = decl == NULL_TREE ? NULL_RTX : DECL_RTL (decl);
+ rtx symbol;
+
+ if (mem != NULL_RTX && MEM_P (mem)
+ && GET_CODE ((symbol = XEXP (mem, 0))) == SYMBOL_REF
+ && (SYMBOL_REF_FLAGS (symbol) & (SYMBOL_FLAG_IO | SYMBOL_FLAG_ADDRESS)))
+ {
+ if (!(SYMBOL_REF_FLAGS (symbol) & SYMBOL_FLAG_ADDRESS))
+ error_at (DECL_SOURCE_LOCATION (decl),
+ "IO definition for %q+D needs an address", decl);
+ avr_asm_output_aligned_decl_common (file, decl, name, size, align, false);
+ }
+ else
+ default_func (file, decl, name, size, align);
+}
+
/* Unnamed section callback for data_section
to track need of __do_copy_data. */
{
rtx sym = XEXP (rtl, 0);
tree type = TREE_TYPE (decl);
+ tree attr = DECL_ATTRIBUTES (decl);
if (type == error_mark_node)
return;
+
addr_space_t as = TYPE_ADDR_SPACE (type);
/* PSTR strings are in generic space but located in flash:
patch address space. */
- if (-1 == avr_progmem_p (decl, DECL_ATTRIBUTES (decl)))
+ if (-1 == avr_progmem_p (decl, attr))
as = ADDR_SPACE_FLASH;
AVR_SYMBOL_SET_ADDR_SPACE (sym, as);
+
+ tree io_low_attr = lookup_attribute ("io_low", attr);
+ tree io_attr = lookup_attribute ("io", attr);
+ tree addr_attr;
+ if (io_low_attr
+ && TREE_VALUE (io_low_attr) && TREE_VALUE (TREE_VALUE (io_low_attr)))
+ addr_attr = io_attr;
+ else if (io_attr
+ && TREE_VALUE (io_attr) && TREE_VALUE (TREE_VALUE (io_attr)))
+ addr_attr = io_attr;
+ else
+ addr_attr = lookup_attribute ("address", attr);
+ if (io_low_attr
+ || (io_attr && addr_attr &&
+ low_io_address_operand (GEN_INT (TREE_INT_CST_LOW (TREE_VALUE (TREE_VALUE (addr_attr)))), QImode)))
+ SYMBOL_REF_FLAGS (sym) |= SYMBOL_FLAG_IO_LOW;
+ if (io_attr || io_low_attr)
+ SYMBOL_REF_FLAGS (sym) |= SYMBOL_FLAG_IO;
+ /* If we have an (io) address attribute specification, but the variable
+ is external, treat the address as only a tentative definition
+ to be used to determine if an io port is in the lower range, but
+ don't use the exact value for constant propagation. */
+ if (addr_attr && !DECL_EXTERNAL (decl))
+ SYMBOL_REF_FLAGS (sym) |= SYMBOL_FLAG_ADDRESS;
}
}
static bool
avr_2word_insn_p (rtx_insn *insn)
{
- if ((avr_current_device->dev_attribute & AVR_ERRATA_SKIP)
+ if (TARGET_SKIP_BUG
|| !insn
|| 2 != get_attr_length (insn))
{
gcc_unreachable();
case CONST_INT:
+ case CONST:
+ case SYMBOL_REF:
if (low_io_address_operand (operands[1], QImode))
{
}
else
{
+ gcc_assert (io_address_operand (operands[1], QImode));
output_asm_insn ("in __tmp_reg__,%i1", operands);
if (comp == EQ)
output_asm_insn ("sbrs __tmp_reg__,%2", operands);
int segment = avr_addrspace[as].segment;
if (segment
- && avr_current_device->n_flash > 1)
+ && avr_n_flash > 1)
{
a_hi8 = GEN_INT (segment);
emit_move_insn (rampz_rtx, a_hi8 = copy_to_mode_reg (QImode, a_hi8));
/* Handling of 8-bit SP versus 16-bit SP is as follows:
+FIXME: DRIVER_SELF_SPECS has changed.
-msp8 is used internally to select the right multilib for targets with
8-bit SP. -msp8 is set automatically by DRIVER_SELF_SPECS for devices
with 8-bit SP or by multilib generation machinery. If a frame pointer is
avr_asm_output_aligned_decl_common (STREAM, DECL, NAME, SIZE, ALIGN, false)
#define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
- asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN)
+ avr_asm_asm_output_aligned_bss (FILE, DECL, NAME, SIZE, ALIGN, \
+ asm_output_aligned_bss)
#define ASM_OUTPUT_ALIGNED_DECL_LOCAL(STREAM, DECL, NAME, SIZE, ALIGN) \
avr_asm_output_aligned_decl_common (STREAM, DECL, NAME, SIZE, ALIGN, true)
#define ADJUST_INSN_LENGTH(INSN, LENGTH) \
(LENGTH = avr_adjust_insn_length (INSN, LENGTH))
-extern const char *avr_device_to_as (int argc, const char **argv);
-extern const char *avr_device_to_ld (int argc, const char **argv);
-extern const char *avr_device_to_data_start (int argc, const char **argv);
-extern const char *avr_device_to_text_start (int argc, const char **argv);
-extern const char *avr_device_to_startfiles (int argc, const char **argv);
-extern const char *avr_device_to_devicelib (int argc, const char **argv);
-extern const char *avr_device_to_sp8 (int argc, const char **argv);
-
-#define EXTRA_SPEC_FUNCTIONS \
- { "device_to_as", avr_device_to_as }, \
- { "device_to_ld", avr_device_to_ld }, \
- { "device_to_data_start", avr_device_to_data_start }, \
- { "device_to_text_start", avr_device_to_text_start }, \
- { "device_to_startfile", avr_device_to_startfiles }, \
- { "device_to_devicelib", avr_device_to_devicelib }, \
- { "device_to_sp8", avr_device_to_sp8 },
-
-#define DRIVER_SELF_SPECS " %:device_to_sp8(%{mmcu=*:%*}) "
+#define DRIVER_SELF_SPECS " %{mmcu=*:-specs=device-specs/specs-%*%s %<mmcu=*} "
#define CPP_SPEC ""
#define CC1_SPEC ""
%{!fenforce-eh-specs:-fno-enforce-eh-specs} \
%{!fexceptions:-fno-exceptions}"
-#define ASM_SPEC "%:device_to_as(%{mmcu=*:%*}) "
+#define ASM_SPEC "%{march=*:-mmcu=%*}%{mrelax: --mlink-relax}"
#define LINK_SPEC "\
%{mrelax:--relax\
%{mmcu=atmega64*|\
mmcu=at90can64*|\
mmcu=at90usb64*:--pmem-wrap-around=64k}}}\
-%:device_to_ld(%{mmcu=*:%*})\
-%:device_to_data_start(%{mmcu=*:%*})\
-%:device_to_text_start(%{mmcu=*:%*}) \
+%{march=*:-m%*}\
%{shared:%eshared is not supported}"
#define LIB_SPEC \
#define LIBGCC_SPEC \
"%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lgcc }}}}}"
-#define STARTFILE_SPEC "%:device_to_startfile(%{mmcu=*:%*})"
+/* The actual definition will come from the device-specific spec file. */
+#define STARTFILE_SPEC ""
#define ENDFILE_SPEC ""
#define ACCUMULATE_OUTGOING_ARGS avr_accumulate_outgoing_args()
#define INIT_EXPANDERS avr_init_expanders()
+
+/* Flags used for io and address attributes. */
+#define SYMBOL_FLAG_IO_LOW (SYMBOL_FLAG_MACH_DEP << 4)
+#define SYMBOL_FLAG_IO (SYMBOL_FLAG_MACH_DEP << 5)
+#define SYMBOL_FLAG_ADDRESS (SYMBOL_FLAG_MACH_DEP << 6)
""
{
rtx dest = operands[0];
- rtx src = operands[1];
+ rtx src = avr_eval_addr_attrib (operands[1]);
if (avr_mem_flash_p (dest))
DONE;
;; Clear/set/test a single bit in I/O address space.
(define_insn "*cbi"
- [(set (mem:QI (match_operand 0 "low_io_address_operand" "n"))
+ [(set (mem:QI (match_operand 0 "low_io_address_operand" "i"))
(and:QI (mem:QI (match_dup 0))
(match_operand:QI 1 "single_zero_operand" "n")))]
""
(set_attr "cc" "none")])
(define_insn "*sbi"
- [(set (mem:QI (match_operand 0 "low_io_address_operand" "n"))
+ [(set (mem:QI (match_operand 0 "low_io_address_operand" "i"))
(ior:QI (mem:QI (match_dup 0))
(match_operand:QI 1 "single_one_operand" "n")))]
""
(if_then_else
(match_operator 0 "eqne_operator"
[(zero_extract:QIHI
- (mem:QI (match_operand 1 "low_io_address_operand" "n"))
+ (mem:QI (match_operand 1 "low_io_address_operand" "i"))
(const_int 1)
(match_operand 2 "const_int_operand" "n"))
(const_int 0)])
[(set (pc)
(if_then_else
(match_operator 0 "gelt_operator"
- [(mem:QI (match_operand 1 "low_io_address_operand" "n"))
+ [(mem:QI (match_operand 1 "low_io_address_operand" "i"))
(const_int 0)])
(label_ref (match_operand 2 "" ""))
(pc)))]
(label_ref (match_operand 0 "" ""))
(pc)))]
"!AVR_HAVE_JMP_CALL
- || !(avr_current_device->dev_attribute & AVR_ERRATA_SKIP)"
+ || !TARGET_SKIP_BUG"
{
if (operands[2] == CONST0_RTX (<MODE>mode))
operands[2] = zero_reg_rtx;
;; in contrast to a IN/BST/BLD/OUT sequence we need less registers and the
;; operation on I/O is atomic.
(define_insn "*insv.io"
- [(set (zero_extract:QI (mem:QI (match_operand 0 "low_io_address_operand" "n,n,n"))
+ [(set (zero_extract:QI (mem:QI (match_operand 0 "low_io_address_operand" "i,i,i"))
(const_int 1)
(match_operand:QI 1 "const_0_to_7_operand" "n,n,n"))
(match_operand:QI 2 "nonmemory_operand" "L,P,r"))]
(set_attr "cc" "none")])
(define_insn "*insv.not.io"
- [(set (zero_extract:QI (mem:QI (match_operand 0 "low_io_address_operand" "n"))
+ [(set (zero_extract:QI (mem:QI (match_operand 0 "low_io_address_operand" "i"))
(const_int 1)
(match_operand:QI 1 "const_0_to_7_operand" "n"))
(not:QI (match_operand:QI 2 "register_operand" "r")))]
; along with GCC; see the file COPYING3. If not see
; <http://www.gnu.org/licenses/>.
+HeaderInclude
+config/avr/avr-arch.h
+
mcall-prologues
Target Report Mask(CALL_PROLOGUES)
Use subroutines for function prologues and epilogues
mmcu=
-Target RejectNegative Joined Var(avr_mcu_index) Init(0) Enum(avr_mcu)
+Target RejectNegative Joined
-mmcu=MCU Select the target MCU
+march=
+Target RejectNegative Joined Var(avr_arch_index) Init(ARCH_AVR2) Enum(avr_arch)
+-march=ARCH Select target architecture
+
+mn-flash=
+Target RejectNegative Joined Var(avr_n_flash) UInteger Init(-1)
+Set the number of 64 KiB flash segments
+
+mskip-bug
+Target Report Mask(SKIP_BUG)
+Indicate presence of a processor erratum
+
+mrmw
+Target Report Mask(RMW)
+Enable Read-Modify-Write (RMW) instructions support/use
+
mdeb
Target Report Undocumented Mask(ALL_DEBUG)
avr_current_arch = &avr_arch_types[avr_current_device->arch];
}
-
-/* Returns command line parameters to pass to as. */
-
-const char*
-avr_device_to_as (int argc, const char **argv)
-{
- if (0 == argc)
- return NULL;
-
- avr_set_current_device (argv[0]);
-
- return concat ("-mmcu=", avr_current_arch->arch_name,
- avr_current_device->dev_attribute & AVR_ERRATA_SKIP ? "" : " -mno-skip-bug",
- avr_current_device->dev_attribute & AVR_ISA_RMW ? " -mrmw" : "", NULL);
-}
-
-/* Returns command line parameters to pass to ld. */
-
-const char*
-avr_device_to_ld (int argc, const char **argv)
-{
- if (0 == argc)
- return NULL;
-
- avr_set_current_device (argv[0]);
-
- return concat ("-m ", avr_current_arch->arch_name, NULL);
-}
-
-/* Returns command line parameters that describe start of date section. */
-
-const char *
-avr_device_to_data_start (int argc, const char **argv)
-{
- unsigned long data_section_start;
- char data_section_start_str[16];
-
- if (0 == argc)
- return NULL;
-
- avr_set_current_device (argv[0]);
-
- if (avr_current_device->data_section_start
- == avr_current_arch->default_data_section_start)
- return NULL;
-
- data_section_start = 0x800000 + avr_current_device->data_section_start;
-
- snprintf (data_section_start_str, sizeof(data_section_start_str) - 1,
- "0x%lX", data_section_start);
-
- return concat ("-Tdata ", data_section_start_str, NULL);
-}
-
-/* Returns command line parameters that describe start of text section. */
-
-const char *
-avr_device_to_text_start (int argc, const char **argv)
-{
- unsigned long text_section_start;
- char text_section_start_str[16];
-
- if (0 == argc)
- return NULL;
-
- avr_set_current_device (argv[0]);
-
- if (avr_current_device->text_section_start == 0x0)
- return NULL;
-
- text_section_start = avr_current_device->text_section_start;
-
- snprintf (text_section_start_str, sizeof(text_section_start_str) - 1,
- "0x%lX", text_section_start);
-
- return concat ("-Ttext ", text_section_start_str, NULL);
-}
-
-/* Returns command line parameters that describe the device startfile. */
-
-const char *
-avr_device_to_startfiles (int argc, const char **argv)
-{
- if (0 == argc)
- return NULL;
-
- avr_set_current_device (argv[0]);
-
- return concat ("crt", avr_current_device->library_name, ".o%s", NULL);
-}
-
-/* Returns command line parameters that describe the device library. */
-
-const char *
-avr_device_to_devicelib (int argc, const char **argv)
-{
- if (0 == argc)
- return NULL;
-
- avr_set_current_device (argv[0]);
-
- return concat ("-l", avr_current_device->library_name, NULL);
-}
-
-const char*
-avr_device_to_sp8 (int argc, const char **argv)
-{
- if (0 == argc)
- return NULL;
-
- avr_set_current_device (argv[0]);
-
- /* Leave "avr2" and "avr25" alone. These two architectures are
- the only ones that mix devices with 8-bit SP and 16-bit SP.
- -msp8 is set by mmultilib machinery. */
-
- if (avr_current_device->macro == NULL
- && (avr_current_device->arch == ARCH_AVR2
- || avr_current_device->arch == ARCH_AVR25))
- return "";
-
- return (avr_current_device->dev_attribute & AVR_SHORT_SP)
- ? "-msp8"
- : "%<msp8";
-}
--- /dev/null
+/* Copyright (C) 1998-2014 Free Software Foundation, Inc.
+ Contributed by Joern Rennecke
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GCC is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with GCC; see the file COPYING3. If not see
+ <http://www.gnu.org/licenses/>. */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#define IN_GEN_AVR_MMCU_TEXI
+
+#include "avr-arch.h"
+#include "avr-devices.c"
+
+static void
+print_mcu (const avr_mcu_t *mcu)
+{
+ const avr_mcu_t *arch_mcu;
+
+ for (arch_mcu = mcu; arch_mcu->macro; )
+ arch_mcu--;
+ if (arch_mcu->arch != mcu->arch)
+ exit (EXIT_FAILURE);
+
+ char name[100];
+ if (snprintf (name, sizeof name, "specs-%s", mcu->name) >= sizeof name)
+ exit (EXIT_FAILURE);
+
+ FILE *f = fopen (name ,"w");
+
+ const char *sp8, *errata_skip, *rmw;
+ /* Leave "avr2" and "avr25" alone. These two architectures are
+ the only ones that mix devices with 8-bit SP and 16-bit SP. */
+ if (mcu->macro == NULL
+ && (mcu->arch == ARCH_AVR2 || mcu->arch == ARCH_AVR25))
+ sp8 = "";
+
+ sp8 = ((mcu->dev_attribute & AVR_SHORT_SP)
+ ? " -msp8" : " %<msp8");
+
+ errata_skip = (mcu->dev_attribute & AVR_ERRATA_SKIP) ? " -mskip-bug" : "";
+ rmw = (mcu->dev_attribute & AVR_ISA_RMW) ? "%%{!mno-rmw: -mrmw}" : "";
+
+ const char *arch_name = avr_arch_types[mcu->arch].arch_name;
+
+ fprintf (f, "*self_spec:\n%%{!march=*:-march=%s}%s\n\n", arch_name, sp8);
+
+ if (mcu->macro)
+ fprintf (f, "*cpp:\n-D__AVR_DEV_LIB_NAME__=%s -D%s "
+ "-D__AVR_DEVICE_NAME__=%s\n\n",
+ mcu->library_name, mcu->macro, mcu->name);
+
+ fprintf (f, "*cc1:\n%s%s", errata_skip, rmw);
+ if (mcu->n_flash != arch_mcu->n_flash)
+ fprintf (f, " %%{!mn-flash:-mn-flash=%d}", mcu->n_flash);
+ fprintf (f, "\n\n");
+ fprintf (f, "*cc1plus:\n%s%s ", errata_skip, rmw);
+ if (mcu->n_flash != arch_mcu->n_flash)
+ fprintf (f, "%%{!mn-flash:-mn-flash=%d}", mcu->n_flash);
+ fprintf (f, "%%{!frtti: -fno-rtti}"
+ "%%{!fenforce-eh-specs: -fno-enforce-eh-specs}"
+ "%%{!fexceptions: -fno-exceptions}\n\n");
+
+ fprintf (f, "*asm:\n%%{march=*:-mmcu=%%*}%{mrelax: --mlink-relax}%s\n\n",
+ *errata_skip ? "" : " -mno-skip-bug");
+
+ fprintf (f, "*link:\n%%{mrelax:--relax");
+ if (strncmp (mcu->name, "at90usb8", strlen ("at90usb8")) == 0)
+ fprintf (f, "%%{mpmem-wrap-around: --pmem-wrap-around=8k}");
+ if (strncmp (mcu->name, "atmega16", strlen ("atmega16")) == 0)
+ fprintf (f, "%%{mpmem-wrap-around: --pmem-wrap-around=16k}");
+ if (strncmp (mcu->name, "atmega32", strlen ("atmega32")) == 0
+ || strncmp (mcu->name, "at90can32", strlen ("at90can32")) == 0)
+ fprintf (f, "%%{mpmem-wrap-around: --pmem-wrap-around=32k}");
+ if (strncmp (mcu->name, "atmega64", strlen ("atmega64")) == 0
+ || strncmp (mcu->name, "at90can64", strlen ("at90can64")) == 0
+ || strncmp (mcu->name, "at90usb64", strlen ("at90usb64")) == 0)
+ fprintf (f, "%%{mpmem-wrap-around: --pmem-wrap-around=64k}");
+ fprintf (f, "} %%{march=*:-m%%*}");
+ if (mcu->data_section_start
+ != avr_arch_types[mcu->arch].default_data_section_start)
+ fprintf (f, " -Tdata 0x%lX", 0x800000UL + mcu->data_section_start);
+ if (mcu->text_section_start != 0x0)
+ fprintf (f, " -Ttext 0x%lX", mcu->text_section_start);
+
+ fprintf (f, " %%{shared:%%eshared is not supported}\n\n");
+
+ fprintf (f, "*lib:\n");
+ if (strncmp (mcu->name, "mmcu=at90s1", strlen ("mmcu=at90s1")) != 0
+ && strncmp (mcu->name, "mmcu=attiny11", strlen ("mmcu=attiny11")) != 0
+ && strncmp (mcu->name, "mmcu=attiny12", strlen ("mmcu=attiny12")) != 0
+ && strncmp (mcu->name, "mmcu=attiny15", strlen ("mmcu=attiny15")) != 0
+ && strncmp (mcu->name, "mmcu=attiny28", strlen ("mmcu=attiny28")) != 0)
+ {
+ fprintf (f, "-lc");
+ if (mcu->macro)
+ fprintf (f, " dev/%s/libdev.a%%s", mcu->name);
+ }
+ fprintf (f, "\n\n");
+
+ fprintf (f, "*libgcc:\n");
+ if (strncmp (mcu->name, "mmcu=at90s1", strlen ("mmcu=at90s1")) != 0
+ && strncmp (mcu->name, "mmcu=attiny11", strlen ("mmcu=attiny11")) != 0
+ && strncmp (mcu->name, "mmcu=attiny12", strlen ("mmcu=attiny12")) != 0
+ && strncmp (mcu->name, "mmcu=attiny15", strlen ("mmcu=attiny15")) != 0
+ && strncmp (mcu->name, "mmcu=attiny28", strlen ("mmcu=attiny28")) != 0)
+ fprintf (f, "-lgcc");
+ fprintf (f, "\n\n");
+
+ fprintf (f, "*startfile:\ndev/%s/crt1.o%%s\n\n", mcu->name);
+}
+
+int main (void)
+{
+ enum avr_arch arch = ARCH_UNKNOWN;
+ size_t i, n_mcus = 0;
+ const avr_mcu_t *mcu;
+
+ for (mcu = avr_mcu_types; mcu->name; mcu++)
+ print_mcu (mcu);
+
+ return EXIT_SUCCESS;
+}
cores[n_cores] = core
n_cores++
tiny_stack[core] = 0
- option[core] = "mmcu=" core
+ option[core] = "march=" core
next
}
# m_options <-> MULTILIB_OPTIONS Makefile
# m_dirnames <-> MULTILIB_DIRNAMES "
# m_exceptions <-> MULTILIB_EXCEPTIONS "
-# m_matches <-> MULTILIB_MATCHES "
#
##################################################################
m_options = "\nMULTILIB_OPTIONS = "
m_dirnames = "\nMULTILIB_DIRNAMES ="
m_exceptions = "\nMULTILIB_EXCEPTIONS ="
- m_matches = "\nMULTILIB_MATCHES ="
##############################################################
# Compose MULTILIB_OPTIONS. This represents the Cross-Product
line = option[core] ":" option[mcu[t]]
gsub ("=", "?", line)
gsub (":", "=", line)
-
- m_matches = m_matches " \\\n\t" line
}
####################################################################
print m_options
print m_dirnames
print m_exceptions
- print m_matches
}
}
; <http://www.gnu.org/licenses/>.
Enum
-Name(avr_mcu) Type(int)
-Known MCU names:
+Name(avr_arch) Type(enum avr_arch)
+Known MCU architectures:
EOF
awk -F'[(, ]+' 'BEGIN {
- value = 0
}
-/^AVR_MCU/ {
+/^AVR_MCU.*NULL/ {
name = $2
+ value = $3
gsub("\"", "", name)
print "EnumValue"
- print "Enum(avr_mcu) String(" name ") Value(" value ")"
+ print "Enum(avr_arch) String(" name ") Value(" value ")"
print ""
- value++
}' $1
(match_test "REGNO (op) == REG_SP")))
;; Return true if OP is a valid address for lower half of I/O space.
-(define_predicate "low_io_address_operand"
- (and (match_code "const_int")
- (match_test "IN_RANGE (INTVAL (op) - avr_current_arch->sfr_offset,
- 0, 0x1f)")))
+(define_special_predicate "low_io_address_operand"
+ (ior (and (match_code "const_int")
+ (match_test "IN_RANGE (INTVAL (op) - avr_current_arch->sfr_offset,
+ 0, 020 - GET_MODE_SIZE (mode))"))
+ (and (match_code "symbol_ref")
+ (match_test "SYMBOL_REF_FLAGS (op) & SYMBOL_FLAG_IO_LOW"))))
;; Return true if OP is a valid address for high half of I/O space.
(define_predicate "high_io_address_operand"
0x20, 0x3F)")))
;; Return true if OP is a valid address of I/O space.
-(define_predicate "io_address_operand"
- (and (match_code "const_int")
- (match_test "IN_RANGE (INTVAL (op) - avr_current_arch->sfr_offset,
- 0, 0x40 - GET_MODE_SIZE (mode))")))
+(define_special_predicate "io_address_operand"
+ (ior (and (match_code "const_int")
+ (match_test "IN_RANGE (INTVAL (op) - avr_current_arch->sfr_offset,
+ 0, 0x40 - GET_MODE_SIZE (mode))"))
+ (and (match_code "symbol_ref")
+ (match_test "SYMBOL_REF_FLAGS (op) & SYMBOL_FLAG_IO"))))
;; Return 1 if OP is a general operand not in flash memory
(define_predicate "nop_general_operand"
$(srcdir)/config/avr/avr-arch.h
$(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) $< -o $@
+gen-avr-mmcu-specs$(build_exeext): $(srcdir)/config/avr/gen-avr-mmcu-specs.c \
+ $(AVR_MCUS) $(srcdir)/config/avr/avr-devices.c \
+ $(srcdir)/config/avr/avr-arch.h
+ $(CC_FOR_BUILD) $(CFLAGS_FOR_BUILD) $< -o $@
+
$(srcdir)/doc/avr-mmcu.texi: gen-avr-mmcu-texi$(build_exeext)
$(RUN_GEN) ./$< > $@
+s-device-specs: gen-avr-mmcu-specs$(build_exeext)
+ rm -rf device-specs
+ mkdir device-specs && cd device-specs && $(RUN_GEN) ../$<
+ $(STAMP) s-device-specs
+
+GCC_PASSES+=s-device-specs
+
+install-driver: install-device-specs
+
+install-device-specs: s-device-specs installdirs
+ -rm -rf $(DESTDIR)$(libsubdir)/device-specs
+ mkdir $(DESTDIR)$(libsubdir)/device-specs
+ -for file in device-specs/*; do \
+ $(INSTALL_PROGRAM) $${file} $(DESTDIR)$(libsubdir)/$${file}; \
+ done
+
# Map -mmcu= to the right multilib variant
# MULTILIB_OPTIONS
# MULTILIB_DIRNAMES
# along with GCC; see the file COPYING3. If not see
# <http://www.gnu.org/licenses/>.
-MULTILIB_OPTIONS = mmcu=avr2/mmcu=avr25/mmcu=avr3/mmcu=avr31/mmcu=avr35/mmcu=avr4/mmcu=avr5/mmcu=avr51/mmcu=avr6/mmcu=avrxmega2/mmcu=avrxmega4/mmcu=avrxmega5/mmcu=avrxmega6/mmcu=avrxmega7 msp8
+MULTILIB_OPTIONS = march=avr2/march=avr25/march=avr3/march=avr31/march=avr35/march=avr4/march=avr5/march=avr51/march=avr6/march=avrxmega2/march=avrxmega4/march=avrxmega5/march=avrxmega6/march=avrxmega7 msp8
MULTILIB_DIRNAMES = avr2 avr25 avr3 avr31 avr35 avr4 avr5 avr51 avr6 avrxmega2 avrxmega4 avrxmega5 avrxmega6 avrxmega7 tiny-stack avr25/tiny-stack
MULTILIB_EXCEPTIONS = \
- mmcu=avr3/msp8 \
- mmcu=avr31/msp8 \
- mmcu=avr35/msp8 \
- mmcu=avr4/msp8 \
- mmcu=avr5/msp8 \
- mmcu=avr51/msp8 \
- mmcu=avr6/msp8 \
- mmcu=avrxmega2/msp8 \
- mmcu=avrxmega4/msp8 \
- mmcu=avrxmega5/msp8 \
- mmcu=avrxmega6/msp8 \
- mmcu=avrxmega7/msp8
-
-MULTILIB_MATCHES = \
- mmcu?avr2=mmcu?at90s2313 \
- mmcu?avr2=mmcu?at90s2323 \
- mmcu?avr2=mmcu?at90s2333 \
- mmcu?avr2=mmcu?at90s2343 \
- mmcu?avr2=mmcu?attiny22 \
- mmcu?avr2=mmcu?attiny26 \
- mmcu?avr2=mmcu?at90s4414 \
- mmcu?avr2=mmcu?at90s4433 \
- mmcu?avr2=mmcu?at90s4434 \
- mmcu?avr2=mmcu?at90s8515 \
- mmcu?avr2=mmcu?at90c8534 \
- mmcu?avr2=mmcu?at90s8535 \
- mmcu?avr25=mmcu?ata5272 \
- mmcu?avr25=mmcu?ata6616c \
- mmcu?avr25=mmcu?attiny13 \
- mmcu?avr25=mmcu?attiny13a \
- mmcu?avr25=mmcu?attiny2313 \
- mmcu?avr25=mmcu?attiny2313a \
- mmcu?avr25=mmcu?attiny24 \
- mmcu?avr25=mmcu?attiny24a \
- mmcu?avr25=mmcu?attiny4313 \
- mmcu?avr25=mmcu?attiny44 \
- mmcu?avr25=mmcu?attiny44a \
- mmcu?avr25=mmcu?attiny441 \
- mmcu?avr25=mmcu?attiny84 \
- mmcu?avr25=mmcu?attiny84a \
- mmcu?avr25=mmcu?attiny25 \
- mmcu?avr25=mmcu?attiny45 \
- mmcu?avr25=mmcu?attiny85 \
- mmcu?avr25=mmcu?attiny261 \
- mmcu?avr25=mmcu?attiny261a \
- mmcu?avr25=mmcu?attiny461 \
- mmcu?avr25=mmcu?attiny461a \
- mmcu?avr25=mmcu?attiny861 \
- mmcu?avr25=mmcu?attiny861a \
- mmcu?avr25=mmcu?attiny43u \
- mmcu?avr25=mmcu?attiny87 \
- mmcu?avr25=mmcu?attiny48 \
- mmcu?avr25=mmcu?attiny88 \
- mmcu?avr25=mmcu?attiny828 \
- mmcu?avr25=mmcu?attiny841 \
- mmcu?avr25=mmcu?at86rf401 \
- mmcu?avr3=mmcu?at43usb355 \
- mmcu?avr3=mmcu?at76c711 \
- mmcu?avr31=mmcu?atmega103 \
- mmcu?avr31=mmcu?at43usb320 \
- mmcu?avr35=mmcu?ata5505 \
- mmcu?avr35=mmcu?ata6617c \
- mmcu?avr35=mmcu?ata664251 \
- mmcu?avr35=mmcu?at90usb82 \
- mmcu?avr35=mmcu?at90usb162 \
- mmcu?avr35=mmcu?atmega8u2 \
- mmcu?avr35=mmcu?atmega16u2 \
- mmcu?avr35=mmcu?atmega32u2 \
- mmcu?avr35=mmcu?attiny167 \
- mmcu?avr35=mmcu?attiny1634 \
- mmcu?avr4=mmcu?ata6285 \
- mmcu?avr4=mmcu?ata6286 \
- mmcu?avr4=mmcu?ata6289 \
- mmcu?avr4=mmcu?ata6612c \
- mmcu?avr4=mmcu?atmega8 \
- mmcu?avr4=mmcu?atmega8a \
- mmcu?avr4=mmcu?atmega48 \
- mmcu?avr4=mmcu?atmega48a \
- mmcu?avr4=mmcu?atmega48p \
- mmcu?avr4=mmcu?atmega48pa \
- mmcu?avr4=mmcu?atmega88 \
- mmcu?avr4=mmcu?atmega88a \
- mmcu?avr4=mmcu?atmega88p \
- mmcu?avr4=mmcu?atmega88pa \
- mmcu?avr4=mmcu?atmega8515 \
- mmcu?avr4=mmcu?atmega8535 \
- mmcu?avr4=mmcu?atmega8hva \
- mmcu?avr4=mmcu?at90pwm1 \
- mmcu?avr4=mmcu?at90pwm2 \
- mmcu?avr4=mmcu?at90pwm2b \
- mmcu?avr4=mmcu?at90pwm3 \
- mmcu?avr4=mmcu?at90pwm3b \
- mmcu?avr4=mmcu?at90pwm81 \
- mmcu?avr5=mmcu?ata5702m322 \
- mmcu?avr5=mmcu?ata5782 \
- mmcu?avr5=mmcu?ata5790 \
- mmcu?avr5=mmcu?ata5790n \
- mmcu?avr5=mmcu?ata5795 \
- mmcu?avr5=mmcu?ata5831 \
- mmcu?avr5=mmcu?ata6613c \
- mmcu?avr5=mmcu?ata6614q \
- mmcu?avr5=mmcu?atmega16 \
- mmcu?avr5=mmcu?atmega16a \
- mmcu?avr5=mmcu?atmega161 \
- mmcu?avr5=mmcu?atmega162 \
- mmcu?avr5=mmcu?atmega163 \
- mmcu?avr5=mmcu?atmega164a \
- mmcu?avr5=mmcu?atmega164p \
- mmcu?avr5=mmcu?atmega164pa \
- mmcu?avr5=mmcu?atmega165 \
- mmcu?avr5=mmcu?atmega165a \
- mmcu?avr5=mmcu?atmega165p \
- mmcu?avr5=mmcu?atmega165pa \
- mmcu?avr5=mmcu?atmega168 \
- mmcu?avr5=mmcu?atmega168a \
- mmcu?avr5=mmcu?atmega168p \
- mmcu?avr5=mmcu?atmega168pa \
- mmcu?avr5=mmcu?atmega169 \
- mmcu?avr5=mmcu?atmega169a \
- mmcu?avr5=mmcu?atmega169p \
- mmcu?avr5=mmcu?atmega169pa \
- mmcu?avr5=mmcu?atmega16hvb \
- mmcu?avr5=mmcu?atmega16hvbrevb \
- mmcu?avr5=mmcu?atmega16m1 \
- mmcu?avr5=mmcu?atmega16u4 \
- mmcu?avr5=mmcu?atmega32a \
- mmcu?avr5=mmcu?atmega32 \
- mmcu?avr5=mmcu?atmega323 \
- mmcu?avr5=mmcu?atmega324a \
- mmcu?avr5=mmcu?atmega324p \
- mmcu?avr5=mmcu?atmega324pa \
- mmcu?avr5=mmcu?atmega325 \
- mmcu?avr5=mmcu?atmega325a \
- mmcu?avr5=mmcu?atmega325p \
- mmcu?avr5=mmcu?atmega325pa \
- mmcu?avr5=mmcu?atmega3250 \
- mmcu?avr5=mmcu?atmega3250a \
- mmcu?avr5=mmcu?atmega3250p \
- mmcu?avr5=mmcu?atmega3250pa \
- mmcu?avr5=mmcu?atmega328 \
- mmcu?avr5=mmcu?atmega328p \
- mmcu?avr5=mmcu?atmega329 \
- mmcu?avr5=mmcu?atmega329a \
- mmcu?avr5=mmcu?atmega329p \
- mmcu?avr5=mmcu?atmega329pa \
- mmcu?avr5=mmcu?atmega3290 \
- mmcu?avr5=mmcu?atmega3290a \
- mmcu?avr5=mmcu?atmega3290p \
- mmcu?avr5=mmcu?atmega3290pa \
- mmcu?avr5=mmcu?atmega32c1 \
- mmcu?avr5=mmcu?atmega32m1 \
- mmcu?avr5=mmcu?atmega32u4 \
- mmcu?avr5=mmcu?atmega32u6 \
- mmcu?avr5=mmcu?atmega406 \
- mmcu?avr5=mmcu?atmega64 \
- mmcu?avr5=mmcu?atmega64a \
- mmcu?avr5=mmcu?atmega640 \
- mmcu?avr5=mmcu?atmega644 \
- mmcu?avr5=mmcu?atmega644a \
- mmcu?avr5=mmcu?atmega644p \
- mmcu?avr5=mmcu?atmega644pa \
- mmcu?avr5=mmcu?atmega645 \
- mmcu?avr5=mmcu?atmega645a \
- mmcu?avr5=mmcu?atmega645p \
- mmcu?avr5=mmcu?atmega6450 \
- mmcu?avr5=mmcu?atmega6450a \
- mmcu?avr5=mmcu?atmega6450p \
- mmcu?avr5=mmcu?atmega649 \
- mmcu?avr5=mmcu?atmega649a \
- mmcu?avr5=mmcu?atmega649p \
- mmcu?avr5=mmcu?atmega6490 \
- mmcu?avr5=mmcu?atmega16hva \
- mmcu?avr5=mmcu?atmega16hva2 \
- mmcu?avr5=mmcu?atmega32hvb \
- mmcu?avr5=mmcu?atmega6490a \
- mmcu?avr5=mmcu?atmega6490p \
- mmcu?avr5=mmcu?atmega64c1 \
- mmcu?avr5=mmcu?atmega64m1 \
- mmcu?avr5=mmcu?atmega64hve \
- mmcu?avr5=mmcu?atmega64hve2 \
- mmcu?avr5=mmcu?atmega64rfr2 \
- mmcu?avr5=mmcu?atmega644rfr2 \
- mmcu?avr5=mmcu?atmega32hvbrevb \
- mmcu?avr5=mmcu?at90can32 \
- mmcu?avr5=mmcu?at90can64 \
- mmcu?avr5=mmcu?at90pwm161 \
- mmcu?avr5=mmcu?at90pwm216 \
- mmcu?avr5=mmcu?at90pwm316 \
- mmcu?avr5=mmcu?at90scr100 \
- mmcu?avr5=mmcu?at90usb646 \
- mmcu?avr5=mmcu?at90usb647 \
- mmcu?avr5=mmcu?at94k \
- mmcu?avr5=mmcu?m3000 \
- mmcu?avr51=mmcu?atmega128 \
- mmcu?avr51=mmcu?atmega128a \
- mmcu?avr51=mmcu?atmega1280 \
- mmcu?avr51=mmcu?atmega1281 \
- mmcu?avr51=mmcu?atmega1284 \
- mmcu?avr51=mmcu?atmega1284p \
- mmcu?avr51=mmcu?atmega128rfa1 \
- mmcu?avr51=mmcu?atmega128rfr2 \
- mmcu?avr51=mmcu?atmega1284rfr2 \
- mmcu?avr51=mmcu?at90can128 \
- mmcu?avr51=mmcu?at90usb1286 \
- mmcu?avr51=mmcu?at90usb1287 \
- mmcu?avr6=mmcu?atmega2560 \
- mmcu?avr6=mmcu?atmega2561 \
- mmcu?avr6=mmcu?atmega256rfr2 \
- mmcu?avr6=mmcu?atmega2564rfr2 \
- mmcu?avrxmega2=mmcu?atxmega8e5 \
- mmcu?avrxmega2=mmcu?atxmega16a4 \
- mmcu?avrxmega2=mmcu?atxmega16d4 \
- mmcu?avrxmega2=mmcu?atxmega16e5 \
- mmcu?avrxmega2=mmcu?atxmega32a4 \
- mmcu?avrxmega2=mmcu?atxmega32c3 \
- mmcu?avrxmega2=mmcu?atxmega32d3 \
- mmcu?avrxmega2=mmcu?atxmega32d4 \
- mmcu?avrxmega2=mmcu?atxmega16a4u \
- mmcu?avrxmega2=mmcu?atxmega16c4 \
- mmcu?avrxmega2=mmcu?atxmega32a4u \
- mmcu?avrxmega2=mmcu?atxmega32c4 \
- mmcu?avrxmega2=mmcu?atxmega32e5 \
- mmcu?avrxmega4=mmcu?atxmega64a3 \
- mmcu?avrxmega4=mmcu?atxmega64d3 \
- mmcu?avrxmega4=mmcu?atxmega64a3u \
- mmcu?avrxmega4=mmcu?atxmega64a4u \
- mmcu?avrxmega4=mmcu?atxmega64b1 \
- mmcu?avrxmega4=mmcu?atxmega64b3 \
- mmcu?avrxmega4=mmcu?atxmega64c3 \
- mmcu?avrxmega4=mmcu?atxmega64d4 \
- mmcu?avrxmega5=mmcu?atxmega64a1 \
- mmcu?avrxmega5=mmcu?atxmega64a1u \
- mmcu?avrxmega6=mmcu?atxmega128a3 \
- mmcu?avrxmega6=mmcu?atxmega128d3 \
- mmcu?avrxmega6=mmcu?atxmega192a3 \
- mmcu?avrxmega6=mmcu?atxmega192d3 \
- mmcu?avrxmega6=mmcu?atxmega256a3 \
- mmcu?avrxmega6=mmcu?atxmega256a3b \
- mmcu?avrxmega6=mmcu?atxmega256a3bu \
- mmcu?avrxmega6=mmcu?atxmega256d3 \
- mmcu?avrxmega6=mmcu?atxmega128a3u \
- mmcu?avrxmega6=mmcu?atxmega128b1 \
- mmcu?avrxmega6=mmcu?atxmega128b3 \
- mmcu?avrxmega6=mmcu?atxmega128c3 \
- mmcu?avrxmega6=mmcu?atxmega128d4 \
- mmcu?avrxmega6=mmcu?atxmega192a3u \
- mmcu?avrxmega6=mmcu?atxmega192c3 \
- mmcu?avrxmega6=mmcu?atxmega256a3u \
- mmcu?avrxmega6=mmcu?atxmega256c3 \
- mmcu?avrxmega6=mmcu?atxmega384c3 \
- mmcu?avrxmega6=mmcu?atxmega384d3 \
- mmcu?avrxmega7=mmcu?atxmega128a1 \
- mmcu?avrxmega7=mmcu?atxmega128a1u \
- mmcu?avrxmega7=mmcu?atxmega128a4u
+ march=avr3/msp8 \
+ march=avr31/msp8 \
+ march=avr35/msp8 \
+ march=avr4/msp8 \
+ march=avr5/msp8 \
+ march=avr51/msp8 \
+ march=avr6/msp8 \
+ march=avrxmega2/msp8 \
+ march=avrxmega4/msp8 \
+ march=avrxmega5/msp8 \
+ march=avrxmega6/msp8 \
+ march=avrxmega7/msp8
See also the @ref{AVR Named Address Spaces} section for
an alternate way to locate and access data in flash memory.
+
+@item io
+@itemx io (@var{addr})
+Variables with the @code{io} attribute are used to address
+memory-mapped peripherals in the io address range.
+If an address is specified, the variable
+is assigned that address, and the value is interpreted as an
+address in the data address space.
+Example:
+
+@smallexample
+volatile int porta __attribute__((io (0x22)));
+@end smallexample
+
+The address specified in the address in the data address range.
+
+Otherwise, the variable it is not assigned an address, but the
+compiler will still use in/out instructions where applicable,
+assuming some other module assigns an address in the io address range.
+Example:
+
+@smallexample
+extern volatile int porta __attribute__((io));
+@end smallexample
+
+@item io_low
+@itemx io_low (@var{addr})
+This is like the @code{io} attribute, but additionally it informs the
+compiler that the object lies in the lower half of the I/O area,
+allowing the use of @code{cbi}, @code{sbi}, @code{sbic} and @code{sbis}
+instructions.
+
+@item address
+@itemx address (@var{addr})
+Variables with the @code{address} attribute are used to address
+memory-mapped peripherals that may lie outside the io address range.
+
+@smallexample
+volatile int porta __attribute__((address (0x600)));
+@end smallexample
+
@end table
@subsection Blackfin Variable Attributes