From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id UWTJMW70kmqhsxAAWB0awg (envelope-from ) for ; Sat, 29 Aug 2026 11:02:06 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=yahoo.de header.i=@yahoo.de header.a=rsa-sha256 header.s=s2048 header.b=EBaOUlXf; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id C79BA1E033; Sat, 29 Aug 2026 11:02:06 -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 [IPv6:2620:52:6:3111::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 6B6331E033 for ; Sat, 29 Aug 2026 11:02:05 -0400 (EDT) Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 097594B9DB53 for ; Sat, 29 Aug 2026 15:02:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 097594B9DB53 Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=yahoo.de header.i=@yahoo.de header.a=rsa-sha256 header.s=s2048 header.b=EBaOUlXf Received: from sonic.asd.mail.yahoo.com (sonic-euwe4-0022.asd.mail.yahoo.com [34.2.86.21]) by sourceware.org (Postfix) with ESMTPS id 657894B9DB54 for ; Sat, 29 Aug 2026 14:59:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 657894B9DB54 Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=yahoo.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=yahoo.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 657894B9DB54 Authentication-Results: sourceware.org; arc=none smtp.remote-ip=34.2.86.21 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1788015549; cv=none; b=br8MklSyZQSTBk+cWK5gPebdqaC5QlOUzesSq/OKaZSgc5mfo+g9qB/X4MTBFiOc93RCc632nSALrA/Q8rycwft8VPEILJezvCu60h6RjAFIESnpQEXsz5ySGwOSgL0UNqYsUV3ew89eg9FdeCaKp+AidxvXYqL4I2NeN4iBY60= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1788015549; c=relaxed/simple; bh=TO6XroLTI7RbCmR6QMFg2e8dpkX0Ka3xYL+Wr4+yOPI=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=RVkjQEYMwOnujWt4/d/EZkZtNIxG/X9OUBNR6cW9yuyShYdhabDvJIgzPoaU8eY3Zb7V8z1CXoFn1tpkBVme3R1/DxVM2k0ddWA5AIAD0PG85fP6O3j4KsorxhQmefErDV58qt6n6kq9haVjH81SrGxqnGsudwu5cHiHEyDrNEg= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=yahoo.de header.i=@yahoo.de header.a=rsa-sha256 header.s=s2048 header.b=EBaOUlXf DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 657894B9DB54 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s2048; t=1788015548; bh=Yf9xXaKc7M0981VIiBvzsTIQmZYN080FLMlGXWFe2og=; h=From:To:Subject:Date:In-Reply-To:References:From:Subject:Reply-To; b=EBaOUlXfe326kJzsknDTgjw7GxCyODnGLwFv/YbHfQXjzTA0GrCYJc71rtL3ZwGDophlXZKlAsZOOsUDdS9+sn44r7YCTC1ljNNFDaCnWEY7/MdZm8yKWg4OEd34U4CuhmQ6fDxbncvWvYx9QuKUGZffmziFe6hoDe+gTHZdvNeW3NfU3UeYrYhoX69KtJ2BqNdqtPcjOq5rOYkERU5xkCa94o3wrPAagTEb/nt2YPEo9knmXUeop0MrCx1zWJaUHuECWIcrsaa67uj6O6ich7mno9lUhPJMf0VWU9eqaCnZG5zHGUTLhK51xVxjnNjoMkpenwV/pFbI2Ql8+TqQCA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1788015548; bh=8Rb00wMblOy64CqiX67Ft/GuQERlkHfZBi2WI8Oh7Vv=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=jqAXNhao4/l5ju6UwcN9MsROSx18JhOWR8CbWE5m4W+TXTm3krHt9nR1FuNZGTd1e7Sw1o/IFqYOwSDD/TUpehd796Q8yoGRv4scgsk+/+S1SWv4diQa9JxlEIQbOrX73Ax4BwLZwDHTGE9QrEqTtTIV8NMV6Lpar5+uMMocWCP2cuLOBBxCaPN+TmSFjVSCte+xMdGQ6BuULxc1Sn/AcWYIeQ4JPKTR8OC5LOA4zeSjnf9AWCq6LYgVP5TeL3AwhqMgsaWSux0XTw/5wiy+UepSXmyLaEjUxAdYuXnSsalIM13TwG2ExT2GBWsm1uOyeQXF4cthFTwVvLm7z/guHw== X-YMail-OSG: I5UWP4sVM1lp1LuGqq20_HQ5g4aoug6hATajcfmS5VSRiCIFcHhk6hYnnFL8hVd SKqJFmzTsz3GfXMgLkt2mOpek0xM0i1Y0yTfSyAz4bC.9NO4zJlWCISGJ9KabwSjAeoCYwVh0yen NPKJNlPvpoyFUWWDGXIOrZ8T93MdqNS1Tps4f2f2jolDMeQlxgGgWUDe2vFMn3FWKINvWTsVVayp sVaBwnqVF33ceXq_1BQX1AjG5DGoP7UiKTsT8dsEeQ9V8eNyWpgT6Z6Znyp6Rschdn.QRjwPRkPA m6voJ7HmTqGBUtPIW4eBP267fHNJwxmYzq2STNOIA7zor9NATFwi2Ujm1sRew1PkEddXuaxnbchL GAiGaoxxd8GPE9_ogQs_Wf_3PZIlWLznf5T5SG8D9xjr95Gxaxu8ZwGvnkkla0sf8Yr2vxq3qnIP _evs32qZ.U4dvMTfHcyMU89E.4JM92Jcq7cgmiZ.HBDcNmX6U.MZD4ehypsJXPuFtK3NIldOyaT9 wNHJkBHUJMWSkg50gy8qBMXnTwytuq2FM4Wv.iPlSaxtDX2o_rNdZom3MorSERxQa8kBOh99aelV v6Gd6BVeUhV7KsaQ8euPggYPs2RgYqL9UHF48qTdhwr5nJXt0lgcerAh2fLI14rhKYjfqdutmJ.d nOU5enWnZr622AAM0X9iOJBrTgFdlGuQjEeMlPjEAjAQij2d9WKrkxt3JCq5p8SbAfOxkHxC9nVh .KyMQwtMty77YZ_vzdhUkRq7Pla7gXztdSURf5EWLENEm9s0uLgO2vsGElqRKbj6caaKBP7gsmhd 9eU5M7k6bbs7yvM_7Jv5Y7jiexGiDtSOrUmgju3RkSj4HHNgmVUW9nrU4RmSdabTCiwcu.jD4zCL 9Q8qd7zms67yXeywxM8cZsJfZYFRcvyARjIWxD1ebHPjQYMPv1A9wOjdG9cgdZZynAgcQNd45uuS aL3p.dTOIYRFhae0YeYh8GajTHRzlQe88srLQeRud0e5BtgQIO8cv54z.PllKhIDWjpzUGiwEzfR G6WKkFfOlPijR0.Z.umg1.Oz0vLnlR1zdZWzoBZFg2s6aAZTda3sueg15QI6xDWzNp3zfpQV.RNN iGj.vJShoxd___010LINxxwqfkzdXq7_wXevNFs7JsxtkjkjvsxComwRl1vzBcmF2A_lYxbRSg8Y uvjy.6EaU9H8s3EJbZTCWQj4A7eHle3DssTk7j4UAW58ug7f72z.n6VdJ94iWAwlDwe4qbheKKsZ fVPMufSlmWyibC8PucI6WU3HRR3wSATsgEzo9NO3B9c3.UWlanq_Oq2.oerokvPZQrt5hCEqc.Xa GMRaUTvC1ZspMa_JAMqB3v31vfARYdvG5eWOCCF.fTJIKqJNyas0yNFoX9g7RiG2Oo4ycZLf43RB A8kigFzwwUEVDSkzN5GVhg3EsaqkD6Nwn9l5WCkJ7Tc_mnASIIaweHzsEWJNAxwfY0JXM1MEvFyH bhxTCvQo267eXJjBhBMMi98DSyyIxYudFhVG0643kQqpbvegjXejd7BxUgSrT6YmS6TVlUnBrGb0 RgPTINXKRlkcCAoE23Au0qsXCvm2Hn0WwnO573Pi00Q.jioNyVtVdKGjWlVoiFQ1bO_CyzWSw.rW D_cmFRDPoLMqx6VGw71Or2kUG0AE3tV0QZ9kBkPBjMeFoZuvCu4LzFMq.lt0eNDSjsNPytFcR.R. YV6gPscmU36d4p2Pb4cNGnyAuo9N26KY7ln3cAGTbdo6MHNn_oldXF1vdtbm8WelPDV6oReRtWH3 u3gpFX3.zRRMHP9Xzvq34LDnzrNtMaPWBGHuHf1oyxoeoLzuaeZnGB.mxe7cU_KUCjNItKZKfKU. PKkj185WcZMlpDCVIrHHjLe23Q5m.2Cx5.xdK41IqzATOR1fCm0_2trR5GCmZmsunuox54NQenHP OKuEfKb2JnMx7hz2Fs2gEd8DTQWT2own8_qonUfNAAy7MKbUYB7kk_LvU2hYeuajAAAIypDhyBfg 6DgBvi.OMrlMUkU_YW_cjktw- X-Sonic-MF: X-Sonic-ID: 9d15226a-02f5-4d4d-b67e-d08e0ea90404 Received: from sonic.gate.mail.ne1.yahoo.com by mail-asdoutdeli-p-cin-euwe4-prod-sonicconsumer-svc-101 with HTTP; Sat, 29 Aug 2026 14:59:08 +0000 Received: from dip114.lsn.ir2.yahoo.com ([87.248.99.123]) by hello (SMTP) with SMTP ID 13fd5a24ca42336c08dbbc03a4401a1b for ; Sat, 29 Aug 2026 14:59:03 +0000 (UTC) From: Hannes Domani To: gdb-patches@sourceware.org Subject: [PATCH v3 7/8] Windows gdb: Implement AVX register support Date: Sat, 29 Aug 2026 16:49:04 +0200 Message-ID: <20260829145823.1034821-7-ssbssa@yahoo.de> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260829145823.1034821-1-ssbssa@yahoo.de> References: <20260829145823.1034821-1-ssbssa@yahoo.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 This adds support for the Intel AVX registers on Windows. It enables accessing registers $ymm0 - $ymm15 where they are available. After this patch gdb.arch/i386-avx.exp passes on windows. --- v3: - merged gdb+gdbserver parts, and split again AVX/AVX-512 parts --- gdb/NEWS | 3 ++ gdb/nat/windows-nat.c | 2 +- gdb/x86-windows-nat.c | 67 +++++++++++++++++++++++++++++++++++-- gdbserver/win32-i386-low.cc | 61 +++++++++++++++++++++++++++++---- gdbserver/win32-low.cc | 15 ++++++--- 5 files changed, 133 insertions(+), 15 deletions(-) diff --git a/gdb/NEWS b/gdb/NEWS index 10c182067f9..f7effc822e9 100644 --- a/gdb/NEWS +++ b/gdb/NEWS @@ -118,6 +118,9 @@ intent to remove it in a future release. The s390 64-bit target (s390x-*) remains supported. +* Support for Intel AVX registers on Windows. + Support displaying and modifying Intel AVX registers $ymm0 - $ymm31. + * Configure changes ** --with-babeltrace has been removed. The babeltrace library was diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c index 8930536f3ba..c9a21d7c41f 100644 --- a/gdb/nat/windows-nat.c +++ b/gdb/nat/windows-nat.c @@ -1339,7 +1339,7 @@ initialize_loadable () { /* Available XState features masked with implemented features. */ xstate_features = (GetEnabledXStateFeatures () - & X86_XSTATE_SSE_MASK); + & X86_XSTATE_AVX_MASK); /* The extended XState functions are only needed if the available features exceed SSE. */ if ((xstate_features & ~X86_XSTATE_SSE_MASK) == 0) diff --git a/gdb/x86-windows-nat.c b/gdb/x86-windows-nat.c index 3af5ef4dae0..1cefe6171be 100644 --- a/gdb/x86-windows-nat.c +++ b/gdb/x86-windows-nat.c @@ -27,6 +27,9 @@ #include "i386-tdep.h" #include "i387-tdep.h" +#ifdef __x86_64__ +#include "amd64-tdep.h" +#endif using namespace windows_nat; @@ -70,6 +73,8 @@ struct x86_windows_nat_target final : public x86_nat_target windows_thread_info *th, int r) override; bool is_sw_breakpoint (const EXCEPTION_RECORD *er) const override; + + const struct target_desc *read_description () override; }; /* The current process. */ @@ -109,7 +114,31 @@ x86_windows_per_inferior::fill_thread_context (windows_thread_info *th) if (context->ContextFlags == 0) { context->ContextFlags = WindowsContext::all; + if (xstate_features != 0) + { + context->ContextFlags |= CONTEXT_XSTATE_FLAG; + set_xstate_features_mask (context, xstate_features); + } CHECK (get_thread_context (th->h, context)); + + if (xstate_features != 0) + { + DWORD64 features = 0; + CHECK (get_xstate_features_mask (context, &features)); + DWORD64 zeroed_features = xstate_features & ~features; + + for (int f = X86_XSTATE_AVX_ID; f <= X86_XSTATE_CET_U_ID; f++) + { + DWORD64 flag = 1ULL << f; + if ((zeroed_features & flag) != 0) + { + DWORD size = 0; + void *loc = locate_xstate_feature (context, f, &size); + if (loc != nullptr && size > 0) + memset (loc, 0, size); + } + } + } } }); } @@ -198,6 +227,14 @@ x86_windows_nat_target::thread_context_continue (windows_thread_info *th, if (GetExitCodeThread (th->h, &ec) && ec == STILL_ACTIVE) { + DWORD debug_registers = WindowsContext::debug; + if (xstate_features != 0 + && (context->ContextFlags & ~debug_registers) != 0) + { + context->ContextFlags |= CONTEXT_XSTATE_FLAG; + set_xstate_features_mask (context, xstate_features); + } + BOOL status = set_thread_context (th->h, context); if (!killed) @@ -227,7 +264,7 @@ x86_windows_nat_target::thread_context_step (windows_thread_info *th, template static char * -get_context_reg_ptr (Context *context, int r) +get_context_reg_ptr (Context *context, int r, i386_gdbarch_tdep *tdep) { const int *mappings; int mappings_count; @@ -247,6 +284,13 @@ get_context_reg_ptr (Context *context, int r) char *context_offset; if (r < mappings_count) context_offset = (char *) context + mappings[r]; + else if (I387_YMM0H_REGNUM (tdep) > 0 && r >= I387_YMM0H_REGNUM (tdep) + && r < I387_YMMENDH_REGNUM (tdep)) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_AVX_ID, NULL); + context_offset += 16 * (r - I387_YMM0H_REGNUM (tdep)); + } else gdb_assert_not_reached ("invalid register number %d", r); @@ -267,7 +311,7 @@ x86_windows_nat_target::fetch_one_register (struct regcache *regcache, char *context_offset = x86_windows_process.with_context (th, [&] (auto *context) { - return get_context_reg_ptr (context, r); + return get_context_reg_ptr (context, r, tdep); }); gdb_assert (!gdbarch_read_pc_p (gdbarch)); @@ -333,7 +377,7 @@ x86_windows_nat_target::store_one_register (const struct regcache *regcache, = x86_windows_process.with_context (th, [&] (auto *context) { gdb_assert (context->ContextFlags != 0); - return get_context_reg_ptr (context, r); + return get_context_reg_ptr (context, r, tdep); }); /* GDB treats some registers as 32-bit, where they are in fact only @@ -368,6 +412,23 @@ x86_windows_nat_target::is_sw_breakpoint (const EXCEPTION_RECORD *er) const || er->ExceptionCode == STATUS_WX86_BREAKPOINT); } +const struct target_desc * +x86_windows_nat_target::read_description () +{ + if (inferior_ptid == null_ptid) + return this->beneath ()->read_description (); + + if (xstate_features == 0) + return nullptr; + +#ifdef __x86_64__ + if (!x86_windows_process.wow64_process) + return amd64_target_description (xstate_features, false); + else +#endif + return i386_target_description (xstate_features, false); +} + /* Hardware watchpoint support, adapted from go32-nat.c code. */ /* Pass the address ADDR to the inferior in the I'th debug register. diff --git a/gdbserver/win32-i386-low.cc b/gdbserver/win32-i386-low.cc index b77f6adc6ed..a7e83c0239c 100644 --- a/gdbserver/win32-i386-low.cc +++ b/gdbserver/win32-i386-low.cc @@ -253,6 +253,11 @@ i386_get_thread_context (windows_thread_info *th) | WindowsContext::floating | WindowsContext::debug | extended_registers); + if (xstate_features != 0) + { + context->ContextFlags |= CONTEXT_XSTATE_FLAG; + set_xstate_features_mask (context, xstate_features); + } BOOL ret = get_thread_context (th->h, context); if (!ret) @@ -267,6 +272,24 @@ i386_get_thread_context (windows_thread_info *th) error (_("GetThreadContext failure %ld\n"), (long) e); } + + DWORD64 features = 0; + if (xstate_features != 0 + && get_xstate_features_mask (context, &features)) + { + DWORD64 zeroed_features = xstate_features & ~features; + for (int f = X86_XSTATE_AVX_ID; f <= X86_XSTATE_CET_U_ID; f++) + { + DWORD64 flag = 1ULL << f; + if ((zeroed_features & flag) != 0) + { + DWORD size = 0; + void *loc = locate_xstate_feature (context, f, &size); + if (loc != nullptr && size > 0) + memset (loc, 0, size); + } + } + } }); } @@ -292,6 +315,17 @@ i386_prepare_to_resume (windows_thread_info *th) th->debug_registers_changed = false; } + + windows_process.with_context (th, [&] (auto *context) + { + DWORD debug_registers = WindowsContext::debug; + if (xstate_features != 0 + && (context->ContextFlags & ~debug_registers) != 0) + { + context->ContextFlags |= CONTEXT_XSTATE_FLAG; + set_xstate_features_mask (context, xstate_features); + } + }); } static void @@ -477,7 +511,7 @@ is_segment_register (int r) template static char * -get_context_reg_ptr (Context *context, int r) +get_context_reg_ptr (Context *context, int r, const target_desc *tdesc) { const int *mappings; int mappings_count; @@ -494,9 +528,21 @@ get_context_reg_ptr (Context *context, int r) mappings_count = sizeof (i386_mappings) / sizeof (i386_mappings[0]); } + bool amd64 = register_size (tdesc, 0) == 8; + int ymm0h_regnum; + const int num_xmm_registers = amd64 ? 16 : 8; + char *context_offset; if (r < mappings_count) context_offset = (char *) context + mappings[r]; + else if ((xstate_features & X86_XSTATE_AVX) != 0 + && r >= (ymm0h_regnum = find_regno (tdesc, "ymm0h")) + && r < ymm0h_regnum + num_xmm_registers) + { + context_offset = (char *) locate_xstate_feature + (context, X86_XSTATE_AVX_ID, NULL); + context_offset += 16 * (r - ymm0h_regnum); + } else gdb_assert_not_reached ("invalid register number %d", r); @@ -510,7 +556,7 @@ i386_fetch_inferior_register (struct regcache *regcache, { char *context_offset = windows_process.with_context (th, [&] (auto *context) { - return get_context_reg_ptr (context, r); + return get_context_reg_ptr (context, r, regcache->tdesc); }); /* GDB treats some registers as 32-bit, where they are in fact only @@ -538,7 +584,7 @@ i386_store_inferior_register (struct regcache *regcache, { char *context_offset = windows_process.with_context (th, [&] (auto *context) { - return get_context_reg_ptr (context, r); + return get_context_reg_ptr (context, r, regcache->tdesc); }); /* GDB treats some registers as 32-bit, where they are in fact only @@ -571,14 +617,17 @@ i386_arch_setup (void) { target_desc_up tdesc; + DWORD64 xcr0 = xstate_features; + if (xcr0 == 0) + xcr0 = X86_XSTATE_SSE_MASK; + #ifdef __x86_64__ - tdesc = amd64_create_target_description (X86_XSTATE_SSE_MASK, false, - false, false); + tdesc = amd64_create_target_description (xcr0, false, false, false); init_target_desc (tdesc.get (), amd64_expedite_regs, WINDOWS_OSABI); win32_tdesc = std::move (tdesc); #endif - tdesc = i386_create_target_description (X86_XSTATE_SSE_MASK, false, false); + tdesc = i386_create_target_description (xcr0, false, false); init_target_desc (tdesc.get (), i386_expedite_regs, WINDOWS_OSABI); #ifdef __x86_64__ wow64_win32_tdesc = std::move (tdesc); diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc index 7629beca213..5ccdc89a7ef 100644 --- a/gdbserver/win32-low.cc +++ b/gdbserver/win32-low.cc @@ -33,6 +33,7 @@ #include #include "gdbsupport/gdb_tilde_expand.h" #include "gdbsupport/common-inferior.h" +#include "tdesc.h" using namespace windows_nat; @@ -426,8 +427,9 @@ child_fetch_inferior_registers (struct regcache *regcache, int r) int regno; windows_thread_info *th = windows_process.find_thread (current_thread->id); win32_require_context (th); - if (r == -1 || r > NUM_REGS) - child_fetch_inferior_registers (regcache, NUM_REGS); + if (r == -1) + child_fetch_inferior_registers (regcache, + regcache->tdesc->reg_defs.size ()); else for (regno = 0; regno < r; regno++) (*the_low_target.fetch_inferior_register) (regcache, th, regno); @@ -441,8 +443,9 @@ child_store_inferior_registers (struct regcache *regcache, int r) int regno; windows_thread_info *th = windows_process.find_thread (current_thread->id); win32_require_context (th); - if (r == -1 || r == 0 || r > NUM_REGS) - child_store_inferior_registers (regcache, NUM_REGS); + if (r == -1) + child_store_inferior_registers (regcache, + regcache->tdesc->reg_defs.size ()); else for (regno = 0; regno < r; regno++) (*the_low_target.store_inferior_register) (regcache, th, regno); @@ -1349,7 +1352,9 @@ void initialize_low (void) { set_target_ops (&the_win32_target); - the_low_target.arch_setup (); initialize_loadable (); + /* Has to be done after initialize_loadable, because it uses the xstate + functions if available. */ + the_low_target.arch_setup (); } -- 2.54.0