diff options
author | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2016-09-06 17:25:31 +0200 |
---|---|---|
committer | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2016-09-06 17:25:31 +0200 |
commit | ae438bc5c06b770c00f37e4ed244707ce3ab9ff4 (patch) | |
tree | 71d6daa5077e18170324f6b5a00a431783588206 | |
parent | 5f3bceb68dd211be977eb61d5f1ea68e7de51b7a (diff) | |
download | gdb-ae438bc5c06b770c00f37e4ed244707ce3ab9ff4.zip gdb-ae438bc5c06b770c00f37e4ed244707ce3ab9ff4.tar.gz gdb-ae438bc5c06b770c00f37e4ed244707ce3ab9ff4.tar.bz2 |
Fix TYPE_SPECIFIC_FIELD for types created via arch_type
A type's TYPE_SPECIFIC_FIELD is supposed to be initialized as appropriate
for the type code. This does happen if the type is created via init_type,
but not if it created via arch_type.
Fixed by extracting the initialization logic into a new set_type_code
routine, which is then called from both places.
gdb/ChangeLog:
* gdbtypes.c (set_type_code): New function.
(init_type, arch_type): Use it.
Signed-off-by: Ulrich Weigand <ulrich.weigand@de.ibm.com>
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/gdbtypes.c | 42 |
2 files changed, 31 insertions, 16 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index fc64c9d..95627c2 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2016-09-05 Ulrich Weigand <uweigand@de.ibm.com> + * gdbtypes.c (set_type_code): New function. + (init_type, arch_type): Use it. + +2016-09-05 Ulrich Weigand <uweigand@de.ibm.com> + * ada-lang.c (ada_language_arch_info): Use gdbarch_long_double_bit instead of gdbarch_double_bit for "long_long_float". diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index ec5c17a..241bf08 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -2681,6 +2681,30 @@ allocate_gnat_aux_type (struct type *type) *(TYPE_GNAT_SPECIFIC (type)) = gnat_aux_default; } +/* Helper function to initialize a newly allocated type. Set type code + to CODE and initialize the type-specific fields accordingly. */ + +static void +set_type_code (struct type *type, enum type_code code) +{ + TYPE_CODE (type) = code; + + switch (code) + { + case TYPE_CODE_STRUCT: + case TYPE_CODE_UNION: + case TYPE_CODE_NAMESPACE: + INIT_CPLUS_SPECIFIC (type); + break; + case TYPE_CODE_FLT: + TYPE_SPECIFIC_FIELD (type) = TYPE_SPECIFIC_FLOATFORMAT; + break; + case TYPE_CODE_FUNC: + INIT_FUNC_SPECIFIC (type); + break; + } +} + /* Helper function to initialize the standard scalar types. If NAME is non-NULL, then it is used to initialize the type name. @@ -2694,7 +2718,7 @@ init_type (enum type_code code, int length, int flags, struct type *type; type = alloc_type (objfile); - TYPE_CODE (type) = code; + set_type_code (type, code); TYPE_LENGTH (type) = length; gdb_assert (!(flags & (TYPE_FLAG_MIN - 1))); @@ -2730,20 +2754,6 @@ init_type (enum type_code code, int length, int flags, if (name && strcmp (name, "char") == 0) TYPE_NOSIGN (type) = 1; - switch (code) - { - case TYPE_CODE_STRUCT: - case TYPE_CODE_UNION: - case TYPE_CODE_NAMESPACE: - INIT_CPLUS_SPECIFIC (type); - break; - case TYPE_CODE_FLT: - TYPE_SPECIFIC_FIELD (type) = TYPE_SPECIFIC_FLOATFORMAT; - break; - case TYPE_CODE_FUNC: - INIT_FUNC_SPECIFIC (type); - break; - } return type; } @@ -4634,7 +4644,7 @@ arch_type (struct gdbarch *gdbarch, struct type *type; type = alloc_type_arch (gdbarch); - TYPE_CODE (type) = code; + set_type_code (type, code); TYPE_LENGTH (type) = length; if (name) |