Hi,

Thanks so much, this exactly solves issue. I didn't know about this
option, it seems very useful in such cases.

---
With best regards, Konstantin

On Tue, Feb 7, 2012 at 5:11 PM, Richard Guenther
<richard.guent...@gmail.com> wrote:
> On Tue, Feb 7, 2012 at 1:57 PM, Konstantin Vladimirov
> <konstantin.vladimi...@gmail.com> wrote:
>> Hi,
>>
>> That is good solution, thanks.
>>
>> But what if I want to compile e.o and d.o with cross-module inlining
>> (but also with fixed regs and so, without lto, as you are suggesting)?
>> On gcc-4.3.3, I had "combine" option for such cases. Is it completely
>> impossible in gcc 4.6.2?
>
> You then can do
>
>  gcc $OPTIONS -flto a.c -o a.o
>  gcc $OPTIONS -flto b.c -o b.o
>  gcc $OPTIONS -ffixed-r9 -ffixed-r10 -flto d.c -o d.o
>  gcc $OPTIONS -ffixed-r9 -ffixed-r10 -flto e.c -o e.o
>  gcc $OPTIONS -flto a.o b.o -o non-fixed-reg-part.o -r -nostdlib
>  gcc $OPTIONS -flto -ffixed-r9 -ffixed-r10 d.o e.o -o fixed-reg-part.o
> -r -nostdlib
>  gcc non-fixed-reg-part.o fixed-reg-part.o
>
> thus, optimize both pieces via partial LTO linking (-r, maybe the -nostdlib is
> not needed) and then do the final link separately.
>
> Richard.
>
>> ---
>> With best regards, Konstantin
>>
>> On Tue, Feb 7, 2012 at 4:37 PM, Richard Guenther
>> <richard.guent...@gmail.com> wrote:
>>> On Tue, Feb 7, 2012 at 1:26 PM, Konstantin Vladimirov
>>> <konstantin.vladimi...@gmail.com> wrote:
>>>> Hi,
>>>>
>>>> Consider some project, consisting of files: a.c, b.c, d.c and e.c
>>>>
>>>> Compiler is gcc 4.6.2
>>>>
>>>> Files a.c and b.c are performance bottlenecks and requires heavy
>>>> cross-module inline, so must be compiled with -flto option
>>>> Files d.c and e.c is preffered to be compiled with lto option too, but
>>>> they are of special usage, and requires some registers (say r9 and
>>>> r10) to be fixed (with -ffixed-<reg> option) during compilation.
>>>>
>>>> All these files forms single binary.
>>>>
>>>> Now the problem is: if I compiling
>>>>
>>>> gcc $OPTIONS -flto a.c -o a.o
>>>> gcc $OPTIONS -flto b.c -o b.o
>>>> gcc $OPTIONS -ffixed-r9 -ffixed-r10 -flto d.c -o d.o
>>>> gcc $OPTIONS -ffixed-r9 -ffixed-r10 -flto e.c -o d.o
>>>>
>>>> and then
>>>>
>>>> gcc $OPTIONS -flto a.o b.o d.o e.o -o a.out
>>>>
>>>> Then registers inside d.o and e.o are being reallocated at link time,
>>>> and r9, r10 are used in the d.o and e.o parts in the resulted binary.
>>>> Also I can not specify fixed regs to final link, because this will fix
>>>> registers in a.o and b.o parts, that will affect performance.
>>>>
>>>> The best way for me seems to somehow separately link pseudo-object
>>>> files a.o and b.o with -flto to simple object (say x.o), and then link
>>>> e.o and d.o to single, say, y.o, and then call linker to finally link
>>>> binary without cross-module optimizations. But I can not find
>>>> possibility to do it, and I doubt if this at all conforms with lto
>>>> ideology.
>>>
>>> That's indeed the way to go, but you don't need anything fancy like
>>> partial linking.
>>>
>>>  gcc $OPTIONS -flto a.c -o a.o
>>>  gcc $OPTIONS -flto b.c -o b.o
>>>  gcc $OPTIONS -ffixed-r9 -ffixed-r10 d.c -o d.o
>>>  gcc $OPTIONS -ffixed-r9 -ffixed-r10 e.c -o e.o
>>>  gcc $OPTIONS -flto a.o b.o d.o e.o
>>>
>>> should do it automatically.  Just make sure to not compile d.o and e.o
>>> with -flto.
>>>
>>> Richard.
>>>
>>>> So, I want to perform link-time optimizations between a.o and b.o, and
>>>> don't want them between (a.o or b.o) and (d.o or e.o)
>>>>
>>>> How can I approach this?
>>>>
>>>> Thanks in advance for everyone, who will help.
>>>>
>>>> ---
>>>> With best regards, Konstantin

Reply via email to