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. -- H.J.