From: John David Anglin Date: Wed, 2 Dec 2015 00:01:48 +0000 (+0000) Subject: fptr.c (__canonicalize_funcptr_for_compare): Initialize fixup values if saved GOT... X-Git-Tag: releases/gcc-4.9.4~479 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=446b28ae43a822c5b25842f051c8437badc95f74;p=thirdparty%2Fgcc.git 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: r231136 --- diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 7fab2d947d3d..ffa4548baf96 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,9 @@ +2015-12-01 John David Anglin + + * 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-10-19 Venkataramanan Kumar Backport from mainline diff --git a/libgcc/config/pa/fptr.c b/libgcc/config/pa/fptr.c index 347f636dd25d..18cf177830fe 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