diff options
author | danglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-12-01 23:59:20 +0000 |
---|---|---|
committer | danglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4> | 2015-12-01 23:59:20 +0000 |
commit | 2ec6287822e31ebccf30626f374b0f93bc0a551d (patch) | |
tree | 706f4b0ba69bdb4c7ebee8eaccf22b583bca9dc0 /libgcc | |
parent | 2c071d75e3264596a068640fffdc2d7cfb421d1f (diff) | |
download | gcc-2ec6287822e31ebccf30626f374b0f93bc0a551d.tar.gz |
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@231135 138bc75d-0d04-0410-961f-82ee72b054a4
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 dcd11a23516..8143db2222e 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 e81dcabfee7..1fb0a9f14b2 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 |