summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/c-common.h13
-rw-r--r--gcc/c-decl.c49
3 files changed, 69 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7899410f8fa..da4f13157a3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2000-05-18 Chris Demetriou <cgd@sibyte.com>
+ Richard Henderson <rth@cygnus.com>
+
+ * c-common.h (enum c_tree_index): Add g77 type entries.
+ (g77_integer_type_node, g77_uinteger_type_node): New.
+ (g77_longint_type_node, g77_ulongint_type_node): New.
+ * c-decl.c (init_decl_processing): Initialize them.
+
2000-05-18 Richard Henderson <rth@cygnus.com>
* config/h8300/h8300.md (subs patterns): Use %G to negate.
diff --git a/gcc/c-common.h b/gcc/c-common.h
index 17db8fbdc40..0d25b2a18b8 100644
--- a/gcc/c-common.h
+++ b/gcc/c-common.h
@@ -45,7 +45,12 @@ enum c_tree_index
CTI_VOID_FTYPE_PTR,
CTI_INT_FTYPE_INT,
CTI_PTR_FTYPE_SIZETYPE,
-
+
+ CTI_G77_INTEGER_TYPE,
+ CTI_G77_UINTEGER_TYPE,
+ CTI_G77_LONGINT_TYPE,
+ CTI_G77_ULONGINT_TYPE,
+
CTI_MAX
};
@@ -74,6 +79,12 @@ extern tree c_global_trees[CTI_MAX];
#define int_ftype_int c_global_trees[CTI_INT_FTYPE_INT]
#define ptr_ftype_sizetype c_global_trees[CTI_PTR_FTYPE_SIZETYPE]
+/* g77 integer types, which which must be kept in sync with f/com.h */
+#define g77_integer_type_node c_global_trees[CTI_G77_INTEGER_TYPE]
+#define g77_uinteger_type_node c_global_trees[CTI_G77_UINTEGER_TYPE]
+#define g77_longint_type_node c_global_trees[CTI_G77_LONGINT_TYPE]
+#define g77_ulongint_type_node c_global_trees[CTI_G77_ULONGINT_TYPE]
+
/* Pointer to function to generate the VAR_DECL for __FUNCTION__ etc.
ID is the identifier to use, NAME is the string.
TYPE_DEP indicates whether it depends on type of the function or not
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 040b695f889..d1393d4ba95 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -3034,6 +3034,55 @@ init_decl_processing ()
= build_function_type (ptr_type_node,
tree_cons (NULL_TREE, ptr_type_node, endlink));
+ /* Types which are common to the fortran compiler and libf2c. When
+ changing these, you also need to be concerned with f/com.h. */
+
+ if (TYPE_PRECISION (float_type_node)
+ == TYPE_PRECISION (long_integer_type_node))
+ {
+ g77_integer_type_node = long_integer_type_node;
+ g77_uinteger_type_node = long_unsigned_type_node;
+ }
+ else if (TYPE_PRECISION (float_type_node)
+ == TYPE_PRECISION (integer_type_node))
+ {
+ g77_integer_type_node = integer_type_node;
+ g77_uinteger_type_node = unsigned_type_node;
+ }
+ else
+ g77_integer_type_node = g77_uinteger_type_node = NULL_TREE;
+
+ if (g77_integer_type_node != NULL_TREE)
+ {
+ pushdecl (build_decl (TYPE_DECL, get_identifier ("__g77_integer"),
+ g77_integer_type_node));
+ pushdecl (build_decl (TYPE_DECL, get_identifier ("__g77_uinteger"),
+ g77_uinteger_type_node));
+ }
+
+ if (TYPE_PRECISION (float_type_node) * 2
+ == TYPE_PRECISION (long_integer_type_node))
+ {
+ g77_longint_type_node = long_integer_type_node;
+ g77_ulongint_type_node = long_unsigned_type_node;
+ }
+ else if (TYPE_PRECISION (float_type_node) * 2
+ == TYPE_PRECISION (long_long_integer_type_node))
+ {
+ g77_longint_type_node = long_long_integer_type_node;
+ g77_ulongint_type_node = long_long_unsigned_type_node;
+ }
+ else
+ g77_longint_type_node = g77_ulongint_type_node = NULL_TREE;
+
+ if (g77_longint_type_node != NULL_TREE)
+ {
+ pushdecl (build_decl (TYPE_DECL, get_identifier ("__g77_longint"),
+ g77_longint_type_node));
+ pushdecl (build_decl (TYPE_DECL, get_identifier ("__g77_ulongint"),
+ g77_ulongint_type_node));
+ }
+
builtin_function ("__builtin_aggregate_incoming_address",
build_function_type (ptr_type_node, NULL_TREE),
BUILT_IN_AGGREGATE_INCOMING_ADDRESS,