- Important information
- New features
- Known problems
- Program corrections
- User guide corrections
- Miscellaneous
- Release history
Important information
-
To avoid the space-consuming tables used for character classification (
ctype.h
), define the preprocessor symbol__NO_CTYPE_TABLES
before thectype.h
file is included. -
The compiler now avoids the LDRD instruction with the base register in list when generating code for Cortex-M3. This is to work around the Cortex-M3 erratum 602117.
-
News in EWARM 6.10.2:
The
--guard_calls
command line option is introduced. Note,--guard_calls
must always be used in applications written in EC++/C++ that need thread-safe library function calls. For more information see the Development guide.The
--no_guard_calls
command line option is removed.The
--aeabi
command line option has modified behavior: Guard calls are not used by default.
Migration instructions from IAR C/C++ Compiler for ARM 5.x and 6.10.1 to IAR C/C++ Compiler for ARM 6.10.2:
--aeabi
(without--no_guard_calls
) shall be replaced with--aeabi --guard_calls
--aeabi --no_guard_calls
shall be replaced with--aeabi
-
News in EWARM 6.20:
A customer that have implemented the
time()
function must now rename it into__time32()
. For more information see the Development guide. -
A special note on CMSIS integration:
If your application source code include CMSIS header files explicitly, then you should not check the Use CMSIS check-box Project>Options...>General Options>Library Configuration>Use CMSIS. Some of the Cortex-M application examples includes CMSIS source files explicitly, do not check the said check-box in these projects.
However, due to the evolution of the IAR C/C++ Compiler for ARM, older versions of CMSIS are incompatible with the current version of the compiler. One simple example of how to solve this issue is:
a) Press F4 to bring up the erroneous source (header) file in the editor - in most cases namedcore_cm3.h
.
b) Right-click on the window tab of that editor window, choose File Properties....
c) Add (or remove) any character to the file name - so the compiler won't find it any more.
d) Modify project options: Check Project>Options...>General Options>Library Configuration>Use CMSIS.
Steps a) to c) might need to be done for more than one file. Normally, the names of these files arecore_cm0.h
,core_cm3.h
,core_cm4.h
,core_cmFunc.h
andcore_cmInstr.h
.
For more information about CMSIS integration in the IAR Embedded Workbench for ARM, see the Development guide. -
The runtime library assumes that unaligned access is allowed when it is available in the architecture
For ARM core architectures where unaligned access is permitted and offers the possibility to generate more efficient code, the runtime library is built to take advantage of this. For example the library for Cortex-M3 assumes that the
UNALIGN_TRP
bit is not set by the embedded application.
New features
Inline assembler
New operand constraints and modifiers.CMSIS update
CMSIS version 3.01 is now included in the product.
Known Problems
-
The C/C++ library header file
time.h
declares the library functionmktime
. When called with a negative value in the broken-down time componenttm_isdst
, which is part of thetm
struct function parameter,mktime
fails to determine whether Daylight Saving Time is active for the specified time or not.
[EW14632] -
The rather naive algorithm for checking whether a symbol is used or not might lead to unexpected warning messages from the compiler.
[EW23132]
Program Corrections
-
Using 16-bit and 8-bit integer variables as bitfields no longer causes an internal error.
[EW22858] -
In some rare cases the compiler could loop when compiling a signed expression containing multiple shifts. This no longer happens.
[EW22896] -
Using multi-file compilation,
--mfc
, with files that use inline assembler statements could result in an internal error.
[EW22905] -
In some rare cases the stack frame of a function could be optimized in such a way that the debug information would be erroneous (off by four, for example). This means that in the debugger, a stack variable could appear to reside in some location which will probably not hold the expected value. This no longer happens.
[EW22907] -
A module containing a pointer to a member function constant for a virtual function could in some cases result in a
symbol_lookup_M31
internal error in the compiler for the typeinfo object for the owning class.
[EW22918] -
A volatile load could incorrectly be removed if it was part of an expression that was shifted so far that none of the bits from the load were used.
[EW22974] -
An
asm
statement following immediately after a constructor call caused an internal error.
[EW22982] -
A Common subexpression elimination (CSE) was erroneously lifted due to faulty bitfield handling. This has been fixed.
[EW22988] -
Fixed a problem with using
#pragma call_graph_root
on a__weak
function definition. In Thumb mode, the result was an internal error in the compiler. In Arm mode, the result was that the linker in some cases used a section symbol (something like.text_17
) instead of the function symbol for these functions.
[EW22996] -
An
asm
statement containing a local label in a function in a module where the function is inlined twice produced an internal error. This has been fixed.
[EW23006] -
The compiler no longer generates
IT
instructions insideIT
blocks, which caused an internal error.
[EW23020, EW23083] -
Using the address of a C99 compound literal to initialize a pointer in an aggregate caused an internal error in the compiler.
[EW23021] -
In some rare cases partial accesses were incorrectly optimized.
[EW23028] -
The compiler had a bug that could cause the display of stack-allocated local variables to be incorrect in debuggers other than C-SPY.
[EW23042, EW23047] -
Now an
unsigned long
to anunsigned int
cast in a static initializer does not generate an error.
[EW23054] -
The compiler, the linker, and the elftools returned error status when run without options. This has been fixed.
[EW23057] -
The cross call optimization could not handle a sequence that started with a label and had one back-jump to that label in the sequence and one back-jump to it after the sequence. This has been fixed.
[EW23063] -
Inline assembler expressions with volatile arguments could fail in register allocation.
[EW23086] -
In some cases a common subexpression could be hoisted across a condition controlling the execution of the expression.
[EW23087] -
Index expressions mixing signed and unsigned types could in some rare cases cause an internal error.
[EW23088] -
The compiler could erroneously inline
__weak
function definitions.
[EW23112] -
C-SPY no longer generates an error when the debugged application contains a C symbol with the name c or d.
[EW23131] -
The choice of using the 64-bit implementation for the time interface did not work when using low optimization levels. This has been fixed.
[EW23162] -
The compiler issued an internal error when checking the code
(void (**)(void)) 1
for violation of the MISRA C:2004 rule 17.5. This has been fixed.
[EW23164] -
The linker now selects the correct libraries when linking an application without code, also for Cortex-M devices.
[EW23204] -
For Thumb2, at optimization level Medium, expressions of the form
(x >> K) & M
could result in code that cleared too many bits (for a constantK > 0
andM = (1 << N) - 1
for a constantN > 0
).
[EW23214] -
The endian attribute for pointers and arrays is now supported in the compiler, which makes this issue obsolete.
[EW23220] -
Fixed a pathological case where a static variable used as index expression in a static array could trigger an internal error.
[EW23229] -
In EWARM 6.40.2:
TheLDRD
instruction could be used for copying an 8-bytestruct
with less than 4-byte alignment, which could result in an exception (hard fault) when running the application. This no longer occurs.
[EW23272] -
In EWARM 6.40.2:
When compiling for Thumb2, a zero-initializer for a single byte array on the stack no longer generates code that clears two bytes of memory.
[EW23298] -
In EWARM 6.40.3:
A bitwise AND (&
) between an 8-bit variable and a constant wider than 8 bits does no longer generate an internal error.
[EW23295, EW23362, EW23365] -
In EWARM 6.40.3:
In some rare cases multiple tests of the same variable could be incorrectly optimized. This has been corrected.
[EW23360] -
In EWARM 6.40.3:
At optimization level medium (or higher), the updates of an address passed to the__PLD
or__PLI
intrinsic functions could be optimized away. This has been corrected.
[EW23387] -
In EWARM 6.40.4:
Loops with multiple exit tests (a test containing&&
or||
counts as multiple tests) could be optimized incorrectly, if one test tested a loop counter, another test tested a value loaded indirectly from a pointer, and the pointer was incremented or decremented on each iteration through the loop.
[EW23318]
User guide corrections
- None.
Miscellaneous
-
Generate workarounds for hardware problems:
-
Functional problem Core.1 in NXP device LPC2478: Incorrect update of the Abort Link register in Thumb state.
Workaround generated withiccarm --enable_hardware_workaround=NXP_Core.1
-
Release history
-
See release history.