From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id HHUqNc96lmpe9hkAWB0awg (envelope-from ) for ; Tue, 01 Sep 2026 03:12:15 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=o2.pl header.i=@o2.pl header.a=rsa-sha256 header.s=20241105 header.b=OD9iXo5T; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id C38851E09B; Tue, 01 Sep 2026 03:12:15 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-25) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-5.4 required=5.0 tests=ARC_SIGNED,ARC_VALID,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED autolearn=ham autolearn_force=no version=4.0.1 Received: from vm01.sourceware.org (vm01.sourceware.org [38.145.34.32]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 5F3751E09B for ; Tue, 01 Sep 2026 03:12:14 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CE0CD4BA798D for ; Tue, 1 Sep 2026 07:12:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CE0CD4BA798D Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=o2.pl header.i=@o2.pl header.a=rsa-sha256 header.s=20241105 header.b=OD9iXo5T Received: from mx-out.tlen.pl (mx-out.tlen.pl [193.222.135.158]) by sourceware.org (Postfix) with ESMTPS id 89B1E4BA2E13 for ; Tue, 1 Sep 2026 07:11:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 89B1E4BA2E13 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=o2.pl Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=o2.pl ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 89B1E4BA2E13 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=193.222.135.158 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1788246709; cv=none; b=yB825srUDjnWYL56p7DiMVyLnB2xdvxc3kj/rQJwiAWVu7kf46riamn0c0QQjvGoiBnCph358lFgaEGboYtNB0mC4A7+UD5wT083WseC4KTP44lrgxHOSAbnhiag3Ol4ad4DKzR3QaQZx+iWcNvhbt1BtTfMGmwwhPE5AWzWDqU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1788246709; c=relaxed/simple; bh=RVS+4gcUv0Nfc7JK4VXEaaKu1PJcji32ZAbAHVrxyE4=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=hwtG9iD/r6REOgsjs/McxHJtIsIOBy2LWdSVFS/XZMhEhbuindjFagWt3bxFcIIo6+gUWOab1h4fB7v0kasZwz640sLWlzvQOE4Qh+GarijZ9LEKWOUDe5WVdb5edMIXLQeMPfaVg+y/rtjjXjK2oenT4WlFuB9ydii2t25VwOE= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=o2.pl header.i=@o2.pl header.a=rsa-sha256 header.s=20241105 header.b=OD9iXo5T DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 89B1E4BA2E13 Received: (wp-smtpd smtp.tlen.pl 25316 invoked from network); 1 Sep 2026 09:11:41 +0200 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=o2.pl; s=20241105; t=1788246701; bh=iJSzjLoAX7U/lJudoXpLr1tR6V8etIeydleCr0wbjCc=; h=From:To:Cc:Subject; b=OD9iXo5TK831R7EzniGUAg6zWcwpoTvk9KXpbUUloflSY3ifxocffOxWsvtnLJeMT jQGtH8z9wTYNa3KjSi0FyYZGBA/PgtESfrqk4FaOoRjbyFTPrOCznn0iqxZ9siTwLy iPDUO7zDzW844C+lD11tobAJnBxobsMbTrpXdUjKb/Gghs4+70snvwxJSzCyhroJiL z321qrUOW5WsLdgSIM9LdvTRgvN2R+9wEV6m31qd3PI+fCr1iNu+MiR7hoIjfi6GRa HPCogdcmOrAOj9gn8shLCqc2+MCRNiODFtJEIiNQTBsKlMOMh1snCIvZ8PySE9ax60 4jwFB2f83olbQ== Received: from jdxpc (ip-94-42-228-250.multimo.pl [94.42.228.250]) (envelope-sender ) by smtp.tlen.pl (WP-SMTPD) with TLS_AES_256_GCM_SHA384 encrypted SMTP for ; 1 Sep 2026 09:11:41 +0200 From: Jan Dubiec To: gdb-patches@sourceware.org Cc: Jan Dubiec , Jeffrey Law , Tom Tromey Subject: [PATCH v2] H8/300: sim: Fix simulator hang caused by qsort on Windows/MinGW Date: Tue, 1 Sep 2026 09:05:33 +0200 Message-ID: <20260901071022.1682657-1-jdx@o2.pl> X-Mailer: git-send-email 2.55.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-WP-MailID: f8d2943812f30371aec26549c65e4c66 X-WP-AV: skaner antywirusowy Poczty o2 X-WP-SPAM: NO 0000005 [gfYD] X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~public-inbox=simark.ca@sourceware.org On Windows, qsort() uses an unstable sorting algorithm, which results in a "shuffled" opcode table rather than a properly sorted one, causing the entire simulator to hang. The simulator happens to work on Linux, but this behavior is not guaranteed, because the glibc documentation clearly states that "If two elements compare equal, their order after sorting is unpredictable." This patch introduces two additional sort keys to the instruction comparator function, making the resulting opcode table as close as possible to the one that would be produced by a stable sorting algorithm. --- sim/h8300/compile.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/sim/h8300/compile.c b/sim/h8300/compile.c index 06988095228..3cca69730b0 100644 --- a/sim/h8300/compile.c +++ b/sim/h8300/compile.c @@ -1586,6 +1586,7 @@ instruction_comparator (const void *p1_, const void *p2_) { struct h8_opcode *p1 = (struct h8_opcode *)p1_; struct h8_opcode *p2 = (struct h8_opcode *)p2_; + int cmp; /* The 1st sort key is based on whether or not the instruction is even available. This reduces the @@ -1605,7 +1606,43 @@ instruction_comparator (const void *p1_, const void *p2_) return p2_available - p1_available; /* Secondarily sort based on the first opcode nibble. */ - return p1->data.nib[0] - p2->data.nib[0]; + if (p1->data.nib[0] != p2->data.nib[0]) + return p1->data.nib[0] - p2->data.nib[0]; + + /* The 3rd sort key */ + cmp = strcmp(p1->name, p2->name); + if (cmp) + { + /* Two different opcodes */ + size_t l1 = strlen(p1->name); + size_t l2 = strlen(p2->name); + ptrdiff_t i1 = strchr(p1->name, '.') - p1->name; + ptrdiff_t i2 = strchr(p2->name, '.') - p2->name; + char c1, c2; + + if ((l1 == l2) && (i1 == i2) && (i1 > 0)) + { + /* Check for different mnemonics, e.g. add.w vs. and.b */ + cmp = strncmp(p1->name, p2->name, i1); + if (cmp) + return cmp; + + /* At this point we expect only b, w or l suffix, + where b < w < l */ + c1 = p1->name[i1+1]; + c2 = p2->name[i2+1]; + if (c1 == 'b') + return -1; + else if (c1 == 'w') + return (c2 == 'b') ? 1 : -1; + else + return 1; + } + return cmp; + } + + /* The 4th sort key */ + return p1->how - p2->how; } -- 2.55.0