Some AVR devices support a Compact Vector Table. The support is provided by means of a startup code file crt<mcu>-cvt.o from AVR-LibC that can be linked instead of the traditional crt<mcu>.o.
This patch adds a new command line option -mcvt that links that CVT startup code (or issues an error when the device doesn't support a CVT). Ok for trunk? Johann -- AVR: Add support for a Compact Vector Table (CVT). Some AVR devices support a CVT: - Devices from the 0-series, 1-series, 2-series. - AVR16, AVR32, AVR64, AVR128 devices. The support is provided by means of a startup code file crt<mcu>-cvt.o from AVR-LibC that can be linked instead of the traditional crt<mcu>.o. This patch adds a new command line option -mcvt that links that CVT startup code (or issues an error when the device doesn't support a CVT). PR target/118764 gcc/ * config/avr/avr.opt (-mcvt): New target option. * config/avr/avr-arch.h (AVR_CVT): New enum value. * config/avr/avr-mcus.def: Add AVR_CVT flag for devices that support it. * config/avr/avr.cc (avr_handle_isr_attribute) [TARGET_CVT]: Issue an error when a vector number larger that 3 is used. * config/avr/gen-avr-mmcu-specs.cc (McuInfo.have_cvt): New property. (print_mcu) <*avrlibc_startfile>: Use crt<mcu>-cvt.o depending on -mcvt (or issue an error when the device doesn't support a CVT). * doc/invoke.texi (AVR Options): Document -mcvt.
AVR: Add support for a Compact Vector Table (CVT). Some AVR devices support a CVT: - Devices from the 0-series, 1-series, 2-series. - AVR16, AVR32, AVR64, AVR128 devices. The support is provided by means of a startup code file crt<mcu>-cvt.o from AVR-LibC that can be linked instead of the traditional crt<mcu>.o. This patch adds a new command line option -mcvt that links that CVT startup code (or issues an error when the device doesn't support a CVT). PR target/118764 gcc/ * config/avr/avr.opt (-mcvt): New target option. * config/avr/avr-arch.h (AVR_CVT): New enum value. * config/avr/avr-mcus.def: Add AVR_CVT flag for devices that support it. * config/avr/avr.cc (avr_handle_isr_attribute) [TARGET_CVT]: Issue an error when a vector number larger that 3 is used. * config/avr/gen-avr-mmcu-specs.cc (McuInfo.have_cvt): New property. (print_mcu) <*avrlibc_startfile>: Use crt<mcu>-cvt.o depending on -mcvt (or issue an error when the device doesn't support a CVT). * doc/invoke.texi (AVR Options): Document -mcvt. diff --git a/gcc/config/avr/avr-arch.h b/gcc/config/avr/avr-arch.h index b5b3606c0d1..efd7b146574 100644 --- a/gcc/config/avr/avr-arch.h +++ b/gcc/config/avr/avr-arch.h @@ -158,6 +158,14 @@ AVR_ERRATA_SKIP http://www.atmel.com/dyn/resources/prod_documents/doc2494.pdf http://www.atmel.com/dyn/resources/prod_documents/doc1436.pdf +AVR_CVT + The device supports a CVT (Compact Vector Table) which can be selected + with -mcvt, which links startup-code crt<mcu>-cvt.o instead of the + usual crt<mcu>.o. This assumes that AVR-LibC implements Issue #1010. + https://github.com/avrdudes/avr-libc/issues/1010 + crt<mcu>-cvt.o also pulls in __do_cvt_init from lib<mcu>.a which sets + bit CPUINT_CTRLA.CPUINT_CVT in order to activate the CVT. + AVR_ISA_RCALL Always use RJMP / RCALL and assume JMP / CALL are not available. This affects multilib selection via specs generation and -mshort-calls. @@ -198,14 +206,16 @@ AVR_ISA_FLMAP enum avr_device_specific_features { AVR_ISA_NONE, - AVR_ISA_RMW = 0x1, /* device has RMW instructions. */ + AVR_CVT = 0x1, /* Device supports a "Compact Vector Table" (-mcvt) + as configured in field CPUINT_CTRLA.CPUINT_CVT. */ AVR_SHORT_SP = 0x2, /* Stack Pointer has 8 bits width. */ - AVR_ERRATA_SKIP = 0x4, /* device has a core erratum. */ - AVR_ISA_LDS = 0x8, /* whether LDS / STS is valid for all data in static - storage. Only useful for reduced Tiny. */ - AVR_ISA_RCALL = 0x10, /* Use RJMP / RCALL even though JMP / CALL + AVR_ERRATA_SKIP = 0x4, /* Device has a core erratum. */ + AVR_ISA_RMW = 0x8, /* Device has RMW instructions. */ + AVR_ISA_LDS = 0x10, /* Whether LDS / STS is valid for all data in static + storage. Only useful for reduced Tiny. */ + AVR_ISA_RCALL = 0x20, /* Use RJMP / RCALL even though JMP / CALL are available (-mshort-calls). */ - AVR_ISA_FLMAP = 0x20 /* Has NVMCTRL_CTRLB.FLMAP to select which 32 KiB + AVR_ISA_FLMAP = 0x40 /* Has NVMCTRL_CTRLB.FLMAP to select which 32 KiB block of program memory is visible in the RAM address space. */ }; diff --git a/gcc/config/avr/avr-mcus.def b/gcc/config/avr/avr-mcus.def index b717749b67a..9f79a9a4579 100644 --- a/gcc/config/avr/avr-mcus.def +++ b/gcc/config/avr/avr-mcus.def @@ -49,7 +49,7 @@ ARCH Specifies the multilib variant together with AVR_SHORT_SP ATTR Specifies the device specific features - - additional ISA, short SP, errata skip etc., + - additional ISA, short SP, errata skip etc., see avr-arch.h MACRO If NULL, this is a core and not a device. If non-NULL, supply respective built-in macro. @@ -309,104 +309,104 @@ AVR_MCU ("atxmega16c4", ARCH_AVRXMEGA2, AVR_ISA_RMW, "__AVR_ATxmega16C4__" AVR_MCU ("atxmega32a4u", ARCH_AVRXMEGA2, AVR_ISA_RMW, "__AVR_ATxmega32A4U__", 0x2000, 0x0, 0x9000, 0) AVR_MCU ("atxmega32c4", ARCH_AVRXMEGA2, AVR_ISA_RMW, "__AVR_ATxmega32C4__", 0x2000, 0x0, 0x9000, 0) AVR_MCU ("atxmega32e5", ARCH_AVRXMEGA2, AVR_ISA_NONE, "__AVR_ATxmega32E5__", 0x2000, 0x0, 0x9000, 0) -AVR_MCU ("avr64da28", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64DA28__", 0x6000, 0x0, 0x10000, 0) -AVR_MCU ("avr64da32", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64DA32__", 0x6000, 0x0, 0x10000, 0) -AVR_MCU ("avr64da48", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64DA48__", 0x6000, 0x0, 0x10000, 0) -AVR_MCU ("avr64da64", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64DA64__", 0x6000, 0x0, 0x10000, 0) -AVR_MCU ("avr64db28", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64DB28__", 0x6000, 0x0, 0x10000, 0) -AVR_MCU ("avr64db32", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64DB32__", 0x6000, 0x0, 0x10000, 0) -AVR_MCU ("avr64db48", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64DB48__", 0x6000, 0x0, 0x10000, 0) -AVR_MCU ("avr64db64", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64DB64__", 0x6000, 0x0, 0x10000, 0) -AVR_MCU ("avr64dd14", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64DD14__", 0x6000, 0x0, 0x10000, 0) -AVR_MCU ("avr64dd20", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64DD20__", 0x6000, 0x0, 0x10000, 0) -AVR_MCU ("avr64dd28", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64DD28__", 0x6000, 0x0, 0x10000, 0) -AVR_MCU ("avr64dd32", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64DD32__", 0x6000, 0x0, 0x10000, 0) -AVR_MCU ("avr64du28", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64DU28__", 0x6000, 0x0, 0x10000, 0) -AVR_MCU ("avr64du32", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64DU32__", 0x6000, 0x0, 0x10000, 0) -AVR_MCU ("avr64ea28", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64EA28__", 0x6800, 0x0, 0x10000, 0) -AVR_MCU ("avr64ea32", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64EA32__", 0x6800, 0x0, 0x10000, 0) -AVR_MCU ("avr64ea48", ARCH_AVRXMEGA2, AVR_ISA_FLMAP, "__AVR_AVR64EA48__", 0x6800, 0x0, 0x10000, 0) +AVR_MCU ("avr64da28", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64DA28__", 0x6000, 0x0, 0x10000, 0) +AVR_MCU ("avr64da32", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64DA32__", 0x6000, 0x0, 0x10000, 0) +AVR_MCU ("avr64da48", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64DA48__", 0x6000, 0x0, 0x10000, 0) +AVR_MCU ("avr64da64", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64DA64__", 0x6000, 0x0, 0x10000, 0) +AVR_MCU ("avr64db28", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64DB28__", 0x6000, 0x0, 0x10000, 0) +AVR_MCU ("avr64db32", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64DB32__", 0x6000, 0x0, 0x10000, 0) +AVR_MCU ("avr64db48", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64DB48__", 0x6000, 0x0, 0x10000, 0) +AVR_MCU ("avr64db64", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64DB64__", 0x6000, 0x0, 0x10000, 0) +AVR_MCU ("avr64dd14", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64DD14__", 0x6000, 0x0, 0x10000, 0) +AVR_MCU ("avr64dd20", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64DD20__", 0x6000, 0x0, 0x10000, 0) +AVR_MCU ("avr64dd28", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64DD28__", 0x6000, 0x0, 0x10000, 0) +AVR_MCU ("avr64dd32", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64DD32__", 0x6000, 0x0, 0x10000, 0) +AVR_MCU ("avr64du28", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64DU28__", 0x6000, 0x0, 0x10000, 0) +AVR_MCU ("avr64du32", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64DU32__", 0x6000, 0x0, 0x10000, 0) +AVR_MCU ("avr64ea28", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64EA28__", 0x6800, 0x0, 0x10000, 0) +AVR_MCU ("avr64ea32", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64EA32__", 0x6800, 0x0, 0x10000, 0) +AVR_MCU ("avr64ea48", ARCH_AVRXMEGA2, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR64EA48__", 0x6800, 0x0, 0x10000, 0) /* Xmega, Flash + RAM < 64K, flash visible in RAM address space */ -AVR_MCU ("avrxmega3", ARCH_AVRXMEGA3, AVR_ISA_NONE, NULL, 0x3f00, 0x0, 0x8000, 0) -AVR_MCU ("attiny202", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny202__", 0x3f80, 0x0, 0x800, 0x8000) -AVR_MCU ("attiny204", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny204__", 0x3f80, 0x0, 0x800, 0x8000) -AVR_MCU ("attiny402", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny402__", 0x3f00, 0x0, 0x1000, 0x8000) -AVR_MCU ("attiny404", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny404__", 0x3f00, 0x0, 0x1000, 0x8000) -AVR_MCU ("attiny406", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny406__", 0x3f00, 0x0, 0x1000, 0x8000) -AVR_MCU ("attiny804", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny804__", 0x3e00, 0x0, 0x2000, 0x8000) -AVR_MCU ("attiny806", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny806__", 0x3e00, 0x0, 0x2000, 0x8000) -AVR_MCU ("attiny807", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny807__", 0x3e00, 0x0, 0x2000, 0x8000) -AVR_MCU ("attiny1604", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1604__", 0x3c00, 0x0, 0x4000, 0x8000) -AVR_MCU ("attiny1606", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1606__", 0x3c00, 0x0, 0x4000, 0x8000) -AVR_MCU ("attiny1607", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1607__", 0x3c00, 0x0, 0x4000, 0x8000) -AVR_MCU ("attiny212", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny212__", 0x3f80, 0x0, 0x800, 0x8000) -AVR_MCU ("attiny214", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny214__", 0x3f80, 0x0, 0x800, 0x8000) -AVR_MCU ("attiny412", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny412__", 0x3f00, 0x0, 0x1000, 0x8000) -AVR_MCU ("attiny414", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny414__", 0x3f00, 0x0, 0x1000, 0x8000) -AVR_MCU ("attiny416", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny416__", 0x3f00, 0x0, 0x1000, 0x8000) -AVR_MCU ("attiny416auto", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny416AUTO__", 0x3f00, 0x0, 0x1000, 0x8000) -AVR_MCU ("attiny417", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny417__", 0x3f00, 0x0, 0x1000, 0x8000) -AVR_MCU ("attiny814", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny814__", 0x3e00, 0x0, 0x2000, 0x8000) -AVR_MCU ("attiny816", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny816__", 0x3e00, 0x0, 0x2000, 0x8000) -AVR_MCU ("attiny817", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny817__", 0x3e00, 0x0, 0x2000, 0x8000) -AVR_MCU ("attiny1614", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1614__", 0x3800, 0x0, 0x4000, 0x8000) -AVR_MCU ("attiny1616", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1616__", 0x3800, 0x0, 0x4000, 0x8000) -AVR_MCU ("attiny1617", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1617__", 0x3800, 0x0, 0x4000, 0x8000) -AVR_MCU ("attiny3214", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny3214__", 0x3800, 0x0, 0x8000, 0x8000) -AVR_MCU ("attiny3216", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny3216__", 0x3800, 0x0, 0x8000, 0x8000) -AVR_MCU ("attiny3217", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny3217__", 0x3800, 0x0, 0x8000, 0x8000) -AVR_MCU ("attiny424", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny424__", 0x3e00, 0x0, 0x1000, 0x8000) -AVR_MCU ("attiny426", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny426__", 0x3e00, 0x0, 0x1000, 0x8000) -AVR_MCU ("attiny427", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny427__", 0x3e00, 0x0, 0x1000, 0x8000) -AVR_MCU ("attiny824", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny824__", 0x3c00, 0x0, 0x2000, 0x8000) -AVR_MCU ("attiny826", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny826__", 0x3c00, 0x0, 0x2000, 0x8000) -AVR_MCU ("attiny827", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATtiny827__", 0x3c00, 0x0, 0x2000, 0x8000) -AVR_MCU ("attiny1624", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1624__", 0x3800, 0x0, 0x4000, 0x8000) -AVR_MCU ("attiny1626", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1626__", 0x3800, 0x0, 0x4000, 0x8000) -AVR_MCU ("attiny1627", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny1627__", 0x3800, 0x0, 0x4000, 0x8000) -AVR_MCU ("attiny3224", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny3224__", 0x3400, 0x0, 0x8000, 0x8000) -AVR_MCU ("attiny3226", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny3226__", 0x3400, 0x0, 0x8000, 0x8000) -AVR_MCU ("attiny3227", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATtiny3227__", 0x3400, 0x0, 0x8000, 0x8000) -AVR_MCU ("atmega808", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATmega808__", 0x3c00, 0x0, 0x2000, 0x4000) -AVR_MCU ("atmega809", ARCH_AVRXMEGA3, AVR_ISA_RCALL, "__AVR_ATmega809__", 0x3c00, 0x0, 0x2000, 0x4000) -AVR_MCU ("atmega1608", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATmega1608__", 0x3800, 0x0, 0x4000, 0x4000) -AVR_MCU ("atmega1609", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATmega1609__", 0x3800, 0x0, 0x4000, 0x4000) -AVR_MCU ("atmega3208", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATmega3208__", 0x3000, 0x0, 0x8000, 0x4000) -AVR_MCU ("atmega3209", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATmega3209__", 0x3000, 0x0, 0x8000, 0x4000) -AVR_MCU ("atmega4808", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATmega4808__", 0x2800, 0x0, 0xc000, 0x4000) -AVR_MCU ("atmega4809", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_ATmega4809__", 0x2800, 0x0, 0xc000, 0x4000) -AVR_MCU ("avr16dd14", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16DD14__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr16dd20", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16DD20__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr16dd28", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16DD28__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr16dd32", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16DD32__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr16du14", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16DU14__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr16du20", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16DU20__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr16du28", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16DU28__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr16du32", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16DU32__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr32da28", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32DA28__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32da32", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32DA32__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32da48", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32DA48__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32db28", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32DB28__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32db32", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32DB32__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32db48", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32DB48__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32dd14", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32DD14__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32dd20", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32DD20__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32dd28", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32DD28__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32dd32", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32DD32__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32du14", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32DU14__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32du20", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32DU20__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32du28", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32DU28__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32du32", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32DU32__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr16eb14", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16EB14__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr16eb20", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16EB20__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr16eb28", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16EB28__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr16eb32", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16EB32__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr16ea28", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16EA28__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr16ea32", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16EA32__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr16ea48", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR16EA48__", 0x7800, 0x0, 0x4000, 0x8000) -AVR_MCU ("avr32ea28", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32EA28__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32ea32", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32EA32__", 0x7000, 0x0, 0x8000, 0x8000) -AVR_MCU ("avr32ea48", ARCH_AVRXMEGA3, AVR_ISA_NONE, "__AVR_AVR32EA48__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avrxmega3", ARCH_AVRXMEGA3, AVR_ISA_NONE, NULL, 0x3f00, 0x0, 0x8000, 0) +AVR_MCU ("attiny202", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny202__", 0x3f80, 0x0, 0x800, 0x8000) +AVR_MCU ("attiny204", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny204__", 0x3f80, 0x0, 0x800, 0x8000) +AVR_MCU ("attiny402", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny402__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny404", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny404__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny406", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny406__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny804", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny804__", 0x3e00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny806", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny806__", 0x3e00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny807", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny807__", 0x3e00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny1604", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny1604__", 0x3c00, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny1606", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny1606__", 0x3c00, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny1607", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny1607__", 0x3c00, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny212", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny212__", 0x3f80, 0x0, 0x800, 0x8000) +AVR_MCU ("attiny214", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny214__", 0x3f80, 0x0, 0x800, 0x8000) +AVR_MCU ("attiny412", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny412__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny414", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny414__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny416", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny416__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny416auto", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny416AUTO__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny417", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny417__", 0x3f00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny814", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny814__", 0x3e00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny816", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny816__", 0x3e00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny817", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny817__", 0x3e00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny1614", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny1614__", 0x3800, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny1616", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny1616__", 0x3800, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny1617", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny1617__", 0x3800, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny3214", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny3214__", 0x3800, 0x0, 0x8000, 0x8000) +AVR_MCU ("attiny3216", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny3216__", 0x3800, 0x0, 0x8000, 0x8000) +AVR_MCU ("attiny3217", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny3217__", 0x3800, 0x0, 0x8000, 0x8000) +AVR_MCU ("attiny424", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny424__", 0x3e00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny426", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny426__", 0x3e00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny427", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny427__", 0x3e00, 0x0, 0x1000, 0x8000) +AVR_MCU ("attiny824", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny824__", 0x3c00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny826", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny826__", 0x3c00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny827", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATtiny827__", 0x3c00, 0x0, 0x2000, 0x8000) +AVR_MCU ("attiny1624", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny1624__", 0x3800, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny1626", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny1626__", 0x3800, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny1627", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny1627__", 0x3800, 0x0, 0x4000, 0x8000) +AVR_MCU ("attiny3224", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny3224__", 0x3400, 0x0, 0x8000, 0x8000) +AVR_MCU ("attiny3226", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny3226__", 0x3400, 0x0, 0x8000, 0x8000) +AVR_MCU ("attiny3227", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATtiny3227__", 0x3400, 0x0, 0x8000, 0x8000) +AVR_MCU ("atmega808", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATmega808__", 0x3c00, 0x0, 0x2000, 0x4000) +AVR_MCU ("atmega809", ARCH_AVRXMEGA3, AVR_CVT | AVR_ISA_RCALL, "__AVR_ATmega809__", 0x3c00, 0x0, 0x2000, 0x4000) +AVR_MCU ("atmega1608", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATmega1608__", 0x3800, 0x0, 0x4000, 0x4000) +AVR_MCU ("atmega1609", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATmega1609__", 0x3800, 0x0, 0x4000, 0x4000) +AVR_MCU ("atmega3208", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATmega3208__", 0x3000, 0x0, 0x8000, 0x4000) +AVR_MCU ("atmega3209", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATmega3209__", 0x3000, 0x0, 0x8000, 0x4000) +AVR_MCU ("atmega4808", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATmega4808__", 0x2800, 0x0, 0xc000, 0x4000) +AVR_MCU ("atmega4809", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_ATmega4809__", 0x2800, 0x0, 0xc000, 0x4000) +AVR_MCU ("avr16dd14", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16DD14__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr16dd20", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16DD20__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr16dd28", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16DD28__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr16dd32", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16DD32__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr16du14", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16DU14__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr16du20", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16DU20__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr16du28", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16DU28__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr16du32", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16DU32__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr32da28", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32DA28__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32da32", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32DA32__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32da48", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32DA48__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32db28", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32DB28__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32db32", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32DB32__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32db48", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32DB48__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32dd14", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32DD14__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32dd20", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32DD20__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32dd28", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32DD28__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32dd32", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32DD32__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32du14", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32DU14__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32du20", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32DU20__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32du28", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32DU28__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32du32", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32DU32__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr16eb14", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16EB14__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr16eb20", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16EB20__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr16eb28", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16EB28__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr16eb32", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16EB32__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr16ea28", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16EA28__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr16ea32", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16EA32__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr16ea48", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR16EA48__", 0x7800, 0x0, 0x4000, 0x8000) +AVR_MCU ("avr32ea28", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32EA28__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32ea32", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32EA32__", 0x7000, 0x0, 0x8000, 0x8000) +AVR_MCU ("avr32ea48", ARCH_AVRXMEGA3, AVR_CVT, "__AVR_AVR32EA48__", 0x7000, 0x0, 0x8000, 0x8000) /* Xmega, 64K < Flash <= 128K, RAM <= 64K */ AVR_MCU ("avrxmega4", ARCH_AVRXMEGA4, AVR_ISA_NONE, NULL, 0x2000, 0x0, 0x11000, 0) AVR_MCU ("atxmega64a3", ARCH_AVRXMEGA4, AVR_ISA_NONE, "__AVR_ATxmega64A3__", 0x2000, 0x0, 0x11000, 0) @@ -417,14 +417,14 @@ AVR_MCU ("atxmega64b1", ARCH_AVRXMEGA4, AVR_ISA_RMW, "__AVR_ATxmega64B1__" AVR_MCU ("atxmega64b3", ARCH_AVRXMEGA4, AVR_ISA_RMW, "__AVR_ATxmega64B3__", 0x2000, 0x0, 0x11000, 0) AVR_MCU ("atxmega64c3", ARCH_AVRXMEGA4, AVR_ISA_RMW, "__AVR_ATxmega64C3__", 0x2000, 0x0, 0x11000, 0) AVR_MCU ("atxmega64d4", ARCH_AVRXMEGA4, AVR_ISA_NONE, "__AVR_ATxmega64D4__", 0x2000, 0x0, 0x11000, 0) -AVR_MCU ("avr128da28", ARCH_AVRXMEGA4, AVR_ISA_FLMAP, "__AVR_AVR128DA28__", 0x4000, 0x0, 0x20000, 0) -AVR_MCU ("avr128da32", ARCH_AVRXMEGA4, AVR_ISA_FLMAP, "__AVR_AVR128DA32__", 0x4000, 0x0, 0x20000, 0) -AVR_MCU ("avr128da48", ARCH_AVRXMEGA4, AVR_ISA_FLMAP, "__AVR_AVR128DA48__", 0x4000, 0x0, 0x20000, 0) -AVR_MCU ("avr128da64", ARCH_AVRXMEGA4, AVR_ISA_FLMAP, "__AVR_AVR128DA64__", 0x4000, 0x0, 0x20000, 0) -AVR_MCU ("avr128db28", ARCH_AVRXMEGA4, AVR_ISA_FLMAP, "__AVR_AVR128DB28__", 0x4000, 0x0, 0x20000, 0) -AVR_MCU ("avr128db32", ARCH_AVRXMEGA4, AVR_ISA_FLMAP, "__AVR_AVR128DB32__", 0x4000, 0x0, 0x20000, 0) -AVR_MCU ("avr128db48", ARCH_AVRXMEGA4, AVR_ISA_FLMAP, "__AVR_AVR128DB48__", 0x4000, 0x0, 0x20000, 0) -AVR_MCU ("avr128db64", ARCH_AVRXMEGA4, AVR_ISA_FLMAP, "__AVR_AVR128DB64__", 0x4000, 0x0, 0x20000, 0) +AVR_MCU ("avr128da28", ARCH_AVRXMEGA4, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR128DA28__", 0x4000, 0x0, 0x20000, 0) +AVR_MCU ("avr128da32", ARCH_AVRXMEGA4, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR128DA32__", 0x4000, 0x0, 0x20000, 0) +AVR_MCU ("avr128da48", ARCH_AVRXMEGA4, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR128DA48__", 0x4000, 0x0, 0x20000, 0) +AVR_MCU ("avr128da64", ARCH_AVRXMEGA4, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR128DA64__", 0x4000, 0x0, 0x20000, 0) +AVR_MCU ("avr128db28", ARCH_AVRXMEGA4, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR128DB28__", 0x4000, 0x0, 0x20000, 0) +AVR_MCU ("avr128db32", ARCH_AVRXMEGA4, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR128DB32__", 0x4000, 0x0, 0x20000, 0) +AVR_MCU ("avr128db48", ARCH_AVRXMEGA4, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR128DB48__", 0x4000, 0x0, 0x20000, 0) +AVR_MCU ("avr128db64", ARCH_AVRXMEGA4, AVR_CVT | AVR_ISA_FLMAP, "__AVR_AVR128DB64__", 0x4000, 0x0, 0x20000, 0) /* Xmega, 64K < Flash <= 128K, RAM > 64K */ AVR_MCU ("avrxmega5", ARCH_AVRXMEGA5, AVR_ISA_NONE, NULL, 0x2000, 0x0, 0x11000, 0) AVR_MCU ("atxmega64a1", ARCH_AVRXMEGA5, AVR_ISA_NONE, "__AVR_ATxmega64A1__", 0x2000, 0x0, 0x11000, 0) diff --git a/gcc/config/avr/avr.cc b/gcc/config/avr/avr.cc index 9454cb933d7..9bfb3785ddb 100644 --- a/gcc/config/avr/avr.cc +++ b/gcc/config/avr/avr.cc @@ -11651,7 +11651,7 @@ avr_pgm_check_var_decl (tree node) attributes named NAME, where NAME is in { "signal", "interrupt" }. */ static void -avr_handle_isr_attribute (tree, tree *attrs, const char *name) +avr_handle_isr_attribute (tree node, tree *attrs, const char *name) { bool seen = false; @@ -11661,9 +11661,14 @@ avr_handle_isr_attribute (tree, tree *attrs, const char *name) seen = true; for (tree v = TREE_VALUE (list); v; v = TREE_CHAIN (v)) { - if (! avr_isr_number (TREE_VALUE (v))) + int num = avr_isr_number (TREE_VALUE (v)); + if (! num) error ("attribute %qs expects a constant positive integer" " argument", name); + if (TARGET_CVT + && num >= 4) + error ("vector number %d of %q+D is out of range 1%s3 for" + " compact vector table", num, node, "..."); } } diff --git a/gcc/config/avr/avr.opt b/gcc/config/avr/avr.opt index ce6a8db9508..0184b40f4e5 100644 --- a/gcc/config/avr/avr.opt +++ b/gcc/config/avr/avr.opt @@ -26,6 +26,10 @@ mcall-prologues Target Mask(CALL_PROLOGUES) Optimization Optimization. Use subroutines for function prologues and epilogues. +mcvt +Target Mask(CVT) +Use a startup code with a compact vector table. + mmcu= Target RejectNegative Joined Var(avropt_mmcu) MissingArgError(missing device or architecture after %qs) -mmcu=<MCU> Select the target MCU. diff --git a/gcc/config/avr/gen-avr-mmcu-specs.cc b/gcc/config/avr/gen-avr-mmcu-specs.cc index 14d6f41262d..fa085efaae4 100644 --- a/gcc/config/avr/gen-avr-mmcu-specs.cc +++ b/gcc/config/avr/gen-avr-mmcu-specs.cc @@ -136,7 +136,7 @@ struct McuInfo const avr_arch_t *arch; bool is_arch, is_device; bool flmap, have_flmap2, have_flmap4, have_flmap; - bool rodata_in_flash; + bool rodata_in_flash, have_cvt; // Device name as used by the vendor, extracted from "__AVR_<Name>__". char mcu_Name[50] = { 0 }; @@ -149,7 +149,8 @@ struct McuInfo have_flmap (flmap && (have_flmap2 || have_flmap4)), rodata_in_flash (arch_id == ARCH_AVRTINY || (arch_id == ARCH_AVRXMEGA3 - && have_avrxmega3_rodata_in_flash)) + && have_avrxmega3_rodata_in_flash)), + have_cvt (mcu->dev_attribute & AVR_CVT) { if (is_device) snprintf (mcu_Name, 1 + strlen (mcu->macro) - strlen ("__AVR_" "__"), @@ -273,7 +274,12 @@ print_mcu (const avr_mcu_t *mcu, const McuInfo &mi) if (mi.is_device) { fprintf (f, "*avrlibc_startfile:\n"); - fprintf (f, "\tcrt%s.o%%s", mcu->name); + fprintf (f, "\t%%{!mcvt:crt%s.o%%s}", mcu->name); + if (mi.have_cvt) + fprintf (f, " %%{mcvt:crt%s-cvt.o%%s}", mcu->name); + else + fprintf (f, " %%{mcvt:%%e%s does not support a compact vector" + " table (-mcvt)}", mi.mcu_Name); fprintf (f, "\n\n"); fprintf (f, "*avrlibc_devicelib:\n"); diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index dddde54a287..fe4ec0d5db9 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -905,7 +905,7 @@ Objective-C and Objective-C++ Dialects}. [+@var{bti}]|@var{bti}[+@var{pac-ret}[+@var{leaf}]]} @emph{AVR Options} (@ref{AVR Options}) -@gccoptlist{-mmcu=@var{mcu} -mabsdata -maccumulate-args +@gccoptlist{-mmcu=@var{mcu} -mabsdata -maccumulate-args -mcvt -mbranch-cost=@var{cost} -mfuse-add=@var{level} -mfuse-move=@var{level} -mcall-prologues -mgas-isr-prologues -mint8 -mflmap -mdouble=@var{bits} -mlong-double=@var{bits} @@ -24321,6 +24321,23 @@ integers. The default branch cost is 0. Functions prologues/epilogues are expanded as calls to appropriate subroutines. Code size is smaller. +@opindex mcvt +@item -mcvt +Use a @emph{compact vector table}. Some devices support a CVT +with only four entries: 0=Reset, 1=NMI, 2=Prio1 IRQ, 3=Prio0 IRQs. +This option will link startup code from @code{crt@var{mcu}-cvt.o} +instead of the usual @code{crt@var{mcu}.o}. +Apart from providing a compact vector table, the startup code will set bit +@code{CPUINT_CTRLA.CPUINT_CVT} which enables the CVT on the device. + +When you do not want the startup code to set @code{CPUINT_CTRLA.CPUINT_CVT}, +then you can satisfy symbol @code{__do_cvt_init} so that the respective +code is no more pulled in from @code{lib@var{mcu}.a}. +For example, you can link with @code{-Wl,--defsym,__do_cvt_init=0}. + +The CVT startup code is available since +@w{@uref{https://github.com/avrdudes/avr-libc/issues/1010,AVR-LibC #1010}}. + @opindex mfuse-add @item -mfuse-add @itemx -mno-fuse-add