.. _arm-gcc:

GCC for Maple
=============

This document provides notes on the current usage of
``arm-none-eabi-gcc``, the `CodeSourcery <http://codesourcery.com>`_
version of the GNU `GCC <http://gcc.gnu.org/>`_ compilers used to
compile programs for the Maple.  It is not intended as a reference
manual for GCC; such manuals are available `elsewhere
<http://gcc.gnu.org/>`_.

Obtaining ``arm-none-eabi-gcc``
-------------------------------

Recent versions of ``arm-none-eabi-gcc`` and associated tools are
included with the :ref:`Maple IDE <ide>`.

Users who wish to use ``arm-none-eabi-gcc`` in concert with a standard
Unix toolchain are referred to our :ref:`unix-toolchain` reference,
which describes how to set up such an environment.

LeafLabs mirrors some of the more recent versions of the compiler
under http://static.leaflabs.com/pub/codesourcery/\ , including
versions for OS X, win32, and 32-bit Linux.

Compiler Flags Used by libmaple
-------------------------------

This section documents the flags passed to ``arm-none-eabi-gcc`` by
the :ref:`Maple IDE <ide>` and the default Makefile provided with
:ref:`libmaple <unix-toolchain>`.  The information in this section is
subject to change without notice.

.. highlight:: sh

The following flags are among those passed to the C compiler::

    -Os -g -mcpu=cortex-m3 -mthumb -march=armv7-m -nostdlib
    -ffunction-sections -fdata-sections -Wl,--gc-sections

The following flags are among those passed to the C++ compiler::

    -fno-rtti -fno-exceptions -Wall

The following flags are among those passed to the assembler::

    -mcpu=cortex-m3 -march=armv7-m -mthumb

.. highlight:: cpp

.. _arm-gcc-avr-gcc:

Switching from AVR-GCC
----------------------

This section, which is expected to grow over time, describes
techniques for porting code which uses AVR-GCC features (AVR-GCC is
the compiler used by many Atmel AVR-based microcontroller boards,
including Arduino) for use on the Maple.

.. _arm-gcc-attribute-flash:

- Replacing ``PROGMEM``: You can direct the linker script provided
  with libmaple to store a variable in flash by using
  ``__attribute__((section (".USER_FLASH")))``, like so::

      uint32 arr[] __attribute__((section (".USER_FLASH"))) = {...};