diff options
author | Anatoly Sokolov <aesok@post.ru> | 2007-10-27 01:36:25 +0400 |
---|---|---|
committer | Anatoly Sokolov <aesok@gcc.gnu.org> | 2007-10-27 01:36:25 +0400 |
commit | 96ac4c9bbd9e0319d478aeb7fce1d8bc3cbb2468 (patch) | |
tree | d97d1d8998b8266fa3e10fc6f34bf606be6a396a | |
parent | bc4c8d897fcab7db06848835e6ba74e7a8aeee39 (diff) | |
download | gcc-96ac4c9bbd9e0319d478aeb7fce1d8bc3cbb2468.zip gcc-96ac4c9bbd9e0319d478aeb7fce1d8bc3cbb2468.tar.gz gcc-96ac4c9bbd9e0319d478aeb7fce1d8bc3cbb2468.tar.bz2 |
avr.c (avr_OS_task_function_p): Add new function.
* config/avr/avr.c (avr_OS_task_function_p): Add new function.
(avr_regs_to_save): Handle functions with 'OS_task' attribute.
(avr_simple_epilogue, expand_prologue, avr_asm_function_end_prologue,
expand_epilogue, output_movhi): Don't handle 'main' function.
(avr_attribute_table): Add 'OS_task' function attribute.
* config/avr/avr.h (machine_function): Remove 'is_main' field, add
'is_OS_task' field.
* config/avr/avr.md (return_from_main_epilogue): Remove insn.
(return_from_epilogue, return_from_interrupt_epilogue): Don't handle
'main' function.
* config/avr/avr.opt (minit-stack): Remove.
From-SVN: r129662
-rw-r--r-- | gcc/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/config/avr/avr.c | 52 | ||||
-rw-r--r-- | gcc/config/avr/avr.h | 7 | ||||
-rw-r--r-- | gcc/config/avr/avr.md | 16 | ||||
-rw-r--r-- | gcc/config/avr/avr.opt | 4 |
5 files changed, 40 insertions, 53 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3532284..7908347 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2007-10-26 Anatoly Sokolov <aesok@post.ru> + + * config/avr/avr.c (avr_OS_task_function_p): Add new function. + (avr_regs_to_save): Handle functions with 'OS_task' attribute. + (avr_simple_epilogue, expand_prologue, avr_asm_function_end_prologue, + expand_epilogue, output_movhi): Don't handle 'main' function. + (avr_attribute_table): Add 'OS_task' function attribute. + * config/avr/avr.h (machine_function): Remove 'is_main' field, add + 'is_OS_task' field. + * config/avr/avr.md (return_from_main_epilogue): Remove insn. + (return_from_epilogue, return_from_interrupt_epilogue): Don't handle + 'main' function. + * config/avr/avr.opt (minit-stack): Remove. + 2007-10-26 Eric Botcazou <ebotcazou@adacore.com> * tree-nested.c (get_trampoline_type): Fix thinko. diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index 7ffa4b5..46a71e0 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -51,6 +51,7 @@ static int avr_naked_function_p (tree); static int interrupt_function_p (tree); static int signal_function_p (tree); +static int avr_OS_task_function_p (tree); static int avr_regs_to_save (HARD_REG_SET *); static int sequent_regs_live (void); static const char *ptrreg_to_str (int); @@ -434,6 +435,19 @@ signal_function_p (tree func) return a != NULL_TREE; } +/* Return nonzero if FUNC is a OS_task function. */ + +static int +avr_OS_task_function_p (tree func) +{ + tree a; + + gcc_assert (TREE_CODE (func) == FUNCTION_DECL); + + a = lookup_attribute ("OS_task", TYPE_ATTRIBUTES (TREE_TYPE (func))); + return a != NULL_TREE; +} + /* Return the number of hard registers to push/pop in the prologue/epilogue of the current function, and optionally store these registers in SET. */ @@ -449,8 +463,10 @@ avr_regs_to_save (HARD_REG_SET *set) CLEAR_HARD_REG_SET (*set); count = 0; - /* No need to save any registers if the function never returns. */ - if (TREE_THIS_VOLATILE (current_function_decl)) + /* No need to save any registers if the function never returns or + is have "OS_task" attribute. */ + if (TREE_THIS_VOLATILE (current_function_decl) + || cfun->machine->is_OS_task) return 0; for (reg = 0; reg < 32; reg++) @@ -501,7 +517,6 @@ avr_simple_epilogue (void) && ! interrupt_function_p (current_function_decl) && ! signal_function_p (current_function_decl) && ! avr_naked_function_p (current_function_decl) - && ! MAIN_NAME_P (DECL_NAME (current_function_decl)) && ! TREE_THIS_VOLATILE (current_function_decl)); } @@ -572,10 +587,10 @@ expand_prologue (void) last_insn_address = 0; /* Init cfun->machine. */ - cfun->machine->is_main = MAIN_NAME_P (DECL_NAME (current_function_decl)); cfun->machine->is_naked = avr_naked_function_p (current_function_decl); cfun->machine->is_interrupt = interrupt_function_p (current_function_decl); cfun->machine->is_signal = signal_function_p (current_function_decl); + cfun->machine->is_OS_task = avr_OS_task_function_p (current_function_decl); /* Prologue: naked. */ if (cfun->machine->is_naked) @@ -619,18 +634,7 @@ expand_prologue (void) /* Prevent any attempt to delete the setting of ZERO_REG! */ emit_insn (gen_rtx_USE (VOIDmode, zero_reg_rtx)); } - if (cfun->machine->is_main) - { - char buffer[40]; - sprintf (buffer, "%s - %d", avr_init_stack, (int) size); - rtx sym = gen_rtx_SYMBOL_REF (HImode, ggc_strdup (buffer)); - /* Initialize stack pointer using frame pointer. */ - insn = emit_move_insn (frame_pointer_rtx, sym); - RTX_FRAME_RELATED_P (insn) = 1; - insn = emit_move_insn (stack_pointer_rtx, frame_pointer_rtx); - RTX_FRAME_RELATED_P (insn) = 1; - } - else if (minimize && (frame_pointer_needed || live_seq > 6)) + if (minimize && (frame_pointer_needed || live_seq > 6)) { insn = emit_move_insn (gen_rtx_REG (HImode, REG_X), gen_int_mode (size, HImode)); @@ -763,10 +767,6 @@ avr_asm_function_end_prologue (FILE *file) { fputs ("/* prologue: Signal */\n", file); } - else if (cfun->machine->is_main) - { - fputs ("/* prologue: main */\n", file); - } else fputs ("/* prologue: function */\n", file); } @@ -809,13 +809,7 @@ expand_epilogue (void) && !(cfun->machine->is_interrupt || cfun->machine->is_signal) && live_seq); - if (cfun->machine->is_main) - { - /* Return value from main() is already in the correct registers - (r25:r24) as the exit() argument. */ - emit_jump_insn (gen_return ()); - } - else if (minimize && (frame_pointer_needed || live_seq > 4)) + if (minimize && (frame_pointer_needed || live_seq > 4)) { if (frame_pointer_needed) { @@ -1637,9 +1631,6 @@ output_movhi (rtx insn, rtx operands[], int *l) or inside main or signal function prologue where they disabled. */ else if (TARGET_NO_INTERRUPTS || (reload_completed - && cfun->machine->is_main - && prologue_epilogue_contains (insn)) - || (reload_completed && cfun->machine->is_signal && prologue_epilogue_contains (insn))) { @@ -4566,6 +4557,7 @@ const struct attribute_spec avr_attribute_table[] = { "signal", 0, 0, true, false, false, avr_handle_fndecl_attribute }, { "interrupt", 0, 0, true, false, false, avr_handle_fndecl_attribute }, { "naked", 0, 0, false, true, true, avr_handle_fntype_attribute }, + { "OS_task", 0, 0, false, true, true, avr_handle_fntype_attribute }, { NULL, 0, 0, false, false, false, NULL } }; diff --git a/gcc/config/avr/avr.h b/gcc/config/avr/avr.h index 1bb72bb..5d2e30e 100644 --- a/gcc/config/avr/avr.h +++ b/gcc/config/avr/avr.h @@ -956,9 +956,6 @@ mmcu=*:-mmcu=%*}" This is added to the cfun structure. */ struct machine_function GTY(()) { - /* 'true' - if current function is a 'main' function. */ - int is_main; - /* 'true' - if current function is a naked function. */ int is_naked; @@ -969,4 +966,8 @@ struct machine_function GTY(()) /* 'true' - if current function is a signal function as specified by the "signal" attribute. */ int is_signal; + + /* 'true' - if current function is a signal function + as specified by the "OS_task" attribute. */ + int is_OS_task; }; diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md index cbb9cb7..f9c25003 100644 --- a/gcc/config/avr/avr.md +++ b/gcc/config/avr/avr.md @@ -2809,32 +2809,16 @@ [(return)] "(reload_completed && cfun->machine - && !cfun->machine->is_main && !(cfun->machine->is_interrupt || cfun->machine->is_signal) && !cfun->machine->is_naked)" "ret" [(set_attr "cc" "none") (set_attr "length" "1")]) -(define_insn "return_from_main_epilogue" - [(return)] - "(reload_completed - && cfun->machine - && cfun->machine->is_main - && !cfun->machine->is_naked)" - "%~jmp exit" - [(set_attr_alternative "length" - [(if_then_else (eq_attr "mcu_mega" "yes") - (const_int 2) - (const_int 1))]) - (set_attr "cc" "none") - ]) - (define_insn "return_from_interrupt_epilogue" [(return)] "(reload_completed && cfun->machine - && !cfun->machine->is_main && (cfun->machine->is_interrupt || cfun->machine->is_signal) && !cfun->machine->is_naked)" "reti" diff --git a/gcc/config/avr/avr.opt b/gcc/config/avr/avr.opt index ada4650..56d7db9 100644 --- a/gcc/config/avr/avr.opt +++ b/gcc/config/avr/avr.opt @@ -29,10 +29,6 @@ Target RejectNegative Joined Var(avr_mcu_name) Init("avr2") mdeb Target Report Undocumented Mask(ALL_DEBUG) -minit-stack= -Target RejectNegative Joined Var(avr_init_stack) Init("__stack") --minit-stack=STACK Use STACK as the initial value of the stack pointer - mint8 Target Report Mask(INT8) Use an 8-bit 'int' type |