Appendix A. Sourcery G++ Lite Release Notes
Prev |  | Next

## Appendix A. Sourcery G++ Lite Release Notes

This appendix contains information about changes in this release of Sourcery G++ Lite for ARM EABI. You should read through these notes to learn about new features and bug fixes.

## A.1. Changes in Sourcery G++ Lite for ARM EABI

This section documents Sourcery G++ Lite changes for each released revision.

### A.1.1. Changes in Sourcery G++ Lite 2010.09-51

GCC fix for duplicated symbols. A GCC optimizer bug that caused multiple definitions of local symbols has been fixed. Code affected by the bug was rejected by the assembler.

NEON code generation fix. A GCC bug has been fixed that resulted in an assembler error `VFP/Neon double precision register expected`.

Static data size improvement at `-Os`. When optimizing for size, the compiler no longer implicitly adds padding bytes to align static and local arrays on word boundaries. This fixes static data size regressions introduced since GCC 4.4. The additional alignment is still used when optimizing for speed.

New `-fstrict-volatile-bitfields` option. The compiler has a new option, `-fstrict-volatile-bitfields`, which forces access to a volatile structure member using the width that conforms to its type. This option is enabled by default to conform to the ARM EABI. Refer to the GCC manual for details.

Internal compiler error fixes. A bug has been fixed that caused the compiler to crash on code containing a `typedef` alias for `__builtin_va_list` with option `-femit-struct-debug-baseonly`. A second bug has been fixed that caused a crash when compiling code using C99 variable-length arrays. Additionally, a compiler crash on code using 64-bit integer multiplications with NEON vectorization enabled has also been fixed.

NEON narrowing-move instructions. The compiler now supports narrowing-move instructions when auto-vectorizing for NEON. Loops accessing arrays of `char` or `short` values are now more likely to be vectorized.

Improved support for atomic memory builtins. The compiler support for built-in atomic memory access operations on ARMv7 targets has been improved. These builtins are documented in the GCC manual.

Linker debug information fix. A bug in linker processing of debug information has been fixed. The bug sometimes prevented the Sourcery G++ debugger from displaying source code if the executable was linked with the `--gc-sections` option.

Absolute branch bug fixes. A bug that caused the assembler to crash on a branch to an absolute address has been fixed. Linker handling of the resulting relocations has also been improved. Previously this caused an invalid switch to ARM mode on ARMv7-M devices.

`VMOV` instruction bug fix. A bug that caused the assembler to incorrectly reject certain valid immediate operands for the `VMOV` instruction has been fixed.

Debugger warnings quieted. GDB no longer prints `RMT ERROR` diagnostics on connection to the Sourcery G++ Debug Sprite. In spite of the alarming appearance of the messages, they were not actually indicative of a serious problem.

### A.1.2. Changes in Sourcery G++ Lite 2010.09-22

Changes to Sourcery G++ version numbering. Sourcery G++ product and Lite toolchains now uniformly use a version numbering scheme of the form 2010.09-51. The major and minor parts of the version number, in this case 2010.09, identify the release branch, while the final component is a build number within the branch. There are also new preprocessor macros defined by the compiler for the version number components so that you may conditionalize code for Sourcery G++ or particular Sourcery G++ versions. Details are available in the Sourcery G++ Knowledge Base.

GCC fix for reference to undefined label. A bug in the optimizer that caused GCC to emit references to undefined labels has been fixed.

Precision improvement with vectorization enabled. The GCC auto-vectorizer no longer uses NEON floating-point instructions unless the `-funsafe-math-optimizations` option (implied by `-ffast-math`) is specified. This is because NEON hardware does not fully support the IEEE 754 standard for floating-point arithmetic. In particular, very small quantities may be flushed to zero.

Alignment attributes. A bug has been fixed that caused the compiler to ignore alignment attributes of C++ static member variables where the attribute was present on the definition, but not the declaration.

`naked` attribute semantics. The `naked` function attribute now also implies the `noinline` and `noclone` attributes. This fixes bugs resulting from invalid optimizations of functions with this attribute.

Stack corruption bug fix. A bug in GCC has been fixed that caused stack corruption in functions with the `interrupt` attribute.

