| Backport from upstream, see |
| https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68467 |
| |
| Signed-off-by: Waldemar Brodkorb <wbx@openadk.org> |
| |
| diff -Nur gcc-7.2.0.orig/gcc/config/m68k/m68k.c gcc-7.2.0/gcc/config/m68k/m68k.c |
| --- gcc-7.2.0.orig/gcc/config/m68k/m68k.c 2017-04-03 22:30:56.274463000 +0000 |
| +++ gcc-7.2.0/gcc/config/m68k/m68k.c 2018-01-27 02:16:53.779367849 +0000 |
| @@ -182,6 +182,8 @@ |
| const_tree, bool); |
| static bool m68k_cannot_force_const_mem (machine_mode mode, rtx x); |
| static bool m68k_output_addr_const_extra (FILE *, rtx); |
| +static machine_mode m68k_promote_function_mode (const_tree, machine_mode, |
| + int *, const_tree, int); |
| static void m68k_init_sync_libfuncs (void) ATTRIBUTE_UNUSED; |
| static enum flt_eval_method |
| m68k_excess_precision (enum excess_precision_type); |
| @@ -332,6 +334,9 @@ |
| #undef TARGET_ATOMIC_TEST_AND_SET_TRUEVAL |
| #define TARGET_ATOMIC_TEST_AND_SET_TRUEVAL 128 |
| |
| +#undef TARGET_PROMOTE_FUNCTION_MODE |
| +#define TARGET_PROMOTE_FUNCTION_MODE m68k_promote_function_mode |
| + |
| static const struct attribute_spec m68k_attribute_table[] = |
| { |
| /* { name, min_len, max_len, decl_req, type_req, fn_type_req, handler, |
| @@ -6571,4 +6576,20 @@ |
| return FLT_EVAL_METHOD_UNPREDICTABLE; |
| } |
| |
| +/* Implement TARGET_PROMOTE_FUNCTION_MODE. */ |
| + |
| +static machine_mode |
| +m68k_promote_function_mode (const_tree type, machine_mode mode, |
| + int *punsignedp ATTRIBUTE_UNUSED, |
| + const_tree fntype ATTRIBUTE_UNUSED, |
| + int for_return) |
| +{ |
| + /* Promote libcall arguments narrower than int to match the normal C |
| + ABI (for which promotions are handled via |
| + TARGET_PROMOTE_PROTOTYPES). */ |
| + if (type == NULL_TREE && !for_return && (mode == QImode || mode == HImode)) |
| + return SImode; |
| + return mode; |
| +} |
| + |
| #include "gt-m68k.h" |