// vim: ts=4 sw=4 expandtab ft=c

// Copyright (C) 1995-2000,2002, 2004, 2006, 2009-2011 The University of Melbourne.
// Copyright (C) 2014, 2016, 2018 The Mercury team.
// This file is distributed under the terms specified in COPYING.LIB.

// mercury_misc.h - MR_warning(),
//                  MR_fatal_error()

#ifndef MERCURY_MISC_H
#define MERCURY_MISC_H

#include "mercury_std.h"    // for `MR_NO_RETURN'
#include <stdlib.h>         // for `size_t'

extern void     MR_warning(const char *msg, ...);

// For warnings from the debugger.

extern void     MR_mdb_warning(const char *msg, ...);

extern void     MR_perror(const char *msg);

// For errors from the debugger.

extern void     MR_mdb_perror(const char *msg);

// Output a message to standard error and abort.
// This function is for fatal errors in the Mercury runtime.

MR_NO_RETURN(extern void MR_fatal_error(const char *msg, ...));

// Output a message to standard error and abort.
// Prefix the message with the location of the component that caused the
// error.
// This is intended to be called from library bindings etc.

MR_NO_RETURN(extern void MR_external_fatal_error(const char *locn,
                    const char *msg, ...));

// Register a function to be called (as func(data)) when the program is
// about to be terminated due to an uncaught exception.

extern void     MR_register_exception_cleanup(void (*func)(void *),
                    void *data);

// Call all the functions registered with MR_register_exception_cleanup.
// Should be invoked only when the program is about to be terminated
// due to an uncaught exception.

extern void     MR_perform_registered_exception_cleanups(void);

////////////////////////////////////////////////////////////////////////////

// These macros are shorthands to allow reductions in the size of compiler
// generated C source files.

#define MR_COMMON_TYPE(typenum)                                         \
    MR_PASTE2(mercury_type_, typenum)

#define MR_COMMON_NAME(typenum)                                         \
    MR_PASTE2(mercury_common_, typenum)

#define MR_COMMON(typenum, cellnum)                                     \
    ((MR_Word *) &MR_COMMON_NAME(typenum)[cellnum])

#define MR_TAG_COMMON(tag, typenum, cellnum)                            \
    (MR_mkword(MR_mktag(tag), MR_COMMON(typenum, cellnum)))

////////////////////////////////////////////////////////////////////////////

#define MR_pseudo_type_infos(m)                                         \
    MR_PASTE2(mercury_data__pseudo_type_info_array__, m)

#define MR_hlds_var_nums(m)                                             \
    MR_PASTE2(mercury_data__hlds_var_nums_array__, m)

#define MR_short_locns(m)                                               \
    MR_PASTE2(mercury_data__short_locns_array__, m)

#define MR_long_locns(m)                                                \
    MR_PASTE2(mercury_data__long_locns_array__, m)

#define MR_user_event_var_nums(m)                                       \
    MR_PASTE2(mercury_data__user_event_var_nums_array__, m)

#define MR_user_event_layouts(m)                                        \
    MR_PASTE2(mercury_data__user_event_layouts_array__, m)

#define MR_no_var_label_layouts(m)                                      \
    MR_PASTE2(mercury_data__no_var_label_layout_array__, m)

#define MR_svar_label_layouts(m)                                        \
    MR_PASTE2(mercury_data__svar_label_layout_array__, m)

#define MR_lvar_label_layouts(m)                                        \
    MR_PASTE2(mercury_data__lvar_label_layout_array__, m)

////////////////////////////////////////////////////////////////////////////

#define MR_proc_call_sites(m)                                           \
    MR_PASTE2(mercury_data__proc_call_sites_array__, m)

#define MR_proc_cp_statics(m)                                           \
    MR_PASTE2(mercury_data__proc_cp_statics_array__, m)

#define MR_proc_cp_dynamics(m)                                          \
    MR_PASTE2(mercury_data__proc_cp_dynamics_array__, m)

#define MR_proc_statics(m)                                              \
    MR_PASTE2(mercury_data__proc_statics_array__, m)

#define MR_proc_head_var_nums(m)                                        \
    MR_PASTE2(mercury_data__proc_head_var_nums_array__, m)

#define MR_proc_var_names(m)                                            \
    MR_PASTE2(mercury_data__proc_var_names_array__, m)

#define MR_proc_body_bytecodes(m)                                       \
    MR_PASTE2(mercury_data__proc_body_bytecodes_array__, m)

#define MR_proc_table_io_entries(m)                                     \
    MR_PASTE2(mercury_data__proc_table_io_entries_array__, m)

#define MR_proc_event_layouts(m)                                        \
    MR_PASTE2(mercury_data__proc_event_layouts_array__, m)