GCC bug fix for push multiple instruction generation. A bug has been fixed that caused GCC to generate incorrect push multiple instructions, causing an assembler warning `register range not in ascending order`.

Thumb-2 internal compiler error fix. A bug has been fixed that caused the compiler to crash when compiling Thumb-2 code using 64-bit integer arithmetic.

Compiler optimization improvements. The compiler has been enhanced with a number of optimization improvements, including:

- More efficient assignment for structures containing bitfields.
- Better code for initializing C++ arrays with explicit element initializers.
- Improved logic for eliminating/combining redundant comparisons in code with nested conditionals.
- Better selection of loop variables, resulting in fewer temporaries and more efficient register usage.
- More optimization of references to globals in position-independent code.
- Various Thumb code generation improvements.
- Better code when constant addresses are used as arguments to inline assembly statements.
- Better code for copying small constant strings.
- Improved tuning for Cortex-M4 processors.
- Cortex-A9 specific tuning for VFP and NEON instructions.
- Use of more NEON features.

Preprocessor symbols for floating-point calling convention. Built-in preprocessor symbols `__ARM_PCS` and `__ARM_PCS_VFP` are now defined to indicate the current floating-point calling convention.

GCC version 4.5.1. Sourcery G++ Lite for ARM EABI is now based on GCC version 4.5.1. For more information about changes from GCC version 4.4 that was included in previous releases, see `http://gcc.gnu.org/gcc-4.5/changes.html`.

New `-Wdouble-promotion` warning option. The compiler has a new option, `-Wdouble-promotion`, which enables warnings about implicit promotions of `float` values to `double`. This option is useful when compiling code for processors (such as ARM Cortex-M4) that have hardware support for single-precision floating-point arithmetic only, where unintentional use of double precision results in dramatically slower code.

Linker bug fix. A bug that caused the linker error `relocation truncated to fit: R_ARM_THM_JUMP24` when linking some Thumb-2 applications has been fixed.

Assembler PC-relative store fix. A bug that caused the assembler to reject some valid PC-relative store instructions has been fixed. It now issues a warning instead for architectures where these instructions are deprecated.

ARMv7-A linker bug fix. A bug in the linker support for `--fix-cortex-a8`, which is enabled by default when linking ARMv7-A objects, has been fixed. Programs affected by the bug sometimes crashed with segmentation fault or illegal instruction errors.

Smaller C++ programs with `-g`. An assembler bug has been fixed that caused unnecessary references to exception-handling routines from C++ programs when debug information is enabled. For programs that do not otherwise use exceptions, this change results in smaller code size.

Additional validation in the assembler. The assembler now diagnoses an error, instead of producing an invalid object file, when directives such as `.hidden` are missing operands.

Assembler PC-relative load fix. An assembler bug that caused the assembler to reject some references to global symbols has been fixed. This bug affected Thumb instructions of the form `ldr r0, `symbol``.

Strip bug fix. A bug in the `strip` and `objcopy` utilities, which resulted in stripped object files that the linker could not recognize, has been fixed.

Binutils update. The binutils package has been updated to version 2.20.51.20100809 from the FSF trunk. This update includes numerous bug fixes.

Additional alignment in CS3-defined linker scripts. Sourcery G++ now ensures 8-byte alignment at additional points in CS3-defined linker scripts. Previously, placing a symbol in certain sections broke the initialization of the `.data` and/or `.bss` sections.

Newlib update. The Newlib package has been updated to version 1.18.0, with additions from the community CVS trunk as of 2010-08-12. This update provides additional wide-character functions, along with other bug fixes and enhancements.

`malloc` fix. A bug that sometimes caused `free` to dereference an invalid address has been fixed. The bug was caused by incorrect handling within `malloc` of calls to `sbrk` from outside of `malloc`.

Improved support for debugging RealView® C++ programs . GDB has been enhanced to handle some debug information contained in binaries produced by the ARM RealView® compiler. Formerly, GDB sometimes crashed on programs which use C++ templates. Another bug has been fixed that caused GDB to fail to place breakpoints in binaries produced by the ARM RealView® compiler when the source file location for the breakpoint was specified as an absolute pathname.

