[PATCH] dwarf2out: For ppc64le IEEE quad long double, use DW_ATE_GNU_*float128 [PR104194]
Jakub Jelinek
jakub@redhat.com
Mon Jan 24 19:34:39 GMT 2022
Hi!
As mentioned in the PR, we emit the same
.uleb128 0x3 # (DIE (0x42) DW_TAG_base_type)
.byte 0x10 # DW_AT_byte_size
.byte 0x4 # DW_AT_encoding
.4byte .LASF2 # DW_AT_name: "long double"
(0x4 is DW_ATE_float) whether we on powerpc64le-linux use
-mabi=ibmlongdouble or -mabi=ieeelongdouble.
http://lists.dwarfstd.org/pipermail/dwarf-discuss-dwarfstd.org/2022-January/004859.html
lists some options how to handle that and Ulrich mentioned it in his
Cauldron talk too:
https://slideslive.com/38902369/precise-target-floatingpoint-emulation-in-gdb?ref=account-folder-9307-folders
pages 8-16.
The following patch uses DW_ATE_GNU_{,complex_}float128 (new extensions
equal to corresponding HP extensions) instead of DW_ATE_float,
another possibility would be DW_ATE_GNU_precision attribute on the
DW_TAG_base_type that would for these multiple 16-byte float cases
(or always) emit a precision (113 for binary128, 106 for double double),
yet another one is what Ulrich mentions in his slides
(DW_AT_GNU_encoding_variant {0,1}).
I didn't get any responses to my dwarf discuss mails yet, on IRC
Jason preferred a DW_AT_encoding change while Mark prefered
DW_AT_GNU_precision. In any case, all of these are just GNU extensions,
if/when DWARF standardizes something else, we can use it for -gdwarf-6
or later.
Bootstrap/regtest pending on powerpc64le-linux (both defaulting to
ibmlongdouble and ieeelongdouble), ok for trunk if it passes?
2022-01-24 Jakub Jelinek <jakub@redhat.com>
PR debug/104194
* dwarf2.def (DW_ATE_GNU_float128, DW_ATE_GNU_complex_float128): New
DW_AT_encoding values.
* dwarf2out.c (base_type_die): Use DW_ATE_GNU_float128 instead of
DW_ATE_float for 16-byte non-composite mode if target supports also
composite modes. Similarly use DW_AT_GNU_complex_float128 instead
of DW_ATE_complex_float for 32-byte complex mode with non-composite
inner mode if target supports also composite modes.
--- include/dwarf2.def.jj 2022-01-11 23:11:23.593273249 +0100
+++ include/dwarf2.def 2022-01-24 17:46:08.699138085 +0100
@@ -732,11 +732,20 @@ DW_ATE (DW_ATE_ASCII, 0x12)
DW_ATE_DUP (DW_ATE_lo_user, 0x80)
DW_ATE_DUP (DW_ATE_hi_user, 0xff)
+/* GNU extensions. */
+DW_ATE (DW_ATE_GNU_float128, 0x82) /* Floating-point (IEEE quad precision if
+ there are multiple 16-byte floating
+ formats). */
+DW_ATE (DW_ATE_GNU_complex_float128, 0x83) /* Complex fp
+ (IEEE quad precision if there
+ are multiple 16-byte floating
+ formats). */
+
/* HP extensions. */
DW_ATE (DW_ATE_HP_float80, 0x80) /* Floating-point (80 bit). */
DW_ATE (DW_ATE_HP_complex_float80, 0x81) /* Complex floating-point (80 bit). */
-DW_ATE (DW_ATE_HP_float128, 0x82) /* Floating-point (128 bit). */
-DW_ATE (DW_ATE_HP_complex_float128, 0x83) /* Complex fp (128 bit). */
+DW_ATE_DUP (DW_ATE_HP_float128, 0x82) /* Floating-point (128 bit). */
+DW_ATE_DUP (DW_ATE_HP_complex_float128, 0x83) /* Complex fp (128 bit). */
DW_ATE (DW_ATE_HP_floathpintel, 0x84) /* Floating-point (82 bit IA64). */
DW_ATE (DW_ATE_HP_imaginary_float80, 0x85)
DW_ATE (DW_ATE_HP_imaginary_float128, 0x86)
--- gcc/dwarf2out.cc.jj 2022-01-20 11:58:12.632304188 +0100
+++ gcc/dwarf2out.cc 2022-01-24 18:27:12.862642858 +0100
@@ -13260,7 +13260,23 @@ base_type_die (tree type, bool reverse)
encoding = DW_ATE_lo_user;
}
else
- encoding = DW_ATE_float;
+ {
+ encoding = DW_ATE_float;
+
+ /* On targets like PowerPC which support both
+ a double double 16-byte floating mode
+ (MODE_COMPOSITE_P) and some other 16-byte
+ floating mode (IEEE quad precision), use
+ DW_ATE_GNU_float128 instead of DW_ATE_float
+ for the latter. */
+ machine_mode mode;
+ if (known_eq (GET_MODE_SIZE (TYPE_MODE (type)), 16)
+ && !MODE_COMPOSITE_P (TYPE_MODE (type)))
+ FOR_EACH_MODE_IN_CLASS (mode, MODE_FLOAT)
+ if (known_eq (GET_MODE_SIZE (mode), 16)
+ && MODE_COMPOSITE_P (mode))
+ encoding = DW_ATE_GNU_float128;
+ }
break;
case FIXED_POINT_TYPE:
@@ -13276,7 +13292,23 @@ base_type_die (tree type, bool reverse)
a user defined type for it. */
case COMPLEX_TYPE:
if (TREE_CODE (TREE_TYPE (type)) == REAL_TYPE)
- encoding = DW_ATE_complex_float;
+ {
+ encoding = DW_ATE_complex_float;
+
+ /* On targets like PowerPC which support both
+ a double double 16-byte floating mode
+ (MODE_COMPOSITE_P) and some other 16-byte
+ floating mode (IEEE quad precision), use
+ DW_ATE_GNU_complex_float128 instead of
+ DW_ATE_float for the latter. */
+ machine_mode mode;
+ if (known_eq (GET_MODE_SIZE (TYPE_MODE (type)), 32)
+ && !MODE_COMPOSITE_P (TYPE_MODE (TREE_TYPE (type))))
+ FOR_EACH_MODE_IN_CLASS (mode, MODE_FLOAT)
+ if (known_eq (GET_MODE_SIZE (mode), 16)
+ && MODE_COMPOSITE_P (mode))
+ encoding = DW_ATE_GNU_complex_float128;
+ }
else
encoding = DW_ATE_lo_user;
break;
Jakub
More information about the Gcc-patches
mailing list