diff options
author | John David Anglin <dave.anglin@nrc-cnrc.gc.ca> | 2003-08-08 02:57:48 +0000 |
---|---|---|
committer | John David Anglin <danglin@gcc.gnu.org> | 2003-08-08 02:57:48 +0000 |
commit | 629106636a0b35fd8a3cd93a8c959ef445888064 (patch) | |
tree | d6e7f8e77c84ff946dd1a2fdcce555e0585406cd /gcc/config/pa | |
parent | cb99b61ac974b2f396f3020feea24f124438376d (diff) | |
download | gcc-629106636a0b35fd8a3cd93a8c959ef445888064.zip gcc-629106636a0b35fd8a3cd93a8c959ef445888064.tar.gz gcc-629106636a0b35fd8a3cd93a8c959ef445888064.tar.bz2 |
pa.c (update_total_code_bytes): Use new macro IN_NAMED_SECTION_P.
* 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
Diffstat (limited to 'gcc/config/pa')
-rw-r--r-- | gcc/config/pa/pa.c | 28 | ||||
-rw-r--r-- | gcc/config/pa/pa.h | 5 |
2 files changed, 21 insertions, 12 deletions
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 9287583..acfe4e0 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -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 ()) { diff --git a/gcc/config/pa/pa.h b/gcc/config/pa/pa.h index 3f61074e..5293c7c 100644 --- a/gcc/config/pa/pa.h +++ b/gcc/config/pa/pa.h @@ -1515,6 +1515,11 @@ do { \ #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). |