[wide-int 5/5] Add dump () method for gdb debugging

2014-04-25 Thread Richard Sandiford
This patch adds a dump () method so that it's easier to read the
contents of the various wide-int types in gdb.  I've deliberately not
done any extension for "small_prec" cases because I think here
we want to see the raw values as much as possible.

Tested on x86_64-linux-gnu.  OK to install?

Thanks,
Richard


Index: gcc/wide-int.cc
===
--- gcc/wide-int.cc 2014-04-25 14:48:03.263213403 +0100
+++ gcc/wide-int.cc 2014-04-25 14:48:25.186333842 +0100
@@ -2130,3 +2130,9 @@ wi::only_sign_bit_p (const wide_int_ref
 void gt_ggc_mx (widest_int *) { }
 void gt_pch_nx (widest_int *, void (*) (void *, void *), void *) { }
 void gt_pch_nx (widest_int *) { }
+
+template void wide_int::dump () const;
+template void generic_wide_int  >::dump () const;
+template void generic_wide_int  >::dump () const;
+template void offset_int::dump () const;
+template void widest_int::dump () const;
Index: gcc/wide-int.h
===
--- gcc/wide-int.h  2014-04-25 14:34:54.823652619 +0100
+++ gcc/wide-int.h  2014-04-25 14:48:06.218229309 +0100
@@ -709,6 +709,9 @@ #define INCDEC_OPERATOR(OP, DELTA) \
 #undef ASSIGNMENT_OPERATOR
 #undef INCDEC_OPERATOR
 
+  /* Debugging functions.  */
+  void dump () const;
+
   static const bool is_sign_extended
 = wi::int_traits  >::is_sign_extended;
 };
@@ -859,6 +862,23 @@ generic_wide_int ::operator = (
   return *this;
 }
 
