[m-dev.] for review: bootstrap in none.gc with MSVC

Peter Ross petdr at cs.mu.OZ.AU
Tue Jul 4 19:32:28 AEST 2000


Hi,

Fergus my original change had some problems with the field_names being
declared with different sizes (as at some points we need to recalculate
the array size, and we end up with different answers), so for the moment
I will submit this one and keep working on the other change.

Pete

===================================================================


Estimated hours taken: 4

Bootcheck in the none.gc grade using MSVC.

compiler/rtti_out.m:
    ANSI/ISO C doesn't allow empty arrays so place a dummy value in the
    array when necessary.
    ANSI/ISO C doesn't allow forward declarations of static data with
    incomplete types, so make the incomplete types extern.  The ideal
    solution would be to output the actual sizes of the array, however
    that is slightly more difficult then it seems.

runtime/mercury_type_info.h:
    Create new macro MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_NOCM, which is the
    same as MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL but with no cm field.
    
library/builtin.m:
    Use MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_NOCM instead of
    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL when we have a blank cm field
    as the MSVC CPP doesn't like blank fields.
    
trace/mercury_trace_vars.c:
    Delete the local declarations of mercury_data___type_ctor_info_func_0
    and mercury_data___type_ctor_info_pred_0 because the true
    declarations from the header file are visibile.

Index: compiler/rtti_out.m
===================================================================
RCS file: /home/mercury1/repository/mercury/compiler/rtti_out.m,v
retrieving revision 1.11
diff -u -r1.11 rtti_out.m
--- compiler/rtti_out.m	2000/05/10 18:07:05	1.11
+++ compiler/rtti_out.m	2000/07/04 09:18:46
@@ -88,9 +88,17 @@
 		DeclSet0, DeclSet) -->
 	output_generic_rtti_data_defn_start(RttiTypeId, exist_locns(Ordinal),
 		DeclSet0, DeclSet),
-	io__write_string(" = {\n"),
-	output_exist_locns(Locns),
-	io__write_string("};\n").
+	(
+			% ANSI/ISO C doesn't allow empty arrays, so
+			% place a dummy value in the array if necessary.
+		{ Locns = [] }
+	->
+		io__write_string("= { {0, 0} };\n")
+	;
+		io__write_string(" = {\n"),
+		output_exist_locns(Locns),
+		io__write_string("};\n")
+	).
 output_rtti_data_defn(exist_info(RttiTypeId, Ordinal, Plain, InTci, Tci,
 		Locns), DeclSet0, DeclSet) -->
 	output_rtti_addr_decls(RttiTypeId, Locns, "", "", 0, _,
@@ -110,17 +118,33 @@
 		DeclSet0, DeclSet) -->
 	output_generic_rtti_data_defn_start(RttiTypeId, field_names(Ordinal),
 		DeclSet0, DeclSet),
-	io__write_string(" = {\n"),
-	output_maybe_quoted_strings(MaybeNames),
-	io__write_string("};\n").
+	(
+			% ANSI/ISO C doesn't allow empty arrays, so
+			% place a dummy value in the array if necessary.
+		{ MaybeNames = [] }
+	->
+		io__write_string("= { "" };\n")
+	;
+		io__write_string(" = {\n"),
+		output_maybe_quoted_strings(MaybeNames),
+		io__write_string("};\n")
+	).
 output_rtti_data_defn(field_types(RttiTypeId, Ordinal, Types),
 		DeclSet0, DeclSet) -->
 	output_rtti_datas_decls(Types, "", "", 0, _, DeclSet0, DeclSet1),
 	output_generic_rtti_data_defn_start(RttiTypeId, field_types(Ordinal),
 		DeclSet1, DeclSet),
