Commit a77655b1 by Nick Clifton Committed by Nick Clifton

(arm_is_longcall_p): Update comment describing this funciton's behaviour.

  Return true when the current function has a section attribute and
  -mlong-calls is in effect.
(ARM_DECLARE_FUNCTION_SIZE): Do not set the short-call marker when
  -mlong-calls is in effect and the function has a section attribute.

From-SVN: r85796
parent 6f4a43e0
2004-08-11 Nick Clifton <nickc@redhat.com>
* config/arm/arm.c (arm_is_longcall_p): Update comment describing
this funciton's behaviour. Return true when the current function
has a section attribute and -mlong-calls is in effect.
* config/arm/arm.h (ARM_DECLARE_FUNCTION_SIZE): Do not set the
short-call marker when -mlong-calls is in effect and the function
has a section attribute.
2004-08-10 Zack Weinberg <zack@codesourcery.com> 2004-08-10 Zack Weinberg <zack@codesourcery.com>
* stmt.c (expand_return): If asked to return the RESULT_DECL, * stmt.c (expand_return): If asked to return the RESULT_DECL,
......
...@@ -2748,7 +2748,7 @@ current_file_function_operand (rtx sym_ref) ...@@ -2748,7 +2748,7 @@ current_file_function_operand (rtx sym_ref)
return 1; return 1;
/* The current function is always defined within the current compilation /* The current function is always defined within the current compilation
unit. if it s a weak definition however, then this may not be the real unit. If it s a weak definition however, then this may not be the real
definition of the function, and so we have to say no. */ definition of the function, and so we have to say no. */
if (sym_ref == XEXP (DECL_RTL (current_function_decl), 0) if (sym_ref == XEXP (DECL_RTL (current_function_decl), 0)
&& !DECL_WEAK (current_function_decl)) && !DECL_WEAK (current_function_decl))
...@@ -2764,16 +2764,19 @@ current_file_function_operand (rtx sym_ref) ...@@ -2764,16 +2764,19 @@ current_file_function_operand (rtx sym_ref)
a. has an __attribute__((long call)) a. has an __attribute__((long call))
or b. is within the scope of a #pragma long_calls or b. is within the scope of a #pragma long_calls
or c. the -mlong-calls command line switch has been specified or c. the -mlong-calls command line switch has been specified
. and either:
1. -ffunction-sections is in effect
or 2. the current function has __attribute__ ((section))
or 3. the target function has __attribute__ ((section))
However we do not generate a long call if the function: However we do not generate a long call if the function:
d. has an __attribute__ ((short_call)) d. has an __attribute__ ((short_call))
or e. is inside the scope of a #pragma no_long_calls or e. is inside the scope of a #pragma no_long_calls
or f. has an __attribute__ ((section)) or f. is defined within the current compilation unit.
or g. is defined within the current compilation unit.
This function will be called by C fragments contained in the machine This function will be called by C fragments contained in the machine
description file. CALL_REF and CALL_COOKIE correspond to the matched description file. SYM_REF and CALL_COOKIE correspond to the matched
rtl operands. CALL_SYMBOL is used to distinguish between rtl operands. CALL_SYMBOL is used to distinguish between
two different callers of the function. It is set to 1 in the two different callers of the function. It is set to 1 in the
"call_symbol" and "call_symbol_value" patterns and to 0 in the "call" "call_symbol" and "call_symbol_value" patterns and to 0 in the "call"
...@@ -2796,8 +2799,14 @@ arm_is_longcall_p (rtx sym_ref, int call_cookie, int call_symbol) ...@@ -2796,8 +2799,14 @@ arm_is_longcall_p (rtx sym_ref, int call_cookie, int call_symbol)
if (call_cookie & CALL_SHORT) if (call_cookie & CALL_SHORT)
return 0; return 0;
if (TARGET_LONG_CALLS && flag_function_sections) if (TARGET_LONG_CALLS)
{
if (flag_function_sections
|| DECL_SECTION_NAME (current_function_decl))
/* c.3 is handled by the defintion of the
ARM_DECLARE_FUNCTION_SIZE macro. */
return 1; return 1;
}
if (current_file_function_operand (sym_ref)) if (current_file_function_operand (sym_ref))
return 0; return 0;
......
...@@ -2064,7 +2064,13 @@ typedef struct ...@@ -2064,7 +2064,13 @@ typedef struct
#define ASM_OUTPUT_LABELREF(FILE, NAME) \ #define ASM_OUTPUT_LABELREF(FILE, NAME) \
arm_asm_output_labelref (FILE, NAME) arm_asm_output_labelref (FILE, NAME)
/* Set the short-call flag for any function compiled in the current
compilation unit. We skip this for functions with the section
attirubte when long-calls are in effect as this tells the compiler
that the section might be placed a long way from the caller.
See arm_is_longcall_p() for more information. */
#define ARM_DECLARE_FUNCTION_SIZE(STREAM, NAME, DECL) \ #define ARM_DECLARE_FUNCTION_SIZE(STREAM, NAME, DECL) \
if (!TARGET_LONG_CALLS || ! DECL_SECTION_NAME (DECL)) \
arm_encode_call_attribute (DECL, SHORT_CALL_FLAG_CHAR) arm_encode_call_attribute (DECL, SHORT_CALL_FLAG_CHAR)
/* The macros REG_OK_FOR..._P assume that the arg is a REG rtx /* The macros REG_OK_FOR..._P assume that the arg is a REG rtx
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment