handle interrupt_handler correctly

From-SVN: r43490
This commit is contained in:
Aldy Hernandez 2001-06-21 19:37:35 +00:00 committed by Aldy Hernandez
parent 5005dee96e
commit 552ecbd900
4 changed files with 28 additions and 2 deletions

View 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.

View 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,

View 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;

View File

@ -547,7 +547,7 @@
(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")
@ -577,7 +577,9 @@
(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.