aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Weigand <ulrich.weigand@de.ibm.com>2016-09-06 17:25:31 +0200
committerUlrich Weigand <ulrich.weigand@de.ibm.com>2016-09-06 17:25:31 +0200
commitae438bc5c06b770c00f37e4ed244707ce3ab9ff4 (patch)
tree71d6daa5077e18170324f6b5a00a431783588206
parent5f3bceb68dd211be977eb61d5f1ea68e7de51b7a (diff)
downloadgdb-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/ChangeLog5
-rw-r--r--gdb/gdbtypes.c42
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)