OSDN Git Service

* Make-lang.in (stmp-f2c.h): Don't configure the runtime
[pf3gnuchains/gcc-fork.git] / gcc / function.c
index 582c4ca..644cc72 100644 (file)
@@ -191,10 +191,10 @@ CUMULATIVE_ARGS current_function_args_info;
 
 char *current_function_name;
 
-/* If non-zero, an RTL expression for that location at which the current
-   function returns its result.  Always equal to
-   DECL_RTL (DECL_RESULT (current_function_decl)), but provided
-   independently of the tree structures.  */
+/* If non-zero, an RTL expression for the location at which the current 
+   function returns its result.  If the current function returns its
+   result in a register, current_function_return_rtx will always be
+   the hard register containing the result.  */
 
 rtx current_function_return_rtx;
 
@@ -1330,7 +1330,7 @@ put_var_into_stack (decl)
 
   /* If this variable comes from an outer function,
      find that function's saved context.  */
-  if (context != current_function_decl)
+  if (context != current_function_decl && context != inline_function_decl)
     for (function = outer_function_chain; function; function = function->next)
       if (function->decl == context)
        break;
@@ -1381,6 +1381,15 @@ put_var_into_stack (decl)
       if (GET_CODE (XEXP (reg, 0)) == PLUS)
        XEXP (reg, 0) = copy_rtx (XEXP (reg, 0));
     }
+  else
+    return;
+  
+  if (flag_check_memory_usage)
+    emit_library_call (chkr_set_right_libfunc, 1, VOIDmode, 3,
+                      XEXP (reg, 0), ptr_mode,
+                      GEN_INT (GET_MODE_SIZE (GET_MODE (reg))),
+                      TYPE_MODE (sizetype),
+                      GEN_INT (MEMORY_USE_RW), QImode);
 }
 
 /* Subroutine of put_var_into_stack.  This puts a single pseudo reg REG
@@ -3686,6 +3695,18 @@ assign_parms (fndecl, second_time)
          else
            stack_parm = gen_rtx (MEM, nominal_mode,
                                  gen_rtx (PLUS, Pmode,
+             if (flag_check_memory_usage)
+               {
+                 push_to_sequence (conversion_insns);
+                 emit_library_call (chkr_set_right_libfunc, 1, VOIDmode, 3,
+                                    XEXP (stack_parm, 0), ptr_mode,
+                                    GEN_INT (int_size_in_bytes 
+                                             (TREE_TYPE (parm))),
+                                    TYPE_MODE (sizetype),
+                                    GEN_INT (MEMORY_USE_RW), QImode);
+                 conversion_insns = get_insns ();
+                 end_sequence ();
+               }
                                           internal_arg_pointer, offset_rtx));
 
          /* If this is a memory ref that contains aggregate components,
@@ -3906,6 +3927,12 @@ assign_parms (fndecl, second_time)
 
              store_expr (parm, copy, 0);
              emit_move_insn (parmreg, XEXP (copy, 0));
+             if (flag_check_memory_usage)
+               emit_library_call (chkr_set_right_libfunc, 1, VOIDmode, 3,
+                                  XEXP (copy, 0), ptr_mode,
+                                  GEN_INT (int_size_in_bytes (type)),
+                                  TYPE_MODE (sizetype),
+                                  GEN_INT (MEMORY_USE_RW), QImode);
              conversion_insns = get_insns ();
              did_conversion = 1;
              end_sequence ();
@@ -4055,7 +4082,19 @@ assign_parms (fndecl, second_time)
                emit_move_insn (validize_mem (stack_parm),
                                validize_mem (entry_parm));
            }
+         if (flag_check_memory_usage)
+           {
+             push_to_sequence (conversion_insns);
+             emit_library_call (chkr_set_right_libfunc, 1, VOIDmode, 3,
+                                XEXP (stack_parm, 0), ptr_mode,
+                                GEN_INT (GET_MODE_SIZE (GET_MODE 
+                                                        (entry_parm))),
+                                TYPE_MODE (sizetype),
+                                GEN_INT (MEMORY_USE_RW), QImode);
 
+             conversion_insns = get_insns ();
+             end_sequence ();
+           }
          DECL_RTL (parm) = stack_parm;
        }
       
@@ -4110,7 +4149,7 @@ assign_parms (fndecl, second_time)
     = (stack_args_size.var == 0 ? GEN_INT (-stack_args_size.constant)
        : expand_expr (size_binop (MINUS_EXPR, stack_args_size.var,     
                                  size_int (-stack_args_size.constant)),   
-                     NULL_RTX, VOIDmode, 0));
+                     NULL_RTX, VOIDmode, EXPAND_MEMORY_USE_BAD));
 #else
   current_function_arg_offset_rtx = ARGS_SIZE_RTX (stack_args_size);
 #endif
@@ -4632,7 +4671,8 @@ trampoline_address (function)
   /* Find the `struct function' for the function containing FUNCTION.  */
   fp = 0;
   fn_context = decl_function_context (function);
-  if (fn_context != current_function_decl)
+  if (fn_context != current_function_decl
+      && fn_context != inline_function_decl)
     for (fp = outer_function_chain; fp; fp = fp->next)
       if (fp->decl == fn_context)
        break;
@@ -5402,7 +5442,8 @@ expand_function_start (subr, parms_have_cleanups)
   /* Evaluate now the sizes of any types declared among the arguments.  */
   for (tem = nreverse (get_pending_sizes ()); tem; tem = TREE_CHAIN (tem))
     {
-      expand_expr (TREE_VALUE (tem), const0_rtx, VOIDmode, 0);
+      expand_expr (TREE_VALUE (tem), const0_rtx, VOIDmode,
+                  EXPAND_MEMORY_USE_BAD);
       /* Flush the queue in case this parameter declaration has
         side-effects.  */
       emit_queue ();
@@ -5651,6 +5692,11 @@ expand_function_end (filename, line, end_bindings)
       emit_move_insn (real_decl_result,
                      DECL_RTL (DECL_RESULT (current_function_decl)));
       emit_insn (gen_rtx (USE, VOIDmode, real_decl_result));
+
+      /* The delay slot scheduler assumes that current_function_return_rtx
+        holds the hard register containing the return value, not a temporary
+        pseudo.  */
+      current_function_return_rtx = real_decl_result;
     }
 
   /* If returning a structure, arrange to return the address of the value