On Fri, Apr 27, 2012 at 7:38 AM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Fri, Apr 27, 2012 at 7:35 AM, Sriraman Tallam <tmsri...@google.com> wrote: >> On Fri, Apr 27, 2012 at 6:38 AM, H.J. Lu <hjl.to...@gmail.com> wrote: >>> On Thu, Apr 26, 2012 at 10:08 PM, Sriraman Tallam <tmsri...@google.com> >>> wrote: >>>> Hi, >>>> >>>> I have made the following changes in this new patch which is attached: >>>> >>>> * Use target attribute itself to create function versions. >>>> * Handle any number of ISA names and arch= args to target attribute, >>>> generating the right dispatchers. >>>> * Integrate with the CPU runtime detection checked in this week. >>>> * Overload resolution: If the caller's target matches any of the >>>> version function's target, then a direct call to the version is >>>> generated, no need to go through the dispatching. >>>> >>>> Patch also available for review here: >>>> http://codereview.appspot.com/5752064 >>>> >>> >>> Does it work with >>> >>> int foo (); >>> int foo () __attribute__ ((targetv("arch=corei7"))); >>> >>> int (*foo_p) () = foo? >> >> Yes, this will work. foo_p will be the address of the dispatcher >> function and hence doing (*foo_p)() will call the right version. > > Even when foo_p is a global variable and compiled with -fPIC?
I am not sure I understand what the complication is here, but FWIW, I tried this example and it works int foo () { return 0; } int __attribute__ ((target ("arch=corei7))) foo () { return 1; } int (*foo_p)() = foo; int main () { return (*foo_p)(); } g++ -fPIC -O2 example.cc Did you have something else in mind? Could you please elaborate if you a have a particular case in mind. The way I handle function pointers is straightforward. When the front-end sees a pointer to a function that is versioned, it returns the pointer to the dispatcher instead. Thanks, -Sri. > > Thanks. > > -- > H.J.