On Fri, Oct 5, 2012 at 10:43 AM, Jason Merrill <[email protected]> wrote:
> On 08/24/2012 08:34 PM, Sriraman Tallam wrote:
>>
>> + /* If the address of a multiversioned function dispatcher is taken,
>> + generate the body to dispatch the right function at run-time. This
>>
>> + is needed as the address can be used to do an indirect call. */
>
>
> It seems to me that you don't need a dispatcher for doing indirect calls;
> you could just take the address of the version you would choose if you were
> doing a direct call.
>
> The only reason for a dispatcher I can think of is if you want the address
> of a function to compare equal across translation units compiled with
> different target flags. I'm not sure that's necessary; am I missing
> something?
In general, the dispatcher is always necessary since it is not known
what function version will be called at compile time. This is true
whether it is a direct or an indirect call.
Example:
int foo() __attribute__(sse3)
{
}
int foo () __attribute__(sse4)
{
}
int main ()
{
foo (); // The version of foo to be called is not known at compile
time. Needs dispatcher.
int (*p)() = &foo; // What should be the value of p?
(*p)(); // This needs a dispatcher too.
}
Now, since a dispatcher is necessary when the address of the function
is taken, I thought I could as well make it the address of the
function.
Thanks,
-Sri.
>
> Continuing to look at the patch.
>
> Jason
>