From owner-freebsd-toolchain@FreeBSD.ORG Sun Apr 24 14:29:52 2011 Return-Path: Delivered-To: freebsd-toolchain@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 18B6B106566B for ; Sun, 24 Apr 2011 14:29:52 +0000 (UTC) (envelope-from gerald@pfeifer.com) Received: from relay02.pair.com (relay02.pair.com [209.68.5.16]) by mx1.freebsd.org (Postfix) with SMTP id B65C98FC08 for ; Sun, 24 Apr 2011 14:29:51 +0000 (UTC) Received: (qmail 7329 invoked from network); 24 Apr 2011 14:03:08 -0000 Received: from 77.118.132.222 (HELO 77.118.132.222.wireless.dyn.drei.com) (77.118.132.222) by relay02.pair.com with SMTP; 24 Apr 2011 14:03:08 -0000 X-pair-Authenticated: 77.118.132.222 Date: Sun, 24 Apr 2011 16:03:11 +0200 (CEST) From: Gerald Pfeifer To: freebsd-toolchain@freebsd.org Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Subject: x86_64 -profile option patch (fwd) X-BeenThere: freebsd-toolchain@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Maintenance of FreeBSD's integrated toolchain List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 24 Apr 2011 14:29:52 -0000 Hi guys, just wondering whether any of you has input/guidance on the mail below regarding FreeBSD and profile handing in GCC? Feel free to let Joseph know directly (cc:ing me), or I'll be happy to relay back anything. Gerald ---------- Forwarded message ---------- From: Joseph S. Myers To: gcc-patches@gcc.gnu.org Cc: rth@redhat.com, jh@suse.cz, ubizjak@gmail.com, ljrittle@acm.org Date: Tue, 15 Feb 2011 01:11:40 +0000 (UTC) Subject: x86_64 -profile option patch config/i386/x86-64.h defines CC1_SPEC to handle the -profile option. This option (link with a profiling version of libc) is OS-specific so should not be in such an OS-independent spec. The affected targets (those using this definition) are: x86_64-*-elf*, x86_64-*-freebsd*, x86_64-*-netbsd*, i[34567]86-*-linux* --enable-targets=all, x86_64-*-linux* | x86_64-*-kfreebsd*-gnu | x86_64-*-knetbsd*-gnu, i[34567]86-*-solaris2*. Of these, only the GNU-userspace targets and FreeBSD generally have any specs handling -profile, and so only for those targets have I added it to .opt files. This patch removes the problem CC1_SPEC definition, adding definitions to i386/freebsd64.h and i386/linux64.h to cover the subset of affected targets where this definition is actually appropriate. Bootstrapped with no regressions on x86_64-unknown-linux-gnu. Also tested building cc1 and xgcc for crosses to: x86_64-elf x86_64-freebsd8 x86_64-netbsd i686-pc-linux-gnu (--enable-targets=all) x86_64-kfreebsd-gnu x86_64-knetbsd-gnu i686-solaris2.10. OK to commit? A general note on profiling options and their effects: There are three options for gprof-style function profiling (as opposed to basic block profiling): -p (profiling with prof), -pg (profiling with gprof), -profile (profiling with gprof, and link with a profiling version of libc so that libc functions get profiled as well). The last option is undocumented and OS-specific (for GNU userspace and FreeBSD targets). The only option known to cc1 is -p; the differences between the three options are only around linking except insofar as other specs distinguish between them. -pg is unconditionally mapped to -p for cc1 (gcc.c:cc1_options); -profile relies on CC1_SPEC for compile-time effect (meaning that even for targets where it is nominally supported there may well be inconsistency depending on what's in CC1_SPEC). Many specs handle -p and -pg identically; I don't know what targets relevant to current GCC actually have "prof" so that handling them differently makes sense, but surely not most of them. Whether -profile really makes sense for FreeBSD, or whether -profile specs for FreeBSD should be removed, seems unclear. I added it to freebsd.opt on the basis of freebsd-spec.h:FBSD_STARTFILE_SPEC; FBSD_LIB_SPEC doesn't handle it, but links with -lc_p unconditionally for -pg. I don't know what's in -lc_p on FreeBSD (whether it's just profiling support code, or whether as with glibc it has profiling enabled for all the libc functions). cp/g++spec.c and go/gospec.c know about linking with different versions of certain libraries (in particular libm) for profiling on certain targets; for that driver code, profiling means -p or -pg and -profile is unknown. (I do not have specific recommendations for cleaning things up in this area.) 2011-02-14 Joseph Myers * config/i386/freebsd64.h (CC1_SPEC): Define. * config/i386/linux64.h (CC1_SPEC): Define. * config/i386/x86-64.h (CC1_SPEC): Don't define. Index: gcc/config/i386/x86-64.h =================================================================== --- gcc/config/i386/x86-64.h (revision 170150) +++ gcc/config/i386/x86-64.h (working copy) @@ -1,5 +1,6 @@ /* OS independent definitions for AMD x86-64. - Copyright (C) 2001, 2005, 2007, 2009, 2010 Free Software Foundation, Inc. + Copyright (C) 2001, 2005, 2007, 2009, 2010, 2011 + Free Software Foundation, Inc. Contributed by Bo Thorsen . This file is part of GCC. @@ -48,9 +49,6 @@ see the files COPYING3 and COPYING.RUNTI #undef WCHAR_TYPE_SIZE #define WCHAR_TYPE_SIZE 32 -#undef CC1_SPEC -#define CC1_SPEC "%(cc1_cpu) %{profile:-p}" - #undef ASM_SPEC #define ASM_SPEC "%{m32:--32} %{m64:--64}" Index: gcc/config/i386/freebsd64.h =================================================================== --- gcc/config/i386/freebsd64.h (revision 170150) +++ gcc/config/i386/freebsd64.h (working copy) @@ -1,5 +1,5 @@ /* Definitions for AMD x86-64 running FreeBSD with ELF format - Copyright (C) 2002, 2004, 2007, 2010 Free Software Foundation, Inc. + Copyright (C) 2002, 2004, 2007, 2010, 2011 Free Software Foundation, Inc. Contributed by David O'Brien This file is part of GCC. @@ -25,6 +25,9 @@ along with GCC; see the file COPYING3. #define SUBTARGET_EXTRA_SPECS \ { "fbsd_dynamic_linker", FBSD_DYNAMIC_LINKER } +#undef CC1_SPEC +#define CC1_SPEC "%(cc1_cpu) %{profile:-p}" + /* Provide a LINK_SPEC appropriate for the FreeBSD/x86-64 ELF target. This is a copy of LINK_SPEC from tweaked for the x86-64 target. */ Index: gcc/config/i386/linux64.h =================================================================== --- gcc/config/i386/linux64.h (revision 170150) +++ gcc/config/i386/linux64.h (working copy) @@ -1,5 +1,5 @@ /* Definitions for AMD x86-64 running Linux-based GNU systems with ELF format. - Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010 + Copyright (C) 2001, 2002, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. Contributed by Jan Hubicka , based on linux.h. @@ -40,6 +40,9 @@ see the files COPYING3 and COPYING.RUNTI #undef CPP_SPEC #define CPP_SPEC "%{posix:-D_POSIX_SOURCE} %{pthread:-D_REENTRANT}" +#undef CC1_SPEC +#define CC1_SPEC "%(cc1_cpu) %{profile:-p}" + /* The svr4 ABI for the i386 says that records and unions are returned in memory. In the 64bit compilation we will turn this flag off in ix86_option_override_internal, as we never do pcc_struct_return -- Joseph S. Myers joseph@codesourcery.com