Appendix A. Sourcery G++ Lite Release Notes

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

Table of Contents

A.1. Changes in Sourcery G++ Lite for ARM GNU/Linux

A.1. Changes in Sourcery G++ Lite for ARM GNU/Linux

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

A.1.1. Changes in Sourcery G++ Lite 2010q1-202

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.

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.

Thumb-2 backtrace fix.  A GLIBC bug has been fixed that caused corrupt backtrace output while a system call was in progress. In rare cases, this bug could also cause multi-threaded programs to crash. Only Thumb-2 runtime libraries were affected.

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.

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.

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.

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.

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.

Backtracing through library functions.  GLIBC has been improved to allow backtracing through system calls and other functions that formerly did not provide sufficient debug information to support this feature.

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.2. Changes in Sourcery G++ Lite 2010q1-156

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.

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.

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.

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.

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.

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

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

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].

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.

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.

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.

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.

EGLIBC version 2.11.  Sourcery G++ Lite for ARM GNU/Linux now includes EGLIBC version 2.11 library which is based on GNU C Library version 2.11. For more information about changes, see http://www.eglibc.org/news#eglibc_2_11.

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.

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.

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.

Thumb-2 single stepping.  GDB now supports stepping through Thumb-2 conditionally executed instructions. Earlier versions of GDB reported the error Stepping through Thumb-2 IT blocks is not yet supported. A bug that caused GDB to lose control when stepping over wide Thumb-2 branch instructions has also been fixed.

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.

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.

Improved backtrace function.  The backtrace function can now backtrace through C++ exception regions and through functions marked throw().

Dynamic library unloading and destructor ordering.  A bug that caused dynamic libraries loaded with dlopen to remain loaded after calling dlclose to unload them, and thus their destructors be called in the incorrect order has been fixed.

Optimized memcpy The EGLIBC implementation of memcpy has been further optimized for ARM targets.

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.

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.

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

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.

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

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 and was most likely to occur when building the Linux kernel.

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.

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.

Improved assembler error checking.  The assembler has been improved to perform additional checks for invalid inputs.

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.

A.1.4. Changes in Sourcery G++ Lite 2009q3-67

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.5. Changes in Sourcery G++ Lite 2009q3-65

ABI compliance.  The runtime libraries have been annotated with Tag_ABI_align8_needed and Tag_ABI_align8_preserved. This prevents errors when linking Sourcery G++ support libraries with the ARM RealView® linker.

Increased speed of memcpy and memmove The performance of memcpy and memmove on NEON-enabled ARM platforms is significantly improved, particularly when data is being copied between mis-aligned addresses.

gdbserver bug fix.  A bug has been fixed that caused gdbserver to crash when debugging programs using thread-local storage without other multi-threading features.

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.

Multi-threaded debugging fix.  A GDB bug has been fixed that caused the step command to hang when debugging a multi-threaded program.

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.

gdbserver multi-threaded debugging fix.  A bug has been fixed that prevented gdbserver from exiting after debugging a multi-threaded program.

Thumb-2 position-independent executables.  A bug that caused position-independent executables to fail to run correctly has been fixed. The bug only affected code compiled for Thumb-2 mode.

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.

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.

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.6. Changes in Sourcery G++ Lite 2009q3-38

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.

Linux kernel headers update.  Linux kernel header files have been updated to version 2.6.30.

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

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

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.

Register corruption bug in setjmp and longjmp A bug that could cause register corruption in setjmp and longjmp has been fixed.

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.

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.).

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.

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.

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.

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];).

EGLIBC version 2.10.  Sourcery G++ Lite for ARM GNU/Linux now includes EGLIBC version 2.10 library which is based on GNU C Library version 2.10. For more information about changes, see http://www.eglibc.org/news#eglibc_2_10.

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 5, “Sourcery G++ Debug Sprite” for more details on invoking the Sourcery G++ Debug Sprite from the command line.

Invalid relocations in startup code.  A bug that caused invalid relocations to be present in the C library startup code has been fixed. This bug caused problems when using these objects with third-party tools.

