diff mbox

[avr] PR54461: Better AVR-Libc integration

Message ID 504641B2.6040003@gjlay.de
State New
Headers show

Commit Message

Georg-Johann Lay Sept. 4, 2012, 6 p.m. UTC
Weddington, Eric wrote:
> 
>>>> Can you explain this?  A typical build of avr tools goes like
>>>>
>>>> 1) configure, build and install binutils
>>>> 2) configure, build and install the compiler
>>>> 3) configure, build and install AVR-Libc
>>>>
>>>> so that in step 2 no checking is possible because there is no -lc yet.
>>>> Or do you mean a check at run time (of the compiler)?
>>> 4) build and install the real compiler
>>>
>>> at which time you have AVR-libc available.  AT least that's how you
>>> "bootstrap" a glibc cross.
>> avr-gcc has had a "simplified" build process for a while, as it almost never
>> needed to have a avr-gcc hosted on an avr platform.  It is usually
>> built as a cross-compiler that always run on the build platform.
>>
>> What I was suggesting earlier is that we shouldn't continue patching
>> the AVR target as if the current state is almost ideal.  Pick a libc -- avr-
>> libc
>> appears to be the natural implementation -- and make it the default as
>> opposed to adding nobs.
> 
> I also strongly agree with this.
> 
> AFAIK, the only project that uses newlib as the C library for the AVR target
> is RTEMS, because, AIUI, they need to have the POSIX interface. The vast
> majority of AVR users have a toolchain that uses avr-libc.

So here is an updated version of the patch.
Instead of "with_avrlibc = yes" it does "with_avrlibc != no".

Just like the first version, --with-avrlibc[=*] is only recognized
if avr-gcc is not configured for RTEMS, i.e. RTEMS users don't need
to set --with-avrlibc=no in order to get a complete libgcc.


Johann

--

	PR target/54461
	* configure.ac (noconfigdirs,target=avr-*-*): Add target-newlib,
	target-libgloss if not configured --with-avrlibc=no.
	* configure: Regenerate.

libgcc/
	PR target/54461
	* config.host (tmake_file,host=avr-*-*): Add avr/t-avrlibc if
	not configured --with-avrlibc=no.
	* config/avr/t-avrlibc: New file.
	* Makefile.in (FPBIT_FUNCS): filter-out LIB2FUNCS_EXCLUDE.
	(DPBIT_FUNCS): Ditto.
	(TPBIT_FUNCS): Ditto.

gcc/
	PR target/54461
	* config.gcc (tm_file,target=avr-*-*): Add avr/avrlibc.h if
	not configured --with-avrlibc=no.
	(tm_defines,target=avr-*-*): Add WITH_AVRLIBC if not configured
	--with-avrlibc=no.
	* config/avr/avrlibc.h: New file.
	* config/avr/avr-c.c: Build-in define __WITH_AVRLIBC__ if
	not configured --with-avrlibc=no.

Comments

Weddington, Eric Sept. 4, 2012, 6:24 p.m. UTC | #1
> -----Original Message-----
> From: Georg-Johann Lay []
> Sent: Tuesday, September 04, 2012 12:00 PM
> To: Weddington, Eric
> Cc: Gabriel Dos Reis; Richard Guenther; gcc-patches@gcc.gnu.org; Denis
> Chertykov; Joerg Wunsch
> Subject: Re: [Patch,avr] PR54461: Better AVR-Libc integration
> 
> So here is an updated version of the patch.
> Instead of "with_avrlibc = yes" it does "with_avrlibc != no".
> 
> Just like the first version, --with-avrlibc[=*] is only recognized
> if avr-gcc is not configured for RTEMS, i.e. RTEMS users don't need
> to set --with-avrlibc=no in order to get a complete libgcc.
>

Sorry, I'm a bit confused. With your new patch...

- If I build GCC, for the avr target (plain), without specifying the --with-avr-libc=<> switch, does it default to "yes"?

