(arm_is_longcall_p): Update comment describing this funciton's behaviour.
authorNick Clifton <nickc@redhat.com>
Wed, 11 Aug 2004 07:48:13 +0000 (07:48 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Wed, 11 Aug 2004 07:48:13 +0000 (07:48 +0000)
  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

gcc/ChangeLog
gcc/config/arm/arm.c
gcc/config/arm/arm.h

index b0c3d9c4ff81187bc38cef5962df93df391a108f..ecb489800f0c90ef44fc8ccb741eaee8310537aa 100644 (file)
@@ -1,3 +1,12 @@
+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>
 
        * stmt.c (expand_return): If asked to return the RESULT_DECL,
index 40b2fd45c652728b79910d07ed016733434cc199..5731a955b75682e110aa5a0d9ccad02f6c8ae4f9 100644 (file)
@@ -2748,7 +2748,7 @@ current_file_function_operand (rtx sym_ref)
     return 1;
 
   /* 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.  */
   if (sym_ref == XEXP (DECL_RTL (current_function_decl), 0)
       && !DECL_WEAK (current_function_decl))
@@ -2764,16 +2764,19 @@ current_file_function_operand (rtx sym_ref)
         a.  has an __attribute__((long call))
      or b.  is within the scope of a #pragma long_calls
      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:
    
         d.  has an __attribute__ ((short_call))
      or e.  is inside the scope of a #pragma no_long_calls
-     or f.  has an __attribute__ ((section))
-     or g.  is defined within the current compilation unit.
+     or f.  is defined within the current compilation unit.
    
    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
    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"
@@ -2796,9 +2799,15 @@ arm_is_longcall_p (rtx sym_ref, int call_cookie, int call_symbol)
   if (call_cookie & CALL_SHORT)
     return 0;
 
-  if (TARGET_LONG_CALLS && flag_function_sections)
-    return 1;
-  
+  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;
+    }
+
   if (current_file_function_operand (sym_ref))
     return 0;
   
index c3e82235c1682a83bc4314987325b699e0cc8cdd..9c759fbe86608c0257240e4b9c40949fde8dc702 100644 (file)
@@ -2064,8 +2064,14 @@ typedef struct
 #define 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)  \
-  arm_encode_call_attribute (DECL, SHORT_CALL_FLAG_CHAR)
+  if (!TARGET_LONG_CALLS || ! DECL_SECTION_NAME (DECL)) \
+    arm_encode_call_attribute (DECL, SHORT_CALL_FLAG_CHAR)
 
 /* The macros REG_OK_FOR..._P assume that the arg is a REG rtx
    and check its validity for a certain class.