RVCT 3.1: Build 1055 patch for Windows

Download (Login Required) EULA included in archive



This RVCT 3.1 patch #14 is intended for use with RealView Development Suite (RVDS) 3.1 products. It can be used to update any RVDS 3.1 or RVDS 3.1 Professional installation, whether previously patched or an original installation.

It is NOT compatible for use with the RVDS 3.1 Evaluation CD or previous (3.0 or earlier) releases of RVCT/RVDS or Keil MDK products.

This patch consists of updated RVCT/RVDS 3.1 compiler, linker, assembler, fromelf, and armar Program executables; updated Include files and updated C/C++ libraries.

OS Platforms Supported

  • Windows 2000 SP4
  • Windows XP SP2, 32-bit & 64-bit
  • Windows Server 2003 32-bit & 64-bit
  • Red Hat Linux Enterprise 4 for x86, 32-bit & 64-bit

Additionally, this patch has been tested on the following platforms:

  • Windows XP SP3, 32-bit
  • Windows Vista Business Edition SP1, 32-bit & 64-bit Windows
  • Red Hat Linux Enterprise 5 for x86, 32-bit & 64-bit

While these platforms are not part of the supported platforms list, we do expect the product to work within these environments.

Installation Instructions

To install the patch carry out the following steps:

  1. Ensure that you are currently using RVCT 3.1. To do this, type:

    armcc --vsn

    and ensure that this returns RVCT 3.1 build 400 or later.

  2. Extract all the files from the ZIP file into a temporary directory.

  3. Copy the include directory from the temporary directory to replace your existing include directory. The existing directory can be located by the RVCT31INC environment variable, e.g:

    C:\> set RVCT31INC
    RVCT31INC=C:\Program Files\ARM\RVCT\Data\3.1\569\include\
  4. Copy the lib directory from the temporary directory to replace your existing lib directory. The existing directory can be located by the RVCT31LIB environment variable, e.g.:

    C:\> set RVCT31LIB
    RVCT31LIB=C:\Program Files\ARM\RVCT\Data\3.1\569\lib\
  5. Copy the win_32-pentium directory from the temporary directory to replace your existing win_32-pentium directory. The existing directory can be located by the RVCT31BIN environment variable, e.g.:

    C:\> set RVCT31BIN
    RVCT31BIN=C:\Program Files\ARM\RVCT\Programs\3.1\569\win_32-pentium\
    To minimise the size of the archive, only one compiler (armcc) is provided in this patch. However, the separate armcc, tcc, armcpp and tcpp executables are now identical since RVCT 3.0, so you will need to copy the new armcc to tcc, armcpp and tcpp appropriately, with e.g.

    copy armcc.exe tcc.exe
    copy armcc.exe tcpp.exe
    copy armcc.exe armcpp.exe
  7. The updated tools should now have been installed. To confirm this, open a DOS command prompt window and enter:

    armcc --vsn
    armcpp --vsn
    tcc --vsn
    tcpp --vsn
    armlink --vsn
    armasm --vsn
    fromelf --vsn
    armar --vsn

    The version returned should be RVCT 3.1 build 1055.

Build 1055

RVCT 3.1 build 1055 includes the following corrections and improvements since RVCT 3.1 build 1021:

Compiler (armcc):

  • 64-bit operations used on 64-bit types with <= 4 byte bitfield could result in stack corruption. This has been fixed. [747374]
  • Spurious warnings C3487E and C3488E are no longer generated. [747129]
  • Some causes of internal faults 0x2732f5 and 0x6bca8b have been fixed. [747128, 618675]
  • 4 byte unaligned variable access could be converted into 8 byte access, causing overflow. This has been fixed. [747127]
  • Bit-fields within a __packed structure could be accessed incorrectly. This has been fixed. [733097]
  • Some incorrect instances of the message Error: #254: type name is not allowed when compiling source lines with the typename keyword and templated function calls have been fixed. [715265]

Linker (armlink):

  • Two command line options have been added to give more control over the generation of BLX instructions. --no_blx_arm_thumb controls whether the linker can generate a BLX instuction for ARM to Thumb calls. --no_blx_thumb_arm controls whether the linker can generate a BLX instruction for Thumb to ARM calls. These options default to allowing BLX instructions to be generated. [SDCOMP-14942]

ELF Format Convertor (Fromelf):

  • corrupt SHT_GROUP sections could be generated by fromelf when used with the --elf and --strip debug options. This has been fixed. [743441]

Build 1021

RVCT 3.1 build 1021 includes the following corrections and improvements since RVCT 3.1 build 892:

RVCT executables:

  • Checking out a license in queue mode times out quickly and can occasionally cause FLEX error: 'Licensed number of users already reached. (-4,342)', instead of showing the correct message: 'Warning: C9933W: Waiting for license...', even when using the --licretry option. This issue is likely to occur when the license checkout frequency is very high, e.g., when using parallel make (make -j). This has now been fixed by increasing waiting time. [721402]