- If I build GCC, for the avr-rtems target, without specifying the --with-avr-libc=<> switch, does it default to "no"?

Because the above is what I would expect the default behavior to be. Doing that would certainly help with backwards compatibility for those building toolchain distributions.

I would think that the user has to specify the --with-avr-libc=<> flag to explicitly deviate from common usage and practice.

Eric Weddington
Gabriel Dos Reis Sept. 4, 2012, 6:29 p.m. UTC | #2
On Tue, Sep 4, 2012 at 1:00 PM, Georg-Johann Lay <avr@gjlay.de> wrote:
> Weddington, Eric wrote:
>>
>>>>> Can you explain this?  A typical build of avr tools goes like
>>>>>
>>>>> 1) configure, build and install binutils
>>>>> 2) configure, build and install the compiler
>>>>> 3) configure, build and install AVR-Libc
>>>>>
>>>>> so that in step 2 no checking is possible because there is no -lc yet.
>>>>> Or do you mean a check at run time (of the compiler)?
>>>> 4) build and install the real compiler
>>>>
>>>> at which time you have AVR-libc available.  AT least that's how you
>>>> "bootstrap" a glibc cross.
>>> avr-gcc has had a "simplified" build process for a while, as it almost never
>>> needed to have a avr-gcc hosted on an avr platform.  It is usually
>>> built as a cross-compiler that always run on the build platform.
>>>
>>> What I was suggesting earlier is that we shouldn't continue patching
>>> the AVR target as if the current state is almost ideal.  Pick a libc -- avr-
>>> libc
>>> appears to be the natural implementation -- and make it the default as
>>> opposed to adding nobs.
>>
>> I also strongly agree with this.
>>
>> AFAIK, the only project that uses newlib as the C library for the AVR target
>> is RTEMS, because, AIUI, they need to have the POSIX interface. The vast
>> majority of AVR users have a toolchain that uses avr-libc.
>
> So here is an updated version of the patch.
> Instead of "with_avrlibc = yes" it does "with_avrlibc != no".
>
> Just like the first version, --with-avrlibc[=*] is only recognized
> if avr-gcc is not configured for RTEMS, i.e. RTEMS users don't need
> to set --with-avrlibc=no in order to get a complete libgcc.

Thanks!  I am satisfied with this.

-- Gaby
Georg-Johann Lay Sept. 4, 2012, 7:02 p.m. UTC | #3
Weddington, Eric wrote:
> 
>> From: Georg-Johann Lay
>>
>> So here is an updated version of the patch.
>> Instead of "with_avrlibc = yes" it does "with_avrlibc != no".
>>
>> Just like the first version, --with-avrlibc[=*] is only recognized
>> if avr-gcc is not configured for RTEMS, i.e. RTEMS users don't need
>> to set --with-avrlibc=no in order to get a complete libgcc.
> 
> Sorry, I'm a bit confused. With your new patch...
> 
> - If I build GCC, for the avr target (plain), without specifying
> the --with-avr-libc=<> switch, does it default to "yes"?

Yes.  Anything except an explicit "no" is treated like "yes".

> - If I build GCC, for the avr-rtems target, without specifying
> the --with-avr-libc=<> switch, does it default to "no"?

Notice the switch is called --with-avrlibc.  The option is ignored for
avr-*-rtems*, thus is similar to "no", thus yes for the question.

> Because the above is what I would expect the default behavior to be.
> Doing that would certainly help with backwards compatibility for those
> building toolchain distributions.
> 
> I would think that the user has to specify the --with-avr-libc=<> flag
> to explicitly deviate from common usage and practice.

Yes, that's the case.  Except for users that want avr-*-* without
AVR-Libc and with newlib or some other libc flavor.