GDB update. The included version of GDB has been updated to 7.2.50.20100908. This update adds numerous bug fixes and new features, including improved C++ language support, a new command to save breakpoints to a file, a new convenience variable `$_thread` that holds the number of the current thread, among many other improvements.

GDB crash fix. A bug has been fixed that caused GDB to crash on launch if the environment variable `CYGPATH` is set to a program that does not exist or cannot be executed.

Debug Sprite abnormal termination bug fix. The Sourcery G++ Debug Sprite no longer terminates abnormally if GDB is killed while the target is waiting for semihosted I/O to complete. The bug was only triggered when running GDB on a Windows host.

Semihosting support for `gettimeofday`. The Sourcery G++ Debug Sprite now provides a semihosted implementation of the `gettimeofday` C library function.

### A.1.3. Changes in Sourcery G++ Lite 2010q1-188

ARM internal compiler error fix. A bug that caused the error `internal compiler error: in get_arm_condition_code` when compiling code using 64-bit integers has been fixed.

Improved NEON code generation for 0.0 constants. The compiler now generates better code for loading double float 0.0 constants on processors supporting NEON instructions.

Incorrect linker-generated functions. A bug that caused some linker-generated functions (including stubs to support interworking from ARM mode to Thumb mode and stubs to implement long branches) to jump to invalid offsets has been fixed.

Improved support for debugging RealView® programs with inlined functions . GDB has been enhanced to better handle debug information for inlined functions contained in binaries produced by the ARM RealView® compiler. Formerly, local variables in inner function scopes would become unavailable at calls to static inline functions. GDB now also includes inlined functions in the stack trace in binaries produced by RealView® versions earlier than 4.0. In addition, GDB's support for stepping over inline functions in programs built with such compilers has been improved.

Long branch fix. A bug has been fixed that caused the linker to generate ARM-mode instructions for long branches on ARM v6-M. The linker now generates Thumb instructions.

Improved code generation for `if` statements. The compiler can now generate better code for `if` statements when the then and else clauses contain similar code.

Assembler encoding bug fixes. Several bugs in the assembler have been fixed that caused selection of incorrect encodings for some instructions that have multiple encodings. The incorrect encodings are not believed to have affected runtime behavior but were not in conformance with the canonical encodings specified by the ARM ARM. The `objdump` command has also been fixed to decode such instructions correctly.

ARMv7-A performance improvements. The compiler has been enhanced to produce faster code for the ARM architecture, particularly for ARMv7-A cores, when compiling using the `-O2` option. This results in a significant improvement in performance relative to CodeSourcery's 2009q3 releases.

Linker performance improvement. A bug in the linker that caused applications with many input files to link slowly has been fixed.

ARM EABI 2.08. The toolchain has been updated to implement ARM EABI 2.08 (October 2009).

Weak symbols. An assembler bug has been fixed that caused incorrect code to be generated for references to weak symbols when a default definition is also provided in the same file.

GDB shared library support. GDB now supports targets that report loaded shared libraries using the `qXfer:libraries:read` Remote Serial Protocol packet. For more information, see the GDB manual.

Optimization of ARM NEON `vdupq_n*` intrinsics. The compiler now generates better code for `vdupq_n*` intrinsics to load particular constants.

Linker bug fix for `--section-start`. A linker bug that caused `--section-start` to fail to work as documented if the section is defined in multiple object files has been fixed.

GCC inline assembly bug fixes. A bug that caused NEON/VFP registers specified in the clobber list of inline assembly statements to be saved and restored incorrectly has been fixed. Another bug that caused incorrect code when double-precision or quad-precision registers were specified in the clobber list has also been fixed.

Assembler segmentation fault fix. A bug has been fixed that caused the assembler to crash when processing some data filling directives, such as `.fill 0, 0, 0`.

Linker bug with Cortex-A8 erratum fix. A bug in the `--fix-cortex-a8` linker option, which is enabled by default when linking ARMv7-A objects, has been fixed. The bug could cause the linker to generate incorrect shared libraries.

