+2018-01-09 Georg-Johann Lay <avr@gjlay.de>
+
+ Don't save registers in main().
+
+ PR target/83737
+ * doc/invoke.texi (AVR Options) [-mmain-is-OS_task]: Document it.
+ * config/avr/avr.opt (-mmain-is-OS_task): New target option.
+ * config/avr/avr.c (avr_set_current_function): Don't error if
+ naked, OS_task or OS_main are specified at the same time.
+ (avr_function_ok_for_sibcall): Don't disable sibcalls for OS_task,
+ OS_main.
+ (avr_insert_attributes) [-mmain-is-OS_task] <main>: Add OS_task
+ attribute.
+ * common/config/avr/avr-common.c (avr_option_optimization_table):
+ Switch on -mmain-is-OS_task for optimizing compilations.
+
2018-01-09 Richard Biener <rguenther@suse.de>
PR tree-optimization/83572
static void
avr_set_current_function (tree decl)
{
- location_t loc;
- const char *isr;
-
if (decl == NULL_TREE
|| current_function_decl == NULL_TREE
|| current_function_decl == error_mark_node
|| cfun->machine->attributes_checked_p)
return;
- loc = DECL_SOURCE_LOCATION (decl);
+ location_t loc = DECL_SOURCE_LOCATION (decl);
cfun->machine->is_naked = avr_naked_function_p (decl);
cfun->machine->is_signal = avr_signal_function_p (decl);
cfun->machine->is_OS_main = avr_OS_main_function_p (decl);
cfun->machine->is_no_gccisr = avr_no_gccisr_function_p (decl);
- isr = cfun->machine->is_interrupt ? "interrupt" : "signal";
+ const char *isr = cfun->machine->is_interrupt ? "interrupt" : "signal";
/* Too much attributes make no sense as they request conflicting features. */
- if (cfun->machine->is_OS_task + cfun->machine->is_OS_main
- + (cfun->machine->is_signal || cfun->machine->is_interrupt) > 1)
- error_at (loc, "function attributes %qs, %qs and %qs are mutually"
- " exclusive", "OS_task", "OS_main", isr);
-
- /* 'naked' will hide effects of 'OS_task' and 'OS_main'. */
+ if (cfun->machine->is_OS_task
+ && (cfun->machine->is_signal || cfun->machine->is_interrupt))
+ error_at (loc, "function attributes %qs and %qs are mutually exclusive",
+ "OS_task", isr);
- if (cfun->machine->is_naked
- && (cfun->machine->is_OS_task || cfun->machine->is_OS_main))
- warning_at (loc, OPT_Wattributes, "function attributes %qs and %qs have"
- " no effect on %qs function", "OS_task", "OS_main", "naked");
+ if (cfun->machine->is_OS_main
+ && (cfun->machine->is_signal || cfun->machine->is_interrupt))
+ error_at (loc, "function attributes %qs and %qs are mutually exclusive",
+ "OS_main", isr);
if (cfun->machine->is_interrupt || cfun->machine->is_signal)
{
if (cfun->machine->is_interrupt
|| cfun->machine->is_signal
|| cfun->machine->is_naked
- || avr_naked_function_p (decl_callee)
- /* FIXME: For OS_task and OS_main, this might be over-conservative. */
- || (avr_OS_task_function_p (decl_callee)
- != cfun->machine->is_OS_task)
- || (avr_OS_main_function_p (decl_callee)
- != cfun->machine->is_OS_main))
+ || avr_naked_function_p (decl_callee))
{
return false;
}
}
-/* Add the section attribute if the variable is in progmem. */
+/* Implement `TARGET_INSERT_ATTRIBUTES'. */
static void
avr_insert_attributes (tree node, tree *attributes)
{
avr_pgm_check_var_decl (node);
+ if (TARGET_MAIN_IS_OS_TASK
+ && TREE_CODE (node) == FUNCTION_DECL
+ && MAIN_NAME_P (DECL_NAME (node))
+ // FIXME: We'd like to also test `flag_hosted' which is only
+ // available in the C-ish fronts, hence no such test for now.
+ // Instead, we test the return type of "main" which is not exactly
+ // the same but good enough.
+ && INTEGRAL_TYPE_P (TREE_TYPE (TREE_TYPE (node)))
+ && NULL == lookup_attribute ("OS_task", *attributes))
+ {
+ *attributes = tree_cons (get_identifier ("OS_task"),
+ NULL, *attributes);
+ }
+
+ /* Add the section attribute if the variable is in progmem. */
+
if (TREE_CODE (node) == VAR_DECL
&& (TREE_STATIC (node) || DECL_EXTERNAL (node))
&& avr_progmem_p (node, *attributes))
-mbranch-cost=@var{cost} @gol
-mcall-prologues -mgas-isr-prologues -mint8 @gol
-mn_flash=@var{size} -mno-interrupts @gol
--mrelax -mrmw -mstrict-X -mtiny-stack -mfract-convert-truncate @gol
+-mmain-is-OS_task -mrelax -mrmw -mstrict-X -mtiny-stack @gol
+-mfract-convert-truncate @gol
-mshort-calls -nodevicelib @gol
-Waddr-space-convert -Wmisspelled-isr}
conform to the C standards, but it results in smaller code
size.
+@item -mmain-is-OS_task
+@opindex mmain-is-OS_task
+Do not save registers in @code{main}. The effect is the same like
+attaching attribute @ref{AVR Function Attributes,,@code{OS_task}}
+to @code{main}. It is activated per default if optimization is on.
+
@item -mn-flash=@var{num}
@opindex mn-flash
Assume that the flash memory has a size of