This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Relocation avoidance for function pointers


It is possible to compute the difference between two labels and store the result in a variable. For PIC code, this can be used to avoid relocations in jump tables.

I try to do something similar for function pointers. (Function pointer arithmetic is a GCC extension.) However, GCC rejects that with “error: initializer element is not constant”. Is there any way around this? The required relocation should be the same (for static functions anyway).

Here's what I've got so far:

int f (void);

static int
g (void)
{
  static const int label_offset = &&a - &&b;
 a:
  f ();
 b:
  return label_offset;
}

static int
h (void)
{
  static const long function_offset = &f - &g;
  return function_offset;
}

int
g_wrapper (void)
{
  return g ();
}

int
h_wrapper (void)
{
  return h ();
}


Thanks,
Florian


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]