bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug gas/10269] New: IFUNC gas problem


From: jakub at redhat dot com
Subject: [Bug gas/10269] New: IFUNC gas problem
Date: 12 Jun 2009 16:16:00 -0000

#ifndef PICKNO
# define PICKNO 1
#endif
#if PICKNO == 2
# define PICK(fn1, fn2) #fn2
#else
# define PICK(fn1, fn2) #fn1
#endif
#ifdef __x86_64__
# define IFUNC_ASM(fn) "\tleaq " fn "(%rip), %rax\n\tretq\n"
#endif
#define IFUNC(name, globl, fn1, fn2) \
extern __typeof (fn1) fn1 __attribute__((used));\
extern __typeof (fn2) fn2 __attribute__((used));\
extern __typeof (fn1) name;\
asm (globl " " #name "\n"\
     "\t.type " #name ", @gnu_indirect_function\n"\
     #name ":\n"\
     IFUNC_ASM (PICK (fn1, fn2))\
     "\t.size " #name ", .-" #name "\n")
#define IFUNC_LOCAL(name, fn1, fn2) IFUNC(name, ".local", fn1, fn2)
#define IFUNC_GLOBAL(name, fn1, fn2) IFUNC(name, ".globl", fn1, fn2)

static int foo1 (void) { return 1; }
static int foo2 (void) { return 2; }

IFUNC_LOCAL (foo, foo1, foo2);

extern void abort (void);

int
main (void)
{
  if (foo () != PICKNO)
    abort ();
  return 0;
}

In this case IMHO gas should create R_*_IRELATIVE relocation against the local
foo symbol.  If foo is .globl or .globl and .hidden, it works correctly.

-- 
           Summary: IFUNC gas problem
           Product: binutils
           Version: unspecified
            Status: NEW
          Severity: normal
          Priority: P2
         Component: gas
        AssignedTo: unassigned at sources dot redhat dot com
        ReportedBy: jakub at redhat dot com
                CC: bug-binutils at gnu dot org


http://sourceware.org/bugzilla/show_bug.cgi?id=10269

------- You are receiving this mail because: -------
You are on the CC list for the bug, or are watching someone who is.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]