aboutsummaryrefslogtreecommitdiffstats
path: root/meta-xilinx-bsp/recipes-microblaze/gcc/gcc-7/0029-Fix-bug-in-MB-version-calculation.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-xilinx-bsp/recipes-microblaze/gcc/gcc-7/0029-Fix-bug-in-MB-version-calculation.patch')
-rw-r--r--meta-xilinx-bsp/recipes-microblaze/gcc/gcc-7/0029-Fix-bug-in-MB-version-calculation.patch250
1 files changed, 250 insertions, 0 deletions
diff --git a/meta-xilinx-bsp/recipes-microblaze/gcc/gcc-7/0029-Fix-bug-in-MB-version-calculation.patch b/meta-xilinx-bsp/recipes-microblaze/gcc/gcc-7/0029-Fix-bug-in-MB-version-calculation.patch
new file mode 100644
index 00000000..c3e4bc9e
--- /dev/null
+++ b/meta-xilinx-bsp/recipes-microblaze/gcc/gcc-7/0029-Fix-bug-in-MB-version-calculation.patch
@@ -0,0 +1,250 @@
+From 3eada9d81437d378ef24f11a8bd046fee5b3505a Mon Sep 17 00:00:00 2001
+From: Mahesh Bodapati <mbodapat@xilinx.com>
+Date: Sat, 26 Aug 2017 19:21:49 -0700
+Subject: [PATCH] Fix bug in MB version calculation
+
+This patch fixes the bug in microblaze_version_to_int function. Earlier
+the conversion of vXX.YY.Z to int has a bug which is fixed now.
+
+Signed-off-by: Mahesh Bodapati <mbodapat@xilinx.com>
+Signed-off-by: Nagaraju Mekala <nagaraju.mekala@xilinx.com>
+Signed-off-by: Manjukumar Matha <manjukumar.harthikote-matha@xilinx.com>
+Upstream-Status: Pending
+---
+ gcc/config/microblaze/microblaze.c | 147 ++++++++++++++++++-------------------
+ 1 file changed, 70 insertions(+), 77 deletions(-)
+
+diff --git a/gcc/config/microblaze/microblaze.c b/gcc/config/microblaze/microblaze.c
+index 2ed64971fb..55dba83882 100644
+--- a/gcc/config/microblaze/microblaze.c
++++ b/gcc/config/microblaze/microblaze.c
+@@ -239,6 +239,63 @@ section *sdata2_section;
+ #define TARGET_HAVE_TLS true
+ #endif
+
++/* Convert a version number of the form "vX.YY.Z" to an integer encoding
++ for easier range comparison. */
++static int
++microblaze_version_to_int (const char *version)
++{
++ const char *p, *v;
++ const char *tmpl = "vXX.YY.Z";
++ int iver1 =0, iver2 =0, iver3 =0;
++
++ p = version;
++ v = tmpl;
++
++ while (*p)
++ {
++ if (*v == 'X')
++ { /* Looking for major */
++ if (*p == '.')
++ {
++ *v++;
++ }
++ else
++ {
++ if (!(*p >= '0' && *p <= '9'))
++ return -1;
++ iver1 += (int) (*p - '0');
++ iver1 *= 1000;
++ }
++ }
++ else if (*v == 'Y')
++ { /* Looking for minor */
++ if (!(*p >= '0' && *p <= '9'))
++ return -1;
++ iver2 += (int) (*p - '0');
++ iver2 *= 10;
++ }
++ else if (*v == 'Z')
++ { /* Looking for compat */
++ if (!(*p >= 'a' && *p <= 'z'))
++ return -1;
++ iver3 = ((int) (*p)) - 96;
++ }
++ else
++ {
++ if (*p != *v)
++ return -1;
++ }
++
++ v++;
++ p++;
++ }
++
++ if (*p)
++ return -1;
++
++ return iver1 + iver2 + iver3;
++}
++
+ /* Return truth value if a CONST_DOUBLE is ok to be a legitimate constant. */
+ static bool
+ microblaze_const_double_ok (rtx op, machine_mode mode)
+@@ -1267,8 +1324,7 @@ microblaze_rtx_costs (rtx x, machine_mode mode, int outer_code ATTRIBUTE_UNUSED,
+ {
+ if (TARGET_BARREL_SHIFT)
+ {
+- if (MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v5.00.a")
+- >= 0)
++ if (microblaze_version_to_int(microblaze_select_cpu) >= microblaze_version_to_int("v5.00.a"))
+ *total = COSTS_N_INSNS (1);
+ else
+ *total = COSTS_N_INSNS (2);
+@@ -1329,8 +1385,7 @@ microblaze_rtx_costs (rtx x, machine_mode mode, int outer_code ATTRIBUTE_UNUSED,
+ }
+ else if (!TARGET_SOFT_MUL)
+ {
+- if (MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v5.00.a")
+- >= 0)
++ if (microblaze_version_to_int(microblaze_select_cpu) >= microblaze_version_to_int("v5.00.a"))
+ *total = COSTS_N_INSNS (1);
+ else
+ *total = COSTS_N_INSNS (3);
+@@ -1610,72 +1665,13 @@ function_arg_partial_bytes (cumulative_args_t cum_v, machine_mode mode,
+ return 0;
+ }
+
+-/* Convert a version number of the form "vX.YY.Z" to an integer encoding
+- for easier range comparison. */
+-static int
+-microblaze_version_to_int (const char *version)
+-{
+- const char *p, *v;
+- const char *tmpl = "vXX.YY.Z";
+- int iver = 0;
+-
+- p = version;
+- v = tmpl;
+-
+- while (*p)
+- {
+- if (*v == 'X')
+- { /* Looking for major */
+- if (*p == '.')
+- {
+- v++;
+- }
+- else
+- {
+- if (!(*p >= '0' && *p <= '9'))
+- return -1;
+- iver += (int) (*p - '0');
+- iver *= 10;
+- }
+- }
+- else if (*v == 'Y')
+- { /* Looking for minor */
+- if (!(*p >= '0' && *p <= '9'))
+- return -1;
+- iver += (int) (*p - '0');
+- iver *= 10;
+- }
+- else if (*v == 'Z')
+- { /* Looking for compat */
+- if (!(*p >= 'a' && *p <= 'z'))
+- return -1;
+- iver *= 10;
+- iver += (int) (*p - 'a');
+- }
+- else
+- {
+- if (*p != *v)
+- return -1;
+- }
+-
+- v++;
+- p++;
+- }
+-
+- if (*p)
+- return -1;
+-
+- return iver;
+-}
+-
+-
+ static void
+ microblaze_option_override (void)
+ {
+ register int i, start;
+ register int regno;
+ register machine_mode mode;
+- int ver;
++ int ver,ver_int;
+
+ microblaze_section_threshold = (global_options_set.x_g_switch_value
+ ? g_switch_value
+@@ -1696,13 +1692,13 @@ microblaze_option_override (void)
+ /* Check the MicroBlaze CPU version for any special action to be done. */
+ if (microblaze_select_cpu == NULL)
+ microblaze_select_cpu = MICROBLAZE_DEFAULT_CPU;
+- ver = microblaze_version_to_int (microblaze_select_cpu);
+- if (ver == -1)
++ ver_int = microblaze_version_to_int (microblaze_select_cpu);
++ if (ver_int == -1)
+ {
+ error ("%qs is an invalid argument to -mcpu=", microblaze_select_cpu);
+ }
+
+- ver = MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v3.00.a");
++ ver = ver_int - microblaze_version_to_int("v3.00.a");
+ if (ver < 0)
+ {
+ /* No hardware exceptions in earlier versions. So no worries. */
+@@ -1713,8 +1709,7 @@ microblaze_option_override (void)
+ microblaze_pipe = MICROBLAZE_PIPE_3;
+ }
+ else if (ver == 0
+- || (MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v4.00.b")
+- == 0))
++ || (ver_int == microblaze_version_to_int("v4.00.b")))
+ {
+ #if 0
+ microblaze_select_flags |= (MICROBLAZE_MASK_NO_UNSAFE_DELAY);
+@@ -1731,11 +1726,9 @@ microblaze_option_override (void)
+ #endif
+ microblaze_no_unsafe_delay = 0;
+ microblaze_pipe = MICROBLAZE_PIPE_5;
+- if (MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v5.00.a") == 0
+- || MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu,
+- "v5.00.b") == 0
+- || MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu,
+- "v5.00.c") == 0)
++ if ((ver_int == microblaze_version_to_int("v5.00.a"))
++ || (ver_int == microblaze_version_to_int("v5.00.b"))
++ || (ver_int == microblaze_version_to_int("v5.00.c")))
+ {
+ /* Pattern compares are to be turned on by default only when
+ compiling for MB v5.00.'z'. */
+@@ -1743,7 +1736,7 @@ microblaze_option_override (void)
+ }
+ }
+
+- ver = MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v6.00.a");
++ ver = ver_int - microblaze_version_to_int("v6.00.a");
+ if (ver < 0)
+ {
+ if (TARGET_MULTIPLY_HIGH)
+@@ -1751,7 +1744,7 @@ microblaze_option_override (void)
+ "-mxl-multiply-high can be used only with -mcpu=v6.00.a or greater");
+ }
+
+- ver = MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v8.10.a");
++ ver = ver_int - microblaze_version_to_int("v8.10.a");
+ microblaze_has_clz = 1;
+ if (ver < 0)
+ {
+@@ -1760,7 +1753,7 @@ microblaze_option_override (void)
+ }
+
+ /* TARGET_REORDER defaults to 2 if -mxl-reorder not specified. */
+- ver = MICROBLAZE_VERSION_COMPARE (microblaze_select_cpu, "v8.30.a");
++ ver = ver_int - microblaze_version_to_int("v8.30.a");
+ if (ver < 0)
+ {
+ if (TARGET_REORDER == 1)
+--
+2.14.2
+