"Thomas Preud'homme" <thomas.preudho...@arm.com> writes:
>> From: Richard Sandiford [mailto:rdsandif...@googlemail.com]
>> 
>> -mno-float as it stands today is really just -msoft-float with some
>> floating-point support removed from the library to save space.
>> One of the important examples is that the floating-point printf
>> and scanf formats are not supported, so printf and scanf do not
>> pull in large parts of the software floating-point library.
>
> Reading again your email I realized I had missed the best bits of
> this paragraph. Being able to avoid linking all the support for float
> in printf and scanf when it is not needed is indeed interesting for
> embedded use. How does this work by the way?

-mno-float causes gcc to define the macro __mips_no_float, which the
implementation can use when deciding whether to bother handling %f, etc.
I'm afraid there's nothing more sophisticated to it than that.

> Note that this is an orthogonal issue to the calling convention being
> used or the use of a FPU. I'll take the example of ARM as it's the one
> I know best (forgive me if you already know all these details).

Well, maybe orthogonal in concept, but as above, not in implementation :-)
-mno-float really means "does not use floating point in any form",
so has a stricter requirement than what you wanted.

> On ARM, the calling convention for variadic function states that
> all parameters of primitive type are either passed in GP registers
> or on the stack, no matter what is their type. That is, you cannot
> determine whether the float logic of scanf and printf is needed
> based on the type or parameters. You could have a float passed
> to printf but only its hexadecimal value being displayed by a %x
> printf modifier, for instance if you are trying to debug a
> software implementation of float arithmetic. On the opposite,
> you could pass an integer and display it as a float, for the same
> reason of debugging a software implementation of float
> arithmetic.
>
> As to the use of an FPU, consider the case of the
> -mfloat-abi=softfp switch on ARM target. It makes gcc
> generate instructions using the FPU to do float arithmetic but
> still passes float in GP registers for compatibility with systems
> without an FPU. You can thus see that use of FPU, calling
> convention and linking float code of printf/scanf or 3 separate
> issues. The -no-float switch on MIPS seems to conflate these
> 3 issues by telling gcc not to do any float arithmetic (-nofpu,
> like if there was a -mfpu=none), that as a consequence the
> calling convention used does not matter (the thing for which
> I would like a switch to check that fact and an automatic
> detection) and that float related code of printf/scanf should
> not be linked in (this could be useful for other target used in
> embedded scenarios).
>
> Since these three aspects could be useful to several
> architectures I think they should be implemented in arch
> independent code.

Definitely.  The reason -mno-float is restricted to certain MIPS
configurations rather than being a general MIPS option is because the
current option is a hack.  It ought to offer at least some help in
enforcing the restrictions, whereas instead it just allows any
floating-point operations to be used and compiles them in the
same way as -msoft-float.

> In ARM case the calling convention also determine how to pass
> structures of 4 or less floats/double so there would also be an
> arch-dependent part. I am not sure about whether to add a new hook or
> provide helper function in the middle end for the backend to use.

I assume for most cases the restriction is of the form "calling this
function must not use registers in class X".  I think we can detect
that using the existing hooks.

A more general restriction would be "must pass arguments in the same
way for both option set A and option set B".  That too could be done
using existing hooks and SWITCHABLE_TARGET, although it might not be
hyper-efficient.

> A last word about the linking issue. It would be nice to
> detect the need for float part of printf/scan automatically.
> However, I don't think it is possible to detect all cases
> because, as explained above, you can't deduce what will be
> displayed based on the type of the parameter. The only
> reliable way is to parse the format string but if the format
> string is not hardcoded but constructed then there is
> nothing you can do.

Agreed.

> However if all call to printf have a hardcoded format string (should
> be the case for most programs) then you can say for certain that the
> float code does not need to be linked. For program where this
> automatic detection is too conservative it would then still be
> possible to use the switch to force the float code to be left out.

I agree it's possible.  FWIW, as things stand, MIPS just treats hard-float
and soft-float code as link-incompatible, so I don't think we could
use it there.

Thanks,
Richard

Reply via email to