pa.c (update_total_code_bytes): Use new macro IN_NAMED_SECTION_P.
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>
Fri, 8 Aug 2003 02:57:48 +0000 (02:57 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Fri, 8 Aug 2003 02:57:48 +0000 (02:57 +0000)
* pa.c (update_total_code_bytes): Use new macro IN_NAMED_SECTION_P.
(attr_length_millicode_call): Likewise.
(attr_length_call): Likewise.  Revise some maximum insn lengths.
(attr_length_indirect_call): Likewise.
(output_call): Fix thinko that added extra nop.
* pa.h (IN_NAMED_SECTION_P): Define.

From-SVN: r70241

gcc/ChangeLog
gcc/config/pa/pa.c
gcc/config/pa/pa.h

index 221d8df..3930c96 100644 (file)
@@ -1,5 +1,12 @@
 2003-08-07  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
+       * pa.c (update_total_code_bytes): Use new macro IN_NAMED_SECTION_P.
+       (attr_length_millicode_call): Likewise.
+       (attr_length_call): Likewise.  Revise some maximum insn lengths.
+       (attr_length_indirect_call): Likewise.
+       (output_call): Fix thinko that added extra nop.
+       * pa.h (IN_NAMED_SECTION_P): Define.
+
        PR c++/11712
        * pa-hpux.h, pa-hpux10.h, pa-hpux11.h (TARGET_OS_CPP_BUILTINS): Define
        __STDC_EXT__ when using C++ dialect.
index 9287583..acfe4e0 100644 (file)
@@ -3694,7 +3694,7 @@ update_total_code_bytes (nbytes)
      int nbytes;
 {
   if ((TARGET_PORTABLE_RUNTIME || !TARGET_GAS || !TARGET_SOM)
-      && in_text_section ())
+      && !IN_NAMED_SECTION_P (cfun->decl))
     {
       if (INSN_ADDRESSES_SET_P ())
        {
@@ -6571,7 +6571,7 @@ attr_length_millicode_call (insn)
      rtx insn;
 {
   unsigned long distance = -1;
-  unsigned long total = in_text_section () ? total_code_bytes : 0;
+  unsigned long total = IN_NAMED_SECTION_P (cfun->decl) ? 0 : total_code_bytes;
 
   if (INSN_ADDRESSES_SET_P ())
     {
@@ -6758,9 +6758,10 @@ output_millicode_call (insn, call_dest)
 
 /* Return the attribute length of the call instruction INSN.  The SIBCALL
    flag indicates whether INSN is a regular call or a sibling call.  The
-   length must match the code generated by output_call.  We include the delay
-   slot in the returned length as it is better to over estimate the length
-   than to under estimate it.  */
+   length returned must be longer than the code generated by output_call.
+   When the target supports jumps in the delay slot, we need an extra
+   four bytes to handle the situation where the jump can't reach its
+   destination.  */
 
 int
 attr_length_call (insn, sibcall)
@@ -6768,7 +6769,7 @@ attr_length_call (insn, sibcall)
      int sibcall;
 {
   unsigned long distance = -1;
-  unsigned long total = in_text_section ()? total_code_bytes : 0;
+  unsigned long total = IN_NAMED_SECTION_P (cfun->decl) ? 0 : total_code_bytes;
 
   if (INSN_ADDRESSES_SET_P ())
     {
@@ -6793,7 +6794,7 @@ attr_length_call (insn, sibcall)
        return 8;
 
       if (TARGET_LONG_ABS_CALL && !flag_pic)
-       return 12;
+       return 16;
 
       if ((TARGET_SOM && TARGET_LONG_PIC_SDIFF_CALL)
          || (TARGET_GAS && TARGET_LONG_PIC_PCREL_CALL))
@@ -6805,7 +6806,7 @@ attr_length_call (insn, sibcall)
        }
       else
        {
-         int length = 0;
+         int length = 28;
 
          if (TARGET_SOM)
            length += length_fp_args (insn);
@@ -6813,8 +6814,11 @@ attr_length_call (insn, sibcall)
          if (flag_pic)
            length += 4;
 
+         if (!sibcall)
+           length += 4;
+
          if (TARGET_PA_20)
-           return (length + 32);
+           return length;
 
          if (!TARGET_NO_SPACE_REGS)
            length += 8;
@@ -6822,7 +6826,7 @@ attr_length_call (insn, sibcall)
          if (!sibcall)
            length += 8;
 
-         return (length + 32);
+         return length;
        }
     }
 }
@@ -7077,7 +7081,7 @@ output_call (insn, call_dest, sibcall)
        }
     }
 
-  if (seq_length == 0 || (delay_insn_deleted && !delay_slot_filled))
+  if (!delay_slot_filled && (seq_length == 0 || delay_insn_deleted))
     output_asm_insn ("nop", xoperands);
 
   /* We are done if there isn't a jump in the delay slot.  */
@@ -7133,7 +7137,7 @@ attr_length_indirect_call (insn)
      rtx insn;
 {
   unsigned long distance = -1;
-  unsigned long total = in_text_section () ? total_code_bytes : 0;
+  unsigned long total = IN_NAMED_SECTION_P (cfun->decl) ? 0 : total_code_bytes;
 
   if (INSN_ADDRESSES_SET_P ())
     {
index 3f61074..5293c7c 100644 (file)
@@ -1515,6 +1515,11 @@ do {                                                                     \
 \f
 #define TARGET_ASM_SELECT_SECTION  pa_select_section
    
+/* Return a nonzero value if DECL has a section attribute.  */
+#define IN_NAMED_SECTION_P(DECL) \
+  ((TREE_CODE (DECL) == FUNCTION_DECL || TREE_CODE (DECL) == VAR_DECL) \
+   && DECL_SECTION_NAME (DECL) != NULL_TREE)
+
 /* Define this macro if references to a symbol must be treated
    differently depending on something about the variable or
    function named by the symbol (such as what section it is in).