[m-dev.] Re: fastcall for the x86
Fergus Henderson
fjh at cs.mu.OZ.AU
Sat Nov 25 03:13:57 AEDT 2000
On 25-Nov-2000, Fergus Henderson <fjh at cs.mu.oz.au> wrote:
> On 17-Nov-2000, Fergus Henderson <fjh at cs.mu.OZ.AU> wrote:
> > On 17-Nov-2000, Tyson Dowd <trd at cs.mu.OZ.AU> wrote:
> > > I was chatting to Pete on the phone and we got into a discussion of
> > > using fastcall convention on the x86 in hlc grade.
> > > gcc has a similar calling convention that can be enabled using the
> > > regparm(X) attribute. It might be worth trying this out in hlc.gc
> > > for non-exported functions.
> >
> > That won't work, since we take the address of non-exported functions
> > and pass them to other modules.
> >
> > But we could do it for all Mercury-generated functions
> > (and for functions in the Mercury runtime or standard library that
> > implement builtin unification/compare or Mercury procedures declared
> > `:- external').
>
> I tried this out. But both the `regparm' and `stdcall' attributes are
> broken in both gcc 2.95.2 and egcs 1.1.2 (in slightly different ways).
> The symptoms include (1) silently ignoring such attributes when they
> occur in function pointer type casts (and thus generating code which
> crashes, due to mismatches with the places where the attributes are
> not ignored); (2) gcc internal compiler errors; and (3) segmentation
> fauls ("fatal signal 11") in cc1. I just sent off three bug reports
> against gcc 2.95.2.
>
> The following diff has my efforts towards exploiting such attributes.
> They may be useful for __fastcall with MSVC. But they're not yet
> useful for gcc, and I haven't been able to test them properly, so I
> don't plan to commit this. Pete, you might want to take this diff,
> review it carefully for bugs (no doubt there are some ;-), and then
> use it to try out __fastcall with MSVC.
>
> ----------
>
> Estimated hours taken: 8
>
> Add support for using a different C calling convention for the
> C functions generated by the MLDS back-end.
>
> runtime/ml_call_gen.m:
> For higher-order calls and class method calls, assign the
> function pointer to a local variable; XXX this is a hack
> needed for some versions of gcc and isn't sufficient anyway.
>
> runtime/mlds_to_c.m:
> Output "MR_CALL" in function declarations.
> XXX But *not* for casts; this part is a hack needed for some
> versions of gcc and isn't sufficient anyway.
>
> runtime/mercury_types.h:
> Define MR_CALL. This is a macro that expands to some
> implementation-specific C extension to specify the calling
> convention. E.g. for gcc it could be
> `__attribute__((__regparm__(3), __stdcall__))',
> except that gcc seems to be broken.
>
> XXX This should probably go in mercury_std.h.
>
> runtime/mercury_types.h:
> runtime/mercury.h:
> runtime/mercury.c:
> runtime/mercury_wrapper.h:
> runtime/mercury_wrapper.c:
> util/mkinit.c:
> library/array.m:
> library/builtin.m:
> library/exception.m:
> Use MR_CALL for functions that should have the
> Mercury calling convention.
> XXX It would be cleaner to have an implicit `pragma export'
> for main/2 rather than the current scheme where we do it
> manually.
>
> cvs diff: Diffing .
> cvs diff: Diffing bindist
> cvs diff: Diffing boehm_gc
> cvs diff: Diffing boehm_gc/Mac_files
> cvs diff: Diffing boehm_gc/cord
> cvs diff: Diffing boehm_gc/cord/private
> cvs diff: Diffing boehm_gc/include
> cvs diff: Diffing boehm_gc/include/private
> cvs diff: Diffing browser
> cvs diff: Diffing bytecode
> cvs diff: Diffing compiler
> Index: compiler/ml_call_gen.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/ml_call_gen.m,v
> retrieving revision 1.18
> diff -u -d -u -r1.18 ml_call_gen.m
> --- compiler/ml_call_gen.m 2000/11/23 04:32:42 1.18
> +++ compiler/ml_call_gen.m 2000/11/24 11:14:45
> @@ -195,6 +195,23 @@
> ),
>
> %
> + % Assign the function address rval to a new local variable.
> + % This makes the generated code slightly more readable.
> + % More importantly, this is also necessary when using a
> + % non-standard calling convention with GNU C, since GNU C
> + % (2.95.2) ignores the function attributes on function
> + % pointer types in casts.
> + %
> + ml_gen_info_new_conv_var(ConvVarNum),
> + { string__format("func_%d", [i(ConvVarNum)],
> + FuncVarName) },
> + { FuncVarDecl = ml_gen_mlds_var_decl(var(FuncVarName), FuncType,
> + mlds__make_context(Context)) },
> + ml_qualify_var(FuncVarName, FuncVarLval),
> + { AssignFuncVar = ml_gen_assign(FuncVarLval, FuncRval, Context) },
> + { FuncVarRval = lval(FuncVarLval) },
> +
> + %
> % Generate code to box/unbox the arguments
> % and compute the list of properly converted rvals/lvals
> % to pass as the function call's arguments and return values
> @@ -216,12 +233,12 @@
> % which when called will generate it.)
> %
> { ObjectRval = no },
> - { DoGenCall = ml_gen_mlds_call(Signature, ObjectRval, FuncRval,
> + { DoGenCall = ml_gen_mlds_call(Signature, ObjectRval, FuncVarRval,
> [ClosureRval | InputRvals], OutputLvals, OutputTypes,
> CodeModel, Context) },
>
> ( { ConvArgDecls = [], ConvOutputStatements = [] } ->
> - DoGenCall(MLDS_Decls, MLDS_Statements)
> + DoGenCall(MLDS_Decls0, MLDS_Statements0)
> ;
> %
> % Construct a closure to generate code to
> @@ -245,10 +262,11 @@
> ml_combine_conj(CodeModel, Context,
> DoGenCall, DoGenConvOutputAndSucceed,
> CallAndConvOutputDecls, CallAndConvOutputStatements),
> - { MLDS_Decls = list__append(ConvArgDecls,
> - CallAndConvOutputDecls) },
> - { MLDS_Statements = CallAndConvOutputStatements }
> - ).
> + { MLDS_Decls0 = ConvArgDecls ++ CallAndConvOutputDecls },
> + { MLDS_Statements0 = CallAndConvOutputStatements }
> + ),
> + { MLDS_Decls = [FuncVarDecl | MLDS_Decls0] },
> + { MLDS_Statements = [AssignFuncVar | MLDS_Statements0] }.
>
> %
> % Generate code for the various parts that are needed for
> Index: compiler/mlds_to_c.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/compiler/mlds_to_c.m,v
> retrieving revision 1.71
> diff -u -d -u -r1.71 mlds_to_c.m
> --- compiler/mlds_to_c.m 2000/11/21 13:37:42 1.71
> +++ compiler/mlds_to_c.m 2000/11/24 14:56:03
> @@ -696,9 +696,7 @@
> io__state::di, io__state::uo) is det.
>
> mlds_output_name_with_cast(ModuleName, Name - Type) -->
> - io__write_char('('),
> - mlds_output_type(Type),
> - io__write_string(") "),
> + mlds_output_cast(Type),
> mlds_output_fully_qualified_name(qual(ModuleName, Name)).
>
> %
> @@ -1230,6 +1228,7 @@
> :- mode mlds_output_func_decl(in, in, in, in, di, uo) is det.
>
> mlds_output_func_decl(Indent, QualifiedName, Context, Signature) -->
> + mlds_output_calling_convention(output_for_decl),
> mlds_output_func_decl_ho(Indent, QualifiedName, Context, Signature,
> mlds_output_type_prefix, mlds_output_type_suffix).
>
> @@ -1292,15 +1291,16 @@
> mlds_output_data_decl_ho(OutputPrefix, OutputSuffix,
> qual(ModuleName, Name), Type).
>
> -:- pred mlds_output_func_type_prefix(func_params, io__state, io__state).
> -:- mode mlds_output_func_type_prefix(in, di, uo) is det.
> +:- pred mlds_output_func_type_prefix(func_params, output_for, io__state, io__state).
> +:- mode mlds_output_func_type_prefix(in, in, di, uo) is det.
>
> -mlds_output_func_type_prefix(Params) -->
> +mlds_output_func_type_prefix(Params, OutputFor) -->
> + mlds_output_calling_convention(OutputFor),
> { Params = mlds__func_params(_Parameters, RetTypes) },
> ( { RetTypes = [] } ->
> io__write_string("void")
> ; { RetTypes = [RetType] } ->
> - mlds_output_type(RetType)
> + mlds_output_type(RetType, OutputFor)
> ;
> { error("mlds_output_func_type_prefix: multiple return types") }
> ),
> @@ -1505,24 +1505,65 @@
> % the part which goes after the variable name, e.g. the "[]"
> % for array types.
> %
> +% Also, because of the further joys of GNU C syntax (with gcc version
> +% egcs-1.1.2) function attributes for the function calling convention
> +% (the `MR_CALL' macro) are needed on function types in declarations/
> +% definitions, but must NOT be used on function types in casts.
> +%
> +
> +:- type output_for
> + ---> output_for_cast
> + ; output_for_decl.
> +
> +:- pred mlds_output_calling_convention(output_for, io__state, io__state).
> +:- mode mlds_output_calling_convention(in, di, uo) is det.
> +
> +mlds_output_calling_convention(output_for_decl) -->
> + io__write_string("MR_CALL ").
> +mlds_output_calling_convention(output_for_cast) -->
> + % GNU C doesn't require or even allow the calling
> + % convention to be specified in a cast to a function
> + % pointer type. So we just output nothing here.
> + %
> + % Other C compilers might need something here, in which
> + % cast we could use
> + % io__write_string("MR_CALL_IN_CAST ")
> + % here and define that macro appropriately for those compilers.
> + [].
>
> :- pred mlds_output_type(mlds__type, io__state, io__state).
> :- mode mlds_output_type(in, di, uo) is det.
>
> mlds_output_type(Type) -->
> - mlds_output_type_prefix(Type),
> - mlds_output_type_suffix(Type).
> + mlds_output_type(Type, output_for_decl).
>
> :- pred mlds_output_type_prefix(mlds__type, io__state, io__state).
> :- mode mlds_output_type_prefix(in, di, uo) is det.
>
> -mlds_output_type_prefix(mercury_type(Type, TypeCategory)) -->
> +mlds_output_type_prefix(Type) -->
> + mlds_output_type_prefix(Type, output_for_decl).
> +
> +:- pred mlds_output_type(mlds__type, output_for, io__state, io__state).
> +:- mode mlds_output_type(in, in, di, uo) is det.
> +
> +mlds_output_type(Type, OutputFor) -->
> + mlds_output_type_prefix(Type, OutputFor),
> + mlds_output_type_suffix(Type).
> +
> +:- pred mlds_output_type_prefix(mlds__type, output_for, io__state, io__state).
> +:- mode mlds_output_type_prefix(in, in, di, uo) is det.
> +
> +mlds_output_type_prefix(mercury_type(Type, TypeCategory), _) -->
> mlds_output_mercury_type_prefix(Type, TypeCategory).
> -mlds_output_type_prefix(mlds__native_int_type) --> io__write_string("int").
> -mlds_output_type_prefix(mlds__native_float_type) --> io__write_string("float").
> -mlds_output_type_prefix(mlds__native_bool_type) --> io__write_string("bool").
> -mlds_output_type_prefix(mlds__native_char_type) --> io__write_string("char").
> -mlds_output_type_prefix(mlds__class_type(Name, Arity, ClassKind)) -->
> +mlds_output_type_prefix(mlds__native_int_type, _) -->
> + io__write_string("int").
> +mlds_output_type_prefix(mlds__native_float_type, _) -->
> + io__write_string("float").
> +mlds_output_type_prefix(mlds__native_bool_type, _) -->
> + io__write_string("bool").
> +mlds_output_type_prefix(mlds__native_char_type, _) -->
> + io__write_string("char").
> +mlds_output_type_prefix(mlds__class_type(Name, Arity, ClassKind), _) -->
> ( { ClassKind = mlds__enum } ->
> %
> % We can't just use the enumeration type,
> @@ -1547,22 +1588,22 @@
> mlds_output_fully_qualified(Name, mlds_output_mangled_name),
> io__format("_%d_s", [i(Arity)])
> ).
> -mlds_output_type_prefix(mlds__ptr_type(Type)) -->
> +mlds_output_type_prefix(mlds__ptr_type(Type), _) -->
> mlds_output_type(Type),
> io__write_string(" *").
> -mlds_output_type_prefix(mlds__array_type(Type)) -->
> +mlds_output_type_prefix(mlds__array_type(Type), _) -->
> % Here we just output the element type.
> % The "[]" goes in the type suffix.
> mlds_output_type(Type).
> -mlds_output_type_prefix(mlds__func_type(FuncParams)) -->
> - mlds_output_func_type_prefix(FuncParams).
> -mlds_output_type_prefix(mlds__generic_type) -->
> +mlds_output_type_prefix(mlds__func_type(FuncParams), OutputFor) -->
> + mlds_output_func_type_prefix(FuncParams, OutputFor).
> +mlds_output_type_prefix(mlds__generic_type, _) -->
> io__write_string("MR_Box").
> -mlds_output_type_prefix(mlds__generic_env_ptr_type) -->
> +mlds_output_type_prefix(mlds__generic_env_ptr_type, _) -->
> io__write_string("void *").
> -mlds_output_type_prefix(mlds__pseudo_type_info_type) -->
> +mlds_output_type_prefix(mlds__pseudo_type_info_type, _) -->
> io__write_string("MR_PseudoTypeInfo").
> -mlds_output_type_prefix(mlds__cont_type(ArgTypes)) -->
> +mlds_output_type_prefix(mlds__cont_type(ArgTypes), OutputFor) -->
> ( { ArgTypes = [] } ->
> globals__io_lookup_bool_option(gcc_nested_functions,
> GCC_NestedFuncs),
> @@ -1573,16 +1614,17 @@
> )
> ;
> % This case only happens for --nondet-copy-out
> + mlds_output_calling_convention(OutputFor),
> io__write_string("void (*")
> ).
> -mlds_output_type_prefix(mlds__commit_type) -->
> +mlds_output_type_prefix(mlds__commit_type, _) -->
> globals__io_lookup_bool_option(gcc_local_labels, GCC_LocalLabels),
> ( { GCC_LocalLabels = yes } ->
> io__write_string("__label__")
> ;
> io__write_string("jmp_buf")
> ).
> -mlds_output_type_prefix(mlds__rtti_type(RttiName)) -->
> +mlds_output_type_prefix(mlds__rtti_type(RttiName), _) -->
> io__write_string("MR_"),
> io__write_string(mlds_rtti_type_name(RttiName)).
>
> @@ -2397,9 +2439,7 @@
> io__write_string(" = "),
> ( { MaybeTag = yes(Tag0) } ->
> { Tag = Tag0 },
> - io__write_string("("),
> - mlds_output_type(Type),
> - io__write_string(") "),
> + mlds_output_cast(Type),
> io__write_string("MR_mkword("),
> mlds_output_tag(Tag),
> io__write_string(", "),
> @@ -2412,9 +2452,7 @@
> % in the call to MR_new_object() is not
> % always correct.
> %
> - io__write_string("("),
> - mlds_output_type(Type),
> - io__write_string(") "),
> + mlds_output_cast(Type),
> { EndMkword = "" }
> ),
> io__write_string("MR_new_object("),
> @@ -2575,9 +2613,8 @@
> _FieldType, _PtrType)) -->
> % XXX we shouldn't bother with this cast in the case where
> % PtrType == CtorType
> - io__write_string("(("),
> - mlds_output_type(CtorType),
> - io__write_string(") "),
> + io__write_string("("),
> + mlds_output_cast(CtorType),
> ( { MaybeTag = yes(0) } ->
> ( { PtrRval = mem_addr(Lval) } ->
> mlds_output_lval(Lval),
> @@ -2715,11 +2752,17 @@
> :- mode mlds_output_cast_rval(in, in, di, uo) is det.
>
> mlds_output_cast_rval(Type, Exprn) -->
> - io__write_string("("),
> - mlds_output_type(Type),
> - io__write_string(") "),
> + mlds_output_cast(Type),
> mlds_output_rval(Exprn).
>
> +:- pred mlds_output_cast(mlds__type, io__state, io__state).
> +:- mode mlds_output_cast(in, di, uo) is det.
> +
> +mlds_output_cast(Type) -->
> + io__write_string("("),
> + mlds_output_type(Type, output_for_cast),
> + io__write_string(") ").
> +
> :- pred mlds_output_boxed_rval(mlds__type, mlds__rval, io__state, io__state).
> :- mode mlds_output_boxed_rval(in, in, di, uo) is det.
>
> @@ -2763,9 +2806,9 @@
> % pointer to integer of different size" from gcc.
> % XXX The generated code would be more readable if we
> % only did this for the cases where it was necessary.
> - io__write_string("(("),
> - mlds_output_type(Type),
> - io__write_string(") (MR_Word) "),
> + io__write_string("("),
> + mlds_output_cast(Type),
> + io__write_string("(MR_Word) "),
> mlds_output_rval(Exprn),
> io__write_string(")")
> ).
> cvs diff: Diffing compiler/notes
> cvs diff: Diffing debian
> cvs diff: Diffing doc
> cvs diff: Diffing extras
> cvs diff: Diffing extras/aditi
> cvs diff: Diffing extras/cgi
> cvs diff: Diffing extras/complex_numbers
> cvs diff: Diffing extras/complex_numbers/samples
> cvs diff: Diffing extras/complex_numbers/tests
> cvs diff: Diffing extras/concurrency
> cvs diff: Diffing extras/curses
> cvs diff: Diffing extras/curses/sample
> cvs diff: Diffing extras/dynamic_linking
> cvs diff: Diffing extras/graphics
> cvs diff: Diffing extras/graphics/mercury_opengl
> cvs diff: Diffing extras/graphics/mercury_tcltk
> cvs diff: Diffing extras/graphics/samples
> cvs diff: Diffing extras/graphics/samples/calc
> cvs diff: Diffing extras/graphics/samples/maze
> cvs diff: Diffing extras/graphics/samples/pent
> cvs diff: Diffing extras/lazy_evaluation
> cvs diff: Diffing extras/logged_output
> cvs diff: Diffing extras/moose
> cvs diff: Diffing extras/moose/samples
> cvs diff: Diffing extras/morphine
> cvs diff: Diffing extras/morphine/non-regression-tests
> cvs diff: Diffing extras/morphine/scripts
> cvs diff: Diffing extras/morphine/source
> cvs diff: Diffing extras/odbc
> cvs diff: Diffing extras/posix
> cvs diff: Diffing extras/references
> cvs diff: Diffing extras/references/samples
> cvs diff: Diffing extras/references/tests
> cvs diff: Diffing extras/stream
> cvs diff: Diffing extras/trailed_update
> cvs diff: Diffing extras/trailed_update/samples
> cvs diff: Diffing extras/trailed_update/tests
> cvs diff: Diffing extras/xml
> cvs diff: Diffing library
> Index: library/array.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/library/array.m,v
> retrieving revision 1.78
> diff -u -d -u -r1.78 array.m
> --- library/array.m 2000/11/23 01:59:51 1.78
> +++ library/array.m 2000/11/24 12:37:12
> @@ -331,14 +331,14 @@
> return;
> }
>
> -bool
> +MR_CALL bool
> mercury__array____Unify____array_1_0(MR_Mercury_Type_Info type_info,
> MR_Array x, MR_Array y)
> {
> return mercury__array__array_equal_2_p_0(type_info, x, y);
> }
>
> -void
> +MR_CALL void
> mercury__array____Compare____array_1_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Array x, MR_Array y)
> Index: library/builtin.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/library/builtin.m,v
> retrieving revision 1.44
> diff -u -d -u -r1.44 builtin.m
> --- library/builtin.m 2000/11/23 01:59:53 1.44
> +++ library/builtin.m 2000/11/24 15:46:15
> @@ -398,8 +398,8 @@
>
> :- pragma c_header_code("
> #ifdef MR_HIGHLEVEL_CODE
> - void mercury__builtin__copy_2_p_0(MR_Mercury_Type_Info, MR_Box, MR_Box *);
> - void mercury__builtin__copy_2_p_1(MR_Mercury_Type_Info, MR_Box, MR_Box *);
> + MR_CALL void mercury__builtin__copy_2_p_0(MR_Mercury_Type_Info, MR_Box, MR_Box *);
> + MR_CALL void mercury__builtin__copy_2_p_1(MR_Mercury_Type_Info, MR_Box, MR_Box *);
> #endif
> ").
>
> @@ -407,7 +407,7 @@
>
> #ifdef MR_HIGHLEVEL_CODE
>
> -void
> +MR_CALL void
> mercury__builtin__copy_2_p_0(MR_Mercury_Type_Info type_info,
> MR_Box value, MR_Box * copy)
> {
> @@ -415,7 +415,7 @@
> *copy = (MR_Box) deep_copy(&val, (MR_TypeInfo) type_info, NULL, NULL);
> }
>
> -void
> +MR_CALL void
> mercury__builtin__copy_2_p_1(MR_Mercury_Type_Info type_info, MR_Box x, MR_Box * y)
> {
> mercury__builtin__copy_2_p_0(type_info, x, y);
> Index: library/exception.m
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/library/exception.m,v
> retrieving revision 1.33
> diff -u -d -u -r1.33 exception.m
> --- library/exception.m 2000/11/23 01:59:54 1.33
> +++ library/exception.m 2000/11/24 15:48:02
> @@ -503,16 +503,16 @@
> #define mercury__exception__builtin_catch_3_p_5 \
> mercury__exception__builtin_catch_model_non
>
> - void mercury__exception__builtin_throw_1_p_0(MR_Univ);
> + MR_CALL void mercury__exception__builtin_throw_1_p_0(MR_Univ);
>
> - void mercury__exception__builtin_throw_1_p_0(MR_Univ exception);
> - void mercury__exception__builtin_catch_model_det(
> + MR_CALL void mercury__exception__builtin_throw_1_p_0(MR_Univ exception);
> + MR_CALL void mercury__exception__builtin_catch_model_det(
> MR_Mercury_Type_Info type_info, MR_Pred pred, MR_Pred handler_pred,
> MR_Box *output);
> - bool mercury__exception__builtin_catch_model_semi(
> + MR_CALL bool mercury__exception__builtin_catch_model_semi(
> MR_Mercury_Type_Info type_info, MR_Pred pred, MR_Pred handler_pred,
> MR_Box *output);
> - void mercury__exception__builtin_catch_model_non(
> + MR_CALL void mercury__exception__builtin_catch_model_non(
> MR_Mercury_Type_Info type_info, MR_Pred pred, MR_Pred handler_pred,
> MR_Box *output,
> #ifdef MR_USE_GCC_NESTED_FUNCTIONS
> @@ -600,7 +600,7 @@
>
> ML_ExceptionHandler *ML_exception_handler;
>
> -void
> +MR_CALL void
> mercury__exception__builtin_throw_1_p_0(MR_Univ exception)
> {
> if (ML_exception_handler == NULL) {
> @@ -616,7 +616,7 @@
> }
> }
>
> -void
> +MR_CALL void
> mercury__exception__builtin_catch_model_det(MR_Mercury_Type_Info type_info,
> MR_Pred pred, MR_Pred handler_pred, MR_Box *output)
> {
> @@ -644,7 +644,7 @@
> }
> }
>
> -bool
> +MR_CALL bool
> mercury__exception__builtin_catch_model_semi(MR_Mercury_Type_Info type_info,
> MR_Pred pred, MR_Pred handler_pred, MR_Box *output)
> {
> @@ -676,7 +676,7 @@
>
> #ifdef MR_USE_GCC_NESTED_FUNCTIONS
>
> -void
> +MR_CALL void
> mercury__exception__builtin_catch_model_non(MR_Mercury_Type_Info type_info,
> MR_Pred pred, MR_Pred handler_pred, MR_Box *output,
> MR_NestedCont cont)
> @@ -756,7 +756,7 @@
> ML_exception_handler = &env->this_handler;
> }
>
> -void
> +MR_CALL void
> mercury__exception__builtin_catch_model_non(MR_Mercury_Type_Info type_info,
> MR_Pred pred, MR_Pred handler_pred, MR_Box *output,
> MR_Cont cont, void *cont_env)
> cvs diff: Diffing profiler
> cvs diff: Diffing robdd
> cvs diff: Diffing runtime
> Index: runtime/mercury.c
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/runtime/mercury.c,v
> retrieving revision 1.16
> diff -u -d -u -r1.16 mercury.c
> --- runtime/mercury.c 2000/11/23 02:00:20 1.16
> +++ runtime/mercury.c 2000/11/24 12:04:13
> @@ -35,34 +35,36 @@
>
> /* Types for the wrapper versions of type-specific unify/compare procedures. */
>
> -typedef bool MR_UnifyFunc_0(MR_Box, MR_Box);
> -typedef bool MR_UnifyFunc_1(MR_Mercury_Type_Info, MR_Box, MR_Box);
> -typedef bool MR_UnifyFunc_2(MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> +typedef MR_CALL bool MR_UnifyFunc_0(MR_Box, MR_Box);
> +typedef MR_CALL bool MR_UnifyFunc_1(MR_Mercury_Type_Info, MR_Box, MR_Box);
> +typedef MR_CALL bool MR_UnifyFunc_2(MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> MR_Box, MR_Box);
> -typedef bool MR_UnifyFunc_3(MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> +typedef MR_CALL bool MR_UnifyFunc_3(MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> MR_Mercury_Type_Info, MR_Box, MR_Box);
> -typedef bool MR_UnifyFunc_4(MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> +typedef MR_CALL bool MR_UnifyFunc_4(MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> MR_Box, MR_Box);
> -typedef bool MR_UnifyFunc_5(MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> +typedef MR_CALL bool MR_UnifyFunc_5(MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> MR_Mercury_Type_Info, MR_Box, MR_Box);
>
> -typedef void MR_CompareFunc_0(MR_Comparison_Result *, MR_Box, MR_Box);
> -typedef void MR_CompareFunc_1(MR_Mercury_Type_Info,
> - MR_Comparison_Result *, MR_Box, MR_Box);
> -typedef void MR_CompareFunc_2(MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> - MR_Comparison_Result *, MR_Box, MR_Box);
> -typedef void MR_CompareFunc_3(MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> - MR_Mercury_Type_Info,
> - MR_Comparison_Result *, MR_Box, MR_Box);
> -typedef void MR_CompareFunc_4(MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> - MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> - MR_Comparison_Result *, MR_Box, MR_Box);
> -typedef void MR_CompareFunc_5(MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> - MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> - MR_Mercury_Type_Info,
> - MR_Comparison_Result *, MR_Box, MR_Box);
> +typedef MR_CALL void MR_CompareFunc_0(MR_Comparison_Result *, MR_Box, MR_Box);
> +typedef MR_CALL void MR_CompareFunc_1(MR_Mercury_Type_Info,
> + MR_Comparison_Result *, MR_Box, MR_Box);
> +typedef MR_CALL void MR_CompareFunc_2(MR_Mercury_Type_Info,
> + MR_Mercury_Type_Info, MR_Comparison_Result *,
> + MR_Box, MR_Box);
> +typedef MR_CALL void MR_CompareFunc_3(MR_Mercury_Type_Info,
> + MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> + MR_Comparison_Result *, MR_Box, MR_Box);
> +typedef MR_CALL void MR_CompareFunc_4(MR_Mercury_Type_Info,
> + MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> + MR_Mercury_Type_Info, MR_Comparison_Result *,
> + MR_Box, MR_Box);
> +typedef MR_CALL void MR_CompareFunc_5(MR_Mercury_Type_Info,
> + MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> + MR_Mercury_Type_Info, MR_Mercury_Type_Info,
> + MR_Comparison_Result *, MR_Box, MR_Box);
>
> /*---------------------------------------------------------------------------*/
> /*
> @@ -202,7 +204,7 @@
> ** Define the generic unify/2 and compare/3 functions.
> */
>
> -bool
> +MR_CALL bool
> mercury__builtin__unify_2_p_0(MR_Mercury_Type_Info ti, MR_Box x, MR_Box y)
> {
> MR_TypeInfo type_info;
> @@ -259,7 +261,7 @@
> }
> }
>
> -void
> +MR_CALL void
> mercury__builtin__compare_3_p_0(MR_Mercury_Type_Info ti,
> MR_Comparison_Result *res, MR_Box x, MR_Box y)
> {
> @@ -324,21 +326,21 @@
> }
> }
>
> -void
> +MR_CALL void
> mercury__builtin__compare_3_p_1(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *res, MR_Box x, MR_Box y)
> {
> mercury__builtin__compare_3_p_0(type_info, res, x, y);
> }
>
> -void
> +MR_CALL void
> mercury__builtin__compare_3_p_2(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *res, MR_Box x, MR_Box y)
> {
> mercury__builtin__compare_3_p_0(type_info, res, x, y);
> }
>
> -void
> +MR_CALL void
> mercury__builtin__compare_3_p_3(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *res, MR_Box x, MR_Box y)
> {
> @@ -364,56 +366,56 @@
> ** Unification procedures with the arguments unboxed.
> */
>
> -bool
> +MR_CALL bool
> mercury__builtin____Unify____int_0_0(MR_Integer x, MR_Integer y)
> {
> return x == y;
> }
>
> -bool
> +MR_CALL bool
> mercury__builtin____Unify____string_0_0(MR_String x, MR_String y)
> {
> return strcmp(x, y) == 0;
> }
>
> -bool
> +MR_CALL bool
> mercury__builtin____Unify____float_0_0(MR_Float x, MR_Float y)
> {
> /* XXX what should this function do when x and y are both NaNs? */
> return x == y;
> }
>
> -bool
> +MR_CALL bool
> mercury__builtin____Unify____character_0_0(MR_Char x, MR_Char y)
> {
> return x == y;
> }
>
> -bool
> +MR_CALL bool
> mercury__builtin____Unify____void_0_0(MR_Void x, MR_Void y)
> {
> MR_fatal_error("called unify for type `void'");
> }
>
> -bool
> +MR_CALL bool
> mercury__builtin____Unify____c_pointer_0_0(MR_C_Pointer x, MR_C_Pointer y)
> {
> return (void *) x == (void *) y;
> }
>
> -bool
> +MR_CALL bool
> mercury__builtin____Unify____func_0_0(MR_Func x, MR_Func y)
> {
> MR_fatal_error("called unify for `func' type");
> }
>
> -bool
> +MR_CALL bool
> mercury__builtin____Unify____pred_0_0(MR_Pred x, MR_Pred y)
> {
> MR_fatal_error("called unify for `pred' type");
> }
>
> -bool
> +MR_CALL bool
> mercury__builtin____Unify____tuple_0_0(MR_Mercury_Type_Info ti,
> MR_Tuple x, MR_Tuple y)
> {
> @@ -438,7 +440,7 @@
> return TRUE;
> }
>
> -bool
> +MR_CALL bool
> mercury__std_util____Unify____univ_0_0(MR_Univ x, MR_Univ y)
> {
> MR_TypeInfo typeinfo_x, typeinfo_y;
> @@ -458,7 +460,7 @@
> (MR_Box) value_x, (MR_Box) value_y);
> }
>
> -bool
> +MR_CALL bool
> mercury__std_util____Unify____type_desc_0_0(MR_Type_Desc x, MR_Type_Desc y)
> {
> int comp;
> @@ -468,7 +470,7 @@
> return (comp == MR_COMPARE_EQUAL);
> }
>
> -bool
> +MR_CALL bool
> mercury__private_builtin____Unify____type_ctor_info_1_0(
> MR_Mercury_Type_Info type_info,
> MR_Mercury_Type_Ctor_Info x, MR_Mercury_Type_Ctor_Info y)
> @@ -476,7 +478,7 @@
> SORRY("unify for type_ctor_info");
> }
>
> -bool
> +MR_CALL bool
> mercury__private_builtin____Unify____type_info_1_0(
> MR_Mercury_Type_Info type_info,
> MR_Mercury_Type_Info x, MR_Mercury_Type_Info y)
> @@ -488,7 +490,7 @@
> return (comp == MR_COMPARE_EQUAL);
> }
>
> -bool
> +MR_CALL bool
> mercury__private_builtin____Unify____typeclass_info_1_0(
> MR_Mercury_Type_Info type_info,
> MR_Mercury_TypeClass_Info x, MR_Mercury_TypeClass_Info y)
> @@ -496,7 +498,7 @@
> MR_fatal_error("attempt to unify typeclass_info");
> }
>
> -bool
> +MR_CALL bool
> mercury__private_builtin____Unify____base_typeclass_info_1_0(
> MR_Mercury_Type_Info type_info,
> MR_Mercury_Base_TypeClass_Info x, MR_Mercury_Base_TypeClass_Info y)
> @@ -509,7 +511,7 @@
> ** Comparison procedures with the arguments unboxed.
> */
>
> -void
> +MR_CALL void
> mercury__builtin____Compare____int_0_0(
> MR_Comparison_Result *result, MR_Integer x, MR_Integer y)
> {
> @@ -518,7 +520,7 @@
> MR_COMPARE_LESS);
> }
>
> -void
> +MR_CALL void
> mercury__builtin____Compare____string_0_0(MR_Comparison_Result *result,
> MR_String x, MR_String y)
> {
> @@ -528,7 +530,7 @@
> MR_COMPARE_LESS);
> }
>
> -void
> +MR_CALL void
> mercury__builtin____Compare____float_0_0(
> MR_Comparison_Result *result, MR_Float x, MR_Float y)
> {
> @@ -540,7 +542,7 @@
> MR_COMPARE_EQUAL));
> }
>
> -void
> +MR_CALL void
> mercury__builtin____Compare____character_0_0(
> MR_Comparison_Result *result, MR_Char x, MR_Char y)
> {
> @@ -549,14 +551,14 @@
> MR_COMPARE_LESS);
> }
>
> -void
> +MR_CALL void
> mercury__builtin____Compare____void_0_0(MR_Comparison_Result *result,
> MR_Void x, MR_Void y)
> {
> MR_fatal_error("called compare/3 for type `void'");
> }
>
> -void
> +MR_CALL void
> mercury__builtin____Compare____c_pointer_0_0(
> MR_Comparison_Result *result, MR_C_Pointer x, MR_C_Pointer y)
> {
> @@ -567,21 +569,21 @@
> );
> }
>
> -void
> +MR_CALL void
> mercury__builtin____Compare____func_0_0(MR_Comparison_Result *result,
> MR_Func x, MR_Func y)
> {
> MR_fatal_error("called compare/3 for `func' type");
> }
>
> -void
> +MR_CALL void
> mercury__builtin____Compare____pred_0_0(MR_Comparison_Result *result,
> MR_Pred x, MR_Pred y)
> {
> MR_fatal_error("called compare/3 for `pred' type");
> }
>
> -void
> +MR_CALL void
> mercury__builtin____Compare____tuple_0_0(MR_Mercury_Type_Info ti,
> MR_Comparison_Result *result, MR_Tuple x, MR_Tuple y)
> {
> @@ -605,7 +607,7 @@
> *result = MR_COMPARE_EQUAL;
> }
>
> -void
> +MR_CALL void
> mercury__std_util____Compare____univ_0_0(MR_Comparison_Result *result,
> MR_Univ x, MR_Univ y)
> {
> @@ -627,7 +629,7 @@
> result, (MR_Box) value_x, (MR_Box) value_y);
> }
>
> -void
> +MR_CALL void
> mercury__std_util____Compare____type_desc_0_0(
> MR_Comparison_Result *result, MR_Type_Desc x, MR_Type_Desc y)
> {
> @@ -637,7 +639,7 @@
> *result = comp;
> }
>
> -void
> +MR_CALL void
> mercury__private_builtin____Compare____type_ctor_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Mercury_Type_Ctor_Info x, MR_Mercury_Type_Ctor_Info y)
> @@ -645,7 +647,7 @@
> SORRY("compare for type_ctor_info");
> }
>
> -void
> +MR_CALL void
> mercury__private_builtin____Compare____type_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Mercury_Type_Info x, MR_Mercury_Type_Info y)
> @@ -656,7 +658,7 @@
> *result = comp;
> }
>
> -void
> +MR_CALL void
> mercury__private_builtin____Compare____typeclass_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Mercury_TypeClass_Info x, MR_Mercury_TypeClass_Info y)
> @@ -664,7 +666,7 @@
> MR_fatal_error("attempt to compare typeclass_info");
> }
>
> -void
> +MR_CALL void
> mercury__private_builtin____Compare____base_typeclass_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Mercury_Base_TypeClass_Info x, MR_Mercury_Base_TypeClass_Info y)
> @@ -678,60 +680,60 @@
> ** These are just wrappers which call the unboxed version.
> */
>
> -static bool
> +static MR_CALL bool
> mercury__builtin__do_unify__int_0_0(MR_Box x, MR_Box y)
> {
> return mercury__builtin____Unify____int_0_0(
> (MR_Integer) x, (MR_Integer) y);
> }
>
> -static bool
> +static MR_CALL bool
> mercury__builtin__do_unify__string_0_0(MR_Box x, MR_Box y)
> {
> return mercury__builtin____Unify____string_0_0(
> (MR_String) x, (MR_String) y);
> }
>
> -static bool
> +static MR_CALL bool
> mercury__builtin__do_unify__float_0_0(MR_Box x, MR_Box y)
> {
> return mercury__builtin____Unify____float_0_0(
> MR_unbox_float(x), MR_unbox_float(y));
> }
>
> -static bool
> +static MR_CALL bool
> mercury__builtin__do_unify__character_0_0(MR_Box x, MR_Box y)
> {
> return mercury__builtin____Unify____character_0_0(
> (MR_Char) (MR_Word) x, (MR_Char) (MR_Word) y);
> }
>
> -static bool
> +static MR_CALL bool
> mercury__builtin__do_unify__void_0_0(MR_Box x, MR_Box y)
> {
> MR_fatal_error("called unify for type `void'");
> }
>
> -static bool
> +static MR_CALL bool
> mercury__builtin__do_unify__c_pointer_0_0(MR_Box x, MR_Box y)
> {
> return mercury__builtin____Unify____c_pointer_0_0(
> (MR_C_Pointer) x, (MR_C_Pointer) y);
> }
>
> -static bool
> +static MR_CALL bool
> mercury__builtin__do_unify__func_0_0(MR_Box x, MR_Box y)
> {
> MR_fatal_error("called unify for `func' type");
> }
>
> -static bool
> +static MR_CALL bool
> mercury__builtin__do_unify__pred_0_0(MR_Box x, MR_Box y)
> {
> MR_fatal_error("called unify for `pred' type");
> }
>
> -static bool
> +static MR_CALL bool
> mercury__builtin__do_unify__tuple_0_0(MR_Mercury_Type_Info type_info,
> MR_Box x, MR_Box y)
> {
> @@ -739,7 +741,7 @@
> type_info, (MR_Tuple) x, (MR_Tuple) y);
> }
>
> -static bool
> +static MR_CALL bool
> mercury__array__do_unify__array_1_0(MR_Mercury_Type_Info type_info,
> MR_Box x, MR_Box y)
> {
> @@ -747,21 +749,21 @@
> type_info, (MR_Array) x, (MR_Array) y);
> }
>
> -static bool
> +static MR_CALL bool
> mercury__std_util__do_unify__univ_0_0(MR_Box x, MR_Box y)
> {
> return mercury__std_util____Unify____univ_0_0(
> (MR_Univ) x, (MR_Univ) y);
> }
>
> -static bool
> +static MR_CALL bool
> mercury__std_util__do_unify__type_desc_0_0(MR_Box x, MR_Box y)
> {
> return mercury__std_util____Unify____type_desc_0_0(
> (MR_Type_Desc) x, (MR_Type_Desc) y);
> }
>
> -static bool
> +static MR_CALL bool
> mercury__private_builtin__do_unify__type_ctor_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Box x, MR_Box y)
> {
> @@ -769,7 +771,7 @@
> type_info, (MR_Mercury_Type_Ctor_Info) x, (MR_Mercury_Type_Ctor_Info) y);
> }
>
> -static bool
> +static MR_CALL bool
> mercury__private_builtin__do_unify__type_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Box x, MR_Box y)
> {
> @@ -777,7 +779,7 @@
> type_info, (MR_Mercury_Type_Info) x, (MR_Mercury_Type_Info) y);
> }
>
> -static bool
> +static MR_CALL bool
> mercury__private_builtin__do_unify__typeclass_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Box x, MR_Box y)
> {
> @@ -785,7 +787,7 @@
> type_info, (MR_Mercury_TypeClass_Info) x, (MR_Mercury_TypeClass_Info) y);
> }
>
> -static bool
> +static MR_CALL bool
> mercury__private_builtin__do_unify__base_typeclass_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Box x, MR_Box y)
> {
> @@ -801,7 +803,7 @@
> ** These are just wrappers which call the unboxed version.
> */
>
> -static void
> +static MR_CALL void
> mercury__builtin__do_compare__int_0_0(
> MR_Comparison_Result *result, MR_Box x, MR_Box y)
> {
> @@ -809,7 +811,7 @@
> (MR_Integer) x, (MR_Integer) y);
> }
>
> -static void
> +static MR_CALL void
> mercury__builtin__do_compare__string_0_0(
> MR_Comparison_Result *result, MR_Box x, MR_Box y)
> {
> @@ -817,7 +819,7 @@
> (MR_String) x, (MR_String) y);
> }
>
> -static void
> +static MR_CALL void
> mercury__builtin__do_compare__float_0_0(
> MR_Comparison_Result *result, MR_Box x, MR_Box y)
> {
> @@ -825,7 +827,7 @@
> MR_unbox_float(x), MR_unbox_float(y));
> }
>
> -static void
> +static MR_CALL void
> mercury__builtin__do_compare__character_0_0(
> MR_Comparison_Result *result, MR_Box x, MR_Box y)
> {
> @@ -833,14 +835,14 @@
> result, (MR_Char) (MR_Word) x, (MR_Char) (MR_Word) y);
> }
>
> -static void
> +static MR_CALL void
> mercury__builtin__do_compare__void_0_0(
> MR_Comparison_Result *result, MR_Box x, MR_Box y)
> {
> MR_fatal_error("called compare/3 for type `void'");
> }
>
> -static void
> +static MR_CALL void
> mercury__builtin__do_compare__c_pointer_0_0(
> MR_Comparison_Result *result, MR_Box x, MR_Box y)
> {
> @@ -848,21 +850,21 @@
> result, (MR_C_Pointer) x, (MR_C_Pointer) y);
> }
>
> -static void
> +static MR_CALL void
> mercury__builtin__do_compare__func_0_0(
> MR_Comparison_Result *result, MR_Box x, MR_Box y)
> {
> MR_fatal_error("called compare/3 for func type");
> }
>
> -static void
> +static MR_CALL void
> mercury__builtin__do_compare__pred_0_0(MR_Comparison_Result *result,
> MR_Box x, MR_Box y)
> {
> MR_fatal_error("called compare/3 for pred type");
> }
>
> -static void
> +static MR_CALL void
> mercury__builtin__do_compare__tuple_0_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Box x, MR_Box y)
> @@ -871,7 +873,7 @@
> type_info, result, (MR_Tuple) x, (MR_Tuple) y);
> }
>
> -static void
> +static MR_CALL void
> mercury__array__do_compare__array_1_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Box x, MR_Box y)
> @@ -880,7 +882,7 @@
> type_info, result, (MR_Array) x, (MR_Array) y);
> }
>
> -static void
> +static MR_CALL void
> mercury__std_util__do_compare__univ_0_0(
> MR_Comparison_Result *result, MR_Box x, MR_Box y)
> {
> @@ -888,7 +890,7 @@
> result, (MR_Univ) x, (MR_Univ) y);
> }
>
> -static void
> +static MR_CALL void
> mercury__std_util__do_compare__type_desc_0_0(
> MR_Comparison_Result *result, MR_Box x, MR_Box y)
> {
> @@ -896,7 +898,7 @@
> result, (MR_Type_Desc) x, (MR_Type_Desc) y);
> }
>
> -static void
> +static MR_CALL void
> mercury__private_builtin__do_compare__type_ctor_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Box x, MR_Box y)
> @@ -906,7 +908,7 @@
> (MR_Mercury_Type_Ctor_Info) x, (MR_Mercury_Type_Ctor_Info) y);
> }
>
> -static void
> +static MR_CALL void
> mercury__private_builtin__do_compare__type_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Box x, MR_Box y)
> @@ -915,7 +917,7 @@
> type_info, result, (MR_Mercury_Type_Info) x, (MR_Mercury_Type_Info) y);
> }
>
> -static void
> +static MR_CALL void
> mercury__private_builtin__do_compare__typeclass_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Box x, MR_Box y)
> @@ -925,7 +927,7 @@
> (MR_Mercury_TypeClass_Info) x, (MR_Mercury_TypeClass_Info) y);
> }
>
> -static void
> +static MR_CALL void
> mercury__private_builtin__do_compare__base_typeclass_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Box x, MR_Box y)
> Index: runtime/mercury.h
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/runtime/mercury.h,v
> retrieving revision 1.25
> diff -u -d -u -r1.25 mercury.h
> --- runtime/mercury.h 2000/11/06 10:43:40 1.25
> +++ runtime/mercury.h 2000/11/24 04:10:49
> @@ -360,79 +360,81 @@
> ** Function declarations
> */
>
> -bool mercury__builtin__unify_2_p_0(MR_Mercury_Type_Info, MR_Box, MR_Box);
> -void mercury__builtin__compare_3_p_0(MR_Mercury_Type_Info,
> +MR_CALL bool mercury__builtin__unify_2_p_0(MR_Mercury_Type_Info,
> + MR_Box, MR_Box);
> +MR_CALL void mercury__builtin__compare_3_p_0(MR_Mercury_Type_Info,
> MR_Comparison_Result *, MR_Box, MR_Box);
> -void mercury__builtin__compare_3_p_1(MR_Mercury_Type_Info,
> +MR_CALL void mercury__builtin__compare_3_p_1(MR_Mercury_Type_Info,
> MR_Comparison_Result *, MR_Box, MR_Box);
> -void mercury__builtin__compare_3_p_2(MR_Mercury_Type_Info,
> +MR_CALL void mercury__builtin__compare_3_p_2(MR_Mercury_Type_Info,
> MR_Comparison_Result *, MR_Box, MR_Box);
> -void mercury__builtin__compare_3_p_3(MR_Mercury_Type_Info,
> +MR_CALL void mercury__builtin__compare_3_p_3(MR_Mercury_Type_Info,
> MR_Comparison_Result *, MR_Box, MR_Box);
>
> -bool mercury__builtin____Unify____int_0_0(MR_Integer x, MR_Integer y);
> -bool mercury__builtin____Unify____string_0_0(MR_String x, MR_String y);
> -bool mercury__builtin____Unify____float_0_0(MR_Float x, MR_Float y);
> -bool mercury__builtin____Unify____character_0_0(MR_Char x, MR_Char);
> -bool mercury__builtin____Unify____void_0_0(MR_Void x, MR_Void y);
> -bool mercury__builtin____Unify____c_pointer_0_0(
> +MR_CALL bool mercury__builtin____Unify____int_0_0(MR_Integer x, MR_Integer y);
> +MR_CALL bool mercury__builtin____Unify____string_0_0(MR_String x, MR_String y);
> +MR_CALL bool mercury__builtin____Unify____float_0_0(MR_Float x, MR_Float y);
> +MR_CALL bool mercury__builtin____Unify____character_0_0(MR_Char x, MR_Char);
> +MR_CALL bool mercury__builtin____Unify____void_0_0(MR_Void x, MR_Void y);
> +MR_CALL bool mercury__builtin____Unify____c_pointer_0_0(
> MR_C_Pointer x, MR_C_Pointer y);
> -bool mercury__builtin____Unify____func_0_0(MR_Func x, MR_Func y);
> -bool mercury__builtin____Unify____pred_0_0(MR_Pred x, MR_Pred y);
> -bool mercury__builtin____Unify____tuple_0_0(MR_Mercury_Type_Info type_info,
> - MR_Tuple x, MR_Tuple y);
> -bool mercury__array____Unify____array_1_0(MR_Mercury_Type_Info type_info,
> - MR_Array x, MR_Array y);
> -bool mercury__std_util____Unify____univ_0_0(MR_Univ x, MR_Univ y);
> -bool mercury__std_util____Unify____type_desc_0_0(
> +MR_CALL bool mercury__builtin____Unify____func_0_0(MR_Func x, MR_Func y);
> +MR_CALL bool mercury__builtin____Unify____pred_0_0(MR_Pred x, MR_Pred y);
> +MR_CALL bool mercury__builtin____Unify____tuple_0_0(
> + MR_Mercury_Type_Info type_info, MR_Tuple x, MR_Tuple y);
> +MR_CALL bool mercury__array____Unify____array_1_0(
> + MR_Mercury_Type_Info type_info, MR_Array x, MR_Array y);
> +MR_CALL bool mercury__std_util____Unify____univ_0_0(MR_Univ x, MR_Univ y);
> +MR_CALL bool mercury__std_util____Unify____type_desc_0_0(
> MR_Type_Desc x, MR_Type_Desc y);
> -bool mercury__private_builtin____Unify____type_ctor_info_1_0(
> +MR_CALL bool mercury__private_builtin____Unify____type_ctor_info_1_0(
> MR_Mercury_Type_Info type_info,
> MR_Mercury_Type_Ctor_Info x, MR_Mercury_Type_Ctor_Info y);
> -bool mercury__private_builtin____Unify____type_info_1_0(
> +MR_CALL bool mercury__private_builtin____Unify____type_info_1_0(
> MR_Mercury_Type_Info type_info,
> MR_Mercury_Type_Info x, MR_Mercury_Type_Info y);
> -bool mercury__private_builtin____Unify____typeclass_info_1_0(
> +MR_CALL bool mercury__private_builtin____Unify____typeclass_info_1_0(
> MR_Mercury_Type_Info type_info,
> MR_Mercury_TypeClass_Info x, MR_Mercury_TypeClass_Info y);
> -bool mercury__private_builtin____Unify____base_typeclass_info_1_0(
> +MR_CALL bool mercury__private_builtin____Unify____base_typeclass_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Mercury_Base_TypeClass_Info x,
> MR_Mercury_Base_TypeClass_Info y);
>
> -void mercury__builtin____Compare____int_0_0(
> +MR_CALL void mercury__builtin____Compare____int_0_0(
> MR_Comparison_Result *result, MR_Integer x, MR_Integer y);
> -void mercury__builtin____Compare____string_0_0(
> +MR_CALL void mercury__builtin____Compare____string_0_0(
> MR_Comparison_Result *result, MR_String x, MR_String y);
> -void mercury__builtin____Compare____float_0_0(
> +MR_CALL void mercury__builtin____Compare____float_0_0(
> MR_Comparison_Result *result, MR_Float x, MR_Float y);
> -void mercury__builtin____Compare____character_0_0(
> +MR_CALL void mercury__builtin____Compare____character_0_0(
> MR_Comparison_Result *result, MR_Char x, MR_Char y);
> -void mercury__builtin____Compare____void_0_0(
> +MR_CALL void mercury__builtin____Compare____void_0_0(
> MR_Comparison_Result *result, MR_Void x, MR_Void y);
> -void mercury__builtin____Compare____c_pointer_0_0(
> +MR_CALL void mercury__builtin____Compare____c_pointer_0_0(
> MR_Comparison_Result *result, MR_C_Pointer x, MR_C_Pointer y);
> -void mercury__builtin____Compare____func_0_0(
> +MR_CALL void mercury__builtin____Compare____func_0_0(
> MR_Comparison_Result *result, MR_Func x, MR_Func y);
> -void mercury__builtin____Compare____pred_0_0(
> +MR_CALL void mercury__builtin____Compare____pred_0_0(
> MR_Comparison_Result *result, MR_Pred x, MR_Pred y);
> -void mercury__builtin____Compare____tuple_0_0(MR_Mercury_Type_Info type_info,
> - MR_Comparison_Result *result, MR_Tuple x, MR_Tuple y);
> -void mercury__array____Compare____array_1_0(MR_Mercury_Type_Info type_info,
> - MR_Comparison_Result *result, MR_Array x, MR_Array y);
> -void mercury__std_util____Compare____univ_0_0(
> +MR_CALL void mercury__builtin____Compare____tuple_0_0(
> + MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> + MR_Tuple x, MR_Tuple y);
> +MR_CALL void mercury__array____Compare____array_1_0(MR_Mercury_Type_Info
> + type_info, MR_Comparison_Result *result, MR_Array x, MR_Array y);
> +MR_CALL void mercury__std_util____Compare____univ_0_0(
> MR_Comparison_Result *result, MR_Univ x, MR_Univ y);
> -void mercury__std_util____Compare____type_desc_0_0(
> +MR_CALL void mercury__std_util____Compare____type_desc_0_0(
> MR_Comparison_Result *result, MR_Type_Desc x, MR_Type_Desc y);
> -void mercury__private_builtin____Compare____type_ctor_info_1_0(
> +MR_CALL void mercury__private_builtin____Compare____type_ctor_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Mercury_Type_Ctor_Info x, MR_Mercury_Type_Ctor_Info y);
> -void mercury__private_builtin____Compare____type_info_1_0(
> +MR_CALL void mercury__private_builtin____Compare____type_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Mercury_Type_Info x, MR_Mercury_Type_Info y);
> -void mercury__private_builtin____Compare____typeclass_info_1_0(
> +MR_CALL void mercury__private_builtin____Compare____typeclass_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Mercury_TypeClass_Info x, MR_Mercury_TypeClass_Info y);
> -void mercury__private_builtin____Compare____base_typeclass_info_1_0(
> +MR_CALL void mercury__private_builtin____Compare____base_typeclass_info_1_0(
> MR_Mercury_Type_Info type_info, MR_Comparison_Result *result,
> MR_Mercury_Base_TypeClass_Info x, MR_Mercury_Base_TypeClass_Info y);
>
> Index: runtime/mercury_types.h
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/runtime/mercury_types.h,v
> retrieving revision 1.23
> diff -u -d -u -r1.23 mercury_types.h
> --- runtime/mercury_types.h 2000/11/23 02:00:49 1.23
> +++ runtime/mercury_types.h 2000/11/24 12:00:42
> @@ -92,9 +92,22 @@
> typedef MR_Char *MR_String;
> typedef const MR_Char *MR_ConstString;
>
> +/*
> +** If MR_USE_REGPARM is defined, and we're using gcc on x86,
> +** then for the MLDS back-end we use a non-standard but more efficient
> +** calling convention for the C functions that we generate.
> +*/
> +#ifndef MR_CALL
> + #if defined(MR_USE_REGPARM) && defined(__GNUC__) && defined(__i386)
> + #define MR_CALL __attribute__((__regparm__(2)))
> + #else
> + #define MR_CALL
> + #endif
> +#endif
> +
> /* continuation function type, for --high-level-code option */
> -typedef void (*MR_NestedCont) (void); /* for --gcc-nested-functions */
> -typedef void (*MR_Cont) (void *); /* for --no-gcc-nested-functions */
> +typedef MR_CALL void (*MR_NestedCont) (void); /* for --gcc-nested-functions */
> +typedef MR_CALL void (*MR_Cont) (void *); /* for --no-gcc-nested-functions */
>
> #ifndef MR_HIGHLEVEL_CODE
> /*
> Index: runtime/mercury_wrapper.c
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/runtime/mercury_wrapper.c,v
> retrieving revision 1.78
> diff -u -d -u -r1.78 mercury_wrapper.c
> --- runtime/mercury_wrapper.c 2000/11/23 02:00:50 1.78
> +++ runtime/mercury_wrapper.c 2000/11/24 03:44:50
> @@ -185,7 +185,7 @@
> #endif
>
> #ifdef MR_HIGHLEVEL_CODE
> -void (*MR_program_entry_point)(void);
> +MR_CALL void (*MR_program_entry_point)(void);
> /* normally main_2_p_0 (main/2) */
> #else
> MR_Code *MR_program_entry_point;
> Index: runtime/mercury_wrapper.h
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/runtime/mercury_wrapper.h,v
> retrieving revision 1.38
> diff -u -d -u -r1.38 mercury_wrapper.h
> --- runtime/mercury_wrapper.h 2000/11/23 02:00:51 1.38
> +++ runtime/mercury_wrapper.h 2000/11/24 03:44:23
> @@ -65,7 +65,7 @@
> */
>
> #ifdef MR_HIGHLEVEL_CODE
> -extern void (*MR_program_entry_point)(void);
> +extern MR_CALL void (*MR_program_entry_point)(void);
> /* normally main_2_p_0 */
> #else
> extern MR_Code *MR_program_entry_point;
> cvs diff: Diffing runtime/GETOPT
> cvs diff: Diffing runtime/machdeps
> cvs diff: Diffing samples
> cvs diff: Diffing samples/c_interface
> cvs diff: Diffing samples/c_interface/c_calls_mercury
> cvs diff: Diffing samples/c_interface/cplusplus_calls_mercury
> cvs diff: Diffing samples/c_interface/mercury_calls_c
> cvs diff: Diffing samples/c_interface/mercury_calls_cplusplus
> cvs diff: Diffing samples/c_interface/mercury_calls_fortran
> cvs diff: Diffing samples/c_interface/simpler_c_calls_mercury
> cvs diff: Diffing samples/c_interface/simpler_cplusplus_calls_mercury
> cvs diff: Diffing samples/diff
> cvs diff: Diffing samples/muz
> cvs diff: Diffing samples/rot13
> cvs diff: Diffing samples/solutions
> cvs diff: Diffing samples/tests
> cvs diff: Diffing samples/tests/c_interface
> cvs diff: Diffing samples/tests/c_interface/c_calls_mercury
> cvs diff: Diffing samples/tests/c_interface/cplusplus_calls_mercury
> cvs diff: Diffing samples/tests/c_interface/mercury_calls_c
> cvs diff: Diffing samples/tests/c_interface/mercury_calls_cplusplus
> cvs diff: Diffing samples/tests/c_interface/mercury_calls_fortran
> cvs diff: Diffing samples/tests/c_interface/simpler_c_calls_mercury
> cvs diff: Diffing samples/tests/c_interface/simpler_cplusplus_calls_mercury
> cvs diff: Diffing samples/tests/diff
> cvs diff: Diffing samples/tests/muz
> cvs diff: Diffing samples/tests/rot13
> cvs diff: Diffing samples/tests/solutions
> cvs diff: Diffing samples/tests/toplevel
> cvs diff: Diffing scripts
> cvs diff: Diffing tests
> cvs diff: Diffing tests/benchmarks
> cvs diff: Diffing tests/debugger
> cvs diff: Diffing tests/debugger/declarative
> cvs diff: Diffing tests/dppd
> cvs diff: Diffing tests/general
> cvs diff: Diffing tests/general/accumulator
> cvs diff: Diffing tests/hard_coded
> cvs diff: Diffing tests/hard_coded/exceptions
> cvs diff: Diffing tests/hard_coded/purity
> cvs diff: Diffing tests/hard_coded/sub-modules
> cvs diff: Diffing tests/hard_coded/typeclasses
> cvs diff: Diffing tests/invalid
> cvs diff: Diffing tests/invalid/purity
> cvs diff: Diffing tests/misc_tests
> cvs diff: Diffing tests/tabling
> cvs diff: Diffing tests/term
> cvs diff: Diffing tests/valid
> cvs diff: Diffing tests/warnings
> cvs diff: Diffing tools
> cvs diff: Diffing trace
> cvs diff: Diffing trial
> cvs diff: Diffing util
> Index: util/mkinit.c
> ===================================================================
> RCS file: /home/mercury1/repository/mercury/util/mkinit.c,v
> retrieving revision 1.71
> diff -u -d -u -r1.71 mkinit.c
> --- util/mkinit.c 2000/11/23 06:33:25 1.71
> +++ util/mkinit.c 2000/11/24 03:44:16
> @@ -117,7 +117,7 @@
> "#define MR_TRACE_ENABLED %d\n"
> "\n"
> "#ifdef MR_HIGHLEVEL_CODE\n"
> - " extern void %s(void);\n"
> + " extern MR_CALL void %s(void);\n"
> "#else\n"
> " MR_declare_entry(%s);\n"
> "#endif\n"
> --
> Fergus Henderson <fjh at cs.mu.oz.au> | "I have always known that the pursuit
> | of excellence is a lethal habit"
> WWW: <http://www.cs.mu.oz.au/~fjh> | -- the last words of T. S. Garp.
--
Fergus Henderson <fjh at cs.mu.oz.au> | "I have always known that the pursuit
| of excellence is a lethal habit"
WWW: <http://www.cs.mu.oz.au/~fjh> | -- the last words of T. S. Garp.
--------------------------------------------------------------------------
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