#define MR_proc_exec_traces(m)                                          \
    MR_PASTE2(mercury_data__proc_exec_traces_array__, m)

#define MR_threadscope_strings(m)                                       \
    MR_PASTE2(mercury_data__threadscope_string_table_array__, m)

#define MR_alloc_sites(m)                                               \
    MR_PASTE2(mercury_data__alloc_sites_array__, m)

////////////////////////////////////////////////////////////////////////////

#define MR_no_var_label_layout_refs1(m, s1)                             \
    &MR_no_var_label_layouts(m)[s1],

#define MR_no_var_label_layout_refs2(m, s1, s2)                         \
    MR_no_var_label_layout_refs1(m, s1)                                 \
    MR_no_var_label_layout_refs1(m, s2)

#define MR_no_var_label_layout_refs3(m, s1, s2, s3)                     \
    MR_no_var_label_layout_refs1(m, s1)                                 \
    MR_no_var_label_layout_refs1(m, s2)                                 \
    MR_no_var_label_layout_refs1(m, s3)

#define MR_no_var_label_layout_refs4(m, s1, s2, s3, s4)                 \
    MR_no_var_label_layout_refs1(m, s1)                                 \
    MR_no_var_label_layout_refs1(m, s2)                                 \
    MR_no_var_label_layout_refs1(m, s3)                                 \
    MR_no_var_label_layout_refs1(m, s4)

#define MR_no_var_label_layout_refs5(m, s1, s2, s3, s4, s5)             \
    MR_no_var_label_layout_refs1(m, s1)                                 \
    MR_no_var_label_layout_refs1(m, s2)                                 \
    MR_no_var_label_layout_refs1(m, s3)                                 \
    MR_no_var_label_layout_refs1(m, s4)                                 \
    MR_no_var_label_layout_refs1(m, s5)

#define MR_no_var_label_layout_refs6(m, s1, s2, s3, s4, s5, s6)         \
    MR_no_var_label_layout_refs1(m, s1)                                 \
    MR_no_var_label_layout_refs1(m, s2)                                 \
    MR_no_var_label_layout_refs1(m, s3)                                 \
    MR_no_var_label_layout_refs1(m, s4)                                 \
    MR_no_var_label_layout_refs1(m, s5)                                 \
    MR_no_var_label_layout_refs1(m, s6)

#define MR_no_var_label_layout_refs7(m, s1, s2, s3, s4, s5, s6, s7)     \
    MR_no_var_label_layout_refs1(m, s1)                                 \
    MR_no_var_label_layout_refs1(m, s2)                                 \
    MR_no_var_label_layout_refs1(m, s3)                                 \
    MR_no_var_label_layout_refs1(m, s4)                                 \
    MR_no_var_label_layout_refs1(m, s5)                                 \
    MR_no_var_label_layout_refs1(m, s6)                                 \
    MR_no_var_label_layout_refs1(m, s7)

#define MR_no_var_label_layout_refs8(m, s1, s2, s3, s4, s5, s6, s7, s8) \
    MR_no_var_label_layout_refs1(m, s1)                                 \
    MR_no_var_label_layout_refs1(m, s2)                                 \
    MR_no_var_label_layout_refs1(m, s3)                                 \
    MR_no_var_label_layout_refs1(m, s4)                                 \
    MR_no_var_label_layout_refs1(m, s5)                                 \
    MR_no_var_label_layout_refs1(m, s6)                                 \
    MR_no_var_label_layout_refs1(m, s7)                                 \
    MR_no_var_label_layout_refs1(m, s8)

#define MR_no_var_label_layout_refs9(m, s1, s2, s3, s4, s5, s6, s7, s8, s9) \
    MR_no_var_label_layout_refs1(m, s1)                                 \
    MR_no_var_label_layout_refs1(m, s2)                                 \
    MR_no_var_label_layout_refs1(m, s3)                                 \
    MR_no_var_label_layout_refs1(m, s4)                                 \
    MR_no_var_label_layout_refs1(m, s5)                                 \
    MR_no_var_label_layout_refs1(m, s6)                                 \
    MR_no_var_label_layout_refs1(m, s7)                                 \
    MR_no_var_label_layout_refs1(m, s8)                                 \
    MR_no_var_label_layout_refs1(m, s9)

#define MR_no_var_label_layout_refs10(m, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10) \
    MR_no_var_label_layout_refs1(m, s1)                                 \
    MR_no_var_label_layout_refs1(m, s2)                                 \
    MR_no_var_label_layout_refs1(m, s3)                                 \
    MR_no_var_label_layout_refs1(m, s4)                                 \
    MR_no_var_label_layout_refs1(m, s5)                                 \
    MR_no_var_label_layout_refs1(m, s6)                                 \
    MR_no_var_label_layout_refs1(m, s7)                                 \
    MR_no_var_label_layout_refs1(m, s8)                                 \
    MR_no_var_label_layout_refs1(m, s9)                                 \
    MR_no_var_label_layout_refs1(m, s10)