GCC version 4.4.1.  Sourcery G++ Lite for ARM GNU/Linux 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 Sourcery G++ Lite 2009q1-203

Internal compiler error with Cortex-A9.  A bug has been fixed that caused internal compiler errors when compiling with -mcpu=cortex-A9.

A.1.9. Changes in Sourcery G++ Lite 2009q1-200

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.

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.

Overloaded function resolution.  The C++ compiler now correctly diagnoses an error when the second operand of a comma expression is an unresolved set of overloaded functions. Previously, it incorrectly used the context of the comma expression to resolve the function.

Fix for backtrace function in dynamically-linked executables.  The backtrace function now reports backtraces for dynamically-linked executables. Previously, this function worked only with statically-linked executables, i.e., executables linked with -static.

Pointer-to-member functions.  A bug has been fixed that caused the C++ compiler to crash when compiling a pointer-to-member function reference without an explicit & operator. This syntax is allowed only when the -fms-extensions command-line option is used.

A.1.10. Changes in Sourcery G++ Lite 2009q1-176

Assembler fix for -mauto-it A bug in the assembler that caused incorrect assembly of branches has been fixed. The bug only occurred when automatically generating IT instructions using -mauto-it.

Fix for dlopen in statically-linked executables.  A bug has been fixed that made statically-linked programs crash when calling dlopen with RTLD_GLOBAL to request global availability of symbols from the shared module.

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

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

Incorrect placement of 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 avoid processor errata) to be placed in data sections has been fixed.

New option for automatically generating IT blocks.  The assembler now allows use of conditional Thumb-2 instructions without requiring explicit IT instructions. Use the -mauto-it command-line option to enable this automatic generation of IT instructions.

Optimized memcpy The implementation of memcpy has been optimized to increase performance on ARM targets that support prefetch instructions.

Optimized memory and string routines.  The implementations of memcpy, memset, strcmp, strcpy, and strlen have been optimized to increase performance on ARM targets.

Reduced compilation time.  Compilation and build times when using Sourcery G++ Lite are now slightly faster. This performance improvement is the result of building the compilers and other host tools with a recent version of Sourcery G++, rather than an older GCC version.

Support for GLIBC backtrace function.  Sourcery G++ Lite now supports the GLIBC backtrace function on ARM GNU/Linux targets. For more information, see Section 3.7, “GLIBC Backtrace Support”.

Assembler bug fix.  A bug in the assembler that caused duplicate and missing mapping symbols has been fixed. The bug caused incorrect objdump output and incorrect byte-swapping for BE8 configurations.

Stack backtracing and C++ exception handling.  Improvements have been made to the linker in support of C++ runtime exception handling and stack backtracing. A problem that caused crashes during the backtrace of C routines that were not compiled with the -fexceptions option has been fixed. In addition, the linker generates more compact stack unwinding tables which can lead to smaller executables.

Incorrect linker-generated functions.  A bug that caused some linker-generated functions (such as stubs to support interworking from ARM mode to Thumb mode) to contain only nop instructions instead of correct code sequences has been fixed.

Assembler diagnostics for invalid instructions.  The assembler now issues diagnostics for invalid ADR and ADRL instructions. Formerly, these invalid instructions were silently mis-assembled. This assembler bug did not affect correct code.

Sprite's failure to reset the target.  A bug has been fixed that sometimes caused the Sourcery G++ Debug Sprite to fail to reset the target when using the multiple sequential connection feature (enabled via the -m command-line option). This problem was specific to running the Debug Sprite on Microsoft Windows hosts.

Disassembler bug fix.  A bug has been fixed that caused incorrect disassembly of some object files with multiple sections whose symbol tables included symbols in the middle of functions. These typically resulted from hand-written assembly.

Linker crash with very large applications.  A linker bug that caused a crash when linking very large applications with the --fix-cortex-a8 command-line option has been fixed.

arm-none-linux-gnueabi-objcopy bug fix.  A bug has been fixed that caused arm-none-linux-gnueabi-objcopy to issue an error when generating output in the Intel HEX format and using --change-section-lma to change section addresses.

