This patch executes avr_builtin_supported_p at a later time and in avr_resolve_overloaded_builtin. This allows for better diagnostics and avoids lto1 hiccups when a built-in decl is NULL_TREE.
Ok for trunk? Johann -- AVR: Diagnose unsupported built-ins in avr_resolve_overloaded_builtin. This patch executes avr_builtin_supported_p at a later time and in avr_resolve_overloaded_builtin. This allows for better diagnostics and avoids lto1 hiccups when a built-in decl is NULL_TREE. gcc/ * config/avr/avr-protos.h (avr_builtin_supported_p): Remove. * config/avr/avr.cc (avr_init_builtins): Don't initialize non-available built-ins with NULL_TREE. (avr_builtin_supported_p): Mote to... * config/avr/avr-c.cc: ...here. (avr_resolve_overloaded_builtin): Run avr_builtin_supported_p.
AVR: Diagnose unsupported built-ins in avr_resolve_overloaded_builtin. This patch executes avr_builtin_supported_p at a later time and in avr_resolve_overloaded_builtin. This allows for better diagnostics and avoids lto1 hiccups when a built-in decl is NULL_TREE. gcc/ * config/avr/avr-protos.h (avr_builtin_supported_p): Remove. * config/avr/avr.cc (avr_init_builtins): Don't initialize non-available built-ins with NULL_TREE. (avr_builtin_supported_p): Mote to... * config/avr/avr-c.cc: ...here. (avr_resolve_overloaded_builtin): Run avr_builtin_supported_p. diff --git a/gcc/config/avr/avr-c.cc b/gcc/config/avr/avr-c.cc index f4236555bf6..6f49d3f98a0 100644 --- a/gcc/config/avr/avr-c.cc +++ b/gcc/config/avr/avr-c.cc @@ -45,16 +45,52 @@ enum avr_builtin_id }; -/* Implement `TARGET_RESOLVE_OVERLOADED_PLUGIN'. */ +/* Some of our built-in functions are available for GNU-C only: + - Built-ins that use named address-spaces. + - Built-ins that use fixed-point types. */ + +static bool +avr_builtin_supported_p (location_t loc, avr_builtin_id bid) +{ + if (! lang_GNU_C () // Means "C" actually, not "GNU-C". + && bid >= AVR_FIRST_C_ONLY_BUILTIN_ID) + { + if (loc != UNKNOWN_LOCATION) + error_at (loc, "built-in function is only supported for GNU-C"); + return false; + } + + const bool uses_as = (bid == AVR_BUILTIN_FLASH_SEGMENT + || bid == AVR_BUILTIN_STRLEN_FLASH + || bid == AVR_BUILTIN_STRLEN_FLASHX + || bid == AVR_BUILTIN_STRLEN_MEMX); + if (AVR_TINY && uses_as) + { + if (loc != UNKNOWN_LOCATION) + error_at (loc, "built-in function for named address-space is not" + " supported for reduced Tiny devices"); + return false; + } + + return true; +} + + +/* Implement `TARGET_RESOLVE_OVERLOADED_BUILTIN'. */ static tree avr_resolve_overloaded_builtin (location_t loc, tree fndecl, void *vargs, bool) { + const avr_builtin_id bid = (avr_builtin_id) DECL_MD_FUNCTION_CODE (fndecl); + + if (! avr_builtin_supported_p (loc, bid)) + return error_mark_node; + tree type0, type1, fold = NULL_TREE; avr_builtin_id id = AVR_BUILTIN_COUNT; vec<tree, va_gc> &args = * (vec<tree, va_gc> *) vargs; - switch (DECL_MD_FUNCTION_CODE (fndecl)) + switch (bid) { default: break; @@ -499,8 +535,8 @@ avr_cpu_cpp_builtins (cpp_reader *pfile) /* Define builtin macros so that the user can easily query whether or not a specific builtin is available. */ -#define DEF_BUILTIN(NAME, N_ARGS, TYPE, CODE, LIBNAME, ATTRS) \ - if (avr_builtin_supported_p (AVR_BUILTIN_ ## NAME)) \ +#define DEF_BUILTIN(NAME, N_ARGS, TYPE, CODE, LIBNAME, ATTRS) \ + if (avr_builtin_supported_p (UNKNOWN_LOCATION, AVR_BUILTIN_ ## NAME)) \ cpp_define (pfile, "__BUILTIN_AVR_" #NAME); #include "builtins.def" #undef DEF_BUILTIN diff --git a/gcc/config/avr/avr-protos.h b/gcc/config/avr/avr-protos.h index 6f37c48143e..83137c7f6f6 100644 --- a/gcc/config/avr/avr-protos.h +++ b/gcc/config/avr/avr-protos.h @@ -21,7 +21,6 @@ extern bool avr_function_arg_regno_p (int r); extern void avr_cpu_cpp_builtins (cpp_reader * pfile); -extern bool avr_builtin_supported_p (unsigned id); extern enum reg_class avr_regno_reg_class (int r); extern void asm_globalize_label (FILE *file, const char *name); extern void avr_adjust_reg_alloc_order (void); diff --git a/gcc/config/avr/avr.cc b/gcc/config/avr/avr.cc index e358a2e8b8d..7acd260aace 100644 --- a/gcc/config/avr/avr.cc +++ b/gcc/config/avr/avr.cc @@ -15751,27 +15751,6 @@ avr_bdesc[AVR_BUILTIN_COUNT] = }; -/* Some of our built-in function are available for GNU-C only: - - Built-ins that use named address-spaces. - - Built-ins that use fixed-point types. */ - -bool -avr_builtin_supported_p (unsigned id) -{ - const bool uses_as = (id == AVR_BUILTIN_FLASH_SEGMENT - || id == AVR_BUILTIN_STRLEN_FLASH - || id == AVR_BUILTIN_STRLEN_FLASHX - || id == AVR_BUILTIN_STRLEN_MEMX); - - // We don't support address-spaces on Reduced Tiny. - if (AVR_TINY && uses_as) - return false; - - return (lang_GNU_C () - || id < AVR_FIRST_C_ONLY_BUILTIN_ID); -} - - /* Implement `TARGET_BUILTIN_DECL'. */ static tree @@ -15997,10 +15976,9 @@ avr_init_builtins (void) char *name = (char *) alloca (1 + strlen (Name)); \ \ gcc_assert (id < AVR_BUILTIN_COUNT); \ - avr_bdesc[id].fndecl = avr_builtin_supported_p (id) \ - ? add_builtin_function (avr_tolower (name, Name), TYPE, id, \ - BUILT_IN_MD, LIBNAME, ATTRS) \ - : NULL_TREE; \ + avr_bdesc[id].fndecl \ + = add_builtin_function (avr_tolower (name, Name), TYPE, id, \ + BUILT_IN_MD, LIBNAME, ATTRS); \ } #include "builtins.def" #undef DEF_BUILTIN