aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKazu Hirata <kazu@cs.umass.edu>2003-01-03 16:44:55 +0000
committerKazu Hirata <kazu@gcc.gnu.org>2003-01-03 16:44:55 +0000
commite392d367936c4ccf9a8378f56bafd4c7af6d94dd (patch)
tree3ffd02fb5cbafc3c40d562c6600cc7497a8473c4
parentd3974db05a7a0f19df74c4b9938ad71810309837 (diff)
downloadgcc-e392d367936c4ccf9a8378f56bafd4c7af6d94dd.zip
gcc-e392d367936c4ccf9a8378f56bafd4c7af6d94dd.tar.gz
gcc-e392d367936c4ccf9a8378f56bafd4c7af6d94dd.tar.bz2
h8300-protos.h: Add a prototype for h8300_current_function_interrupt_function_p.
* config/h8300/h8300-protos.h: Add a prototype for h8300_current_function_interrupt_function_p. * config/h8300/h8300.c (interrupt_handler): Remove. (os_task): Likewise. (monitor): Likewise. (pragma_interrupt): New. (WORD_REG_USED): Use h8300_current_function_interrupt_function_p. (dosize): Likewise. (h8300_output_function_prologue): Likewise. Do not set interrupt_handler, os_task, monitor. (h8300_output_function_prologue): Use h8300_current_function_interrupt_function_p. Do not set interrupt_handler, os_task, monitor. (h8300_current_function_interrupt_function_p): New. (h8300_pr_interrupt): Set pragma_interrupt. (h8300_insert_attributes): Reset pragma_interrupt. From-SVN: r60836
-rw-r--r--gcc/ChangeLog20
-rw-r--r--gcc/config/h8300/h8300-protos.h1
-rw-r--r--gcc/config/h8300/h8300.c53
3 files changed, 44 insertions, 30 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c12f379..df4f2b1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,23 @@
+2003-01-03 Kazu Hirata <kazu@cs.umass.edu>
+
+ * config/h8300/h8300-protos.h: Add a prototype for
+ h8300_current_function_interrupt_function_p.
+ * config/h8300/h8300.c (interrupt_handler): Remove.
+ (os_task): Likewise.
+ (monitor): Likewise.
+ (pragma_interrupt): New.
+ (WORD_REG_USED): Use
+ h8300_current_function_interrupt_function_p.
+ (dosize): Likewise.
+ (h8300_output_function_prologue): Likewise.
+ Do not set interrupt_handler, os_task, monitor.
+ (h8300_output_function_prologue): Use
+ h8300_current_function_interrupt_function_p.
+ Do not set interrupt_handler, os_task, monitor.
+ (h8300_current_function_interrupt_function_p): New.
+ (h8300_pr_interrupt): Set pragma_interrupt.
+ (h8300_insert_attributes): Reset pragma_interrupt.
+
2003-01-03 Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>
* doc/install.texi (Configuration): Fix markup for reference to
diff --git a/gcc/config/h8300/h8300-protos.h b/gcc/config/h8300/h8300-protos.h
index 0aa2315..1ea1ab2 100644
--- a/gcc/config/h8300/h8300-protos.h
+++ b/gcc/config/h8300/h8300-protos.h
@@ -90,6 +90,7 @@ extern int h8300_tiny_data_p PARAMS ((tree));
#endif /* TREE_CODE */
extern void h8300_init_once PARAMS ((void));
+extern int h8300_current_function_interrupt_function_p PARAMS ((void));
extern void asm_file_start PARAMS ((FILE *));
extern void asm_file_end PARAMS ((FILE *));
extern int h8300_initial_elimination_offset PARAMS ((int, int));
diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c
index 7da1780..5e4063c 100644
--- a/gcc/config/h8300/h8300.c
+++ b/gcc/config/h8300/h8300.c
@@ -74,17 +74,8 @@ static const char *h8300_strip_name_encoding PARAMS ((const char *));
/* CPU_TYPE, says what cpu we're compiling for. */
int cpu_type;
-/* True if the current function is an interrupt handler
- (either via #pragma or an attribute specification). */
-static int interrupt_handler;
-
-/* True if the current function is an OS Task
- (via an attribute specification). */
-static int os_task;
-
-/* True if the current function is a monitor
- (via an attribute specification). */
-static int monitor;
+/* True if a #pragma interrupt has been seen for the current function. */
+static int pragma_interrupt;
/* True if a #pragma saveall has been seen for the current function. */
static int pragma_saveall;
@@ -383,10 +374,11 @@ byte_reg (x, b)
/* Save the frame pointer if it was used. */ \
|| (regno == FRAME_POINTER_REGNUM && regs_ever_live[regno]) \
/* Save any register used in an interrupt handler. */ \
- || (interrupt_handler && regs_ever_live[regno]) \
+ || (h8300_current_function_interrupt_function_p () \
+ && regs_ever_live[regno]) \
/* Save call clobbered registers in non-leaf interrupt \
handlers. */ \
- || (interrupt_handler \
+ || (h8300_current_function_interrupt_function_p () \
&& call_used_regs[regno] \
&& !current_function_is_leaf)))
@@ -408,7 +400,7 @@ dosize (file, sign, size)
subs since this shouldn't happen often. */
if ((TARGET_H8300 && size <= 4)
|| ((TARGET_H8300H || TARGET_H8300S) && size <= 8)
- || (TARGET_H8300 && interrupt_handler)
+ || (TARGET_H8300 && h8300_current_function_interrupt_function_p ())
|| (TARGET_H8300 && current_function_needs_context
&& sign < 0))
{
@@ -530,17 +522,11 @@ h8300_output_function_prologue (file, size)
int saved_regs;
int n_regs;
- /* Note a function with the interrupt attribute and set interrupt_handler
- accordingly. */
- if (h8300_interrupt_function_p (current_function_decl))
- interrupt_handler = 1;
-
/* If the current function has the OS_Task attribute set, then
we have a naked prologue. */
if (h8300_os_task_function_p (current_function_decl))
{
fprintf (file, ";OS_Task prologue\n");
- os_task = 1;
return;
}
@@ -550,8 +536,6 @@ h8300_output_function_prologue (file, size)
like interrupt functions, except the prologue must
mask interrupts. */
fprintf (file, ";monitor prologue\n");
- interrupt_handler = 1;
- monitor = 1;
if (TARGET_H8300)
{
fprintf (file, "\tsubs\t#2,sp\n");
@@ -657,7 +641,7 @@ h8300_output_function_epilogue (file, size)
int saved_regs;
int n_regs;
- if (os_task)
+ if (h8300_os_task_function_p (current_function_decl))
{
/* OS_Task epilogues are nearly naked -- they just have an
rts instruction. */
@@ -668,7 +652,7 @@ h8300_output_function_epilogue (file, size)
/* Monitor epilogues are the same as interrupt function epilogues.
Just make a note that we're in a monitor epilogue. */
- if (monitor)
+ if (h8300_monitor_function_p (current_function_decl))
fprintf (file, ";monitor epilogue\n");
/* If the last insn was a BARRIER, we don't have to write any code. */
@@ -733,18 +717,25 @@ h8300_output_function_epilogue (file, size)
if (frame_pointer_needed)
pop (file, FRAME_POINTER_REGNUM);
- if (interrupt_handler)
+ if (h8300_current_function_interrupt_function_p ())
fprintf (file, "\trte\n");
else
fprintf (file, "\trts\n");
out:
- interrupt_handler = 0;
- os_task = 0;
- monitor = 0;
pragma_saveall = 0;
}
+/* Return nonzero if the current function is an interrupt
+ function. */
+
+int
+h8300_current_function_interrupt_function_p ()
+{
+ return (h8300_interrupt_function_p (current_function_decl)
+ || h8300_monitor_function_p (current_function_decl));
+}
+
/* Output assembly code for the start of the file. */
void
@@ -1078,7 +1069,7 @@ void
h8300_pr_interrupt (pfile)
struct cpp_reader *pfile ATTRIBUTE_UNUSED;
{
- interrupt_handler = 1;
+ pragma_interrupt = 1;
}
void
@@ -3878,10 +3869,12 @@ h8300_insert_attributes (node, attributes)
tree node;
tree *attributes;
{
- if (!interrupt_handler
+ if (!pragma_interrupt
|| TREE_CODE (node) != FUNCTION_DECL)
return;
+ pragma_interrupt = 0;
+
/* Add an 'interrupt_handler' attribute. */
*attributes = tree_cons (get_identifier ("interrupt_handler"),
NULL, *attributes);