[2/7] py-value: properly handle unsigned and pointer types

Message ID 1454606973-31017-3-git-send-email-jeffm@suse.com
State New, archived
Headers

Commit Message

Jeff Mahoney Feb. 4, 2016, 5:29 p.m. UTC
  From: Jeff Mahoney <jeffm@suse.com>

GDB passes signed long values into python whether they're signed or
not.  This results in a situation where the caller needs to convert
it back to an unsigned value, which requires knowledge of the underlying
size of the value.  The information to do that is available in the API,
but it's unnecessary.  We know it's an unsigned value so pass it as
an unsigned value.
---
 gdb/python/py-value.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)
  

Comments

Phil Muldoon Feb. 5, 2016, 12:12 p.m. UTC | #1
On 04/02/16 17:29, jeffm@suse.com wrote:
> From: Jeff Mahoney <jeffm@suse.com>
>
> GDB passes signed long values into python whether they're signed or
> not.  This results in a situation where the caller needs to convert
> it back to an unsigned value, which requires knowledge of the underlying
> size of the value.  The information to do that is available in the API,
> but it's unnecessary.  We know it's an unsigned value so pass it as
> an unsigned value.
> ---
>  gdb/python/py-value.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
>
> diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c
> index 140aaf5..c557d95 100644
> --- a/gdb/python/py-value.c
> +++ b/gdb/python/py-value.c
> @@ -1475,6 +1475,7 @@ valpy_int (PyObject *self)
>  {
>    struct value *value = ((value_object *) self)->value;
>    struct type *type = value_type (value);
> +  int is_unsigned = 0;
>    LONGEST l 
>>
>> jeff
>>
> = 0;
>  
>    TRY
> @@ -1482,6 +1483,9 @@ valpy_int (PyObject *self)
>        if (!is_integral_type (type))
>  	error (_("Cannot convert value to int."));
>  
> +      if (TYPE_CODE (type) == TYPE_CODE_PTR ||
> +	  TYPE_UNSIGNED(type))
Nit, space after the macro/function name and before (.
> +	is_unsigned = 1;
>        l = value_as_long (value);
>      }
>    CATCH (exc
>>
>> jeff
>>
> ept, RETURN_MASK_ALL)
> @@ -1490,6 +1494,8 @@ valpy_int (PyObject *self)
>      }
>    END_CATCH
>  
> +  if (is_unsigned)
> +    return gdb_py_object_from_ulongest ((ULONGEST)l);
>    return gdb_py_object_from_longest (l);
>  }
>  #endif
> @@ -1500,6 +1506,7 @@ valpy_long (PyObject *self)
>  {
>    struct value *value = ((value_object *) self)->value;
>    struct type *type = value_type (value);
> +  int is_unsigned = 0;
>    LONGEST l = 0;
>  
>    TRY
> @@ -1510,6 +1517,9 @@ valpy_long (PyObject *self)
>  	  && TYPE_CODE (type) != TYPE_CODE_PTR)
>  	error (_("Cannot convert value to long."));
>  
> +      if (TYPE_CODE (type) == TYPE_CODE_PTR ||
> +	  TYPE_UNSIGNED(type))
Nit, space after the macro/function name and before (.
> +	is_unsigned = 1;
>        l = value_as_long (value);
>      }
>    CATCH (except, RETURN_MASK_ALL)
> @@ -1518,6 +1528,8 @@ valpy_long (PyObject *self)
>      }
>    END_CATCH
>  
> +  if (is_unsigned)
> +    return gdb_py_long_from_ulongest ((ULONGEST)l);
>    return gdb_py_long_from_longest (l);
>  }
>  

Thanks. This needs tests and documentation changes for the changes in functionality.

Cheers

Phil
  
Phil Muldoon Feb. 5, 2016, 12:29 p.m. UTC | #2
> > Thanks. This needs tests and documentation changes for the changes in functionality. > > Cheers > > Phil

Something really weird is happening after my recent Fedora 23 install
with patch wrapping. I'll resend the replies when I've fixed it!

Cheers

Phil
  

Patch

diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c
index 140aaf5..c557d95 100644
--- a/gdb/python/py-value.c
+++ b/gdb/python/py-value.c
@@ -1475,6 +1475,7 @@  valpy_int (PyObject *self)
 {
   struct value *value = ((value_object *) self)->value;
   struct type *type = value_type (value);
+  int is_unsigned = 0;
   LONGEST l = 0;
 
   TRY
@@ -1482,6 +1483,9 @@  valpy_int (PyObject *self)
       if (!is_integral_type (type))
 	error (_("Cannot convert value to int."));
 
+      if (TYPE_CODE (type) == TYPE_CODE_PTR ||
+	  TYPE_UNSIGNED(type))
+	is_unsigned = 1;
       l = value_as_long (value);
     }
   CATCH (except, RETURN_MASK_ALL)
@@ -1490,6 +1494,8 @@  valpy_int (PyObject *self)
     }
   END_CATCH
 
+  if (is_unsigned)
+    return gdb_py_object_from_ulongest ((ULONGEST)l);
   return gdb_py_object_from_longest (l);
 }
 #endif
@@ -1500,6 +1506,7 @@  valpy_long (PyObject *self)
 {
   struct value *value = ((value_object *) self)->value;
   struct type *type = value_type (value);
+  int is_unsigned = 0;
   LONGEST l = 0;
 
   TRY
@@ -1510,6 +1517,9 @@  valpy_long (PyObject *self)
 	  && TYPE_CODE (type) != TYPE_CODE_PTR)
 	error (_("Cannot convert value to long."));
 
+      if (TYPE_CODE (type) == TYPE_CODE_PTR ||
+	  TYPE_UNSIGNED(type))
+	is_unsigned = 1;
       l = value_as_long (value);
     }
   CATCH (except, RETURN_MASK_ALL)
@@ -1518,6 +1528,8 @@  valpy_long (PyObject *self)
     }
   END_CATCH
 
+  if (is_unsigned)
+    return gdb_py_long_from_ulongest ((ULONGEST)l);
   return gdb_py_long_from_longest (l);
 }