On Mon, Aug 22, 2011 at 1:46 PM, Richard Guenther <richard.guent...@gmail.com> wrote: > On Mon, Aug 22, 2011 at 10:39 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >> On Mon, Aug 22, 2011 at 1:34 PM, Richard Guenther >> <richard.guent...@gmail.com> wrote: >>> On Mon, Aug 22, 2011 at 6:02 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>> On Mon, Aug 22, 2011 at 8:56 AM, Michael Matz <m...@suse.de> wrote: >>>>> Hi, >>>>> >>>>> On Mon, 22 Aug 2011, H.J. Lu wrote: >>>>> >>>>>> >> Oh, I thought it was data initialized by the constructor ... >>>>>> > >>>>>> > Sriramans patch right now has a function __cpu_indicator_init which is >>>>>> > called from (adhoc constructed) ctors and that initializes variables >>>>>> > __cpu_model and __cpu_features ;-) There's no __cpu_indicator symbol >>>>>> > :) >>>>>> > >>>>>> > I think the whole initializer function and the associated data blobs >>>>>> > have >>>>>> > to sit in static libgcc and be hidden. By that all shared modules >>>>>> > will have their own copies of the model and features (and the >>>>>> > initializer >>>>>> > function) so there won't be issues with copy relocs, or cross shared >>>>>> > lib >>>>>> > calls while relocating the modules. Dynamically they will contain the >>>>>> > same data always, but it's not many bytes, and only modules making use >>>>>> > of >>>>>> > this facility will pay it. >>>>>> > >>>>>> > The initializer function has to be callable from pre-.init contexts, >>>>>> > e.g. >>>>>> > ifunc dispatchers. And to make life easier there should be one ctor >>>>>> > function calling this initializer function too, so that normal code can >>>>>> > rely on it being already called saving one check. >>>>>> > >>>>>> >>>>>> It sounds more complicated than necessary. Why not just do it >>>>>> on demand like glibc does? >>>>> >>>>> Ehm, the only difference would be to not have a ctor in libgcc that looks >>>>> like so: >>>>> >>>>> void __attribute__((constructor)) bla(void) >>>>> { >>>>> __cpu_indicator_init (); >>>>> } >>>>> >>>>> I don't see any complication.? >>>>> >>>> >>>> Order of constructors. A constructor may call functions >>>> which use __cpu_indicator. >>> >>> As I said - make __cpu_indicator have a conservative >>> default value (zero). It is irrelevant if constructors that >>> run before initializing __cpu_indicator run with the >>> default CPU capabilities. >>> >> >> If IFUNC is used, this just disables IFUNC for those functions >> called with the conservative default value since they are only >> resolved once. > > Huh, well. So what happens if you use __cpu_indicator from the > IFUNC selector function!? Honestly, if we care about these > corner-cases why not make __cpu_indicator a hidden function > instead. > > IMHO IFUNC selectors should simply do > > if (!__cpu_indicator) > __cpu_indicator_init (); >
Isn't it what I said before? -- H.J.