Commit 3a6dd06b by Claudiu Zissulescu Committed by Claudiu Zissulescu

[ARC] Fix legitimize pic address.

There are cases when an pic address gets complicated, and it needs to
be resolved via force_reg function found in
prepare_move_operands. When this happens, we need to disambiguate the
pic address and re-legitimize it.

gcc/
xxxx-xx-xx  Claudiu Zissulescu  <claziss@synopsys.com>

	* config/arc/arc.c (arc_legitimize_pic_address): Consider UNSPECs
	as well, if interesting recover the symbol and re-legitimize the
	pic address.

gcc/testsuite/
xxxx-xx-xx  Claudiu Zissulescu  <claziss@synopsys.com>

	* gcc.target/arc/pic-2.c: New file.

From-SVN: r278056
parent e22c2220
2019-11-11 Claudiu Zissulescu <claziss@gmail.com>
* config/arc/arc.c (arc_legitimize_pic_address): Consider UNSPECs
as well, if interesting recover the symbol and re-legitimize the
pic address.
2019-11-11 Martin Liska <mliska@suse.cz> 2019-11-11 Martin Liska <mliska@suse.cz>
* dbgcnt.def (DEBUG_COUNTER): Sort counters * dbgcnt.def (DEBUG_COUNTER): Sort counters
...@@ -6219,6 +6219,22 @@ arc_legitimize_pic_address (rtx addr) ...@@ -6219,6 +6219,22 @@ arc_legitimize_pic_address (rtx addr)
switch (GET_CODE (addr)) switch (GET_CODE (addr))
{ {
case UNSPEC:
/* Can be one or our GOT or GOTOFFPC unspecs. This situation
happens when an address is not a legitimate constant and we
need the resolve it via force_reg in
prepare_move_operands. */
switch (XINT (addr, 1))
{
case ARC_UNSPEC_GOT:
case ARC_UNSPEC_GOTOFFPC:
/* Recover the symbol ref. */
addr = XVECEXP (addr, 0, 0);
break;
default:
return addr;
}
/* Fall through. */
case SYMBOL_REF: case SYMBOL_REF:
/* TLS symbols are handled in different place. */ /* TLS symbols are handled in different place. */
if (SYMBOL_REF_TLS_MODEL (addr)) if (SYMBOL_REF_TLS_MODEL (addr))
......
2019-11-11 Claudiu Zissulescu <claziss@gmail.com>
* gcc.target/arc/pic-2.c: New file.
2019-11-11 Tobias Burnus <tobias@codesourcery.com> 2019-11-11 Tobias Burnus <tobias@codesourcery.com>
Mark Eggleston <mark.eggleston@codethink.com> Mark Eggleston <mark.eggleston@codethink.com>
......
/* { dg-do compile } */
/* { dg-skip-if "PIC not available for ARC6xx" { arc6xx } } */
/* { dg-options "-mno-sdata -O2 -fpic -fno-builtin" } */
/* Check if we resolve correctly complex PIC addresses. */
char *foo (unsigned size)
{
static char buf[32];
register int i;
if (size > 31)
size = 31;
for (i = 0; i < size; i++)
{
buf[i] = ' ';
}
buf[size] = '\0';
return buf;
}
/* { dg-final { scan-assembler "@buf.\[0-9\]\+@pcl-1" } } */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment