106 lines
3.0 KiB
Diff
106 lines
3.0 KiB
Diff
commit ae438bc5c06b770c00f37e4ed244707ce3ab9ff4
|
||
Author: Ulrich Weigand <ulrich.weigand@de.ibm.com>
|
||
Date: Tue Sep 6 17:25:31 2016 +0200
|
||
|
||
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>
|
||
|
||
### 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".
|
||
|
||
--- 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)
|