This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: Symbol refs in inline asm
Amir Gonnen wrote:
> Hi.
>
> (GCC 4.2.2)
> I would like to emit addresses relative to symbols using inline asm.
> The following code:
> asm volatile("... %0":: "i" (&symbol));
> works well. However:
> asm volatile("... %0":: "i" (&symbol+1));
>
> fails with these errors:
> test.c:24: warning: asm operand 0 probably doesn't match constraints
> test.c:24: error: impossible constraint in 'asm'
>
> According to the documentations, the "i" constraint:
> "An immediate integer operand (one with constant value) is allowed. This
> includes symbolic constants whose values will be known only at assembly time
> or later."
> Doesn't it include an offset from a symbolic constant?
This really depends on the assembly language. It doesn't generally make
sense to emit the address of an object as an immediate, because that
object may be pc-relative, addressed via the GOT, etc, etc.
> I'd like to avoid constraints such as "g" because I need to guarantee a
> constant is emitted, never a register.
> Is there some way to do that?
I don't know exactly what you want, but I would have thought a memory
operand was more appropriate.
int NN[] = { 0, 1, 2 };
asm
(
"lea %1, %0\n"
: "=r" (val) : "m"(NN[1]));
on x86 generates
lea NN+4(%rip), %eax
Andrew.