From: Fred Fish Date: Thu, 5 Dec 1991 05:09:20 +0000 (+0000) Subject: Arrange for enumeration members to be manipulated in source code order, X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=98618bf78adc8b432655d41f088e66556538e5df;p=deliverable%2Fbinutils-gdb.git Arrange for enumeration members to be manipulated in source code order, since they are stored in the Dwarf info in reverse order. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a5117bb531..a1cabeb13d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +Wed Dec 4 21:05:30 1991 Fred Fish (fnf at cygnus.com) + + * dwarfread (enum_type): Arrange for the order of enumeration + members to match the source code order; not the order in the + Dwarf information, which is explicitly reverse order. + Wed Dec 4 18:24:39 1991 John Gilmore (gnu at cygnus.com) * main.c (input_from_terminal_p): Check whether GDB has a diff --git a/gdb/dwarfread.c b/gdb/dwarfread.c index ad6c958772..56907f3b7b 100644 --- a/gdb/dwarfread.c +++ b/gdb/dwarfread.c @@ -1330,6 +1330,16 @@ DESCRIPTION Given a pointer to a die information structure for the die which starts an enumeration, process all the dies that define the members of the enumeration and return a type pointer for the enumeration. + + Note that the DWARF specification explicitly mandates that enum + constants occur in reverse order from the source program order, + for "consistency" and because this ordering is easier for many + compilers to generate. (Draft 5, sec 3.9.5, Enumeration type + Entries) + + Because gdb wants to see the enum members in program source + order, we have to ensure that the order gets reversed while + we are processing them. */ static struct type * @@ -1406,14 +1416,16 @@ DEFUN(enum_type, (dip), struct dieinfo *dip) nfields++; } } - /* Now create the vector of fields, and record how big it is. */ + /* Now create the vector of fields, and record how big it is. This is where + we reverse the order, by pulling the members of the list in reverse order + from how they were inserted. */ TYPE_NFIELDS (type) = nfields; TYPE_FIELDS (type) = (struct field *) obstack_alloc (symbol_obstack, sizeof (struct field) * nfields); /* Copy the saved-up fields into the field vector. */ - for (n = nfields; list; list = list -> next) + for (n = 0; (n < nfields) && (list != NULL); list = list -> next) { - TYPE_FIELD (type, --n) = list -> field; + TYPE_FIELD (type, n++) = list -> field; } return (type); }