function multi-versioning in GCC
https://lwn.net/Articles/691932/
https://gcc.gnu.org/wiki/FunctionMultiVersioning
why multi-versioning
This aim of this project is to make it really easy for the developer to specify multiple versions of a function, each catered to a specific target ISA feature. GCC then takes care of creating the dispatching code necessary to execute the right function version.
how this is implemented
When the front-end sees a call (pointer) to a function version, it generates a new dispatcher function decl and replaces the existing call (pointer) to be a call (pointer) to the dispatcher function. The body of the dispatcher function is later generated when building the call graph. The dispatcher function has the logic to determine the right function version at runtime. At run-time, calling the function version, either directly or indirectly, will invoke the dispatcher logic which will execute the right function version.
dispatcher function body
- at runtime, use CPU check built-ins to check CPU capability;
- IFUNC mechanism so the look up is only needed once.
IFUNC mechanism reuses existing support from compiler/linker as well as the dynamic linker at runtime. Although we can create a custom version of such indirection, like a function pointer initialized at runtime by checking CPU capabilities.