Johann
Weddington, Eric Sept. 4, 2012, 7:09 p.m. UTC | #4
> -----Original Message-----
> From: Georg-Johann Lay []
> Sent: Tuesday, September 04, 2012 1:03 PM
> To: Weddington, Eric
> Cc: Gabriel Dos Reis; Richard Guenther; gcc-patches@gcc.gnu.org; Denis
> Chertykov; Joerg Wunsch
> Subject: Re: [Patch,avr] PR54461: Better AVR-Libc integration
> 
> > I would think that the user has to specify the --with-avr-libc=<> flag
> > to explicitly deviate from common usage and practice.
> 
> Yes, that's the case.  Except for users that want avr-*-* without
> AVR-Libc and with newlib or some other libc flavor.

Excellent! Thanks for the detailed explanation, and sorry for my confusion.

I'm good with the patch, then.

Eric
diff mbox

Patch

Index: configure
===================================================================
--- configure	(revision 190922)
+++ configure	(working copy)
@@ -3499,6 +3499,13 @@  case "${target}" in
   arm-*-riscix*)
     noconfigdirs="$noconfigdirs ld target-libgloss"
     ;;
+  avr-*-rtems*)
+    ;;
+  avr-*-*)
+    if test x${with_avrlibc} != xno; then
+      noconfigdirs="$noconfigdirs target-newlib target-libgloss"
+    fi
+    ;;
   c4x-*-* | tic4x-*-*)
     noconfigdirs="$noconfigdirs target-libgloss"
     ;;
Index: configure.ac
===================================================================
--- configure.ac	(revision 190922)
+++ configure.ac	(working copy)
@@ -891,6 +891,13 @@  case "${target}" in
   arm-*-riscix*)
     noconfigdirs="$noconfigdirs ld target-libgloss"
     ;;
+  avr-*-rtems*)
+    ;;
+  avr-*-*)
+    if test x${with_avrlibc} != xno; then
+      noconfigdirs="$noconfigdirs target-newlib target-libgloss"
+    fi
+    ;;
   c4x-*-* | tic4x-*-*)
     noconfigdirs="$noconfigdirs target-libgloss"
     ;;
Index: libgcc/config/avr/t-avrlibc
===================================================================
--- libgcc/config/avr/t-avrlibc	(revision 0)
+++ libgcc/config/avr/t-avrlibc	(revision 0)
@@ -0,0 +1,66 @@ 
+# This file is used if not configured --with-avrlibc=no
+#
+# AVR-Libc comes with hand-optimized float routines.
+# For historical reasons, these routines live in AVR-Libc
+# and not in libgcc and use the same function names like libgcc.
+# To get the best support, i.e. always use the routines from
+# AVR-Libc, we remove these routines from libgcc.
+#
+# See also PR54461.
+#
+#
+# Arithmetic:
+#     __addsf3 __subsf3 __divsf3 __mulsf3 __negsf2
+#
+# Comparison:
+#     __cmpsf2 __unordsf2
+#     __eqsf2 __lesf2 __ltsf2 __nesf2 __gesf2 __gtsf2
+#
+# Conversion:
+#     __fixsfdi __fixunssfdi __floatdisf __floatundisf
+#     __fixsfsi __fixunssfsi __floatsisf __floatunsisf
+#
+#
+# These functions are contained in modules:
+#
+# _addsub_sf.o:   __addsf3  __subsf3
+# _mul_sf.o:      __mulsf3
+# _div_sf.o:      __divsf3
+# _negate_sf.o:   __negsf2
+#
+# _compare_sf.o:  __cmpsf2
+# _unord_sf.o:    __unordsf2
+# _eq_sf.o:       __eqsf2
+# _ne_sf.o:       __nesf2
+# _ge_sf.o:       __gesf2
+# _gt_sf.o:       __gtsf2
+# _le_sf.o:       __lesf2
+# _lt_sf.o:       __ltsf2
+#
+# _fixsfdi.o:     __fixsfdi
+# _fixunssfdi.o:  __fixunssfdi
+# _fixunssfsi.o:  __fixunssfsi
+# _floatdisf.o:   __floatdisf
+# _floatundisf.o: __floatundisf
+# _sf_to_si.o:    __fixsfsi
+# _si_to_sf.o:    __floatsisf
+# _usi_to_sf.o:   __floatunsisf
+
+
+# SFmode
+LIB2FUNCS_EXCLUDE += \
+	_addsub_sf \
+	_negate_sf \
+	_mul_sf _div_sf \
+	\
+	_compare_sf \
+	_unord_sf \
+	_eq_sf _ne_sf \
+	_gt_sf _ge_sf \
+	_lt_sf _le_sf \
+	\
+	_si_to_sf  _sf_to_si \
+	_usi_to_sf _sf_to_usi \
+	_fixunssfsi _fixsfdi \
+	_fixunssfdi \
+	_floatdisf _floatundisf
Index: libgcc/config.host
===================================================================
--- libgcc/config.host	(revision 190922)
+++ libgcc/config.host	(working copy)
@@ -380,6 +380,9 @@  avr-*-rtems*)
 avr-*-*)
 	# Make HImode functions for AVR
 	tmake_file="${cpu_type}/t-avr t-fpbit"
