[PATCH] H8/300: sim: Fix simulator hang caused by qsort on Windows/MinGW.

Jan Dubiec jdx@o2.pl
Thu Aug 20 15:36:20 GMT 2026


See the comment below. I don't know why qsort behaves so strangely. It
could be a bug, or simply a consequence of its being an unstable sort.
Unfortunately, I don't have time to investigate the root cause.

Signed-off-by: Jan Dubiec <jdx@o2.pl>
---
 sim/h8300/compile.c | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/sim/h8300/compile.c b/sim/h8300/compile.c
index 06988095228..c08f7704ef3 100644
--- a/sim/h8300/compile.c
+++ b/sim/h8300/compile.c
@@ -1568,6 +1568,41 @@ store2 (SIM_DESC sd, ea_type *arg, int n)
   return store_1 (sd, arg, n, 1);
 }
 
+#ifdef __MINGW32__
+/* On Windows/MinGW, qsort for some reason produces a "shuffled" opcode
+table instead of a sorted one, causing the entire simulator to hang.
+
+This is a simple insertion sort implementation, but it has virtually
+no impact on simulator performance.  */
+
+#define qsort opcode_insertion_sort
+
+static void
+opcode_insertion_sort(void *base, size_t nmemb, size_t size,
+                      int (*compar)(const void *, const void *))
+{
+  unsigned char *a = base;
+  struct h8_opcode tmp;
+  size_t i, j;
+
+  if (nmemb < 2 || size == 0)
+    return;
+
+  for (i = 1; i < nmemb; ++i) {
+    memcpy(&tmp, a + i * size, size);
+
+    j = i;
+    while (j > 0 && compar(&tmp, a + (j - 1) * size) < 0) {
+      memcpy(a + j * size, a + (j - 1) * size, size);
+      --j;
+    }
+
+    memcpy(a + j * size, &tmp, size);
+  }
+
+}
+#endif /* #ifdef __MINGW32__ */
+
 /* Callback for qsort.  We sort first based on availability
    (available instructions sort lower).  When availability state
    is the same, then we use the first 4 bit nibble as a secondary
-- 
2.55.0


More information about the Binutils mailing list