[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [avr-gcc-list] avr-gcc: Add --with-avrlibc configure option for AVR-

From: Gabriel Dos Reis
Subject: Re: [avr-gcc-list] avr-gcc: Add --with-avrlibc configure option for AVR-Libc cooperation?
Date: Sun, 2 Sep 2012 17:31:27 -0500

On Sun, Sep 2, 2012 at 1:41 PM, Georg-Johann Lay <address@hidden> wrote:
> Gabriel Dos Reis schrieb:
>> On Sun, Sep 2, 2012 at 12:17 PM, Georg-Johann Lay <address@hidden> wrote:
>>> Gabriel Dos Reis schrieb:
>>>> On Sun, Sep 2, 2012 at 8:56 AM, Georg-Johann Lay <address@hidden> wrote:
>>>>> Weddington, Eric schrieb:
>>>>>>> On Behalf Of Georg-Johann Lay
>>>>>>> for historical reasons, AVR-Libc implements functions that
>>>>>>> GCC expects to live in libgcc, namely float functions like
>>>>>>> __fixsfsi.
>>>>>>> Currently, avr-gcc is not configurable to accommodate that
>>>>>>> situation which leads to performance problems if the float
>>>>>>> support functions from libgcc are used.
>>>>>>> This happens at least in the following situations:
>>>>>>> * The user does not specify -lm.  -lm should only be needed
>>>>>>>    if function from math.h are used, not for language core
>>>>>>>    features like int i = (int) float.
>>>>>>> * The application is LTO compiled, i.e. linked with -flto.
>>>>>>>    The plugin machinery passes lgcc -lc lgcc through to the
>>>>>>>    linker by means of -plugin-opt=-pass-through=-lgcc etc.
>>>>>>>    so that -lgcc is linked prior to -lm.
>>>>>>> * The user uses fixed <-> float conversion routines from
>>>>>>>    libgcc.  These routines refer float functions, and the linker
>>>>>>>    resolves these function in libgcc if they are there.
>>>>>>> * avr-g++ is used as linker driver.
>>>>>> Yes, we definitely want to make sure all the above are working.
>>>>>>> In order to fix all of these cases, at least two changes
>>>>>>> are needed in the compiler.
>>>>>>> 1) Remove respective functions from libgcc
>>>>>>> 2) libm.a is not a "math library", it is a "libgcc supplement".
>>>>>>>     Thus, -lm has to be treated like libgcc.
>>>>>> Joerg Wunsch and I have talked for years about the idea of
>>>>>> integrating libm into libc, so that way there was only one library
>>>>>> to deal with. Would this be a good point to do that as well?
>>>>>> Would that make all the linker flag stuff easier to deal with?
>>>>> If there are plans to integrate libm into libc then this should
>>>>> be done *before* GCC supports --with-avrlibc configure option.
>>>>> Otherwise, AVR-Libc would knock out itself making the linker throw
>>>>> a "cannot find -lm" or similar linker error which would make that
>>>>> configure option obsolete...
>>>>> The preferred way would be *not* to move libm to libc so
>>>>> that the library layout is stable and the configure option
>>>>> works across various versions of AVR-Libc, even older ones.
>>>>> The intersection between libgcc and AVR-Libc is stable and
>>>>> did not change often, if I see correctly.  Changing the layout
>>>>> just now might be not helpful; except in the case there is
>>>>> a dummy libm.a that prevents "cannot find -lm" link error.
>>>> How about just having the driver add -lm (unless specifically
>>>> instructed not to) systematically?
>>> Could you explain this?
>>> specs like LIBGCC_SPEC and LINK_GCC_C_SEQUENCE_SPEC work on the
>>> driver level.
>>> The fixed-point issue shows that -lm is not enough and some functions
>>> have to be removed from libgcc.a if the compiler is to be used with
>>> AVR-Libc so that a new configure option is needed no matter what in
>>> order to get best performance.
>> My point was manyfold:
>>    -- From the original message, the fact that users did not specify -lm
>>        should never be an issue.  In fact, users should never have to
>>        specify -lm.
> That'saccomplished by the proposed changes to LINK_GCC_C_SEQUENCE_SPEC


> And there are users that still prefer C over C++.

Definitely, but that has nothing to do with with specs, right?

>  Two reasons are the
> named address spaces and the native fixed point support of ISO/IEC 18037
> which won't be supported by C++ if I understand correctly.

I think we (briefly) discussed named address spaces here.  But I would
think all of this is completely orthogonal to the spec modification proposal.

> Besides that, g++ (or C++) is rude with progmem...

ditto.  Right?

>>    -- have the driver pass -lm before -lgcc.  This is internal to GCC.
>>        It should never be user problem.  Unless user says "please don't;
>>        I have my own ideas about this."  Then user takes full
>> responsability
>>        for the fallout.  This should fix the -flto problem.
> That's also fixed by the new specs,

Yes, exactly.

> but g++ has its own concept of how
> -l options are passed and processed, see PR28718 and the discussion.

Two things:
   1.  None of the people involved in that discussion is a C++ compiler
        and/or a libstdc++ maintainer.  You would need to add at least
        a libstdc++ maintainer to the discussion in order to have a
        satisfactory resolution.  If you did not mention it now, I would
        most likely know of it: the PR is/was classified as a driver.

   2.  Yes, indeed, libstdc++ is not built when g++ is built.  This goes back
        to a discussion we had here a while ago.  Also, I do not think it helps
        the issue to describe the situation as libm is user-supplied
or user-written.
        People will get confused and start arguing all kinds of things -- if my
        past experience with libstdc++ when it was in its early enfancy and had
        its own release schedule and was largely independent.

The issue is clearly a bug in GCC -- at least according to my understanding
of the report.  We need to have the following happen:

    a. Bring it to C++ maintainers (both compiler library implementors) directly
         on the list.  I would suggest address@hidden and main

    b. You guys need to assist us (libstdc++ maintainers) to set up a
reliable way to
         build a portion of the free standing part of libstdc++.  Last
time we discussed
         this, I got two different directions.  One from here, and one
from Benjamin.
         We need to standardize on the recommended way to build g++ for AVR.

> The backend does not even have a way to hook in because g++ is too
> dumb.

Please, expand on this because I do not understand what you meant.

>  The solution above only works because the intersection between
> libm and libgcc is empty with the patch.

Yes, and I think that is a good property.  Again see how we handle
similar problems
with libstdc++ proper and libsupc++.

> Similar for -flto: It makes a difference if the user specifies -lm or
> the -lm comes from a spec, cf lto's -plugin-opt=-pass-through=-l***

I remain of the opinion that users should not have to specify -lm.
If the compiler does not behave correctly without -lm, then that is
a bug in how we (implementors) communicate between the code
generators and the support runtime.

>>    -- The libgcc problems to me means that we have a "layering" problem
>>        to address at the libgcc level. Maybe we should have libmath-core
>>        for the core-math (actually conversions) functions that libgcc
>> assumes.
> The problem of the non-empty libgcc-libm intersection is solved by
> making the intersection empty.

Yes, that is a preferable solution if it can be deployed.

>  I don't think yet another libfoo is helpful here.

>  libfoo's symbol names would still use libgcc's internal
> names like __addsf3.
> Moving core functions, i.e. functions in libm that are not in math.h,
> to libgcc won't happen because the original authors are no more around.


> Did I miss something with the proposed changes to the specs and/or

I agree with the spec modification.  However, I find the need for a configure
option  dubious.

-- Gaby

reply via email to

[Prev in Thread] Current Thread [Next in Thread]