Improved code generation for Cortex-A5. The compiler has been enhanced to provide instruction scheduling for Cortex-A5 cores. To take advantage of this, use the `-mcpu=cortex-a5` command-line option.

Improved support for debugging RealView® programs . GDB has been enhanced to handle some debug information contained in binaries produced by the ARM RealView® compiler. Formerly, GDB sometimes crashed on these programs and libraries.

Linker script processing improvement. The linker can now automatically place sections that are not mentioned in your linker script. Previously, it issued the error `no memory region specified for loadable section`.

Better use of NEON instructions on Cortex-A8. The compiler now generates better code when optimizing for the Cortex-A8 by being less eager to use NEON instructions.

Assembler segmentation fault fix. A bug has been fixed that caused the assembler to crash when assembling some Thumb-only instructions in ARM mode. The assembler now gives an error on all incorrect uses of Thumb-only instructions in ARM mode.

GCC internal compiler error. A bug has been fixed that caused GCC to crash when compiling some C++ code using templates at `-O2` or `-O3`.

Linker script compatibility. A bug that caused the linker error `undefined reference to `__cs3_start_asm'` has been fixed. The bug applied to projects using a linker script from an older version of Sourcery G++ with a newer CS3 library.

GCC internal compiler error with `optimize` attribute. A bug has been fixed that caused the compiler to crash when invoked with the `-O0` or `-O1` option on code using the `optimize` attribute to specify higher optimization levels for individual functions.

C++ array initializer optimization. The compiler now generates better code for some non-constant array initializations in C++.

### A.1.4. Changes in Sourcery G++ Lite 2010q1-155

IPSR register. A bug in the Sourcery G++ Debug Sprite that caused only five bits of the M-profile `IPSR` register to be displayed in the debugger has been fixed.

Support for ARM Cortex-M4 cores. Sourcery G++ now includes support for ARM Cortex-M4 cores. Use the `-mcpu=cortex-m4` command-line option.

Debugging preprocessed source code. A compiler bug has been fixed that caused debug output to erroneously contain the name of the intermediate preprocessed file.

Thumb-2 size optimization improvements. The compiler has been enhanced to produce smaller code for the ARM architecture, particularly for Thumb-2 mode, when compiling using the `-Os` option. This results in a significant improvement in code size relative to CodeSourcery's 2009q3 releases.

GDB update. The included version of GDB has been updated to 7.0.50.20100218. This update adds numerous bug fixes and new features, including improved C++ language support, automatic caching of stack memory, and Position Independent Executable (PIE) support.

CS3 program startup behavior revised. CS3's model for program startup has been made more uniform across different target profiles. Changes include:

- Execution now consistently begins at hard reset (`__cs3_reset`) for all profiles. Formerly, the debugger began execution at assembly initialization (`_start`) instead.
- All profiles now perform the assembly initialization phase, using profile-specific code. Formerly, simulator and boot monitor profiles skipped this initialization phase.

Most existing programs using customized linker scripts or startup code based on the previous CS3 initialization model should continue to work as before with the new CS3 library. For more details on the CS3 startup model, refer to Section 5.2, “Program Startup and Termination”.

CS3 improvements. Several changes have been made to CS3 to make it easier to customize, including improved documentation and additions and corrections to the header file `cs3.h`. For details, see Chapter 5, “CS3™: The CodeSourcery Common Startup Code Sequence”.

GDB asynchronous mode fix. GDB can now be used from the command line in asynchronous mode with remote targets. Previously, GDB did not accept user input while asynchronous commands (such as `continue &`) were running.

GDB interrupt handling bug fix. A bug in GDB has been fixed that caused it to sometimes fail to indicate that the target had stopped after being interrupted. The bug affected clients using GDB's MI front end.

GDB and programs linked with the `--gc-sections` linker option. GDB has been improved to better handle debug information found in programs and libraries linked with the `--gc-sections` option. GDB formerly selected the wrong debug information in some cases, resulting in incorrect behavior when stepping over a function or displaying local variables, for example.

GDB memory find bug fix. A bug in GDB's `find` command has been fixed. The bug caused searches on large memory areas to fail or report matches at incorrect addresses.

Debugger errors after loading program. A bug in GDB has been fixed that sometimes caused a GDB internal error after the `load` command.

