On Fri, Aug 26, 2011 at 10:24 AM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Fri, Aug 26, 2011 at 10:17 AM, Sriraman Tallam <tmsri...@google.com> wrote: >> On Fri, Aug 26, 2011 at 10:10 AM, H.J. Lu <hjl.to...@gmail.com> wrote: >>> On Fri, Aug 26, 2011 at 10:06 AM, Sriraman Tallam <tmsri...@google.com> >>> wrote: >>>> On Thu, Aug 25, 2011 at 6:02 PM, H.J. Lu <hjl.to...@gmail.com> wrote: >>>>> On Thu, Aug 25, 2011 at 5:37 PM, Sriraman Tallam <tmsri...@google.com> >>>>> wrote: >>>>>> Hi, >>>>>> >>>>>> Thanks for all the comments. I am attaching a new patch >>>>>> incorporating all of the changes mentioned, mainly : >>>>>> >>>>>> 1) Make __cpu_indicator_init a constructor in libgcc and guard to call >>>>>> it only once. >>>>> >>>>> This is unreliable and you don't need 3 symbols from libgcc. You can use >>>> >>>> Do you mean it is unreliable because of the constructor ordering problem? >>>> >>> >>> You do not have total control when __cpu_indicator_init is called. >> >> Like discussed before, for non-ctor functions, which in my opinion is >> the common use case, it works out great because __cpu_indicator_init >> is guaranteed to be called and I save doing an extra check. It is only >>> for other ctors where this is a problem. So other ctors call this >> explicitly. What did I miss? >> > > I have > > static void foo ( void ) __attribute__((constructor)); > > static void foo ( void ) > { > ... > call bar (); > ... > } > > in my application. bar () uses those cpu specific functions. > foo () is called before __cpu_indicator_init. Since IFUNC > returns the cpu specific function address only for the > first call, the proper cpu specific functions will never be used.
Please correct me if I am wrong since I did not follow the IFUNC part you mentioned. However, it looks like this could be solved with adding an explicit call to __cpu_indicator_init from within the ctor foo. To me, it seems like the pain of adding this call explicitly in other ctors is worth it because it works cleanly for non-ctors. static void foo ( void ) __attribute__((constructor)); static void foo ( void ) { ... __cpu_indicator_init (); call bar (); ... } Will this work? Thanks, -Sri. > > > -- > H.J. >