diff mbox

[committed] Reduce maximum PCREL17F branch offsets for PIC code

Message ID 20120603132318.GA14059@hiauly1.hia.nrc.ca
State New
Headers show

Commit Message

John David Anglin June 3, 2012, 1:23 p.m. UTC
Sometimes when generating PIC code, a call would exceed its maximum
branch offset and link would fail.  This occurs because PIC stubs are
larger than non PIC stubs.  Most recently this occurred building the
Debian kde4libs package.

This change adjusts the maximum branch offsets for PIC code so that
the maximum call density is the same as non PIC code.

Tested on hppa-unknown-linux-gnu, hppa2.0w-hp-hpux11.11 and
hppa64-hp-hpux11.11.

Committed to trunk.

Dave
diff mbox

Patch

Index: config/pa/pa.c
===================================================================
--- config/pa/pa.c	(revision 188142)
+++ config/pa/pa.c	(working copy)
@@ -7457,7 +7457,7 @@ 
     return 24;
   else
     {
-      if (!TARGET_LONG_CALLS && distance < 240000)
+      if (!TARGET_LONG_CALLS && distance < MAX_PCREL17F_OFFSET)
 	return 8;
 
       if (TARGET_LONG_ABS_CALL && !flag_pic)
@@ -7670,7 +7670,7 @@ 
   /* pc-relative branch.  */
   if (!TARGET_LONG_CALLS
       && ((TARGET_PA_20 && !sibcall && distance < 7600000)
-	  || distance < 240000))
+	  || distance < MAX_PCREL17F_OFFSET))
     length += 8;
 
   /* 64-bit plabel sequence.  */
@@ -8029,7 +8029,7 @@ 
   if (TARGET_FAST_INDIRECT_CALLS
       || (!TARGET_PORTABLE_RUNTIME
 	  && ((TARGET_PA_20 && !TARGET_SOM && distance < 7600000)
-	      || distance < 240000)))
+	      || distance < MAX_PCREL17F_OFFSET)))
     return 8;
 
   if (flag_pic)
Index: config/pa/pa.h
===================================================================
--- config/pa/pa.h	(revision 188142)
+++ config/pa/pa.h	(working copy)
@@ -1519,3 +1519,12 @@ 
 #undef TARGET_HAVE_TLS
 #define TARGET_HAVE_TLS true
 #endif
+
+/* The maximum offset in bytes for a PA 1.X pc-relative call to the
+   head of the preceding stub table.  The selected offsets have been
+   chosen so that approximately one call stub is allocated for every
+   86.7 instructions.  A long branch stub is two instructions when
+   not generating PIC code.  For HP-UX and ELF targets, PIC stubs are
+   seven and four instructions, respectively.  */  
+#define MAX_PCREL17F_OFFSET \
+  (flag_pic ? (TARGET_HPUX ? 198164 : 221312) : 240000)