On 19.12.2019 18:45, Alexander Monakov wrote: > [adding Jan Hubicka, GCC LTO maintainer] > > On Thu, 19 Dec 2019, Kirill Tkhai wrote: > >> CC: gcc-help@xxxxxxxxxxx >> >> Hi, gcc guys, >> >> this thread starts here: https://lkml.org/lkml/2019/12/19/403 >> >> There are two const variables: >> >> struct sched_class idle_sched_class >> and >> struct sched_class fair_sched_class, >> >> which are declared in two files idle.c and fair.c. >> >> 1)In Makefile the order is: idle.o fair.o >> 2)the variables go to the same ro section >> 3)there is no SORT(.*) keyword in linker script. >> >> Is it always true, that after linkage &idle_sched_class < &fair_sched_class? > > No, with LTO you don't have that guarantee. For functions it's more obvious, > GCC wants to analyze functions in reverse topological order so callees are > generally optimized before callers, and it will emit assembly as it goes, so > function ordering with LTO does not give much care to translation unit > boundaries. For variables it's a bit more subtle, GCC partitions all variables > and functions so it can hand them off to multiple compiler processes while doing > LTO. There's no guarantees about order of variables that end up in different > partitions. > > There's __attribute__((no_reorder)) that is intended to enforce ordering even > with LTO (it's documented under "Common function attributes" but works for > global variables as well). Thanks, Alexander! Kirill