[CLN-list] MAYBE_INLINE patch
Richard B. Kreckel
kreckel at ginac.de
Sat Jan 12 00:59:27 CET 2008
Dear Alexei,
Alexei Sheplyakov wrote:
>> Ouch, that patch is ugly as sin.
>
> Unfortunately, this ugliness is imposed by the standard (ANSI C++).
Yes, I'm aware of that.
> Non-diff part of my previous email is supposed to explain the patch.
> I'm afraid more details will only obfuscate the source. Anyway, here
> it is:
>
>
> CLN wants to inline some functions in some places and not in others.
> The reasons to do so are explained here:
> http://www.ginac.de/pipermail/ginac-list/2003-November/000433.html
>
> However, MAYBE_INLINE thing is a wrong way. First of all, the `inline'
> keyword is only a recommendation, not an order. The compiler is free
> to not inline a function (IMHO its decisions are correct more often
> than not). And this is what actually happens, see, e.g.
>
> http://www.ginac.de/pipermail/cln-list/2007-October/000317.html
>
> As a side note, the compiler is free to inline functions even if it is
> NOT marked as inline (this can be disabled with __attribute__((noinline))
> in GNU C/C++).
>
> Secondly, in ANSI C++ a function *must* be either inline in *every*
> translation unit, or non-inline in *every* translation unit. Hence,
> MAYBE_INLINE is not valid C++ (although it's valid C). The compiler does
> not check for violations of this rule (as per standard), so MAYBE_INLINE
> kind of works on some platforms (and some versions of the GNU compiler and
> some misterious compiler/linker flags. This is not speculation, I used to
> get bizzare link errors even on Linux with g++ 3.3 and
> CXXFLAGS="-O2 -mcpu=ev6").
>
> The patch renames internal versions of "simple" functions and makes
> them (static) inline. Thus, the code does not violate the standard, and
> link errors don't happen. However, everything comes at a price. It's
> necessary to replace almost every invocation of a function `foo' with
> `inline_foo'. That `almost' is the worse thing: in some places `foo' should
> NOT be renamed to `inline_foo'. This is ugly, but I don't see any better
> *standard-compliant* way to achive the goal.
>
>
> Does this explantion sound any better? Is it OK to include it in the code?
Yes, thanks a lot. But I'm still having a hard time understanding how
the combination of attributes 'flatten' and 'always_inline' work out.
Please put in a little comment about that, directly at the point of
definition in the source code. It would be quite helpful, I think.
Can you, please, do this and also incorporate Bruno's suggestion, then
resend the entire patch? I'm waiting with the release until this is
checked in. Thanks a lot!
>> And one last question: Do you have any idea why it's enough converting
>> only these few occurrences?
>
> In all of these cases inlining the function in question is very difficult
> or even impossible.
>
> The most obvious is zerop. In cl_I_ring.cc
>
> 112 static cl_number_ring_ops<cl_I> I_ops = {
> 113 cl_I_p,
> 114 equal,
> 115 zerop,
> 116 operator+,
> 117 operator-,
> 118 operator-,
> 119 operator*,
> 120 square,
> 121 expt_pos
> 122 };
>
> Here, the address of zerop is taken, hence, the compiler is forced to emit
> out-of-line copy. The same applies to cl_RA_ring.cc
Aha, thank you.
Cheers
-richy.
--
Richard B. Kreckel
<http://www.ginac.de/~kreckel/>
More information about the CLN-list
mailing list