From: John David Anglin Date: Fri, 8 Aug 2003 02:57:48 +0000 (+0000) Subject: pa.c (update_total_code_bytes): Use new macro IN_NAMED_SECTION_P. X-Git-Tag: releases/gcc-3.4.0~4343 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=629106636a0b35fd8a3cd93a8c959ef445888064;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 221d8dfd6e0d..3930c96be26e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2003-08-07 John David Anglin + * 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. diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 9287583bd7dd..acfe4e0ff8d7 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 3f61074e6329..5293c7cbc219 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).