[committed] Reduce maximum PCREL17F branch offsets for PIC code

John David Anglin dave@hiauly1.hia.nrc.ca
Sun Jun 3 13:23:00 GMT 2012


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
-- 
J. David Anglin                                  dave.anglin@nrc-cnrc.gc.ca
National Research Council of Canada              (613) 990-0752 (FAX: 952-6602)

2012-06-03  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>

	* config/pa/pa.h (MAX_PCREL17F_OFFSET): Define.
	* config/pa/pa.c (pa_attr_length_millicode_call): Use
	MAX_PCREL17F_OFFSET instead of fixed offset.
	(pa_attr_length_call): Likewise.
	(pa_attr_length_indirect_call): Likewise.

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)



More information about the Gcc-patches mailing list