+/* Dump the contents of the integer to stderr, for debugging.  */
+template 
+void
+generic_wide_int ::dump () const
+{
+  unsigned int len = this->get_len ();
+  const HOST_WIDE_INT *val = this->get_val ();
+  unsigned int precision = this->get_precision ();
+  fprintf (stderr, "[");
+  if (len * HOST_BITS_PER_WIDE_INT < precision)
+fprintf (stderr, "...,");
+  for (unsigned int i = 0; i < len - 1; ++i)
+fprintf (stderr, HOST_WIDE_INT_PRINT_HEX ",", val[len - 1 - i]);
+  fprintf (stderr, HOST_WIDE_INT_PRINT_HEX "], precision = %d\n",
+  val[0], precision);
+}
+
 namespace wi
 {
   template <>


Re: [wide-int 5/5] Add dump () method for gdb debugging

2014-04-25 Thread Kenneth Zadeck
don't you think that it would be easier to understand the number if you 
printed it largest index first, as in the routines in wide-int-print.cc?


kenny
On 04/25/2014 09:58 AM, Richard Sandiford wrote:

This patch adds a dump () method so that it's easier to read the
contents of the various wide-int types in gdb.  I've deliberately not
done any extension for "small_prec" cases because I think here
we want to see the raw values as much as possible.

Tested on x86_64-linux-gnu.  OK to install?

Thanks,
Richard


Index: gcc/wide-int.cc
===
--- gcc/wide-int.cc 2014-04-25 14:48:03.263213403 +0100
+++ gcc/wide-int.cc 2014-04-25 14:48:25.186333842 +0100
@@ -2130,3 +2130,9 @@ wi::only_sign_bit_p (const wide_int_ref
  void gt_ggc_mx (widest_int *) { }
  void gt_pch_nx (widest_int *, void (*) (void *, void *), void *) { }
  void gt_pch_nx (widest_int *) { }
+
+template void wide_int::dump () const;
+template void generic_wide_int  >::dump () const;
+template void generic_wide_int  >::dump () const;
+template void offset_int::dump () const;
+template void widest_int::dump () const;
Index: gcc/wide-int.h
===
--- gcc/wide-int.h  2014-04-25 14:34:54.823652619 +0100
+++ gcc/wide-int.h  2014-04-25 14:48:06.218229309 +0100
@@ -709,6 +709,9 @@ #define INCDEC_OPERATOR(OP, DELTA) \
  #undef ASSIGNMENT_OPERATOR
  #undef INCDEC_OPERATOR
  
+  /* Debugging functions.  */

+  void dump () const;
+
static const bool is_sign_extended
  = wi::int_traits  >::is_sign_extended;
  };
@@ -859,6 +862,23 @@ generic_wide_int ::operator = (
return *this;
  }
  
+/* Dump the contents of the integer to stderr, for debugging.  */

+template 
+void
+generic_wide_int ::dump () const
+{
+  unsigned int len = this->get_len ();
+  const HOST_WIDE_INT *val = this->get_val ();
+  unsigned int precision = this->get_precision ();
+  fprintf (stderr, "[");
+  if (len * HOST_BITS_PER_WIDE_INT < precision)
+fprintf (stderr, "...,");
+  for (unsigned int i = 0; i < len - 1; ++i)
+fprintf (stderr, HOST_WIDE_INT_PRINT_HEX ",", val[len - 1 - i]);
+  fprintf (stderr, HOST_WIDE_INT_PRINT_HEX "], precision = %d\n",
+  val[0], precision);
+}
+
  namespace wi
  {
template <>




Re: [wide-int 5/5] Add dump () method for gdb debugging

2014-04-26 Thread Richard Sandiford
Kenneth Zadeck  writes:
> don't you think that it would be easier to understand the number if you 
> printed it largest index first, as in the routines in wide-int-print.cc?

Yeah, that's what the patch does.  E.g. (for 32-bit HWI):

  [...,0x3,0x8000]

is 7 << 31.

Thanks,
Richard

>
> kenny
> On 04/25/2014 09:58 AM, Richard Sandiford wrote:
>> This patch adds a dump () method so that it's easier to read the
>> contents of the various wide-int types in gdb.  I've deliberately not
>> done any extension for "small_prec" cases because I think here
>> we want to see the raw values as much as possible.
>>
>> Tested on x86_64-linux-gnu.  OK to install?
>>
>> Thanks,
>> Richard
>>
>>
>> Index: gcc/wide-int.cc
>> ===
>> --- gcc/wide-int.cc  2014-04-25 14:48:03.263213403 +0100
>> +++ gcc/wide-int.cc  2014-04-25 14:48:25.186333842 +0100
>> @@ -2130,3 +2130,9 @@ wi::only_sign_bit_p (const wide_int_ref
>>   void gt_ggc_mx (widest_int *) { }
>>   void gt_pch_nx (widest_int *, void (*) (void *, void *), void *) { }
>>   void gt_pch_nx (widest_int *) { }
>> +
>> +template void wide_int::dump () const;
>> +template void generic_wide_int  >::dump () 
>> const;
>> +template void generic_wide_int  >::dump () 
>> const;
>> +template void offset_int::dump () const;
>> +template void widest_int::dump () const;
>> Index: gcc/wide-int.h
>> ===
>> --- gcc/wide-int.h   2014-04-25 14:34:54.823652619 +0100
>> +++ gcc/wide-int.h   2014-04-25 14:48:06.218229309 +0100
>> @@ -709,6 +709,9 @@ #define INCDEC_OPERATOR(OP, DELTA) \
>>   #undef ASSIGNMENT_OPERATOR
>>   #undef INCDEC_OPERATOR
>>   
>> +  /* Debugging functions.  */
>> +  void dump () const;
>> +
>> static const bool is_sign_extended
>>   = wi::int_traits  >::is_sign_extended;
>>   };
>> @@ -859,6 +862,23 @@ generic_wide_int ::operator = (
>> return *this;
>>   }
>>   
>> +/* Dump the contents of the integer to stderr, for debugging.  */
>> +template 
>> +void
>> +generic_wide_int ::dump () const
>> +{
>> +  unsigned int len = this->get_len ();
>> +  const HOST_WIDE_INT *val = this->get_val ();
>> +  unsigned int precision = this->get_precision ();
>> +  fprintf (stderr, "[");
>> +  if (len * HOST_BITS_PER_WIDE_INT < precision)
>> +fprintf (stderr, "...,");
>> +  for (unsigned int i = 0; i < len - 1; ++i)
>> +fprintf (stderr, HOST_WIDE_INT_PRINT_HEX ",", val[len - 1 - i]);
>> +  fprintf (stderr, HOST_WIDE_INT_PRINT_HEX "], precision = %d\n",
>> +   val[0], precision);
>> +}
>> +
>>   namespace wi
>>   {
>> template <>


Re: [wide-int 5/5] Add dump () method for gdb debugging

2014-04-26 Thread Kenneth Zadeck
i am sorry, i missed the fact that the loop counts up but you were 
reversing the order in the indexes.


kenny
On 04/26/2014 04:26 AM, Richard Sandiford wrote:

Kenneth Zadeck  writes:

don't you think that it would be easier to understand the number if you
printed it largest index first, as in the routines in wide-int-print.cc?

Yeah, that's what the patch does.  E.g. (for 32-bit HWI):

   [...,0x3,0x8000]

is 7 << 31.

Thanks,
Richard


kenny
On 04/25/2014 09:58 AM, Richard Sandiford wrote:

This patch adds a dump () method so that it's easier to read the
contents of the various wide-int types in gdb.  I've deliberately not
done any extension for "small_prec" cases because I think here
we want to see the raw values as much as possible.

Tested on x86_64-linux-gnu.  OK to install?

Thanks,
Richard


Index: gcc/wide-int.cc
===
--- gcc/wide-int.cc 2014-04-25 14:48:03.263213403 +0100
+++ gcc/wide-int.cc 2014-04-25 14:48:25.186333842 +0100
@@ -2130,3 +2130,9 @@ wi::only_sign_bit_p (const wide_int_ref
   void gt_ggc_mx (widest_int *) { }
   void gt_pch_nx (widest_int *, void (*) (void *, void *), void *) { }
   void gt_pch_nx (widest_int *) { }
+
+template void wide_int::dump () const;
+template void generic_wide_int  >::dump () const;
+template void generic_wide_int  >::dump () const;
+template void offset_int::dump () const;
+template void widest_int::dump () const;
Index: gcc/wide-int.h
===
--- gcc/wide-int.h  2014-04-25 14:34:54.823652619 +0100
+++ gcc/wide-int.h  2014-04-25 14:48:06.218229309 +0100
@@ -709,6 +709,9 @@ #define INCDEC_OPERATOR(OP, DELTA) \
   #undef ASSIGNMENT_OPERATOR
   #undef INCDEC_OPERATOR
   
+  /* Debugging functions.  */

+  void dump () const;
+
 static const bool is_sign_extended
   = wi::int_traits  >::is_sign_extended;
   };
@@ -859,6 +862,23 @@ generic_wide_int ::operator = (
 return *this;
   }
   
+/* Dump the contents of the integer to stderr, for debugging.  */

+template 
+void
+generic_wide_int ::dump () const
+{
+  unsigned int len = this->get_len ();
+  const HOST_WIDE_INT *val = this->get_val ();
+  unsigned int precision = this->get_precision ();
+  fprintf (stderr, "[");
+  if (len * HOST_BITS_PER_WIDE_INT < precision)
+fprintf (stderr, "...,");
+  for (unsigned int i = 0; i < len - 1; ++i)
+fprintf (stderr, HOST_WIDE_INT_PRINT_HEX ",", val[len - 1 - i]);
+  fprintf (stderr, HOST_WIDE_INT_PRINT_HEX "], precision = %d\n",
+  val[0], precision);
+}
+
   namespace wi
   {
 template <>