aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog18
-rw-r--r--gdb/s390-linux-tdep.c10
-rw-r--r--gdb/s390-linux-tdep.h2
-rw-r--r--gdb/s390-tdep.c23
-rw-r--r--gdb/s390-tdep.h3
5 files changed, 42 insertions, 14 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index d951360..be9bd69 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,21 @@
+2018-01-30 Philipp Rudo <prudo@linux.vnet.ibm.com>
+
+ * s390-linux-tdep.c: Remove includes "features/s390-linux32.c" and
+ "features/s390x-linux64.c".
+ (_initialize_s390_linux_tdep): Remove initialization of tdescs
+ s390_linux32 and s390x_linux64.
+ (s390_linux_init_abi_31, s390_linux_init_abi_64): Don't set
+ default tdesc.
+ * s390-tdep.c: Include "features/s390-linux32.c" and
+ "features/s390x-linux64.c".
+ (s390_tdesc_valid): Add check for tdesc_has_registers.
+ (s390_gdbarch_init): Make sure there is always a valid tdesc.
+ (_initialize_s390_tdep): Initialize tdesc_s390_linux32 and
+ tdesc_s390x_linux64.
+ * s390-linux-tdep.h: Move export of tdesc_s390_linux32 and
+ tdesc_s390x_linux64 to...
+ * s390-tdep.h: ...here.
+
2018-01-30 Pedro Alves <palves@redhat.com>
PR gdb/13211
diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c
index 9d13519..0e85e71 100644
--- a/gdb/s390-linux-tdep.c
+++ b/gdb/s390-linux-tdep.c
@@ -42,7 +42,6 @@
#include "trad-frame.h"
#include "xml-syscall.h"
-#include "features/s390-linux32.c"
#include "features/s390-linux32v1.c"
#include "features/s390-linux32v2.c"
#include "features/s390-linux64.c"
@@ -52,7 +51,6 @@
#include "features/s390-vx-linux64.c"
#include "features/s390-tevx-linux64.c"
#include "features/s390-gs-linux64.c"
-#include "features/s390x-linux64.c"
#include "features/s390x-linux64v1.c"
#include "features/s390x-linux64v2.c"
#include "features/s390x-te-linux64.c"
@@ -1158,9 +1156,6 @@ s390_linux_init_abi_31 (struct gdbarch_info info, struct gdbarch *gdbarch)
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
tdep->abi = ABI_LINUX_S390;
- if (!tdesc_has_registers (tdesc))
- tdesc = tdesc_s390_linux32;
- tdep->tdesc = tdesc;
s390_linux_init_abi_any (info, gdbarch);
@@ -1178,9 +1173,6 @@ s390_linux_init_abi_64 (struct gdbarch_info info, struct gdbarch *gdbarch)
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
tdep->abi = ABI_LINUX_ZSERIES;
- if (!tdesc_has_registers (tdesc))
- tdesc = tdesc_s390x_linux64;
- tdep->tdesc = tdesc;
s390_linux_init_abi_any (info, gdbarch);
@@ -1199,7 +1191,6 @@ _initialize_s390_linux_tdep (void)
s390_linux_init_abi_64);
/* Initialize the GNU/Linux target descriptions. */
- initialize_tdesc_s390_linux32 ();
initialize_tdesc_s390_linux32v1 ();
initialize_tdesc_s390_linux32v2 ();
initialize_tdesc_s390_linux64 ();
@@ -1209,7 +1200,6 @@ _initialize_s390_linux_tdep (void)
initialize_tdesc_s390_vx_linux64 ();
initialize_tdesc_s390_tevx_linux64 ();
initialize_tdesc_s390_gs_linux64 ();
- initialize_tdesc_s390x_linux64 ();
initialize_tdesc_s390x_linux64v1 ();
initialize_tdesc_s390x_linux64v2 ();
initialize_tdesc_s390x_te_linux64 ();
diff --git a/gdb/s390-linux-tdep.h b/gdb/s390-linux-tdep.h
index 6542464..a3288e3 100644
--- a/gdb/s390-linux-tdep.h
+++ b/gdb/s390-linux-tdep.h
@@ -48,7 +48,6 @@ extern const struct regset s390_gs_regset;
extern const struct regset s390_gsbc_regset;
/* GNU/Linux target descriptions. */
-extern struct target_desc *tdesc_s390_linux32;
extern struct target_desc *tdesc_s390_linux32v1;
extern struct target_desc *tdesc_s390_linux32v2;
extern struct target_desc *tdesc_s390_linux64;
@@ -58,7 +57,6 @@ extern struct target_desc *tdesc_s390_te_linux64;
extern struct target_desc *tdesc_s390_vx_linux64;
extern struct target_desc *tdesc_s390_tevx_linux64;
extern struct target_desc *tdesc_s390_gs_linux64;
-extern struct target_desc *tdesc_s390x_linux64;
extern struct target_desc *tdesc_s390x_linux64v1;
extern struct target_desc *tdesc_s390x_linux64v2;
extern struct target_desc *tdesc_s390x_te_linux64;
diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c
index 1f2a536..9626e05 100644
--- a/gdb/s390-tdep.c
+++ b/gdb/s390-tdep.c
@@ -40,6 +40,9 @@
#include "trad-frame.h"
#include "value.h"
+#include "features/s390-linux32.c"
+#include "features/s390x-linux64.c"
+
/* Holds the current set of options to be passed to the disassembler. */
static char *s390_disassembler_options;
@@ -6789,6 +6792,9 @@ s390_tdesc_valid (struct gdbarch_tdep *tdep,
const struct target_desc *tdesc = tdep->tdesc;
const struct tdesc_feature *feature;
+ if (!tdesc_has_registers (tdesc))
+ return false;
+
/* Core registers, i.e. general purpose and PSW. */
feature = tdesc_find_feature (tdesc, "org.gnu.gdb.s390.core");
if (feature == NULL)
@@ -6929,7 +6935,6 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
static const char *const stap_register_indirection_suffixes[] = { ")",
NULL };
- /* Otherwise create a new gdbarch for the specified machine type. */
struct gdbarch_tdep *tdep = s390_gdbarch_tdep_alloc ();
struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
struct tdesc_arch_data *tdesc_data = tdesc_data_alloc ();
@@ -7044,8 +7049,19 @@ s390_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
/* Initialize the OSABI. */
gdbarch_init_osabi (info, gdbarch);
+ /* Always create a default tdesc. Otherwise commands like 'set osabi'
+ cause GDB to crash with an internal error when the user tries to set
+ an unsupported OSABI. */
+ if (!tdesc_has_registers (tdesc))
+ {
+ if (info.bfd_arch_info->mach == bfd_mach_s390_31)
+ tdesc = tdesc_s390_linux32;
+ else
+ tdesc = tdesc_s390x_linux64;
+ }
+ tdep->tdesc = tdesc;
+
/* Check any target description for validity. */
- gdb_assert (tdesc_has_registers (tdep->tdesc));
if (!s390_tdesc_valid (tdep, tdesc_data))
{
tdesc_data_cleanup (tdesc_data);
@@ -7120,4 +7136,7 @@ _initialize_s390_tdep (void)
{
/* Hook us into the gdbarch mechanism. */
register_gdbarch_init (bfd_arch_s390, s390_gdbarch_init);
+
+ initialize_tdesc_s390_linux32 ();
+ initialize_tdesc_s390x_linux64 ();
}
diff --git a/gdb/s390-tdep.h b/gdb/s390-tdep.h
index 4a44da0..14530ce 100644
--- a/gdb/s390-tdep.h
+++ b/gdb/s390-tdep.h
@@ -315,4 +315,7 @@ extern struct value *s390_trad_frame_prev_register
(struct frame_info *this_frame, struct trad_frame_saved_reg saved_regs[],
int regnum);
+extern struct target_desc *tdesc_s390_linux32;
+extern struct target_desc *tdesc_s390x_linux64;
+
#endif /* S390_TDEP_H */