From 552ecbd90053e7a1dc005d49d6b6ec472eec9304 Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Thu, 21 Jun 2001 19:37:35 +0000 Subject: [PATCH] handle interrupt_handler correctly From-SVN: r43490 --- gcc/ChangeLog | 12 ++++++++++++ gcc/config/sh/sh.c | 8 ++++++++ gcc/config/sh/sh.h | 4 ++++ gcc/config/sh/sh.md | 6 ++++-- 4 files changed, 28 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6db8ee93b60..3b33ab651ad 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2001-06-20 Aldy Hernandez + + * 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 * doc/install.texi: Add 'c' to list of --enable-languages choices. diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 30d890e8dca..103a52434d6 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -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, diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index 4006427c5af..2e9f76e1fee 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -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; diff --git a/gcc/config/sh/sh.md b/gcc/config/sh/sh.md index d1cde714753..eb3c88b0c61 100644 --- a/gcc/config/sh/sh.md +++ b/gcc/config/sh/sh.md @@ -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.