public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [ARM/FDPIC v3 00/21] FDPIC ABI for ARM
@ 2018-10-11 13:36 Christophe Lyon
  2018-10-11 13:36 ` [ARM/FDPIC v3 02/21] [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts Christophe Lyon
                   ` (20 more replies)
  0 siblings, 21 replies; 47+ messages in thread
From: Christophe Lyon @ 2018-10-11 13:36 UTC (permalink / raw)
  To: gcc-patches; +Cc: christophe.lyon

Hello,

This patch series implements the GCC contribution of the FDPIC ABI for
ARM targets.

This ABI enables to run Linux on ARM MMU-less cores and supports
shared libraries to reduce the memory footprint.

Without MMU, text and data segments relative distances are different
from one process to another, hence the need for a dedicated FDPIC
register holding the start address of the data segment. One of the
side effects is that function pointers require two words to be
represented: the address of the code, and the data segment start
address. These two words are designated as "Function Descriptor",
hence the "FD PIC" name.

On ARM, the FDPIC register is r9 [1], and the target name is
arm-uclinuxfdpiceabi. Note that arm-uclinux exists, but uses another
ABI and the BFLAT file format; it does not support code sharing.
The -mfdpic option is enabled by default, and -mno-fdpic should be
used to build the Linux kernel.

This work was developed some time ago by STMicroelectronics, and was
presented during Linaro Connect SFO15 (September 2015). You can watch
the discussion and read the slides [2].
This presentation was related to the toolchain published on github [3],
which is based on binutils-2.22, gcc-4.7, uclibc-0.9.33.2, gdb-7.5.1
and qemu-2.3.0, and for which pre-built binaries are available [3].

The ABI itself is described in details in [1].

Our Linux kernel patches have been updated and committed by Nicolas
Pitre (Linaro) in July 2017. They are required so that the loader is
able to handle this new file type. Indeed, the ELF files are tagged
with ELFOSABI_ARM_FDPIC. This new tag has been allocated by ARM, as
well as the new relocations involved.

The binutils, QEMU and uclibc-ng patch series have been merged
recently. [4][5][6]

This series provides support for ARM v7 architecture and has been
tested on arm-linux-gnueabi without regression, as well as
arm-uclinuxfdpiceabi, using QEMU. arm-uclinuxfdpiceabi has more
failures than arm-linux-gnueabi, but is quite functional.

Are the GCC patches OK for inclusion in master?

Changes between v2 and v3:
- added doc entry for -mfdpic new option
- took Kyrill's comments into account (use "Armv7" instead of "7",
  code factorization, use preprocessor instead of hard-coding "r9",
  remove leftover code for thumb1 support, fixed comments)
- rebase over recent trunk
- patches with changes: 1, 2 (commit message), 3 (rebase), 4, 6, 7, 9,
  14 (rebase), 19 (rebase)

Changes between v1 and v2:
- fix GNU coding style
- exit with an error for pre-Armv7
- use ACLE __ARM_ARCH and remove dead code for pre-Armv4
- remove unsupported attempts of pre-Armv7/thumb1 support
- add instructions in comments next to opcodes
- merge patches 11 and 13
- fixed protected visibility handling in patch 8
- merged legitimize_tls_address_fdpic and
  legitimize_tls_address_not_fdpic as requested

Thanks,

Christophe.


[1] https://github.com/mickael-guene/fdpic_doc/blob/master/abi.txt
[2] http://connect.linaro.org/resource/sfo15/sfo15-406-arm-fdpic-toolset-kernel-libraries-for-cortex-m-cortex-r-mmuless-cores/
[3] https://github.com/mickael-guene/fdpic_manifest
[4] https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=f1ac0afe481e83c9a33f247b81fa7de789edc4d9
[5] https://git.qemu.org/?p=qemu.git;a=commit;h=e8fa72957419c11984608062c7dcb204a6003a06
[6] https://cgit.uclibc-ng.org/cgi/cgit/uclibc-ng.git/commit/?id=13c46fbc1e5a021f2b9ed32d83aecc93ae5e655d