#define MR_svar_label_layout_refs1(m, s1)                               \
    (MR_LabelLayout *) &MR_svar_label_layouts(m)[s1],

#define MR_svar_label_layout_refs2(m, s1, s2)                           \
    MR_svar_label_layout_refs1(m, s1)                                   \
    MR_svar_label_layout_refs1(m, s2)

#define MR_svar_label_layout_refs3(m, s1, s2, s3)                       \
    MR_svar_label_layout_refs1(m, s1)                                   \
    MR_svar_label_layout_refs1(m, s2)                                   \
    MR_svar_label_layout_refs1(m, s3)

#define MR_svar_label_layout_refs4(m, s1, s2, s3, s4)                   \
    MR_svar_label_layout_refs1(m, s1)                                   \
    MR_svar_label_layout_refs1(m, s2)                                   \
    MR_svar_label_layout_refs1(m, s3)                                   \
    MR_svar_label_layout_refs1(m, s4)

#define MR_svar_label_layout_refs5(m, s1, s2, s3, s4, s5)               \
    MR_svar_label_layout_refs1(m, s1)                                   \
    MR_svar_label_layout_refs1(m, s2)                                   \
    MR_svar_label_layout_refs1(m, s3)                                   \
    MR_svar_label_layout_refs1(m, s4)                                   \
    MR_svar_label_layout_refs1(m, s5)

#define MR_svar_label_layout_refs6(m, s1, s2, s3, s4, s5, s6)           \
    MR_svar_label_layout_refs1(m, s1)                                   \
    MR_svar_label_layout_refs1(m, s2)                                   \
    MR_svar_label_layout_refs1(m, s3)                                   \
    MR_svar_label_layout_refs1(m, s4)                                   \
    MR_svar_label_layout_refs1(m, s5)                                   \
    MR_svar_label_layout_refs1(m, s6)

#define MR_svar_label_layout_refs7(m, s1, s2, s3, s4, s5, s6, s7)       \
    MR_svar_label_layout_refs1(m, s1)                                   \
    MR_svar_label_layout_refs1(m, s2)                                   \
    MR_svar_label_layout_refs1(m, s3)                                   \
    MR_svar_label_layout_refs1(m, s4)                                   \
    MR_svar_label_layout_refs1(m, s5)                                   \
    MR_svar_label_layout_refs1(m, s6)                                   \
    MR_svar_label_layout_refs1(m, s7)

#define MR_svar_label_layout_refs8(m, s1, s2, s3, s4, s5, s6, s7, s8)   \
    MR_svar_label_layout_refs1(m, s1)                                   \
    MR_svar_label_layout_refs1(m, s2)                                   \
    MR_svar_label_layout_refs1(m, s3)                                   \
    MR_svar_label_layout_refs1(m, s4)                                   \
    MR_svar_label_layout_refs1(m, s5)                                   \
    MR_svar_label_layout_refs1(m, s6)                                   \
    MR_svar_label_layout_refs1(m, s7)                                   \
    MR_svar_label_layout_refs1(m, s8)

#define MR_svar_label_layout_refs9(m, s1, s2, s3, s4, s5, s6, s7, s8, s9) \
    MR_svar_label_layout_refs1(m, s1)                                   \
    MR_svar_label_layout_refs1(m, s2)                                   \
    MR_svar_label_layout_refs1(m, s3)                                   \
    MR_svar_label_layout_refs1(m, s4)                                   \
    MR_svar_label_layout_refs1(m, s5)                                   \
    MR_svar_label_layout_refs1(m, s6)                                   \
    MR_svar_label_layout_refs1(m, s7)                                   \
    MR_svar_label_layout_refs1(m, s8)                                   \
    MR_svar_label_layout_refs1(m, s9)

#define MR_svar_label_layout_refs10(m, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10) \
    MR_svar_label_layout_refs1(m, s1)                                   \
    MR_svar_label_layout_refs1(m, s2)                                   \
    MR_svar_label_layout_refs1(m, s3)                                   \
    MR_svar_label_layout_refs1(m, s4)                                   \
    MR_svar_label_layout_refs1(m, s5)                                   \
    MR_svar_label_layout_refs1(m, s6)                                   \
    MR_svar_label_layout_refs1(m, s7)                                   \
    MR_svar_label_layout_refs1(m, s8)                                   \
    MR_svar_label_layout_refs1(m, s9)                                           \
    MR_svar_label_layout_refs1(m, s10)