Frame manipulation bug fix. A bug in GDB has been fixed that caused frame manipulation commands to report an internal error in some cases when used on arbitrary stack frames specified by an address.

Read watchpoints bug fix. A GDB bug has been fixed that caused watchpoints set to trigger on memory reads to be silently ignored in some cases.

GDB load improvement. GDB now automatically initializes ARM Cortex-M devices to Thumb mode on the `load` command. This is helpful, for example, when an incorrect program image was previously flashed onto the board, causing it to enter an invalid state on reset.

Setting thread-specific breakpoints in GDB. A bug in GDB has been fixed that caused a syntax error for the `break *`expression` thread `threadnum`` command.

Backtracing through ARM M-profile exceptions. GDB now supports backtracing through processor exceptions on ARMv6-M and ARMv7-M targets, including Cortex-M3.

Backtracing through noreturn functions. A compiler bug that made it impossible to obtain a backtrace through functions declared with the `noreturn` attribute has been fixed. This fix makes it possible for the debugger to present a useful stack backtrace for applications that call `abort`.

`vcvt` assembly bug fix. A bug that caused `vcvt.s32.f64` instructions to be misassembled as `vcvtr.s32.f64` has been fixed.

Branches between ARM and Thumb fix. An assembler bug that caused incorrect branches between ARM and Thumb code in different sections has been fixed.

Assembler segmentation fault fix. A bug has been fixed that caused the assembler to crash when processing code containing invalid Thumb-mode instructions such as `ldr r0, 0`. The assembler now produces an error message in such cases.

Assembler fix for Thumb-2. A bug that caused the assembler to reject some valid Thumb-2 `strexd` instructions has been fixed.

NEON assembler fix. The assembler now correctly handles the three-operand form of NEON logic instructions, such as `vorr.i32 q0, q0, #0xff`

Warning for deprecated instructions. The assembler now issues warnings about uses of `swp` or `swpb` instructions on architectures where they have been deprecated.

Additional error checks in the assembler. The assembler has been improved to perform a number of additional checks for invalid inputs. In particular, it now diagnoses additional invalid uses of the PC and SP registers, as specified in the ARM documentation. The assembler now also rejects invalid NEON alignment qualifiers, such as `vld1.8 {d0}, [r0, :128]` and `vld1.8 {q0}, [r0, :256]`.

Thumb-2 multiply fix. A bug that caused an invalid `muls` instruction to be generated in certain circumstances has been fixed. This affected code compiled for Thumb-2, and resulted in an error from the assembler.

Debug Sprite multiple connections fix. When started with the `-m` option, the Sourcery G++ Debug Sprite no longer exits if the connection to GDB is lost when sending a response. Instead, it goes back to waiting for another connection.

Disassembler bug fix. A bug in the disassembler has been fixed that caused incorrect output for data objects, including literal pools and the interrupt vector.

Improved code generation for Cortex-A9. The compiler has been enhanced to provide better instruction scheduling for Cortex-A9 cores. To take advantage of this, use the `-mcpu=cortex-a9` command-line option.

Improved NEON code generation. GCC's code generation for NEON targets (e.g., when compiling with `-mfpu=neon`) has been improved. In particular, the compiler can now make use of NEON instructions for many 64-bit integer operations.

Indirect function call optimization. The instruction sequence used to implement calls via a function pointer has been improved to give better branch-prediction performance on some processors.

Thumb-2 function call optimization. The compiler has been enhanced to generate improved code on Thumb-2 targets for functions that return via calls to other functions.

Watchpoint fix. A bug in the Sourcery G++ Debug Sprite that sometimes prevented watchpoints on Cortex-M targets from functioning has been fixed.

Optimizer bug fix. A bug in GCC that caused internal compiler errors at `-O2` or above has been fixed. The bug also occurred at other optimization levels when the `-fpromote-loop-indices` command-line option was used.

Internal compiler error fix. A bug that caused an internal compiler error when using `-fno-omit-frame-pointer` to compile code for Thumb-2 has been fixed.

Thumb-2 internal compiler error fix. A bug that caused an internal compiler error when building the QT library for Thumb-2 has been fixed.