Christophe Lyon (21):
  [ARM] FDPIC: Add -mfdpic option support
  [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts
  [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided
  [ARM] FDPIC: Add support for FDPIC for arm architecture
  [ARM] FDPIC: Fix __do_global_dtors_aux and frame_dummy generation
  [ARM] FDPIC: Add support for c++ exceptions
  [ARM] FDPIC: Avoid saving/restoring r9 on stack since it is RO
  [ARM] FDPIC: Ensure local/global binding for function descriptors
  [ARM] FDPIC: Add support for taking address of nested function
  [ARM] FDPIC: Implement TLS support.
  [ARM] FDPIC: Add support to unwind FDPIC signal frame
  [ARM] FDPIC: Restore r9 after we call __aeabi_read_tp
  [ARM] FDPIC: Force LSB bit for PC in Cortex-M architecture
  [ARM][testsuite] FDPIC: Skip unsupported tests
  [ARM][testsuite] FDPIC: Adjust scan-assembler patterns.
  [ARM][testsuite] FDPIC: Skip v8-m and v6-m tests that currently
    produce an ICE
  [ARM][testsuite] FDPIC: Skip tests that don't work in PIC mode
  [ARM][testsuite] FDPIC: Handle *-*-uclinux*
  [ARM][testsuite] FDPIC: Enable tests on pie_enabled targets
  [ARM][testsuite] FDPIC: Adjust pr43698.c to avoid clash with uclibc.
  [ARM][testsuite] FDPIC: Skip tests using architecture older than v7

 config/futex.m4                                    |   2 +-
 config/tls.m4                                      |   2 +-
 gcc/config.gcc                                     |  13 +-
 gcc/config/arm/arm-c.c                             |   2 +
 gcc/config/arm/arm-protos.h                        |   1 +
 gcc/config/arm/arm.c                               | 478 ++++++++++++++++++---
 gcc/config/arm/arm.h                               |   9 +-
 gcc/config/arm/arm.md                              | 125 +++++-
 gcc/config/arm/arm.opt                             |   4 +
 gcc/config/arm/bpabi.h                             |   4 +-
 gcc/config/arm/linux-eabi.h                        |   7 +-
 gcc/config/arm/uclinuxfdpiceabi.h                  |  53 +++
 gcc/config/arm/unspecs.md                          |   1 +
 gcc/doc/invoke.texi                                |  10 +-
 gcc/ginclude/unwind-arm-common.h                   |   4 +-
 gcc/testsuite/g++.dg/abi/forced.C                  |   2 +-
 gcc/testsuite/g++.dg/abi/guard2.C                  |   2 +-
 gcc/testsuite/g++.dg/cpp0x/noexcept03.C            |   2 +-
 gcc/testsuite/g++.dg/ext/cleanup-10.C              |   2 +-
 gcc/testsuite/g++.dg/ext/cleanup-11.C              |   2 +-
 gcc/testsuite/g++.dg/ext/cleanup-8.C               |   2 +-
 gcc/testsuite/g++.dg/ext/cleanup-9.C               |   2 +-
 gcc/testsuite/g++.dg/ext/sync-4.C                  |   2 +-
 gcc/testsuite/g++.dg/ipa/comdat.C                  |   2 +-
 gcc/testsuite/g++.dg/ipa/devirt-c-7.C              |   3 +-
 gcc/testsuite/g++.dg/ipa/ivinline-1.C              |   2 +-
 gcc/testsuite/g++.dg/ipa/ivinline-2.C              |   2 +-
 gcc/testsuite/g++.dg/ipa/ivinline-3.C              |   2 +-
 gcc/testsuite/g++.dg/ipa/ivinline-4.C              |   2 +-
 gcc/testsuite/g++.dg/ipa/ivinline-5.C              |   2 +-
 gcc/testsuite/g++.dg/ipa/ivinline-7.C              |   2 +-
 gcc/testsuite/g++.dg/ipa/ivinline-8.C              |   2 +-
 gcc/testsuite/g++.dg/ipa/ivinline-9.C              |   2 +-
 gcc/testsuite/g++.dg/other/anon5.C                 |   1 +
 gcc/testsuite/g++.dg/tls/pr79288.C                 |   2 +-
 gcc/testsuite/gcc.dg/20020312-2.c                  |   1 +
 gcc/testsuite/gcc.dg/20041106-1.c                  |   2 +-
 gcc/testsuite/gcc.dg/addr_equal-1.c                |   3 +-
 gcc/testsuite/gcc.dg/cleanup-10.c                  |   2 +-
 gcc/testsuite/gcc.dg/cleanup-11.c                  |   2 +-
 gcc/testsuite/gcc.dg/cleanup-8.c                   |   2 +-
 gcc/testsuite/gcc.dg/cleanup-9.c                   |   2 +-
 gcc/testsuite/gcc.dg/const-1.c                     |   2 +-
 gcc/testsuite/gcc.dg/fdata-sections-1.c            |   2 +-
 gcc/testsuite/gcc.dg/fdata-sections-2.c            |   2 +-
 gcc/testsuite/gcc.dg/ipa/pure-const-1.c            |   2 +-
 gcc/testsuite/gcc.dg/noreturn-8.c                  |   2 +-
 gcc/testsuite/gcc.dg/pr33826.c                     |   3 +-
 gcc/testsuite/gcc.dg/pr39323-1.c                   |   2 +-
 gcc/testsuite/gcc.dg/pr39323-2.c                   |   2 +-
 gcc/testsuite/gcc.dg/pr39323-3.c                   |   2 +-
 gcc/testsuite/gcc.dg/pr65780-1.c                   |   2 +-
 gcc/testsuite/gcc.dg/pr65780-2.c                   |   2 +-
 gcc/testsuite/gcc.dg/pr67338.c                     |   2 +-
 gcc/testsuite/gcc.dg/pr78185.c                     |   2 +-
 gcc/testsuite/gcc.dg/pr83100-1.c                   |   2 +-
 gcc/testsuite/gcc.dg/pr83100-4.c                   |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-12g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-14g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-14gf.c              |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-16g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-17g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-18g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-1f.c                |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-22g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-2f.c                |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-31g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-33g.c               |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-4g.c                |   2 +-
 gcc/testsuite/gcc.dg/strlenopt-4gf.c               |   2 +-
 gcc/testsuite/gcc.dg/strncmp-2.c                   |   2 +-
 gcc/testsuite/gcc.dg/struct-ret-3.c                |   2 +-
 gcc/testsuite/gcc.dg/torture/ipa-pta-1.c           |   2 +-
 gcc/testsuite/gcc.dg/torture/pr69760.c             |   2 +-
 gcc/testsuite/gcc.dg/tree-ssa/alias-2.c            |   2 +-
 gcc/testsuite/gcc.dg/tree-ssa/ipa-split-5.c        |   2 +-
 gcc/testsuite/gcc.dg/tree-ssa/loadpre6.c           |   2 +-
 gcc/testsuite/gcc.target/arm/20051215-1.c          |   1 +
 .../gcc.target/arm/armv6-unaligned-load-ice.c      |   1 +
 .../arm/atomic-comp-swap-release-acquire-3.c       |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-acq_rel-3.c |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-acquire-3.c |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-char-3.c    |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-consume-3.c |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-int-3.c     |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-relaxed-3.c |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-release-3.c |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-seq_cst-3.c |   1 +
 gcc/testsuite/gcc.target/arm/atomic-op-short-3.c   |   1 +
 .../gcc.target/arm/attr-unaligned-load-ice.c       |   1 +
 gcc/testsuite/gcc.target/arm/attr_arm-err.c        |   1 +
 gcc/testsuite/gcc.target/arm/data-rel-2.c          |   1 +
 gcc/testsuite/gcc.target/arm/data-rel-3.c          |   1 +
 gcc/testsuite/gcc.target/arm/div64-unwinding.c     |   2 +-
 gcc/testsuite/gcc.target/arm/eliminate.c           |   2 +-
 gcc/testsuite/gcc.target/arm/ftest-armv4-arm.c     |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv4t-arm.c    |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv4t-thumb.c  |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv5t-arm.c    |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv5t-thumb.c  |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv5te-arm.c   |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv5te-thumb.c |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6-arm.c     |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6-thumb.c   |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6k-arm.c    |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6k-thumb.c  |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6m-thumb.c  |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6t2-arm.c   |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6t2-thumb.c |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6z-arm.c    |   1 +
 gcc/testsuite/gcc.target/arm/ftest-armv6z-thumb.c  |   1 +
 gcc/testsuite/gcc.target/arm/g2.c                  |   1 +
 gcc/testsuite/gcc.target/arm/interrupt-1.c         |   6 +-
 gcc/testsuite/gcc.target/arm/interrupt-2.c         |   6 +-
 gcc/testsuite/gcc.target/arm/ivopts-2.c            |   2 +-
 gcc/testsuite/gcc.target/arm/ivopts-3.c            |   2 +-
 gcc/testsuite/gcc.target/arm/ivopts-4.c            |   2 +-
 gcc/testsuite/gcc.target/arm/ivopts-5.c            |   2 +-
 gcc/testsuite/gcc.target/arm/macro_defs1.c         |   1 +
 gcc/testsuite/gcc.target/arm/mmx-1.c               |   1 +
 gcc/testsuite/gcc.target/arm/pr19599.c             |   1 +
 gcc/testsuite/gcc.target/arm/pr40887.c             |   1 +
 gcc/testsuite/gcc.target/arm/pr43597.c             |   2 +-
 gcc/testsuite/gcc.target/arm/pr43698.c             |   4 +-
 gcc/testsuite/gcc.target/arm/pr43920-2.c           |   2 +-
 gcc/testsuite/gcc.target/arm/pr45701-1.c           |   4 +-
 gcc/testsuite/gcc.target/arm/pr45701-2.c           |   4 +-
 gcc/testsuite/gcc.target/arm/pr59858.c             |   1 +
 gcc/testsuite/gcc.target/arm/pr61948.c             |   1 +
 gcc/testsuite/gcc.target/arm/pr65647-2.c           |   1 +
 gcc/testsuite/gcc.target/arm/pr65647.c             |   1 +
 gcc/testsuite/gcc.target/arm/pr66912.c             |   2 +-
 gcc/testsuite/gcc.target/arm/pr70830.c             |   3 +-
 gcc/testsuite/gcc.target/arm/pr77933-1.c           |   1 +
 gcc/testsuite/gcc.target/arm/pr77933-2.c           |   1 +
 gcc/testsuite/gcc.target/arm/pr79058.c             |   1 +
 gcc/testsuite/gcc.target/arm/pr83712.c             |   1 +
 .../gcc.target/arm/pragma_arch_switch_2.c          |   1 +
 gcc/testsuite/gcc.target/arm/scd42-1.c             |   1 +
 gcc/testsuite/gcc.target/arm/scd42-2.c             |   1 +
 gcc/testsuite/gcc.target/arm/scd42-3.c             |   1 +
 gcc/testsuite/gcc.target/arm/sibcall-1.c           |   1 +
 gcc/testsuite/gcc.target/arm/stack-checking.c      |   2 +-
 gcc/testsuite/gcc.target/arm/stack-red-zone.c      |   2 +-
 gcc/testsuite/gcc.target/arm/synchronize.c         |   2 +-
 gcc/testsuite/gcc.target/arm/tail-long-call.c      |   1 +
 gcc/testsuite/gcc.target/arm/tlscall.c             |   1 +
 gcc/testsuite/gcc.target/arm/vfp-longcall-apcs.c   |   1 +
 gcc/testsuite/lib/target-supports.exp              |   4 +
 libatomic/configure                                |   8 +-
 libatomic/configure.tgt                            |   2 +-
 libgcc/config.host                                 |   4 +-
 libgcc/config/arm/linux-atomic.c                   |  38 ++
 libgcc/config/arm/unwind-arm.c                     |   5 +
 libgcc/config/arm/unwind-arm.h                     |  29 +-
 libgcc/crtstuff.c                                  |  16 +
 libgcc/unwind-arm-common.inc                       | 215 +++++++++
 libgcc/unwind-pe.h                                 |  17 +
 libitm/configure                                   |  20 +-
 libitm/configure.tgt                               |   2 +-
 libsanitizer/configure.tgt                         |   3 +
 libstdc++-v3/acinclude.m4                          |  12 +-
 libstdc++-v3/configure                             |  36 +-
 libstdc++-v3/configure.host                        |   6 +-
 libstdc++-v3/libsupc++/eh_personality.cc           |  10 +-
 libtool.m4                                         |  14 +-
 166 files changed, 1175 insertions(+), 210 deletions(-)
 create mode 100644 gcc/config/arm/uclinuxfdpiceabi.h

-- 
2.6.3

^ permalink raw reply	[flat|nested] 47+ messages in thread

end of thread, other threads:[~2018-11-09 12:31 UTC | newest]

Thread overview: 47+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-11 13:36 [ARM/FDPIC v3 00/21] FDPIC ABI for ARM Christophe Lyon
2018-10-11 13:36 ` [ARM/FDPIC v3 02/21] [ARM] FDPIC: Handle arm*-*-uclinuxfdpiceabi in configure scripts Christophe Lyon
2018-10-12 10:14   ` Richard Earnshaw (lists)
2018-10-15  8:46     ` Christophe Lyon
2018-11-09 12:31       ` Christophe Lyon
2018-10-11 13:36 ` [ARM/FDPIC v3 01/21] [ARM] FDPIC: Add -mfdpic option support Christophe Lyon
2018-10-12 10:01   ` Richard Earnshaw (lists)
2018-10-17  8:13     ` Sandra Loosemore
2018-10-11 13:37 ` [ARM/FDPIC v3 04/21] [ARM] FDPIC: Add support for FDPIC for arm architecture Christophe Lyon
2018-10-12 11:02   ` Richard Earnshaw (lists)
2018-10-19 13:57     ` Christophe Lyon
2018-10-23 15:12       ` Richard Earnshaw (lists)
2018-10-26 16:34         ` Christophe Lyon
2018-10-26 16:41           ` Richard Earnshaw (lists)
2018-10-29 10:31             ` Christophe Lyon
2018-10-11 13:37 ` [ARM/FDPIC v3 03/21] [ARM] FDPIC: Force FDPIC related options unless -mno-fdpic is provided Christophe Lyon
2018-10-12 10:46   ` Richard Earnshaw (lists)
2018-10-15 10:35     ` Christophe Lyon
2018-10-23 15:01       ` Richard Earnshaw (lists)
2018-10-23 15:42         ` Segher Boessenkool
2018-10-26 15:33           ` Christophe Lyon
2018-10-29 14:25             ` Christophe Lyon
2018-10-29 23:15               ` Segher Boessenkool
2018-10-11 13:37 ` [ARM/FDPIC v3 05/21] [ARM] FDPIC: Fix __do_global_dtors_aux and frame_dummy generation Christophe Lyon
2018-10-12 11:29   ` Richard Earnshaw (lists)
2018-10-11 13:38 ` [ARM/FDPIC v3 07/21] [ARM] FDPIC: Avoid saving/restoring r9 on stack since it is RO Christophe Lyon
2018-10-12 12:21   ` Richard Earnshaw (lists)
2018-10-15 14:30     ` Christophe Lyon
2018-10-11 13:38 ` [ARM/FDPIC v3 06/21] [ARM] FDPIC: Add support for c++ exceptions Christophe Lyon
2018-10-12 11:54   ` Richard Earnshaw (lists)
2018-10-15 14:22     ` Christophe Lyon
2018-10-11 13:38 ` [ARM/FDPIC v3 08/21] [ARM] FDPIC: Ensure local/global binding for function descriptors Christophe Lyon
2018-10-12 12:39   ` Richard Earnshaw (lists)
2018-10-11 13:39 ` [ARM/FDPIC v3 09/21] [ARM] FDPIC: Add support for taking address of nested function Christophe Lyon
2018-10-11 13:39 ` [ARM/FDPIC v3 11/21] [ARM] FDPIC: Add support to unwind FDPIC signal frame Christophe Lyon
2018-10-11 13:39 ` [ARM/FDPIC v3 10/21] [ARM] FDPIC: Implement TLS support Christophe Lyon
2018-10-11 13:40 ` [ARM/FDPIC v3 13/21] [ARM] FDPIC: Force LSB bit for PC in Cortex-M architecture Christophe Lyon
2018-10-11 13:40 ` [ARM/FDPIC v3 12/21] [ARM] FDPIC: Restore r9 after we call __aeabi_read_tp Christophe Lyon
2018-10-19 14:02   ` Christophe Lyon
2018-10-11 13:41 ` [ARM/FDPIC v3 14/21] [ARM][testsuite] FDPIC: Skip unsupported tests Christophe Lyon
2018-10-11 13:41 ` [ARM/FDPIC v3 16/21] [ARM][testsuite] FDPIC: Skip v8-m and v6-m tests that currently produce an ICE Christophe Lyon
2018-10-11 13:41 ` [ARM/FDPIC v3 15/21] [ARM][testsuite] FDPIC: Adjust scan-assembler patterns Christophe Lyon
2018-10-11 13:42 ` [ARM/FDPIC v3 18/21] [ARM][testsuite] FDPIC: Handle *-*-uclinux* Christophe Lyon
2018-10-11 13:42 ` [ARM/FDPIC v3 19/21] [ARM][testsuite] FDPIC: Enable tests on pie_enabled targets Christophe Lyon
2018-10-11 13:42 ` [ARM/FDPIC v3 17/21] [ARM][testsuite] FDPIC: Skip tests that don't work in PIC mode Christophe Lyon
2018-10-11 13:43 ` [ARM/FDPIC v3 20/21] [ARM][testsuite] FDPIC: Adjust pr43698.c to avoid clash with uclibc Christophe Lyon
2018-10-11 13:56 ` [ARM/FDPIC v3 21/21] [ARM][testsuite] FDPIC: Skip tests using architecture older than v7 Christophe Lyon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).