This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[RFC] ada support patch


This patch contains a few changes which are necessary to enable the
ada-* files to build and turn on ada support.

Unfortunately it causes a few regressions atm, which I need to track
down. But I figure it's worth throwing this out here so I can make
sure I'm on the right track.

ChangeLog:

	* defs.h (languages): Add language_ada to type.
	(ada_demangle, ada_attribute_name): Declare here from ada-lang.c.

	* expression.h (exp_opcode): Add BINOP_MBR, TERNOP_MBR,
	OP_UNRESOLVED_VALUE, OP_ATTRIBUTE, UNOP_QUAL, UNOP_MBR to type.
	(exp_element): Add name member.

	* gdbtypes.h (TYPE_FLAG_FIXED_INSTACE): New type.
	(base_type): New function.

	* parse.c (name_list): New type.
	(temp_name_list): New global.
	(add_name_string_cleanup): New function.

	* parser_defs.h (add_name_string_cleanup): Declare here from parse.c.

	* valarith.c (base_type): New function.

Patch:

Index: defs.h
===================================================================
RCS file: /cvs/src/src/gdb/defs.h,v
retrieving revision 1.94
diff -u -r1.94 defs.h
--- defs.h	1 Aug 2002 17:18:32 -0000	1.94
+++ defs.h	13 Sep 2002 00:08:38 -0000
@@ -214,7 +214,8 @@
     language_m2,		/* Modula-2 */
     language_asm,		/* Assembly language */
     language_scm,    		/* Scheme / Guile */
-    language_pascal		/* Pascal */
+    language_pascal,		/* Pascal */
+    language_ada		/* Ada */
   };
 
 enum precision_type
@@ -303,6 +304,14 @@
 /* OBSOLETE From ch-lang.c, for the moment. (FIXME) */
 
 /* OBSOLETE extern char *chill_demangle (const char *); */
+
+/* From ada-lang.c.  For some reason, it shouldn't be (see 
+   chill_demangle comment), but I have no idea what's wrong with this 
+   location for ada_demangle. */
+
+extern char *ada_demangle (const char*);
+
+extern const char *ada_attribute_name (int);
 
 /* From utils.c */
 
Index: expression.h
===================================================================
RCS file: /cvs/src/src/gdb/expression.h,v
retrieving revision 1.4
diff -u -r1.4 expression.h
--- expression.h	1 Aug 2002 17:18:32 -0000	1.4
+++ expression.h	13 Sep 2002 00:08:39 -0000
@@ -90,6 +90,10 @@
 
     /* end of C++.  */
 
+    /* Ada:  exp IN exp'RANGE(N).  N is an immediate operand, surrounded by 
+       BINOP_MBR before and after.  */
+    BINOP_MBR,
+
     /* For Modula-2 integer division DIV */
     BINOP_INTDIV,
 
@@ -131,6 +135,9 @@
        element OP2. */
     TERNOP_SLICE_COUNT,
 
+    /* Ada: exp IN exp .. exp */
+    TERNOP_MBR,
+
     /* Multidimensional subscript operator, such as Modula-2 x[a,b,...].
        The dimensionality is encoded in the operator, like the number of
        function arguments in OP_FUNCALL, I.E. <OP><dimension><OP>.
@@ -158,6 +165,17 @@
        executing in that block; if the block is NULL use the selected frame.  */
     OP_VAR_VALUE,
 
+    /* OP_UNRESOLVED_VALUE takes a single struct block* and a char* in the 
+       following exp_elements, followed by another OP_UNRESOLVED_VALUE.   The
+       block indicates where to begin looking for matching symbols.
+       This is for use with overloaded names in Ada, and must 
+       be resolved into an OP_VAR_VALUE before evaluation in EVAL_NORMAL
+       mode.  When evaluated in EVAL_AVOID_SIDE_EFFECTS mode, it is
+       resolved (if possible) to an OP_VAR_VALUE entry, with its block and
+       symbol entries replaced by the block and symbol from the resolving
+       entry. */
+    OP_UNRESOLVED_VALUE,
+
     /* OP_LAST is followed by an integer in the next exp_element.
        The integer is zero for the last value printed,
        or it is the absolute number of a history element.
@@ -192,6 +210,14 @@
        literal. It is followed by exactly two args that are doubles.  */
     OP_COMPLEX,
 
+    /* Ada attribute call.  OP_ATTRIBUTE is followed by an integer in the
+       next exp_element, which is the number of extra arguments to the attribute
+       (thus, x'tag would specify 0, whereas x'length would specify 1).  
+       The integer is followed by another integer indicating the identity of 
+       the attribute (of type enum ada_attribute, see ada-lang.h), and then
+       by a repeat of OP_ATTRIBUTE */
+    OP_ATTRIBUTE,
+
     /* OP_STRING represents a string constant.
        Its format is the same as that of a STRUCTOP, but the string
        data is just made into a string constant when the operation
@@ -220,6 +246,10 @@
        It casts the value of the following subexpression.  */
     UNOP_CAST,
 
+    /* UNOP_QUAL is Ada type qualification.  It is encoded as for
+       UNOP_CAST, above, and denotes the TYPE'(EXPR) construct. */
+    UNOP_QUAL,
+
     /* UNOP_MEMVAL is followed by a type pointer in the next exp_element
        With another UNOP_MEMVAL at the end, this makes three exp_elements.
        It casts the contents of the word addressed by the value of the
@@ -256,6 +286,10 @@
     /* (OBSOLETE) Chill (OBSOLETE) builtin functions. */
     UNOP_LOWER, UNOP_UPPER, UNOP_LENGTH, UNOP_CARD, UNOP_CHMAX, UNOP_CHMIN,
 
+    /* Ada: exp IN type.  The `type' argument is immediate, with UNOP_MBR 
+       before and after it. */
+    UNOP_MBR,
+
     OP_BOOL,			/* Modula-2 builtin BOOLEAN type */
     OP_M2_STRING,		/* Modula-2 string constants */
 
@@ -320,6 +354,7 @@
     struct type *type;
     struct internalvar *internalvar;
     struct block *block;
+    char* name;
   };
 
 struct expression
Index: gdbtypes.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbtypes.h,v
retrieving revision 1.35
diff -u -r1.35 gdbtypes.h
--- gdbtypes.h	10 Aug 2002 05:12:40 -0000	1.35
+++ gdbtypes.h	13 Sep 2002 00:08:44 -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,12 @@
 #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)
+
 struct main_type
 {
   /* Code for kind of type */
@@ -335,6 +340,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 +402,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 +1260,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.25
diff -u -r1.25 parse.c
--- parse.c	21 Jun 2002 14:32:10 -0000	1.25
+++ parse.c	13 Sep 2002 00:08:51 -0000
@@ -106,6 +106,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;
+
 /* The generic method for targets to specify how their registers are
    named.  The mapping can be derived from two sources: REGISTER_NAME;
    or builtin regs.  */
@@ -432,6 +441,20 @@
     }
   write_exp_elt_opcode (UNOP_MEMVAL);
 }
+
+/* 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:
 
Index: parser-defs.h
===================================================================
RCS file: /cvs/src/src/gdb/parser-defs.h,v
retrieving revision 1.11
diff -u -r1.11 parser-defs.h
--- parser-defs.h	24 Jul 2002 03:03:52 -0000	1.11
+++ parser-defs.h	13 Sep 2002 00:08:52 -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	13 Sep 2002 00:08:56 -0000
@@ -1162,6 +1162,22 @@
   return val;
 }
 
+/* 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: msg00237/pgp00000.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]