Incorrect symbol addresses bug fix. A bug in the linker that caused it to assign incorrect addresses to symbols has been fixed. The bug occurred when the input objects contained sections not explicitly mentioned in the linker script.

Static constructor and destructor ordering fixes. The linker now correctly ensures that static destructors with priorities are executed after destructors without priorities. Another linker bug that caused incorrect static constructor and destructor ordering with partial linking involved has been fixed.

Linker fix for data-only sections. A bug has been fixed that caused the linker to incorrectly mark parts of the output as containing code, rather than data, when linking data-only sections not explicitly tagged as such. The bug resulted in incorrect disassembly.

Linker relocation diagnostics. A bug that caused the linker to incorrectly diagnose overflows for some valid relocations has been fixed.

C++ name-mangling of `va_list`. The compiler no longer issues `the mangling of 'va_list' has changed` warnings for references to `std::va_list` within system header files.

### A.1.5. Changes in Sourcery G++ Lite 2009q3-68

Out-of-range branch error. A compiler bug has been fixed that caused out-of-range branch errors from the assembler. The bug only affected code compiled in Thumb-2 mode.

### A.1.6. Changes in Sourcery G++ Lite 2009q3-64

GDB crash fix. A GDB bug has been fixed that caused GDB to crash when unloading shared libraries or switching executables.

`@`FILE`` fix. A bug has been fixed in the processing of `@`FILE`` command-line options by GCC, GDB, and other tools. The bug caused any options in `FILE` following a blank line to be ignored.

Preprocessor error handling. The preprocessor now treats failing to find a file referenced via `#include` as a fatal error.

NEON improvements. The compiler now generates improved NEON vector code when copying memory or storing constants to memory using the NEON coprocessor. The compiler also generates better code for accessing data arrays that are not known to have 64-bit alignment. In addition, a bug that caused internal compiler errors when compiling for Thumb-2 with NEON enabled has been fixed, as has another bug that caused some vector shift NEON operations to be wrongly rejected.

ELF file corruption with `strip`. A bug that caused `strip` to corrupt unusual ELF files has been fixed.

GDB support for Cygwin pathnames. A bug in GDB's translation of Cygwin pathnames has been fixed.

Compiler errors with `float32_t`. A bug has been fixed that caused compiler errors when using the `float32_t` type from `arm_neon.h`.

Support for ARM Cortex-A5 cores. Sourcery G++ now includes basic support for ARM Cortex-A5 cores. Use the `-mcpu=cortex-a5` command-line option.

Static variables and `asm` statements bug fix. A bug in GCC that caused functions containing static variables and `asm` statements to be miscompiled at `-O2` or above has been fixed. The bug also occurred at other optimization levels when the `-fremove-local-statics` command-line option was used.

Linker script fixes. A bug in CS3 linker scripts for simulator profiles has been fixed. The bug resulted in data memory being too small, which sometimes caused the stack to be overwritten during initialization, or reduced space for `malloc` to allocate.

Warnings for naked functions. A compiler bug that resulted in incorrect warnings about missing return statements in non-void functions declared with the `naked` attribute has been fixed.

Optimizer bug fix. A bug in GCC that caused functions with complex loop nests to be miscompiled at `-O2` or above has been fixed. The bug also occurred at other optimization levels when the `-fpromote-loop-indices` command-line option was used.

VFPv4 support. Sourcery G++ now includes support for VFPv4, VFPv4-D16 and NEON-VFPv4 coprocessors. Use the `-mfpu=vfpv4`, `-mfpu=vfpv4-d16` or `-mfpu=neon-vfpv4` options, respectively.

GCC internal compiler error. A bug has been fixed that caused the compiler to crash when optimizing code that casts between structure types and the type of the first field.

Flash programming support on Atmel AT91SAM7Sxxx. The Sourcery G++ Debug Sprite now supports flash programming on Atmel AT91SAM7Sxxx when using SEGGER J-Link devices.

ELF Program Headers. The linker now better diagnoses errors in the usage of `FILEHDR` and `PHDRS` keywords in `PHDRS` command of linker scripts. Refer to the linker manual for more information.

