This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[9/10] Convert Fortran types to per-gdbarch data
- From: "Ulrich Weigand" <uweigand at de dot ibm dot com>
- To: gdb-patches at sourceware dot org
- Date: Sat, 9 Jun 2007 01:18:15 +0200 (CEST)
- Subject: [9/10] Convert Fortran types to per-gdbarch data
Hello,
the one set of remaining gdbarch-swapped types is the Fortran built-in types.
This patch adds a builtin_f_type per-gdbarch data structure, and replaces the
global Fortran types with compatibility macros referring to that structure,
just like the main builtin_type is handled.
Bye,
Ulrich
ChangeLog:
* gdbtypes.h (builtin_type_f_character, builtin_type_f_logical,
builtin_type_f_logical_s1, builtin_type_f_logical_s2,
builtin_type_f_integer, builtin_type_f_integer_s2, builtin_type_f_real,
builtin_type_f_real_s8, builtin_type_f_real_s16,
builtin_type_f_complex_s8, builtin_type_f_complex_s16,
builtin_type_f_complex_s32, builtin_type_f_void): Replace global
variable declaration with compatibility macro.
(struct builtin_f_type): New data type.
(builtin_f_type): Add prototype.
* f-lang.c (builtin_type_f_character, builtin_type_f_logical,
builtin_type_f_logical_s1, builtin_type_f_logical_s2,
builtin_type_f_integer, builtin_type_f_integer_s2, builtin_type_f_real,
builtin_type_f_real_s8, builtin_type_f_real_s16,
builtin_type_f_complex_s8, builtin_type_f_complex_s16,
builtin_type_f_complex_s32, builtin_type_f_void): Remove variables.
(f_language_arch_info): Use builtin_f_type instead of variables.
(build_fortran_types): Build builtin_f_type structure instead of
setting global type variables.
(f_type_data): New variable.
(builtin_f_type): New function.
(_initialize_f_language): Do not call build_fortran_types. Do not
swap global type variables. Register f_type_data per-gdbarch data.
diff -urNp gdb-orig/gdb/f-lang.c gdb-head/gdb/f-lang.c
--- gdb-orig/gdb/f-lang.c 2007-06-08 19:50:28.798909340 +0200
+++ gdb-head/gdb/f-lang.c 2007-06-08 19:47:54.016660791 +0200
@@ -34,22 +34,6 @@
#include "valprint.h"
#include "value.h"
-/* The built-in types of F77. FIXME: integer*4 is missing, plain
- logical is missing (builtin_type_logical is logical*4). */
-
-struct type *builtin_type_f_character;
-struct type *builtin_type_f_logical;
-struct type *builtin_type_f_logical_s1;
-struct type *builtin_type_f_logical_s2;
-struct type *builtin_type_f_integer;
-struct type *builtin_type_f_integer_s2;
-struct type *builtin_type_f_real;
-struct type *builtin_type_f_real_s8;
-struct type *builtin_type_f_real_s16;
-struct type *builtin_type_f_complex_s8;
-struct type *builtin_type_f_complex_s16;
-struct type *builtin_type_f_complex_s32;
-struct type *builtin_type_f_void;
/* Following is dubious stuff that had been in the xcoff reader. */
@@ -448,31 +432,33 @@ static void
f_language_arch_info (struct gdbarch *gdbarch,
struct language_arch_info *lai)
{
- lai->string_char_type = builtin_type_f_character;
+ const struct builtin_f_type *builtin = builtin_f_type (gdbarch);
+
+ lai->string_char_type = builtin->builtin_character;
lai->primitive_type_vector
= GDBARCH_OBSTACK_CALLOC (gdbarch, nr_f_primitive_types + 1,
struct type *);
lai->primitive_type_vector [f_primitive_type_character]
- = builtin_type_f_character;
+ = builtin->builtin_character;
lai->primitive_type_vector [f_primitive_type_logical]
- = builtin_type_f_logical;
+ = builtin->builtin_logical;
lai->primitive_type_vector [f_primitive_type_logical_s1]
- = builtin_type_f_logical_s1;
+ = builtin->builtin_logical_s1;
lai->primitive_type_vector [f_primitive_type_logical_s2]
- = builtin_type_f_logical_s2;
+ = builtin->builtin_logical_s2;
lai->primitive_type_vector [f_primitive_type_real]
- = builtin_type_f_real;
+ = builtin->builtin_real;
lai->primitive_type_vector [f_primitive_type_real_s8]
- = builtin_type_f_real_s8;
+ = builtin->builtin_real_s8;
lai->primitive_type_vector [f_primitive_type_real_s16]
- = builtin_type_f_real_s16;
+ = builtin->builtin_real_s16;
lai->primitive_type_vector [f_primitive_type_complex_s8]
- = builtin_type_f_complex_s8;
+ = builtin->builtin_complex_s8;
lai->primitive_type_vector [f_primitive_type_complex_s16]
- = builtin_type_f_complex_s16;
+ = builtin->builtin_complex_s16;
lai->primitive_type_vector [f_primitive_type_void]
- = builtin_type_f_void;
+ = builtin->builtin_void;
}
/* This is declared in c-lang.h but it is silly to import that file for what
@@ -516,100 +502,101 @@ const struct language_defn f_language_de
LANG_MAGIC
};
-static void
-build_fortran_types (void)
+static void *
+build_fortran_types (struct gdbarch *gdbarch)
{
- builtin_type_f_void =
+ struct builtin_f_type *builtin_f_type
+ = GDBARCH_OBSTACK_ZALLOC (gdbarch, struct builtin_f_type);
+
+ builtin_f_type->builtin_void =
init_type (TYPE_CODE_VOID, 1,
0,
"VOID", (struct objfile *) NULL);
- builtin_type_f_character =
+ builtin_f_type->builtin_character =
init_type (TYPE_CODE_INT, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
0,
"character", (struct objfile *) NULL);
- builtin_type_f_logical_s1 =
+ builtin_f_type->builtin_logical_s1 =
init_type (TYPE_CODE_BOOL, TARGET_CHAR_BIT / TARGET_CHAR_BIT,
TYPE_FLAG_UNSIGNED,
"logical*1", (struct objfile *) NULL);
- builtin_type_f_integer_s2 =
+ builtin_f_type->builtin_integer_s2 =
init_type (TYPE_CODE_INT, TARGET_SHORT_BIT / TARGET_CHAR_BIT,
0,
"integer*2", (struct objfile *) NULL);
- builtin_type_f_logical_s2 =
+ builtin_f_type->builtin_logical_s2 =
init_type (TYPE_CODE_BOOL, TARGET_SHORT_BIT / TARGET_CHAR_BIT,
TYPE_FLAG_UNSIGNED,
"logical*2", (struct objfile *) NULL);
- builtin_type_f_integer =
+ builtin_f_type->builtin_integer =
init_type (TYPE_CODE_INT, TARGET_INT_BIT / TARGET_CHAR_BIT,
0,
"integer", (struct objfile *) NULL);
- builtin_type_f_logical =
+ builtin_f_type->builtin_logical =
init_type (TYPE_CODE_BOOL, TARGET_INT_BIT / TARGET_CHAR_BIT,
TYPE_FLAG_UNSIGNED,
"logical*4", (struct objfile *) NULL);
- builtin_type_f_real =
+ builtin_f_type->builtin_real =
init_type (TYPE_CODE_FLT, TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
0,
"real", (struct objfile *) NULL);
- builtin_type_f_real_s8 =
+ builtin_f_type->builtin_real_s8 =
init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
0,
"real*8", (struct objfile *) NULL);
- builtin_type_f_real_s16 =
+ builtin_f_type->builtin_real_s16 =
init_type (TYPE_CODE_FLT, TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
0,
"real*16", (struct objfile *) NULL);
- builtin_type_f_complex_s8 =
+ builtin_f_type->builtin_complex_s8 =
init_type (TYPE_CODE_COMPLEX, 2 * TARGET_FLOAT_BIT / TARGET_CHAR_BIT,
0,
"complex*8", (struct objfile *) NULL);
- TYPE_TARGET_TYPE (builtin_type_f_complex_s8) = builtin_type_f_real;
+ TYPE_TARGET_TYPE (builtin_f_type->builtin_complex_s8)
+ = builtin_f_type->builtin_real;
- builtin_type_f_complex_s16 =
+ builtin_f_type->builtin_complex_s16 =
init_type (TYPE_CODE_COMPLEX, 2 * TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
0,
"complex*16", (struct objfile *) NULL);
- TYPE_TARGET_TYPE (builtin_type_f_complex_s16) = builtin_type_f_real_s8;
+ TYPE_TARGET_TYPE (builtin_f_type->builtin_complex_s16)
+ = builtin_f_type->builtin_real_s8;
/* We have a new size == 4 double floats for the
complex*32 data type */
- builtin_type_f_complex_s32 =
+ builtin_f_type->builtin_complex_s32 =
init_type (TYPE_CODE_COMPLEX, 2 * TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT,
0,
"complex*32", (struct objfile *) NULL);
- TYPE_TARGET_TYPE (builtin_type_f_complex_s32) = builtin_type_f_real_s16;
+ TYPE_TARGET_TYPE (builtin_f_type->builtin_complex_s32)
+ = builtin_f_type->builtin_real_s16;
+
+ return builtin_f_type;
+}
+
+static struct gdbarch_data *f_type_data;
+
+const struct builtin_f_type *
+builtin_f_type (struct gdbarch *gdbarch)
+{
+ return gdbarch_data (gdbarch, f_type_data);
}
void
_initialize_f_language (void)
{
- build_fortran_types ();
-
- DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_character);
- DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_logical);
- DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_logical_s1);
- DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_logical_s2);
- DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_integer);
- DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_integer_s2);
- DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_real);
- DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_real_s8);
- DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_real_s16);
- DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_complex_s8);
- DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_complex_s16);
- DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_complex_s32);
- DEPRECATED_REGISTER_GDBARCH_SWAP (builtin_type_f_void);
- deprecated_register_gdbarch_swap (NULL, 0, build_fortran_types);
+ f_type_data = gdbarch_data_register_post_init (build_fortran_types);
add_language (&f_language_defn);
}
diff -urNp gdb-orig/gdb/gdbtypes.h gdb-head/gdb/gdbtypes.h
--- gdb-orig/gdb/gdbtypes.h 2007-06-08 19:50:28.807908044 +0200
+++ gdb-head/gdb/gdbtypes.h 2007-06-08 19:50:38.155025640 +0200
@@ -1187,19 +1187,54 @@ extern struct type *builtin_type_m2_bool
/* Fortran (F77) types */
-extern struct type *builtin_type_f_character;
-extern struct type *builtin_type_f_integer;
-extern struct type *builtin_type_f_integer_s2;
-extern struct type *builtin_type_f_logical;
-extern struct type *builtin_type_f_logical_s1;
-extern struct type *builtin_type_f_logical_s2;
-extern struct type *builtin_type_f_real;
-extern struct type *builtin_type_f_real_s8;
-extern struct type *builtin_type_f_real_s16;
-extern struct type *builtin_type_f_complex_s8;
-extern struct type *builtin_type_f_complex_s16;
-extern struct type *builtin_type_f_complex_s32;
-extern struct type *builtin_type_f_void;
+struct builtin_f_type
+{
+ struct type *builtin_character;
+ struct type *builtin_integer;
+ struct type *builtin_integer_s2;
+ struct type *builtin_logical;
+ struct type *builtin_logical_s1;
+ struct type *builtin_logical_s2;
+ struct type *builtin_real;
+ struct type *builtin_real_s8;
+ struct type *builtin_real_s16;
+ struct type *builtin_complex_s8;
+ struct type *builtin_complex_s16;
+ struct type *builtin_complex_s32;
+ struct type *builtin_void;
+};
+
+/* Return the Fortran type table for the specified architecture. */
+extern const struct builtin_f_type *builtin_f_type (struct gdbarch *gdbarch);
+
+/* Compatibility macros to access types for the current architecture. */
+#define builtin_type_f_character \
+ (builtin_f_type (current_gdbarch)->builtin_character)
+#define builtin_type_f_integer \
+ (builtin_f_type (current_gdbarch)->builtin_integer)
+#define builtin_type_f_integer_s2 \
+ (builtin_f_type (current_gdbarch)->builtin_integer_s2)
+#define builtin_type_f_logical \
+ (builtin_f_type (current_gdbarch)->builtin_logical)
+#define builtin_type_f_logical_s1 \
+ (builtin_f_type (current_gdbarch)->builtin_logical_s1)
+#define builtin_type_f_logical_s2 \
+ (builtin_f_type (current_gdbarch)->builtin_logical_s2)
+#define builtin_type_f_real \
+ (builtin_f_type (current_gdbarch)->builtin_real)
+#define builtin_type_f_real_s8 \
+ (builtin_f_type (current_gdbarch)->builtin_real_s8)
+#define builtin_type_f_real_s16 \
+ (builtin_f_type (current_gdbarch)->builtin_real_s16)
+#define builtin_type_f_complex_s8 \
+ (builtin_f_type (current_gdbarch)->builtin_complex_s8)
+#define builtin_type_f_complex_s16 \
+ (builtin_f_type (current_gdbarch)->builtin_complex_s16)
+#define builtin_type_f_complex_s32 \
+ (builtin_f_type (current_gdbarch)->builtin_complex_s32)
+#define builtin_type_f_void \
+ (builtin_f_type (current_gdbarch)->builtin_void)
+
/* RTTI for C++ */
/* extern struct type *builtin_type_cxx_typeinfo; */
--
Dr. Ulrich Weigand
GNU Toolchain for Linux on System z and Cell BE
Ulrich.Weigand@de.ibm.com