+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.
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))
{
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
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;
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