+	if test x${with_avrlibc} != xno; then
+	    tmake_file="$tmake_file ${cpu_type}/t-avrlibc"
+	fi
 	tm_file="$tm_file avr/avr-lib.h"
 	;;
 bfin*-elf*)
Index: gcc/config/avr/avr-c.c
===================================================================
--- gcc/config/avr/avr-c.c	(revision 190922)
+++ gcc/config/avr/avr-c.c	(working copy)
@@ -148,6 +148,10 @@  avr_cpu_cpp_builtins (struct cpp_reader
   cpp_define_formatted (pfile, "__AVR_SFR_OFFSET__=0x%x",
                         avr_current_arch->sfr_offset);
     
+#ifdef WITH_AVRLIBC
+  cpp_define (pfile, "__WITH_AVRLIBC__");
+#endif /* WITH_AVRLIBC */
+      
   /* Define builtin macros so that the user can easily query if or if not
      non-generic address spaces (and which) are supported.
      This is only supported for C.  For C++, a language extension is needed
Index: gcc/config/avr/avrlibc.h
===================================================================
--- gcc/config/avr/avrlibc.h	(revision 0)
+++ gcc/config/avr/avrlibc.h	(revision 0)
@@ -0,0 +1,31 @@ 
+/* Definitions of target machine for the GNU compiler collection
+   for Atmel AVR micro controller if configured for AVR-Libc.
+   Copyright (C) 2012
+   Free Software Foundation, Inc.
+   Contributed by Georg-Johann Lay (avr@gjlay.de)
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 3, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
+
+/* AVR-Libc implements functions from libgcc.a in libm.a, see PR54461.  */
+
+#undef  LIBGCC_SPEC
+#define LIBGCC_SPEC                                                     \
+  "%{!mmcu=at90s1*:%{!mmcu=attiny11:%{!mmcu=attiny12:%{!mmcu=attiny15:%{!mmcu=attiny28: -lgcc -lm }}}}}"
+
+#undef  LINK_GCC_C_SEQUENCE_SPEC
+#define LINK_GCC_C_SEQUENCE_SPEC \
+  "--start-group %G %L --end-group"
Index: gcc/config.gcc
===================================================================
--- gcc/config.gcc	(revision 190922)
+++ gcc/config.gcc	(working copy)
@@ -892,6 +892,10 @@  avr-*-rtems*)
 	;;
 avr-*-*)
 	tm_file="elfos.h avr/elf.h avr/avr.h dbxelf.h avr/avr-stdint.h"
+	if test x${with_avrlibc} != xno; then
+	    tm_file="${tm_file} ${cpu_type}/avrlibc.h"
+	    tm_defines="${tm_defines} WITH_AVRLIBC"
+	fi
 	tmake_file="avr/t-avr avr/t-multilib"
 	use_gcc_stdint=wrap
 	extra_gcc_objs="driver-avr.o avr-devices.o"