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
This commit is contained in:
John David Anglin 2015-12-01 23:59:20 +00:00
parent b1b6836e90
commit 9a32d4374e
2 changed files with 16 additions and 4 deletions

View File

@ -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.

View File

@ -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