* [PATCH] [ARC] Use GOTOFFPC relocation for pc-relative accesses.
@ 2016-05-02 13:52 Claudiu Zissulescu
2016-05-12 11:27 ` Claudiu Zissulescu
2016-06-14 18:28 ` Joern Wolfgang Rennecke
0 siblings, 2 replies; 3+ messages in thread
From: Claudiu Zissulescu @ 2016-05-02 13:52 UTC (permalink / raw)
To: gcc-patches; +Cc: Claudiu.Zissulescu, gnu, Francois.Bedard, jeremy.bennett
This patch makes the pc-relative access to be more safe by using @pcl
syntax. This new syntax generates a pc-relative relocation which will
be handled by assembler.
OK to apply?
Claudiu
gcc/
2016-05-02 Claudiu Zissulescu <claziss@synopsys.com>
Joern Rennecke <joern.rennecke@embecosm.com>
* config/arc/arc.c (arc_print_operand_address): Handle pc-relative
addresses.
(arc_needs_pcl_p): Add GOTOFFPC.
(arc_legitimate_pic_addr_p): Likewise.
(arc_output_pic_addr_const): Likewise.
(arc_legitimize_pic_address): Generate a pc-relative address using
GOTOFFPC.
(arc_output_libcall): Use @pcl syntax.
(arc_delegitimize_address_0): Delegitimize ARC_UNSPEC_GOTOFFPC.
* config/arc/arc.md ("unspec"): Add ARC_UNSPEC_GOTOFFPC.
(*movsi_insn): Use @pcl syntax.
(doloop_begin_i): Likewise.
---
gcc/config/arc/arc.c | 53 ++++++++++++++++++++++++++++-----------------------
gcc/config/arc/arc.md | 6 ++++--
2 files changed, 33 insertions(+), 26 deletions(-)
diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
index 49edc0a..c0aa075 100644
--- a/gcc/config/arc/arc.c
+++ b/gcc/config/arc/arc.c
@@ -3528,7 +3528,8 @@ arc_print_operand_address (FILE *file , rtx addr)
|| XINT (c, 1) == UNSPEC_TLS_IE))
|| (GET_CODE (c) == PLUS
&& GET_CODE (XEXP (c, 0)) == UNSPEC
- && (XINT (XEXP (c, 0), 1) == UNSPEC_TLS_OFF)))
+ && (XINT (XEXP (c, 0), 1) == UNSPEC_TLS_OFF
+ || XINT (XEXP (c, 0), 1) == ARC_UNSPEC_GOTOFFPC)))
{
arc_output_pic_addr_const (file, c, 0);
break;
@@ -4636,6 +4637,7 @@ arc_needs_pcl_p (rtx x)
switch (XINT (x, 1))
{
case ARC_UNSPEC_GOT:
+ case ARC_UNSPEC_GOTOFFPC:
case UNSPEC_TLS_GD:
case UNSPEC_TLS_IE:
return true;
@@ -4698,9 +4700,10 @@ arc_legitimate_pic_addr_p (rtx addr)
|| XVECLEN (addr, 0) != 1)
return false;
- /* Must be one of @GOT, @GOTOFF, @tlsgd, tlsie. */
+ /* Must be one of @GOT, @GOTOFF, @GOTOFFPC, @tlsgd, tlsie. */
if (XINT (addr, 1) != ARC_UNSPEC_GOT
&& XINT (addr, 1) != ARC_UNSPEC_GOTOFF
+ && XINT (addr, 1) != ARC_UNSPEC_GOTOFFPC
&& XINT (addr, 1) != UNSPEC_TLS_GD
&& XINT (addr, 1) != UNSPEC_TLS_IE)
return false;
@@ -4917,26 +4920,15 @@ arc_legitimize_pic_address (rtx orig, rtx oldx)
else if (!flag_pic)
return orig;
else if (CONSTANT_POOL_ADDRESS_P (addr) || SYMBOL_REF_LOCAL_P (addr))
- {
- /* This symbol may be referenced via a displacement from the
- PIC base address (@GOTOFF). */
+ return gen_rtx_CONST (Pmode,
+ gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr),
+ ARC_UNSPEC_GOTOFFPC));
- /* FIXME: if we had a way to emit pc-relative adds that
- don't create a GOT entry, we could do without the use of
- the gp register. */
- crtl->uses_pic_offset_table = 1;
- pat = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), ARC_UNSPEC_GOTOFF);
- pat = gen_rtx_CONST (Pmode, pat);
- pat = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, pat);
- }
- else
- {
- /* This symbol must be referenced via a load from the
- Global Offset Table (@GOTPC). */
- pat = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), ARC_UNSPEC_GOT);
- pat = gen_rtx_CONST (Pmode, pat);
- pat = gen_const_mem (Pmode, pat);
- }
+ /* This symbol must be referenced via a load from the Global
+ Offset Table (@GOTPC). */
+ pat = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), ARC_UNSPEC_GOT);
+ pat = gen_rtx_CONST (Pmode, pat);
+ pat = gen_const_mem (Pmode, pat);
if (oldx == NULL)
oldx = gen_reg_rtx (Pmode);
@@ -4952,6 +4944,7 @@ arc_legitimize_pic_address (rtx orig, rtx oldx)
if (GET_CODE (addr) == UNSPEC)
{
/* Check that the unspec is one of the ones we generate? */
+ return orig;
}
else
gcc_assert (GET_CODE (addr) == PLUS);
@@ -5105,6 +5098,9 @@ arc_output_pic_addr_const (FILE * file, rtx x, int code)
case ARC_UNSPEC_GOTOFF:
suffix = "@gotoff";
break;
+ case ARC_UNSPEC_GOTOFFPC:
+ suffix = "@pcl", pcrel = true;
+ break;
case ARC_UNSPEC_PLT:
suffix = "@plt";
break;
@@ -5389,6 +5385,7 @@ arc_legitimate_constant_p (machine_mode mode, rtx x)
{
case ARC_UNSPEC_PLT:
case ARC_UNSPEC_GOTOFF:
+ case ARC_UNSPEC_GOTOFFPC:
case ARC_UNSPEC_GOT:
case UNSPEC_TLS_GD:
case UNSPEC_TLS_IE:
@@ -7648,7 +7645,7 @@ arc_output_libcall (const char *fname)
|| (TARGET_MEDIUM_CALLS && arc_ccfsm_cond_exec_p ()))
{
if (flag_pic)
- sprintf (buf, "add r12,pcl,@%s-(.&-4)\n\tjl%%!%%* [r12]", fname);
+ sprintf (buf, "add r12,pcl,@%s@pcl\n\tjl%%!%%* [r12]", fname);
else
sprintf (buf, "jl%%! @%s", fname);
}
@@ -8578,13 +8575,21 @@ arc_legitimize_address (rtx orig_x, rtx oldx, machine_mode mode)
static rtx
arc_delegitimize_address_0 (rtx x)
{
- rtx u, gp;
+ rtx u, gp, p;
if (GET_CODE (x) == CONST && GET_CODE (u = XEXP (x, 0)) == UNSPEC)
{
- if (XINT (u, 1) == ARC_UNSPEC_GOT)
+ if (XINT (u, 1) == ARC_UNSPEC_GOT
+ || XINT (u, 1) == ARC_UNSPEC_GOTOFFPC)
return XVECEXP (u, 0, 0);
}
+ else if (GET_CODE (x) == CONST && GET_CODE (p = XEXP (x, 0)) == PLUS
+ && GET_CODE (u = XEXP (p, 0)) == UNSPEC
+ && (XINT (u, 1) == ARC_UNSPEC_GOT
+ || XINT (u, 1) == ARC_UNSPEC_GOTOFFPC))
+ return gen_rtx_CONST
+ (GET_MODE (x),
+ gen_rtx_PLUS (GET_MODE (p), XVECEXP (u, 0, 0), XEXP (p, 1)));
else if (GET_CODE (x) == PLUS
&& ((REG_P (gp = XEXP (x, 0))
&& REGNO (gp) == PIC_OFFSET_TABLE_REGNUM)
diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md
index a4ee084..1102c53 100644
--- a/gcc/config/arc/arc.md
+++ b/gcc/config/arc/arc.md
@@ -102,6 +102,7 @@
;; UNSPEC_GOT 4 symbol to be rerenced through the GOT
;; UNSPEC_GOTOFF 5 Local symbol.To be referenced relative to the
;; GOTBASE.(Referenced as @GOTOFF)
+;; UNSPEC_GOTOFFPC 6 Local symbol. To be referenced pc-relative.
;; ----------------------------------------------------------------------------
(define_c_enum "unspec" [
@@ -111,6 +112,7 @@
ARC_UNSPEC_PLT
ARC_UNSPEC_GOT
ARC_UNSPEC_GOTOFF
+ ARC_UNSPEC_GOTOFFPC
UNSPEC_TLS_GD
UNSPEC_TLS_LD
UNSPEC_TLS_IE
@@ -725,7 +727,7 @@
* return INTVAL (operands[1]) & 0xffffff ? \"movbi.cl %0,%1 >> %p1,%p1,8;8\" : \"movbi.cl %0,%L1 >> 24,24,8;9\";
mov%? %0,%1 ;10
add %0,%S1 ;11
- * return arc_get_unalign () ? \"add %0,pcl,%1-.+2\" : \"add %0,pcl,%1-.\";
+ add %0,pcl,%1@pcl ;12
mov%? %0,%S1%& ;13
mov%? %0,%S1 ;14
ld%? %0,%1%& ;15
@@ -5155,7 +5157,7 @@
/* ??? Can do better for when a scratch register
is known. But that would require extra testing. */
arc_clear_unalign ();
- return ".p2align 2\;push_s r0\;add r0,pcl,24\;sr r0,[2]; LP_START\;add r0,pcl,.L__GCC__LP%1-.+2\;sr r0,[3]; LP_END\;pop_s r0";
+ return ".p2align 2\;push_s r0\;add r0,pcl,24\;sr r0,[2]; LP_START\;add r0,pcl,.L__GCC__LP%1@pcl\;sr r0,[3]; LP_END\;pop_s r0";
}
output_asm_insn ((size < 2048
? "lp .L__GCC__LP%1" : "sr .L__GCC__LP%1,[3]; LP_END"),
--
1.9.1
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] [ARC] Use GOTOFFPC relocation for pc-relative accesses.
2016-05-02 13:52 [PATCH] [ARC] Use GOTOFFPC relocation for pc-relative accesses Claudiu Zissulescu
@ 2016-05-12 11:27 ` Claudiu Zissulescu
2016-06-14 18:28 ` Joern Wolfgang Rennecke
1 sibling, 0 replies; 3+ messages in thread
From: Claudiu Zissulescu @ 2016-05-12 11:27 UTC (permalink / raw)
To: Claudiu Zissulescu, gcc-patches; +Cc: gnu, Francois.Bedard, jeremy.bennett
PING
On 02/05/16 15:50, Claudiu Zissulescu wrote:
> This patch makes the pc-relative access to be more safe by using @pcl
> syntax. This new syntax generates a pc-relative relocation which will
> be handled by assembler.
>
> OK to apply?
> Claudiu
>
> gcc/
> 2016-05-02 Claudiu Zissulescu <claziss@synopsys.com>
> Joern Rennecke <joern.rennecke@embecosm.com>
>
> * config/arc/arc.c (arc_print_operand_address): Handle pc-relative
> addresses.
> (arc_needs_pcl_p): Add GOTOFFPC.
> (arc_legitimate_pic_addr_p): Likewise.
> (arc_output_pic_addr_const): Likewise.
> (arc_legitimize_pic_address): Generate a pc-relative address using
> GOTOFFPC.
> (arc_output_libcall): Use @pcl syntax.
> (arc_delegitimize_address_0): Delegitimize ARC_UNSPEC_GOTOFFPC.
> * config/arc/arc.md ("unspec"): Add ARC_UNSPEC_GOTOFFPC.
> (*movsi_insn): Use @pcl syntax.
> (doloop_begin_i): Likewise.
> ---
> gcc/config/arc/arc.c | 53 ++++++++++++++++++++++++++++-----------------------
> gcc/config/arc/arc.md | 6 ++++--
> 2 files changed, 33 insertions(+), 26 deletions(-)
>
> diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
> index 49edc0a..c0aa075 100644
> --- a/gcc/config/arc/arc.c
> +++ b/gcc/config/arc/arc.c
> @@ -3528,7 +3528,8 @@ arc_print_operand_address (FILE *file , rtx addr)
> || XINT (c, 1) == UNSPEC_TLS_IE))
> || (GET_CODE (c) == PLUS
> && GET_CODE (XEXP (c, 0)) == UNSPEC
> - && (XINT (XEXP (c, 0), 1) == UNSPEC_TLS_OFF)))
> + && (XINT (XEXP (c, 0), 1) == UNSPEC_TLS_OFF
> + || XINT (XEXP (c, 0), 1) == ARC_UNSPEC_GOTOFFPC)))
> {
> arc_output_pic_addr_const (file, c, 0);
> break;
> @@ -4636,6 +4637,7 @@ arc_needs_pcl_p (rtx x)
> switch (XINT (x, 1))
> {
> case ARC_UNSPEC_GOT:
> + case ARC_UNSPEC_GOTOFFPC:
> case UNSPEC_TLS_GD:
> case UNSPEC_TLS_IE:
> return true;
> @@ -4698,9 +4700,10 @@ arc_legitimate_pic_addr_p (rtx addr)
> || XVECLEN (addr, 0) != 1)
> return false;
>
> - /* Must be one of @GOT, @GOTOFF, @tlsgd, tlsie. */
> + /* Must be one of @GOT, @GOTOFF, @GOTOFFPC, @tlsgd, tlsie. */
> if (XINT (addr, 1) != ARC_UNSPEC_GOT
> && XINT (addr, 1) != ARC_UNSPEC_GOTOFF
> + && XINT (addr, 1) != ARC_UNSPEC_GOTOFFPC
> && XINT (addr, 1) != UNSPEC_TLS_GD
> && XINT (addr, 1) != UNSPEC_TLS_IE)
> return false;
> @@ -4917,26 +4920,15 @@ arc_legitimize_pic_address (rtx orig, rtx oldx)
> else if (!flag_pic)
> return orig;
> else if (CONSTANT_POOL_ADDRESS_P (addr) || SYMBOL_REF_LOCAL_P (addr))
> - {
> - /* This symbol may be referenced via a displacement from the
> - PIC base address (@GOTOFF). */
> + return gen_rtx_CONST (Pmode,
> + gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr),
> + ARC_UNSPEC_GOTOFFPC));
>
> - /* FIXME: if we had a way to emit pc-relative adds that
> - don't create a GOT entry, we could do without the use of
> - the gp register. */
> - crtl->uses_pic_offset_table = 1;
> - pat = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), ARC_UNSPEC_GOTOFF);
> - pat = gen_rtx_CONST (Pmode, pat);
> - pat = gen_rtx_PLUS (Pmode, pic_offset_table_rtx, pat);
> - }
> - else
> - {
> - /* This symbol must be referenced via a load from the
> - Global Offset Table (@GOTPC). */
> - pat = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), ARC_UNSPEC_GOT);
> - pat = gen_rtx_CONST (Pmode, pat);
> - pat = gen_const_mem (Pmode, pat);
> - }
> + /* This symbol must be referenced via a load from the Global
> + Offset Table (@GOTPC). */
> + pat = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, addr), ARC_UNSPEC_GOT);
> + pat = gen_rtx_CONST (Pmode, pat);
> + pat = gen_const_mem (Pmode, pat);
>
> if (oldx == NULL)
> oldx = gen_reg_rtx (Pmode);
> @@ -4952,6 +4944,7 @@ arc_legitimize_pic_address (rtx orig, rtx oldx)
> if (GET_CODE (addr) == UNSPEC)
> {
> /* Check that the unspec is one of the ones we generate? */
> + return orig;
> }
> else
> gcc_assert (GET_CODE (addr) == PLUS);
> @@ -5105,6 +5098,9 @@ arc_output_pic_addr_const (FILE * file, rtx x, int code)
> case ARC_UNSPEC_GOTOFF:
> suffix = "@gotoff";
> break;
> + case ARC_UNSPEC_GOTOFFPC:
> + suffix = "@pcl", pcrel = true;
> + break;
> case ARC_UNSPEC_PLT:
> suffix = "@plt";
> break;
> @@ -5389,6 +5385,7 @@ arc_legitimate_constant_p (machine_mode mode, rtx x)
> {
> case ARC_UNSPEC_PLT:
> case ARC_UNSPEC_GOTOFF:
> + case ARC_UNSPEC_GOTOFFPC:
> case ARC_UNSPEC_GOT:
> case UNSPEC_TLS_GD:
> case UNSPEC_TLS_IE:
> @@ -7648,7 +7645,7 @@ arc_output_libcall (const char *fname)
> || (TARGET_MEDIUM_CALLS && arc_ccfsm_cond_exec_p ()))
> {
> if (flag_pic)
> - sprintf (buf, "add r12,pcl,@%s-(.&-4)\n\tjl%%!%%* [r12]", fname);
> + sprintf (buf, "add r12,pcl,@%s@pcl\n\tjl%%!%%* [r12]", fname);
> else
> sprintf (buf, "jl%%! @%s", fname);
> }
> @@ -8578,13 +8575,21 @@ arc_legitimize_address (rtx orig_x, rtx oldx, machine_mode mode)
> static rtx
> arc_delegitimize_address_0 (rtx x)
> {
> - rtx u, gp;
> + rtx u, gp, p;
>
> if (GET_CODE (x) == CONST && GET_CODE (u = XEXP (x, 0)) == UNSPEC)
> {
> - if (XINT (u, 1) == ARC_UNSPEC_GOT)
> + if (XINT (u, 1) == ARC_UNSPEC_GOT
> + || XINT (u, 1) == ARC_UNSPEC_GOTOFFPC)
> return XVECEXP (u, 0, 0);
> }
> + else if (GET_CODE (x) == CONST && GET_CODE (p = XEXP (x, 0)) == PLUS
> + && GET_CODE (u = XEXP (p, 0)) == UNSPEC
> + && (XINT (u, 1) == ARC_UNSPEC_GOT
> + || XINT (u, 1) == ARC_UNSPEC_GOTOFFPC))
> + return gen_rtx_CONST
> + (GET_MODE (x),
> + gen_rtx_PLUS (GET_MODE (p), XVECEXP (u, 0, 0), XEXP (p, 1)));
> else if (GET_CODE (x) == PLUS
> && ((REG_P (gp = XEXP (x, 0))
> && REGNO (gp) == PIC_OFFSET_TABLE_REGNUM)
> diff --git a/gcc/config/arc/arc.md b/gcc/config/arc/arc.md
> index a4ee084..1102c53 100644
> --- a/gcc/config/arc/arc.md
> +++ b/gcc/config/arc/arc.md
> @@ -102,6 +102,7 @@
> ;; UNSPEC_GOT 4 symbol to be rerenced through the GOT
> ;; UNSPEC_GOTOFF 5 Local symbol.To be referenced relative to the
> ;; GOTBASE.(Referenced as @GOTOFF)
> +;; UNSPEC_GOTOFFPC 6 Local symbol. To be referenced pc-relative.
> ;; ----------------------------------------------------------------------------
>
> (define_c_enum "unspec" [
> @@ -111,6 +112,7 @@
> ARC_UNSPEC_PLT
> ARC_UNSPEC_GOT
> ARC_UNSPEC_GOTOFF
> + ARC_UNSPEC_GOTOFFPC
> UNSPEC_TLS_GD
> UNSPEC_TLS_LD
> UNSPEC_TLS_IE
> @@ -725,7 +727,7 @@
> * return INTVAL (operands[1]) & 0xffffff ? \"movbi.cl %0,%1 >> %p1,%p1,8;8\" : \"movbi.cl %0,%L1 >> 24,24,8;9\";
> mov%? %0,%1 ;10
> add %0,%S1 ;11
> - * return arc_get_unalign () ? \"add %0,pcl,%1-.+2\" : \"add %0,pcl,%1-.\";
> + add %0,pcl,%1@pcl ;12
> mov%? %0,%S1%& ;13
> mov%? %0,%S1 ;14
> ld%? %0,%1%& ;15
> @@ -5155,7 +5157,7 @@
> /* ??? Can do better for when a scratch register
> is known. But that would require extra testing. */
> arc_clear_unalign ();
> - return ".p2align 2\;push_s r0\;add r0,pcl,24\;sr r0,[2]; LP_START\;add r0,pcl,.L__GCC__LP%1-.+2\;sr r0,[3]; LP_END\;pop_s r0";
> + return ".p2align 2\;push_s r0\;add r0,pcl,24\;sr r0,[2]; LP_START\;add r0,pcl,.L__GCC__LP%1@pcl\;sr r0,[3]; LP_END\;pop_s r0";
> }
> output_asm_insn ((size < 2048
> ? "lp .L__GCC__LP%1" : "sr .L__GCC__LP%1,[3]; LP_END"),
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] [ARC] Use GOTOFFPC relocation for pc-relative accesses.
2016-05-02 13:52 [PATCH] [ARC] Use GOTOFFPC relocation for pc-relative accesses Claudiu Zissulescu
2016-05-12 11:27 ` Claudiu Zissulescu
@ 2016-06-14 18:28 ` Joern Wolfgang Rennecke
1 sibling, 0 replies; 3+ messages in thread
From: Joern Wolfgang Rennecke @ 2016-06-14 18:28 UTC (permalink / raw)
To: Claudiu Zissulescu, gcc-patches; +Cc: Francois.Bedard, jeremy.bennett
On 02/05/16 14:50, Claudiu Zissulescu wrote:
> This patch makes the pc-relative access to be more safe by using @pcl
> syntax. This new syntax generates a pc-relative relocation which will
> be handled by assembler.
>
> OK to apply?
OK.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2016-06-14 18:28 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-02 13:52 [PATCH] [ARC] Use GOTOFFPC relocation for pc-relative accesses Claudiu Zissulescu
2016-05-12 11:27 ` Claudiu Zissulescu
2016-06-14 18:28 ` Joern Wolfgang Rennecke
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).