From patchwork Fri May 25 08:03:13 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Christophe Lyon X-Patchwork-Id: 136802 Delivered-To: patch@linaro.org Received: by 2002:a2e:9706:0:0:0:0:0 with SMTP id r6-v6csp3286682lji; Fri, 25 May 2018 01:28:34 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqI0utYp+6BcND7Ja3tWnOXJeLWgvZxaImehHJGSjpqIr32HRW1E4Wdc/xh+RokkAiQstqo X-Received: by 2002:a63:ba4b:: with SMTP id l11-v6mr1177894pgu.295.1527236914765; Fri, 25 May 2018 01:28:34 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527236914; cv=none; d=google.com; s=arc-20160816; b=SBsvCiPndWdufFxao12guIqtN/YOWAxSB9LSChzmrWeRNhmApJ0X0FO1GCkzfbbo8+ rGtlphuFjlc62Xp4VSDIw1OANBYM5pdWau/jzmrN2tvaPH1kw4KEuC/yldxRDkm3i3em aTqNeVdsHBpJoB2ijgN7aRFHA/xrggwjkEPYEKkau3ozlsMZ+1zJp0uByjLO7Bu2uhZZ dcXZVbvR9hmPxT1BPNnHwjkiraBYjNGzJuCr+7pHbO5mMA41a8eJnfT4i44k+rvmVV0Z KKffkj2oMpCsOgBdmms/K++EgoOxiOR0+CyP+A7/ZwMSBy9lC9WJNX3/brkjQMxEP+gP it8Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:delivered-to:sender:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=OiKvWIJmZPwWTBN1o99J9b7Rw3AYzhctEvjdBjHX178=; b=u7xHCVC8vkHJh05/7/eEUBnWBiRasn/eRZIbiolESK64nVCytGkZGIasYr2R2A43k5 KxhPdrwmgmomdoQcXWgLKFC/g6lXMlz8wddV4MdlII1xRx/sJJ+mzyRTduxPzhuTdNqI 61eKKjdZUGnjqP4Psais417U5wgQY4EXqra3kvg2t2mIQyXWjLdUsExpuxzfSwuZId+t R0wqib5Zb8iT9Yg5eNXw5fk/e9um642Z0biDU3M0rN3Kr1GjoBOFWQdfSSFbKtQ8PNF6 jZjPQoT0b8ggOCtljQXDXJDWLYG6ynxY2UmtmZdMewVKnQ50k31TU7iXjCR43VvLaqru Ruww== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=bhCnZm1X; spf=pass (google.com: domain of gcc-patches-return-478469-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-478469-patch=linaro.org@gcc.gnu.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id s189-v6si8155420pgb.486.2018.05.25.01.28.34 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 25 May 2018 01:28:34 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-return-478469-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=bhCnZm1X; spf=pass (google.com: domain of gcc-patches-return-478469-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-478469-patch=linaro.org@gcc.gnu.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:date:message-id:mime-version:content-type :content-transfer-encoding; q=dns; s=default; b=IY0eIfgT0+ABLve/ P1UjSOX5KN3AHnNlUUWOUUdDv9rPVmpL9OlBYn++wJ4XUdrcVlrrLNZ/aq+oYHKK 0JGJ07IKP1eFeKpELTV2mpTHMeD3QFwl8pLZwbzwp9voF9PcYkag9zdwSzUyOt8M DakKXTPC7cqeGgrERBiSBa085WA= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:subject:date:message-id:mime-version:content-type :content-transfer-encoding; s=default; bh=3YZa7mqoZvyGElH5mz5Rri K/RjQ=; b=bhCnZm1XeXgRTz2mLrD7otMYN+HvC6DdvsZyk/QoJAdipMPUFFe7p/ A/+MyF6d/52UM6qjbSMC4wuUBcV+WCJr8yFRwX9XxJrgNXt388fyDbvY2UJwa3lr sRuCaFPDFgmYGuc9fj+B5yQucC/15KbXG3ILMWmKnIKMzBcVA3584= Received: (qmail 44751 invoked by alias); 25 May 2018 08:08:26 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 42422 invoked by uid 89); 25 May 2018 08:04:20 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-7.6 required=5.0 tests=BAYES_00, GIT_PATCH_3, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=september, clash, trampoline, uninit19c X-HELO: mx07-00178001.pphosted.com Received: from mx07-00178001.pphosted.com (HELO mx07-00178001.pphosted.com) (62.209.51.94) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 25 May 2018 08:04:13 +0000 Received: from pps.filterd (m0046668.ppops.net [127.0.0.1]) by mx07-.pphosted.com (8.16.0.21/8.16.0.21) with SMTP id w4P7xB9D003908; Fri, 25 May 2018 10:04:10 +0200 Received: from beta.dmz-eu.st.com (beta.dmz-eu.st.com [164.129.1.35]) by mx07-00178001.pphosted.com with ESMTP id 2j59prjve1-1 (version=TLSv1 cipher=ECDHE-RSA-AES256-SHA bits=256 verify=NOT); Fri, 25 May 2018 10:04:10 +0200 Received: from zeta.dmz-eu.st.com (zeta.dmz-eu.st.com [164.129.230.9]) by beta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 5E71434; Fri, 25 May 2018 08:04:09 +0000 (GMT) Received: from Webmail-eu.st.com (sfhdag5node1.st.com [10.75.127.13]) by zeta.dmz-eu.st.com (STMicroelectronics) with ESMTP id 0BF2B15AB; Fri, 25 May 2018 08:04:09 +0000 (GMT) Received: from gnb.st.com (10.75.127.51) by SFHDAG5NODE1.st.com (10.75.127.13) with Microsoft SMTP Server (TLS) id 15.0.1347.2; Fri, 25 May 2018 10:04:08 +0200 From: Christophe Lyon To: , Subject: [ARM/FDPIC 00/21] FDPIC ARM for ARM Date: Fri, 25 May 2018 10:03:13 +0200 Message-ID: <20180525080354.13295-1-christophe.lyon@st.com> MIME-Version: 1.0 X-ClientProxiedBy: SFHDAG1NODE2.st.com (10.75.127.2) To SFHDAG5NODE1.st.com (10.75.127.13) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:, , definitions=2018-05-25_03:, , signatures=0 X-IsSubscribed: yes 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 and QEMU patch series have been merged recently. [4][5] To build such a toolchain, you'd also need to use my uClibc branch[6]. I am currently working on updating the patches for the remaining toolchain components: uclibc and gdb. 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. GCC test results: arm-linux-gnueabi arm-uclinuxfdpiceabi GCC PASS 111743 105869 GCC FAIL 19 32 GCC XFAIL 298 296 GCC UNRES 9 11 GCC UNSUPP 5843 5506 G++ PASS 115776 109442 G++ FAIL 14 14 G++ XFAIL 484 484 G++ UNRES 1 1 G++ UNSUPP 5289 4954 LIBSTDC++ PASS 11378 11158 LIBSTDC++ FAIL 10 8 LIBSTDC++ XPASS 0 5 LIBSTDC++ XFAIL 71 81 LIBSTDC++ UNRES 2 2 LIBSTDC++ UNSUPP 601 667 Are the GCC patches OK for inclusion in master? 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://git.linaro.org/people/christophe.lyon/uclibc.git/log/?h=uClibc-0.9.33.2-fdpic-upstream 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: Fix corner case of weak symbol [ARM] FDPIC: Add support for taking address of nested function [ARM] FDPIC: Implement legitimize_tls_address_fdpic [ARM] FDPIC: Add support to unwind FDPIC signal frame [ARM] FDPIC: Restore r9 after we call __aeabi_read_tp [ARM] FDPIC: Support unwinding across thumb2 signal trampoline [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. 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 | 510 +++++++++++++++++++-- gcc/config/arm/arm.h | 6 +- gcc/config/arm/arm.md | 121 ++++- 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/ginclude/unwind-arm-common.h | 2 +- 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.dg/uninit-19.c | 4 +- gcc/testsuite/gcc.target/arm/20051215-1.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/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/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/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/pr61948.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/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 | 86 ++++ libgcc/config/arm/unwind-arm.c | 5 + libgcc/config/arm/unwind-arm.h | 26 +- libgcc/crtstuff.c | 16 + libgcc/unwind-arm-common.inc | 215 +++++++++ libgcc/unwind-pe.h | 15 + 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 | 8 +- libtool.m4 | 14 +- 137 files changed, 1227 insertions(+), 187 deletions(-) create mode 100644 gcc/config/arm/uclinuxfdpiceabi.h -- 2.6.3