From: John David Anglin Date: Tue, 1 Dec 2015 23:59:20 +0000 (+0000) Subject: fptr.c (__canonicalize_funcptr_for_compare): Initialize fixup values if saved GOT... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=9a32d4374e1791c9ff8efe90b595cd0803f6f295;p=gcc.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: r231135 --- 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 + + * 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 * 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