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.

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 (a...@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"

Reply via email to