mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-16 22:35:41 +00:00
Estimated hours taken: 1.5 Branches: main Remove residual parts of the Aditi backend that weren't deleted the other day. configure.in: Mmake.common.in: Remove support for enabling the Aditi backend. runtime/mercury_aditi.h: Remove this file. runtime/Mmakefile: runtime/mercury.h: runtime/mercury_imp.h: runtime/mercury_ho_call.[ch]: runtime/mercury_wrapper.[ch]: Delete support for Aditi in the runtime. scripts/Mmake.rules: scripts/Mmake.vars.in: scripts/c2init.in: scripts/parse_ml_options.sh-subr.in: Remove mmake support for building .rlo files, etc. util/mkinit.c: Remove Aditi specific code. compiler/bytecode_data.m: compiler/closure_analysis.m: compiler/code_model.m: compiler/compile_target_code.m: compiler/det_analysis.m: compiler/handle_options.m: compiler/hlds_goal.m: compiler/hlds_module.m: compiler/make.dependencies.m: compiler/make.m: compiler/make.module_target.m: compiler/make.program_target.m: compiler/make.util.m: compiler/make_hlds_error.m: compiler/make_hlds_passes.m: compiler/mercury_to_mercury.m: compiler/mlds_to_gcc.m: compiler/modecheck_call.m: compiler/modules.m: compiler/opt_debug.m: compiler/options.m: compiler/prog_data.m: compiler/prog_foreign.m: compiler/prog_mode.m: compiler/prog_type.m: compiler/rtti.m: compiler/rtti_out.m: compiler/rtti_to_mlds.m: compiler/term_errors.m: compiler/unify_proc.m: mdbcomp/prim_data.m: Remove residual support for Aditi. library/ops.m: Remove the 'aditi_bottom_up' and 'aditi_top_down' operators from the ops table. doc/reference_manual.texi: doc/user_guide.texi: Delete the sections on the Aditi interface. extras/aditi/*: Delete this.
173 lines
6.8 KiB
C
173 lines
6.8 KiB
C
/*
|
|
** vim: ts=4 sw=4 expandtab
|
|
*/
|
|
/*
|
|
** Copyright (C) 1999-2003, 2005-2006 The University of Melbourne.
|
|
** This file may only be copied under the terms of the GNU Library General
|
|
** Public License - see the file COPYING.LIB in the Mercury distribution.
|
|
*/
|
|
|
|
/*
|
|
** mercury_ho_call.h - defines the structure of closures.
|
|
**
|
|
** The places in the system that know about the layouts of closures are
|
|
**
|
|
** compiler/unify_gen.m (unify_gen__generate_construction_2)
|
|
** runtime/mercury_ho_call.[ch]
|
|
**
|
|
** Any changes here will need to be reflected in the other places as well.
|
|
*/
|
|
|
|
#ifndef MERCURY_HO_CALL_H
|
|
#define MERCURY_HO_CALL_H
|
|
|
|
#include "mercury_stack_layout.h" /* for MR_Closure_Id etc */
|
|
#include "mercury_type_info.h" /* for MR_PseudoTypeInfo */
|
|
#include "mercury_types.h" /* for MR_Closure */
|
|
#ifndef MR_HIGHLEVEL_CODE
|
|
#include "mercury_goto.h" /* for MR_declare_entry */
|
|
#ifdef MR_DO_CALL_STATS
|
|
#include <stdio.h> /* for FILE */
|
|
#endif
|
|
#endif
|
|
|
|
/*
|
|
** A closure layout structure identifies a procedure, and contains
|
|
** the information required to identify the types of the arguments
|
|
** in any closure that calls that procedure. It is represented as a
|
|
** vector of words containing
|
|
**
|
|
** a pointer to an MR_Closure_Id structure
|
|
** a pointer to information about the locations of typeinfos
|
|
** for the type parameters of the procedure
|
|
** (NULL if there are no type parameters)
|
|
** one word giving the number of arguments of the procedure (M)
|
|
** M words giving pseudotypeinfos for the arguments
|
|
**
|
|
** A closure that refers to the procedure may not (and probably will not)
|
|
** contain values for all the arguments of the procedure, but the closure
|
|
** layout structure has information about all arguments. This is to make
|
|
** the creation of a closure from another closure by adding some more
|
|
** hidden arguments as fast as possible. There is no problem in finding
|
|
** out which pseudotypeinfo describes which hidden argument, because if
|
|
** the closure contains n hidden arguments, these must be the first n arguments
|
|
** of the procedure.
|
|
**
|
|
** The typeinfo and typeclassinfo arguments describing the actual types bound
|
|
** to type vars are always at the start of the argument list. A closure can
|
|
** contain arg i but not arg j only if i < j; this means that if a closure
|
|
** contains a non-typeinfo argument j, it also contains all the typeinfo
|
|
** and typeclassinfo arguments of the procedure and therefore (directly or
|
|
** indirectly) all the typeinfos that may be referred to in the pseudotypeinfo
|
|
** for argument j. (If we ever allow code to take the address of a procedure
|
|
** whose signature includes an existential type, we may have to rethink this.)
|
|
**
|
|
** The MR_Live_Lvals inside MR_Type_Param_Locns, which encode the locations
|
|
** of the typeinfos for the type variables in the signature of the procedure,
|
|
** assume that argument i is in register ri. While this will be true at the
|
|
** time of the call, code that wants to manipulate the closure as an
|
|
** independent entity will have to substitute the argument vector in the
|
|
** closure itself for the register file.
|
|
**
|
|
** Note that if a module is compiled without typeinfo liveness, then closures
|
|
** will not have any layout information. This will be indicated by the value
|
|
** of num_all_args being negative, which says that the only field of this
|
|
** structure containing valid information is proc_id.
|
|
**
|
|
** The Dyn_Link variant is for closures created by browser/dl.m. The closure_id
|
|
** field of such closures will contain an invalid proc_id (which you can tell
|
|
** from the negative arity) and a creation context that is also different from
|
|
** other closures: instead of specifying the source context where the closure
|
|
** is created, it puts a sequence number into the field that normally contains
|
|
** the line number.
|
|
*/
|
|
|
|
typedef struct MR_Closure_Layout_Struct {
|
|
MR_Closure_Id *MR_closure_id;
|
|
MR_Type_Param_Locns *MR_closure_type_params;
|
|
MR_Integer MR_closure_num_all_args;
|
|
MR_PseudoTypeInfo MR_closure_arg_pseudo_type_info[MR_VARIABLE_SIZED];
|
|
} MR_Closure_Layout;
|
|
|
|
typedef struct MR_Closure_Dyn_Link_Layout_Struct {
|
|
MR_Closure_Id *MR_closure_dl_id;
|
|
MR_Type_Param_Locns *MR_closure_dl_type_params;
|
|
MR_Integer MR_closure_dl_num_all_args;
|
|
} MR_Closure_Dyn_Link_Layout;
|
|
|
|
/*
|
|
** A closure is a vector of words containing:
|
|
**
|
|
** one word pointing to the closure layout structure of the procedure
|
|
** one word pointing to the code of the procedure
|
|
** one word giving the number of arguments hidden in the closure (N)
|
|
** N words representing the N hidden arguments
|
|
**
|
|
** The reason why the closure layout pointer is first is that most operations
|
|
** on closures do not need to access that word, and this way it does not
|
|
** have be brought into the cache.
|
|
**
|
|
** Note that the arguments are numbered from one, but the array subscripts
|
|
** start at zero. To prevent this from being a problem, we use a deliberately
|
|
** ugly name for the field containing the array, and provide a nicer way of
|
|
** referring to the array via a macro. The arguments of this macro number
|
|
** the arguments from one.
|
|
*/
|
|
|
|
struct MR_Closure_Struct {
|
|
MR_Closure_Layout *MR_closure_layout;
|
|
MR_Code *MR_closure_code;
|
|
MR_Unsigned MR_closure_num_hidden_args;
|
|
MR_Word MR_closure_hidden_args_0[MR_VARIABLE_SIZED];
|
|
};
|
|
|
|
/* in mercury_types.h: typedef struct MR_Closure_Struct MR_Closure; */
|
|
|
|
#define MR_closure_hidden_args(i) MR_closure_hidden_args_0[(i) - 1]
|
|
|
|
#ifndef MR_HIGHLEVEL_CODE
|
|
#ifdef MR_DO_CALL_STATS
|
|
extern void MR_print_hidden_arg_stats(FILE *fp);
|
|
#endif
|
|
#endif
|
|
|
|
/*
|
|
** Build a closure for the given procedure address.
|
|
** This is used by browser/dl.m.
|
|
** MR_make_closure allocates heap, so call MR_{save,restore}_transient_hp()
|
|
** around calls to it.
|
|
*/
|
|
extern MR_Closure *MR_make_closure(MR_Code *address);
|
|
|
|
#ifdef MR_HIGHLEVEL_CODE
|
|
|
|
/*
|
|
** Function declarations
|
|
*/
|
|
|
|
MR_bool MR_CALL mercury__builtin__unify_2_p_0(MR_Mercury_Type_Info,
|
|
MR_Box, MR_Box);
|
|
void MR_CALL mercury__builtin__compare_3_p_0(MR_Mercury_Type_Info,
|
|
MR_Comparison_Result *, MR_Box, MR_Box);
|
|
void MR_CALL mercury__builtin__compare_3_p_1(MR_Mercury_Type_Info,
|
|
MR_Comparison_Result *, MR_Box, MR_Box);
|
|
void MR_CALL mercury__builtin__compare_3_p_2(MR_Mercury_Type_Info,
|
|
MR_Comparison_Result *, MR_Box, MR_Box);
|
|
void MR_CALL mercury__builtin__compare_3_p_3(MR_Mercury_Type_Info,
|
|
MR_Comparison_Result *, MR_Box, MR_Box);
|
|
void MR_CALL mercury__builtin__compare_representation_3_p_0(
|
|
MR_Mercury_Type_Info, MR_Comparison_Result *, MR_Box, MR_Box);
|
|
|
|
#else /* ! MR_HIGHLEVEL_CODE */
|
|
|
|
MR_declare_entry(mercury__builtin__unify_2_0);
|
|
MR_declare_entry(mercury__builtin__compare_3_0);
|
|
MR_declare_entry(mercury__builtin__compare_3_1);
|
|
MR_declare_entry(mercury__builtin__compare_3_2);
|
|
MR_declare_entry(mercury__builtin__compare_3_3);
|
|
MR_declare_entry(mercury__builtin__compare_representation_3_0);
|
|
|
|
#endif /* MR_HIGHLEVEL_CODE */
|
|
|
|
#endif /* not MERCURY_HO_CALL_H */
|