From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 24752 invoked by alias); 30 Oct 2012 12:13:27 -0000 Received: (qmail 24675 invoked by uid 22791); 30 Oct 2012 12:13:24 -0000 X-SWARE-Spam-Status: No, hits=-3.0 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,TW_BF X-Spam-Check-By: sourceware.org Received: from mail-ee0-f41.google.com (HELO mail-ee0-f41.google.com) (74.125.83.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 30 Oct 2012 12:13:12 +0000 Received: by mail-ee0-f41.google.com with SMTP id c4so145148eek.0 for ; Tue, 30 Oct 2012 05:13:11 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=mime-version:x-originating-ip:in-reply-to:references:date :message-id:subject:from:to:cc:content-type:x-gm-message-state; bh=JdEjXAfNNd3EjfNDUrGMG6gf69tgIbEWd3jZnMvPUIY=; b=pISCz943gO/CevMMx1f/YwqfZi0c4HDcHBjGDkpmnz4ot03Tzj02ixwIBHBgqyijeN 4qOq+w8UoBOY7HfRJHUyPFGr5/n4xKBE3ztilSlGK1i06Cu6Hkq+k4fATgtWFs9FJ/Vj UuqFIAft3mC5Zuxj4cFvEcfCNlK75hKeSGonp8b1IhQPJg9+xeXFl9ITNlnMu7ri9Cxx nF8TIQGt//U51EVf4ZtU5ksfLiONI/g1DZnUSdK00BZH9Fnhwze0DSZN+ED13IfO0fO0 tpZ+3+wT24mhvEWjR0CD5OMXQxoT5e8xzDKzA0yyQY/HBHqICXK0g/YAWqvAGBlxfWUi UMNw== MIME-Version: 1.0 Received: by 10.14.194.136 with SMTP id m8mr72781017een.10.1351599191472; Tue, 30 Oct 2012 05:13:11 -0700 (PDT) Received: by 10.223.88.27 with HTTP; Tue, 30 Oct 2012 05:13:11 -0700 (PDT) In-Reply-To: <20121025003225.GD3263@bubble.grove.modra.org> References: <20121025003225.GD3263@bubble.grove.modra.org> Date: Tue, 30 Oct 2012 12:13:00 -0000 Message-ID: Subject: Re: [RS6000] libffi ppc64 assembly From: Anthony Green To: Alan Modra Cc: libffi-discuss@sourceware.org Content-Type: text/plain; charset=ISO-8859-1 X-Gm-Message-State: ALoCoQkkr5Q/X2Jc1D/oGDu0WAgcJy5r7/s4RXSS1zud59nc+T7UqaTXIuI+vYdOc3ATwM+cijOM X-IsSubscribed: yes 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/msg00263.txt.bz2 Thanks Alan. I'll pull it into the libffi git tree once you commit it to the GCC tree. Thanks, Anthony Green On Wed, Oct 24, 2012 at 8:32 PM, Alan Modra wrote: > 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