Bug 54450 - Extended asm in global scope
Summary: Extended asm in global scope
Status: RESOLVED INVALID
Alias: None
Product: gcc
Classification: Unclassified
Component: inline-asm (show other bugs)
Version: 4.6.2
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2012-09-01 10:06 UTC by jnz
Modified: 2017-07-29 14:08 UTC (History)
1 user (show)

See Also:
Host: x86
Target: x86
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description jnz 2012-09-01 10:06:47 UTC
This code compiles fine:

    __asm__ (
        "my_function:\n\t"
        "jmp *%eax\n\t"
    );

but this doesn't:

    void *ptr;

    __asm__ (
        "my_function:\n\t"
        "jmp *%0\n\t" : : "r"(ptr)
    );

error: expected ')' before ':' token (on the jmp line)
Comment 1 jnz 2012-09-01 10:10:25 UTC
I'd be happy to use __attribute__((naked)) but it's not supported on x86 for some reason.
Comment 2 Marek Polacek 2012-09-01 10:59:21 UTC
Probably dup of http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41045
Comment 3 Marek Polacek 2012-09-01 11:10:10 UTC
Also, __attribute__((naked)) for x86 will never be implemented.
Comment 4 jnz 2012-09-01 12:43:52 UTC
> Also, __attribute__((naked)) for x86 will never be implemented.

May I ask why?
Comment 5 Marek Polacek 2012-09-01 13:15:46 UTC
(In reply to comment #4)
> May I ask why?

See e.g. http://gcc.gnu.org/ml/gcc/2004-02/msg00943.html
Comment 6 Eric Gallager 2017-07-28 14:34:59 UTC
(In reply to jnz from comment #1)
> I'd be happy to use __attribute__((naked)) but it's not supported on x86 for
> some reason.

That's bug 25967

(In reply to Marek Polacek from comment #2)
> Probably dup of http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41045

Agreed, closing as a duplicate of it

*** This bug has been marked as a duplicate of bug 41045 ***
Comment 7 Georg-Johann Lay 2017-07-29 12:35:42 UTC
(In reply to Eric Gallager from comment #6)
> (In reply to Marek Polacek from comment #2)
> > Probably dup of http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41045
> 
> Agreed, closing as a duplicate of it
> 
> *** This bug has been marked as a duplicate of bug 41045 ***

Really?

What the OP wants is

>> void *ptr;
>>
>>   __asm__ ("my_function:\n\t"
>>            "jmp *%0\n\t" : : "r"(ptr));

Constraint "r" cannot work at toplevel, hence this PR is invalid.

What PR41045 is about is top-level asm arguments that are compiler-time constants (constraint "n") and maybe also symbols (constraints "i" and "s").

So the initial request is only valid if the address of ptr was used (and &ptr is CONST_INT, CONST or SYMBOL_REF etc.):

void *ptr;

__asm__ ("my_function:\n\t"
         "jmp ??? %0" : : "i" (&ptr));
Comment 8 Eric Gallager 2017-07-29 14:08:47 UTC
(In reply to Georg-Johann Lay from comment #7)
> (In reply to Eric Gallager from comment #6)
> > (In reply to Marek Polacek from comment #2)
> > > Probably dup of http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41045
> > 
> > Agreed, closing as a duplicate of it
> > 
> > *** This bug has been marked as a duplicate of bug 41045 ***
> 
> Really?
> 
> What the OP wants is
> 
> >> void *ptr;
> >>
> >>   __asm__ ("my_function:\n\t"
> >>            "jmp *%0\n\t" : : "r"(ptr));
> 
> Constraint "r" cannot work at toplevel, hence this PR is invalid.
> 
> What PR41045 is about is top-level asm arguments that are compiler-time
> constants (constraint "n") and maybe also symbols (constraints "i" and "s").
> 
> So the initial request is only valid if the address of ptr was used (and
> &ptr is CONST_INT, CONST or SYMBOL_REF etc.):
> 
> void *ptr;
> 
> __asm__ ("my_function:\n\t"
>          "jmp ??? %0" : : "i" (&ptr));

Oh OK, changing to INVALID then.