/*
* Copyright 2011 Xamarin Inc
+ * Licensed under the MIT license. See LICENSE file in the project root for full license information.
*/
#ifndef __MONO_MINI_ARM_H__
#define MONO_ARCH_INST_REGPAIR_REG2(desc,hreg1) ((desc) == 'l' || (desc) == 'f' || (desc) == 'g' ? ARM_MSW_REG : -1)
+#ifdef TARGET_WATCHOS
+#define MONO_ARCH_FRAME_ALIGNMENT 16
+#else
#define MONO_ARCH_FRAME_ALIGNMENT 8
+#endif
/* fixme: align to 16byte instead of 32byte (we align to 32byte to get
* reproduceable results for benchmarks */
#define MONO_ARCH_CODE_ALIGNMENT 32
+/* This needs to hold both a 32 bit int and a 64 bit double */
+#define mono_unwind_reg_t guint64
+
/* Argument marshallings for calls between gsharedvt and normal code */
typedef enum {
GSHAREDVT_ARG_NONE = 0,
int map [MONO_ZERO_LEN_ARRAY];
} GSharedVtCallInfo;
+
+typedef enum {
+ RegTypeNone,
+ /* Passed/returned in an ireg */
+ RegTypeGeneral,
+ /* Passed/returned in a pair of iregs */
+ RegTypeIRegPair,
+ /* Passed on the stack */
+ RegTypeBase,
+ /* First word in r3, second word on the stack */
+ RegTypeBaseGen,
+ /* FP value passed in either an ireg or a vfp reg */
+ RegTypeFP,
+ RegTypeStructByVal,
+ RegTypeStructByAddr,
+ /* gsharedvt argument passed by addr in greg */
+ RegTypeGSharedVtInReg,
+ /* gsharedvt argument passed by addr on stack */
+ RegTypeGSharedVtOnStack,
+ RegTypeHFA
+} ArgStorage;
+
+typedef struct {
+ gint32 offset;
+ guint16 vtsize; /* in param area */
+ /* RegTypeHFA */
+ int esize;
+ /* RegTypeHFA */
+ int nregs;
+ guint8 reg;
+ ArgStorage storage;
+ gint32 struct_size;
+ guint8 size : 4; /* 1, 2, 4, 8, or regs used by RegTypeStructByVal */
+} ArgInfo;
+
+typedef struct {
+ int nargs;
+ guint32 stack_usage;
+ /* The index of the vret arg in the argument list for RegTypeStructByAddr */
+ int vret_arg_index;
+ ArgInfo ret;
+ ArgInfo sig_cookie;
+ ArgInfo args [1];
+} CallInfo;
+
/* Structure used by the sequence points in AOTed code */
typedef struct {
gpointer ss_trigger_page;
#define PARAM_REGS 4
-#define DYN_CALL_STACK_ARGS 6
+#define DYN_CALL_STACK_ARGS 10
typedef struct {
mgreg_t regs [PARAM_REGS + DYN_CALL_STACK_ARGS];
typedef struct MonoCompileArch {
gpointer seq_point_info_var, ss_trigger_page_var;
- gpointer seq_point_read_var, seq_point_ss_method_var;
+ gpointer seq_point_ss_method_var;
gpointer seq_point_bp_method_var;
gpointer vret_addr_loc;
gboolean omit_fp, omit_fp_computed;
#define MONO_ARCH_USE_SIGACTION 1
-#if defined(__native_client__)
+#if defined(__native_client__) || defined(HOST_WATCHOS)
#undef MONO_ARCH_USE_SIGACTION
#endif
#define MONO_ARCH_NEED_DIV_CHECK 1
-#define MONO_ARCH_HAVE_CREATE_DELEGATE_TRAMPOLINE
#define MONO_ARCH_HAVE_GENERALIZED_IMT_THUNK 1
#define MONO_ARCH_HAVE_FULL_AOT_TRAMPOLINES 1
#define MONO_ARCH_GSHARED_SUPPORTED 1
#define MONO_ARCH_DYN_CALL_SUPPORTED 1
-#define MONO_ARCH_DYN_CALL_PARAM_AREA 24
+#define MONO_ARCH_DYN_CALL_PARAM_AREA (DYN_CALL_STACK_ARGS * sizeof (mgreg_t))
#ifndef MONO_CROSS_COMPILE
#define MONO_ARCH_SOFT_DEBUG_SUPPORTED 1
#define MONO_ARCH_HAVE_DUMMY_INIT 1
#define MONO_ARCH_HAVE_SDB_TRAMPOLINES 1
#define MONO_ARCH_HAVE_PATCH_CODE_NEW 1
+#define MONO_ARCH_HAVE_OP_GENERIC_CLASS_INIT 1
#if defined(__native_client__)
#undef MONO_ARCH_SOFT_DEBUG_SUPPORTED
#undef MONO_ARCH_HAVE_CONTEXT_SET_INT_REG
#endif
-/* Matches the HAVE_AEABI_READ_TP define in mini-arm.c */
-#if defined(__ARM_EABI__) && defined(__linux__) && !defined(TARGET_ANDROID) && !defined(__native_client__)
-#define MONO_ARCH_HAVE_TLS_GET 1
-#endif
+#define MONO_ARCH_HAVE_TLS_GET (mono_arm_have_tls_get ())
+#define MONO_ARCH_HAVE_TLS_GET_REG 1
/* ARM doesn't have too many registers, so we have to use a callee saved one */
#define MONO_ARCH_RGCTX_REG ARMREG_V5
gboolean
mono_arm_is_hard_float (void);
+gboolean
+mono_arm_have_tls_get (void);
+
+void
+mono_arm_unaligned_stack (MonoMethod *method);
+
+CallInfo*
+mono_arch_get_call_info (MonoMemPool *mp, MonoMethodSignature *sig);
+
#endif /* __MONO_MINI_ARM_H__ */