gdb/guile: add get-basic-type

A question was asked on stackoverflow.com about the guile function
get-basic-type[1] which is mentioned in the docs along with an example
of its use.

The problem is, the function was apparently never actually added to
GDB.  But it turns out that it's pretty easy to implement, so lets add
it now.  Better late than never.

The implementation mirrors the Python get_basic_type function.  I've
added a test which is a copy of the documentation example.

One issue is that the docs suggest that the type will be returned as
just "int", however, I'm not sure what this actually means.  It makes
more sense that the function return a gdb:type object which would be
represented as "#<gdb:type int>", so I've updated the docs to show
this output.

[1] https://stackoverflow.com/questions/79058691/unbound-variable-get-basic-type-in-gdb-guile-session

Reviewed-By: Kevin Buettner <kevinb@redhat.com>
This commit is contained in:
Andrew Burgess 2024-10-06 20:32:16 +01:00
parent ced885161b
commit 9ee8849814
4 changed files with 29 additions and 1 deletions

View File

@ -3946,7 +3946,7 @@ Then in gdb:
(gdb) guile (use-modules (gdb) (gdb types))
(gdb) guile (define foo-ref (parse-and-eval "foo_ref"))
(gdb) guile (get-basic-type (value-type foo-ref))
int
#<gdb:type int>
@end smallexample
@end deffn

View File

@ -55,6 +55,25 @@
(search-class type))
(define-public (get-basic-type type)
"Return the \"basic\" type of a given type.
Arguments:
type: The type to reduce to its basic type.
Returns:
TYPE with const/volatile stripped away, and typedefs/references
converted to the underlying type."
(while (or (= (type-code type) TYPE_CODE_REF)
(= (type-code type) TYPE_CODE_RVALUE_REF)
(= (type-code type) TYPE_CODE_TYPEDEF))
(if (= (type-code type) TYPE_CODE_TYPEDEF)
(set! type (type-strip-typedefs type))
(set! type (type-target type))))
(type-unqualified type))
(define-public (make-enum-hashtable enum-type)
"Return a hash table from a program's enum type.

View File

@ -31,6 +31,10 @@ class derived : public base
derived d;
typedef const int const_int;
const_int foo (3);
const_int &foo_ref (foo);
int
main (void)
{

View File

@ -59,3 +59,8 @@ gdb_test "guile (define bad-enum-htab (make-enum-hashtable #f))" \
gdb_test "guile (define bad-enum-htab (make-enum-hashtable (lookup-type \"int\")))" \
"Wrong type argument in position 1 \\(expecting enum\\): #<gdb:type int>.*" \
"make-enum-hashtable from int"
gdb_test_no_output "guile (define foo-ref (parse-and-eval \"foo_ref\"))" \
"get foo-ref value"
gdb_test "guile (get-basic-type (value-type foo-ref))" "#<gdb:type int>" \
"check get-basic-type"