OSDN Git Service

Merge basic-improvements-branch to trunk
[pf3gnuchains/gcc-fork.git] / gcc / config / arm / arm.h
index 3b3e38a..186664c 100644 (file)
@@ -689,6 +689,8 @@ extern int arm_is_6_or_7;
 
 #define STACK_BOUNDARY  32
 
+#define PREFERRED_STACK_BOUNDARY (TARGET_ATPCS ? 64 : 32)
+
 #define FUNCTION_BOUNDARY  32
 
 /* The lowest bit is used to indicate Thumb-mode functions, so the
@@ -1436,6 +1438,8 @@ typedef struct machine_function GTY(())
   int arg_pointer_live;
   /* Records if the save of LR has been eliminated.  */
   int lr_save_eliminated;
+  /* The size of the stack frame.  Only valid after reload.  */
+  int frame_size;
   /* Records the type of the current function.  */
   unsigned long func_type;
   /* Record if the function has a variable argument list.  */
@@ -1483,6 +1487,14 @@ typedef struct
    && (NUM_ARG_REGS < ((CUM).nregs + ARM_NUM_REGS2 (MODE, TYPE)))      \
    ?   NUM_ARG_REGS - (CUM).nregs : 0)
 
+/* A C expression that indicates when an argument must be passed by
+   reference.  If nonzero for an argument, a copy of that argument is
+   made in memory and a pointer to the argument is passed instead of
+   the argument itself.  The pointer is passed in whatever way is
+   appropriate for passing a pointer to that type.  */
+#define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \
+  arm_function_arg_pass_by_reference (&CUM, MODE, TYPE, NAMED)
+
 /* Initialize a variable CUM of type CUMULATIVE_ARGS
    for a call to a function whose data type is FNTYPE.
    For a library call, FNTYPE is 0.
@@ -1500,13 +1512,11 @@ typedef struct
    On the ARM, r0-r3 are used to pass args.  */
 #define FUNCTION_ARG_REGNO_P(REGNO)    (IN_RANGE ((REGNO), 0, 3))
 
-\f
-/* Tail calling.  */
-
-/* A C expression that evaluates to true if it is ok to perform a sibling
-   call to DECL.  */
-#define FUNCTION_OK_FOR_SIBCALL(DECL) arm_function_ok_for_sibcall ((DECL))
+/* Implement `va_arg'.  */
+#define EXPAND_BUILTIN_VA_ARG(valist, type) \
+  arm_va_arg (valist, type)
 
+\f
 /* Perform any actions needed for a function that is receiving a variable
    number of arguments.  CUM is as above.  MODE and TYPE are the mode and type
    of the current parameter.  PRETEND_SIZE is a variable that should be set to
@@ -1679,7 +1689,7 @@ typedef struct
   if ((TO) == STACK_POINTER_REGNUM)                                    \
     {                                                                  \
       (OFFSET) += current_function_outgoing_args_size;                 \
-      (OFFSET) += ROUND_UP (get_frame_size ());                                \
+      (OFFSET) += thumb_get_frame_size ();                             \
      }                                                                 \
 }
 
@@ -2470,25 +2480,6 @@ extern int making_const_table;
 #undef  ASM_APP_OFF
 #define ASM_APP_OFF (TARGET_THUMB ? "\t.code\t16\n" : "")
 
-/* Output an internal label definition.  */
-#ifndef ASM_OUTPUT_INTERNAL_LABEL
-#define ASM_OUTPUT_INTERNAL_LABEL(STREAM, PREFIX, NUM)         \
-  do                                                           \
-    {                                                          \
-      char * s = (char *) alloca (40 + strlen (PREFIX));       \
-                                                               \
-      if (arm_ccfsm_state == 3 && arm_target_label == (NUM)    \
-         && !strcmp (PREFIX, "L"))                             \
-       {                                                       \
-         arm_ccfsm_state = 0;                                  \
-         arm_target_insn = NULL;                               \
-       }                                                       \
-      ASM_GENERATE_INTERNAL_LABEL (s, (PREFIX), (NUM));                \
-      ASM_OUTPUT_LABEL (STREAM, s);                            \
-    }                                                          \
-  while (0)
-#endif
-
 /* Output a push or a pop instruction (only used when profiling).  */
 #define ASM_OUTPUT_REG_PUSH(STREAM, REGNO)             \
   if (TARGET_ARM)                                      \
@@ -2513,7 +2504,7 @@ extern int making_const_table;
     {                                                          \
       if (TARGET_THUMB)                                                \
         ASM_OUTPUT_ALIGN (FILE, 2);                            \
-      ASM_OUTPUT_INTERNAL_LABEL (FILE, PREFIX, NUM);           \
+      (*targetm.asm_out.internal_label) (FILE, PREFIX, NUM);           \
     }                                                          \
   while (0)
 
@@ -2695,39 +2686,6 @@ extern int making_const_table;
   else                                         \
     THUMB_PRINT_OPERAND_ADDRESS (STREAM, X)
      
-/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
-   Used for C++ multiple inheritance.  */
-#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION)               \
-  do                                                                           \
-    {                                                                          \
-      int mi_delta = (DELTA);                                                  \
-      const char *const mi_op = mi_delta < 0 ? "sub" : "add";                  \
-      int shift = 0;                                                           \
-      int this_regno = (aggregate_value_p (TREE_TYPE (TREE_TYPE (FUNCTION)))   \
-                       ? 1 : 0);                                               \
-      if (mi_delta < 0)                                                                \
-        mi_delta = - mi_delta;                                                 \
-      while (mi_delta != 0)                                                    \
-        {                                                                      \
-          if ((mi_delta & (3 << shift)) == 0)                                  \
-           shift += 2;                                                         \
-          else                                                                 \
-           {                                                                   \
-             asm_fprintf (FILE, "\t%s\t%r, %r, #%d\n",                         \
-                          mi_op, this_regno, this_regno,                       \
-                          mi_delta & (0xff << shift));                         \
-             mi_delta &= ~(0xff << shift);                                     \
-             shift += 8;                                                       \
-           }                                                                   \
-        }                                                                      \
-      fputs ("\tb\t", FILE);                                                   \
-      assemble_name (FILE, XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0));           \
-      if (NEED_PLT_RELOC)                                                      \
-        fputs ("(PLT)", FILE);                                                 \
-      fputc ('\n', FILE);                                                      \
-    }                                                                          \
-  while (0)
-
 /* A C expression whose value is RTL representing the value of the return
    address for the frame COUNT steps up from the current frame.  */