IFUNC selector will need to call get_cpu_indicator (as proposed by HJ
or something similar), while in other contexts, the implementation
should find a way to make sure the indicator is already initialized
such that the builtins accessing the features can be directly used
(See also Michael and Richard's previous comments).  The runtime
penalty is much smaller.

david

On Fri, Aug 26, 2011 at 10:37 AM, Sriraman Tallam <tmsri...@google.com> wrote:
> 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.
>>
>

Reply via email to