### A.1.7. Changes in Sourcery G++ Lite 2009q3-37

Improved optimization for ARM. GCC now automatically enables loop unrolling and `-fpromote-loop-indices` when `-O2` or `-O3` is specified. Loop unrolling is limited at `-O2` to control code growth. These changes improve performance by more than 5%.

VFP assembly mnemonics. The assembler now accepts unified assembly mnemonics for VFP instructions (e.g. `VADD.f32 s0, s0`) in legacy syntax mode.

ARM Cortex-R4F assembler bug fix. The assembler now correctly recognizes the `-mcpu=cortex-r4f` command-line option to select the Cortex-R4F processor.

VFP half-precision extensions. Sourcery G++ now includes support for VFP coprocessors with half-precision floating-point extensions. This can be enabled with the `-mfpu=vfpv3-d16-fp16` or `-mfpu=vfpv3-fp16` command-line options.

Optimizer improvements. When optimizing for speed, the compiler now uses improved heuristics to limit certain types of optimizations that may adversely affect both code size and speed. This change also makes it possible to produce better code when optimizing for space rather than speed.

Improved optimization for Thumb-2. GCC now supports instruction scheduling for Thumb-2 code. This optimization is enabled when compiling with `-O2`, `-O3`, or `-Os`, and can improve performance substantially.

ARM VFP assembler bug fix. The assembler now correctly assembles the `vmls`, `vnmla` and `vnmls` mnemonics. Previously these were incorrectly assembled to different instructions.

GDB `finish` internal error. A bug has been fixed that caused a GDB internal error when using the `finish` command. The bug occurred when debugging optimized code.

Linking objects built without `-fPIC` into shared libraries. The linker now gives an error for attempts to link object files built without `-fPIC` or `-fpic` into shared libraries when those objects use the ARMv7 `MOVW` and `MOVT` instructions in ways that are unsafe in a shared library. Previously it built a shared library that behaved incorrectly when used.

GDB update. The included version of GDB has been updated to 6.8.50.20090630. This update adds numerous bug fixes and new features, including support for multi-byte and wide character sets and improved C++ template support.

New assembler directive `.inst`. The assembler now accepts the new `.inst` directive to generate an instruction from its integer encoding.

GDB and third-party compilers. Some bugs that caused GDB to crash when debugging programs compiled with third-party tools have been fixed. These bugs did not affect programs built with Sourcery G++.

Remote debugging hardware watchpoint bug fix. A GDB bug has been fixed that caused hardware watchpoint hits to be incorrectly reported in some cases.

Internal error in assembler. An assembler bug that caused an internal error when `.thumb` or `.arm` appears after an invalid instruction has been fixed.

GDB internal warning fix. A GDB bug has been fixed that caused warnings of the form `warning: (Internal error: pc `address` in read in psymtab, but not in symtab.)`.

Incorrect linker diagnostic removed. The linker has been corrected to not emit an error message when the load address of an output section with no contents overlaps an output section with contents. This can occur in linker scripts that use `MEMORY` regions and `AT>` to place initialized contents into ROM.

Improved bit counting operation. The `__builtin_ctz` built-in function, which returns the number of trailing zero bits in a value, has been improved to use a shorter instruction sequence for ARMv6T2 and later.

Out-of-range branch errors. A Thumb-2 code generation defect in the compiler that caused `branch out of range` errors from the assembler has been eliminated.

Binutils update. The binutils package has been updated to version 2.19.51.20090709 from the FSF trunk. This update includes numerous bug fixes.

Linker fix. The linker now correctly processes references to undefined local symbols. Such references are treated the same as references to undefined global symbols. Usually object files contain no such references, as they can never be satisfied.

Assembler validation improvements. The assembler now issues a warning when a section finishes with an unclosed IT instruction block at the end of the input file. It also now rejects unwinding directives that appear outside of a `.fnstart`/`.fnend` pair. Additionally, 32-bit Thumb instructions are now correctly rejected when assembling for cores that do not support these instructions.

Destructor function bug fix. A bug in CS3 has been fixed that caused functions with the `destructor` attribute not to be run on program termination.

