diff options
author | Fred Fish <fnf@specifix.com> | 1992-02-17 15:23:05 +0000 |
---|---|---|
committer | Fred Fish <fnf@specifix.com> | 1992-02-17 15:23:05 +0000 |
commit | af2136245013fad2f72249258452d5f7154d5719 (patch) | |
tree | a1d01b427aac9cea01f557111439a2d7942c9552 /gdb | |
parent | d17c317cfe3b8bb50e78117fdaf652dc074d0c10 (diff) | |
download | gdb-af2136245013fad2f72249258452d5f7154d5719.zip gdb-af2136245013fad2f72249258452d5f7154d5719.tar.gz gdb-af2136245013fad2f72249258452d5f7154d5719.tar.bz2 |
When creating user defined types for subroutine and array types, check
first to see if a partial type already exists due to a forward reference,
and if so, bash it to fit.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/dwarfread.c | 50 |
2 files changed, 48 insertions, 8 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d2fcc6f..fe70698 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +Mon Feb 17 07:13:27 1992 Fred Fish (fnf at cygnus.com) + + * dwarfread.c (dwarf_read_array_type, read_subroutine_type): + When creating a new user defined type, check to see if a partial + type already exists, and if so, bash it to fit. + Thu Feb 13 17:14:28 1992 Fred Fish (fnf at cygnus.com) * elfread.c (elf_symtab_read): Fix code to correctly track diff --git a/gdb/dwarfread.c b/gdb/dwarfread.c index da2a87f..68b479d 100644 --- a/gdb/dwarfread.c +++ b/gdb/dwarfread.c @@ -1163,6 +1163,7 @@ static void DEFUN(dwarf_read_array_type, (dip), struct dieinfo *dip) { struct type *type; + struct type *utype; char *sub; char *subend; short temp; @@ -1180,14 +1181,26 @@ DEFUN(dwarf_read_array_type, (dip), struct dieinfo *dip) type = decode_subscr_data (sub, subend); if (type == NULL) { - type = alloc_utype (dip -> dieref, NULL); - TYPE_CODE (type) = TYPE_CODE_ARRAY; - TYPE_TARGET_TYPE (type) = builtin_type_int; - TYPE_LENGTH (type) = 1 * TYPE_LENGTH (TYPE_TARGET_TYPE (type)); + if ((utype = lookup_utype (dip -> dieref)) == NULL) + { + utype = alloc_utype (dip -> dieref, NULL); + } + TYPE_CODE (utype) = TYPE_CODE_ARRAY; + TYPE_TARGET_TYPE (utype) = builtin_type_int; + TYPE_LENGTH (utype) = 1 * TYPE_LENGTH (TYPE_TARGET_TYPE (utype)); } else { - type = alloc_utype (dip -> dieref, type); + if ((utype = lookup_utype (dip -> dieref)) == NULL) + { + (void) alloc_utype (dip -> dieref, type); + } + else + { + TYPE_CODE (utype) = TYPE_CODE_ARRAY; + TYPE_LENGTH (utype) = TYPE_LENGTH (type); + TYPE_TARGET_TYPE (utype) = TYPE_TARGET_TYPE (type); + } } } } @@ -1225,11 +1238,32 @@ DEFUN(read_subroutine_type, (dip, thisdie, enddie), char *thisdie AND char *enddie) { - struct type *type; + struct type *type; /* Type that this function returns */ + struct type *ftype; /* Function that returns above type */ + /* Decode the type that this subroutine returns */ + type = decode_die_type (dip); - type = lookup_function_type (type); - type = alloc_utype (dip -> dieref, type); + + /* Check to see if we already have a partially constructed user + defined type for this DIE, from a forward reference. */ + + if ((ftype = lookup_utype (dip -> dieref)) == NULL) + { + /* This is the first reference to one of these types. Make + a new one and place it in the user defined types. */ + ftype = lookup_function_type (type); + (void) alloc_utype (dip -> dieref, ftype); + } + else + { + /* We have an existing partially constructed type, so bash it + into the correct type. */ + TYPE_TARGET_TYPE (ftype) = type; + TYPE_FUNCTION_TYPE (type) = ftype; + TYPE_LENGTH (ftype) = 1; + TYPE_CODE (ftype) = TYPE_CODE_FUNC; + } } /* |