From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12339 invoked by alias); 25 Oct 2012 00:32:38 -0000 Received: (qmail 12329 invoked by uid 22791); 25 Oct 2012 00:32:37 -0000 X-SWARE-Spam-Status: No, hits=-4.2 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,KHOP_RCVD_TRUST,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,TW_BF X-Spam-Check-By: sourceware.org Received: from mail-da0-f41.google.com (HELO mail-da0-f41.google.com) (209.85.210.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 25 Oct 2012 00:32:31 +0000 Received: by mail-da0-f41.google.com with SMTP id i14so519732dad.0 for ; Wed, 24 Oct 2012 17:32:30 -0700 (PDT) Received: by 10.68.225.5 with SMTP id rg5mr54169659pbc.73.1351125150357; Wed, 24 Oct 2012 17:32:30 -0700 (PDT) Received: from bubble.grove.modra.org ([101.166.26.37]) by mx.google.com with ESMTPS id t1sm3109957paw.11.2012.10.24.17.32.28 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 24 Oct 2012 17:32:29 -0700 (PDT) Received: by bubble.grove.modra.org (Postfix, from userid 1000) id 48CF2EA2F3A; Thu, 25 Oct 2012 11:02:25 +1030 (CST) Date: Thu, 25 Oct 2012 00:32:00 -0000 From: Alan Modra To: libffi-discuss@sourceware.org Subject: [RS6000] libffi ppc64 assembly Message-ID: <20121025003225.GD3263@bubble.grove.modra.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Mailing-List: contact libffi-discuss-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libffi-discuss-owner@sourceware.org X-SW-Source: 2012/txt/msg00255.txt.bz2 This is a repost of http://gcc.gnu.org/ml/gcc-patches/2012-10/msg02108.html now to the correct list for libffi patches. The gcc part has been approved. Compiling libffi for powerpc64 with an older gcc that doesn't define _CALL_LINUX should continue to be fine if using BFD ld. ================== Gold on powerpc64 doesn't support old ABI objects, but libffi contains old ABI assembly. This patch modifies those files to support both old and new ABI, and adds a builtin define to powerpc64 gcc that can be used to select between the ABIs in assembly. I figure a define is generally useful, and more robust than trying to duplicate gcc configury in libffi (which could be overridden by CFLAGS anyway). Bootstrapped and regression tested powerpc64-linux. OK to apply mainline? gcc/ * config/rs6000/linux64.h (TARGET_OS_CPP_BUILTINS): Define _CALL_LINUX. libffi/ * src/powerpc/linux64_closure.S: Add new ABI support. * src/powerpc/linux64.S: Likewise. Index: gcc/config/rs6000/linux64.h =================================================================== --- gcc/config/rs6000/linux64.h (revision 192660) +++ gcc/config/rs6000/linux64.h (working copy) @@ -318,6 +318,8 @@ builtin_define ("__PPC64__"); \ builtin_define ("__powerpc__"); \ builtin_define ("__powerpc64__"); \ + if (!DOT_SYMBOLS) \ + builtin_define ("_CALL_LINUX"); \ builtin_assert ("cpu=powerpc64"); \ builtin_assert ("machine=powerpc64"); \ } \ Index: libffi/src/powerpc/linux64_closure.S =================================================================== --- libffi/src/powerpc/linux64_closure.S (revision 192660) +++ libffi/src/powerpc/linux64_closure.S (working copy) @@ -32,16 +32,24 @@ #ifdef __powerpc64__ FFI_HIDDEN (ffi_closure_LINUX64) - FFI_HIDDEN (.ffi_closure_LINUX64) - .globl ffi_closure_LINUX64, .ffi_closure_LINUX64 + .globl ffi_closure_LINUX64 .section ".opd","aw" .align 3 ffi_closure_LINUX64: +#ifdef _CALL_LINUX + .quad .L.ffi_closure_LINUX64,.TOC.@tocbase,0 + .type ffi_closure_LINUX64,@function + .text +.L.ffi_closure_LINUX64: +#else + FFI_HIDDEN (.ffi_closure_LINUX64) + .globl .ffi_closure_LINUX64 .quad .ffi_closure_LINUX64,.TOC.@tocbase,0 .size ffi_closure_LINUX64,24 .type .ffi_closure_LINUX64,@function .text .ffi_closure_LINUX64: +#endif .LFB1: # save general regs into parm save area std %r3, 48(%r1) @@ -91,7 +99,11 @@ addi %r6, %r1, 128 # make the call +#ifdef _CALL_LINUX + bl ffi_closure_helper_LINUX64 +#else bl .ffi_closure_helper_LINUX64 +#endif .Lret: # now r3 contains the return type @@ -194,7 +206,11 @@ .LFE1: .long 0 .byte 0,12,0,1,128,0,0,0 +#ifdef _CALL_LINUX + .size ffi_closure_LINUX64,.-.L.ffi_closure_LINUX64 +#else .size .ffi_closure_LINUX64,.-.ffi_closure_LINUX64 +#endif .section .eh_frame,EH_FRAME_FLAGS,@progbits .Lframe1: Index: libffi/src/powerpc/linux64.S =================================================================== --- libffi/src/powerpc/linux64.S (revision 192660) +++ libffi/src/powerpc/linux64.S (working copy) @@ -30,16 +30,25 @@ #include #ifdef __powerpc64__ - .hidden ffi_call_LINUX64, .ffi_call_LINUX64 - .globl ffi_call_LINUX64, .ffi_call_LINUX64 + .hidden ffi_call_LINUX64 + .globl ffi_call_LINUX64 .section ".opd","aw" .align 3 ffi_call_LINUX64: +#ifdef _CALL_LINUX + .quad .L.ffi_call_LINUX64,.TOC.@tocbase,0 + .type ffi_call_LINUX64,@function + .text +.L.ffi_call_LINUX64: +#else + .hidden .ffi_call_LINUX64 + .globl .ffi_call_LINUX64 .quad .ffi_call_LINUX64,.TOC.@tocbase,0 .size ffi_call_LINUX64,24 .type .ffi_call_LINUX64,@function .text .ffi_call_LINUX64: +#endif .LFB1: mflr %r0 std %r28, -32(%r1) @@ -58,7 +67,11 @@ /* Call ffi_prep_args64. */ mr %r4, %r1 +#ifdef _CALL_LINUX + bl ffi_prep_args64 +#else bl .ffi_prep_args64 +#endif ld %r0, 0(%r29) ld %r2, 8(%r29) @@ -137,7 +150,11 @@ .LFE1: .long 0 .byte 0,12,0,1,128,4,0,0 +#ifdef _CALL_LINUX + .size ffi_call_LINUX64,.-.L.ffi_call_LINUX64 +#else .size .ffi_call_LINUX64,.-.ffi_call_LINUX64 +#endif .section .eh_frame,EH_FRAME_FLAGS,@progbits .Lframe1: -- Alan Modra Australia Development Lab, IBM