On Fri, Aug 26, 2011 at 10:24 AM, H.J. Lu <[email protected]> wrote:
> On Fri, Aug 26, 2011 at 10:17 AM, Sriraman Tallam <[email protected]> wrote:
>> On Fri, Aug 26, 2011 at 10:10 AM, H.J. Lu <[email protected]> wrote:
>>> On Fri, Aug 26, 2011 at 10:06 AM, Sriraman Tallam <[email protected]>
>>> wrote:
>>>> On Thu, Aug 25, 2011 at 6:02 PM, H.J. Lu <[email protected]> wrote:
>>>>> On Thu, Aug 25, 2011 at 5:37 PM, Sriraman Tallam <[email protected]>
>>>>> 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.
>