Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/ext/attr-ifunc-1.C @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
/* { dg-do run } */ /* { dg-require-ifunc "" } */ /* { dg-options "-Wno-pmf-conversions" } */ struct Klass { int a[4]; int implementation (); int magic (); /* An ifunc resolver must return a pointer to an ordinary (non-member) function. To make it possible to use ifunc with member functions, the resolver must convert a member function pointer to an ordinary function pointer (slicing off the high word). */ typedef int Func (Klass*); static Func* resolver (); }; int Klass::implementation () { __builtin_printf ("'ere I am JH\n"); return a[0] + a[1] + a[2] + a[3]; } Klass::Func* Klass::resolver (void) { /* GCC guarantees this conversion to be safe and the resulting pointer usable to call the member function using ordinary (i.e., non-member) function call syntax. */ return reinterpret_cast<Func*>(&Klass::implementation); } int f (void) __attribute__ ((ifunc ("foo"))); typedef int (F)(void); extern "C" F* foo () { return 0; } int Klass::magic () __attribute__ ((ifunc ("_ZN5Klass8resolverEv"))); int main () { Klass obj; obj.a[0] = 1; obj.a[1] = 2; obj.a[2] = 3; obj.a[3] = 4; return !(obj.magic () == 10); }