blob: 41c90353bad1fd18511ce1ec3c816b4e97b0c917 [file] [log] [blame]
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