#include <mono/utils/mono-conc-hashtable.h>
#include <mono/utils/mono-signal-handler.h>
-#define MONO_BREAKPOINT_ARRAY_SIZE 64
-
#include "mini-arch.h"
#include "regalloc.h"
#include "mini-unwind.h"
#endif
/* Version number of the AOT file format */
-#define MONO_AOT_FILE_VERSION 123
+#define MONO_AOT_FILE_VERSION 125
//TODO: This is x86/amd64 specific.
#define mono_simd_shuffle_mask(a,b,c,d) ((a) | ((b) << 2) | ((c) << 4) | ((d) << 6))
MONO_AOT_FILE_FLAG_DEBUG = 4,
MONO_AOT_FILE_FLAG_LLVM_THUMB = 8,
MONO_AOT_FILE_FLAG_LLVM_ONLY = 16,
+ MONO_AOT_FILE_FLAG_SAFEPOINTS = 32,
} MonoAotFileFlags;
/* This structure is stored in the AOT file */
MonoCodeManager *code_mp;
} MonoJitDynamicMethodInfo;
+/* An extension of MonoGenericParamFull used in generic sharing */
+typedef struct {
+ MonoGenericParamFull param;
+ MonoGenericParam *parent;
+} MonoGSharedGenericParam;
+
#define domain_jit_info(domain) ((MonoJitDomainInfo*)((domain)->runtime_info))
/* Contains a list of ips which needs to be patched when a method is compiled */
typedef enum {
LLVMArgNone,
+ /* Scalar argument passed by value */
+ LLVMArgNormal,
+ /* Only in ainfo->pair_storage */
LLVMArgInIReg,
+ /* Only in ainfo->pair_storage */
LLVMArgInFPReg,
LLVMArgVtypeInReg,
LLVMArgVtypeByVal,
LLVMArgVtypeByRef,
/* Vtype returned as an int */
LLVMArgVtypeAsScalar,
+ /* Scalar returned by ref using an additional argument */
+ LLVMArgScalarRetAddr,
+ /* Scalar passed by ref */
+ LLVMArgScalarByRef
} LLVMArgStorage;
typedef struct {
int nslots;
/* Only if storage == LLVMArgAsFpArgs/LLVMArgFpStruct (4/8) */
int esize;
+ /* Parameter index in the LLVM signature */
+ int pindex;
+ MonoType *type;
} LLVMArgInfo;
typedef struct {
* Should be 0 or 1.
*/
int vret_arg_index;
+ /* The indexes of various special arguments in the LLVM signature */
+ int vret_arg_pindex, this_arg_pindex, rgctx_arg_pindex, imt_arg_pindex;
+
+ /* Inline array of argument info */
/* args [0] is for the this argument if it exists */
LLVMArgInfo args [1];
} LLVMCallInfo;
MONO_OPT_LAST
};
+/*
+ * This structure represents a JIT backend.
+ */
+typedef struct {
+ guint have_card_table_wb : 1;
+ guint have_op_generic_class_init : 1;
+ guint emulate_mul_div : 1;
+ guint emulate_div : 1;
+ guint emulate_long_shift_opts : 1;
+ guint have_objc_get_selector : 1;
+ guint have_generalized_imt_thunk : 1;
+ guint have_tls_get : 1;
+ guint have_tls_get_reg : 1;
+ guint have_liverange_ops: 1;
+ guint have_op_tail_call : 1;
+ guint have_dummy_init : 1;
+ guint gshared_supported : 1;
+ guint use_fpstack : 1;
+ guint ilp32 : 1;
+ guint need_got_var : 1;
+ guint need_div_check : 1;
+ guint no_unaligned_access : 1;
+ int monitor_enter_adjustment;
+ int dyn_call_param_area;
+} MonoBackend;
+
/* Flags for mini_method_compile () */
typedef enum {
/* Whenever to run cctors during JITting */
MonoMethod *method_to_register; /* The method to register in JIT info tables */
MonoGenericContext *generic_context;
+ MonoBackend *backend;
+
/*
* This variable represents the hidden argument holding the vtype
* return address. If the method returns something other than a vtype, or
/* main function */
MONO_API int mono_main (int argc, char* argv[]);
MONO_API void mono_set_defaults (int verbose_level, guint32 opts);
+void mono_parse_env_options (int argc, char *argv []);
MonoDomain* mini_init (const char *filename, const char *runtime_version);
void mini_cleanup (MonoDomain *domain);
MONO_API MonoDebugOptions *mini_get_debug_options (void);
void mono_optimize_branches (MonoCompile *cfg);
void mono_blockset_print (MonoCompile *cfg, MonoBitSet *set, const char *name, guint idom);
+const char*mono_ji_type_to_string (MonoJumpInfoType type);
void mono_print_ji (const MonoJumpInfo *ji);
void mono_print_ins_index (int i, MonoInst *ins);
void mono_print_ins (MonoInst *ins);
gboolean mono_aot_is_direct_callable (MonoJumpInfo *patch_info) MONO_LLVM_INTERNAL;
void mono_aot_mark_unused_llvm_plt_entry(MonoJumpInfo *patch_info) MONO_LLVM_INTERNAL;
char* mono_aot_get_plt_symbol (MonoJumpInfoType type, gconstpointer data) MONO_LLVM_INTERNAL;
+char* mono_aot_get_direct_call_symbol (MonoJumpInfoType type, gconstpointer data);
int mono_aot_get_method_index (MonoMethod *method) MONO_LLVM_INTERNAL;
MonoJumpInfo* mono_aot_patch_info_dup (MonoJumpInfo* ji) MONO_LLVM_INTERNAL;
void mono_aot_set_make_unreadable (gboolean unreadable);
MonoMethod* mini_get_shared_method (MonoMethod *method);
MonoMethod* mini_get_shared_method_to_register (MonoMethod *method);
MonoMethod* mini_get_shared_method_full (MonoMethod *method, gboolean all_vt, gboolean is_gsharedvt);
+MonoType* mini_get_shared_gparam (MonoType *t, MonoType *constraint);
int mini_get_rgctx_entry_slot (MonoJumpInfoRgctxEntry *entry);
int mini_type_stack_size (MonoType *t, int *align);
void MONO_SIG_HANDLER_SIGNATURE (mono_sigint_signal_handler) ;
gboolean MONO_SIG_HANDLER_SIGNATURE (mono_chain_signal);
-#ifdef MONO_ARCH_HAVE_OP_TAIL_CALL
-#define ARCH_HAVE_OP_TAIL_CALL 1
-#else
-#define ARCH_HAVE_OP_TAIL_CALL 0
-#endif
-
#ifndef MONO_ARCH_HAVE_TLS_GET
#define MONO_ARCH_HAVE_TLS_GET 0
#endif
-#ifdef MONO_ARCH_HAVE_TLS_GET_REG
-#define ARCH_HAVE_TLS_GET_REG 1
-#else
-#define ARCH_HAVE_TLS_GET_REG 0
-#endif
-
-#ifdef MONO_ARCH_EMULATE_MUL_DIV
-#define ARCH_EMULATE_MUL_DIV 1
-#else
-#define ARCH_EMULATE_MUL_DIV 0
-#endif
-
-#ifndef MONO_ARCH_MONITOR_ENTER_ADJUSTMENT
-#define MONO_ARCH_MONITOR_ENTER_ADJUSTMENT 1
-#endif
-
-#ifndef MONO_ARCH_DYN_CALL_PARAM_AREA
-#define MONO_ARCH_DYN_CALL_PARAM_AREA 0
-#endif
-
#ifdef MONO_ARCH_VARARG_ICALLS
#define ARCH_VARARG_ICALLS 1
#else
#define ARCH_VARARG_ICALLS 0
#endif
-#ifdef MONO_ARCH_HAVE_DUMMY_INIT
-#define ARCH_HAVE_DUMMY_INIT 1
-#else
-#define ARCH_HAVE_DUMMY_INIT 0
-#endif
-
-#ifdef MONO_CROSS_COMPILE
-#define MONO_IS_CROSS_COMPILE 1
-#else
-#define MONO_IS_CROSS_COMPILE 0
-#endif
-
-#if defined(__mono_ilp32__)
-#define MONO_IS_ILP32 1
-#else
-#define MONO_IS_ILP32 0
-#endif
-
#endif /* __MONO_MINI_H__ */