Hi!

DWARF5 has a new 128-bit constant class form, this patch uses it
e.g. for __int128 values.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2016-10-17  Jakub Jelinek  <ja...@redhat.com>

        * dwarf2out.c (size_of_die, value_format, output_die): Use
        DW_FORM_data16 for 128-bit dw_val_class_const_double or
        dw_val_class_wide_int.

--- gcc/dwarf2out.c.jj  2016-10-17 11:45:03.000000000 +0200
+++ gcc/dwarf2out.c     2016-10-17 14:46:46.369083146 +0200
@@ -8591,14 +8591,14 @@ size_of_die (dw_die_ref die)
          break;
        case dw_val_class_const_double:
          size += HOST_BITS_PER_DOUBLE_INT / HOST_BITS_PER_CHAR;
-         if (HOST_BITS_PER_WIDE_INT >= 64)
+         if (HOST_BITS_PER_WIDE_INT >= (dwarf_version >= 5 ? 128 : 64))
            size++; /* block */
          break;
        case dw_val_class_wide_int:
          size += (get_full_len (*a->dw_attr_val.v.val_wide)
                   * HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR);
          if (get_full_len (*a->dw_attr_val.v.val_wide) * HOST_BITS_PER_WIDE_INT
-             > 64)
+             > (dwarf_version >= 5 ? 128 : 64))
            size++; /* block */
          break;
        case dw_val_class_vec:
@@ -8979,6 +8979,9 @@ value_format (dw_attr_node *a)
        case 32:
          return DW_FORM_data8;
        case 64:
+         if (dwarf_version >= 5)
+           return DW_FORM_data16;
+         /* FALLTHRU */
        default:
          return DW_FORM_block1;
        }
@@ -8993,6 +8996,10 @@ value_format (dw_attr_node *a)
          return DW_FORM_data4;
        case 64:
          return DW_FORM_data8;
+       case 128:
+         if (dwarf_version >= 5)
+           return DW_FORM_data16;
+         /* FALLTHRU */
        default:
          return DW_FORM_block1;
        }
@@ -9439,7 +9446,7 @@ output_die (dw_die_ref die)
          {
            unsigned HOST_WIDE_INT first, second;
 
-           if (HOST_BITS_PER_WIDE_INT >= 64)
+           if (HOST_BITS_PER_WIDE_INT >= (dwarf_version >= 5 ? 128 : 64))
              dw2_asm_output_data (1,
                                   HOST_BITS_PER_DOUBLE_INT
                                   / HOST_BITS_PER_CHAR,
@@ -9468,9 +9475,9 @@ output_die (dw_die_ref die)
            int i;
            int len = get_full_len (*a->dw_attr_val.v.val_wide);
            int l = HOST_BITS_PER_WIDE_INT / HOST_BITS_PER_CHAR;
-           if (len * HOST_BITS_PER_WIDE_INT > 64)
-             dw2_asm_output_data (1, get_full_len (*a->dw_attr_val.v.val_wide) 
* l,
-                                  NULL);
+           if (len * HOST_BITS_PER_WIDE_INT > (dwarf_version >= 5 ? 128 : 64))
+             dw2_asm_output_data (1, get_full_len (*a->dw_attr_val.v.val_wide)
+                                     * l, NULL);
 
            if (WORDS_BIG_ENDIAN)
              for (i = len - 1; i >= 0; --i)

        Jakub

Reply via email to