Assembler validations fix. A bug in the assembler that caused some `addw` and `subw` instructions with SP or PC as operand to be wrongly rejected has been fixed.

`-mauto-it` assembler option replaced with `-mimplicit-it` . The `-mauto-it` command-line option to the assembler has been replaced with a more general `-mimplicit-it` option to control the behavior of the assembler when conditional instructions appear outside an IT instruction block. If you were previously using `-mauto-it`, you should now use `-mimplicit-it=always`. Other `-mimplicit-it` modes allow you to separately control implicit IT instruction insertion behavior in ARM and Thumb-2 code. For more information, refer to the assembler manual. In addition to renaming the option, a number of bugs in the implicit IT generation have been fixed.

GDB backwards compatibility fix. A bug has been fixed that caused GDB to crash when loading symbols from binaries built by very old versions of GCC.

Linker failure with Cortex-A8 erratum fix. A bug in the `--fix-cortex-a8` linker option has been fixed. The bug caused the linker either to produce a `bad value` error, or to silently generate an incorrect executable.

Debug information for variadic functions. A compiler bug that resulted in incorrect debug information for functions with variable arguments has been fixed.

Overlay sections. `arm-none-eabi-readelf` now correctly recognizes section headers for `ARM_DEBUGOVERLAY` and `ARM_OVERLAYSECTION` sections.

Code generation improvements. The compiler has been changed to make better use of VFP registers in mixed integer and floating-point code, resulting in faster code.

Register variable corruption. A compiler bug has been fixed that caused incorrect code to be generated when the frame pointer or other special-use registers are used as explicit local register variables, introduced via the `asm` keyword on their declarations.

Startup code debugging fixes. Two GDB bugs have been fixed that caused errors when debugging startup code. One bug caused an internal error message; the other caused the error `Cannot find bounds of current function`.

Assembler fix for mixed Thumb and ARM mode. A bug in the assembler has been fixed where mapping symbols were sometimes incorrectly placed at section boundaries. This could lead to incorrect disassembly in some cases.

C++ exception matching. A C++ conformance defect has been fixed. According to clause 15.3 of the standard, given a derived class `D` with base `B`, a thrown `D *` object is not caught by a handler with type `B *&` (that is, a reference to pointer `B`). The compiler formerly treated this case incorrectly as if the handler had type `B *`, which does catch `D *`.

`-fremove-local-statics` optimization. The `-fremove-local-statics` optimization is now enabled by default at `-O2` and higher optimization levels.

Elimination of spurious warnings about `NULL` . The C++ compiler no longer issues spurious warnings about comparisons between pointers to members and `NULL`.

Vectorizer improvements. The compiler now generates improved code for accesses to static nested array variables (e.g. `static int foo[8][8];`).

Linker bug fix. A bug that caused the linker to crash when `.ARM.exidx` sections were discarded by a linker script has been fixed.

Configuration file required for Debug Sprite. When invoking the Sourcery G++ Debug Sprite from the command line, it is now required to specify a board configuration file argument. This change eliminates a source of confusion and errors resulting from accidental omission of the configuration file argument, since recent improvements to debugger functionality depend on properties specified in the configuration file. Refer to Chapter 6, “Sourcery G++ Debug Sprite” for more details on invoking the Sourcery G++ Debug Sprite from the command line.

GCC version 4.4.1. Sourcery G++ Lite for ARM EABI is now based on GCC version 4.4.1. For more information about changes from GCC version 4.3 that was included in previous releases, see `http://gcc.gnu.org/gcc-4.4/changes.html`.

Watchpoint support. The Sourcery G++ Debug Sprite now implements watchpoints on all currently-supported debugging devices.

Linker map address sorting. The map generated by the linker `-Map` option now lists symbols sorted by address.

Assembler fix. The assembler now correctly diagnoses a missing operand to `bl` and `blx` instructions. Previously, incorrect code was silently generated.

### A.1.8. Changes in Older Releases

For information about changes in older releases of Sourcery G++ Lite for ARM EABI, please refer to the Getting Started guide packaged with those releases.

Prev |  | Next
7.3. Manuals for GNU Toolchain Components | Home | Appendix B. Sourcery G++ Lite Licenses