i386: Add "Ws" constraint for symbolic address/label reference [PR105576]
Printing the raw symbol is useful in inline asm (e.g. in C++ to get the mangled name). Similar constraints are available in other targets (e.g. "S" for aarch64/riscv, "Cs" for m68k). There isn't a good way for x86 yet, e.g. "i" doesn't work for PIC/-mcmodel=large. This patch adds "Ws". Here are possible use cases: ``` namespace ns { extern int var; } asm (".pushsection .xxx,\"aw\"; .dc.a %0; .popsection" :: "Ws"(&var)); asm (".reloc ., BFD_RELOC_NONE, %0" :: "Ws"(&var)); ``` gcc/ChangeLog: PR target/105576 * config/i386/constraints.md: Define constraint "Ws". * doc/md.texi: Document it. gcc/testsuite/ChangeLog: PR target/105576 * gcc.target/i386/asm-raw-symbol.c: New testcase.
This commit is contained in:
parent
f2061b2a96
commit
d725010038
3 changed files with 21 additions and 0 deletions
|
@ -348,6 +348,10 @@
|
|||
to double word size."
|
||||
(match_operand 0 "x86_64_dwzext_immediate_operand"))
|
||||
|
||||
(define_constraint "Ws"
|
||||
"A symbolic reference or label reference."
|
||||
(match_code "const,symbol_ref,label_ref"))
|
||||
|
||||
(define_constraint "Z"
|
||||
"32-bit unsigned integer constant, or a symbolic reference known
|
||||
to fit that range (for immediate operands in zero-extending x86-64
|
||||
|
|
|
@ -4275,6 +4275,10 @@ require non-@code{VOIDmode} immediate operands).
|
|||
128-bit integer constant where both the high and low 64-bit word
|
||||
satisfy the @code{e} constraint.
|
||||
|
||||
@item Ws
|
||||
A symbolic reference or label reference.
|
||||
You can use the @code{%p} modifier to print the raw symbol.
|
||||
|
||||
@item Z
|
||||
32-bit unsigned integer constant, or a symbolic reference known
|
||||
to fit that range (for immediate operands in zero-extending x86-64
|
||||
|
|
13
gcc/testsuite/gcc.target/i386/asm-raw-symbol.c
Normal file
13
gcc/testsuite/gcc.target/i386/asm-raw-symbol.c
Normal file
|
@ -0,0 +1,13 @@
|
|||
/* { dg-do compile } */
|
||||
|
||||
extern int var;
|
||||
|
||||
void
|
||||
func (void)
|
||||
{
|
||||
__asm__ ("@ %p0" : : "Ws" (func));
|
||||
__asm__ ("@ %p0" : : "Ws" (&var + 1));
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler "@ func" } } */
|
||||
/* { dg-final { scan-assembler "@ var\\+4" } } */
|
Loading…
Add table
Reference in a new issue