Compiler (armcc):

  • In inline assembler, MVN with a shifted operand was incorrectly optimized into a plain shift with no negation. This is now fixed. [733108]
  • A cause of internal fault 0xb36758 has been fixed. [730515]
  • Some of the causes of internal fault 0xa05965 and 0xf7584e have been fixed. [730725]
  • A cause of internal fault 0x577f90 has been fixed. [729046]
  • A limitation which prevented combining individual writes to non-volatile structure bitfields into a single write (thereby saving code size) has been fixed. [729306]
  • New compiler options have been added to specify the directory for output files. --output_dir specifies the output directory generally, including for .o files. The directory for assembler output can be specified with --asm_dir, for dependency output with --depend_dir, and for --list output with --list_dir. If these options are not used the corresponding output is put in the directory specified by --output_dir, or if that is not specified, in the default location (e.g. the current directory). [724455]

Assembler (armasm):

  • Fixed out of memory issue when ALIGN directive is used with an offset that's not a multiple of 4. [729852]

C/C++ Libraries:

  • The C libraries accidentally contained two copies of rt_errno_addr.o. The redundant copy has now been removed. [731199]
  • The version of __cxa_vec_cctor selected when using C++ exceptions did not correctly handle the case where the construction function pointer being passed is NULL. This is now fixed. [730011]

Linker (armlink):

  • When using the armlink --symbols option on a large project containing many C++ mangled symbols, the linker can produce the 'Fatal Error L6000U: Out of memory' message when trying to display the unmangled symbol names. This has now been fixed, armlink uses much less memory when using the --symbols option. [730621]
  • When reading scatter files with expressions, the linker incorrectly parses the <= operator as > and the <= operator as <. This has now been fixed. [729747]
  • The linker was removing unused sections from objects loaded from a user library, even if the --noremove option was set. Now when --noremove is set the linker will still remove unused sections from RVCT libraries, but not from user libraries. [728698]

Build 892

RVCT 3.1 build 892 includes the following corrections and improvements since RVCT 3.1 build 862:

Compiler (armcc):

  • A misoptimization that resulted in incorrect return values of a sequence of multiple __disable_irq() and __disable_fiq() calls in a function has been fixed. [721129]
  • The compiler was optimising negated floating-point comparisons into the opposite comparison (for example !(a < b) was being converted to (a >= b)) for all Floating Point models (as set by --fpmode). This has been changed so the optimisations are only applied when the FP model indicates that we are not interested in NaNs (by default, --fpmode std, --fpmode fast). [725228]
  • Where the compiler option --locale was used, production of a warning message could sometimes reset the current locale, causing incorrect interpretation of multibyte character sequences in source code. This is now fixed. [726469]
  • In certain situations calls to fmod with arguments that would set errno were incorrectly removed. This is now fixed. [726233]
  • Compiler internal fault 0xcc3958 could occur in some erroneous uses of dllimport/dllexport. These are now reported as downgradable errors with code #1558-D. [685023]
  • Compiler internal fault 0xcc3958 could occur in some erroneous uses of dllimport/dllexport. These are now reported as downgradable errors with code #1558-D. [685023]
  • Some causes of the following internal faults have been fixed: 0xafee20, 0x9be513. [725414,726702]

C/C++ Libraries:

  • The scanf family of functions used to report a parse failure when asked to parse a C99 hexadecimal float literal representing zero (e.g. "0x0.0p0"). They now parse it correctly. [726413]
  • Several library functions were not imported from the 'std' namespace by C-style header files included in a C++ program. For example, if you "#include <stdlib.h>" when compiling C++ and then try to call strtof(), the compiler would have given an error, and only std::strtof() would have worked. The affected standard functions are _Exit, strtof, strtold, wcstof, wcstold and wcsftime. These are now fixed. [728229]

Build 862

RVCT 3.1 build 862 includes the following corrections and improvements since RVCT 3.1 build 836:

Compiler (armcc):

  • Some code generation faults have been fixed.
  • In some situations the compiler incorrectly re-use the base register of a load, causing the offset of a subsequent load to overflow. This is now fixed.
  • The generation of SMMLAR instruction has been improved.
  • With --wchar32, wide character string literals generated for references from structure initializers were not always correctly aligned on 4-byte boundaries. This is now fixed.
  • Some causes of the following internal faults have been fixed: 0x19c380, 0xca4d2f.
  • A cause of "Error #1620 internal fault" at -O3 -Otime has been addressed.
  • A crash has been fixed for an instance of loop unrolling optimization.
  • A crash has been fixed where a destructor in a derived class contained a try-block and the base-class destructor was defined as an empty function.
  • A crash has been fixed in a situation where a switch statement occurs in the lifetime of a local variable of class type with an empty destructor body.
  • New options have been added to the --library_interface command line option: aeabi_glibc_hardfp, aeabi_clib_hardfp, aeabi_clib90_hardfp, aeabi_clib99_hardfp. These options cause calls to the C library (including math libraries) to use the Hard FP calling convention.

