diff options
author | John David Anglin <danglin@gcc.gnu.org> | 2015-12-01 23:59:20 +0000 |
---|---|---|
committer | John David Anglin <danglin@gcc.gnu.org> | 2015-12-01 23:59:20 +0000 |
commit | 9a32d4374e1791c9ff8efe90b595cd0803f6f295 (patch) | |
tree | 706f4b0ba69bdb4c7ebee8eaccf22b583bca9dc0 /libgcc | |
parent | b1b6836e90ee5e3f103e6150a7713bef51d5790c (diff) | |
download | gcc-9a32d4374e1791c9ff8efe90b595cd0803f6f295.zip gcc-9a32d4374e1791c9ff8efe90b595cd0803f6f295.tar.gz gcc-9a32d4374e1791c9ff8efe90b595cd0803f6f295.tar.bz2 |
fptr.c (__canonicalize_funcptr_for_compare): Initialize fixup values if saved GOT address doesn't match runtime address.
* config/pa/fptr.c (__canonicalize_funcptr_for_compare): Initialize
fixup values if saved GOT address doesn't match runtime address.
(fixup_branch_offset): Reorder list.
From-SVN: r231135
Diffstat (limited to 'libgcc')
-rw-r--r-- | libgcc/ChangeLog | 6 | ||||
-rw-r--r-- | libgcc/config/pa/fptr.c | 14 |
2 files changed, 16 insertions, 4 deletions
diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index dcd11a2..8143db2 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,9 @@ +2015-12-01 John David Anglin <danglin@gcc.gnu.org> + + * config/pa/fptr.c (__canonicalize_funcptr_for_compare): Initialize + fixup values if saved GOT address doesn't match runtime address. + (fixup_branch_offset): Reorder list. + 2015-11-25 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> * Makefile.in (VTV_CFLAGS): New variable. diff --git a/libgcc/config/pa/fptr.c b/libgcc/config/pa/fptr.c index e81dcab..1fb0a9f 100644 --- a/libgcc/config/pa/fptr.c +++ b/libgcc/config/pa/fptr.c @@ -40,7 +40,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see the template should it be necessary to change the current branch position. */ #define NOFFSETS 2 -static int fixup_branch_offset[NOFFSETS] = { 32, -4 }; +static int fixup_branch_offset[NOFFSETS] = { -4, 32 }; #define GET_FIELD(X, FROM, TO) \ ((X) >> (31 - (TO)) & ((1 << ((TO) - (FROM) + 1)) - 1)) @@ -66,6 +66,7 @@ __canonicalize_funcptr_for_compare (fptr_t fptr) { static unsigned int fixup_plabel[2]; static fixup_t fixup; + static unsigned int *init_fixup; unsigned int *plabel, *got; /* -1 and page 0 are special. -1 is used in crtend to mark the end of @@ -88,9 +89,11 @@ __canonicalize_funcptr_for_compare (fptr_t fptr) return plabel[0]; /* Initialize our plabel for calling fixup if we haven't done so already. - This code needs to be thread safe but we don't have to be too careful - as the result is invariant. */ - if (!fixup) + We can't rely on static initialization so we check that any previous + initialization was done for the current got address. This code needs + to be thread safe but we don't have to be too careful as the result + is invariant. */ + if (init_fixup != got) { int i; unsigned int *iptr; @@ -121,6 +124,9 @@ __canonicalize_funcptr_for_compare (fptr_t fptr) fixup_plabel[0] = (unsigned int) iptr + 8; /* address of fixup */ fixup_plabel[1] = got[-1]; /* ltp for fixup */ fixup = (fixup_t) ((int) fixup_plabel | 3); + + /* Save address of the global offset table. */ + init_fixup = got; } /* Call fixup to resolve the function address. got[1] contains the |