This is the mail archive of the gcc-patches@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]

Re: PATCH: Add ifunc attribute


On Wed, Jun 24, 2009 at 8:20 AM, Richard
Guenther<richard.guenther@gmail.com> wrote:
> On Wed, Jun 24, 2009 at 5:19 PM, H.J. Lu<hjl.tools@gmail.com> wrote:
>> On Wed, Jun 24, 2009 at 8:09 AM, Richard
>> Guenther<richard.guenther@gmail.com> wrote:
>>> On Wed, Jun 24, 2009 at 4:54 PM, Richard Henderson<rth@twiddle.net> wrote:
>>>> On 06/24/2009 03:22 AM, Paolo Bonzini wrote:
>>>>>
>>>>> Looks a bit too like DWIM and too little like a specification. I think I
>>>>> prefer option 1, in some cases you may want to call the trampoline and
>>>>> having it accessible can help. With
>>>>>
>>>>> __typeof (foo) *
>>>>> __attribute__ ((ifunc ("foo")))
>>>>> foo_ifunc (void)
>>>>> {
>>>>> <return address of foo_{1,2,3}>
>>>>> }
>>>>>
>>>>> you could call foo_ifunc if you wish in principle, and the header file
>>>>> only has the prototype of foo as expected.
>>>>
>>>> I think I have to agree with you, Paolo. ?This example is the sort of
>>>> thing I'd expect to actually be writing.
>>>
>>> You wouldn't call foo_ifunc but maybe one of foo_{1,2,3} directly. ?At
>>> least for non-trivial foo_ifunc implementations.
>>>
>>> I still fail to see why we need the ifunc argument here though.
>>>
>>> __typeof (foo) *
>>> __attribute__((ifunc))
>>> foo_ifunc (void) asm("foo")
>>> {
>>> ?<return address of foo_{1,2,3}>
>>> }
>>>
>>> works for me. ?Adding __attribute__((alias("foo_ifunc"))) should
>>> make an alias available that you could call directly if you really
>>> want to.
>>>
>>
>> Is asm("foo") required for ifunc function?
>
> No. ?You can as well, if you don't have a conflicting declaration,
> just write
>
> void *
> __attribute__((ifunc))
> foo (void)
> {
> ?<return address of foo_{1,2,3}>
> }
>
> the asm() was just to allow the header to be visible.
>

Option 3:

static int
foo1 (int x)
{
  return x;
}

int
__attribute__ ((ifunc))
foo (int)
{
  return foo1;
}

int
bar (int i)
{
  return foo (i);
}

supports C++ since we use the same prototype for ifunc function.
The mangled name is the same.


-- 
H.J.


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