-	io__write_string(" = {\n"),
-	output_addr_of_rtti_datas(Types),
-	io__write_string("};\n").
+	(
+			% ANSI/ISO C doesn't allow empty arrays, so
+			% place a dummy value in the array if necessary.
+		{ Types = [] }
+	->
+		io__write_string("= { NULL };\n")
+	;
+		io__write_string(" = {\n"),
+		output_addr_of_rtti_datas(Types),
+		io__write_string("};\n")
+	).
 output_rtti_data_defn(enum_functor_desc(RttiTypeId, FunctorName, Ordinal),
 		DeclSet0, DeclSet) -->
 	output_generic_rtti_data_defn_start(RttiTypeId,
@@ -929,9 +953,19 @@
 pseudo_type_info_would_incl_code_addr(higher_order_type_info(_, _, _))	= no.
 
 rtti_name_linkage(RttiName, Linkage) :-
-	Exported = rtti_name_is_exported(RttiName),
-	( Exported = yes, Linkage = extern
-	; Exported = no, Linkage = static
+	(
+			% ANSI/ISO C doesn't allow forward declarations
+			% of static data with incomplete types (in this
+			% case array types without an explicit array
+			% size), so make the declarations extern.
+		yes = rtti_name_has_array_type(RttiName)
+	->
+		Linkage = extern
+	;
+		Exported = rtti_name_is_exported(RttiName),
+		( Exported = yes, Linkage = extern
+		; Exported = no, Linkage = static
+		)
         ).
 
 rtti_name_c_type(exist_locns(_),           "MR_DuExistLocn", "[]").
Index: library/builtin.m
===================================================================
RCS file: /home/mercury1/repository/mercury/library/builtin.m,v
retrieving revision 1.36
diff -u -r1.36 builtin.m
--- library/builtin.m	2000/05/31 12:58:19	1.36
+++ library/builtin.m	2000/07/04 09:18:50
@@ -236,22 +236,22 @@
 
 #ifndef MR_HIGHLEVEL_CODE
 
-MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL(builtin, , int, 0,
+MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_NOCM(builtin, int, 0,
 	MR_TYPECTOR_REP_INT,
 	mercury__builtin_unify_int_2_0,
 	mercury__builtin_compare_int_3_0);
 
-MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL(builtin, , character, 0,
+MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_NOCM(builtin, character, 0,
 	MR_TYPECTOR_REP_CHAR,
 	mercury__builtin_unify_character_2_0,
 	mercury__builtin_compare_character_3_0);
 
-MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL(builtin, , string, 0,
+MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_NOCM(builtin, string, 0,
 	MR_TYPECTOR_REP_STRING,
 	mercury__builtin_unify_string_2_0,
 	mercury__builtin_compare_string_3_0);
 
-MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL(builtin, , float, 0,
+MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_NOCM(builtin, float, 0,
 	MR_TYPECTOR_REP_FLOAT,
 	mercury__builtin_unify_float_2_0,
 	mercury__builtin_compare_float_3_0);
@@ -261,11 +261,11 @@
 	** Note that they use the same three predicates.
 	*/
 
-MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL(builtin, , func, 0,
+MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_NOCM(builtin, func, 0,
 	MR_TYPECTOR_REP_PRED,
 	mercury__builtin_unify_pred_2_0,
 	mercury__builtin_compare_pred_3_0);
-MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL(builtin, , pred, 0,
+MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_NOCM(builtin, pred, 0,
 	MR_TYPECTOR_REP_PRED,
 	mercury__builtin_unify_pred_2_0,
 	mercury__builtin_compare_pred_3_0);
Index: runtime/mercury_type_info.h
===================================================================
RCS file: /home/mercury1/repository/mercury/runtime/mercury_type_info.h,v
retrieving revision 1.51
diff -u -r1.51 mercury_type_info.h
--- runtime/mercury_type_info.h	2000/05/05 10:14:49	1.51
+++ runtime/mercury_type_info.h	2000/07/04 09:18:59
@@ -808,10 +808,22 @@
 */
 
 #define MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL(m, cm, n, a, cr, u, c)    \
+    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL_A(u, c)			\
+    MR_PASTE6(mercury_data_, cm, __type_ctor_info_, n, _, a) = {        \
+    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL_B(m, n, a, cr, u, c)
+
+	/* MSVC CPP doesn't like having an empty CM field. */
+#define MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_NOCM(m, n, a, cr, u, c)	\
+    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL_A(u, c)			\
+    MR_PASTE5(mercury_data_, __type_ctor_info_, n, _, a) = {		\
+    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL_B(m, n, a, cr, u, c)
+
+#define MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL_A(u, c)			\
     Declare_entry(u);                                                   \
     Declare_entry(c);                                                   \
     MR_STATIC_CODE_CONST struct MR_TypeCtorInfo_Struct                  \
-    MR_PASTE6(mercury_data_, cm, __type_ctor_info_, n, _, a) = {        \
+
+#define MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL_B(m, n, a, cr, u, c)	\
         a,                                                              \
         MR_MAYBE_STATIC_CODE(ENTRY(u)),                                 \
         MR_MAYBE_STATIC_CODE(ENTRY(u)),                                 \
@@ -837,7 +849,7 @@
         MR_PASTE7(mercury____Compare___, m, __, n, _, a, _0))
 
 #define MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_UNUSED(n, a, cr)       \
-    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_FULL(builtin, , n, a, cr,  \
+    MR_DEFINE_BUILTIN_TYPE_CTOR_INFO_NOCM(builtin, n, a, cr,	\
         mercury__unused_0_0,                                    \
         mercury__unused_0_0)
 
Index: trace/mercury_trace_vars.c
===================================================================
RCS file: /home/mercury1/repository/mercury/trace/mercury_trace_vars.c,v
retrieving revision 1.16
diff -u -r1.16 mercury_trace_vars.c
--- trace/mercury_trace_vars.c	2000/05/15 16:37:48	1.16
+++ trace/mercury_trace_vars.c	2000/07/04 09:19:04
@@ -138,8 +138,6 @@
 	mercury_data_std_util__type_ctor_info_type_desc_0;
 extern	struct MR_TypeCtorInfo_Struct
 	mercury_data_std_util__type_ctor_info_type_ctor_desc_0;
-extern	struct MR_TypeCtorInfo_Struct	mercury_data___type_ctor_info_func_0;
-extern	struct MR_TypeCtorInfo_Struct	mercury_data___type_ctor_info_pred_0;
 extern	struct MR_TypeCtorInfo_Struct	mercury_data___type_ctor_info_void_0;
 
 #ifdef	NATIVE_GC

--------------------------------------------------------------------------
mercury-developers mailing list
Post messages to:       mercury-developers at cs.mu.oz.au
Administrative Queries: owner-mercury-developers at cs.mu.oz.au
Subscriptions:          mercury-developers-request at cs.mu.oz.au
--------------------------------------------------------------------------



More information about the developers mailing list