aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authordanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>2015-12-01 23:59:20 +0000
committerdanglin <danglin@138bc75d-0d04-0410-961f-82ee72b054a4>2015-12-01 23:59:20 +0000
commit2ec6287822e31ebccf30626f374b0f93bc0a551d (patch)
tree706f4b0ba69bdb4c7ebee8eaccf22b583bca9dc0 /libgcc
parent2c071d75e3264596a068640fffdc2d7cfb421d1f (diff)
* 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/ChangeLog6
-rw-r--r--libgcc/config/pa/fptr.c14
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