diff options
author | John David Anglin <dave.anglin@nrc-cnrc.gc.ca> | 2012-01-28 18:48:11 +0000 |
---|---|---|
committer | John David Anglin <danglin@gcc.gnu.org> | 2012-01-28 18:48:11 +0000 |
commit | df8b5535762e1191ecaa5147ac58b1593303f3c9 (patch) | |
tree | 1c3072dfac6526fcddc905b0f90a27f2c68c4462 | |
parent | 3bfe6da98d7a070dcc5531b35dc74b12b5e602aa (diff) | |
download | gcc-df8b5535762e1191ecaa5147ac58b1593303f3c9.zip gcc-df8b5535762e1191ecaa5147ac58b1593303f3c9.tar.gz gcc-df8b5535762e1191ecaa5147ac58b1593303f3c9.tar.bz2 |
re PR target/51871 (FAIL: gcc.c-torture/execute/20010122-1.c execution)
PR target/51871
* config/pa/pa.c (pa_return_addr_rtx): Add support for PA2.0 export
stubs.
From-SVN: r183669
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/pa/pa.c | 31 |
2 files changed, 32 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4b8a211..4b1578c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2012-01-28 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> + + PR target/51871 + * config/pa/pa.c (pa_return_addr_rtx): Add support for PA2.0 export + stubs. + 2012-01-28 Sandra Loosemore <sandra@codesourcery.com> * doc/invoke.texi: Correct hyphenation of "floating point", diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 9b1a657..bcf64ce 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -4501,7 +4501,7 @@ pa_return_addr_rtx (int count, rtx frameaddr) rtx saved_rp; rtx ins; - /* Instruction stream at the normal return address for the export stub: + /* The instruction stream at the return address of a PA1.X export stub is: 0x4bc23fd1 | stub+8: ldw -18(sr0,sp),rp 0x004010a1 | stub+12: ldsid (sr0,rp),r1 @@ -4509,10 +4509,16 @@ pa_return_addr_rtx (int count, rtx frameaddr) 0xe0400002 | stub+20: be,n 0(sr0,rp) 0xe0400002 must be specified as -532676606 so that it won't be - rejected as an invalid immediate operand on 64-bit hosts. */ + rejected as an invalid immediate operand on 64-bit hosts. - HOST_WIDE_INT insns[4] = {0x4bc23fd1, 0x004010a1, 0x00011820, -532676606}; - int i; + The instruction stream at the return address of a PA2.0 export stub is: + + 0x4bc23fd1 | stub+8: ldw -18(sr0,sp),rp + 0xe840d002 | stub+12: bve,n (rp) + */ + + HOST_WIDE_INT insns[4]; + int i, len; if (count != 0) return NULL_RTX; @@ -4535,11 +4541,26 @@ pa_return_addr_rtx (int count, rtx frameaddr) ins = copy_to_reg (gen_rtx_AND (Pmode, rp, MASK_RETURN_ADDR)); label = gen_label_rtx (); + if (TARGET_PA_20) + { + insns[0] = 0x4bc23fd1; + insns[1] = -398405630; + len = 2; + } + else + { + insns[0] = 0x4bc23fd1; + insns[1] = 0x004010a1; + insns[2] = 0x00011820; + insns[3] = -532676606; + len = 4; + } + /* Check the instruction stream at the normal return address for the export stub. If it is an export stub, than our return address is really in -24[frameaddr]. */ - for (i = 0; i < 3; i++) + for (i = 0; i < len; i++) { rtx op0 = gen_rtx_MEM (SImode, plus_constant (ins, i * 4)); rtx op1 = GEN_INT (insns[i]); |