#define MR_lvar_label_layout_refs1(m, s1)                               \
    &MR_lvar_label_layouts(m)[s1],

#define MR_lvar_label_layout_refs2(m, s1, s2)                           \
    MR_lvar_label_layout_refs1(m, s1)                                   \
    MR_lvar_label_layout_refs1(m, s2)

#define MR_lvar_label_layout_refs3(m, s1, s2, s3)                       \
    MR_lvar_label_layout_refs1(m, s1)                                   \
    MR_lvar_label_layout_refs1(m, s2)                                   \
    MR_lvar_label_layout_refs1(m, s3)

#define MR_lvar_label_layout_refs4(m, s1, s2, s3, s4)                   \
    MR_lvar_label_layout_refs1(m, s1)                                   \
    MR_lvar_label_layout_refs1(m, s2)                                   \
    MR_lvar_label_layout_refs1(m, s3)                                   \
    MR_lvar_label_layout_refs1(m, s4)

#define MR_lvar_label_layout_refs5(m, s1, s2, s3, s4, s5)               \
    MR_lvar_label_layout_refs1(m, s1)                                   \
    MR_lvar_label_layout_refs1(m, s2)                                   \
    MR_lvar_label_layout_refs1(m, s3)                                   \
    MR_lvar_label_layout_refs1(m, s4)                                   \
    MR_lvar_label_layout_refs1(m, s5)

#define MR_lvar_label_layout_refs6(m, s1, s2, s3, s4, s5, s6)           \
    MR_lvar_label_layout_refs1(m, s1)                                   \
    MR_lvar_label_layout_refs1(m, s2)                                   \
    MR_lvar_label_layout_refs1(m, s3)                                   \
    MR_lvar_label_layout_refs1(m, s4)                                   \
    MR_lvar_label_layout_refs1(m, s5)                                   \
    MR_lvar_label_layout_refs1(m, s6)

#define MR_lvar_label_layout_refs7(m, s1, s2, s3, s4, s5, s6, s7)       \
    MR_lvar_label_layout_refs1(m, s1)                                   \
    MR_lvar_label_layout_refs1(m, s2)                                   \
    MR_lvar_label_layout_refs1(m, s3)                                   \
    MR_lvar_label_layout_refs1(m, s4)                                   \
    MR_lvar_label_layout_refs1(m, s5)                                   \
    MR_lvar_label_layout_refs1(m, s6)                                   \
    MR_lvar_label_layout_refs1(m, s7)

#define MR_lvar_label_layout_refs8(m, s1, s2, s3, s4, s5, s6, s7, s8)   \
    MR_lvar_label_layout_refs1(m, s1)                                   \
    MR_lvar_label_layout_refs1(m, s2)                                   \
    MR_lvar_label_layout_refs1(m, s3)                                   \
    MR_lvar_label_layout_refs1(m, s4)                                   \
    MR_lvar_label_layout_refs1(m, s5)                                   \
    MR_lvar_label_layout_refs1(m, s6)                                   \
    MR_lvar_label_layout_refs1(m, s7)                                   \
    MR_lvar_label_layout_refs1(m, s8)

#define MR_lvar_label_layout_refs9(m, s1, s2, s3, s4, s5, s6, s7, s8, s9) \
    MR_lvar_label_layout_refs1(m, s1)                                   \
    MR_lvar_label_layout_refs1(m, s2)                                   \
    MR_lvar_label_layout_refs1(m, s3)                                   \
    MR_lvar_label_layout_refs1(m, s4)                                   \
    MR_lvar_label_layout_refs1(m, s5)                                   \
    MR_lvar_label_layout_refs1(m, s6)                                   \
    MR_lvar_label_layout_refs1(m, s7)                                   \
    MR_lvar_label_layout_refs1(m, s8)                                   \
    MR_lvar_label_layout_refs1(m, s9)

#define MR_lvar_label_layout_refs10(m, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10) \
    MR_lvar_label_layout_refs1(m, s1)                                   \
    MR_lvar_label_layout_refs1(m, s2)                                   \
    MR_lvar_label_layout_refs1(m, s3)                                   \
    MR_lvar_label_layout_refs1(m, s4)                                   \
    MR_lvar_label_layout_refs1(m, s5)                                   \
    MR_lvar_label_layout_refs1(m, s6)                                   \
    MR_lvar_label_layout_refs1(m, s7)                                   \
    MR_lvar_label_layout_refs1(m, s8)                                   \
    MR_lvar_label_layout_refs1(m, s9)                                   \
    MR_lvar_label_layout_refs1(m, s10)

#endif // not MERCURY_MISC_H
