[U-Boot] [PATCH] initcall: Move to inline function

Alexander Graf agraf at suse.de
Fri Feb 8 07:58:18 UTC 2019



> Am 08.02.2019 um 05:11 schrieb Simon Glass <sjg at chromium.org>:
> 
> Hi Alex,
> 
>> On Sat, 2 Feb 2019 at 09:07, Alexander Graf <agraf at suse.de> wrote:
>> 
>> 
>> 
>>> Am 02.02.2019 um 15:13 schrieb Simon Glass <sjg at chromium.org>:
>>> 
>>> Hi Alex,
>>> 
>>>> On Thu, 31 Jan 2019 at 08:06, Alexander Graf <agraf at suse.de> wrote:
>>>> 
>>>> The board_r init function was complaining that we are looping through
>>>> an array, calling all our tiny init stubs sequentially via indirect
>>>> function calls (which can't be speculated, so they are slow).
>>> 
>>> Is this a compiler warning? Could you let me know what this is?
>> 
>> It's the code comment I'm removing with this patch :).
>> 
>>> 
>>>> 
>>>> The solution to that is pretty easy though. All we need to do is inline
>>>> the function that loops through the functions and the compiler will
>>>> automatically convert almost all indirect calls into direct inlined code.
>>> 
>>> You mean it calls the functions one after the other without a
>>> function-table array?
>> 
>> Exactly. Magical, eh? It even inlines them!
> 
> Yes it is surprising. I am also surprised that it reduces code size,
> but I suppose that is why it does it. Presumably the inlining is what
> does that.

Yes, of course. With separate object files, the compiler can not inline anything at all, because it does not know how the function pointers get used.

The alternative to this *might* be LTO, which we could think about as well. It should help reduce indirection and code size overall. But I don't know how well gold works with the linker scripts we have.

> But what happens if we #define DEBUG?

Define it where? ;)

Alex

> 
> Regards,
> Simon



More information about the U-Boot mailing list