diff --git a/gdb/regformats/regdat.sh b/gdb/regformats/regdat.sh index 38464c65b06..49aa02a466d 100755 --- a/gdb/regformats/regdat.sh +++ b/gdb/regformats/regdat.sh @@ -105,7 +105,7 @@ EOF } -exec > new-$2 +exec > new-$3 copyright $1 echo '#include "regdef.h"' echo '#include "tdesc.h"' @@ -118,6 +118,7 @@ xmlarch=x xmlosabi=x expedite=x feature=x +osabi=unknown exec < $1 while do_read do @@ -143,7 +144,7 @@ do elif test "${type}" = "xmlarch"; then xmlarch="${entry}" continue - elif test "${type}" = "osabi"; then + elif test "${type}" = "xmlosabi"; then xmlosabi="${entry}" continue elif test "${type}" = "expedite"; then @@ -152,6 +153,9 @@ do elif test "${type}" = "feature"; then feature="${entry}" continue + elif test "${type}" = "osabi"; then + osabi="${entry}" + continue elif test "${name}" = x; then echo "$0: $1 does not specify \`\`name''." 1>&2 exit 1 @@ -188,11 +192,13 @@ else fi echo +osabi_enum=$(grep "${osabi}" "$2" | sed 's/.*(\([^,]\+\),.*/GDB_OSABI_\1/') + cat <xmltarget = xmltarget_${name}; #endif - init_target_desc (result, expedite_regs_${name}); + init_target_desc (result, expedite_regs_${name}, ${osabi_enum}); tdesc_${name} = result; } @@ -200,4 +206,4 @@ EOF # close things off exec 1>&2 -mv -- "new-$2" "$2" +mv -- "new-$3" "$3" diff --git a/gdbserver/Makefile.in b/gdbserver/Makefile.in index 6148ccf9121..f555ff439c4 100644 --- a/gdbserver/Makefile.in +++ b/gdbserver/Makefile.in @@ -488,6 +488,7 @@ stamp-xml: $(XML_DIR)/feature_to_c.sh Makefile $(XML_FILES) MAKEOVERRIDES = regdat_sh = $(srcdir)/../gdb/regformats/regdat.sh +osabi_def = $(srcdir)/../gdbsupport/osabi.def UST_CFLAGS = \ $(ustinc) \ @@ -588,11 +589,11 @@ target/%.o: ../gdb/target/%.c # Rules for register format descriptions. Suffix destination files with # -generated to identify and clean them easily. -%-generated.cc: ../gdb/regformats/%.dat $(regdat_sh) - $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $< $@ +%-generated.cc: ../gdb/regformats/%.dat $(osabi_def) $(regdat_sh) + $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $< $(osabi_def) $@ -%-generated.cc: ../gdb/regformats/rs6000/%.dat $(regdat_sh) - $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $< $@ +%-generated.cc: ../gdb/regformats/rs6000/%.dat $(osabi_def) $(regdat_sh) + $(ECHO_REGDAT) $(SHELL) $(regdat_sh) $< $(osabi_def) $@ # Rule for gdbreplay.o. This is the same as COMPILE, but includes common-defs.h # instead of server.h. diff --git a/gdbserver/linux-aarch32-tdesc.cc b/gdbserver/linux-aarch32-tdesc.cc index b8987752b9f..441fe668e6a 100644 --- a/gdbserver/linux-aarch32-tdesc.cc +++ b/gdbserver/linux-aarch32-tdesc.cc @@ -34,7 +34,7 @@ aarch32_linux_read_description () tdesc_aarch32 = aarch32_create_target_description (false); static const char *expedite_regs[] = { "r11", "sp", "pc", 0 }; - init_target_desc (tdesc_aarch32, expedite_regs); + init_target_desc (tdesc_aarch32, expedite_regs, GDB_OSABI_LINUX); } return tdesc_aarch32; } diff --git a/gdbserver/linux-aarch64-tdesc.cc b/gdbserver/linux-aarch64-tdesc.cc index 31ec7854cc0..39d5bccdce1 100644 --- a/gdbserver/linux-aarch64-tdesc.cc +++ b/gdbserver/linux-aarch64-tdesc.cc @@ -67,7 +67,8 @@ aarch64_linux_read_description (const aarch64_features &features) expedited_registers.push_back (nullptr); - init_target_desc (tdesc, (const char **) expedited_registers.data ()); + init_target_desc (tdesc, (const char **) expedited_registers.data (), + GDB_OSABI_LINUX); tdesc_aarch64_map[features] = tdesc; } diff --git a/gdbserver/linux-arc-low.cc b/gdbserver/linux-arc-low.cc index 1bcaf6c3f91..16d8d5824aa 100644 --- a/gdbserver/linux-arc-low.cc +++ b/gdbserver/linux-arc-low.cc @@ -114,7 +114,7 @@ arc_linux_read_description (void) target_desc_up tdesc = arc_create_target_description (features); static const char *expedite_regs[] = { "sp", "status32", nullptr }; - init_target_desc (tdesc.get (), expedite_regs); + init_target_desc (tdesc.get (), expedite_regs, GDB_OSABI_LINUX); return tdesc.release (); } diff --git a/gdbserver/linux-arm-tdesc.cc b/gdbserver/linux-arm-tdesc.cc index 559f9b0f3dc..fff2e948f81 100644 --- a/gdbserver/linux-arm-tdesc.cc +++ b/gdbserver/linux-arm-tdesc.cc @@ -37,7 +37,7 @@ arm_linux_read_description (arm_fp_type fp_type) tdesc = arm_create_target_description (fp_type, false); static const char *expedite_regs[] = { "r11", "sp", "pc", 0 }; - init_target_desc (tdesc, expedite_regs); + init_target_desc (tdesc, expedite_regs, GDB_OSABI_LINUX); tdesc_arm_list[fp_type] = tdesc; } diff --git a/gdbserver/linux-csky-low.cc b/gdbserver/linux-csky-low.cc index 2eb5a2df17b..18a0d152b5a 100644 --- a/gdbserver/linux-csky-low.cc +++ b/gdbserver/linux-csky-low.cc @@ -133,7 +133,7 @@ csky_target::low_arch_setup () if (tdesc->expedite_regs.empty ()) { - init_target_desc (tdesc.get (), expedite_regs); + init_target_desc (tdesc.get (), expedite_regs, GDB_OSABI_LINUX); gdb_assert (!tdesc->expedite_regs.empty ()); } diff --git a/gdbserver/linux-loongarch-low.cc b/gdbserver/linux-loongarch-low.cc index 584ea64a7d9..cf7d6c0743c 100644 --- a/gdbserver/linux-loongarch-low.cc +++ b/gdbserver/linux-loongarch-low.cc @@ -85,7 +85,7 @@ loongarch_target::low_arch_setup () if (tdesc->expedite_regs.empty ()) { - init_target_desc (tdesc.get (), expedite_regs); + init_target_desc (tdesc.get (), expedite_regs, GDB_OSABI_LINUX); gdb_assert (!tdesc->expedite_regs.empty ()); } current_process ()->tdesc = tdesc.release (); diff --git a/gdbserver/linux-riscv-low.cc b/gdbserver/linux-riscv-low.cc index 999b82e24e1..44c805bb6d6 100644 --- a/gdbserver/linux-riscv-low.cc +++ b/gdbserver/linux-riscv-low.cc @@ -91,7 +91,7 @@ riscv_target::low_arch_setup () if (tdesc->expedite_regs.empty ()) { - init_target_desc (tdesc.get (), expedite_regs); + init_target_desc (tdesc.get (), expedite_regs, GDB_OSABI_LINUX); gdb_assert (!tdesc->expedite_regs.empty ()); } diff --git a/gdbserver/linux-x86-tdesc.cc b/gdbserver/linux-x86-tdesc.cc index 13c80762605..6aa5c4ab970 100644 --- a/gdbserver/linux-x86-tdesc.cc +++ b/gdbserver/linux-x86-tdesc.cc @@ -26,10 +26,21 @@ void x86_linux_post_init_tdesc (target_desc *tdesc, bool is_64bit) { + enum gdb_osabi osabi = GDB_OSABI_LINUX; + +#ifndef IN_PROCESS_AGENT + /* x86 target descriptions are created with the osabi already set. + However, init_target_desc requires us to override the already set + value. That's fine, out new string should match the old one. */ + gdb_assert (tdesc_osabi_name (tdesc) != nullptr); + gdb_assert (strcmp (tdesc_osabi_name (tdesc), + gdbarch_osabi_name (osabi)) == 0); +#endif /* ! IN_PROCESS_AGENT */ + #ifdef __x86_64__ if (is_64bit) - init_target_desc (tdesc, amd64_expedite_regs); + init_target_desc (tdesc, amd64_expedite_regs, osabi); else #endif - init_target_desc (tdesc, i386_expedite_regs); + init_target_desc (tdesc, i386_expedite_regs, osabi); } diff --git a/gdbserver/netbsd-aarch64-low.cc b/gdbserver/netbsd-aarch64-low.cc index f20a1a71773..8834e0ad894 100644 --- a/gdbserver/netbsd-aarch64-low.cc +++ b/gdbserver/netbsd-aarch64-low.cc @@ -98,7 +98,7 @@ netbsd_aarch64_target::low_arch_setup () = aarch64_create_target_description ({}); static const char *expedite_regs_aarch64[] = { "x29", "sp", "pc", NULL }; - init_target_desc (tdesc, expedite_regs_aarch64); + init_target_desc (tdesc, expedite_regs_aarch64, GDB_OSABI_NETBSD); current_process ()->tdesc = tdesc; } diff --git a/gdbserver/netbsd-amd64-low.cc b/gdbserver/netbsd-amd64-low.cc index b3f3aab5ec3..ad7cb430b92 100644 --- a/gdbserver/netbsd-amd64-low.cc +++ b/gdbserver/netbsd-amd64-low.cc @@ -193,7 +193,7 @@ netbsd_amd64_target::low_arch_setup () target_desc *tdesc = amd64_create_target_description (X86_XSTATE_SSE_MASK, false, false, false); - init_target_desc (tdesc, amd64_expedite_regs); + init_target_desc (tdesc, amd64_expedite_regs, GDB_OSABI_NETBSD); current_process ()->tdesc = tdesc; } diff --git a/gdbserver/netbsd-i386-low.cc b/gdbserver/netbsd-i386-low.cc index 247a39797c4..ea6fce4c6f9 100644 --- a/gdbserver/netbsd-i386-low.cc +++ b/gdbserver/netbsd-i386-low.cc @@ -142,7 +142,7 @@ netbsd_i386_target::low_arch_setup () target_desc *tdesc = i386_create_target_description (X86_XSTATE_SSE_MASK, false, false); - init_target_desc (tdesc, i386_expedite_regs); + init_target_desc (tdesc, i386_expedite_regs, GDB_OSABI_NETBSD); current_process ()->tdesc = tdesc; } diff --git a/gdbserver/tdesc.cc b/gdbserver/tdesc.cc index d052f43c76e..da1287abbbe 100644 --- a/gdbserver/tdesc.cc +++ b/gdbserver/tdesc.cc @@ -53,7 +53,8 @@ void target_desc::accept (tdesc_element_visitor &v) const void init_target_desc (struct target_desc *tdesc, - const char **expedite_regs) + const char **expedite_regs, + enum gdb_osabi osabi) { int offset = 0; @@ -88,6 +89,8 @@ init_target_desc (struct target_desc *tdesc, int expedite_count = 0; while (expedite_regs[expedite_count] != nullptr) tdesc->expedite_regs.push_back (expedite_regs[expedite_count++]); + + set_tdesc_osabi (tdesc, osabi); #endif } diff --git a/gdbserver/tdesc.h b/gdbserver/tdesc.h index 4796b50b4d1..9264786de51 100644 --- a/gdbserver/tdesc.h +++ b/gdbserver/tdesc.h @@ -20,6 +20,7 @@ #define GDBSERVER_TDESC_H #include "gdbsupport/tdesc.h" +#include "gdbsupport/osabi.h" #include "regdef.h" #include @@ -81,10 +82,11 @@ void copy_target_description (struct target_desc *dest, const struct target_desc *src); /* Initialize TDESC, and then set its expedite_regs field to - EXPEDITE_REGS. */ + EXPEDITE_REGS and its osabi to OSABI. */ void init_target_desc (struct target_desc *tdesc, - const char **expedite_regs); + const char **expedite_regs, + enum gdb_osabi osabi); /* Return the current inferior's target description. Never returns NULL. */ diff --git a/gdbserver/win32-i386-low.cc b/gdbserver/win32-i386-low.cc index af641200a05..688e0123025 100644 --- a/gdbserver/win32-i386-low.cc +++ b/gdbserver/win32-i386-low.cc @@ -596,12 +596,12 @@ i386_arch_setup (void) #ifdef __x86_64__ tdesc = amd64_create_target_description (X86_XSTATE_SSE_MASK, false, false, false); - init_target_desc (tdesc, amd64_expedite_regs); + init_target_desc (tdesc, amd64_expedite_regs, WINDOWS_OSABI); win32_tdesc = tdesc; #endif tdesc = i386_create_target_description (X86_XSTATE_SSE_MASK, false, false); - init_target_desc (tdesc, i386_expedite_regs); + init_target_desc (tdesc, i386_expedite_regs, WINDOWS_OSABI); #ifdef __x86_64__ wow64_win32_tdesc = tdesc; #else diff --git a/gdbserver/win32-low.h b/gdbserver/win32-low.h index ff997df0a66..daed16a6ae6 100644 --- a/gdbserver/win32-low.h +++ b/gdbserver/win32-low.h @@ -21,6 +21,7 @@ #include #include "nat/windows-nat.h" +#include "gdbsupport/osabi.h" struct target_desc; @@ -31,6 +32,12 @@ extern const struct target_desc *win32_tdesc; extern const struct target_desc *wow64_win32_tdesc; #endif +#ifdef __CYGWIN__ +constexpr enum gdb_osabi WINDOWS_OSABI = GDB_OSABI_CYGWIN; +#else +constexpr enum gdb_osabi WINDOWS_OSABI = GDB_OSABI_WINDOWS; +#endif + struct win32_target_ops { /* Architecture-specific setup. */