handle interrupt_handler correctly
authorAldy Hernandez <aldyh@redhat.com>
Thu, 21 Jun 2001 19:37:35 +0000 (19:37 +0000)
committerAldy Hernandez <aldyh@gcc.gnu.org>
Thu, 21 Jun 2001 19:37:35 +0000 (19:37 +0000)
From-SVN: r43490

gcc/ChangeLog
gcc/config/sh/sh.c
gcc/config/sh/sh.h
gcc/config/sh/sh.md

index 6db8ee9..3b33ab6 100644 (file)
@@ -1,3 +1,15 @@
+2001-06-20  Aldy Hernandez  <aldyh@redhat.com>
+
+       * config/sh/sh.md (interrupt_function): Use
+       current_function_interrupt.
+       (define_delay): Schedule in delay slot if TARGET_SH3, even if it is
+       an interrupt function.
+
+       * config/sh/sh.h (current_function_interrupt): Define extern.
+
+       * config/sh/sh.c (current_function_interrupt): New global.
+       (sh_expand_prologue): Set current_function_interrupt.
+
 2001-06-21  Phil Edwards  <pme@sources.redhat.com>
 
        * doc/install.texi:  Add 'c' to list of --enable-languages choices.
index 30d890e..103a524 100644 (file)
@@ -43,6 +43,9 @@ int code_for_indirect_jump_scratch = CODE_FOR_indirect_jump_scratch;
 #define MSW (TARGET_LITTLE_ENDIAN ? 1 : 0)
 #define LSW (TARGET_LITTLE_ENDIAN ? 0 : 1)
 
+/* Set to 1 by expand_prologue() when the function is an interrupt handler.  */
+int current_function_interrupt;
+
 /* ??? The pragma interrupt support will not work for SH3.  */
 /* This is set by #pragma interrupt and #pragma trapa, and causes gcc to
    output code for the next function appropriate for an interrupt handler.  */
@@ -4009,6 +4012,11 @@ sh_expand_prologue ()
   int live_regs_mask2;
   int save_flags = target_flags;
 
+  current_function_interrupt
+    = lookup_attribute ("interrupt_handler",
+                       DECL_MACHINE_ATTRIBUTES (current_function_decl))
+    != NULL_TREE;
+
   /* We have pretend args if we had an object sent partially in registers
      and partially on the stack, e.g. a large structure.  */
   output_stack_adjust (-current_function_pretend_args_size,
index 4006427..2e9f76e 100644 (file)
@@ -2299,6 +2299,10 @@ extern enum mdep_reorg_phase_e mdep_reorg_phase;
 
 extern int pragma_interrupt;
 
+/* Set when processing a function with interrupt attribute.  */
+
+extern int current_function_interrupt;
+
 /* Set to an RTX containing the address of the stack to switch to
    for interrupt functions.  */
 extern struct rtx_def *sp_switch;
index d1cde71..eb3c88b 100644 (file)
              (const_string "yes")))
 
 (define_attr "interrupt_function" "no,yes"
-  (const (symbol_ref "pragma_interrupt")))
+  (const (symbol_ref "current_function_interrupt")))
 
 (define_attr "in_delay_slot" "yes,no"
   (cond [(eq_attr "type" "cbranch") (const_string "no")
        (ior (and (eq_attr "interrupt_function" "no")
                  (eq_attr "type" "!pload,prset"))
             (and (eq_attr "interrupt_function" "yes")
-                 (eq_attr "hit_stack" "no")))) (nil) (nil)])
+                 (ior
+                  (ne (symbol_ref "TARGET_SH3") (const_int 0))
+                  (eq_attr "hit_stack" "no"))))) (nil) (nil)])
 
 ;; Since a call implicitly uses the PR register, we can't allow
 ;; a PR register store in a jsr delay slot.