- Important information
- New features
- Known problems
- Program corrections
- User guide corrections
- Miscellaneous
- Release history
Important information
-
Now the expansion of a C functionlike preprocessor macro treats the first symbol as a label if the macro is situated in the first column on a line.
-
If you are using the DLIB library, a library configuration file is used to configure what parts to include in a library when building it. Items that can be configured is include file descriptor support, locale support, and other library features. The library configuration file must also be used when building the application that will use the library, to ensure that the standard header files will be used in the same way as when the library was built. For all prebuilt libraries in the avr\lib directory, there is a library configuration file (.h ) with the same name.
When using IAR Embedded Workbench, the correct library configuration file will be selected automatically. When building on the command line, you must make sure that the correct configuration file is used. For example, if the application will be linked with the library ...\avr\lib\dlib\dlavr-3s-ec-f.r90, each compilation must use the corresponding library configuration file ...\avr\lib\dlib\dlavr-3s-ec-f.h.
iccavr --dlib_config <file> ...\avr\lib\dlib\dlavr-3s-ec-f.h file.c
-
To allow the XLINK linker to exclude modules from the produced object code, all cstartup/_exit modules are now library modules and set to noroot. When linking an application from the command line, the command line option -s __program_start must be given to the XLINK linker to make it include the cstartup library code.
-
The cpu name to use with XLINK and XLIB is "a90", for example
-ca90
-
An assignment to a bitfield always generates a write access, sometimes also a read access.
-
The generic memory model currently does not work. It has therefore been disabled in the compiler and in IAR Embedded Workbench. However, the __generic pointer type does work.
-
Remember that it is not possible to use a CSTARTUP module designed for the A90 IAR C Compiler (V1.xx). You must adapt the CSTARTUP module supplied with this version of the compiler. The main reasons for this is that the IAR C/C++ Compiler for AVR supports EC++, and that it uses a new method for segment initialization.
Upgrade information
-
Upgrading from A90 IAR Embedded Workbench
See the AVR IAR Embedded Workbench IDE Migration Guide .
New features
- None
Known Problems
-
[EWAVR-760, EW21898] In rare cases, an internal error might be generated. If disabling cross call remedies this, the real problem might be in another optimization. Enable cross call and add --no_interprocedural_relays to the command line.
-
[EWAVR-609, EW19831] __require() does not work well together with variable clustering. Use #pragma required instead.
-
[EWAVR-586, EW19253] #pragma optimize = s and #pragma optimize = z can only be used at the high optimization level.
-
[EWAVR-387, EW16889] It is possible to create __io pointers, but it is only the constant pointers that will work.
-
[EWAVR-332, EW16012] It is not allowed to take the address of a __regvar variable, but instead of an error message, an internal error is issued.
-
[EWAVR-331, EW15952] In the ATtiny26 target, the LPM Rd,Z instruction is not allowed, even though the Atmel documentation says it is.
-
[EWAVR-289, EW15253] The information about the --lock_regs option and the number of registers that can be safely locked in various situations is incomplete in the AVR IAR C/C++ Compiler Reference Guide.
-
[EWAVR-219, EW13969] The compiler accepts the syntax for placing a structure into registers but fails with an internal error or does not produce correct code. However, it works to place a bitfield struct, which is not larger than a register/byte, into a __regvar register.
-
[EWAVR-75, EW10911] A pointer to a static member function cannot be used as a flash pointer initializer. This is correct. The problem is that the error message is not clear enough.
Fatal Error[Ta015]: Cannot write to flash memory
-
AVRC0028: --initializers_in_flash is incorrectly always used when -y is selected.
-
AVRC0015: Located initialized constant variables that are placed in the I/O memory area are not initialized.
-
AVRC0003: (partially resolved) Structure copying when using the large memory model with more than nine registers locked will cause an internal error with the message:
Internal Error: [CgDriver]: Coloring failed
If the address calculations for the source or destination structure are non-trivial, the compiler might crash when locking more than five registers. Workaround: Lock fewer (nine or five) registers.
-
LB263: Objects referenced only from inline assembler statements will incorrectly be removed. Workaround: Use the __require intrinsic function to create a reference to the object, or use the __root attribute on the object. Place the intrinsic call close to your inline assembler code.
Program Corrections
None
User guide corrections
AVR® IAR C/C++ Compiler Reference Guide, CAVR-10
- None
Miscellaneous
- Nothing.
Release history
7.20.3 - Service Pack - 2019-06-19
New features
- None
Program corrections
-
[EWAVR-985] The peephole optimization sometimes optimizes a BST, BLD pair incorrectly.
7.20 - 2018-12-18
New features
- None
Program corrections
None
7.10.7 - Service Pack - 2018-07-09
New features
- None
Program corrections
-
[EWAVR-967] A growing stack frame can cause an internal error.
-
[EWAVR-964] The assembly level optimization is parsable expression does not use the same underlying type as the assembler. This results in incorrect code.
7.10.6 - Service Pack - 2018-03-22
New features
- None
Program corrections
-
[EWAVR-963] Empty switch cases might crash the compiler on optimization level none.
-
[EWAVR-959] Casts between __farflash and __generic produced incorrect code.
7.10.5 - Service Pack - 2018-01-18
New features
- None
Program corrections
-
[EWAVR-955] The DLIB routine _large_write_P had the name _FORMATTED_WRITE_P.
7.10.4 - Service Pack - 2017-11-28
New features
- None
Program corrections
-
[EWAVR-954] Multiple accesses using negative offsets on the same pointer can result in incorrect code.
7.10.3 - Service Pack - 2017-10-24
New features
- None
Program corrections
- None
7.10 - 2017-05-19
New features
- A large number of device header files have been updated.
Program corrections
EW26510: The bit OCF1A has been added to the iotiny15.inc file.
EW26442: There was a missing CFI command in the l04.s90 file.
6.80.7 - Service Pack - 2016-12-20
New features
- None
Program corrections
- None
6.80.6 - Service Pack - 2016-11-14
New features
- None
Program corrections
- None
6.80.5 - Service Pack - 2016-09-29
New features
- None
Program corrections
EW26250: Some incorrect UTF-8 checks could result in an internal error.
6.80.4 - Service Pack - 2016-08-24
New features
- None
Program corrections
EW26190: The #pragma weak directive has been corrected.
6.80.2 - Service Pack - 2016-06-17
New features
- None
Program corrections
EW26103: Using the intrinsic function __swap_nibbles could cause an internal error.
6.80 - 2016-06-01
New features
-
Extended functionality in C-STAT
Two new packages of checks: CERT and SECURITY.
The MISRA C:2012 package has been updated with about 90 new checks, of which some are enabled by default.
The analysis engine has been improved to increase the analysis precision for both existing and added coding rules. This can have the effect that the number of issued messages for a file or project can differ compared to previous versions of C-STAT, even if the enabled checks are exactly the same.
There is a new option to enable or disable the false-positives elimination phase of the analysis that is performed on each source file. (
--fpe
when usingicstat.exe
, or Enable false-positive analysis when using C-STAT in the IAR Embedded Workbench IDE.)There is a new option (
--exclude path
) to exclude files from analysis.C-STAT message suppression can now be controlled by directives placed in comments in the source files. See Descriptions of compiler extensions for C-STAT in the C-STAT Static Analysis Guide.
C-STAT settings in an old IAR Embedded Workbench IDE or Eclipse project will be updated. Some checks will be renamed (they retain their enabled or disabled settings), some checks are removed, and many new checks are added (see above).
Importing settings for C-STAT checks from a file will use the same logic as used when updating the project settings, if the settings file is created with an old version of C-STAT.
Program corrections
EW26055: On High optimization static variables can be optimized incorrectly, if there are no visible reads from the variable in the translation unit and the address of the variable occurs in the initializer of another variable and the address has been cast to an integer type.
6.70.5 - Service Pack - 2016-04-11
New features
- None
Program corrections
EW26020: Some rotate patterns could cause an internal error.
6.70.4 - Service Pack - 2016-04-01
New features
- None
Program corrections
EW26008: Pointer offsets, on assembler level, could be optimized incorrectly if the Cross call transformation was disabled.
6.70.2 - Service Pack - 2016-02-25
New features
- None
Program corrections
EW25934: Some multiply and addition patterns could result in an internal error.
6.70 - 2015-11-10
New features
- None
Program corrections
EW25755: On ATxmega devices, operations that wrote exact multiples of 256 bytes to the eeprom memory never finished.
6.60.3 - Service Pack - 2015-08-31
New features
- None
Program corrections
EW25661: Using the __noreturn attribute could result in an internal error.
6.60.2 - Service Pack - 2015-06-22
New features
- None
Program corrections
EW25485: Restored a SBI/CBI code optimization that was missing in 6.50.1.
6.60 - 2015-05-29
New features
- None
Program corrections
EW25283: Initializer constants for aggregate variables with auto storage duration can be placed in the wrong memory.
EW25272: MISRA-C:2004 rule 10.1 in the compiler can complain if the left operand of an assignment is an enum type even though the right operand has identical type.
-
EW12108: Stack information usage is reported incorrectly for __interrupt functions that call other functions. [2017-11-21]
-
EW11611: Calculation of maximum stack usage can give a too large result. [2017-11-21]
6.50.2 - Service Pack - 2015-01-30
New features
- None
Program corrections
EW25187: Writing single bits to the __eeprom could result in an internal error.
6.50 - 2014-11-25
New features
- None
Program corrections
- None
6.40.2 - Service Pack - 2014-06-30
New features
- None
Program corrections
EW24701: Stores to a bitfield member in an auto variable (V) may be optimized incorrectly, if 1) there are multiple stores in the same basic block, 2) the initial store assigns the N least significant bits, 3) the value V is assigned are the N least significant bits from an other bitfield variable, and 4) the type of V is no wider than the bitfield type.
6.40 - 2014-05-20
New features
- None
Program corrections
EW24653: On high optimization an auto structure member assigned a masked value (x.y = expr & 0x55) can be optimized incorrectly if 1) the function contains just one other use of the structure member, 2) that use is in a test, and 3) the structure (x) is used in a structure assignment, passed as a function argument, or accessed indirectly.
6.30.2 - Service Pack - 2014-01-29
New features
- None
Program corrections
EW24411: A link error that was reported when the keyword __eeprom was used with ATxmega devices no longer occurs.
6.30 - 2013-12-13
New features
-
Compiler optimizations
Improved optimizations will give faster execution of target code and smaller code size. -
#pragma default_variable_attributes and #pragma default_function_attributes
Two new pragma directives have been added to set default placement and attributes for variable/function declarations and definitions. This means that you can override multiple declarations and definitions by using a single pragma directive.
Program corrections
EW23979: The compiler crashes on low optimization if a variable in a function is assigned a masked value or the variable is a bitfield and the only use further on is a test of the variable against 0.
EW23977: The compiler makes an internal error after an error for a redefinition of a variable with a compactable initializer.
6.21.3 - Service Pack - 2013-10-08
New features
- None
Program corrections
EW24206: The memory attribute __eeprom was not correctly implemented for these devices: ATxmega8E5, ATxmega16E5, and ATxmega32E5.
EW24168: The command line option --enable_external_bus did not use the correct register for these devices: ATmega128, ATmega128A, ATmega64, and ATmega64A.
6.21 - 2013-05-23
New features
- None
Program corrections
EW23904: The CRC module, has been added to these files: ATxmega64D3.h, ioxm64d3.sfr, ATxmega128D3.h, ioxm128d3.sfr, ATxmega192D3.h, ioxm192d3.sfr, ATxmega256D3.h, ioxm256d3.sfr
EW23799: Loops containing indirect assignments where the address expression consists of both loop dependent variables and loop invariant variables can be optimized incorrectly if the loop is followed by an assignment to the same address expression.
6.20.2 - Patch release - 2013-03-04
New features
- None
Program corrections
- None
6.20 - 2013-01-16
New features
- None
Program corrections
EW23331: Expressions containing an indirect read through a pointer expression could under some circumstances be optimized incorrectly, if the expression occurred after a loop and an indirect read or write to the same address occurred before the loop. This has been corrected.
EW23260: Using the #pragma weak directive to create aliases now works for UBROF targets as well as for ELF targets.
6.12.3 - Patch release - 2012-09-18
New features
- None
Program corrections
- None
6.12.2 - Patch release - 2012-09-13
New features
- None
Program corrections
EW23437: A forced inline function can now be inlined if it contains an assembler statement.
6.12 - 2012-06-20
New features
- None
Program corrections
EW23210: The optimizer could make incorrect assumptions about the contents of memory cells accessed indirectly through pointer variables if the accesses occured before and after a pretested loop containing a function call.
EW23176: The BODACT bit, in the ATxmega128A1.h file, is now located in the correct register.
EW23159: No debug information was output for module local (and function local) anonymous union/struct variables.
EW23138: An inline function cannot be root as well.
EW23136: A variable, with a struct type containing a flexible array member, that was placed as auto or as a parameter could make the compiler generate a fatal error. This has been fixed.
EW23065: Switch statements could be optimized incorrectly if the switch expression was a truncating cast of a scalar variable or if the variable was masked with 0xff or 0xffff.
EW23062: Copying a structure from __eeprom could result in an internal error. This has been corrected.
EW22951: In the iotiny80.h file, the bit names for the PORTD registers are now correctly named.
EW22943: Using multi-file-compilation (--mfc) with files that use inline assembler statements could result in an internal error.
EW22740: Using designated initializers with anonymous unions/structs could result in incorrect initialization in some cases. When more than one item designated a member of the same anonymous struct, and a later item included a brace-enclosed initializer for an aggregate member, previous initializers for that struct were ignored.
Example:union u { unsigned char array[4]; struct { unsigned char c; unsigned char darr[3]; }; }; union u var = { .c = 0xAA, .darr = {2,3,4} };
In this case, c was erroneously initialized to 0 instead of to 0xAA. [2013-11-27]EW22735: In very complex situations involving crosscall, crossjump, tailjump, and other optimizations the debug information could be corrupt leading to an internal error. This has been fixed. [2013-11-27]
6.11.2 - Patch release - 2012-04-16
New features
- None
Program corrections
- None
6.11 - 2012-04-16
New features
- None
Program corrections
EW22883: The bits AMP0IS and AMP1IS were missing in the iopwm3b.h file. This has been corrected.
EW22880: The PRR register has been renamed PRR0 in these files: iom164a.h, iom164pa.h, iom324a.h, iom324pa.h, iom644a.h, and iom644pa.h.
EW22827: An illegal instruction has been corrected.
EW22826: Some missing bit definitions have been added to the header files iom16m1.h, iom32c1.h, iom32m1.h, iom64c1.h, and iom64m1.h.
EW22777: The intrinsic function __reverse() has been corrected in regard to how it handles signed long and unsigned int.
EW22759: The NVM_CMD_READ_USER_SIG_ROW_gc macro has been corrected in the header files ATxmega128A3.h, ATxmega192A3.h, ATxmega256A3.h, ATxmega256A3B.h, and ATxmega64A3.h.
EW22689: The compiler no longer warns for a missing vector from an interrupt declaration when it was correctly given for an earlier declaration.
EW22226: In most cases the compiler accepts, as an extension, the use of a constant index into a string literal in constant expressions (example: "foo"[0] as a way of specifying 'f'). In some cases in initializers for aggregates, this construct leads to a syntax error. Example (this gives an error):
char MyArray[2] = { "a"[0], 'b' };
A possible work-around:char MyArray[2] = { ("a")[0], 'b' };
This has been corrected. [2014-05-26]EW21984: When compiling two source files with the --mfc compiler option and the first of them is empty, an internal error is generated. [2018-12-06]
6.10.1 - Patch release - 2011-09-21
New features
- None
Program corrections
EW22682: Atxmega64B1, Atxmega128B1, Atxmega64B3, and Atxmega128B3 were missing the XCH, LAS, LAC, and LAT instructions.
6.10 - 2011-08-29
New features
- None
Program corrections
EW22594: The compiler no longer generates an internal error on the high optimization level.
EW22581: These files were missing the short form bit definitions of PORT: ioat76c712.inc, ioat76c713.inc, iom1284.inc, iom1284p.inc, iom168p.inc, iom168pa.inc, iom16hva2.inc, iom16hvb.inc, iom16u2.inc, iom16u4.inc, iom328.inc, iom328p.inc, iom32hvb.inc, iom32u2.inc, iom32u4.inc, iom48p.inc, iom48pa.inc, iom4hvd.inc, iom88p.inc, iom88pa.inc, iom8hvd.inc, iom8u2.inc, ioscr100.inc, iotiny10.inc, iotiny23u.inc, iotiny4.inc, iotiny40.inc, iotiny43u.inc, iotiny5.inc, iousb162.inc, iousb82.inc, iopwm316.inc, iotiny48.inc, iotiny87.inc, iopwm2b.inc, iom64c1.inc, iopwm161.inc, iopwm81.inc, iopwm2.inc, iotiny13a.inc, iopwm216.inc, iom32m1.inc, iom64m1.inc, iom16m1.inc, iotiny88.inc, iotiny20.inc, iopwm3.inc, iopwm3b.inc, iotiny167.inc, and iom32c1.inc.
EW22230: The EECR register bits have been renamed in these files: iom1284p.sfr, iom1284.sfr, iom1284p.inc, iom1284.inc, iom1284p.h, and iom1284.h.
EW21376: A block-local extern redeclaration of a located variable could cause the variable to act as if it was not located.
Example: __no_init unsigned char arr[16] @ "DEVICE_ID"; int foo(void) { extern unsigned char arr[16]; ... }
arr was not placed in the segment DEVICE_ID, as it should have been.EW21132: The compiler no longer gives MISRA-C:2004 error 5.1 for internal preprocessor symbols longer than 31 characters.
EW21042: The compiler no longer generates an internal error if the semicolon at the end of a function prototype is omitted.
ICCAVR 5.51.6 - Patch release - 2011-05-12
New features
- None
Program corrections
- None
ICCAVR 5.51.5 - Patch release - 2011-04-19
New features
- None
Program corrections
EW22382: A problem with xmega devices when the X register was used to access a bitfield has been corrected.
ICCAVR 5.51.2 - Patch release - 2011-02-11
New features
- None
Program corrections
- None
ICCAVR 5.51.1 - Patch release - 2010-12-21
New features
- None
Program corrections
EW22108: The common subexpression elimination optimization no longer loops.
EW22105: Pointer arithmetics could be incorrectly optimized in loops with a test at the end of the loop body, if the loop variable was smaller than the pointer's index type and it was decremented in the loop body. This has been corrected.
ICCAVR 5.51 - 2010-11-11
New features
- None
Program corrections
EW21759: The compiler could earlier when using -v4/-v6, in some rare instances, never terminate. This has been corrected.
ICCAVR 5.50.2 - Patch release - 2010-06-28
New features
- None
Program corrections
- None
ICCAVR 5.50.1 - Patch release - 2010-05-28
New features
- None
Program corrections
- None
ICCAVR 5.50 - 2010-04-22
New features
- None
Program corrections
EW21628: Many header files had \ instead of / in the include paths.
EW21624: The --root_variables command no longer makes auto variables root.
EW21598: Many corrections have been made to these files: iom128rfa1.inc a>, iom128rfa1.h, iom128rfa1.ddf, and iom128rfa1.sfr.
EW21597: The EVSYS_t struct now has the correct members in these files: ATxmega64D3.h, ATxmega128D3.h, ATxmega192D3.h, ATxmega256D3.h, ATxmega16D4.h, and ATxmega32D4.h.
EW21582: In some cases involving multiple inheritance and virtual base classes, construction vtables for different subclasses could be given identical names resulting in duplicate symbol definition errors when linking.
ICCAVR 5.40.3 - Patch release - 2010-03-19
New features
- None
Program corrections
- None
ICCAVR 5.40.2 - Patch release - 2010-02-19
New features
- None
Program corrections
- None
ICCAVR 5.40.1 - Patch release - 2010-02-08
New features
- None
Program corrections
EW21577: When accessing arrays larger than 256 bytes, the compiler could in rare cases optimize away a 256-byte offset. This has been corrected.
ICCAVR 5.40 - 2009-12-17
New features
- None
Program corrections
EW21385: The ram size declaration is now correct for the ATxmega64a device.
EW21039: The MISRA C checker could generate an internal error if it encountered a simple syntax error in a typedef statement.
ICCAVR 5.30.6 - Patch release - 2009-09-16
New features
- None.
Program corrections
The correction of issue EW21186 was updated to address another instance of the same program error.
ICCAVR 5.30.4 - 2009-08-24
EW21264: The compiler no longer generates an internal error on constant function pointer calls.
ICCAVR 5.30.3 - 2009-08-20
EW21186: A long path will not create an internal error.
ICCAVR 5.30.2 - 2009-07-08
EW21157: The loop optimization no longer moves instructions too far.
ICCAVR 5.30.1 - 2009-07-03
EW21153: Generating code for ATmega32U2, ATmega16U2, and ATmega8U2 will not use the MUL instruction.
ICCAVR 5.30 - 2009-06-12
-
EW21069: Write access to 64-bit data objects located in the __eeprom area are now correct.
-
EW21046: The UDR register has been renamed to UDR0 in these files, iom325.h, iom3250.h, iom645.h, iom6450.h, iom329.h, iom3290.h, iom649.h, and iom6490.h. Associated registers has also been renamed.
-
EW21038: The tools no longer assume that ATtiny43U has an external data bus.
-
EW21037: The bit names in DIDR0 and DIDR1 has been corrected in these files: iom329.h, iom3290.h, iom649.h, iom6490.h, iom329.sfr, iom3290.sfr, iom649.sfr, and iom6490.sfr.
-
EW21036, EW21034: There was register allocation problems when using __eeprom in ATxmega devices.
-
EW20829: Loop optimizations inside switch statements does no longer result in an internal error.
-
EW20874: C/C++ libraries, for the ATXMEGA devices are now included in the KickStart version.
-
EW20833: The definition of SP has been corrected in these files: iotiny48.h, iotiny88.h, iotiny48.sfr, and iotiny88.sfr.
-
EW20808: The file iotiny13a.h was missing some register definitions and some register definition was using an incorrect address. This has been corrected.
-
EW20801, EW20802: All device header files now have matching #pragma language=save and #pragma language=restore directives.
ICCAVR 5.20.7 - Patch release 2009-05-15
-
EW21033, EW21061:There was register allocation problems when using __eeprom in ATxmega devices. This has been corrected.
ICCAVR 5.20.3 - Patch release 2009-02-12
-
EW20798: Using multiple inheritance could lead to stack corruption. This has been corrected.
ICCAVR 5.20 - 2009-01-28
-
EW20216: The registers for USART2 and USART3 were available in the files for ATmega1281 and ATmega2561, these have been removed.
-
EW20217,EW20214: The SPCR and SPSR registers had incorrect bit names in the file: iom1284p.h. This has been corrected.
-
EW20219: The project setup in IAR Embedded Workbench for devices with an external memory bus, but without configuration to use it, did not use the correct linker file. This has been corrected.
-
EW20323: The bit OCF2B in the TIFR2 register was named OCF2b in the files for 164/324/644 and 164p/324p/644p/1284p, this has been corrected. The bits BODS and BODSE in the MCUCR register were not defined in the file for 164/324/644 and 164p/324p/644p, this has been corrected.
-
EW20345: The bits COM4D1 and COM4D0 was missing in the iom32u4.h file. This has been corrected.
-
EW20725,EW20310: The bit PRUSART1 was missing in the iom644p.h file. This has been corrected.
-
EW19956: A auto variable that was assigned the result of a function call could be optimized incorrectly if it had two uses and the second was a partial use. This has been corrected.
-
EW19965: The compiler no longer terminates unexpectedly after emitting an error that indicates an unnecessary 'typename' keyword in a template.
-
EW20158: Statements where a variable was assigned an expression that involved shifts and bitwise and operations could in some cases lead to incorrect optimization. This has been corrected.
-
EW20192: Using a pointer to a member function as a template non-type parameter could crash the compiler. This has been corrected.
-
EW20206: When generating code for the ATxmega devices, accesses using the X pointer was sometimes not generated correctly. This has been corrected.
-
EW20215: An illegal state has been corrected
-
EW20478: Certain operations (typically bit-wise) that involve template static data members of integer type could cause an internal error when compiling template code.
-
EW20587: The register allocation for byte writes to the__eeprom area was not correct for ATxmega targets. This has now been corrected.
-
EW20598: It was not possible to use the device header files, without breaking MISRA C rule 1, this has been corrected.
-
EW20612: A boolean and or or expression where one of the operands was a ! operation could in some cases be optimized incorrecly.
-
EW20614,EW20640,EW20759: Use of the SFR_B_EXT_IO_N macro resulted in an unexpected termination of the compiler. This has been corrected.
-
EW20671: Code like UDR=PORTC_Bit0 could lead to UDR being written more than once. This has been corrected.
-
EW20721: In some very rare cases, a boolean variable assigned true and false on two separate paths of control after a test of the variable could be optimized incorrectly. This has been corrected.
ICCAVR 5.12C3 - Patch release 2008-10-23
-
The register allocation for byte-wise writes to the__eeprom area was not correct for ATxmega targets. This has now been corrected.
ICCAVR 5.11B - Patch release 2008-04-29
- None.
ICCAVR 5.11A - Patch release 2008-03-14
-
EW20021: The bit REGDIS had the wrong name in the following files: iousb82.h and iousb162.h. This has been corrected.
-
EW20018: Storing a single bit, through a post increment pointer, resulted in an internal error. This has been corrected.
-
EW20010: Calling, out of reach, constant function pointers, resulted in a fatal error on the high optimization level. This has been corrected.
-
EW20009: Reading a single bit, through a post increment pointer, resulted in an internal error. This has been corrected.
-
EW20005: The register PCICR was missing in the following files: iom32c1.h, iom32m1.h, iom32c1.sfr, and iom32m1.sfr. This has been corrected.
-
EW19993: The bits BODS, and BODSE had incorrect names in iotiny48.h and iotiny88.h. This has been corrected.
-
EW19976: The bits HWUPI and VBUSTI had incorrect names in the following files: iousb646.h, iousb647.h, iousb1286.h, and iousb1287.h. This has been corrected.
-
EW19957: The files supporting ATtiny48, ATtiny88, ATtiny23U, ATtiny43U, and ATmega1284P were missing. This has been corrected.
ICCAVR V5.10A - 2008-02-06
New features
-
Support has been added for the new Atmel XMEGATM AVR device family.
-
Two new intrinsic functions have been added; __DES_encryption and __DES_decryption. For more information, see User guide corrections .
-
A new version of the DLIB runtime library is used in this version of the product.
-
Support has been added for the following new devices: ATtiny48, ATtiny88, ATtiny23U, ATtiny43U, ATtiny167, ATmega1284P, ATmega32C1, ATmega32M1, ATmega32U4, ATxmega128A1, ATxmega64A1.
Program corrections
-
EW19841: Some register names has been corrected in the files iom164P.h, iom324P.h, and iom644P.h.
-
EW19840: An invalid syntax error could occur then the files iom164P.h, iom324P.h, and iom644P.h were included.
-
EW19753: The pow function no longer looses precision for normal exponents for products with an int integer size of 16-bits. For example the result of 10^6 wasn't 1e6 exactly.
-
EW19746: The compiler could in some rare cases generate an Internal Error when the options code motion and clustering of variable transformations were enabled.
-
EW19743: The compiler generated broken debug information in UBROF when doing multi-file-compilation in combination with --preinclude, resulting in an internal error when loading the result into C-SPY.
-
EW19741: Defining or using variables from different namespaces with the same name in one module could crash or result in references to the wrong variable.
-
EW19737: An internal error related to using the compiler option --mfc has been corrected.
-
EW19643: Some register names has been corrected in the files iom164P.h, iom324P.h, and iom644P.h.
-
EW19642: const and statics could be placed in the same cluster, which resulted in an internal error. This has now been corrected.
-
EW19544: Compiler-generated memberwise copy construction or assignment for a class with a PoD member array was incorrect and could lead to an internal error or incorrect code.
-
EW19505: The bit names in the register UHIEN have been corrected in the following files: iousb646.h, iousb647.h, iousb1286.h, iousb1287.h.
-
EW19366: The interrupt vectors in the file iopwm316.h have been corrected.
-
EW19329: The ec_nomul libraries incorrectly used the MUL instruction in the ?F_MUL_L04 routine.
-
EW19291: The optimizer could in some cases create code that was not interrupt safe.
-
EW19243: The definition of bit 1 in the PRR register has been corrected in the following files: iom6490.h, iom329.h, iom3290.h, iom649.h, iom6490.h, iom329.sfr, iom3290.sfr, iom649.sfr, iom6490.sfr.
-
EW19224: Accessing a struct member could result in an internal error.
-
EW19210: struc accesses could result in incorrect register usage.
-
EW19190: Using __generic pointers could result in an internal error.
-
EW19185: An internal error that could occur at rare occasions while doing multiplications has been corrected.
-
EW19136: In some rare cases, an incorrect optimization was performed. This code generation error was removed in V4.30A.
v4.30F - patch release - 2007-11-14
-
EW19544: Compiler-generated memberwise copy construction or assignment for a class with a PoD member array was incorrect and could lead to an internal error or incorrect code.
v4.30D - patch release - 2007-08-15
-
EW19329: The ec_nomul libraries incorrectly used the MUL instruction in the ?F_MUL_L04 routine.
-
EW19291: The optimizer could in some cases create code that was not interrupt safe.
ICCAVR V4.30C - patch release - 2007-07-06
Program corrections
-
EW19224: Accessing a struct member could result in an internal error. This has now been corrected.
-
EW19210: struct accesses could result in incorrect register usage. This has now been corrected.
ICCAVR V4.30A - 2007-06-07
New features
-
Improved handling of small aggregate types (structures and unions) and registers.
-
A new extended keyword __no_runtime_init has been added to the product. For more information, see manual corrections.
Program corrections
-
EW19128: When using low optimization level, the MUL instruction could be generated even when --disable_mul was used. This has been corrected.
-
EW19158: struct copying, with variable clustering enabled could result in an internal error.
-
EW19095: On low optimization levels a MULS could be generated instead of a FMULS.
-
EW19066: A cast from a __generic pointer to a flash pointer could modify the __generic pointer. This has been corrected.
-
EW19048: The files iopwm2.h, iopwm3.h, iowm2b.h, and iopwm3b.h have been updated to match revision H of Atmel's specification of these devices.
-
EW18976: Nested loops with constant trip counts could be incorrectly optimized. Nested loops should now execute the correct number of iterations.
-
EW18966: The files lnkm644ps.xcl and cfgm644p.xcl now have a correct interrupt vector table size.
-
EW18847: The intrinsic __dgetexp did not generate correct code in all cases, this has now been corrected.
-
EW18827: The alternate bit names for UCSRnA, UCSRnB and UCSRnC when the USART is in SPI master mode has beem added to the files iom2560.h and iom2561.h.
-
EW18800: The erroneous transfer of a supplied memory type attribute to const parameters no longer occurrs.
-
EW18719: The call stack information was broken for code located above 0x4000 on the devices ATmega640, ATmega1280, and ATmega1281.
-
EW18103: The compiler failed to generate a message for an implicit cast of a pointer to an object A into a pointer to an object B, where both A and B are pointers but points to different memories. This has been corrected. [2012-10-16]
-
EW18047: A problem that could cause an internal error when the option --mfc was used has been corrected.
ICCAVR V4.21C - patch release - 2007-01-19
Program corrections
-
EW18737: The stack debug info was incorrect when older versions of the UBROF format were generated on high optimization.
ICCAVR V4.21A - 2007-12-15
New features
-
Support for new devices
Support has been added for the following new Atmel devices:- AT90PWM1, AT90PWM2B, AT90PWM3B
- ATmega8HVA, ATmega16HVA
- ATmega169P, AT mega325P, ATmega3250P, ATmega329P, ATmega3290P
Program corrections
-
EW18529: The SPM intrinsics did not exist for these derivatives: ATtiny13, ATtiny2313, ATtiny24, ATtiny44, ATtiny84, ATtiny25, ATtiny45, ATtiny85, ATtiny261, ATtiny461, and ATtiny861. This has been corrected.
-
EW18528: WGM00, and PWM1X was missing in iotiny261.h, iotiny461.h, and iotiny861.h. This has been corrected.
-
EW18457: The EECR register definition was incorrect in iopwm2.h, iopwm2b.h, iopwm3.h, and iopwm3b.h. This has been corrected.
-
EW18405: The INTVEC size in lnkm329s.xcl, lnkm649s.xcl, lcfgm329.xcl, and lcfgm649.xcl was incorrect. This has now been corrected.
-
EW18293: Unused register variables was removed at the low optimization level, this has now been corrected.
-
EW18190: Now it is possible to use ioavr.h for the ATmega1281.
ICCAVR V4.20D - patch release - 2006-09-29
Program corrections
-
EW18375: The memory attribute __farfunc did not have any effect on an interrupt function. This has now been corrected.
ICCAVR V4.20A - 2006-06-13
Program corrections
-
typedef struct { unsigned char myFlag; float myArray[6]; unsigned char myStatus; } problem; __no_init problem p; void init() { unsigned char i; p.myFlag = 0; p.myStatus = 128; for(i = 0; i < 6; i++) p.myArray[i] = 0.0f; }
The type of code in this example resulted in p.myStatus not being initialized at the high optimization level. This has now been corrected.
-
EW18118: Code sequences where a variable (x) was assigned a negated variable (-y) and both x and -x were used in tests could in some rare cases cause an internal error. Example:
x = -y; if (x > 0) { if (-x > z) ... }
This problem has been corrected.
-
EW18109: Code with explicit casts of __tiny or __io pointers to larger pointer types in struct or union accesses should no longer result in an internal error during optimization.
-
EW18006: Complex test expression that contained multiple tests of specific bits in the same variable, and the subtests were cast to a non-int type, could in some rare cases be optimized incorrectly. For example
if ( (((char)((x & 4) == 4)) && ((char)((x & 2) == 2)) || (((char)((x & 4) == 0)) && ((char)((x & 2) == 0))) { ... }
This has been corrected.
-
EW17960: Some missing bit definitions have been added to the header files iom48.h, iom88.h, and iom168.h
-
EW17927: If two variables with the same size but different signed <-> unsigned are compared, the comparison will be performed as unsigned. In this case,
unsigned 0 < signed -10000 => 0 < 0xFFFFD8F0 ==> true
-
EW17841: Loops where an unsigned loop counter occured on the right hand side of a subtraction or a negation and the result was cast to a larger signed type (by an explicit cast, by integral promotion, or by use as an index in an array expression where the index type was larger than the loop counter) could be optimized incorrectly. This problem has been corrected.
-
EW17835: The subroutine __sendChar in pgmspace.c, which is part of IAR DLIB Library, was not correctly implemented. This has now been corrected.
-
EW17806: The definition of the SP register has been corrected in the header files iotiny25.h, iotiny45.h, and iotiny85.h.
-
EW17765: High optimization could incorrectly remove a truncating cast of a loop counter if the result of the cast was cast to a type with the same size as the loop counter, either explicitly or through integral promotion. This has been corrected.
-
EW17744: The location of located __flash variables could be ignored when clustering of variables was enabled. This has now been corrected.
-
EW17740: The bit definitions of PFRC0A and PFRC0B have been corrected in the header files iopwm2.h, and iopwm3.h
-
EW17639: The code segment end addresses have been corrected in the file cfg5s.xcl.
New features
-
A new extended keyword __nested has been added. This keyword modifies the enter code of an interrupt function to allow for nested interrupts. For more information, see user guide corrections
-
The command-line option --no_path_in_file_macros has been added. It removes the path leaving only the filename for the symbols __FILE__ and __BASE_FILE__.
-
Prebuilt runtime libraries that use the MUL instruction have been added. For more information, see user guide corrections.
ICCAVR V4.12C - patch release - 2006-02-02
Program corrections
-
EW17721: In some rare cases the optimizer incorrectly transformed a for or a while loop to a do loop if
- the loop test compared the loop counter to variable (V) that was invariant in the loop, and
- the loop was preceded by an if-else-if-statement where the else-if-test tested V against a constant value.
This has been corrected.
- EW17698: Using #pragma inline=force on a void typed member function in a base class no longer generates an internal error.
-
EW17692: Post increments and decrements on pointers in the __io area no longer generate an internal error.
-
EW17650: An Internal Error was generated when the the compiler option --version2_calls was used.
ICCAVR V4.12B - patch release - 2005-12-28
Program corrections
-
EW17621: Calls using constant function pointers did not work. An internal error was generated if the address was odd and a jump to an incorrect address would occur if the address was even.
ICCAVR V4.12A - 2005-12-05
Program corrections
-
EW17556: The register definition for ADCH is no longer missing in the io-header files iom325.h, iom3250.h, iom645.h, and iom6450.h.
-
EW17518: The registers for USART1 is now correct in the header files iom164.h and iom324.h.
-
EW17464: The register GIFR has been added to the header files iotiny44.h and iotiny84.h.
-
EW17462: The address of the register TIMSK0 has been corrected in the header files iotiny24.h, iotiny44.h, and iotiny84.h.
-
EW17410: Volatile accesses could accidentally be reordered if:
-
a volatile variable v1 was assigned a variable t, and
-
t was assigned in all immediate preceding basic blocks, and
-
there was another volatile access between the t and v1 assignments.
For example:
typedef ... T; volatile T v1, v2; T t; if (...) t = ...; else t = ...; v2 = ...; v1 = t;
The problem has been corrected.
-
-
EW17404: The memory tracking optimization no longer incorrectly removes store instructions.
-
EW17387: The definitions of the bits UPE3, UPE2, UPE1, and UPE0 now use correct names in the header files iom2560.h and iom2561.h.
-
EW17384: Correct code is now produced when assigning a 1 to a volatile __regvar unsigned char.
-
EW17383: Sometimes at the high optimization level, incorrect pointer offsets could be produced. This has been corrected.
-
EW17333: The addresses of the registers SPMCR and EECR are now correct when compiling for ATMega644.
-
EW17310: The compiler warns about some cases of computing addresses outside objects. Previously, this warning was emitted even when the pointer had been cast to an integer. Now the warning is only emitted when the address is computed as a pointer.
-
EW17264: Dividing a float with 0, no longer results in an internal error at high optimization levels.
-
EW17170: Bit 7 in the USISR register has been corrected in the header files iotiny25.h, iotiny45.h, and iotiny85.h.
-
EW17135: The AIN1D bit name in the DIDR0 register has been corrected in the header files iotiny25.h, iotiny45.h, and iotiny85.h.
-
EW17134: Odd interrupt vectors, no longer result in an internal error.
-
EW17122: The register and bit definitions for the PRR register have been added to the header file iom169.h.
-
EW17121: The name of bit 7 of the PRR register has been corrected from PRTWI to PRTW1 in the header files iom48.h, iom88.h, and iom168.h.
-
EW17119: MISRA C rule 113 states that members of a structure or union shall only be accessed via their name. The compiler failed to diagnose a violation of this rule when a pointer to an element of a member array was created.
Example:
struct { int a; int b[2]; } x; &x.a; /* Was diagnosed */ &x.b[0]; /* Was not diagnosed */
This has now been corrected.
-
EW17115: If the result of a floating point add or sub operation was 0 (zero), the SREG register including the I bit was incorrectly cleared. This caused problems related to interrupts. It has been corrected.
-
EW17108: The file lnkm88s.xcl no longer uses the name m169 internally.
-
EW17103: The interrupt vector definitions in iopwm2.h and iopwm3.h have been corrected.
-
EW17102: Pointer arithmetics no longer results in a range error report from IAR XLINK Linker.
-
EW17031: The DAC register definition in iopwm2.h, and iopwm3.h now uses the correct macro.
-
EW16994: Error Pm067, detecting MISRA C rule 72, is no longer issued for identical declarations of a function with a function-pointer parameter.
-
EW16847: The compiler no longer generate code that result in a negative address. (Added 2010-10-04)
New features
-
Support for new devices
Support has been added for the following new Atmel devices: ATtiny261/461/861, AT76C712, AT76C713. -
Support for M3000
Support has been added for the M3000 device from Intelligent Motion Systems, Inc.
ICCAVR V4.11A - 2005-06-30
Program corrections
-
EW16982: The function __delay_cycles(unsigned long int) now accepts a parameter value of 0xFFFFFFFF.
-
EW16977: The names on bit0 and bit1 in register GTCCR in iom88.h have been corrected.
-
EW16906,EW16920: At optimization level high, incorrect code could be generated if a loop had an unsigned loop counter, the loop counter was decremented, and the loop contained a test (besides the loop exit test) where the loop counter was compared to zero. This has been corrected.
-
EW16916: The intrinsic function __indirect_jump_to now works correctly.
-
EW16907: In some rare cases, the compiler could generate instructions which other parts of the compiler regarded as illegal. This has been corrected.
-
EW16556,EW16797: The following pragma directives are now accepted by the _Pragma operator: #pragma language #pragma diag_suppress #pragma diag_remark #pragma diag_warning #pragma diag_error #pragma diag_default #pragma include_alias
-
EW16771: Sometimes a pointer increment could be optimized away. This has been corrected.
-
EW16752: Some missing bit definitions have been added to the header files iotiny25.h, iotiny45.h, and iotiny85.h
-
EW16745: In some rare cases, the compiler could exchange instructions which did not update flags with an ADIW instruction which does update the flags. This resulted in branches always branching. This has been corrected.
-
EW16629: Including an I/O definition header and referencing more than one SFR from C++ code will no longer result in incorrect "more than one definition for struct/union type" warnings when linking.
-
EW16616: The definition of the PRR register has been added to the file iom165.h.
-
EW16601: When compiling EC++, constant variables initialized with simple floating point expressions now correctly result in compile time initializing instead of runtime initializing.
-
EW16512: An array expression will no longer be incorrectly transformed if it depends on the index variable overflowing: ..., 254, 255, 0, 1, ...
-
EW16063: The debug information for auto variables is now correct also at higher optimization levels than low (-z3).
-
EW15706: Using the static keyword together with the __interrupt keyword no longer generates a warning about the interrupt function not being referenced
New features
-
The calling convention for 64-bit data types has been improved.
-
Support for multiple inheritance and virtual inheritance has been added to IAR Extended EC++.
-
Support has been added for the following new devices: ATtiny24/44/84, ATtiny46/86, ATmega164/324/644, AT90CAN32/64, AT90PWM2, AT90PWM3.
-
The extended keyword __raw has been added.
-
You can now compile several source files in one compilation by specifying the command line option --mfc. The advantage of multi-file compilation is that it gives the interprocedural optimizations a larger set of functions to work on. If you also specify the command line option --discard_unused_publics, the optimization will be further improved because the compiler will assume that there are no references to any symbol from the outside in the compilation, i.e. the compilation unit is the whole application apart from the library.
Use the --mfc option with caution, because it is experimental in this version of the compiler. -
The added predefined preprocessor symbols __SUBVERSION__ and __BUILD_NUMBER__, in the compiler and the assembler, denote the subversion, i.e. the 'C' in 4.21C, and the build number, respectively. The build number is a number that does not necessarily increase with a later released compiler or assembler, i.e. use it only in equality or inequality preprocessor expressions.
-
It is now possible to declare variables in the initialization clause of a for statement, but only in extended language mode. This behavior is according to the C99 and the C++ standards.
-
Some more C99 functionality has been added to the IAR DLIB Library:
- Ctype.h defines isblank as an added function.
- Inttypes.h has been added. Note that only the conversions are included, not the functions.
- Math.h defines the following additions:
- Macros - HUGE_VALF, HUGE_VALL, INFINITY, NAN, FP_INFINITE, FP_NAN, FP_NORMAL, FP_SUBNORMAL, FP_ZERO, MATH_ERRNO, MATH_ERREXCEPT, math_errhandling.
- Typedefs - float_t, double_t
- Macro functions - fpclassify, signbit, isfinite, isinf, isnan, isnormal, isgreater, isless, islessequal, islessgreater, isunordered
- Stdlib.h defines llabs, lldiv, strtoll, strtoull, atoll, strtof, and strtold as added functions.
- Wchar.h defines vfwscanf, vswscanf, vwscanf, wcstof, and wcstolb as added functions.
- Wctype.h defines iswblank as an added function.
ICCAVR V4.10B - 2005-03-07
Program corrections
-
EW16543: The operator _Pragma was only available if language extensions were enabled. Now it is available in all modes.
-
EW16541: Some implicit and explicit cast chains resulted in an internal error.
-
EW16531: The <<= and >>= operators could not handle __regvar declared variables larger than char.
ICCAVR V4.10A - 2005-02-15
Program corrections
-
EW16501: __generic pointers was not correctly dereferenced in the debugger.
-
EW16490: If the default data pointer type did have the same size as the __generic pointer, casts from that pointer type could sometimes be removed. This resulted in an internal error.
-
EW16394: The space allocated for the interrupt vector area in lnkcan128s.xcl were too small.
-
EW16355: The definitions of the PINB bits was the reversed in iom128.h.
-
EW16330: The enable external address bus mechanism did not work for the derivatives that use the XMCRA register instead of the MCUCR register for this task
-
EW16322: The space allocated for the interrupt vector area in cfgcan128.xcl were too small.
-
EW16217: The compiler could sometimes forget the high part of an __ext_io address.
-
EW16080: The compiler used the wrong address for SPMCR when compiling for the AT90CAN128.
-
EW16062: The previus version of the function mktime needed to have 64bit doubles enabled. This has now been corrected.
-
EW15747: A function starting with an if statement, where a logical expression containing at least two variables and a ! is (implicitly) compared to zero, could cause an internal error. This problem has been corrected.
-
EW15488: The index pointer types are now signed.
-
EW15365: Too many errors, caused by missing macros, could result in this error.
Internal Error: [any]: Unexpected exception -
EW15303: Some erroneous function pointer declarations could cause an internal error in the compiler. Example:
void (* __nearfunc fp[1])(void);
-
EW15018,EW15298: In some cases a variable of union type that was assigned and subsequently read twice could be optimized incorrectly, if the sizes of the accesses differ.
union U { char c; int i; } u1, u2; char possibly_incorrect() { union U tmp; tmp.i = u1.i + 2; u2.c = tmp.c; return tmp.c; }
-
EW14493: An unsigned char switch statement gave an internal error for case values larger than 0xff at low optimization levels.
-
AVRC0029: Forward-declared ROOT segments caused a link error with the assembly project, even if the modules containing the forward declarations were not linked into the final executable file.
See also XLINK0185. An example was the cstartup module, which forward-declared the RSTACK and CSTACK segments.
-
AVRC0002: The float_complex and double_complex classes did not work due to an optimization in the library that resulted in a name/macro conflict.
-
AVRG0003: Support for long long integers has now been implemented.
New features
-
IAR Extended EC++ support including:
- C++ templates
- Standard Template Library (STL)
- Namespace
- Full support for memory attributes in C++
- Class memory, multiple heaps etc.
- C++ cast variants static_cast<>, const_cast<>, and reinterpret_cast<>.
- Mutable.
-
Easy configuration of the C/EC++ libraries
The DLIB C/EC++ libraries come in two variants, normal and full. Each variant can be further customized to reach an optimum balance between functionality and size. To allow even more detailed tuning of the libraries, the library configuration and individual source files can be modified. The complete source code and template projects are available to make it easy to rebuild both CLIB and DLIB libraries. -
Compiler optimizations
Improved optimizations will give faster target code execution and smaller code size. -
C99 features
The following C99 features can now be used in the C language if language extensions (-e) are enabled:- Support for the bool data type, if the header stdbool.h has been included.
- _Pragma support. This operator works like the pragma directive and can be used in macro definitions.
- Variadic macro support. You can now write printf-style macros.
- Hexadecimal floating point constants support. This means the ability to exactly specify a floating point constant. The functions strtod(), printf(), and scanf() recognize the syntax.
- The macro definition __func__. If used in a function, it is defined to the name of the function.
- Designated initializers. Using these, you can initialize a specific element in a structure or a specific element in an array.
- Inline functions. The #pragma inline [= forced] directive has been added as well.
- Long long support in the library. For example the functions strtoll(), strtoull() have been added as well as support for them in printf() and scanf().
- The inline keyword. It works as the C++ inline keyword (and the #pragma inline declaration).
- Mixing declarations and statements within the same scope.
- Having a declaration in the initialization expression of a for-loop.
-
A new option --preinclude <file> can be used to make the compiler include the specified include file before it starts to read the source file.
-
The inline assembler operator asm() now supports local labels. Example:
asm("Loop: MOV A, @R0 \n" " DEC R1 \n" " DJNZ R1,Loop");
Note that the definition and the reference of a local label do not necessarily need to be in one asm().
-
The library supports multiple heaps. One heap for each suitable memory.
-
The compiler now makes type-based alias analysis. This can be turned off using the option --no_tbaa.
-
UBROF 10 is now used as format of object files. This requires version 4.58A or higher of the IAR XLINK linker.
-
_Pragma("text") can now be used in any language mode (-e not required).
-
The ISO C/C++ standard does not define a strict order of several accesses to the same variable (or pointer-dereference) between sequence points. The compiler now warns whenever an expression that contains this undefined behaviour can cause a problem. A warning will, for instance, be issued for p + *p++; or *p++ = *p;.
-
The compiler now warns for pointless comparisons. A warning will be issued for instance for if (char > 255).
-
The #pragma segment directive can now be used for declaring a segment multiple times, as long as all declarations for a specific segment have the same memory type attribute and alignment.
ICCAVR V3.20D - 2004-12-01
Program corrections
-
EW16037: The implicit volatile attribute of an __io declared variable was ignored for addresses between 0x60 and 0xFF.
-
EW16036: A fault was introduced when correcting EW15707. This resulted in never taking a branch.
-
EW16035: A fault was introduced when correcting EW15707. This resulted in clearing a __regvar declared variable instead of shifting it.
-
EW16013: The volatile attribute on the __regvar keyword was not recognized at high optimization levels. This resulted in the use of a cached value instead of the real value.
ICCAVR V3.20C - 2004-09-15
Program corrections
-
EW15873: Code like this
temp = ( temp & ~0x0F ) | ( ( temp & 0x03 ) << 2 ) | 0x02
resulted in the '&' operation masking away too much from temp.
-
EW15860: In the iotiny15.h I/O header file, the ADATE bit was called ADFR.
-
EW15858: Logical operations on bits extracted from signed types, could result in incorrect code.
-
EW15851: The call to ?ML_FLASH_SRAM_16EC_8_L07 did not use the '?'.
-
EW15842: The new keyword __ext_io did not work correctly. The address range for the keyword is 0x0100 to 0xFFFF, but the instructions generated were IN and OUT.
-
EW15838: The EIMSK and the EIFR registers were missing from the files iom325.h and iom645.h.
-
EW15820: A volatile read access inside an if statement was moved across another volatile access.
-
EW15791: In the linker command files, the segment CHECKSUM was not placed last. This resulted in incorrect checksum calculation.
-
EW15789: At high optimization levels, the effects of __save_interrupt() and __restore_interrupt() was optimized away.
-
EW15709: A optimization on the stack pointer resulted in corrupt backtrace information.
-
EW15707: The volatile atribute was ignored on __regvar declared variables.
-
EW15676: Some bit definitions had incorrect names and some did not exist at all in the iotiny2313.h file.
-
EW15675: There were some incorrect interrupt vector addresses in iocan128.h.
-
EW15618: Operations on the SREG register in front of an endless loop resulted in removal of the operations.
-
EW15606: In some cases volatile accesses could be reordered. If an auto variable was assigned an arithmetic expression containing a volatile reference and the variable was used once, the variable could be eliminated and the arithmetic expression would be used instead. If the expression where the variable was used also contained a volatile access the evaluation order could be changed. This has been corrected.
ICCAVR V3.20A - 2004-06-17
Program corrections
-
EW15309: When initializing structures that contain a bitfield of type bool as the first of a sequence of bitfields that were placed into the same byte, the compiler generated incorrect initialization values for all the bitfields placed into that byte, except the first bitfield.
-
EW15305: The debug information could be incorrect for stack variables at low optimization levels.
-
EW15249: Some internally used instructions were allowed to be cross-called, which resulted in an internal error.
-
EW15245: The ADC did not have the correct addresses in the iotiny15.h file.
-
EW15189: Arithmetics on 64-bit doubles located in __flash did not always work.
-
EW15188: It was not possible to lock registers and also call __task declared functions.
-
EW15116: The strlen_G() routine returned a count that was too large by one.
-
EW15063: bit0 and bit1 in register GTCCR in iom48.h, iom88.h and iom168.h had the wrong names.
-
EW15045: Initializing an auto struct with only zero's, with processor option -v5, could result in this error :Internal error: [CoreUtil/General]: Illegal state
-
EW15022: A correction introduced in v3.10c broke the redeclaration checking for anonymous structs and unions.
-
EW15020: Targets with the enhanced core but without the MUL instruction, could unintentionally use the MUL instruction.
-
EW14968: There was no range check on located variables.
ICCAVR V3.10C - 2004-02-25
Program corrections
-
EW14945: When sizeof expressions were used in code, the result was always coerced to the size_t type, even when this type could not hold the value. This was a problem with memories that are larger than the default pointer memory and sizeof was used on a type that was larger than what could be placed in the default pointer memory.
-
EW14924: The compiler could sometimes generate wrong variable offsets.
-
EW14920: Error in cfgm88.xcl, top row corrected.
-
EW14904: An illegal optimization on the stack pointer resulted in an internal error.
-
EW14903: The ADC and ADCSRB did not have the correct addresses in the iotiny13.h file.
-
EW14902: Optimizations on the stack pointer could result in an internal error.
-
EW14891: Code like in the following example could crash the compiler at the high optimization level:
void t( void); void main( void) { t(); for(;;) { t(); } }
-
EW14889: If an abstract class has a member variable that is an array of objects requiring construction, the compiler could hit an assertion in the file lower_init.c.
-
EW14879: The cross-jump optimization could sometimes crash.
-
EW14835: The compiler produced wrong code for code like this:
genericPtr = (aVar != 0) ? (char __near*) 100 : (char __flash*) 200;
It now produces an error, but will be corrected in a later release.
-
EW14814: A CPC instruction could sometimes be optimized to a SBCI instruction when it was not correct to do that.
-
EW14813: The compiler did issue an internal error for legal instructions.
-
EW14811: There was no library routines for accessing 64-bit data types in the __eeprom memory.
ICCAVR V3.10B - 2004-01-12
Program corrections
-
EW14797: At the high optimization level, the compiler could do optimizations on the value from a volatile memory access.
ICCAVR V3.10A - 2003-12-16
Program corrections
-
EW14683: When using _Scanf_1, %d was read as %ld
-
EW14640: If a loop contained two or more expressions on the form k*x + m (k and m are constants and x is a loop variable) and the expressions had different types, it could cause an internal error.
-
EW14639: Accessing an array of a struct return value from a function call caused an internal error in some configurations of the compiler.
-
EW14538: Longjmp did not use the correct buffer when using -v6 -ms.
-
EW14491: The floating point expression (a-b)/(c-b) could occasionally be calculated as (a-b)/(b-b) at high optimization levels.
-
EW14381: The locking of registers with --lock_regs was incompatible with the save/restore sequence used by setjmp/longjmp.
-
EW14255: Indexing an array in flash memory could fail at high optimization levels.
-
EW14234: The compiler did a 16-bit compare instead of a 8-bit compare when one operand was a bit-shifted variable casted to an unsigned char.
-
EW14214: The TIMER3_CAPT_vect had the wrong value in iom162.h.
-
EW14119: A bit expression as an argument to a switch statement could generate wrong code at the highest optimization level.
-
EW14103: In some rare cases complex pointer expressions modifying a pointer variable close to a use of the same variable could cause an internal error
-
EW14037: The ioavr.h included the wrong header file for __AT90tiny26__.
-
EW14029: At the highest speed optimization level a branch in a for loop was optimized away.
-
EW14010: It was not possible to mix __segment_begin() and --string_literals_in_flash.
-
EW13970: Code like this:
The h-file: class CTestClass { public: void GetProcedure(void); typedef struct { void (CTestClass::*GetFunc)(void); }test; static __flash test testlist[2]; test __generic *testlistptr; }; The cpp-file: void CTestClass::GetProcedure(void) { (this->*(testlistptr->GetFunc))();
resulted in an internal error.
-
EW13932: A Right shift by 8 could be optimized away at the high optimization level.
-
EW13902: The error: Fatal Error[Ta015]: Cannot write to flash memory. now has a line number.
-
EW13896: Code like this if (SREG & 1 ) could result in this error: Internal Error: [TaInstr::TaInstr]: Illegal arity (not 1) 8
-
EW13895: The include file iom162.h defined PINE as SFR_W, it should have been SFR_B.
-
EW13894: When all the available amount of __tiny memory was used up by the C_STACK (0xA0) in -v1 -mt, the stack pointer got corrupt values.
-
EW13854: It was not possible to call a function declared as __C_task.
-
EW13853: Placing an array in a specific location in farflash memory caused an internal error.
-
EW13849: Huge pointer arithmetic could produce incorrect code. This happened when a huge pointer accessed objects larger than char and the net result of the pointer operation was that the pointer was unchanged.
-
EW13663: The third byte of a huge pointer was not updated by post increment operation.
-
EW13451: Constructs like this #if __HAS_ELPM__ were used in the delivered files, when it should have been #ifdef __HAS_ELPM__
-
EW13385: A while loop could in rare circumstances be optimized into a infinite loop when using clustered variables at the highest size optimization level.
-
EW13304: A case statement in a switch construction could be optimized away at optimization level -s9.
-
EW13301: The compiler could sometimes generate the wrong result for a constant float expression that was casted to unsigned int. This was due to using too few significant digits in the calculation.
-
EW13162: Use of a variable was hoisted across its definition by induction variable elimination.
-
EW13069: Using flash library functions (xxx_P) caused the terminal I/O functions to be referenced.
-
EW13066: Wrong code was generated, when modifying a variable that was part of a common sub-expression elimination optimization.
-
EW11078: The type system did accept an illegal type, __near in this case, when used in a type_attribute pragma directive. This caused a crash in the target code generation.
-
EW10997, EW12327: No debug info was generated for empty 'for' loops. The list file also seemed to be unsynchronized.
-
EW10981: Shift operation in an enum gave an internal error.
typedef enum enum_name { identifier1 = 0x01, identifier2 = identifier1 << 1 } type_name;
-
EW10750: A bad typedef function declaration could crash the compiler:
typedef long (const cl::*PMFI)();
-
EW10704: An internal error was issued when using an SFR as a base address for memory-mapped I/O using an I/O pointer.
io_function((IO_REG*)(&PORTC + 0x20), 0x00);
-
EW10453: The option --dependencies did not produce the intended output.
-
EW11340, EW10400: The -v3 option enables the use of RAMPZ, RAMPZ is at the same address as GIMSK. This caused the compiler to ignore the GIMSK definition.
-
LB393 The linker could often inappropriately generate warning [w6]. This warning could safely be ignored if the names of the types referred to began with one or two underscore (_) characters.
ICCAVR V2.28A - 2002-11-15
Program corrections
-
EW12901: The XMBK definition in the header file iom128.h was missing.
-
EW11429: There was a problem in matching null names read from object files using UBROF7 or earlier with those read in from object files using UBROF8 or later. This could cause spurious type conflict warnings for struct and unions with unnamed fields when one file was compiled as C code and the other as EC++ code.
-
EW11519: The calculation of SFE for the FAR segments was broken when FAR segment extended past a page boundary. The last X byte "hole" between the end of the segment part and the page boundary was not counted. This resulted in the last bytes of the segment not being initialized.
-
EW11792: The optimizer could accidentally combine two expressions with side effects into the same variable. In some cases this could affect the value of the expression.
-
EW11794: Assignments to or from volatile struct types did not work, but resulted in an error.
-
EW11840: The linker command file lnkm128s.xcl contained a placeholder for the size of external EEPROM. The zero value used actually allowed single byte allocation which could cause unexpected results. This has now been corrected.
-
EW11996: Using __AddrToZByteToSPMCR_SPM() at high optimization levels on a derivative with SPMCR on an address other than 0x37, resulted in an internal error.
-
EW12000: The compiler could in some rare cases generate 24-bit arithmetics on __far pointers. The pointer could end up pointing to the wrong 64K page.
-
EW12022: In the header file inavr.h the macro _SPM_24_PAGEWRITE was not correctly defined .
-
EW12033,EW11924: If the first variable in a cluster was an array, some accesses to that array could be interpreted as accesses to other variables in the cluster. In some rare cases this could affect dead code elimination where some assignments to live variables were eliminated incorrectly.
-
EW12125: The module-wise optimizations didn't work on functions placed in the same non-default code segment.
-
EW12225: In some cases loop constructs like
do { ... i++; } while (...a[i]...);
could access array element a[i + 1] in the test.
-
EW12293: A conditional test of an expression that overflowed into the negative domain could give unexpected results.
-
EW12295: C code could incorrectly make use of mangled EC++ names which caused a linker warning.
-
EW12306: The CLIB-defined NULL was ((void*)0) instead of (0) as in DLIB.
-
EW12497: Using the generic pointer in derivatives with the configuration -v3 and --64k_flash, resulted in an internal error.
-
EW11759: Casting to a structure type didn't give an error in C mode.
-
EW11799: An explicit use of the RAMPZ register could be optimized away.
-
EW11871: The compiler could crash if a loop used a complex expression both as a pointer and as an arithmetic expression.
-
EW11872: Right shifts on a signed variable, resulting in an byte shift to the right, was zero extended instead of sign extended.
-
EW11979: The compiler could, in rare circumstances, allot the same stack place for two auto variables. One of the variables should have its address taken and later not be used directly, then the other variable could get its place.
-
EW11997: A variable of struct, union or class type was accepted by the compiler even if it exceeded the maximum size for variables in its memory.
-
EW12059: When one global initialized variable char a=1 ; and one global and huge non-initialized array char b[200]; Both are used in an function, then normally a should be put in a ID segment, and b should be put in an Z segment. However, when compiled with clustering of variables enabled, b was also put in the I segment. This has now been corrected.
-
EW12109: There were no I/O macros that could access 16-bit I/O registers in the extended I/O space.
-
EW12138: There was a possible register conflict when comparing a 16/32-bit integral variable with a constant.
-
EW11928: There were several struct copy routines in the file l07.s90 that made jumps to the wrong support routine.
-
EW12298: Some optimizations sorted data according to the address of dynamic memory addresses, so the optimizations depended on the order and sizes of the dynamic memory returned by the operating system. This could result in different code generated by the compiler depending on the compiler execution environment.
-
EW12315: The compiler made an internal error if an initializer was like: (functionpointer) &structure.member where member wasn't the first element in the struct.
-
EW12346: The intrinsic function __reverse(), caused an internal error when used together with the --enhanced_core option.
-
EW12377,EW12498: In some cases the optimizer could ignore memory attributes on pointer casts, which in turn could result in incorrect assumptions about object content if the same pointer was used to access two objects at the same address but in different memory-types.
-
EW12496: There was a problem in the library routine ?ML_EEPROM_EEPROM_16_16_L07.
-
EW12545: JMP/CALL was not enabled in enhanced core derivatives with <= 8KB code.
-
EW12546: The intrinsic function __indirect_jump_to() could give an internal error if the argument was a constant.
-
EW12651: The use of preprocessor directives in inline assembler commands didn't give a proper error.
-
EW12653: A declaration of certain symbols that are for the compiler implementor, like _A_x where x is the name of a symbol in an anonymous object, could generate a protection fault. An error is now generated instead.
-
EW12578: A structure assignment by means of a pointer could be optimized away at the highest optimization level.
-
EW12595: The optimizer did not take into account that the __delay_cycles() intrinsic function could change the status flags.
-
EW12656: Code like __require((void*)&PORTB); resulted in an internal error, instead of an ordinary error.
ICCAVR V2.27B - 2002-03-15
Program corrections
-
EW11693: switch statements with only a default case resulted in no code generated for the switch statement.
-
EW11692: Pre-decrement on a flash pointer, resulted in an internal error.
ICCAVR V2.27A - 2002-03-8
Program corrections
-
EW11597: Corrected a problem where partial object assignments were interpreted as an assignment of the whole object (union). This could cause incorrect elimination of assignments.
-
EW11547: The EIND register was not reloaded after another function call, when doing a second indirect call using the same function pointer.
-
EW11536: In some cases the side effect from (*ptr)++ was not present in the if statement immediately below
(*ptr)++ if (*(*ptr)++ != 1)
-
EW11441: Using an undefined C data type could lead to an internal error.
-
EW11428: Two internally used structs had mismatched sizes when using different reduced sizes on printf and scanf. This resulted in an XLINK warning.
-
EW11397: Assignments to auto variables within switch statements were incorrectly optimized away at optimization level -z4.
-
EW11338: Loop optimization could cause infinite loops in the generated code. The code in the increment part of a for loop that was incorrectly optimized was:
tempPtr = basePtr + (tempPtr->next << 2) -
EW11335: The compiler thought it was out of memory in some rare situations.
-
EW11332: The compiler produced incorrect code for the code below at high optimization levels.
void SwapBytesInInt(unsigned char *p) { unsigned char a; a = *p; *p = *(p + 1); *(p + 1) = a; }
-
EW11331: The GIMSK (RAMPZ) register was cleared in cstartup after low_level_init(). This could cause problems on mega163 and similar devices. (-v3 and --64k_flash)
-
EW11239: Using global volatile structs could result in an internal error.
-
EW11225: Function pointers did not use the __version_1 calling convention when the --version1_calls command line option was used.
-
EW11156: The 64-bit floating point multiplication was written in a way that was not interrupt safe.
-
EW11081: The low_level_init.c file did not work in EC++ mode. The function must be declared extern "C" as the call from cstartup expects a C function.
-
EW11080: A rarely used optimization caused an internal error.
-
EW11025: Explicit test conditions on the SREG caused a linker range error, due to a wrong address expression.
-
EW10999: The version of the function __segment_init used in the libraries cl0t-ec.r90 and dl0t-ec.r90 had an optimization bug.
-
EW10960: The iomacro.h file lacked SFR support for extended I/O addresses.
-
EW10912: In some cases, the assumptions about the contents of the clustered variables were incorrect. In the places where the data flows for a clustered variable joined (data from different paths flowed into a basic block), the compiler could use the wrong content of other variables in the same cluster. This could result in various incorrect optimizations.
-
EW10892: Assignments to global pointers could be removed by the optimizer at high optimization levels.
-
EW10890: Accessing data by means of a __hugeflash pointer could result in an access with the third byte of the pointer corrupted (zero).
fptr = 0x000000; do { chks += *fptr++; } while( fptr < FLASHEND );
-
EW10802: A shift assignment in a for loop was incorrectly optimized away when followed by an or assignment and the optimization level was 4 or higher.
-
EW10752: The address of a anonymous union or struct was sometimes considered illegal in a constant expression.
-
EW10749: Calls to the __AddrToZByteToSPMCR_LPM intrinsic function resulted in an internal error.
-
EW10745: In some switch routines a DEC was used instead of SUBI. This resulted in that the wrong 'case' was taken.
-
EW10740: __farflash pointers did not work correctly.
-
EW10723: An interrupt service routine could trash R0 when size optimization was used.
-
EW10711: Pointers to the memory-mapped I/O space could result in an internal error.
-
EW10614: In some rare cases the optimizer could incorrectly optimize nested tests of the same variable.
-
EW10613: The optimizer could perform incorrect optimiztions on structure members after a test of another structure member.
-
EW10546: These files had the wrong size set for the internal EEPROM:
config/lnkm323s.xcl config/lnkm323t.xcl src/template/cfgm323.xcl
-
EW10543: In some rare cases the optimizer could crash while optimizing a while or for loop inside a switch.
-
EW10500: The register allocation could be wrong for constructs like this:
unsigned short MemoryGetWord( unsigned int addr ) { unsigned char lo, hi; lo = MemoryGetByte( addr ); hi = MemoryGetByte( addr+1 ); return ((hi*0x100)|lo); }
-
EW10455: __hugeflash pointers did not work correctly.
-
EW10439: An uninitialized variable, created after a return statement, could be optimized away even if it was written to and referred to.
-
AVRC0006: A busy wait loop, with nothing in the body of the loop where the loop condition contained one or more volatile variables, was considered to be dead code if clustering of variables was enabled.
ICCAVR V2.26C - 2001-09-09
Program corrections
-
EW10412: Removed an internal error.
-
EW10411: The compiler could generate wrong code for the statement: longVariable = (((long)charVariable) << 8);
-
EW10409: The intrinsic functions _SPM_ERASE and _SPM_PAGEWRITE could generate incorrect code when compiled with --cpu=m163.
-
EW10408: Static member functions calling intrinsic functions could result in an internal error.
-
EW10407: Removed an internal error.
-
EW10406: An assignment was incorrectly optimized away in expression struct.member = (struct.member + 1) % CONST;
-
EW10084: Static functions can have a tentative attribute, which caused the jump optimization to fail.
-
EW10063: Floating point division could sometimes yield a slightly incorrect result.
-
AVRC0054: When setting a bit in a volatile variable, the compiler incorrectly updated the first byte independent of the size of the variable causing the incorrect code generation, for types larger than char.
-
AVRC0053: Initializing a generic pointer with a constant value could cause a compiler internal error.
-
LB400: A loop of the form for (i=0; i < count; i++); could be executed count + 1 times at the high speed optimization level.
-
AVRC0050: The script file build_one_lib.bat used constructs that are not available in Windows 95/98.
-
AVRC0049: iom32.h defined incorrect interrupt vector addresses.
-
AVRC0048: There was a missing code generation rule for __tinyflash.
-
AVRC0047: Calling a __nearfunc function immediately after a call to a __farfunc function caused an compiler internal error.
-
AVRC0046: Combining __no_init with the __flash keyword caused a internal compiler error.
-
AVRC0045: Postincrement of dereferenced pointers to flash memory (__flash) resulted in an internal error. Example: i = *fptr1++;
-
AVRL0043: The time conversion functions gmtime/mktime/asctime referenced an undefined variable (_Mbstate).
ICCAVR V2.26B - 2001-07-06
Program corrections
-
AVRC0040: The linker command files (.xcl) incorrectly specified the EEPROM_AN segment.
-
AVRC0039: The __Save_interrupt() intrinsic function incorrectly disabled interrupts.
-
AVRC0038: Access of constant pointers to the memory-mapped I/O space could result in the internal error: IE - Illegal State.
-
AVRC0037: The SPI2X bit in the SPI status register (SPSR) was not defined in iom163.h.
-
AVRC0036: Some switch statements could result in faulty optimizations especially when inlined switch tables were used.
-
AVRC0035: Accessing data through generic pointers for FPSLIC incorrectly accessed the RAMPZ register. This register doesn't exist on FPSLIC.
-
AVRC0034: Calling an external function before a function definition in which a locked register variable was used for the first time caused the linker to fail on a consistency check. The generated error message starts with Error [e117]: Incompatible runtime models.
-
AVRC0033: A conditional test of a bit located in the I/O space caused the wrong parts of the code to be executed.
Example:if (PORTA & 0x10) PORTA |= 0x80; /* executed when expression is zero */ else PORTA &= ~0x80; /* never executed */
This problem could possibly affect accesses outside the I/O space as well.
-
AVRG0002: The compiler did not support 64-bit doubles.
-
LB380 & LB396: Using char type as a loop counter variable could cause an internal error for speed optimization levels > 5.
-
LB135: A loop with an empty body could be turned into infinite loop at optimization levels > 3.
ICCAVR V2.25E - 2001-05-04
Program corrections
-
U001128A: The cross-call optimizer has been fine-tuned. This can cause a notable reduction in code size.
-
AVRC0030: Using the __save_interrupt and __restore_interrupt intrinsic functions caused an internal error.
Cause: Code generation rules were missing.
-
AVRC0027: Global and static generic pointers were not initialized correctly if the initial values were pointers to variables in the flash memory.
-
AVRC0021: The registers UCSRB and UCSRA had been swapped in the header files for AT90S2333 and AT90S4333.
-
AVRC0019: The bit definitions for two control bits (ASB and ASRE) in the SPMCR register were missing from the include files for ATmega163 and ATmega83.
-
AVRC0018: Using nested aggregate types (structs and unions) together with the memory attribute __io and located variables (typically SFRs) caused an internal error at optimization level 0.
Related to avrc0014.
-
AVRC0017: The functions strlen_P and strlen_G returned length + 1.
-
AVRC0014: The peephole optimizer tried, in rare circumstances, to remove a statement twice, which was then reported as an internal error.
Related to avrc0018.
-
AVRC0013: The demo compiler failed with an internal error when using processor option 2 and higher and the compiled file contained non-trivial functions.
-
AVRC0012: When compiling with optimization level 6 or higher, calls to the __delay_cycles intrinsic function were considered to be dead code, and were thus removed.
-
AVRC0010: Post-incrementing on a variable used in both the lvalue and rvalue of a statement caused an internal error.
Example:
*destination++ = *destination | *source++;
NOTE: The behavior of the above statement is undefined according to ANSI C (ANSI/ISO9899-1990 6.3).
-
AVRC0009: Using the intrinsic functions __load_program_memory and __extended_load_program_memory caused an internal error.
-
AVRC0008: Trying to write to the flash memory caused an internal error.
-
AVRL0003: ctype.s90 was missing from all IAR CLIB libraries (clXX.r90), which caused all table versions of the isXXXX functions to fail to link.
ICCAVR V2.25B - 2000-10-31
Program corrections
-
Atmel has renamed the registers, bits, and interrupt vector that are related to the I2C-interface in the at94k-devices. The new names are formed by replacing the I2 part of the name with TW. See ioat94k.h for more details.
-
AVRL0002 [20231_IAR]: The inclusion of one floating point function caused the entire floating point package to be included. This caused unused code to be included in the final executable module, increasing the size by approximately 700 bytes.
Cause: The library segment parts were accidentally declared as ROOT segment parts. This was corrected by replacing RSEG CODE with RSEG CODE:CODE:NOROOT in the library.
-
AVRL0001: When you are using locked registers and placing global variables in the locked registers, the linker issues an error:
Error[e117]: Incompatible runtime models. Module ?REGISTER_REGVAR_L10 specifies that 'R15' must be 'VAR', but module ?REGISTER_CGREG_L10 has the value 'REG'
This is due to an error in the library module that contains the inter-module consistency checks for global register variables.
-
AVRC0007: Dereferencing a tinyflash pointer gives an illegal state internal error.
Example:
char __tinyflash* t=(char __tinyflash*)1; *t;
Cause: Code generation rules were missing for __tinyflash.
-
AVRC0006 (Partially corrected): A busy wait loop with nothing in the body of the loop, where the loop condition contained one or more volatile variables, was considered to be dead code if clustering of variables was enabled.
Example:
while(top == read);
where top and read are volatile variables.
This problem has been partially corrected, i.e. the fix has not been validated to completely eliminate the problem.
There are two possible workarounds for this problem. The first is to disable variable clustering in the IAR Embedded Workbench. The second is to make sure that the loop body is not empty, e.g. place a __no_operation() intrinsic function call in the loop body:
while(top == read) __no_operation();
-
AVRC0005: Using pointers to objects in the built-in EEPROM on targets with more than 256 bytes of built-in EEPROM caused the toolset to emit an internal tool error.
An error in the setup of the parser caused the size of an EEPROM pointer to be one (1) instead of two (2). This resulted in inconsistencies during code generation, which when detected gave rise to the internal tool error message.
-
AVRC0004: The compiler gives error messages for the __eeprom keywords when using --cpu .
An error in the code that handled the results from the command line parser caused the information about the size of the built in EEPROM to be set to 0 bytes when the --cpu command line option was used to specify the target processor, unless the size of the built in EEPROM was explicitly specified on the command line, or from the Options dialog box in the IAR Embedded Workbench.
- AVRC0003 (Partially corrected): Structure-copying when using the large
memory model with more than nine registers locked will cause an internal error with
the message:
Internal Error: [CgDriver]: Coloring failed
If the address calculations for the source or destination structure are non-trivial, the compiler may crash when locking more than five registers. Workaround: Lock fewer (nine or five) registers.This problem has been partially corrected. The problem is still in the compiler, but will only be triggered in rare cases of high register pressure.
-
AVRG0001: The documentation for the license server was missing.
-
AVRG0000: Problems with the new license management system.
ICCAVR V2.21H - 2000-07-21 [Pre-release]
Program corrections
-
The compiler now tries to avoid saving and restoring registers that were initially used by the code generator but later removed by the optimizer.
-
Inline assembler has been enabled.
-
An intrinsic function, __reverse, has been added. It is documented in the Manual corrections readme file .
-
A number of command line options have been added. They are documented in the Manual corrections readme file.
- --no_clustering - Disables clustering of variables
- --enable_external_bus - Makes cstartup enable the external bus
- --do_cross_call - Forces the compiler to always run the cross-call optimization
- --zero_register - Uses R15 as zero register, i.e. R15 always contains zero
- --64k_flash - Prohibits the compiler from using the RAMPZ register in -v2 through -v4