aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/dwarfread.c18
2 files changed, 21 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a5117bb..a1cabeb 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 ad6c958..56907f3 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);
}