Linker (armlink):

  • The 'RENAME *' steering file command no longer renames Lib$$Request symbols.
  • In some circumstances when a steering file contains both 'IMPORT *' and 'EXPORT *' directives, the linker applied the IMPORT and the EXPORT to the same symbol, provoking Error L6279E. This is now fixed.
  • Partial linking object files could lose the SHF_STRINGS flag of a Section that is also part of a Group. If the partial object is used in a subsequent link and the group containing the section is selected then the linker would issue error L6883E. This is now fixed.
  • L6236E is no longer erroneously produced for scatter files when --no_veneershare is selected.
  • Using the --sort=AvgCallDepth, RunningDepth or CallTree option could produce a broken image if inline veneers are generated. This is now fixed.
  • The linker now supports the option --[no_]merge_partial_comdat that controls whether SHF_COMDAT groups are merged when partial linking.
  • It is now possible to downgrade error messages 6682 and 6683 caused by faulty string merge sections. Downgrading these will disable string merging.
  • L6260E could be generated when automatically placing .ARM.__AT sections whose base address + size is greater than 0xFFFFFFFF. This is now fixed.
  • If the linker could not place a veneer close enough to the call site due to large ELF section, the linker could loop infinitely trying to generate veneers for the section. This is now fixed.
  • A segfault could occur when building a --sysv --shared --fpic shared library, where there is R_ARM_ABS32 relocation to a symbol with STV_PROTECTED visibility in another shared library. This is now fixed.
  • The linker could output incorrect interworking error messages. This is now fixed.
  • A crash has been fixed for an instance when datacompressor is on.

Assembler (armasm):

  • PUSH and POP instructions with '^' are now allowed again with '^' being obeyed, or faulted if an associated STM or LDM instruction is not available.
  • Improved detection of MOV and MVN instructions causing message A1546W to be diagnosed incorrectly.

C/C++ Libraries:

  • powf() incorrectly returned large integer values when given NaN inputs. This is now fixed.
  • The stdio EOF indicators were not being reliably set and cleared when reaching the end of a file using fread(). This is now fixed.

ELF Format Convertor (fromelf):

  • "fromelf --elf" incorretly removed any file offsets inserted by the linker. It now maintains file offsets specified by the p_align ELF field.

Build 836

RVCT 3.1 build 836 includes the following corrections and improvements since RVCT 3.1 build 794:

Compiler (armcc):

  • The compiler now correctly ensures 8 byte stack alignment for variadic function calls within a translation unit.
  • System include paths are now correctly searched when --sys_include is specified in conjuntion with --preinclude.
  • Handling of casts to 'volatile' has been improved to meet most users' expectation.
  • The implementation of __builtin_popcount() has been changed to improve average performance.
  • Handling of multiple namespaces in C++ has been improved.
  • Erroneous warnings for paramater mismatch with signed/unsigned char in printf() calls have been removed.
  • A cause of internal fault 0x6bca8b related to C++ exceptions has been addressed.
  • Specifying an initializer for a dllimport variable is now correctly faulted.
  • Compiler now correctly retains setting of APSR.GE bit in some ARMv6 SIMD intrinsics or inline assembly instructions.
  • A cause of internal fault 0x1a8653 has been addressed.
  • Fixed an instance where function calls in a loop are incorrectly reordered.
  • A crash has been fixed related to loop unrolling optimization.
  • A crash has been fixed where a destructor in a derived class contained a try-block and the base-class destructor was defined as an empty function.

C/C++ Libraries:

  • No updates

Linker (armlink):

  • A switch --[no_]implicit_branchpatch has been added to disable automatic application of the patch to avoid erratum 657417 in Cortex-A8. This should only be used if code compiled for Cortex-A8 is targeted only for a known platform, which uses a revision of Cortex-A8 which does not exhibit erratum 657417 (r1p7, r2p5, r3p1 or later).
  • Improved memory usage, to prevent 'out of memory' issues when linking objects with complex debug data.
  • When symbol versioning is used, GOT entries for local functions are no longer generated.
  • When ARM/Thumb synonyms are detected, the linker no longer treats anonymous global symbols as synonyms (which could otherwise misdirect relocations).
  • Added an option --use_definition_visibility. When set the linker will use the visibility of a definition in preference to the visibility of a reference when combining symbols. This option is contrary to the ELF standard, so is off by default.
  • Armlink now correctly represents the OS Extensions in the BuildAttributes symbol when partial linking a Cortex-M3 object.
  • The scatter-loading keyword ALIGN now sets the alignment of the execution region to Max(ALIGN, input section alignment).
  • A crash related to the datacompressor has been fixed.

Assembler (armasm):

  • PUSH and POP instructions with '^' (e.g., POP{PC}^) are now correctly faulted, rather than the '^' being ignored.
  • Registers D16 to D31 are now not faulted when used in a VLDM or VSTM instruction with --fpu=vfpv3
  • Labels defined in an empty AREA will now always have their type derived from the type of the AREA.
  • Unpredictable MOV instructions generated by LDR= is now diagnosed.

Librarian (armar):

  • When given two input files with the same file name, armar now does not replace members that have been added in the same command execution.

Build 794

RVCT 3.1 build 794 includes the following corrections and improvements since RVCT 3.1 build 761:

