aboutsummaryrefslogtreecommitdiff
path: root/libgcc
diff options
context:
space:
mode:
authorJohn David Anglin <danglin@gcc.gnu.org>2015-12-01 23:59:20 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2015-12-01 23:59:20 +0000
commit9a32d4374e1791c9ff8efe90b595cd0803f6f295 (patch)
tree706f4b0ba69bdb4c7ebee8eaccf22b583bca9dc0 /libgcc
parentb1b6836e90ee5e3f103e6150a7713bef51d5790c (diff)
downloadgcc-9a32d4374e1791c9ff8efe90b595cd0803f6f295.zip
gcc-9a32d4374e1791c9ff8efe90b595cd0803f6f295.tar.gz
gcc-9a32d4374e1791c9ff8efe90b595cd0803f6f295.tar.bz2
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
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 dcd11a2..8143db2 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 e81dcab..1fb0a9f 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