From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11088 invoked by alias); 26 Mar 2004 10:59:21 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 11081 invoked from network); 26 Mar 2004 10:59:17 -0000 Received: from unknown (HELO nile.gnat.com) (205.232.38.5) by sources.redhat.com with SMTP; 26 Mar 2004 10:59:17 -0000 Received: from localhost (localhost [127.0.0.1]) by nile.gnat.com (Postfix) with ESMTP id 84647F2D90 for ; Fri, 26 Mar 2004 05:59:16 -0500 (EST) Received: from nile.gnat.com ([127.0.0.1]) by localhost (nile.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 18049-01-8 for ; Fri, 26 Mar 2004 05:59:16 -0500 (EST) Received: by nile.gnat.com (Postfix, from userid 1345) id 3FAA5F2DA7; Fri, 26 Mar 2004 05:59:16 -0500 (EST) From: Paul Hilfinger To: gdb-patches@sources.redhat.com Subject: [RFA]: Extend some arithmetic operations to range types. Message-Id: <20040326105916.3FAA5F2DA7@nile.gnat.com> Date: Fri, 26 Mar 2004 10:59:00 -0000 X-Virus-Scanned: by amavisd-new at nile.gnat.com X-SW-Source: 2004-03/txt/msg00654.txt.bz2 The following patch extends a few operations on struct value*s that currently fail when an operand has a range type. For C/C++ these extensions have no effect, since those languages don't make use of range types, but it is an issue in Ada. Paul N. Hilfinger ACT, Inc. 2004-03-26 Paul N. Hilfinger * gdbtypes.c (base_type): New function. * gdbtypes.h (base_type): Declare. * valarith.c: Update copyright notice. (value_add): Handle range types. (value_sub): Ditto. (value_equal): Ditto. (value_less): Ditto. (value_neg): Ditto. (value_complement): Ditto. * value.h (COERCE_ENUM): Extend to ranges of enumerated types. Index: current-public.55/gdb/gdbtypes.c --- current-public.55/gdb/gdbtypes.c Fri, 12 Mar 2004 22:56:54 -0800 hilfingr (GdbPub/h/48_gdbtypes.c 1.1.1.5.1.1.1.1.1.1.3.1.1.1.1.1.2.1 644) +++ submit.47(w)/gdb/gdbtypes.c Sat, 13 Mar 2004 01:57:12 -0800 hilfingr (GdbPub/h/48_gdbtypes.c 1.1.1.5.1.1.1.1.1.1.3.1.1.1.1.1.2.1.1.1 644) @@ -720,6 +720,22 @@ get_discrete_bounds (struct type *type, } } +/* 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; +} + /* Create an array type using either a blank type supplied in RESULT_TYPE, or creating a new type, inheriting the objfile from RANGE_TYPE. Index: current-public.55/gdb/gdbtypes.h --- current-public.55/gdb/gdbtypes.h Mon, 09 Feb 2004 01:03:21 -0800 hilfingr (GdbPub/h/49_gdbtypes.h 1.1.1.3.1.1.1.1.1.1.3.1 644) +++ submit.47(w)/gdb/gdbtypes.h Sat, 06 Mar 2004 02:39:59 -0800 hilfingr (GdbPub/h/49_gdbtypes.h 1.1.1.3.1.1.1.1.1.1.3.1.1.1 644) @@ -1135,6 +1146,8 @@ extern struct type *lookup_function_type extern struct type *create_range_type (struct type *, struct type *, int, int); + +extern struct type* base_type (struct type*); extern struct type *create_array_type (struct type *, struct type *, struct type *); Index: current-public.55/gdb/valarith.c --- current-public.55/gdb/valarith.c Wed, 17 Sep 2003 23:22:28 -0700 hilfingr (GdbPub/l/16_valarith.c 1.1.1.3 644) +++ submit.47(w)/gdb/valarith.c Fri, 26 Mar 2004 01:48:40 -0800 hilfingr (GdbPub/l/16_valarith.c 1.1.1.3.2.1 644) @@ -1,7 +1,7 @@ /* Perform arithmetic and other operations on values, for GDB. Copyright 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, - 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software + 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of GDB. @@ -99,8 +99,8 @@ value_add (struct value *arg1, struct va if ((TYPE_CODE (type1) == TYPE_CODE_PTR || TYPE_CODE (type2) == TYPE_CODE_PTR) && - (TYPE_CODE (type1) == TYPE_CODE_INT - || TYPE_CODE (type2) == TYPE_CODE_INT)) + (TYPE_CODE (base_type (type1)) == TYPE_CODE_INT + || TYPE_CODE (base_type (type2)) == TYPE_CODE_INT)) /* Exactly one argument is a pointer, and one is an integer. */ { struct value *retval; @@ -141,7 +141,7 @@ value_sub (struct value *arg1, struct va if (TYPE_CODE (type1) == TYPE_CODE_PTR) { - if (TYPE_CODE (type2) == TYPE_CODE_INT) + if (TYPE_CODE (base_type (type2)) == TYPE_CODE_INT) { /* pointer - integer. */ LONGEST sz = find_size_for_pointer_math (type1); @@ -1227,8 +1227,8 @@ value_equal (struct value *arg1, struct type1 = check_typedef (VALUE_TYPE (arg1)); type2 = check_typedef (VALUE_TYPE (arg2)); - code1 = TYPE_CODE (type1); - code2 = TYPE_CODE (type2); + code1 = TYPE_CODE (base_type (type1)); + code2 = TYPE_CODE (base_type (type2)); if ((code1 == TYPE_CODE_INT || code1 == TYPE_CODE_BOOL) && (code2 == TYPE_CODE_INT || code2 == TYPE_CODE_BOOL)) @@ -1284,8 +1284,8 @@ value_less (struct value *arg1, struct v type1 = check_typedef (VALUE_TYPE (arg1)); type2 = check_typedef (VALUE_TYPE (arg2)); - code1 = TYPE_CODE (type1); - code2 = TYPE_CODE (type2); + code1 = TYPE_CODE (base_type (type1)); + code2 = TYPE_CODE (base_type (type2)); if ((code1 == TYPE_CODE_INT || code1 == TYPE_CODE_BOOL) && (code2 == TYPE_CODE_INT || code2 == TYPE_CODE_BOOL)) @@ -1323,7 +1323,7 @@ value_neg (struct value *arg1) COERCE_REF (arg1); COERCE_ENUM (arg1); - type = check_typedef (VALUE_TYPE (arg1)); + type = base_type (check_typedef (VALUE_TYPE (arg1))); if (TYPE_CODE (type) == TYPE_CODE_FLT) return value_from_double (result_type, -value_as_double (arg1)); @@ -1353,7 +1353,7 @@ value_complement (struct value *arg1) COERCE_REF (arg1); COERCE_ENUM (arg1); - type = check_typedef (VALUE_TYPE (arg1)); + type = base_type (check_typedef (VALUE_TYPE (arg1))); typecode = TYPE_CODE (type); if ((typecode != TYPE_CODE_INT) && (typecode != TYPE_CODE_BOOL)) Index: current-public.55/gdb/value.h --- current-public.55/gdb/value.h Thu, 30 Oct 2003 00:47:47 -0800 hilfingr (GdbPub/l/20_value.h 1.9 644) +++ submit.47(w)/gdb/value.h Fri, 26 Mar 2004 01:48:40 -0800 hilfingr (GdbPub/l/20_value.h 1.9.1.1 644) @@ -267,7 +267,7 @@ extern int value_fetch_lazy (struct valu #define COERCE_ENUM(arg) \ do { \ - if (TYPE_CODE (check_typedef (VALUE_TYPE (arg))) == TYPE_CODE_ENUM) \ + if (TYPE_CODE (base_type (check_typedef (VALUE_TYPE (arg)))) == TYPE_CODE_ENUM) \ arg = value_cast (builtin_type_unsigned_int, arg); \ } while (0)