Compiler (armcc):

  • __declspec(dllimport) and __declspec(dllexport) now affect class members, for example:
    class __declspec(dllimport) T {
    void f(); // is now effectively __declspec(dllimport)
  • Symbol table entries are now generated for an exported class
  • More intrinsics have been added to the c55x.h header, including support for multiplies involving unsigned 16-bit operands, and non-fractional multiplies: _a_lsadd, _a_sadd, _a_smac, _a_smacr, _a_smas, _a_smasr, _lmpy, _lmpysu, _lmpyu, _lsat, _lsmpyi, _lsmpyr, _lsmpysu, _lsmpysui,
    _lsmpyu, _lsmpyui, _smaci, _smacr, _smacsu, _smacsui, _smasi, _smasr, _smassu, _smassui
  • When a non-RVCT library interface is specified, and math functions are defined, the '__hardfp_' prefix is no longer applied to the function names
  • NEON VSHLL intrinsics now accept a shift amount equal to the datatype size
  • The macro __FILE__ can now be redefined on the command line. In particular, it can be defined to be __MODULE__, which causes all uses of __FILE__ to use filenames without paths, by using "-D__FILE__=__MODULE__" on the compiler's command-line
  • The compiler now supports the intrinsics __sev(), __wfe(), __wfi(), and __yield() when compiling for --cpu ARM1156T2-S. Note that this processor implements these instructions as NOPs
  • Some code generation issues have been addressed
  • Some causes of the following internal faults have been fixed: 0x2ecad9, 0x666b41, 0x87ecef, 0xca4d2f

C/C++ Libraries:

  • atan2f() has been corrected to return NaN when its input parameters are +0/-0
  • modf() has been corrected to return NaN when the first input parameter is NaN

Linker (armlink):

  • armlink is able to workaround Cortex-A8 Erratum 657417, which affects 32-bit Thumb-2 branch instructions that span two 4K regions, where the target address is in the first 4K region. The workaround is activated if either:
    1. The armlink command-line option --branchpatch=cortex-a8_q109 is used, or
    2. The armlink command-line option --cpu=cortex-a8 is used and a full link is being performed
    This only needs to be used for Thumb-2 code intended to be run on Cortex-A8 revision r3p0 or earlier parts. Please contact your silicon vendor for more information on this erratum. When activated the linker will scan for instruction sequences that may trigger the erratum behaviour. If such a sequence is found the linker will insert a patch to prevent the erratum behaviour. Use the "--info patches" switch to be informed of the Object, Section and the Offset within the Section where the patch has been applied. The trigger conditions that the linker looks for are:
    1. A 4-byte direct Thumb-2 branch instruction spans a region boundary, i.e. (address & 0xffe) == 0xffe
    2. The branch instruction is backwards and has a range of less than 4KB
    3. The instruction preceding the branch is a 4-byte non-branch instruction.
    The linker patch converts the backwards branch to a forwards branch to a patch at the end of the Section. The patch consists of a backwards unconditional branch to the original target. The patch is aligned such that the backwards branch can never span a region boundary. The restrictions are:
    1. When partial linking the linker does not always have the address information to know that an address will never be placed on a region boundary. This will mean that the linker may patch more instructions in a Section than if the patch were applied in a full link
    2. A branch that requires patching must be able to reach the patch at the end of the Section. If the linker is unable to place the patch within range of the branch it will give a warning message. The range of a Thumb-2 unconditional branch is 16MB and the range of a conditional branch is 512KB so this is unlikely to happen in practice
    3. The linker will increase the alignment of any Program Segment containing a patch to 4KB.
  • The linker now assigns unassigned sections to .ANY execution regions as documented, i.e. the largest section is first assigned to the execution region with the most available space, and so on
  • The linker callgraph now correctly detects tail-calls that have been transformed into a NOP by the linker. Previously these calls could be missed which would cause the tail-called function to be marked as unused
  • R_ARM_COPY relocations are no longer generated for SysV applications built using fpic

Assembler (armasm):

  • Cases where use of the EXTERN directive could result in a corrupt object file have been fixed

Build 761

RVCT 3.1 patch build 761 includes the following corrections and improvements since RVCT 3.1 build 739:

Compiler (armcc):

  • The compiler now works around Cortex-M3 erratum 602117 involving LDRD when the base register is also the first loaded register.
  • Some code generation issues with volatile variables at -O3 -Otime have been addressed.
  • At -O3 -Otime the compiler could ignore a narrowing cast in some cases. This has been addressed.
  • The ETSI DSP shift intrinsics in <dspfns.h> and <c55x.h> could give incorrect results if shift counts were outside the range [-255,255]. This is now correct. If shift counts are known to be within this range, the macro __ARM_DSP_SMALL_SHIFTS can be defined to 1 to enable the previous (faster) implementation.
  • For embedded assembler (__asm) functions marked as __weak, the compiler no longer generates a weak reference from C code, to ensure the definition is not lost. A weak symbol is still generated in the assembler output.
  • The compiler's --asm (and -S) output has been tidied to make it more readable by avoiding unnecessary use of escape characters for strings.
  • The diagnostic message "#1558: redeclaration cannot add dllexport/dllimport" is now downgradable.
  • Generation of the PKHTB instruction has been improved.
  • Some causes of the following internal faults have been fixed: 0x52889a, 0x827020, 0xafee20 with --vectorize.

C/C++ Libraries:

  • Using ARM_LIB_HEAP and ARM_LIB_STACK in a scatterfile now automatically selects the two region memory model, therefore you no longer need to import __use_two_region_memory.

Linker (armlink):

  • The current directory is now automatically added to the include path when pre-processing scatterfiles, to restore the build 674 behaviour for relative includes in scatterfiles.

ELF Format Convertor (fromelf):

  • fromelf with "--text -a" or "--fieldoffsets" switches no longer crashes when encountering zero-byte padding in a debug section or anonymous structures.

Build 739

RVCT 3.1 patch build 739 includes the following corrections and improvements since RVCT 3.1 build 700:

Compiler (armcc):

  • Some code generation/optimization issues have been corrected.
  • Repeated MSR instructions in inline assembler that write the I, F or A flags in the CPSR are no longer optimised away.
  • A destructor is now called correctly in C++ when a 'try' block is nested within a 'catch' body.
  • The ability to use the short saturating maths instructions QADD16 & QSUB16, when compiling for v6 & later, has been added to some intrinsics defined in dspfns.h. To use these opcodes for the add() and sub() intrinsics you must set the __ARM_DSP_IGNORE_OVERFLOW macro to 1, as these instructions do not set the Q bit as required by ETSI.
  • The TI support functions crshft_r() and L_crshft_r() have been added as a DSP intrinsic to C55x.h.
  • __ldrexd(), __strexd() and __clrex() intrinsics are now available for ARM1176JZ(F)-S.
  • The compiler can now emit a remark #2810 for file-scope arrays with no bounds in C source code, for example 'int a[];'. Use --remarks or --diag_warning=2810 to see them.
  • Some small potential code size and performance improvements have been made in some areas, e.g. C++ exceptions.
  • Some possible causes of these internal faults have been addressed: 0x0a7b83, 0x413ad2, 0x4ccb3b, 0x6b6fd3, 0x87ecef, 0xca4d2f, 0xa0269c, 0xaaa267, 0xac2086,
    0xe35e83, #2409 (bad simd operation).

C/C++ Libraries:

  • qsort() no longer calls the comparison function when the element count is zero and the data pointer is NULL.
  • The C++ libraries are now built as Thumb where appropriate (as in previous versions of RVCT) for smaller code size.
  • Re-implementing __default_signal_handler() no longer results in multiply defined symbol error L6200E.
  • Some cases where dynamic_cast<> assumed the implementation of type_info::operator== have been replaced by calls to type_info::operator==.
  • If _sys_read() returns an error (-1), fgetc() will no longer return an extra (zero) byte before EOF.
  • Microlib's scatter-loading code can now be placed in a scatter-file using InRoot$$Sections .

Assembler (armasm):

  • armasm now correctly faults invalid Thumb-2 instructions of the form 'LDR/STR pc, [pc, Rx]'.
  • armasm no longer aborts with "malloc(): memory corruption" when given long path names (256 characters or more).
  • Architectural constraint checking for Thumb-2 data processing instructions (e.g. MOV.W ) has been improved.

Linker (armlink):

  • The linker can now again share veneers from a RELOC region to an ABSOLUTE region.
  • The use of ALIGN on an EMPTY region in a scatter-file now works correctly - the linker no longer removes preceding ZI padding.
  • --no_veneershare now works as documented.
  • The linker no longer searches shared libraries for symbol references generated from its library selection scripts.
  • --no_comment_section can now be used on images, as well as objects.
  • The callgraph output no longer misses some function calls.
  • The callgraph output no longer lists functions as being "Mutually Recursive" when they are not.
  • The address of a FIXED region in a scatter-file with a non-zero relative base offset is now evaluated correctly.
  • The correct size of any shared .conststring sections is now written into the symbol table by the linker, viewable with --symbols.
  • The correct size of any linker-generated veneers is now written into the symbol table (instead of 0) by the linker, viewable with --symbols.
  • The $Sub/$Super mechanism is intended for only static (not dynamic) linking. As $Super references are not allowed to be imported or exported into the dynamic symbol table, $Super references and definitions are now marked as hidden (STV_HIDDEN).
  • Where ARM/Thumb synonyms are present, the linker no longer masks a local definition of a symbol with a global symbol of the same state, which could cause relocation failures. Note that ARM/Thumb synonyms are not ABI-compliant, so should be avoided where possible.
  • The linker no longer splits inline veneers from their targets when "__at" sections are used.
  • The linker no longer searches libraries for a symbol when it has already found a definition.
  • The linker is now able to eliminate legacy SHF_COMDEF VFE sections from an image, which can help to reduce code size.


  • The RVCT 3.1 Linux executables are now built with FLEXnet Licensing v10.8.5.0 (now the same as for the Windows executables).
  • The RVCT 3.1 Linux executables now have improved reliability with the "hugemem" kernel on Linux platforms.

Build 700

RVCT 3.1 patch build 700 includes the following corrections and improvements since RVCT 3.1 build 674:

Compiler (armcc):

  • The Windows executables are now 'signed', which should avoid some popups on Windows Vista.
  • The compiler now supports the reuse of precompiled headers (PCH) on Windows Vista when Address Space Layout Randomization (ASLR) is active.
  • #pragma O3 now works correctly with precompiled headers (--pch).
  • The preprocessor no longer incorrectly performs a double line splice for a trailing double backslash \\ after a double forwardslash comment //.
  • An issue with reading the "named register variable" APSR into a variable has been fixed.
  • Addresses of strings are now calculated correctly when compiling for Cortex-M3 with -O3 -Otime.
  • Inline assembler that contains a flag setting instruction followed by a conditional flag setting instruction now compiles correctly.
  • An issue with __memory_changed() has been fixed.
  • The 'weak' attribute is no longer lost on a member template function.
  • A possible cause of "Error: #1620: Internal fault: translation failed. (becheck - block)" has been fixed.
  • _Pragma("arm section") is no longer ignored.
  • printf argument-list scanning now treats "pointer to array[N] of char" the same as "pointer to char".
  • Use of C++ class rvalue "?" operators inside template prototype instantiation no longer causes a stack overflow.
  • --dllimport_runtime now correctly imports alloca and scalbn related symbols.
  • 32-bit Thumb instructions are now disassembled correctly in e.g. the compiler's --interleave output.
  • The assembler and compiler now correctly determine the presence/absence of the mvfr0 and mvfr1 system registers, which are present in VFPv2 (VFP11) after r1p0.
  • The compiler no longer incorrectly considers a directory name as a pattern match for #includes.
  • A debug illusion issue when using #pragma arm and #pragma thumb functions within the same named section (e.g. using #pragma arm section) has been corrected.
  • Functions with the same name as a named section (e.g using #pragma arm section) are no longer incorrectly omitted from the symbol table.
  • Some code generation/optimization issues have been corrected.
  • Some possible causes of the following internal faults have been addressed:
    0x2732f5, 0x2bb15d, 0x5db3ba, 0x92b6e9, 0x995e1d, 0x9be513, 0xaaa297, 0xb7310e,
    0xca7b8d, 0xcc3958, 0xcc5a94, 0xfe1945.

Assembler (armasm):

  • Some instructions were accepting program-relative expressions that could not be encoded.
  • SUB Rd,PC,#imm was incorrectly diagnosed as deprecated in ARM.
  • The assembler and compiler now correctly determine the presence/absence of the mvfr0 and mvfr1 system registers, which are present in VFPv2 (VFP11) after r1p0.

Linker (armlink):

  • ARM/Thumb synonyms (legacy) feature now behaves as documented.
  • Use of RWPI/ROPI with linker-generated symbols like Load$$ER_RW$$Base now results in a diagnostic message rather than a linker crash.
  • The linker no longer produces erroneous diagnostics when input section attributes are omitted from input section descriptions in a scatter-file.
  • The linker can no longer use a ZEROPAD region as a temporary buffer when decompressing RW data.
  • The scatter-load FIXED attribute no longer interferes with the linker's --autoat placement of sections.
  • The linker now correctly generates a PLT entry for a call to a default visibility definition in the same DSO.
  • A new linker switch "--info visibility" has been added, to help resolve missing references to symbols errors, as flagged by linker diagnostics such as L6410W. "--info visibility" can be used in combination with "--info inputs" and "--verbose" to give progressively more detailed output.
  • A new linker switch "--max_visibility=<visibility>" has been added. This will restrict the maximum (most visible) visibility of all symbol definitions to <visibility> where <visibility> is either "protected" or "default".
    The default maximum visibility is "default". Note: The visibility of data definitions is unaffected by this option. Use "protected" when you do not want the symbols in your shared object to be preempted at load time - the linker will not need to generate a PLT entry for a call to a protected visibility symbol from the same library. Use "default" when you want to allow the symbols in your shared object to be preempted at load time - the linker will then generate a PLT entry for a call to a default visibility symbol from the same library.

ELF Format Convertor (fromelf):

  • fromelf no longer crashes with "--strip symbols" on SysV shared libraries containing an R_ARM_RELATIVE relocation.
  • fromelf is now able to create output files in a nested directory, e.g. "fromelf --bin foo.axf -o bar/foo" now works as expected, assuming bar already exists.

Librarian (armar):

  • armar no longer generates malformed archive headers on Unix systems with >6 character user IDs.

C/C++ Libraries:

  • Reimplementing __rt_raise now correctly prevents default_signal_handler from being linked from the libraries.
  • strstr() in Microlib has been corrected to return the correct value.
  • strpbrk() in Microlib no longer loops infinitely if the first character of the string does not match, e.g. strpbrk("abc","b").

Build 674

RVCT 3.1 patch build 674 includes the following corrections and improvements since RVCT 3.1 build 640:

Header files:

  • The norm_s and norm_l functions in dspfns.h now return zero output for zero input, that is, the same behaviour as RVCT 3.0.

Compiler (armcc):

  • The compiler's inline assembler no longer incorrectly removes MSR or MOVS instructions from inline assembler sequences.
  • The compiler erroneously reported Error #1560 in some cases. A (suppressible) Warning is now given instead.
  • In functions that used 'setjmp', the values read from local variables marked 'volatile' were sometimes incorrect in the return-from-longjmp case.
  • Use of __ldrex, __strex and similar intrinsics on a static variable no longer report invalid "Error: #1199: there is no type with the width specified".
  • The compiler no longer faults attempts to non-standardly declare a function twice with two different enumeration types as a result or argument. This caused problems with some legacy code, so this is now a warning in non-strict modes.
  • The 3.1 compiler no longer generates fewer tailcalls than 3.0 when compiling with C++ exceptions.
  • Thunks for complete object destructors in classes with virtual bases are now emitted in some cases where they were missing.
  • C++ guard variables for local static initializations are now non-weak, which is the same as in RVCT 3.0 and is in agreement with a recent AEABI clarification. New object files are still compatible with object files from earlier RVCT releases.
  • Some cases of missing VTTs (virtual table tables) introduced by build 640 are fixed.
  • When compiling C++ code with -O3 -Otime, the compiler could incorrectly report error #167 against __restrict.
  • At -O3 it was possible for some memory accesses to be moved past scheduling barriers. This has now been fixed.
  • The compiler no longer moves stores in Thumb across __enable_irq() or __breakpoint() intrinsics.
  • A 'dllexport' function that gets inlined now has an out-of-line copy created and exported too, as required by the ABI.
  • The compiler no longer generates .debug_line sections that contain no useful information and which would otherwise waste space in the image.
  • The use of __declspec() (e.g. __declspec(notshared), __declspec(dllexport), etc) on class, struct and union types is no longer ignored, and now matches the behaviour of previous releases and the documentation.
  • Build attributes section Tag_ABI_FP_number_model and Tag_ABI_FP_denormal were sometimes incorrect. Also all Tag_ABI_FP_* tags are now 0 for --fpu=none.
  • Some code generation/optimization issues with -O3 -Otime have been corrected.
  • A possible cause of "Error: #2401: Internal fault: table overflow." has been addressed.
  • Some possible causes of the following internal faults have been addressed: 0x0d9189, 0x1173d7, 0x2bb15d, 0x382b30, 0x61e737, 0x87ecef, 0x995e1d, 0xa0269c, 0xac2086, 0xb2d4ef, 0xca4d2f, 0xd31364 with --interleave, 0xe82e38.

Assembler (armasm):

  • The assembler now accepts XPSR in MRS and MSR instructions on ARMv6-M and ARMv7-M.
  • The assembler assembled some 64-bit VLDR.F64 literal pool loads incorrectly.
  • The assembler incorrectly assembled NEON VQSHRN and VQRSHRUN instructions with immediate zero.
  • The assembler sometimes incorrectly assembled NEON multiply by scalar instructions.
  • Some legacy Arch v6 assembler mnemonics had been removed from the inline assembler. These have now been reinstated for the benefit of legacy code. New code should preferably use the new mnemonics. The mnemonics are (old name ? new name):

    [US]ADD8TO16 ? [US]XTAB16
    [US]ADD8TO32 ? [US]XTAB
    [US]ADD16TO32 ? [US]XTAH
    [US]UNPK8TO16 ? [US]XTB16
    [US]UNPK8TO32 ? [US]XTB
    [US]UNPK16TO32 ? [US]XTH

Linker (armlink):

  • The linker no longer crashes when using a symdefs file that contains symbols related to RW-data compression.
  • The linker no longer reports a multiply defined symbol error L6200E when processing $Sub$$/$Super$$ symbols in a library file that overrides symbols from a SYMDEF file.
  • The linker will now report an error for references to non STV_DEFAULT symbols when linking SysV images, instead of treating them as weak (STB_WEAK).
  • The linker is now able to generate PI veneers directly within SysV shared objects compiled with "--apcs=/fpic" and linked with "--sysv --shared --fpic".
  • The linker will now fault execution regions created by the linker when using --autoat if they are not 4 byte aligned.
  • The linker no longer crashes when trying to allocate more than 2GB of memory in one chunk.
  • The linker no longer crashes when --no_legacyalign is used with a zero-sized EMPTY execution region.
  • Some causes of the linker error "Execution interrupted due to an illegal storage access" have been fixed.

ELF Format Convertor (fromelf):

  • fromelf --elf --strip symbols,debug will now correctly remove the string and symbol tables (".strtab" and ".symtab") from images, instead of just removing local symbols.

Librarian (armar):

[armar has no changes, but has been rebuilt for completeness.]

Build 640

RVCT 3.1 patch build 640 includes the following corrections and improvements since RVCT 3.1 build 616:

Headers and Libraries:

  • The include file ctype.h has been modified so that the ABI portable ctype macros (e.g. "__aeabi_ctype_table_") are now properly qualified with the C++ namespace when compiled in C++ mode.
  • The include files dspfns.h and c55x.h have been modified so that out-of-line copies of the DSP intrinsics are no longer generated when compiling with --gnu, to prevent "multiply defined symbol" errors at link time where two or more source files #include these in the same project.
  • The Cortex-M1 helper libraries h_p*.* have been modified to correct a problem in __ARM_ll_mulss and __ARM_ll_mlass. C code which multiplies two signed 32-bit integers to give a signed 64-bit result, for example:

    long long result;
    long x, y;
    result = (long long)x * y;

    would sometimes give the wrong answer for Cortex-M1 targets only. The six affected files in the "armlib" directory are: h_p.b, h_p.l, h_pe.b, h_pe.l, h_pf.b, h_pf.l.

Compiler (armcc):

  • A code size regression between build 569 and build 616 has been fixed. This could occur in some cases where functions used multiple static variables.
  • The debug information generated by the compiler has been tuned to improve commoning opportunities at link time. This helps to minimise final debug sizes, and to reduce overall link times.
  • armcc can again now execute armasm and armlink (e.g. for embedded assembler) on Windows if their location is not listed in the path environment variable, providing they are in the same directory as armcc.
  • The line number cross-referencing has been improved in the "--interleaved" output.
  • Build attributes can no longer be incorrectly picked up from the last code section emitted instead of from the command line options.
  • Prior to RVCT3.1 build 616, the vectorizing compiler could reassociate some saturating intrinsic functions, which would cause incorrect results. This was fixed in RVCT3.1 build 616 but this inhibits vectorization of some functions containing saturating intrinsics.
  • A new "--reassociate-saturation" option has been added to allow the old behaviour to be restored.
  • Some code generation issues have been corrected.
  • Some possible causes of the following internal faults have been addressed:
    0x0da336, 0x2bb15d, 0x42983d, 0x63faa5, 0x9005f2, 0x87ecef, 0xca4d2f, 0xe35e83,
    0xf25893, #1620 (afterburner-unimplemented-2), #2409 (bad simd operation), #2409 (underflow).

Linker (armlink):

  • The linker could previously load another object from a library to resolve a reference it had already loaded. This could result in "L6200E multiply defined symbol" errors. The linker will now not search a library again if it already has a definition of a symbol.
  • The linker now correctly faults the use of legacy ADS objects, and pre-RVCT3.1 objects built with --apcs /adsabi.
  • Before moving a veneer to another execution region (to promote veneer sharing or to use a short branch veneer rather than a long branch veneer) the linker now checks whether the target execution region is allowed to contain code.
  • The link step could be slow and/or run out of memory when processing DWARF2 debug information.

ELF Format Convertor (fromelf):

  • fromelf no longer names output files incorrectly for input images containing multiple load regions.
  • fromelf --fieldoffsets could hang or fail with "Fatal error: Q0106E: Out of Memory" where there are structures with the same name in different objects.

Build 616

RVCT 3.1 patch build 616 includes the following corrections and improvements since RVCT 3.1 build 569:

Compiler (armcc):

  • The compiler was incorrectly generating a spurious subscript-out-of-range warning for huge arrays
  • The compiler was incorrectly generating an error message when compiling inlined CLZ instruction on v5T
  • The compiler now generates better code for local array initializers in C++ and C99 modes
  • The dynamic import tag is now kept for certain library functions (such as memcpy), where the compiler has optimised them from different library functions (such as strcpy)
  • The __smc intrinsic is now recognized as v6Z specific instruction
  • Fixed a segmentation fault when combining pre-increment/decrement on volatile long long type and assignment into one C statement
  • The compiler no longer emits unneeded template static data at -O0
  • Improved optimization of range reduction loops (fewer calls to the __aeabi_idivmod library function) at -O3 -Otime
  • Some DWARF debug info corrections have been made, including:
    DW_AT_sibling in .debug_info now points to the correct place
    Debug info is now properly nested in namespaces
  • Some code generation issues have been corrected
  • Some possible causes of these internal faults have been addressed, including:
    0x3e840d, 0x2bb15d, 0xafee20, 0xfe1945, 0x87ecef, 0x2cc72c, 0xe35e83, 0xca7b8d, 0xca4d2f, 0x7b54d8, 0xe46b32, 0x28aa97, 0x1e1ec0, 0xa95fee, 0x870a6f, #1620 (dw_propagate_up-op), #2409 (underflow), #2409 (bad simd operation)

Linker (armlink):

  • Debug section commoning/merging is now performed correctly
  • The linker could give incorrect error messages when "--feedback_image noerrors" is used
  • The linker could incorrectly display warning message "L6632W: Subtraction underflow" against addresses in scatter file
  • The linker could incorrectly display warning message "L6385W: Addition overflow" against address addition in scatter file
  • The linker could generate error L6286E when assigning a veneer to a padding region
  • The linker could corrupt ARM instructions that do not use condition codes when --inline is used
  • The linker's library selection mechanism could ignore symbols in dynamic libraries
  • The "--info veneers,veneercallers" could cause veneercallers output to be discarded
  • Minor improvement on comment section commoning
  • Auto placement of __at sections now places in execution regions without limit
  • The linker now generates diagnostics when trying to generate Thumb-2 or Thumb PLT sequence

Assembler (armasm):

  • Fixed some possible causes of internal faults 0x477a81 & 0x850686
  • CPY instruction is now recognized as a valid instruction

ELF Format Convertor (fromelf):

  • The "--nolinkview" or "--strip all" could incorrectly remove program segments
  • fromelf could show spurious zeroes in load segment disassembly
  • fromelf no longer outputs incorrectly named zero size binary

Librarian (armar):

  • armar was not creating symbol table when there are no external symbols
Download (Login Required) EULA included in archive


We use cookies to give you the best experience on our website. By continuing to use our site you consent to our cookies.

Change Settings

Find out more about the cookies we set