gdb/
Fix gcc-4.5 HEAD warnings for enum ada_operator. * Makefile.in (HFILES_NO_SRCDIR): Add ada-operator.inc. * ada-lang.h (enum ada_operator): Move it to ... * ada-operator.inc: ... a new file. * expression.h (enum exp_opcode): Include ada-operator.inc. New element OP_UNUSED_LAST. Update comment for OP_EXTENDED0. gdb/ Fix gcc-4.5 HEAD warnings for GDB_FORM_cached_string. * dwarf2read.c (GDB_FORM_cached_string) (dwarf_form_name <GDB_FORM_cached_string>): Remove. (struct attribute <dwarf_form>): Reduce the bit width. (struct attribute <string_is_canonical>, DW_STRING_IS_CANONICAL): New. (read_attribute_value <DW_FORM_string>) (read_attribute_value <DW_FORM_strp>): Initialize DW_STRING_IS_CANONICAL. (dwarf2_name, dump_die_shallow <DW_FORM_string>) (dump_die_shallow <DW_FORM_strp>): Update the code using former GDB_FORM_cached_string.
This commit is contained in:
parent
bc426d7a8b
commit
8285870aeb
@ -1,3 +1,24 @@
|
|||||||
|
2009-09-15 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||||
|
|
||||||
|
Fix gcc-4.5 HEAD warnings for enum ada_operator.
|
||||||
|
* Makefile.in (HFILES_NO_SRCDIR): Add ada-operator.inc.
|
||||||
|
* ada-lang.h (enum ada_operator): Move it to ...
|
||||||
|
* ada-operator.inc: ... a new file.
|
||||||
|
* expression.h (enum exp_opcode): Include ada-operator.inc.
|
||||||
|
New element OP_UNUSED_LAST. Update comment for OP_EXTENDED0.
|
||||||
|
|
||||||
|
Fix gcc-4.5 HEAD warnings for GDB_FORM_cached_string.
|
||||||
|
* dwarf2read.c (GDB_FORM_cached_string)
|
||||||
|
(dwarf_form_name <GDB_FORM_cached_string>): Remove.
|
||||||
|
(struct attribute <dwarf_form>): Reduce the bit width.
|
||||||
|
(struct attribute <string_is_canonical>, DW_STRING_IS_CANONICAL): New.
|
||||||
|
(read_attribute_value <DW_FORM_string>)
|
||||||
|
(read_attribute_value <DW_FORM_strp>): Initialize
|
||||||
|
DW_STRING_IS_CANONICAL.
|
||||||
|
(dwarf2_name, dump_die_shallow <DW_FORM_string>)
|
||||||
|
(dump_die_shallow <DW_FORM_strp>): Update the code using former
|
||||||
|
GDB_FORM_cached_string.
|
||||||
|
|
||||||
2009-09-14 Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com>
|
2009-09-14 Sergio Durigan Junior <sergiodj@linux.vnet.ibm.com>
|
||||||
|
|
||||||
* amd64-linux-tdep.c: Include xml-syscall.h header, define the XML
|
* amd64-linux-tdep.c: Include xml-syscall.h header, define the XML
|
||||||
|
@ -750,7 +750,7 @@ config/rs6000/nm-rs6000.h top.h bsd-kvm.h gdb-stabs.h reggroups.h \
|
|||||||
annotate.h sim-regno.h dictionary.h dfp.h main.h frame-unwind.h \
|
annotate.h sim-regno.h dictionary.h dfp.h main.h frame-unwind.h \
|
||||||
remote-fileio.h i386-linux-tdep.h vax-tdep.h objc-lang.h \
|
remote-fileio.h i386-linux-tdep.h vax-tdep.h objc-lang.h \
|
||||||
sentinel-frame.h bcache.h symfile.h windows-tdep.h linux-tdep.h \
|
sentinel-frame.h bcache.h symfile.h windows-tdep.h linux-tdep.h \
|
||||||
gdb_usleep.h jit.h xml-syscall.h
|
gdb_usleep.h jit.h xml-syscall.h ada-operator.inc
|
||||||
|
|
||||||
# Header files that already have srcdir in them, or which are in objdir.
|
# Header files that already have srcdir in them, or which are in objdir.
|
||||||
|
|
||||||
|
@ -79,92 +79,6 @@ struct ada_opname_map
|
|||||||
/* Defined in ada-lang.c */
|
/* Defined in ada-lang.c */
|
||||||
extern const struct ada_opname_map ada_opname_table[];
|
extern const struct ada_opname_map ada_opname_table[];
|
||||||
|
|
||||||
enum ada_operator
|
|
||||||
{
|
|
||||||
/* X IN A'RANGE(N). N is an immediate operand, surrounded by
|
|
||||||
BINOP_IN_BOUNDS before and after. A is an array, X an index
|
|
||||||
value. Evaluates to true iff X is within range of the Nth
|
|
||||||
dimension (1-based) of A. (A multi-dimensional array
|
|
||||||
type is represented as array of array of ...) */
|
|
||||||
BINOP_IN_BOUNDS = OP_EXTENDED0,
|
|
||||||
|
|
||||||
/* X IN L .. U. True iff L <= X <= U. */
|
|
||||||
TERNOP_IN_RANGE,
|
|
||||||
|
|
||||||
/* Ada attributes ('Foo). */
|
|
||||||
OP_ATR_FIRST,
|
|
||||||
OP_ATR_LAST,
|
|
||||||
OP_ATR_LENGTH,
|
|
||||||
OP_ATR_IMAGE,
|
|
||||||
OP_ATR_MAX,
|
|
||||||
OP_ATR_MIN,
|
|
||||||
OP_ATR_MODULUS,
|
|
||||||
OP_ATR_POS,
|
|
||||||
OP_ATR_SIZE,
|
|
||||||
OP_ATR_TAG,
|
|
||||||
OP_ATR_VAL,
|
|
||||||
|
|
||||||
/* Ada type qualification. It is encoded as for UNOP_CAST, above,
|
|
||||||
and denotes the TYPE'(EXPR) construct. */
|
|
||||||
UNOP_QUAL,
|
|
||||||
|
|
||||||
/* X IN TYPE. The `TYPE' argument is immediate, with
|
|
||||||
UNOP_IN_RANGE before and after it. True iff X is a member of
|
|
||||||
type TYPE (typically a subrange). */
|
|
||||||
UNOP_IN_RANGE,
|
|
||||||
|
|
||||||
/* An aggregate. A single immediate operand, N>0, gives
|
|
||||||
the number of component specifications that follow. The
|
|
||||||
immediate operand is followed by a second OP_AGGREGATE.
|
|
||||||
Next come N component specifications. A component
|
|
||||||
specification is either an OP_OTHERS (others=>...), an
|
|
||||||
OP_CHOICES (for named associations), or other expression (for
|
|
||||||
positional aggregates only). Aggregates currently
|
|
||||||
occur only as the right sides of assignments. */
|
|
||||||
OP_AGGREGATE,
|
|
||||||
|
|
||||||
/* An others clause. Followed by a single expression. */
|
|
||||||
OP_OTHERS,
|
|
||||||
|
|
||||||
/* An aggregate component association. A single immediate operand, N,
|
|
||||||
gives the number of choices that follow. This is followed by a second
|
|
||||||
OP_CHOICES operator. Next come N operands, each of which is an
|
|
||||||
expression, an OP_DISCRETE_RANGE, or an OP_NAME---the latter
|
|
||||||
for a simple name that must be a record component name and does
|
|
||||||
not correspond to a single existing symbol. After the N choice
|
|
||||||
indicators comes an expression giving the value.
|
|
||||||
|
|
||||||
In an aggregate such as (X => E1, ...), where X is a simple
|
|
||||||
name, X could syntactically be either a component_selector_name
|
|
||||||
or an expression used as a discrete_choice, depending on the
|
|
||||||
aggregate's type context. Since this is not known at parsing
|
|
||||||
time, we don't attempt to disambiguate X if it has multiple
|
|
||||||
definitions, but instead supply an OP_NAME. If X has a single
|
|
||||||
definition, we represent it with an OP_VAR_VALUE, even though
|
|
||||||
it may turn out to be within a record aggregate. Aggregate
|
|
||||||
evaluation can use either OP_NAMEs or OP_VAR_VALUEs to get a
|
|
||||||
record field name, and can evaluate OP_VAR_VALUE normally to
|
|
||||||
get its value as an expression. Unfortunately, we lose out in
|
|
||||||
cases where X has multiple meanings and is part of an array
|
|
||||||
aggregate. I hope these are not common enough to annoy users,
|
|
||||||
who can work around the problem in any case by putting
|
|
||||||
parentheses around X. */
|
|
||||||
OP_CHOICES,
|
|
||||||
|
|
||||||
/* A positional aggregate component association. The operator is
|
|
||||||
followed by a single integer indicating the position in the
|
|
||||||
aggregate (0-based), followed by a second OP_POSITIONAL. Next
|
|
||||||
follows a single expression giving the component value. */
|
|
||||||
OP_POSITIONAL,
|
|
||||||
|
|
||||||
/* A range of values. Followed by two expressions giving the
|
|
||||||
upper and lower bounds of the range. */
|
|
||||||
OP_DISCRETE_RANGE,
|
|
||||||
|
|
||||||
/* End marker */
|
|
||||||
OP_ADA_LAST
|
|
||||||
};
|
|
||||||
|
|
||||||
/* A tuple, (symbol, block), representing one instance of a
|
/* A tuple, (symbol, block), representing one instance of a
|
||||||
* symbol-lookup operation. */
|
* symbol-lookup operation. */
|
||||||
struct ada_symbol_info {
|
struct ada_symbol_info {
|
||||||
|
102
gdb/ada-operator.inc
Normal file
102
gdb/ada-operator.inc
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
/* Ada language operator definitions for GDB, the GNU debugger.
|
||||||
|
|
||||||
|
Copyright (C) 1992, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
|
||||||
|
2007, 2008, 2009 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of GDB.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
/* X IN A'RANGE(N). N is an immediate operand, surrounded by
|
||||||
|
BINOP_IN_BOUNDS before and after. A is an array, X an index
|
||||||
|
value. Evaluates to true iff X is within range of the Nth
|
||||||
|
dimension (1-based) of A. (A multi-dimensional array
|
||||||
|
type is represented as array of array of ...) */
|
||||||
|
BINOP_IN_BOUNDS = OP_EXTENDED0,
|
||||||
|
|
||||||
|
/* X IN L .. U. True iff L <= X <= U. */
|
||||||
|
TERNOP_IN_RANGE,
|
||||||
|
|
||||||
|
/* Ada attributes ('Foo). */
|
||||||
|
OP_ATR_FIRST,
|
||||||
|
OP_ATR_LAST,
|
||||||
|
OP_ATR_LENGTH,
|
||||||
|
OP_ATR_IMAGE,
|
||||||
|
OP_ATR_MAX,
|
||||||
|
OP_ATR_MIN,
|
||||||
|
OP_ATR_MODULUS,
|
||||||
|
OP_ATR_POS,
|
||||||
|
OP_ATR_SIZE,
|
||||||
|
OP_ATR_TAG,
|
||||||
|
OP_ATR_VAL,
|
||||||
|
|
||||||
|
/* Ada type qualification. It is encoded as for UNOP_CAST, above,
|
||||||
|
and denotes the TYPE'(EXPR) construct. */
|
||||||
|
UNOP_QUAL,
|
||||||
|
|
||||||
|
/* X IN TYPE. The `TYPE' argument is immediate, with
|
||||||
|
UNOP_IN_RANGE before and after it. True iff X is a member of
|
||||||
|
type TYPE (typically a subrange). */
|
||||||
|
UNOP_IN_RANGE,
|
||||||
|
|
||||||
|
/* An aggregate. A single immediate operand, N>0, gives
|
||||||
|
the number of component specifications that follow. The
|
||||||
|
immediate operand is followed by a second OP_AGGREGATE.
|
||||||
|
Next come N component specifications. A component
|
||||||
|
specification is either an OP_OTHERS (others=>...), an
|
||||||
|
OP_CHOICES (for named associations), or other expression (for
|
||||||
|
positional aggregates only). Aggregates currently
|
||||||
|
occur only as the right sides of assignments. */
|
||||||
|
OP_AGGREGATE,
|
||||||
|
|
||||||
|
/* An others clause. Followed by a single expression. */
|
||||||
|
OP_OTHERS,
|
||||||
|
|
||||||
|
/* An aggregate component association. A single immediate operand, N,
|
||||||
|
gives the number of choices that follow. This is followed by a second
|
||||||
|
OP_CHOICES operator. Next come N operands, each of which is an
|
||||||
|
expression, an OP_DISCRETE_RANGE, or an OP_NAME---the latter
|
||||||
|
for a simple name that must be a record component name and does
|
||||||
|
not correspond to a single existing symbol. After the N choice
|
||||||
|
indicators comes an expression giving the value.
|
||||||
|
|
||||||
|
In an aggregate such as (X => E1, ...), where X is a simple
|
||||||
|
name, X could syntactically be either a component_selector_name
|
||||||
|
or an expression used as a discrete_choice, depending on the
|
||||||
|
aggregate's type context. Since this is not known at parsing
|
||||||
|
time, we don't attempt to disambiguate X if it has multiple
|
||||||
|
definitions, but instead supply an OP_NAME. If X has a single
|
||||||
|
definition, we represent it with an OP_VAR_VALUE, even though
|
||||||
|
it may turn out to be within a record aggregate. Aggregate
|
||||||
|
evaluation can use either OP_NAMEs or OP_VAR_VALUEs to get a
|
||||||
|
record field name, and can evaluate OP_VAR_VALUE normally to
|
||||||
|
get its value as an expression. Unfortunately, we lose out in
|
||||||
|
cases where X has multiple meanings and is part of an array
|
||||||
|
aggregate. I hope these are not common enough to annoy users,
|
||||||
|
who can work around the problem in any case by putting
|
||||||
|
parentheses around X. */
|
||||||
|
OP_CHOICES,
|
||||||
|
|
||||||
|
/* A positional aggregate component association. The operator is
|
||||||
|
followed by a single integer indicating the position in the
|
||||||
|
aggregate (0-based), followed by a second OP_POSITIONAL. Next
|
||||||
|
follows a single expression giving the component value. */
|
||||||
|
OP_POSITIONAL,
|
||||||
|
|
||||||
|
/* A range of values. Followed by two expressions giving the
|
||||||
|
upper and lower bounds of the range. */
|
||||||
|
OP_DISCRETE_RANGE,
|
||||||
|
|
||||||
|
/* End marker */
|
||||||
|
OP_ADA_LAST,
|
@ -546,20 +546,17 @@ struct attr_abbrev
|
|||||||
ENUM_BITFIELD(dwarf_form) form : 16;
|
ENUM_BITFIELD(dwarf_form) form : 16;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Additional GDB-specific attribute forms. */
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
/* A string which has been updated to GDB's internal
|
|
||||||
representation (e.g. converted to canonical form) and does not
|
|
||||||
need to be updated again. */
|
|
||||||
GDB_FORM_cached_string = 0xff
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Attributes have a name and a value */
|
/* Attributes have a name and a value */
|
||||||
struct attribute
|
struct attribute
|
||||||
{
|
{
|
||||||
ENUM_BITFIELD(dwarf_attribute) name : 16;
|
ENUM_BITFIELD(dwarf_attribute) name : 16;
|
||||||
ENUM_BITFIELD(dwarf_form) form : 16;
|
ENUM_BITFIELD(dwarf_form) form : 15;
|
||||||
|
|
||||||
|
/* Has DW_STRING already been updated by dwarf2_canonicalize_name? This
|
||||||
|
field should be in u.str (existing only for DW_STRING) but it is kept
|
||||||
|
here for better struct attribute alignment. */
|
||||||
|
unsigned int string_is_canonical : 1;
|
||||||
|
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
char *str;
|
char *str;
|
||||||
@ -613,6 +610,7 @@ struct function_range
|
|||||||
/* Get at parts of an attribute structure */
|
/* Get at parts of an attribute structure */
|
||||||
|
|
||||||
#define DW_STRING(attr) ((attr)->u.str)
|
#define DW_STRING(attr) ((attr)->u.str)
|
||||||
|
#define DW_STRING_IS_CANONICAL(attr) ((attr)->string_is_canonical)
|
||||||
#define DW_UNSND(attr) ((attr)->u.unsnd)
|
#define DW_UNSND(attr) ((attr)->u.unsnd)
|
||||||
#define DW_BLOCK(attr) ((attr)->u.blk)
|
#define DW_BLOCK(attr) ((attr)->u.blk)
|
||||||
#define DW_SND(attr) ((attr)->u.snd)
|
#define DW_SND(attr) ((attr)->u.snd)
|
||||||
@ -7006,11 +7004,13 @@ read_attribute_value (struct attribute *attr, unsigned form,
|
|||||||
break;
|
break;
|
||||||
case DW_FORM_string:
|
case DW_FORM_string:
|
||||||
DW_STRING (attr) = read_string (abfd, info_ptr, &bytes_read);
|
DW_STRING (attr) = read_string (abfd, info_ptr, &bytes_read);
|
||||||
|
DW_STRING_IS_CANONICAL (attr) = 0;
|
||||||
info_ptr += bytes_read;
|
info_ptr += bytes_read;
|
||||||
break;
|
break;
|
||||||
case DW_FORM_strp:
|
case DW_FORM_strp:
|
||||||
DW_STRING (attr) = read_indirect_string (abfd, info_ptr, cu_header,
|
DW_STRING (attr) = read_indirect_string (abfd, info_ptr, cu_header,
|
||||||
&bytes_read);
|
&bytes_read);
|
||||||
|
DW_STRING_IS_CANONICAL (attr) = 0;
|
||||||
info_ptr += bytes_read;
|
info_ptr += bytes_read;
|
||||||
break;
|
break;
|
||||||
case DW_FORM_block:
|
case DW_FORM_block:
|
||||||
@ -9020,12 +9020,12 @@ dwarf2_name (struct die_info *die, struct dwarf2_cu *cu)
|
|||||||
to canonicalize them. */
|
to canonicalize them. */
|
||||||
return DW_STRING (attr);
|
return DW_STRING (attr);
|
||||||
default:
|
default:
|
||||||
if (attr->form != GDB_FORM_cached_string)
|
if (!DW_STRING_IS_CANONICAL (attr))
|
||||||
{
|
{
|
||||||
DW_STRING (attr)
|
DW_STRING (attr)
|
||||||
= dwarf2_canonicalize_name (DW_STRING (attr), cu,
|
= dwarf2_canonicalize_name (DW_STRING (attr), cu,
|
||||||
&cu->objfile->objfile_obstack);
|
&cu->objfile->objfile_obstack);
|
||||||
attr->form = GDB_FORM_cached_string;
|
DW_STRING_IS_CANONICAL (attr) = 1;
|
||||||
}
|
}
|
||||||
return DW_STRING (attr);
|
return DW_STRING (attr);
|
||||||
}
|
}
|
||||||
@ -9536,8 +9536,6 @@ dwarf_form_name (unsigned form)
|
|||||||
return "DW_FORM_flag_present";
|
return "DW_FORM_flag_present";
|
||||||
case DW_FORM_sig8:
|
case DW_FORM_sig8:
|
||||||
return "DW_FORM_sig8";
|
return "DW_FORM_sig8";
|
||||||
case GDB_FORM_cached_string:
|
|
||||||
return "GDB_FORM_cached_string";
|
|
||||||
default:
|
default:
|
||||||
return "DW_FORM_<unknown>";
|
return "DW_FORM_<unknown>";
|
||||||
}
|
}
|
||||||
@ -10090,10 +10088,10 @@ dump_die_shallow (struct ui_file *f, int indent, struct die_info *die)
|
|||||||
break;
|
break;
|
||||||
case DW_FORM_string:
|
case DW_FORM_string:
|
||||||
case DW_FORM_strp:
|
case DW_FORM_strp:
|
||||||
case GDB_FORM_cached_string:
|
fprintf_unfiltered (f, "string: \"%s\" (%s canonicalized)",
|
||||||
fprintf_unfiltered (f, "string: \"%s\"",
|
|
||||||
DW_STRING (&die->attrs[i])
|
DW_STRING (&die->attrs[i])
|
||||||
? DW_STRING (&die->attrs[i]) : "");
|
? DW_STRING (&die->attrs[i]) : "",
|
||||||
|
DW_STRING_IS_CANONICAL (&die->attrs[i]) ? "is" : "not");
|
||||||
break;
|
break;
|
||||||
case DW_FORM_flag:
|
case DW_FORM_flag:
|
||||||
if (DW_UNSND (&die->attrs[i]))
|
if (DW_UNSND (&die->attrs[i]))
|
||||||
|
@ -335,24 +335,27 @@ enum exp_opcode
|
|||||||
OP_DECFLOAT,
|
OP_DECFLOAT,
|
||||||
|
|
||||||
/* First extension operator. Individual language modules define
|
/* First extension operator. Individual language modules define
|
||||||
extra operators they need as constants with values
|
extra operators in *.inc include files below always starting with
|
||||||
OP_LANGUAGE_SPECIFIC0 + k, for k >= 0, using a separate
|
numbering at OP_EXTENDED0:
|
||||||
enumerated type definition:
|
|
||||||
enum foo_extension_operator {
|
|
||||||
BINOP_MOGRIFY = OP_EXTENDED0,
|
BINOP_MOGRIFY = OP_EXTENDED0,
|
||||||
BINOP_FROB,
|
BINOP_FROB,
|
||||||
...
|
... */
|
||||||
}; */
|
|
||||||
OP_EXTENDED0,
|
OP_EXTENDED0,
|
||||||
|
|
||||||
/* Last possible extension operator. Defined to provide an
|
/* Last possible extension operator. Defined to provide an
|
||||||
explicit and finite number of extended operators. */
|
explicit and finite number of extended operators. */
|
||||||
OP_EXTENDED_LAST = 0xff
|
OP_EXTENDED_LAST = 0xff,
|
||||||
/* NOTE: Eventually, we expect to convert to an object-oriented
|
/* NOTE: Eventually, we expect to convert to an object-oriented
|
||||||
formulation for expression operators that does away with the
|
formulation for expression operators that does away with the
|
||||||
need for these extension operators, and indeed for this
|
need for these extension operators, and indeed for this
|
||||||
entire enumeration type. Therefore, consider the OP_EXTENDED
|
entire enumeration type. Therefore, consider the OP_EXTENDED
|
||||||
definitions to be a temporary measure. */
|
definitions to be a temporary measure. */
|
||||||
|
|
||||||
|
/* Each language specific set of operators starts at OP_EXTENDED0. */
|
||||||
|
#include "ada-operator.inc"
|
||||||
|
|
||||||
|
/* Existing only to swallow the last comma (',') from last .inc file. */
|
||||||
|
OP_UNUSED_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
union exp_element
|
union exp_element
|
||||||
|
Loading…
Reference in New Issue
Block a user