diff mbox

DWARF5 DW_FORM_data16 support

Message ID 20161017213929.GD7282@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Oct. 17, 2016, 9:39 p.m. UTC
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  <jakub@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.


	Jakub

Comments

Jason Merrill Oct. 31, 2016, 2:15 p.m. UTC | #1
On 10/17/2016 05:39 PM, Jakub Jelinek wrote:
> (dwarf_version >= 5 ? 128 : 64)

Please make this a macro.  OK with that change.

Jason
Jakub Jelinek Oct. 31, 2016, 4:44 p.m. UTC | #2
On Mon, Oct 31, 2016 at 10:15:11AM -0400, Jason Merrill wrote:
> On 10/17/2016 05:39 PM, Jakub Jelinek wrote:
> >(dwarf_version >= 5 ? 128 : 64)
> 
> Please make this a macro.  OK with that change.

DWARF_LARGEST_DATA_FORM_BITS ?  Or do you have better name?

	Jakub
Jason Merrill Oct. 31, 2016, 4:47 p.m. UTC | #3
On Mon, Oct 31, 2016 at 12:44 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Mon, Oct 31, 2016 at 10:15:11AM -0400, Jason Merrill wrote:
>> On 10/17/2016 05:39 PM, Jakub Jelinek wrote:
>> >(dwarf_version >= 5 ? 128 : 64)
>>
>> Please make this a macro.  OK with that change.
>
> DWARF_LARGEST_DATA_FORM_BITS ?  Or do you have better name?

Sounds good.

Jason
diff mbox

Patch

--- 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)