| From 5f54efe1e7d9604b45ddddd510ce439477d0e94f Mon Sep 17 00:00:00 2001 |
| From: Nagaraju <nmekala@xilinx.com> |
| Date: Thu, 9 Jan 2020 12:30:41 +0530 |
| Subject: [PATCH] [Patch, microblaze]: Fix Compiler crash with |
| -freg-struct-return This patch fixes a bug in MB GCC regarding the passing |
| struct values in registers. Currently we are only handling SImode With this |
| patch all other modes are handled properly |
| |
| Signed-off-by :Nagaraju Mekala <nmekala@xilix.com> |
| |
| --- |
| gcc/config/microblaze/microblaze.c | 11 ++++++++++- |
| gcc/config/microblaze/microblaze.h | 19 ------------------- |
| 2 files changed, 10 insertions(+), 20 deletions(-) |
| |
| diff --git a/gcc/config/microblaze/microblaze.c b/gcc/config/microblaze/microblaze.c |
| index 5c09452..beccd12 100644 |
| --- a/gcc/config/microblaze/microblaze.c |
| +++ b/gcc/config/microblaze/microblaze.c |
| @@ -4046,7 +4046,16 @@ microblaze_function_value (const_tree valtype, |
| const_tree func ATTRIBUTE_UNUSED, |
| bool outgoing ATTRIBUTE_UNUSED) |
| { |
| - return LIBCALL_VALUE (TYPE_MODE (valtype)); |
| + return gen_rtx_REG (TYPE_MODE (valtype), GP_RETURN); |
| +} |
| + |
| +#undef TARGET_LIBCALL_VALUE |
| +#define TARGET_LIBCALL_VALUE microblaze_libcall_value |
| + |
| +rtx |
| +microblaze_libcall_value (machine_mode mode, const_rtx fun ATTRIBUTE_UNUSED) |
| +{ |
| + return gen_rtx_REG (mode, GP_RETURN); |
| } |
| |
| /* Implement TARGET_SCHED_ADJUST_COST. */ |
| diff --git a/gcc/config/microblaze/microblaze.h b/gcc/config/microblaze/microblaze.h |
| index ab541f7..100e7b2 100644 |
| --- a/gcc/config/microblaze/microblaze.h |
| +++ b/gcc/config/microblaze/microblaze.h |
| @@ -266,13 +266,6 @@ extern enum pipeline_type microblaze_pipe; |
| |
| #define LOAD_EXTEND_OP(MODE) ZERO_EXTEND |
| |
| -#ifndef __arch64__ |
| -#define PROMOTE_MODE(MODE, UNSIGNEDP, TYPE) \ |
| - if (GET_MODE_CLASS (MODE) == MODE_INT \ |
| - && GET_MODE_SIZE (MODE) < 4) \ |
| - (MODE) = SImode; |
| -#endif |
| - |
| /* Standard register usage. */ |
| |
| /* On the MicroBlaze, we have 32 integer registers */ |
| @@ -471,18 +464,6 @@ extern struct microblaze_frame_info current_frame_info; |
| |
| #define MAX_ARGS_IN_REGISTERS MB_ABI_MAX_ARG_REGS |
| |
| -#ifdef __aarch64__ |
| -#define LIBCALL_VALUE(MODE) \ |
| - gen_rtx_REG (MODE,GP_RETURN) |
| -#else |
| -#define LIBCALL_VALUE(MODE) \ |
| - gen_rtx_REG ( \ |
| - ((GET_MODE_CLASS (MODE) != MODE_INT \ |
| - || GET_MODE_SIZE (MODE) >= 4) \ |
| - ? (MODE) \ |
| - : SImode), GP_RETURN) |
| -#endif |
| - |
| /* 1 if N is a possible register number for a function value. |
| On the MicroBlaze, R2 R3 are the only register thus used. |
| Currently, R2 are only implemented here (C has no complex type) */ |
| -- |
| 1.8.3.1 |
| |