Basically, the workaround I had at the time was to just disable
-fstack-protector for the
get_type() functions. It certainly made things faster, but it was a compromise. The
get_type() functions can have user-provided code inserted into them via macros like
G_DEFINE_TYPE_EXTENDED() and friends.
A real solution should manage to return the performance of the hot-path back to pre-stack-protector performance without sacrificing the the protection gained by using it.
So I spent some time today to make that happen. In bugzilla #795180 I’ve added some patches which break the
get_type() functions into two. One containing the hot path, and a second that does the full type registration which is protected by our
g_once_init_enter(). If we add the magic
__attribute__((noinline)) to the function doing the full type registration, it can’t be inline’d into the fast path allowing it to pass the stack-protector sniff test (and therefore, not incur the stack checking wrath).
The best part is that applications and libraries only need to be recompiled to get the speedup (due to macro expansion).
Not a bad experience diving into some compiler bits this week.