Linker script search path.  The bug in the linker has been fixed that caused it not to follow its documented behavior for searching for linker scripts named with the -T option. Now scripts are looked up first in the current directory, then in library directories specified with -L command-line options, and finally in the default system linker script directory.

Errors when inserting breakpoints.  A GDB bug has been fixed that caused errors of the form `function' found in filename psymtab but not in symtab when setting a breakpoint on function. This error commonly occurred when setting breakpoints on functions provided by the C library.

Cortex-A8 erratum workaround enabled for ARMv7-A.  The workaround for the erratum in Cortex-A8 processors mentioned below is now enabled by default if you are targeting the ARMv7-A architecture profile. The workaround can be disabled by passing the --no-fix-cortex-a8 option to the linker.

Internal compiler error when optimizing.  A bug has been fixed that caused internal compiler error: in build2_stat when compiling.

Erratum workaround for Cortex-A8 processors.  The linker now implements a workaround for an erratum in Cortex-A8 processors. If you are targeting an affected part and wish to use the workaround, pass the --fix-cortex-a8 option to the linker. Please contact ARM for further details of the erratum.

Maximum code alignment increased.  The maximum allowed code alignment has been increased from 32 to 64 bytes. This change affects the .p2align and .align assembler directives and the -falign-functions GCC option.

Corruption of block-scope variables.  A compiler optimization bug that sometimes caused corruption of stack-allocated variables has been fixed. The bug affected variables declared in a local block scope in functions containing multiple non-overlapping lexical block scopes, a technique commonly used by programmers to reduce stack frame size. In some rare cases, other optimizations performed by the compiler were ignoring the local extent of such block-scope variables.

ARM EABI attributes.  An assembler bug that resulted in some object files generated from hand-written assembly being incorrectly tagged as using VFP instructions has been fixed. This tagging was harmless for objects linked with Sourcery G++ tools and libraries, but may have affected third-party tools and libraries.

A.1.11. Changes in Sourcery G++ Lite 2009q1-123

Incorrect code when using -falign-labels A bug that caused the compiler to generate incorrect code for switch statements when the -falign-labels option is used has been fixed.

ARMv4T library selection.  Compiler options such as -mcpu=arm740t, specifying an ARMv4T CPU, now cause the compiler to link with the ARMv4T libraries without requiring -march=armv4t to be specified as well.

Core files in GDB.  A bug in GDB has been fixed that caused incorrect values for CPSR (the status register) to be displayed when debugging core files. In some cases, this bug could also cause the gcore command to crash GDB.

Loop optimization improvements.  A new option, -fpromote-loop-indices, has been added to the compiler. Specifying this option enables an optimization that improves the performance of loops with index variables of integer types narrower than the target machine word size, such as char or short. This optimization also applies to int on 64-bit targets.

Support for VFP and Advanced SIMD (NEON) register display.  The Sourcery G++ debugger can now display VFP and Advanced SIMD registers when debugging Linux applications with gdbserver. This may require a kernel patch; see Section 3.4, “Target Kernel Requirements” for details.

Extraneous linker error messages.  A linker bug that caused extraneous error messages of the form Dwarf Error: Offset (507) greater than or equal to .debug_str size (421). has been corrected. This bug did not affect the correctness of output binaries.

Assembler marking of data.  Data generated using the assembler directives .ascii, .asciz, .dc.d, .dc.s, .dc.x, .dcb, .dcb.b, .dcb.d, .dcb.l, .dcb.s, .dcb.w, .dcb.x, .ds, .ds.b, .ds.d, .ds.l, .ds.p, .ds.s, .ds.w, .ds.x, .double, .fill, .float, .incbin, .single, .space, .skip, .string, .string8, .string16, .string32, .string64, and .zero is now correctly marked by the assembler as data rather than code. This fixes incorrect byte-swapping of such data when linking for BE8 configurations.

VFP ABI support.  Sourcery G++ now supports the VFP variant of the Procedure Call Standard for the ARM® Architecture (AAPCS) in addition to the default soft-float ABI. The VFP ABI uses VFP registers to pass function arguments and return values, resulting in faster floating-point code. Code compiled with the VFP ABI is not compatible with the soft-float ABI libraries provided with Sourcery G++ Lite; however, VFP ABI libraries for little-endian ARM v7-A processors are now available as add-ons for Sourcery G++ Professional Edition. For further information about floating-point compiler, ABI and library support in Sourcery G++, refer to Section 3.8.1, “Enabling Hardware Floating Point”.

Improved vectorization.  Automatic vectorization for NEON now uses the fused multiply-add (VMLA) and fused multiply-subtract (VMLS) instructions. These fused instructions are faster than the equivalent two-instruction sequence consisting of a multiply followed by an add or subtract.

GDB quit error.  A bug in GDB has been fixed that caused quit to report Quitting: You can't do that without a process to debug. when debugging a core dump file.

Out-of-bounds accesses to stack arrays.  A bug has been fixed that caused internal compiler errors when some code involving out-of-bounds accesses to stack-allocated arrays was compiled with the -mthumb option. Such code is not valid C; although it is now accepted by the compiler and no diagnostic is issued, it has undefined behavior if executed.

A.1.12. Changes in Sourcery G++ Lite 2009q1-117

Thread cancellation in aio_suspend A bug in the Thumb-2 version of aio_suspend has been fixed that caused programs to crash if the calling thread was canceled.

Linking big-endian programs for ARMv7-A.  When linking for ARMv7-A targets with -mbig-endian, Sourcery G++ now implicitly assumes BE8 mode, rather than BE32.

GCC version 4.3.3.  Sourcery G++ Lite for ARM GNU/Linux is now based on GCC version 4.3.3. This is a bug fix update to GCC. For more information about changes from GCC version 4.3.2 that was included in previous releases, see http://gcc.gnu.org/gcc-4.3/changes.html.

Improved NOP generation for Thumb-2 cores.  The assembler now generates Thumb-2/ARMv6K architectural NOP instructions when alignment padding is required in code sections.

ARM atomic memory operations.  Support has been added for atomic memory operations in ARM Linux applications via built-in functions (for example, __sync_fetch_and_add). Please refer to the GCC manual (Atomic Builtins) for further information.

Internal compiler error with -O3 or -fpredictive-commoning A bug has been fixed that caused internal compiler errors when compiling some code with -O3 or -fpredictive-commoning.

CS3 board and processor support.  CS3 board and processor support has been cleaned up to remove entries that are not appropriate for or supported by Sourcery G++ Lite on ARM GNU/Linux targets. This includes processors for which Sourcery G++ Lite does not include appropriate run-time libraries. In addition, CS3 support files for boards and processors that do not have an MMU to support running the Linux kernel have been removed. These changes are intended to simplify processor and board selection.

C++ named operators bug fix.  A bug has been fixed that caused the compiler to crash in some cases when the C++ operators and_eq, bitand, bitor, compl, not_eq, or_eq and xor_eq were used in contexts where the preprocessor converts their names to strings.

Debug information for anonymous structure types.  A GCC bug in the generation of debug information for anonymous structure types in C++ code has been fixed. The bug caused printing the type information for such structures in the debugger (via the ptype command) to fail with an error message.

timer_delete bug.  A bug has been fixed that caused some programs to crash or hang after calling timer_delete.

Linker errors on non-ELF input.  A bug has been fixed that caused internal errors from the linker when linking non-ELF input files (with the -b or --format linker options).

Undefined weak references in shared libraries.  A linker bug has been fixed affecting calls from Thumb code in shared libraries to functions that are undefined weak references when the shared library is linked. Such calls executed as nops whether or not the functions were defined at run time. This affected thread-related code in the Thumb-2 versions of the standard C++ library provided with Sourcery G++, causing some multithreaded C++ programs to crash.

Improved code generation.  The compiler has been improved to generate better code for an integer multiplication whose result feeds into an addition.

Installer fails during upgrade.  The Sourcery G++ installer for Microsoft Windows hosts could fail during an upgrade while waiting for the previous version to be uninstalled. This bug has been fixed.

Performance improvements.  Tuning parameters for ARM code generation have been adjusted to improve performance of the generated code.

Uninstaller removed by upgrade.  The uninstaller could be incorrectly deleted during an upgrade on Microsoft Windows hosts. This bug has been fixed.

Remote debugging connection auto-retry.  The target remote command within GDB now uses a configurable auto-retry timeout when establishing TCP connections. This is useful in avoiding race conditions when the remote GDB stub or GDB server is launched simultaneously with GDB. The auto-retry behavior is enabled by default; refer to the GDB manual for details.

CMP Thumb-2 instruction.  The assembler no longer issues an error about CMP instructions in which the second argument is the stack pointer (r13), as these are valid instructions. However, use of the stack pointer in this context is deprecated in the current ARM architecture specification and the assembler now warns about the deprecated use.

DMB, DSB, and ISB instructions on ARMv6-M.  The assembler now accepts the DMB, DSB, and ISB instructions on ARMv6-M CPUs, including Cortex-M0 and Cortex-M1. These instructions were incorrectly rejected on these CPUs in previous releases.

Thumb half-precision floating point bug fix.  A compiler bug has been fixed that formerly caused incorrect code to be generated in Thumb mode for functions using half-precision floating-point constants. The bug did not affect Thumb-2 code.

Improved code generation.  The compiler has been improved to generate better code for integer multiplication by certain constants.

Thumb-2 switch code generation bug fix.  A bug has been fixed that caused incorrect Thumb-2 code to be generated for some switch statements. This affected code in the libraries provided with Sourcery G++ that handles cleanup attributes and POSIX thread cancellation.

Internal compiler errors when optimizing.  A defect that occasionally caused internal compiler errors when partial redundancy elimination (PRE) optimization was enabled has been corrected.

Install directory pathnames.  Bugs in the install and uninstall scripts for Linux hosts that caused errors or incorrect behavior when the Sourcery G++ install directory pathname contains whitespace characters have been fixed.

Internal compiler error with large NEON types.  A bug has been fixed that caused internal compiler errors when compiling code using NEON types at least 32 bytes wide.

Temporary files on Microsoft Windows.  On Microsoft Windows hosts, Sourcery G++ Lite now uses the standard Windows algorithm to choose the directory in which to place temporary files. This change eliminates a crash that occurred if none of the TEMP, TMP, or TMPDIR variables were set to a suitable directory.

Vectorized shift fix.  A bug has been fixed that caused incorrect code for loops containing a right shift by a constant. The bug affected code compiled with -mfpu=neon and loop vectorization enabled with -O3 or -ftree-vectorize.

Incorrect code for nested functions.  A bug in GCC that caused the compiler to generate incorrect code for nested functions has been fixed. The bug resulted in incorrect stack alignments in the affected functions.

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

sched_setaffinity bug fix.  A bug has been fixed that caused the Thumb-2 version of sched_setaffinity to fail inappropriately with EFAULT.

ARM build attributes conformance improvements.  Several ARM EABI 2.07 conformance issues relating to the handling of build attributes in the assembler and linker have been fixed. All build attribute types are now recognized, and can now be declared by name, in addition to by number. Support for merging attributes in the linker has been improved, and the linking of incompatible objects is now detected and rejected in more cases.

Internal compiler error with -fremove-local-statics An internal compiler error that occurred when using the -fremove-local-statics option has been fixed. The error occurred when compiling code with function-local static array or structure variables.

GDB update.  The included version of GDB has been updated to 6.8.50.20081022. This update includes numerous bug fixes.

Linker crash on incompatible input files.  Some third-party compilers, including ARM RealView® 4.0, produce a build attribute marking output files that are not compatible with the ABI for the ARM Architecture. This attribute sometimes caused the linker to crash. The linker now correctly issues an error message.

A.1.13. Changes in Sourcery G++ Lite 2008q3-72

Bug fix for assembly listing.  A bug that caused the assembler to produce corrupted listings (via the -a option) on Windows hosts has been fixed.

Optimizer bug fix.  A bug that caused an unrecognizable insn internal compiler error when compiling at optimization levels above -O0 has been fixed.

VFP compiler fix.  A compiler bug that resulted in internal compiler error: output_operand: invalid expression as operand when generating VFP code has been fixed.

GDB display of source.  A bug has been fixed that prevented GDB from locating debug information in some cases. The debugger failed to display source code for or step into the affected functions.

Bug fix for libSegFault.so Binaries linked with libSegFault.so now produce a correct backtrace when a segmentation fault occurs. Formerly, the location of the fault was shown incorrectly.

GDB segment warning.  Some compilers produce binaries including uninitialized data regions, such as the stack and heap. GDB incorrectly displayed the warning Loadable segment "name" outside of ELF segments for such binaries; the warning has now been fixed.

Misaligned NEON memory accesses.  A bug has been fixed that caused the compiler to use aligned NEON load/store instructions to access misaligned data when autovectorizing certain loops. The bug affected code compiled with -mfpu=neon and loop vectorization enabled with -O3 or -ftree-vectorize.

Sprite crash on error.  A bug has been fixed which sometimes caused the Sourcery G++ Debug Sprite to crash when it attempted to send an error message to GDB.

Persistent remote server connections.  A GDB bug has been fixed that caused the target extended-remote command to fail to tell the remote server to make the connection persistent across program invocations.

A.1.14. Changes in Sourcery G++ Lite 2008q3-41

Definition of va_list In order to conform to the ABI for the ARM Architecture, the definition of the type of va_list (defined in stdarg.h) has been changed. This change impacts only the mangled names of C++ entities. For example, the mangled name of a C++ function taking an argument of type va_list, or va_list *, or another type involving va_list has changed. Since this is an incompatible change, you must recompile and relink any modules defining or using affected va_list-typed entities.

Thumb-2 assembler fixes.  The Thumb-2 encodings of QADD, QDADD, QSUB, and QDSUB have been corrected. Previous versions of the assembler generated incorrect object files for these instructions. The assembler now accepts the ORN, QASX, QSAX, RRX, SHASX, SHSAX, SSAX, USAX, UHASX, UQSAX, and USAX mnemonics. The assembler now detects and issues errors for invalid uses of register 13 (the stack pointer) and register 15 (the program counter) in many instructions.

Printing casted values in GDB.  A GDB bug that caused incorrect output for expressions containing casts, such as in the print *(Type *)ptr command, has been fixed.

Bug fix for objcopy/strip.  An objcopy bug that corrupted COMDAT groups when creating new binaries has been fixed. This bug also affected strip -g.

Improved support for debugging RealView® objects .  GDB support for programs compiled by the ARM RealView® compiler has been improved.

Binutils support for DWARF Version 3.  The addr2line command now supports binaries containing DWARF 3 debugging information. The ld command can display error messages with source locations for input files containing DWARF 3 debugging information.

NEON improvements.  Several improvements and bug fixes have been made to the NEON Advanced SIMD Extension support in GCC. A problem that caused the autovectorizer to fail in some circumstances has been fixed. Also, many of the intrinsics available via the arm_neon.h header file now have improved error checking for out-of-bounds arguments, and the vget_lane intrinsics that return signed values now produce improved code.

NEON compiler fix.  A compiler bug that resulted in incorrect NEON code being generated has been fixed. Typically the incorrect code occurred when NEON intrinsics were used inside small if statements.

Connecting to the target using a pipe.  A bug in GDB's target remote | program command has been fixed. When launching the specified program failed, the bug caused GDB to crash, hang, or give a message Error: No Error.

Mixed-case NEON register aliases.  An assembler bug that prevented NEON register aliases from being created with mixed-case names using the .dn and .qn directives has been fixed. Previously only aliases created with all-lowercase or all-uppercase names worked correctly.

Janus 2CC support.  GCC now includes a work-around for a hardware bug in Avalent Janus 2CC cores. To compile and link for these cores, use the -mfix-janus-2cc compiler option. If you are using the linker directly use the --fix-janus-2cc linker option.

ARM exception handling bug fix.  A bug in the runtime library has been fixed that formerly caused throwing an unexpected exception in C++ to crash instead of calling the unexpected exception handler. The bug only affected C++ code compiled by non-GNU compilers such as ARM RealView®.

Mangling of NEON type names.  A bug in the algorithm used by the C++ compiler for mangling the names of NEON types, such as int8x16_t, has been fixed. These mangled names are used internally in object files to encode type information in addition to the programmer-visible names of the C++ variables and functions. The new mangled name encoding is more compact and conforms to the ARM C++ ABI.

Errors after loading the debugged program.  An intermittent GDB bug has been fixed. The bug could cause a GDB internal error after the load command.

Half-precision floating point.  Sourcery G++ now includes support for half-precision floating point via the __fp16 type in C and C++. The compiler can generate code using either hardware support or library routines. For more information, see Section 3.8.3, “Half-Precision Floating Point”.

A.1.15. Changes in Sourcery G++ Lite 2008q3-13

GDB update.  The included version of GDB has been updated to 6.8.50.20080821. This update adds numerous bug fixes and new features, including support for decimal floating point, improved Thumb mode support, the new find command to search memory, the new /m (mixed source and assembly) option to the disassemble command, and the new macro define command to define C preprocessor macros interactively.

Uppercase operands to IT instructions.  The assembler now accepts both uppercase and lowercase operands for the IT family of instructions.

NEON autovectorizer fix.  A compiler bug that caused generation of bad VLD1 instructions has been fixed. The bug affected code compiled with -mfpu=neon -ftree-vectorize.

Remote debugging improvements.  The gdbserver utility now supports a more efficient communications protocol that can reduce latency during remote debugging. The protocol optimizations are enabled automatically when gdbserver operates over a TCP connection. Refer to the GDB manual for more information.

Output files removed on error.  When GCC encounters an error, it now consistently removes any incomplete output files that it may have created.

ARMv7 offset out of range errors.  An assembler bug that resulted in offset out of range errors when compiling for ARMv7 processors has been fixed.

Thumb-2 MUL encoding.  In Thumb-2 mode, the assembler now encodes MUL as a 16-bit instruction (rather than as a 32-bit instruction) when possible. This fix results in smaller code, with no loss of performance.

ARM C++ ABI utility functions.  Vector utility functions required by the ARM C++ ABI no longer crash when passed null pointers. The affected functions are __aeabi_vec_dtor_cookie, __aeabi_vec_delete, __aeabi_vec_delete3, and __aeabi_vec_delete3_nodtor. In addition, on GNU/Linux systems, the ARM C++ ABI utility functions are now exported from the libstdc++.so shared library. These functions are not intended for use by application programmers; they are only called by compiler-generated code. They are not presently used by the GNU C++ compiler, but are used by some other compilers, including ARM's RealView® compiler.

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

Smaller Thumb-2 code.  When optimizing for size (i.e., when -Os is in use), GCC now generates the 16-bit MULS Thumb-2 multiply instruction instead of the 32-bit MUL instruction.

Thumb-2 RBIT encoding.  An assembler bug that resulted in incorrect encoding of the Thumb-2 RBIT instruction has been fixed.

Sprite communication improvements.  The Sourcery G++ Debug Sprite now uses a more efficient protocol for communicating with GDB. This can result in less latency when debugging, especially when running the Sprite on a remote machine over a network connection.

Marvell Feroceon compiler bug fix.  A bug that caused an internal compiler error when optimizing for Marvell Feroceon CPUs has been fixed.

Misaligned accesses to packed structures fix.  A bug that caused GCC to generate misaligned accesses to packed structures has been fixed.

Bug fix for objdump on Windows.  An objdump bug that caused the -S option not to work on Windows in some cases has been fixed.

A.1.16. Changes in Older Releases

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