Commit f22e3c85 by Georg-Johann Lay

re PR target/56263 ([avr] Provide strict address-space checking)

	PR target/56263
	* config/avr/avr.c (TARGET_CONVERT_TO_TYPE): Define to...
	(avr_convert_to_type): ...this new static function.
	* config/avr/avr.opt (-Waddr-space-convert): New C option.
	* doc/invoke.texi (AVR Options): Document it.

From-SVN: r196611
parent dedd8ef1
...@@ -10765,6 +10765,66 @@ avr_addr_space_subset_p (addr_space_t subset ATTRIBUTE_UNUSED, ...@@ -10765,6 +10765,66 @@ avr_addr_space_subset_p (addr_space_t subset ATTRIBUTE_UNUSED,
} }
/* Implement `TARGET_CONVERT_TO_TYPE'. */
static tree
avr_convert_to_type (tree type, tree expr)
{
/* Print a diagnose for pointer conversion that changes the address
space of the pointer target to a non-enclosing address space,
provided -Waddr-space-convert is on.
FIXME: Filter out cases where the target object is known to
be located in the right memory, like in
(const __flash*) PSTR ("text")
Also try to distinguish between explicit casts requested by
the user and implicit casts like
void f (const __flash char*);
void g (const char *p)
{
f ((const __flash*) p);
}
under the assumption that an explicit casts means that the user
knows what he is doing, e.g. interface with PSTR or old style
code with progmem and pgm_read_xxx.
*/
if (avr_warn_addr_space_convert
&& expr != error_mark_node
&& POINTER_TYPE_P (type)
&& POINTER_TYPE_P (TREE_TYPE (expr)))
{
addr_space_t as_old = TYPE_ADDR_SPACE (TREE_TYPE (TREE_TYPE (expr)));
addr_space_t as_new = TYPE_ADDR_SPACE (TREE_TYPE (type));
if (avr_log.progmem)
avr_edump ("%?: type = %t\nexpr = %t\n\n", type, expr);
if (as_new != ADDR_SPACE_MEMX
&& as_new != as_old)
{
location_t loc = EXPR_LOCATION (expr);
const char *name_old = avr_addrspace[as_old].name;
const char *name_new = avr_addrspace[as_new].name;
warning (OPT_Waddr_space_convert,
"conversion from address space %qs to address space %qs",
ADDR_SPACE_GENERIC_P (as_old) ? "generic" : name_old,
ADDR_SPACE_GENERIC_P (as_new) ? "generic" : name_new);
return fold_build1_loc (loc, ADDR_SPACE_CONVERT_EXPR, type, expr);
}
}
return NULL_TREE;
}
/* Worker function for movmemhi expander. /* Worker function for movmemhi expander.
XOP[0] Destination as MEM:BLK XOP[0] Destination as MEM:BLK
XOP[1] Source " " XOP[1] Source " "
...@@ -12149,6 +12209,9 @@ avr_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *arg, ...@@ -12149,6 +12209,9 @@ avr_fold_builtin (tree fndecl, int n_args ATTRIBUTE_UNUSED, tree *arg,
#undef TARGET_FIXED_POINT_SUPPORTED_P #undef TARGET_FIXED_POINT_SUPPORTED_P
#define TARGET_FIXED_POINT_SUPPORTED_P hook_bool_void_true #define TARGET_FIXED_POINT_SUPPORTED_P hook_bool_void_true
#undef TARGET_CONVERT_TO_TYPE
#define TARGET_CONVERT_TO_TYPE avr_convert_to_type
#undef TARGET_ADDR_SPACE_SUBSET_P #undef TARGET_ADDR_SPACE_SUBSET_P
#define TARGET_ADDR_SPACE_SUBSET_P avr_addr_space_subset_p #define TARGET_ADDR_SPACE_SUBSET_P avr_addr_space_subset_p
......
...@@ -74,3 +74,7 @@ When accessing RAM, use X as imposed by the hardware, i.e. just use pre-decremen ...@@ -74,3 +74,7 @@ When accessing RAM, use X as imposed by the hardware, i.e. just use pre-decremen
msp8 msp8
Target Report RejectNegative Var(avr_sp8) Init(0) Target Report RejectNegative Var(avr_sp8) Init(0)
The device has no SPH special function register. This option will be overridden by the compiler driver with the correct setting if presence/absence of SPH can be deduced from -mmcu=MCU. The device has no SPH special function register. This option will be overridden by the compiler driver with the correct setting if presence/absence of SPH can be deduced from -mmcu=MCU.
Waddr-space-convert
Warning C Report Var(avr_warn_addr_space_convert) Init(0)
Warn if the address space of an address is change.
...@@ -514,7 +514,7 @@ Objective-C and Objective-C++ Dialects}. ...@@ -514,7 +514,7 @@ Objective-C and Objective-C++ Dialects}.
@emph{AVR Options} @emph{AVR Options}
@gccoptlist{-mmcu=@var{mcu} -maccumulate-args -mbranch-cost=@var{cost} @gol @gccoptlist{-mmcu=@var{mcu} -maccumulate-args -mbranch-cost=@var{cost} @gol
-mcall-prologues -mint8 -mno-interrupts -mrelax @gol -mcall-prologues -mint8 -mno-interrupts -mrelax @gol
-mstrict-X -mtiny-stack} -mstrict-X -mtiny-stack -Waddr-space-convert}
@emph{Blackfin Options} @emph{Blackfin Options}
@gccoptlist{-mcpu=@var{cpu}@r{[}-@var{sirevision}@r{]} @gol @gccoptlist{-mcpu=@var{cpu}@r{[}-@var{sirevision}@r{]} @gol
...@@ -11649,6 +11649,11 @@ when @code{EICALL} or @code{EIJMP} instructions are used. ...@@ -11649,6 +11649,11 @@ when @code{EICALL} or @code{EIJMP} instructions are used.
Indirect jumps and calls on these devices are handled as follows by Indirect jumps and calls on these devices are handled as follows by
the compiler and are subject to some limitations: the compiler and are subject to some limitations:
@item -Waddr-space-convert
@opindex Waddr-space-convert
Warn about conversions between address spaces in the case where the
resulting address space is not contained in the incoming address space.
@itemize @bullet @itemize @bullet
@item @item
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment