gdb/fortran: Handle gdbarch_floatformat_for_type returning nullptr
In this commit: commit34d11c682f
Date: Fri May 3 15:23:55 2019 +0100 gdb/fortran: Use floatformats_ia64_quad for fortran 16-byte floats GDB was changed such that the Fortran's 16-byte float format was obtained by calling gdbarch_floatformat_for_type instead of just using gdbarch_long_double_format as it was before. The problem with this default_floatformat_for_type can return NULL in some cases, and the code introduced in34d11c682f
didn't consider this. This commit introduces several alternative strategies for finding a suitable 16-byte floating point type. First GDB calls gdbarch_floatformat_for_type (this was what34d11c682f
added), if this returns null GDB will use gdbarch_long_double_format if it is the correct size (this was the format used before34d11c682f
). Finally, if neither of the above provides a suitable type then GDB will create a new dummy type. This final dummy type is unlikely to provide an correct debug experience as far as examining the 16-byte floats, but it should prevent GDB crashing. gdb/ChangeLog: PR gdb/18644: * f-lang.c (build_fortran_types): Handle the case where gdbarch_floatformat_for_type returns a nullptr.
This commit is contained in:
parent
b474a2022d
commit
dc42e902cc
@ -1,3 +1,9 @@
|
||||
2019-05-21 Andrew Burgess <andrew.burgess@embecosm.com>
|
||||
|
||||
PR gdb/18644:
|
||||
* f-lang.c (build_fortran_types): Handle the case where
|
||||
gdbarch_floatformat_for_type returns a nullptr.
|
||||
|
||||
2019-05-21 Tom de Vries <tdevries@suse.de>
|
||||
|
||||
PR cli/24587
|
||||
|
12
gdb/f-lang.c
12
gdb/f-lang.c
@ -728,8 +728,16 @@ build_fortran_types (struct gdbarch *gdbarch)
|
||||
= arch_float_type (gdbarch, gdbarch_double_bit (gdbarch),
|
||||
"real*8", gdbarch_double_format (gdbarch));
|
||||
auto fmt = gdbarch_floatformat_for_type (gdbarch, "real(kind=16)", 128);
|
||||
builtin_f_type->builtin_real_s16
|
||||
= arch_float_type (gdbarch, 128, "real*16", fmt);
|
||||
if (fmt != nullptr)
|
||||
builtin_f_type->builtin_real_s16
|
||||
= arch_float_type (gdbarch, 128, "real*16", fmt);
|
||||
else if (gdbarch_long_double_bit (gdbarch) == 128)
|
||||
builtin_f_type->builtin_real_s16
|
||||
= arch_float_type (gdbarch, gdbarch_long_double_bit (gdbarch),
|
||||
"real*16", gdbarch_long_double_format (gdbarch));
|
||||
else
|
||||
builtin_f_type->builtin_real_s16
|
||||
= arch_type (gdbarch, TYPE_CODE_ERROR, 128, "real*16");
|
||||
|
||||
builtin_f_type->builtin_complex_s8
|
||||
= arch_complex_type (gdbarch, "complex*8",
|
||||
|
Loading…
Reference in New Issue
Block a user