Re: [RFA] Add type support for Ada

Andrew Cagney
2002-09-27T02:24:34Z

[-- Attachment #1: Type: text/plain, Size: 137 bytes --]

To do a blatant side step, I think this should be reviewed by a
language maintainer. (I know sufficient Ada to be dangerous).

Andrew

[-- Attachment #2: mailbox-message://ac131313@movemail/fsf/gdb/patches#12870314 --]
[-- Type: message/rfc822, Size: 9039 bytes --]

[-- Attachment #2.1.1: Type: text/plain, Size: 5552 bytes --]

This patch adds some stuff to gdbtypes.h, parse.c, parser-defs.h and
valarith.c to support the ada-* files, and provide the infrastructure
needed for some of the more intrusive changes that are needed.

ChangeLog:

* gdbtypes.h (TYPE_FLAG_FIXED_INSTANCE, TYPE_FIXED_INSTANCE) New
definitions.
(base_type): Declare.
* parser-defs.h (add_name_string_cleanup): Declare.
* parse.c (name_list): New type.
(temp_name_list): New variable.
(add_name_string_cleanup): New function.
* valarith.c (base_type): New function.

Patch:

Index: gdbtypes.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbtypes.h,v
retrieving revision 1.36
diff -u -r1.36 gdbtypes.h
--- gdbtypes.h 14 Sep 2002 02:09:39 -0000 1.36
+++ gdbtypes.h 26 Sep 2002 02:35:55 -0000
@@ -197,7 +197,6 @@
#define TYPE_FLAG_VOLATILE (1 << 6)
#define TYPE_VOLATILE(t) (TYPE_INSTANCE_FLAGS (t) & TYPE_FLAG_VOLATILE)

-
/* This is a function type which appears to have a prototype. We need this
for function calls in order to tell us if it's necessary to coerce the args,
or to just do the standard conversions. This is used with a short field. */
@@ -253,6 +252,13 @@
#define TYPE_FLAG_VECTOR (1 << 12)
#define TYPE_VECTOR(t) (TYPE_FLAGS (t) & TYPE_FLAG_VECTOR)

+/* Marks a type that has been created from a template for a
+ dynamically sized type (e.g., GNAT arrays whose bounds are runtime
+ quantities). Optionally marks an ordinary, fixed-size GDB type. */
+
+#define TYPE_FLAG_FIXED_INSTANCE (1 << 13)
+#define TYPE_FIXED_INSTANCE(t) (TYPE_FLAGS (t) & TYPE_FLAG_FIXED_INSTANCE)
+
struct main_type
{
/* Code for kind of type */
@@ -335,6 +341,9 @@
For a function or method type, describes the type of the return value.
For a range type, describes the type of the full range.
For a complex type, describes the type of each coordinate.
+ For a special record or union type encoding a dynamic-sized type
+ in GNAT, a memoized pointer to a corresponding static version of
+ the type.
Unused otherwise. */

struct type *target_type;
@@ -394,7 +403,10 @@
says how many bytes the field occupies.
A value of -1 or -2 indicates a static field; -1 means the location
is specified by the label loc.physname; -2 means that loc.physaddr
- specifies the actual address. */
+ specifies the actual address.
+ If non-zero in an array type, indicates the element size in
+ bits (used only in Ada at the moment).
+ */

int bitsize;

@@ -1249,5 +1261,8 @@
extern int is_integral_type (struct type *);

extern void maintenance_print_type (char *, int);
+/* valarith.c */
+
+extern struct type* base_type (struct type*);

#endif /* GDBTYPES_H */
Index: parse.c
===================================================================
RCS file: /cvs/src/src/gdb/parse.c,v
retrieving revision 1.28
diff -u -r1.28 parse.c
--- parse.c 25 Sep 2002 20:30:37 -0000 1.28
+++ parse.c 26 Sep 2002 02:35:58 -0000
@@ -105,6 +105,15 @@

static struct funcall *funcall_chain;

+/* List of strings. */
+
+struct name_list {
+ struct name_list* next;
+ char* name;
+};
+
+static struct name_list *temp_name_list;
+
/* Begin counting arguments for a function call,
saving the data about any containing call. */

@@ -396,6 +405,20 @@
write_exp_elt_opcode (UNOP_MEMVAL);
}
\f
+
+/* Add S to the list of strings that will eventually have to be
+ released after parsing and must also be released on error. */
+void
+add_name_string_cleanup (char *s)
+{
+ struct name_list* elt =
+ (struct name_list*) xmalloc (sizeof (struct name_list));
+
+ elt -> name = s;
+ elt -> next = temp_name_list;
+ temp_name_list = elt;
+}
+
/* Recognize tokens that start with '$'. These include:

$regname A native register name or a "standard
Index: parser-defs.h
===================================================================
RCS file: /cvs/src/src/gdb/parser-defs.h,v
retrieving revision 1.14
diff -u -r1.14 parser-defs.h
--- parser-defs.h 25 Sep 2002 20:30:37 -0000 1.14
+++ parser-defs.h 26 Sep 2002 02:35:58 -0000
@@ -101,6 +101,8 @@
extern union type_stack_elt *type_stack;
extern int type_stack_depth, type_stack_size;

+extern void add_name_string_cleanup (char*);
+
extern void write_exp_elt (union exp_element);

extern void write_exp_elt_opcode (enum exp_opcode);
Index: valarith.c
===================================================================
RCS file: /cvs/src/src/gdb/valarith.c,v
retrieving revision 1.16
diff -u -r1.16 valarith.c
--- valarith.c 1 Aug 2002 17:18:33 -0000 1.16
+++ valarith.c 26 Sep 2002 02:36:00 -0000
@@ -1162,6 +1162,22 @@
return val;
}
\f
+/* The identity on non-range types. For range types, the underlying */
+/* non-range scalar type. */
+
+struct type*
+base_type (struct type* type)
+{
+ while (type != NULL && TYPE_CODE (type) == TYPE_CODE_RANGE)
+ {
+ if (type == TYPE_TARGET_TYPE (type)
+ || TYPE_TARGET_TYPE (type) == NULL)
+ return type;
+ type = TYPE_TARGET_TYPE (type);
+ }
+ return type;
+}
+
/* Simulate the C operator ! -- return 1 if ARG1 contains zero. */

int

- Aidan

--
aidan@velvet.net http://www.velvet.net/~aidan/ aim:aidans42
http://www.livejournal.com/users/aidan_skinner/
finger for pgp key: 01AA 1594 2DB0 09E3 B850 C2D0 9A2C 4CC9 3EC4 75E1

[-- Attachment #2.1.2: Type: application/pgp-signature, Size: 230 bytes --]