mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-11 03:45:33 +00:00
Branches: main, 11.07 Avoid warnings about functions that don't return in the runtime with MSVC. Avoid a warning in the configure script with MSVC. configure.in: The cygpath tool is only required with MSVC when using Cygwin as the build environment; don't emit an error message about this on other systems, e.g. MingGW. runtime/mercury_std.h: Redefine MR_NO_RETURN so that it works with both GCC/Clang and Visual C. runtime/mercury_misc.h: runtime/mercury_engine.c: Conform to the above change to MR_NO_RETURN. runtime/mercury_bootstrap.h: Delete the redefinition of NO_RETURN; any code that still uses is not going to work for a variety of other reasons.
446 lines
15 KiB
C
446 lines
15 KiB
C
/*
|
|
** Copyright (C) 1999-2004, 2006, 2009-2011 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_bootstrap.h
|
|
**
|
|
** Temporary definitions only needed for bootstrapping and/or
|
|
** for backwards compatibility. All of the definitions here
|
|
** will go away eventually, so don't use them!
|
|
*/
|
|
|
|
#ifndef MERCURY_BOOTSTRAP_H
|
|
#define MERCURY_BOOTSTRAP_H
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/*
|
|
** This stuff is not enabled by default.
|
|
** To enable it, you must explicitly define MR_EXTRA_BACKWARDS_COMPAT.
|
|
*/
|
|
|
|
#ifdef MR_EXTRA_BACKWARDS_COMPAT
|
|
|
|
/*
|
|
** For a long time the Mercury C types were defined as Char, Float,
|
|
** Integer, Word, etc. There will doubtless be lots of C code in
|
|
** libraries that relies upon these names.
|
|
**
|
|
** People may have written code that relies upon these names, so
|
|
** if you remove these names you need to give warning (unlike some of
|
|
** the other changes in this file).
|
|
*/
|
|
|
|
#include "mercury_types.h"
|
|
#include "mercury_float.h"
|
|
|
|
#define MR_Table_Trie_Step MR_TableTrieStep
|
|
#define MR_Long_Lval_Type MR_LongLvalType
|
|
#define MR_Long_Lval MR_LongLval
|
|
#define MR_Short_Lval MR_ShortLval
|
|
#define MR_Label_Layout_No_Var_Info MR_LabelLayoutNoVarInfo
|
|
#define MR_Label_Layout MR_LabelLayout
|
|
#define MR_Type_Param_Locns MR_TypeParamLocns
|
|
#define MR_Table_Io_Decl MR_TableIoDecl
|
|
#define MR_Table_Info MR_TableInfo
|
|
#define MR_Stack_Traversal MR_StackTraversal
|
|
#define MR_Exec_Trace MR_ExecTrace
|
|
#define MR_Proc_Layout_User MR_ProcLayoutUser
|
|
#define MR_Proc_Layout_UCI MR_ProcLayoutUCI
|
|
#define MR_Proc_Layout MR_ProcLayout
|
|
#define MR_Module_Layout MR_ModuleLayout
|
|
#define MR_Trace_Level MR_TraceLevel
|
|
#define MR_Module_File_Layout MR_ModuleFileLayout
|
|
#define MR_Closure_Id MR_ClosureId
|
|
#define MR_User_Closure_Id MR_UserClosureId
|
|
#define MR_UCI_Closure_Id MR_UCIClosureId
|
|
#define MR_Proc_Id MR_ProcId
|
|
#define MR_Stack_Walk_Step_Result MR_StackWalkStepResult
|
|
#define MR_Context_Position MR_ContextPosition
|
|
#define MR_find_first_call_seq_or_event MR_FindFirstCallSeqOrEvent
|
|
|
|
#define MR_STATIC(l) MR_ENTRY(l)
|
|
#define MR_GOTO_STATIC(l) MR_GOTO_ENTRY(l)
|
|
|
|
typedef MR_Word Word;
|
|
typedef MR_Code Code;
|
|
typedef MR_Char Char;
|
|
typedef MR_Float Float;
|
|
typedef MR_Float64 Float64;
|
|
typedef MR_Integer Integer;
|
|
typedef MR_Unsigned Unsigned;
|
|
typedef MR_UnsignedChar UnsignedChar;
|
|
typedef MR_String String;
|
|
typedef MR_ConstString ConstString;
|
|
|
|
typedef MR_Bool Bool;
|
|
|
|
/*
|
|
** The list manipulation macros are available for use by ordinary Mercury
|
|
** programmers. People may have written code using these macros before their
|
|
** documented names were changed, so removing backward compatibility for them
|
|
** requires more warning than for the other things in this file.
|
|
*/
|
|
|
|
#define list_is_empty(l) MR_list_is_empty(l)
|
|
#define list_head(l) MR_list_head(l)
|
|
#define list_tail(l) MR_list_tail(l)
|
|
#define list_empty() MR_list_empty()
|
|
#define list_cons(h, t) MR_list_cons((h), (t))
|
|
|
|
/* Stuff from mercury_std.h */
|
|
#define streq(s1, s2) MR_streq(s1, s2)
|
|
#define strdiff(s1, s2) MR_strdiff(s1, s2)
|
|
#define strtest(s1, s2) MR_strtest(s1, s2)
|
|
#define strneq(s1, s2, n) MR_strneq(s1, s2, n)
|
|
#define strndiff(s1, s2, n) MR_strndiff(s1, s2, n)
|
|
#define strntest(s1, s2, n) MR_strntest(s1, s2, n)
|
|
|
|
#ifndef max
|
|
#define max(a, b) MR_max(a, b)
|
|
#endif
|
|
#ifndef min
|
|
#define min(a, b) MR_min(a, b)
|
|
#endif
|
|
|
|
#define MR_saved_reg(save_area, n) \
|
|
MR_LVALUE_COND((n) > MR_MAX_REAL_R_REG, \
|
|
(save_area)[(n) + MR_NUM_SPECIAL_REG - 1], \
|
|
(save_area)[MR_real_r_reg_map[(n) - 1]])
|
|
|
|
#define MR_virtual_reg(n) MR_saved_reg(MR_fake_reg, n)
|
|
|
|
/*
|
|
** bool, TRUE and FALSE used to appear in the generated code.
|
|
*/
|
|
#ifdef IN_GCC
|
|
/*
|
|
** We need to make sure that we pick up GCC's definition of bool,
|
|
** to ensure that we don't define `bool' below. Otherwise we get
|
|
** conflicts because some declarations use the <stdbool.h> definition
|
|
** of bool (an enum), and some use our definition (a #define for char)
|
|
*/
|
|
#include "config.h"
|
|
#include "system.h"
|
|
#endif
|
|
|
|
#ifndef bool
|
|
#define bool char
|
|
#endif
|
|
|
|
#ifndef TRUE
|
|
#define TRUE MR_TRUE
|
|
#endif
|
|
#ifndef FALSE
|
|
#define FALSE MR_FALSE
|
|
#endif
|
|
|
|
#define COMPARE_EQUAL MR_COMPARE_EQUAL
|
|
#define COMPARE_LESS MR_COMPARE_LESS
|
|
#define COMPARE_GREATER MR_COMPARE_GREATER
|
|
|
|
#define make_aligned_string_copy(a,b) MR_make_aligned_string_copy((a),(b))
|
|
#define make_aligned_string(a,b) MR_make_aligned_string((a),(b))
|
|
#define string_equal(a,b) MR_string_equal((a),(b))
|
|
#define string_const(a,b) MR_string_const((a),(b))
|
|
#define hash_string(s) MR_hash_string((s))
|
|
#define fatal_error(s) MR_fatal_error((s))
|
|
|
|
#define do_redo MR_do_redo
|
|
#define do_fail MR_do_fail
|
|
#define do_reset_hp_fail MR_do_reset_hp_fail
|
|
#define do_reset_framevar0_fail MR_do_reset_framevar0_fail
|
|
#define do_succeed MR_do_succeed
|
|
#define do_not_reached MR_do_not_reached
|
|
#define exception_handler_do_fail MR_exception_handler_do_fail
|
|
|
|
#define r1 MR_r1
|
|
#define r2 MR_r2
|
|
#define r3 MR_r3
|
|
#define r4 MR_r4
|
|
#define r5 MR_r5
|
|
#define r6 MR_r6
|
|
#define r7 MR_r7
|
|
#define r8 MR_r8
|
|
#define r9 MR_r9
|
|
#define r10 MR_r10
|
|
#define r11 MR_r11
|
|
#define r12 MR_r12
|
|
#define r13 MR_r13
|
|
#define r14 MR_r14
|
|
#define r15 MR_r15
|
|
#define r16 MR_r16
|
|
#define r17 MR_r17
|
|
#define r18 MR_r18
|
|
#define r19 MR_r19
|
|
#define r20 MR_r20
|
|
#define r21 MR_r21
|
|
#define r22 MR_r22
|
|
#define r23 MR_r23
|
|
#define r24 MR_r24
|
|
#define r25 MR_r25
|
|
#define r26 MR_r26
|
|
#define r27 MR_r27
|
|
#define r28 MR_r28
|
|
#define r29 MR_r29
|
|
#define r30 MR_r30
|
|
#define r31 MR_r31
|
|
#define r32 MR_r32
|
|
|
|
#define r(N) MR_r(N)
|
|
|
|
#define NUM_REAL_REGS MR_NUM_REAL_REGS
|
|
|
|
#define progname MR_progname
|
|
#define program_entry_point MR_program_entry_point
|
|
#define address_of_init_gc MR_address_of_init_gc
|
|
#define address_of_init_modules MR_address_of_init_modules
|
|
#define address_of_init_modules_debugger \
|
|
MR_address_of_init_modules_debugger
|
|
#define address_of_init_modules_type_tables \
|
|
MR_address_of_init_modules_type_tables
|
|
#define do_init_modules MR_do_init_modules
|
|
#define do_init_modules_debugger MR_do_init_modules_debugger
|
|
#define do_init_modules_type_tables MR_do_init_modules_type_tables
|
|
#define time_at_last_stat MR_time_at_last_stat
|
|
#define time_at_start MR_time_at_start
|
|
|
|
#define deep_copy(w, ti, l, u) MR_deep_copy((w), (ti), (l), (u))
|
|
#define agc_deep_copy(w, ti, l, u) MR_agc_deep_copy((w), (ti), (l), (u))
|
|
|
|
#define init_context(context) MR_init_context(context)
|
|
#define create_context() MR_create_context()
|
|
#define destroy_context(context) MR_destroy_context(context)
|
|
#define flounder() MR_flounder()
|
|
#define schedule(context) MR_schedule(context)
|
|
#define set_min_heap_reclamation_point(c) MR_set_min_heap_reclamation_point(c)
|
|
#define save_hp_in_context(context) MR_save_hp_in_context(context)
|
|
#define load_context(cptr) MR_load_context(cptr)
|
|
#define save_context(cptr) MR_save_context(cptr)
|
|
|
|
#define load_engine_regs(eng) MR_load_engine_regs(eng)
|
|
#define save_engine_regs(eng) MR_save_engine_regs(eng)
|
|
|
|
#define tag_incr_hp_n(d, t, c) MR_tag_incr_hp_n((d), (t), (c))
|
|
#define tag_incr_hp_atomic(d, t, c) MR_tag_incr_hp_atomic((d), (t), (c))
|
|
#define tag_incr_hp(d, t, c) MR_tag_incr_hp((d), (t), (c))
|
|
#define mark_hp(d) MR_mark_hp((d))
|
|
#define restore_hp(d) MR_restore_hp((d))
|
|
#define hp_alloc(c) MR_hp_alloc((c))
|
|
#define tag_incr_hp_msg(d, t, c, p, ty) MR_tag_incr_hp_msg((d), (t), \
|
|
(c), p, (ty))
|
|
#define tag_incr_hp_atomic_msg(d, t, c, p, ty) \
|
|
MR_tag_incr_hp_atomic_msg((d), (t), \
|
|
(c), p, (ty))
|
|
#define incr_hp(d, c) MR_incr_hp((d), (c))
|
|
#define incr_hp_msg(d, c, p, t) MR_incr_hp_msg((d), (c), p, (t))
|
|
#define incr_hp_atomic(d, c) MR_incr_hp_atomic((d), (c))
|
|
#define incr_hp_atomic_msg(d, c, p, t) MR_incr_hp_atomic_msg((d), (c), p, (t))
|
|
#define incr_saved_hp(A, B) MR_incr_saved_hp((A), (B))
|
|
#define incr_saved_hp_atomic(A, B) MR_incr_saved_hp_atomic((A), (B))
|
|
#define save_transient_hp() MR_save_transient_hp()
|
|
#define restore_transient_hp() MR_restore_transient_hp()
|
|
|
|
#define create1(w1) MR_create1((w1))
|
|
#define create2(w1, w2) MR_create2((w1), (w2))
|
|
#define create3(w1, w2, w3) MR_create3((w1), (w2), (w3))
|
|
#define create1_msg(w1, p, t) MR_create1_msg((w1), p, (t))
|
|
#define create2_msg(w1, w2, p, t) MR_create2_msg((w1), (w2), p, (t))
|
|
#define create3_msg(w1, w2, w3, p, t) MR_create3_msg((w1), (w2), (w3), p, (t))
|
|
|
|
#define paste(a,b) MR_paste(a,b)
|
|
#define stringify(s) MR_stringify(s)
|
|
#define entry(label) MR_entry(label)
|
|
#define skip(label) MR_skip(label)
|
|
|
|
#define make_label(n, a, l) MR_make_label((n), (a), (l))
|
|
#define make_label_ai(n, a, l) MR_make_label_ai((n), (a), (l))
|
|
#define make_label_sl(n, a, l) MR_make_label_sl((n), (a), (l))
|
|
#define make_local(n, a, l) MR_make_local((n), (a), (l))
|
|
#define make_local_ai(n, a, l) MR_make_local_ai((n), (a), (l))
|
|
#define make_local_sl(n, a, l) MR_make_local_sl((n), (a), (l))
|
|
#define make_entry(n, a, l) MR_make_entry((n), (a), (l))
|
|
#define make_entry_ai(n, a, l) MR_make_entry_ai((n), (a), (l))
|
|
#define make_entry_sl(n, a, l) MR_make_entry_sl((n), (a), (l))
|
|
|
|
#define init_label(l) MR_init_label(l)
|
|
#define init_label_ai(l) MR_init_label_ai(l)
|
|
#define init_label_sl(l) MR_init_label_sl(l)
|
|
#define init_local(l) MR_init_local(l)
|
|
#define init_local_ai(l) MR_init_local_ai(l)
|
|
#define init_local_sl(l) MR_init_local_sl(l)
|
|
#define init_entry(l) MR_init_entry(l)
|
|
#define init_entry_ai(l) MR_init_entry_ai(l)
|
|
#define init_entry_sl(l) MR_init_entry_sl(l)
|
|
|
|
#define Declare_entry(l) MR_declare_entry(l)
|
|
#define Define_extern_entry(l) MR_define_extern_entry(l)
|
|
#define Define_entry(l) MR_define_entry(l)
|
|
#define Declare_static(l) MR_declare_static(l)
|
|
#define Define_static(l) MR_define_static(l)
|
|
#define Declare_local(l) MR_declare_local(l)
|
|
#define Define_local(l) MR_define_local(l)
|
|
#define Declare_label(l) MR_declare_label(l)
|
|
#define Define_label(l) MR_define_label(l)
|
|
|
|
#define ASM_JUMP(label) MR_ASM_JUMP(label)
|
|
#define JUMP(label) MR_JUMP(label)
|
|
#define ENTRY(label) MR_ENTRY(label)
|
|
#define STATIC(label) MR_STATIC(label)
|
|
#define LOCAL(label) MR_LOCAL(label)
|
|
#define LABEL(label) MR_LABEL(label)
|
|
#define GOTO(label) MR_GOTO(label)
|
|
#define GOTO_ENTRY(label) MR_GOTO_ENTRY(label)
|
|
#define GOTO_STATIC(label) MR_GOTO_STATIC(label)
|
|
#define GOTO_LOCAL(label) MR_GOTO_LOCAL(label)
|
|
#define GOTO_LABEL(label) MR_GOTO_LABEL(label)
|
|
|
|
/*
|
|
** These two cannot be defined in terms of their MR_ equivalents,
|
|
** since that loses token structure. We therefore duplicate the definition.
|
|
*/
|
|
|
|
#define COMPUTED_GOTO(val, labels) \
|
|
{ \
|
|
static MR_Code *jump_table[] = { \
|
|
labels \
|
|
}; \
|
|
MR_GOTO(jump_table[val]); \
|
|
}
|
|
|
|
#define AND ,
|
|
|
|
#define BEGIN_MODULE(m) MR_BEGIN_MODULE(m)
|
|
#define BEGIN_CODE MR_BEGIN_CODE
|
|
#define END_MODULE MR_END_MODULE
|
|
|
|
#define ModuleFunc MR_ModuleFunc
|
|
|
|
#define noprof_localcall(label) MR_noprof_localcall(label)
|
|
#define noprof_call(label, cont) MR_noprof_call(label, cont)
|
|
#define noprof_call_localret(label, cont) \
|
|
MR_noprof_call_localret(label, cont)
|
|
#define localcall(label, cont, cur) MR_localcall(label, cont, cur)
|
|
#define call(proc, cont, cur) MR_call(proc, cont, cur)
|
|
#define call_localret(proc, cont, cur) MR_call_localret(proc, cont, cur)
|
|
#define localtailcall(label, cur) MR_localtailcall(label, cur)
|
|
#define tailcall(proc, cur) MR_tailcall(proc, (cur))
|
|
#define noprof_tailcall(proc) MR_noprof_tailcall(proc)
|
|
#define proceed() MR_proceed()
|
|
|
|
#define set_prof_current_proc(target) MR_set_prof_current_proc(target)
|
|
#define update_prof_current_proc(target) MR_update_prof_current_proc(target)
|
|
|
|
#define float_to_word(f) MR_float_to_word(f)
|
|
#define word_to_float(w) MR_word_to_float(w)
|
|
#define float_const(f) MR_float_const(f)
|
|
#define hash_float(f) MR_hash_float(f)
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#define MR_TypeCtorInfo_struct MR_TypeCtorInfo_Struct
|
|
|
|
#define save_regs_to_mem(save_area) \
|
|
MR_save_regs_to_mem(save_area)
|
|
#define restore_regs_from_mem(save_area) \
|
|
MR_restore_regs_from_mem(save_area)
|
|
|
|
#define save_transient_regs_to_mem(save_area) \
|
|
MR_save_transient_regs_to_mem(save_area)
|
|
#define restore_transient_regs_from_mem(save_area) \
|
|
MR_restore_transient_regs_from_mem(save_area)
|
|
|
|
#define save_registers() MR_save_registers()
|
|
#define restore_registers() MR_restore_registers()
|
|
|
|
#define save_transient_registers() MR_save_transient_registers()
|
|
#define restore_transient_registers() MR_restore_transient_registers()
|
|
|
|
#define save_transient_hp() MR_save_transient_hp()
|
|
#define restore_transient_hp() MR_restore_transient_hp()
|
|
|
|
#define succip MR_succip
|
|
#define hp MR_hp
|
|
#define sp MR_sp
|
|
#define curfr MR_curfr
|
|
#define maxfr MR_maxfr
|
|
|
|
/* stuff from mercury_stacks.h */
|
|
|
|
#define detstackvar(n) MR_stackvar(n)
|
|
|
|
#define incr_sp_push_msg(n, m) MR_incr_sp_push_msg((n), (m))
|
|
#define decr_sp_pop_msg(n) MR_decr_sp_pop_msg(n)
|
|
#define incr_sp(n) MR_incr_sp(n)
|
|
#define decr_sp(n) MR_decr_sp(n)
|
|
|
|
#define push(w) ( \
|
|
*MR_sp = (MR_Word) (w), \
|
|
debugpush(*MR_sp, MR_sp), \
|
|
MR_sp = MR_sp + 1, \
|
|
detstack_overflow_check(), \
|
|
(void)0 \
|
|
)
|
|
|
|
#define pop() ( \
|
|
MR_sp = MR_sp - 1, \
|
|
debugpop(*MR_sp, MR_sp), \
|
|
detstack_underflow_check(), \
|
|
/* return */ *MR_sp \
|
|
)
|
|
|
|
#define NONDET_FIXED_SIZE MR_NONDET_FIXED_SIZE
|
|
|
|
#define framevar(n) MR_framevar((n) + 1)
|
|
|
|
#define bt_prevfr(fr) MR_prevfr_slot(fr)
|
|
#define bt_redoip(fr) MR_redoip_slot(fr)
|
|
#define bt_redofr(fr) MR_redofr_slot(fr)
|
|
#define bt_succip(fr) MR_succip_slot(fr)
|
|
#define bt_succfr(fr) MR_succfr_slot(fr)
|
|
#define bt_prednm(fr) MR_prednm_slot(fr)
|
|
#define bt_var(fr, n) MR_based_framevar(fr, (n) + 1)
|
|
|
|
#define curprevfr MR_prevfr_slot(MR_curfr)
|
|
#define curredoip MR_redoip_slot(MR_curfr)
|
|
#define curredofr MR_redofr_slot(MR_curfr)
|
|
#define cursuccip MR_succip_slot(MR_curfr)
|
|
#define cursuccfr MR_succfr_slot(MR_curfr)
|
|
#define curprednm MR_prednm_slot(MR_curfr)
|
|
|
|
#define prednm_slot(fr) "unknown"
|
|
#define MR_prednm_slot(fr) "unknown"
|
|
|
|
#define mkframe(p, s, r) MR_mkframe((p), (s), (r))
|
|
#define mkpragmaframe(p,s,n,r) MR_mkpragmaframe((p), (s), n, (r))
|
|
#define mktempframe(r) MR_mktempframe(r)
|
|
#define mkdettempframe(r) MR_mkdettempframe(r)
|
|
#define succeed() MR_succeed()
|
|
#define succeed_discard() MR_succeed_discard()
|
|
#define fail() MR_fail()
|
|
#define redo() MR_redo()
|
|
|
|
/* stuff from mercury_tags.h */
|
|
|
|
#define WORDBITS MR_WORDBITS
|
|
|
|
#define mktag(t) MR_mktag(t)
|
|
#define unmktag(w) MR_unmktag(w)
|
|
#define tag(w) MR_tag(w)
|
|
#define mkbody(i) MR_mkbody(i)
|
|
#define unmkbody(w) MR_unmkbody(w)
|
|
#define body(w, t) MR_body((w), (t))
|
|
#define strip_tag(w) MR_strip_tag(w)
|
|
|
|
#define mkword(t, p) MR_mkword((t), (p))
|
|
#define field(t, p, i) MR_field((t), (p), (i))
|
|
#define const_field(t, p, i) MR_const_field((t), (p), (i))
|
|
#define mask_field(p, i) MR_mask_field((p), (i))
|
|
#define const_mask_field(p, i) MR_const_mask_field((p), (i))
|
|
|
|
#endif /* MR_EXTRA_BACKWARDS_COMPAT */
|
|
|
|
#endif /* MERCURY_BOOTSTRAP_H */
|