aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/pa
diff options
context:
space:
mode:
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>2003-08-08 02:57:48 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2003-08-08 02:57:48 +0000
commit629106636a0b35fd8a3cd93a8c959ef445888064 (patch)
treed6e7f8e77c84ff946dd1a2fdcce555e0585406cd /gcc/config/pa
parentcb99b61ac974b2f396f3020feea24f124438376d (diff)
downloadgcc-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.c28
-rw-r--r--gcc/config/pa/pa.h5
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).