2 * mini-llvm.c: llvm "Backend" for the mono JIT
4 * (C) 2009 Novell, Inc.
8 #include <mono/metadata/debug-helpers.h>
9 #include <mono/metadata/mempool-internals.h>
11 #ifndef __STDC_LIMIT_MACROS
12 #define __STDC_LIMIT_MACROS
14 #ifndef __STDC_CONSTANT_MACROS
15 #define __STDC_CONSTANT_MACROS
18 #include "llvm-c/Core.h"
19 #include "llvm-c/ExecutionEngine.h"
20 #include "llvm-c/BitWriter.h"
21 #include "llvm-c/Analysis.h"
23 #include "mini-llvm-cpp.h"
26 * Information associated by mono with LLVM modules.
30 LLVMValueRef throw, rethrow, throw_corlib_exception;
31 GHashTable *llvm_types;
33 const char *got_symbol;
34 GHashTable *plt_entries;
38 * Information associated by the backend with mono basic blocks.
41 LLVMBasicBlockRef bblock, end_bblock;
42 LLVMValueRef finally_ind;
43 gboolean added, invoke_target;
45 * If this bblock is the start of a finally clause, this is a list of bblocks it
46 * needs to branch to in ENDFINALLY.
48 GSList *call_handler_return_bbs;
50 * If this bblock is the start of a finally clause, this is the bblock that
51 * CALL_HANDLER needs to branch to.
53 LLVMBasicBlockRef call_handler_target_bb;
54 /* The list of switch statements generated by ENDFINALLY instructions */
55 GSList *endfinally_switch_ins_list;
60 * Structure containing emit state
65 /* Maps method names to the corresponding LLVMValueRef */
66 GHashTable *emitted_method_decls;
70 MonoLLVMModule *lmodule;
73 int sindex, default_index, ex_index;
74 LLVMBuilderRef builder;
75 LLVMValueRef *values, *addresses;
76 MonoType **vreg_cli_types;
78 MonoMethodSignature *sig;
80 GHashTable *region_to_handler;
81 LLVMBuilderRef alloca_builder;
82 LLVMValueRef last_alloca;
83 LLVMValueRef rgctx_arg;
84 LLVMTypeRef *vreg_types;
86 gboolean *unreachable;
95 MonoBasicBlock *in_bb;
100 * Instruction metadata
101 * This is the same as ins_info, but LREG != IREG.
109 #define MINI_OP(a,b,dest,src1,src2) dest, src1, src2, ' ',
110 #define MINI_OP3(a,b,dest,src1,src2,src3) dest, src1, src2, src3,
117 /* keep in sync with the enum in mini.h */
120 #include "mini-ops.h"
125 #if SIZEOF_VOID_P == 4
126 #define GET_LONG_IMM(ins) (((guint64)(ins)->inst_ms_word << 32) | (guint64)(guint32)(ins)->inst_ls_word)
128 #define GET_LONG_IMM(ins) ((ins)->inst_imm)
131 #define LLVM_INS_INFO(opcode) (&llvm_ins_info [((opcode) - OP_START - 1) * 4])
134 #define TRACE_FAILURE(msg) do { printf ("%s\n", msg); } while (0)
136 #define TRACE_FAILURE(msg)
140 #define IS_TARGET_X86 1
142 #define IS_TARGET_X86 0
145 #define LLVM_FAILURE(ctx, reason) do { \
146 TRACE_FAILURE (reason); \
147 (ctx)->cfg->exception_message = g_strdup (reason); \
148 (ctx)->cfg->disable_llvm = TRUE; \
152 #define CHECK_FAILURE(ctx) do { \
153 if ((ctx)->cfg->disable_llvm) \
157 static LLVMIntPredicate cond_to_llvm_cond [] = {
170 static LLVMRealPredicate fpcond_to_llvm_cond [] = {
183 static LLVMExecutionEngineRef ee;
184 static guint32 current_cfg_tls_id;
186 static MonoLLVMModule jit_module, aot_module;
187 static gboolean jit_module_inited;
188 static int memset_param_count, memcpy_param_count;
189 static const char *memset_func_name;
190 static const char *memcpy_func_name;
191 static const char *eh_selector_name;
193 static void init_jit_module (void);
198 * The LLVM type with width == sizeof (gpointer)
203 return sizeof (gpointer) == 8 ? LLVMInt64Type () : LLVMInt32Type ();
209 * Return the size of the LLVM representation of the vtype T.
212 get_vtype_size (MonoType *t)
216 size = mono_class_value_size (mono_class_from_mono_type (t), NULL);
218 while (size < sizeof (gpointer) && mono_is_power_of_two (size) == -1)
225 * simd_class_to_llvm_type:
227 * Return the LLVM type corresponding to the Mono.SIMD class KLASS
230 simd_class_to_llvm_type (EmitContext *ctx, MonoClass *klass)
232 if (!strcmp (klass->name, "Vector2d")) {
233 return LLVMVectorType (LLVMDoubleType (), 2);
234 } else if (!strcmp (klass->name, "Vector2l")) {
235 return LLVMVectorType (LLVMInt64Type (), 2);
236 } else if (!strcmp (klass->name, "Vector2ul")) {
237 return LLVMVectorType (LLVMInt64Type (), 2);
238 } else if (!strcmp (klass->name, "Vector4i")) {
239 return LLVMVectorType (LLVMInt32Type (), 4);
240 } else if (!strcmp (klass->name, "Vector4ui")) {
241 return LLVMVectorType (LLVMInt32Type (), 4);
242 } else if (!strcmp (klass->name, "Vector4f")) {
243 return LLVMVectorType (LLVMFloatType (), 4);
244 } else if (!strcmp (klass->name, "Vector8s")) {
245 return LLVMVectorType (LLVMInt16Type (), 8);
246 } else if (!strcmp (klass->name, "Vector8us")) {
247 return LLVMVectorType (LLVMInt16Type (), 8);
248 } else if (!strcmp (klass->name, "Vector16sb")) {
249 return LLVMVectorType (LLVMInt8Type (), 16);
250 } else if (!strcmp (klass->name, "Vector16b")) {
251 return LLVMVectorType (LLVMInt8Type (), 16);
253 printf ("%s\n", klass->name);
262 * Return the LLVM type corresponding to T.
265 type_to_llvm_type (EmitContext *ctx, MonoType *t)
268 return LLVMPointerType (LLVMInt8Type (), 0);
271 return LLVMVoidType ();
273 return LLVMInt8Type ();
275 return LLVMInt16Type ();
277 return LLVMInt32Type ();
279 return LLVMInt8Type ();
281 return LLVMInt16Type ();
283 return LLVMInt32Type ();
284 case MONO_TYPE_BOOLEAN:
285 return LLVMInt8Type ();
288 return LLVMInt64Type ();
290 return LLVMInt16Type ();
292 return LLVMFloatType ();
294 return LLVMDoubleType ();
297 return IntPtrType ();
298 case MONO_TYPE_OBJECT:
299 case MONO_TYPE_CLASS:
300 case MONO_TYPE_ARRAY:
301 case MONO_TYPE_SZARRAY:
302 case MONO_TYPE_STRING:
304 return LLVMPointerType (IntPtrType (), 0);
307 /* Because of generic sharing */
308 return IntPtrType ();
309 case MONO_TYPE_GENERICINST:
310 if (!mono_type_generic_inst_is_valuetype (t))
311 return IntPtrType ();
313 case MONO_TYPE_VALUETYPE:
314 case MONO_TYPE_TYPEDBYREF: {
318 klass = mono_class_from_mono_type (t);
320 if (MONO_CLASS_IS_SIMD (ctx->cfg, klass))
321 return simd_class_to_llvm_type (ctx, klass);
324 return type_to_llvm_type (ctx, mono_class_enum_basetype (klass));
325 ltype = g_hash_table_lookup (ctx->lmodule->llvm_types, klass);
328 LLVMTypeRef *eltypes;
330 size = get_vtype_size (t);
332 eltypes = g_new (LLVMTypeRef, size);
333 for (i = 0; i < size; ++i)
334 eltypes [i] = LLVMInt8Type ();
336 ltype = LLVMStructType (eltypes, size, FALSE);
337 g_hash_table_insert (ctx->lmodule->llvm_types, klass, ltype);
344 printf ("X: %d\n", t->type);
345 ctx->cfg->exception_message = g_strdup_printf ("type %s", mono_type_full_name (t));
346 ctx->cfg->disable_llvm = TRUE;
354 * Return whenever T is an unsigned int type.
357 type_is_unsigned (EmitContext *ctx, MonoType *t)
373 * type_to_llvm_arg_type:
375 * Same as type_to_llvm_type, but treat i8/i16 as i32.
378 type_to_llvm_arg_type (EmitContext *ctx, MonoType *t)
380 LLVMTypeRef ptype = type_to_llvm_type (ctx, t);
382 if (ptype == LLVMInt8Type () || ptype == LLVMInt16Type ()) {
384 * LLVM generates code which only sets the lower bits, while JITted
385 * code expects all the bits to be set.
387 ptype = LLVMInt32Type ();
394 * llvm_type_to_stack_type:
396 * Return the LLVM type which needs to be used when a value of type TYPE is pushed
399 static G_GNUC_UNUSED LLVMTypeRef
400 llvm_type_to_stack_type (LLVMTypeRef type)
404 if (type == LLVMInt8Type ())
405 return LLVMInt32Type ();
406 else if (type == LLVMInt16Type ())
407 return LLVMInt32Type ();
408 else if (type == LLVMFloatType ())
409 return LLVMDoubleType ();
415 * regtype_to_llvm_type:
417 * Return the LLVM type corresponding to the regtype C used in instruction
421 regtype_to_llvm_type (char c)
425 return LLVMInt32Type ();
427 return LLVMInt64Type ();
429 return LLVMDoubleType ();
438 * Return the LLVM type corresponding to the unary/binary opcode OPCODE.
441 op_to_llvm_type (int opcode)
446 return LLVMInt8Type ();
449 return LLVMInt8Type ();
452 return LLVMInt16Type ();
455 return LLVMInt16Type ();
458 return LLVMInt32Type ();
461 return LLVMInt32Type ();
463 return LLVMInt64Type ();
465 return LLVMFloatType ();
467 return LLVMDoubleType ();
469 return LLVMInt64Type ();
471 return LLVMInt32Type ();
473 return LLVMInt64Type ();
476 return LLVMInt8Type ();
479 return LLVMInt16Type ();
482 return sizeof (gpointer) == 8 ? LLVMInt64Type () : LLVMInt32Type ();
489 return LLVMInt32Type ();
496 return LLVMInt64Type ();
498 printf ("%s\n", mono_inst_name (opcode));
499 g_assert_not_reached ();
505 * load_store_to_llvm_type:
507 * Return the size/sign/zero extension corresponding to the load/store opcode
511 load_store_to_llvm_type (int opcode, int *size, gboolean *sext, gboolean *zext)
517 case OP_LOADI1_MEMBASE:
518 case OP_STOREI1_MEMBASE_REG:
519 case OP_STOREI1_MEMBASE_IMM:
522 return LLVMInt8Type ();
523 case OP_LOADU1_MEMBASE:
527 return LLVMInt8Type ();
528 case OP_LOADI2_MEMBASE:
529 case OP_STOREI2_MEMBASE_REG:
530 case OP_STOREI2_MEMBASE_IMM:
533 return LLVMInt16Type ();
534 case OP_LOADU2_MEMBASE:
538 return LLVMInt16Type ();
539 case OP_LOADI4_MEMBASE:
540 case OP_LOADU4_MEMBASE:
543 case OP_STOREI4_MEMBASE_REG:
544 case OP_STOREI4_MEMBASE_IMM:
546 return LLVMInt32Type ();
547 case OP_LOADI8_MEMBASE:
549 case OP_STOREI8_MEMBASE_REG:
550 case OP_STOREI8_MEMBASE_IMM:
552 return LLVMInt64Type ();
553 case OP_LOADR4_MEMBASE:
554 case OP_STORER4_MEMBASE_REG:
556 return LLVMFloatType ();
557 case OP_LOADR8_MEMBASE:
558 case OP_STORER8_MEMBASE_REG:
560 return LLVMDoubleType ();
561 case OP_LOAD_MEMBASE:
563 case OP_STORE_MEMBASE_REG:
564 case OP_STORE_MEMBASE_IMM:
565 *size = sizeof (gpointer);
566 return IntPtrType ();
568 g_assert_not_reached ();
576 * Return the LLVM intrinsics corresponding to the overflow opcode OPCODE.
579 ovf_op_to_intrins (int opcode)
583 return "llvm.sadd.with.overflow.i32";
585 return "llvm.uadd.with.overflow.i32";
587 return "llvm.ssub.with.overflow.i32";
589 return "llvm.usub.with.overflow.i32";
591 return "llvm.smul.with.overflow.i32";
593 return "llvm.umul.with.overflow.i32";
595 return "llvm.sadd.with.overflow.i64";
597 return "llvm.uadd.with.overflow.i64";
599 return "llvm.ssub.with.overflow.i64";
601 return "llvm.usub.with.overflow.i64";
603 return "llvm.smul.with.overflow.i64";
605 return "llvm.umul.with.overflow.i64";
607 g_assert_not_reached ();
613 simd_op_to_intrins (int opcode)
616 #if defined(TARGET_X86) || defined(TARGET_AMD64)
618 return "llvm.x86.sse2.min.pd";
620 return "llvm.x86.sse2.min.ps";
622 return "llvm.x86.sse41.pminud";
624 return "llvm.x86.sse41.pminuw";
626 return "llvm.x86.sse2.pminu.b";
628 return "llvm.x86.sse2.pmins.w";
630 return "llvm.x86.sse2.max.pd";
632 return "llvm.x86.sse2.max.ps";
634 return "llvm.x86.sse41.pmaxud";
636 return "llvm.x86.sse41.pmaxuw";
638 return "llvm.x86.sse2.pmaxu.b";
640 return "llvm.x86.sse2.pcmpeq.b";
642 return "llvm.x86.sse2.pcmpeq.w";
644 return "llvm.x86.sse2.pcmpeq.d";
646 return "llvm.x86.sse41.pcmpeqq";
648 return "llvm.x86.sse2.pcmpgt.b";
651 g_assert_not_reached ();
657 simd_op_to_llvm_type (int opcode)
659 #if defined(TARGET_X86) || defined(TARGET_AMD64)
663 return LLVMVectorType (LLVMDoubleType (), 2);
666 return LLVMVectorType (LLVMInt64Type (), 2);
669 return LLVMVectorType (LLVMInt32Type (), 4);
673 return LLVMVectorType (LLVMInt16Type (), 8);
677 return LLVMVectorType (LLVMInt8Type (), 16);
679 return LLVMVectorType (LLVMFloatType (), 4);
681 g_assert_not_reached ();
692 * Return the LLVM basic block corresponding to BB.
694 static LLVMBasicBlockRef
695 get_bb (EmitContext *ctx, MonoBasicBlock *bb)
699 if (ctx->bblocks [bb->block_num].bblock == NULL) {
700 sprintf (bb_name, "BB%d", bb->block_num);
702 ctx->bblocks [bb->block_num].bblock = LLVMAppendBasicBlock (ctx->lmethod, bb_name);
703 ctx->bblocks [bb->block_num].end_bblock = ctx->bblocks [bb->block_num].bblock;
706 return ctx->bblocks [bb->block_num].bblock;
712 * Return the last LLVM bblock corresponding to BB.
713 * This might not be equal to the bb returned by get_bb () since we need to generate
714 * multiple LLVM bblocks for a mono bblock to handle throwing exceptions.
716 static LLVMBasicBlockRef
717 get_end_bb (EmitContext *ctx, MonoBasicBlock *bb)
720 return ctx->bblocks [bb->block_num].end_bblock;
723 static LLVMBasicBlockRef
724 gen_bb (EmitContext *ctx, const char *prefix)
728 sprintf (bb_name, "%s%d", prefix, ++ ctx->ex_index);
729 return LLVMAppendBasicBlock (ctx->lmethod, bb_name);
735 * Return the target of the patch identified by TYPE and TARGET.
738 resolve_patch (MonoCompile *cfg, MonoJumpInfoType type, gconstpointer target)
742 memset (&ji, 0, sizeof (ji));
744 ji.data.target = target;
746 return mono_resolve_patch_target (cfg->method, cfg->domain, NULL, &ji, FALSE);
752 * Emit code to convert the LLVM value V to DTYPE.
755 convert_full (EmitContext *ctx, LLVMValueRef v, LLVMTypeRef dtype, gboolean is_unsigned)
757 LLVMTypeRef stype = LLVMTypeOf (v);
759 if (stype != dtype) {
760 gboolean ext = FALSE;
763 if (dtype == LLVMInt64Type () && (stype == LLVMInt32Type () || stype == LLVMInt16Type () || stype == LLVMInt8Type ()))
765 else if (dtype == LLVMInt32Type () && (stype == LLVMInt16Type () || stype == LLVMInt8Type ()))
767 else if (dtype == LLVMInt16Type () && (stype == LLVMInt8Type ()))
771 return is_unsigned ? LLVMBuildZExt (ctx->builder, v, dtype, "") : LLVMBuildSExt (ctx->builder, v, dtype, "");
773 if (dtype == LLVMDoubleType () && stype == LLVMFloatType ())
774 return LLVMBuildFPExt (ctx->builder, v, dtype, "");
777 if (stype == LLVMInt64Type () && (dtype == LLVMInt32Type () || dtype == LLVMInt16Type () || dtype == LLVMInt8Type ()))
778 return LLVMBuildTrunc (ctx->builder, v, dtype, "");
779 if (stype == LLVMInt32Type () && (dtype == LLVMInt16Type () || dtype == LLVMInt8Type ()))
780 return LLVMBuildTrunc (ctx->builder, v, dtype, "");
781 if (stype == LLVMInt16Type () && dtype == LLVMInt8Type ())
782 return LLVMBuildTrunc (ctx->builder, v, dtype, "");
783 if (stype == LLVMDoubleType () && dtype == LLVMFloatType ())
784 return LLVMBuildFPTrunc (ctx->builder, v, dtype, "");
786 if (LLVMGetTypeKind (stype) == LLVMPointerTypeKind && LLVMGetTypeKind (dtype) == LLVMPointerTypeKind)
787 return LLVMBuildBitCast (ctx->builder, v, dtype, "");
788 if (LLVMGetTypeKind (dtype) == LLVMPointerTypeKind)
789 return LLVMBuildIntToPtr (ctx->builder, v, dtype, "");
790 if (LLVMGetTypeKind (stype) == LLVMPointerTypeKind)
791 return LLVMBuildPtrToInt (ctx->builder, v, dtype, "");
793 #ifdef MONO_ARCH_SOFT_FLOAT
794 if (stype == LLVMInt32Type () && dtype == LLVMFloatType ())
795 return LLVMBuildBitCast (ctx->builder, v, dtype, "");
796 if (stype == LLVMInt32Type () && dtype == LLVMDoubleType ())
797 return LLVMBuildBitCast (ctx->builder, LLVMBuildZExt (ctx->builder, v, LLVMInt64Type (), ""), dtype, "");
801 LLVMDumpValue (LLVMConstNull (dtype));
802 g_assert_not_reached ();
810 convert (EmitContext *ctx, LLVMValueRef v, LLVMTypeRef dtype)
812 return convert_full (ctx, v, dtype, FALSE);
816 * emit_volatile_load:
818 * If vreg is volatile, emit a load from its address.
821 emit_volatile_load (EmitContext *ctx, int vreg)
825 LLVMValueRef v = LLVMBuildLoad (ctx->builder, ctx->addresses [vreg], "");
826 t = ctx->vreg_cli_types [vreg];
827 if (t && !t->byref) {
829 * Might have to zero extend since llvm doesn't have
832 if (t->type == MONO_TYPE_U1 || t->type == MONO_TYPE_U2)
833 v = LLVMBuildZExt (ctx->builder, v, LLVMInt32Type (), "");
834 else if (t->type == MONO_TYPE_U8)
835 v = LLVMBuildZExt (ctx->builder, v, LLVMInt64Type (), "");
842 * emit_volatile_store:
844 * If VREG is volatile, emit a store from its value to its address.
847 emit_volatile_store (EmitContext *ctx, int vreg)
849 MonoInst *var = get_vreg_to_inst (ctx->cfg, vreg);
851 if (var && var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT)) {
852 g_assert (ctx->addresses [vreg]);
853 LLVMBuildStore (ctx->builder, convert (ctx, ctx->values [vreg], type_to_llvm_type (ctx, var->inst_vtype)), ctx->addresses [vreg]);
859 * Maps parameter indexes in the original signature to parameter indexes
860 * in the LLVM signature.
863 /* The indexes of various special arguments in the LLVM signature */
864 int vret_arg_pindex, this_arg_pindex, rgctx_arg_pindex, imt_arg_pindex;
868 * sig_to_llvm_sig_full:
870 * Return the LLVM signature corresponding to the mono signature SIG using the
871 * calling convention information in CINFO. Return parameter mapping information in SINFO.
874 sig_to_llvm_sig_full (EmitContext *ctx, MonoMethodSignature *sig, LLVMCallInfo *cinfo,
877 LLVMTypeRef ret_type;
878 LLVMTypeRef *param_types = NULL;
880 int i, j, pindex, vret_arg_pindex = 0;
882 gboolean vretaddr = FALSE;
885 memset (sinfo, 0, sizeof (LLVMSigInfo));
887 ret_type = type_to_llvm_type (ctx, sig->ret);
890 if (cinfo && cinfo->ret.storage == LLVMArgVtypeInReg) {
891 /* LLVM models this by returning an aggregate value */
892 if (cinfo->ret.pair_storage [0] == LLVMArgInIReg && cinfo->ret.pair_storage [1] == LLVMArgNone) {
893 LLVMTypeRef members [2];
895 members [0] = IntPtrType ();
896 ret_type = LLVMStructType (members, 1, FALSE);
898 g_assert_not_reached ();
900 } else if (cinfo && MONO_TYPE_ISSTRUCT (sig->ret)) {
901 g_assert (cinfo->ret.storage == LLVMArgVtypeRetAddr);
903 ret_type = LLVMVoidType ();
906 pindexes = g_new0 (int, sig->param_count);
907 param_types = g_new0 (LLVMTypeRef, (sig->param_count * 2) + 3);
909 if (cinfo && cinfo->rgctx_arg) {
911 sinfo->rgctx_arg_pindex = pindex;
912 param_types [pindex] = IntPtrType ();
915 if (cinfo && cinfo->imt_arg) {
917 sinfo->imt_arg_pindex = pindex;
918 param_types [pindex] = IntPtrType ();
922 /* Compute the index in the LLVM signature where the vret arg needs to be passed */
923 vret_arg_pindex = pindex;
924 if (cinfo->vret_arg_index == 1) {
925 /* Add the slots consumed by the first argument */
926 LLVMArgInfo *ainfo = &cinfo->args [0];
927 switch (ainfo->storage) {
928 case LLVMArgVtypeInReg:
929 for (j = 0; j < 2; ++j) {
930 if (ainfo->pair_storage [j] == LLVMArgInIReg)
940 sinfo->vret_arg_pindex = vret_arg_pindex;
943 if (vretaddr && vret_arg_pindex == pindex)
944 param_types [pindex ++] = IntPtrType ();
947 sinfo->this_arg_pindex = pindex;
948 param_types [pindex ++] = IntPtrType ();
950 if (vretaddr && vret_arg_pindex == pindex)
951 param_types [pindex ++] = IntPtrType ();
952 for (i = 0; i < sig->param_count; ++i) {
953 if (vretaddr && vret_arg_pindex == pindex)
954 param_types [pindex ++] = IntPtrType ();
955 pindexes [i] = pindex;
956 if (cinfo && cinfo->args [i + sig->hasthis].storage == LLVMArgVtypeInReg) {
957 for (j = 0; j < 2; ++j) {
958 switch (cinfo->args [i + sig->hasthis].pair_storage [j]) {
960 param_types [pindex ++] = LLVMIntType (sizeof (gpointer) * 8);
965 g_assert_not_reached ();
968 } else if (cinfo && cinfo->args [i + sig->hasthis].storage == LLVMArgVtypeByVal) {
969 param_types [pindex] = type_to_llvm_arg_type (ctx, sig->params [i]);
971 param_types [pindex] = LLVMPointerType (param_types [pindex], 0);
974 param_types [pindex ++] = type_to_llvm_arg_type (ctx, sig->params [i]);
977 if (vretaddr && vret_arg_pindex == pindex)
978 param_types [pindex ++] = IntPtrType ();
982 res = LLVMFunctionType (ret_type, param_types, pindex, FALSE);
983 g_free (param_types);
986 sinfo->pindexes = pindexes;
994 g_free (param_types);
1000 sig_to_llvm_sig (EmitContext *ctx, MonoMethodSignature *sig)
1002 return sig_to_llvm_sig_full (ctx, sig, NULL, NULL);
1006 * LLVMFunctionType1:
1008 * Create an LLVM function type from the arguments.
1010 static G_GNUC_UNUSED LLVMTypeRef
1011 LLVMFunctionType1(LLVMTypeRef ReturnType,
1012 LLVMTypeRef ParamType1,
1015 LLVMTypeRef param_types [1];
1017 param_types [0] = ParamType1;
1019 return LLVMFunctionType (ReturnType, param_types, 1, IsVarArg);
1023 * LLVMFunctionType2:
1025 * Create an LLVM function type from the arguments.
1028 LLVMFunctionType2(LLVMTypeRef ReturnType,
1029 LLVMTypeRef ParamType1,
1030 LLVMTypeRef ParamType2,
1033 LLVMTypeRef param_types [2];
1035 param_types [0] = ParamType1;
1036 param_types [1] = ParamType2;
1038 return LLVMFunctionType (ReturnType, param_types, 2, IsVarArg);
1042 * LLVMFunctionType3:
1044 * Create an LLVM function type from the arguments.
1047 LLVMFunctionType3(LLVMTypeRef ReturnType,
1048 LLVMTypeRef ParamType1,
1049 LLVMTypeRef ParamType2,
1050 LLVMTypeRef ParamType3,
1053 LLVMTypeRef param_types [3];
1055 param_types [0] = ParamType1;
1056 param_types [1] = ParamType2;
1057 param_types [2] = ParamType3;
1059 return LLVMFunctionType (ReturnType, param_types, 3, IsVarArg);
1065 * Create an LLVM builder and remember it so it can be freed later.
1067 static LLVMBuilderRef
1068 create_builder (EmitContext *ctx)
1070 LLVMBuilderRef builder = LLVMCreateBuilder ();
1072 ctx->builders = g_slist_prepend_mempool (ctx->cfg->mempool, ctx->builders, builder);
1078 get_plt_entry (EmitContext *ctx, LLVMTypeRef llvm_sig, MonoJumpInfoType type, gconstpointer data)
1080 char *callee_name = mono_aot_get_plt_symbol (type, data);
1081 LLVMValueRef callee;
1087 callee = g_hash_table_lookup (ctx->lmodule->plt_entries, callee_name);
1089 callee = LLVMAddFunction (ctx->module, callee_name, llvm_sig);
1091 LLVMSetVisibility (callee, LLVMHiddenVisibility);
1093 g_hash_table_insert (ctx->lmodule->plt_entries, (char*)callee_name, callee);
1100 get_handler_clause (MonoCompile *cfg, MonoBasicBlock *bb)
1102 MonoMethodHeader *header = cfg->header;
1103 MonoExceptionClause *clause;
1107 if (bb->region != -1 && MONO_BBLOCK_IS_IN_REGION (bb, MONO_REGION_TRY))
1108 return (bb->region >> 8) - 1;
1111 for (i = 0; i < header->num_clauses; ++i) {
1112 clause = &header->clauses [i];
1114 if (MONO_OFFSET_IN_CLAUSE (clause, bb->real_offset) && clause->flags == MONO_EXCEPTION_CLAUSE_NONE)
1122 set_metadata_flag (LLVMValueRef v, const char *flag_name)
1124 #if LLVM_CHECK_VERSION (2, 8)
1125 LLVMValueRef md_arg;
1128 if (!IS_LLVM_MONO_BRANCH)
1131 md_kind = LLVMGetMDKindID (flag_name, strlen (flag_name));
1132 md_arg = LLVMMDString ("mono", 4);
1133 LLVMSetMetadata (v, md_kind, LLVMMDNode (&md_arg, 1));
1140 * Emit an LLVM call or invoke instruction depending on whenever the call is inside
1144 emit_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, LLVMValueRef callee, LLVMValueRef *args, int pindex)
1146 MonoCompile *cfg = ctx->cfg;
1148 LLVMBuilderRef builder = *builder_ref;
1151 clause_index = get_handler_clause (cfg, bb);
1153 if (clause_index != -1) {
1154 MonoMethodHeader *header = cfg->header;
1155 MonoExceptionClause *ec = &header->clauses [clause_index];
1156 MonoBasicBlock *tblock;
1157 LLVMBasicBlockRef ex_bb, noex_bb;
1160 * Have to use an invoke instead of a call, branching to the
1161 * handler bblock of the clause containing this bblock.
1164 g_assert (ec->flags == MONO_EXCEPTION_CLAUSE_NONE || ec->flags == MONO_EXCEPTION_CLAUSE_FINALLY);
1166 tblock = cfg->cil_offset_to_bb [ec->handler_offset];
1169 ctx->bblocks [tblock->block_num].invoke_target = TRUE;
1171 ex_bb = get_bb (ctx, tblock);
1173 noex_bb = gen_bb (ctx, "NOEX_BB");
1176 lcall = LLVMBuildInvoke (builder, callee, args, pindex, noex_bb, ex_bb, "");
1178 builder = ctx->builder = create_builder (ctx);
1179 LLVMPositionBuilderAtEnd (ctx->builder, noex_bb);
1181 ctx->bblocks [bb->block_num].end_bblock = noex_bb;
1183 lcall = LLVMBuildCall (builder, callee, args, pindex, "");
1184 ctx->builder = builder;
1187 *builder_ref = ctx->builder;
1193 emit_load (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, int size, LLVMValueRef addr, const char *name, gboolean is_faulting)
1195 const char *intrins_name;
1196 LLVMValueRef args [16], res;
1197 LLVMTypeRef addr_type;
1199 if (is_faulting && bb->region != -1 && IS_LLVM_MONO_BRANCH) {
1201 * We handle loads which can fault by calling a mono specific intrinsic
1202 * using an invoke, so they are handled properly inside try blocks.
1203 * We can't use this outside clauses, since LLVM optimizes intrinsics which
1204 * are marked with IntrReadArgMem.
1208 intrins_name = "llvm.mono.load.i8.p0i8";
1211 intrins_name = "llvm.mono.load.i16.p0i16";
1214 intrins_name = "llvm.mono.load.i32.p0i32";
1217 intrins_name = "llvm.mono.load.i64.p0i64";
1220 g_assert_not_reached ();
1223 addr_type = LLVMTypeOf (addr);
1224 if (addr_type == LLVMPointerType (LLVMDoubleType (), 0) || addr_type == LLVMPointerType (LLVMFloatType (), 0))
1225 addr = LLVMBuildBitCast (*builder_ref, addr, LLVMPointerType (LLVMIntType (size * 8), 0), "");
1228 args [1] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
1229 args [2] = LLVMConstInt (LLVMInt1Type (), TRUE, FALSE);
1230 res = emit_call (ctx, bb, builder_ref, LLVMGetNamedFunction (ctx->module, intrins_name), args, 3);
1232 if (addr_type == LLVMPointerType (LLVMDoubleType (), 0))
1233 res = LLVMBuildBitCast (*builder_ref, res, LLVMDoubleType (), "");
1234 else if (addr_type == LLVMPointerType (LLVMFloatType (), 0))
1235 res = LLVMBuildBitCast (*builder_ref, res, LLVMFloatType (), "");
1242 * We emit volatile loads for loads which can fault, because otherwise
1243 * LLVM will generate invalid code when encountering a load from a
1246 res = mono_llvm_build_load (*builder_ref, addr, name, is_faulting);
1248 /* Mark it with a custom metadata */
1251 set_metadata_flag (res, "mono.faulting.load");
1259 emit_store (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, int size, LLVMValueRef value, LLVMValueRef addr, gboolean is_faulting)
1261 const char *intrins_name;
1262 LLVMValueRef args [16];
1264 if (is_faulting && bb->region != -1 && IS_LLVM_MONO_BRANCH) {
1267 intrins_name = "llvm.mono.store.i8.p0i8";
1270 intrins_name = "llvm.mono.store.i16.p0i16";
1273 intrins_name = "llvm.mono.store.i32.p0i32";
1276 intrins_name = "llvm.mono.store.i64.p0i64";
1279 g_assert_not_reached ();
1282 if (LLVMTypeOf (value) == LLVMDoubleType () || LLVMTypeOf (value) == LLVMFloatType ()) {
1283 value = LLVMBuildBitCast (*builder_ref, value, LLVMIntType (size * 8), "");
1284 addr = LLVMBuildBitCast (*builder_ref, addr, LLVMPointerType (LLVMIntType (size * 8), 0), "");
1289 args [2] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
1290 args [3] = LLVMConstInt (LLVMInt1Type (), TRUE, FALSE);
1291 emit_call (ctx, bb, builder_ref, LLVMGetNamedFunction (ctx->module, intrins_name), args, 4);
1293 LLVMBuildStore (*builder_ref, value, addr);
1298 * emit_cond_system_exception:
1300 * Emit code to throw the exception EXC_TYPE if the condition CMP is false.
1301 * Might set the ctx exception.
1304 emit_cond_system_exception (EmitContext *ctx, MonoBasicBlock *bb, const char *exc_type, LLVMValueRef cmp)
1306 LLVMBasicBlockRef ex_bb, noex_bb;
1307 LLVMBuilderRef builder;
1308 MonoClass *exc_class;
1309 LLVMValueRef args [2];
1311 ex_bb = gen_bb (ctx, "EX_BB");
1312 noex_bb = gen_bb (ctx, "NOEX_BB");
1314 LLVMBuildCondBr (ctx->builder, cmp, ex_bb, noex_bb);
1316 exc_class = mono_class_from_name (mono_get_corlib (), "System", exc_type);
1317 g_assert (exc_class);
1319 /* Emit exception throwing code */
1320 builder = create_builder (ctx);
1321 LLVMPositionBuilderAtEnd (builder, ex_bb);
1323 if (!ctx->lmodule->throw_corlib_exception) {
1324 LLVMValueRef callee;
1326 const char *icall_name;
1328 MonoMethodSignature *throw_sig = mono_metadata_signature_alloc (mono_get_corlib (), 2);
1329 throw_sig->ret = &mono_get_void_class ()->byval_arg;
1330 throw_sig->params [0] = &mono_get_int32_class ()->byval_arg;
1331 if (IS_LLVM_MONO_BRANCH) {
1332 icall_name = "llvm_throw_corlib_exception_abs_trampoline";
1333 throw_sig->params [1] = &mono_get_intptr_class ()->byval_arg;
1335 icall_name = "llvm_throw_corlib_exception_trampoline";
1336 throw_sig->params [1] = &mono_get_int32_class ()->byval_arg;
1338 sig = sig_to_llvm_sig (ctx, throw_sig);
1340 if (ctx->cfg->compile_aot) {
1341 callee = get_plt_entry (ctx, sig, MONO_PATCH_INFO_INTERNAL_METHOD, icall_name);
1343 callee = LLVMAddFunction (ctx->module, "llvm_throw_corlib_exception_trampoline", sig_to_llvm_sig (ctx, throw_sig));
1346 * Differences between the LLVM/non-LLVM throw corlib exception trampoline:
1347 * - On x86, LLVM generated code doesn't push the arguments
1348 * - When using the LLVM mono branch, the trampoline takes the throw address as an
1349 * arguments, not a pc offset.
1351 LLVMAddGlobalMapping (ee, callee, resolve_patch (ctx->cfg, MONO_PATCH_INFO_INTERNAL_METHOD, icall_name));
1354 mono_memory_barrier ();
1355 ctx->lmodule->throw_corlib_exception = callee;
1359 args [0] = LLVMConstInt (LLVMInt32Type (), exc_class->type_token - MONO_TOKEN_TYPE_DEF, FALSE);
1361 args [0] = LLVMConstInt (LLVMInt32Type (), exc_class->type_token, FALSE);
1363 if (IS_LLVM_MONO_BRANCH) {
1365 * The LLVM mono branch contains changes so a block address can be passed as an
1366 * argument to a call.
1368 args [1] = LLVMBuildPtrToInt (builder, LLVMBlockAddress (ctx->lmethod, ex_bb), IntPtrType (), "");
1369 emit_call (ctx, bb, &builder, ctx->lmodule->throw_corlib_exception, args, 2);
1372 * FIXME: The offset is 0, this is only a problem if the code is inside a clause,
1373 * otherwise only the line numbers in stack traces are incorrect.
1375 if (bb->region != -1 && !IS_LLVM_MONO_BRANCH)
1376 LLVM_FAILURE (ctx, "system-ex-in-region");
1378 args [1] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
1379 emit_call (ctx, bb, &builder, ctx->lmodule->throw_corlib_exception, args, 2);
1382 LLVMBuildUnreachable (builder);
1384 ctx->builder = create_builder (ctx);
1385 LLVMPositionBuilderAtEnd (ctx->builder, noex_bb);
1387 ctx->bblocks [bb->block_num].end_bblock = noex_bb;
1397 * emit_reg_to_vtype:
1399 * Emit code to store the vtype in the registers REGS to the address ADDRESS.
1402 emit_reg_to_vtype (EmitContext *ctx, LLVMBuilderRef builder, MonoType *t, LLVMValueRef address, LLVMArgInfo *ainfo, LLVMValueRef *regs)
1406 size = get_vtype_size (t);
1408 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) {
1409 address = LLVMBuildBitCast (ctx->builder, address, LLVMPointerType (LLVMInt8Type (), 0), "");
1412 for (j = 0; j < 2; ++j) {
1413 LLVMValueRef index [2], addr;
1414 int part_size = size > sizeof (gpointer) ? sizeof (gpointer) : size;
1415 LLVMTypeRef part_type;
1417 if (ainfo->pair_storage [j] == LLVMArgNone)
1420 part_type = LLVMIntType (part_size * 8);
1421 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) {
1422 index [0] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE);
1423 addr = LLVMBuildGEP (builder, address, index, 1, "");
1425 index [0] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
1426 index [1] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE);
1427 addr = LLVMBuildGEP (builder, address, index, 2, "");
1429 switch (ainfo->pair_storage [j]) {
1431 LLVMBuildStore (builder, convert (ctx, regs [j], part_type), LLVMBuildBitCast (ctx->builder, addr, LLVMPointerType (part_type, 0), ""));
1436 g_assert_not_reached ();
1439 size -= sizeof (gpointer);
1444 * emit_vtype_to_reg:
1446 * Emit code to load a vtype at address ADDRESS into registers. Store the registers
1447 * into REGS, and the number of registers into NREGS.
1450 emit_vtype_to_reg (EmitContext *ctx, LLVMBuilderRef builder, MonoType *t, LLVMValueRef address, LLVMArgInfo *ainfo, LLVMValueRef *regs, guint32 *nregs)
1455 size = get_vtype_size (t);
1457 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) {
1458 address = LLVMBuildBitCast (ctx->builder, address, LLVMPointerType (LLVMInt8Type (), 0), "");
1461 for (j = 0; j < 2; ++j) {
1462 LLVMValueRef index [2], addr;
1463 int partsize = size > sizeof (gpointer) ? sizeof (gpointer) : size;
1465 if (ainfo->pair_storage [j] == LLVMArgNone)
1468 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) {
1469 index [0] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE);
1470 addr = LLVMBuildGEP (builder, address, index, 1, "");
1472 index [0] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
1473 index [1] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE);
1474 addr = LLVMBuildGEP (builder, address, index, 2, "");
1476 switch (ainfo->pair_storage [j]) {
1478 regs [pindex ++] = convert (ctx, LLVMBuildLoad (builder, LLVMBuildBitCast (ctx->builder, addr, LLVMPointerType (LLVMIntType (partsize * 8), 0), ""), ""), IntPtrType ());
1483 g_assert_not_reached ();
1485 size -= sizeof (gpointer);
1492 build_alloca (EmitContext *ctx, MonoType *t)
1494 MonoClass *k = mono_class_from_mono_type (t);
1497 if (MONO_CLASS_IS_SIMD (ctx->cfg, k))
1500 align = mono_class_min_align (k);
1502 /* Sometimes align is not a power of 2 */
1503 while (mono_is_power_of_two (align) == -1)
1507 * Have to place all alloca's at the end of the entry bb, since otherwise they would
1508 * get executed every time control reaches them.
1510 LLVMPositionBuilder (ctx->alloca_builder, get_bb (ctx, ctx->cfg->bb_entry), ctx->last_alloca);
1512 ctx->last_alloca = mono_llvm_build_alloca (ctx->alloca_builder, type_to_llvm_type (ctx, t), NULL, align, "");
1513 return ctx->last_alloca;
1517 * Put the global into the 'llvm.used' array to prevent it from being optimized away.
1520 mark_as_used (LLVMModuleRef module, LLVMValueRef global)
1522 LLVMTypeRef used_type;
1523 LLVMValueRef used, used_elem;
1525 used_type = LLVMArrayType (LLVMPointerType (LLVMInt8Type (), 0), 1);
1526 used = LLVMAddGlobal (module, used_type, "llvm.used");
1527 used_elem = LLVMConstBitCast (global, LLVMPointerType (LLVMInt8Type (), 0));
1528 LLVMSetInitializer (used, LLVMConstArray (LLVMPointerType (LLVMInt8Type (), 0), &used_elem, 1));
1529 LLVMSetLinkage (used, LLVMAppendingLinkage);
1530 LLVMSetSection (used, "llvm.metadata");
1536 * Emit code to load/convert arguments.
1539 emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder)
1542 MonoCompile *cfg = ctx->cfg;
1543 MonoMethodSignature *sig = ctx->sig;
1544 LLVMCallInfo *linfo = ctx->linfo;
1547 ctx->alloca_builder = create_builder (ctx);
1550 * Handle indirect/volatile variables by allocating memory for them
1551 * using 'alloca', and storing their address in a temporary.
1553 for (i = 0; i < cfg->num_varinfo; ++i) {
1554 MonoInst *var = cfg->varinfo [i];
1557 if (var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT) || MONO_TYPE_ISSTRUCT (var->inst_vtype)) {
1558 vtype = type_to_llvm_type (ctx, var->inst_vtype);
1559 CHECK_FAILURE (ctx);
1560 /* Could be already created by an OP_VPHI */
1561 if (!ctx->addresses [var->dreg])
1562 ctx->addresses [var->dreg] = build_alloca (ctx, var->inst_vtype);
1563 ctx->vreg_cli_types [var->dreg] = var->inst_vtype;
1567 for (i = 0; i < sig->param_count; ++i) {
1568 LLVMArgInfo *ainfo = &linfo->args [i + sig->hasthis];
1569 int reg = cfg->args [i + sig->hasthis]->dreg;
1571 if (ainfo->storage == LLVMArgVtypeInReg) {
1572 LLVMValueRef regs [2];
1575 * Emit code to save the argument from the registers to
1576 * the real argument.
1578 pindex = ctx->pindexes [i];
1579 regs [0] = LLVMGetParam (ctx->lmethod, pindex);
1580 if (ainfo->pair_storage [1] != LLVMArgNone)
1581 regs [1] = LLVMGetParam (ctx->lmethod, pindex + 1);
1585 ctx->addresses [reg] = build_alloca (ctx, sig->params [i]);
1587 emit_reg_to_vtype (ctx, builder, sig->params [i], ctx->addresses [reg], ainfo, regs);
1589 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (sig->params [i]))) {
1590 /* Treat these as normal values */
1591 ctx->values [reg] = LLVMBuildLoad (builder, ctx->addresses [reg], "");
1593 } else if (ainfo->storage == LLVMArgVtypeByVal) {
1594 ctx->addresses [reg] = LLVMGetParam (ctx->lmethod, ctx->pindexes [i]);
1596 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (sig->params [i]))) {
1597 /* Treat these as normal values */
1598 ctx->values [reg] = LLVMBuildLoad (builder, ctx->addresses [reg], "");
1601 ctx->values [reg] = convert (ctx, ctx->values [reg], llvm_type_to_stack_type (type_to_llvm_type (ctx, sig->params [i])));
1606 emit_volatile_store (ctx, cfg->vret_addr->dreg);
1608 emit_volatile_store (ctx, cfg->args [0]->dreg);
1609 for (i = 0; i < sig->param_count; ++i)
1610 if (!MONO_TYPE_ISSTRUCT (sig->params [i]))
1611 emit_volatile_store (ctx, cfg->args [i + sig->hasthis]->dreg);
1613 if (sig->hasthis && !cfg->rgctx_var && cfg->generic_sharing_context) {
1614 LLVMValueRef this_alloc;
1617 * The exception handling code needs the location where the this argument was
1618 * stored for gshared methods. We create a separate alloca to hold it, and mark it
1619 * with the "mono.this" custom metadata to tell llvm that it needs to save its
1620 * location into the LSDA.
1622 this_alloc = mono_llvm_build_alloca (builder, IntPtrType (), LLVMConstInt (LLVMInt32Type (), 1, FALSE), 0, "");
1623 /* This volatile store will keep the alloca alive */
1624 mono_llvm_build_store (builder, ctx->values [cfg->args [0]->dreg], this_alloc, TRUE);
1626 set_metadata_flag (this_alloc, "mono.this");
1629 if (cfg->rgctx_var) {
1630 LLVMValueRef rgctx_alloc, store;
1633 * We handle the rgctx arg similarly to the this pointer.
1635 g_assert (ctx->addresses [cfg->rgctx_var->dreg]);
1636 rgctx_alloc = ctx->addresses [cfg->rgctx_var->dreg];
1637 /* This volatile store will keep the alloca alive */
1638 store = mono_llvm_build_store (builder, ctx->rgctx_arg, rgctx_alloc, TRUE);
1640 set_metadata_flag (rgctx_alloc, "mono.this");
1644 * For finally clauses, create an indicator variable telling OP_ENDFINALLY whenever
1645 * it needs to continue normally, or return back to the exception handling system.
1647 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
1648 if (bb->region != -1 && (bb->flags & BB_EXCEPTION_HANDLER))
1649 g_hash_table_insert (ctx->region_to_handler, GUINT_TO_POINTER (mono_get_block_region_notry (cfg, bb->region)), bb);
1650 if (bb->region != -1 && (bb->flags & BB_EXCEPTION_HANDLER) && bb->in_scount == 0) {
1654 sprintf (name, "finally_ind_bb%d", bb->block_num);
1655 val = LLVMBuildAlloca (builder, LLVMInt32Type (), name);
1656 LLVMBuildStore (builder, LLVMConstInt (LLVMInt32Type (), 0, FALSE), val);
1658 ctx->bblocks [bb->block_num].finally_ind = val;
1661 * Create a new bblock which CALL_HANDLER can branch to, because branching to the
1662 * LLVM bblock containing the call to llvm.eh.selector causes problems for the
1663 * LLVM optimizer passes.
1665 sprintf (name, "BB_%d_CALL_HANDLER_TARGET", bb->block_num);
1666 ctx->bblocks [bb->block_num].call_handler_target_bb = LLVMAppendBasicBlock (ctx->lmethod, name);
1674 /* Have to export this for AOT */
1676 mono_personality (void);
1679 mono_personality (void)
1682 g_assert_not_reached ();
1686 process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, MonoInst *ins)
1688 MonoCompile *cfg = ctx->cfg;
1689 LLVMModuleRef module = ctx->module;
1690 LLVMValueRef *values = ctx->values;
1691 LLVMValueRef *addresses = ctx->addresses;
1692 MonoCallInst *call = (MonoCallInst*)ins;
1693 MonoMethodSignature *sig = call->signature;
1694 LLVMValueRef callee, lcall;
1696 LLVMCallInfo *cinfo;
1700 LLVMTypeRef llvm_sig;
1702 gboolean virtual, calli;
1703 LLVMBuilderRef builder = *builder_ref;
1706 if (call->signature->call_convention != MONO_CALL_DEFAULT)
1707 LLVM_FAILURE (ctx, "non-default callconv");
1709 if (call->rgctx_arg_reg && !IS_LLVM_MONO_BRANCH)
1710 LLVM_FAILURE (ctx, "rgctx reg in call");
1712 if (call->rgctx_reg && !IS_LLVM_MONO_BRANCH) {
1714 * It might be possible to support this by creating a static rgctx trampoline, but
1715 * common_call_trampoline () would patch callsites to call the trampoline, which
1716 * would be incorrect if the rgctx arg is computed dynamically.
1718 LLVM_FAILURE (ctx, "rgctx reg");
1721 cinfo = call->cinfo;
1722 if (call->rgctx_arg_reg)
1723 cinfo->rgctx_arg = TRUE;
1724 if (call->imt_arg_reg)
1725 cinfo->imt_arg = TRUE;
1727 vretaddr = cinfo && cinfo->ret.storage == LLVMArgVtypeRetAddr;
1729 llvm_sig = sig_to_llvm_sig_full (ctx, sig, cinfo, &sinfo);
1730 CHECK_FAILURE (ctx);
1732 virtual = (ins->opcode == OP_VOIDCALL_MEMBASE || ins->opcode == OP_CALL_MEMBASE || ins->opcode == OP_VCALL_MEMBASE || ins->opcode == OP_LCALL_MEMBASE || ins->opcode == OP_FCALL_MEMBASE);
1733 calli = (ins->opcode == OP_VOIDCALL_REG || ins->opcode == OP_CALL_REG || ins->opcode == OP_VCALL_REG || ins->opcode == OP_LCALL_REG || ins->opcode == OP_FCALL_REG);
1735 /* FIXME: Avoid creating duplicate methods */
1737 if (ins->flags & MONO_INST_HAS_METHOD) {
1741 if (cfg->compile_aot) {
1742 callee = get_plt_entry (ctx, llvm_sig, MONO_PATCH_INFO_METHOD, call->method);
1744 LLVM_FAILURE (ctx, "can't encode patch");
1746 callee = LLVMAddFunction (module, "", llvm_sig);
1749 mono_create_jit_trampoline_in_domain (mono_domain_get (),
1751 LLVMAddGlobalMapping (ee, callee, target);
1756 MonoJitICallInfo *info = mono_find_jit_icall_by_addr (call->fptr);
1762 memset (&ji, 0, sizeof (ji));
1763 ji.type = MONO_PATCH_INFO_JIT_ICALL_ADDR;
1764 ji.data.target = info->name;
1766 target = mono_resolve_patch_target (cfg->method, cfg->domain, NULL, &ji, FALSE);
1768 if (cfg->compile_aot) {
1769 callee = get_plt_entry (ctx, llvm_sig, MONO_PATCH_INFO_INTERNAL_METHOD, (char*)info->name);
1771 LLVM_FAILURE (ctx, "can't encode patch");
1773 callee = LLVMAddFunction (module, "", llvm_sig);
1774 target = (gpointer)mono_icall_get_wrapper (info);
1775 LLVMAddGlobalMapping (ee, callee, target);
1778 if (cfg->compile_aot) {
1780 if (cfg->abs_patches) {
1781 MonoJumpInfo *abs_ji = g_hash_table_lookup (cfg->abs_patches, call->fptr);
1783 callee = get_plt_entry (ctx, llvm_sig, abs_ji->type, abs_ji->data.target);
1785 LLVM_FAILURE (ctx, "can't encode patch");
1789 LLVM_FAILURE (ctx, "aot");
1791 callee = LLVMAddFunction (module, "", llvm_sig);
1793 if (cfg->abs_patches) {
1794 MonoJumpInfo *abs_ji = g_hash_table_lookup (cfg->abs_patches, call->fptr);
1797 * FIXME: Some trampolines might have
1798 * their own calling convention on some platforms.
1800 #ifndef TARGET_AMD64
1801 if (abs_ji->type == MONO_PATCH_INFO_MONITOR_ENTER || abs_ji->type == MONO_PATCH_INFO_MONITOR_EXIT || abs_ji->type == MONO_PATCH_INFO_GENERIC_CLASS_INIT)
1802 LLVM_FAILURE (ctx, "trampoline with own cconv");
1804 target = mono_resolve_patch_target (cfg->method, cfg->domain, NULL, abs_ji, FALSE);
1805 LLVMAddGlobalMapping (ee, callee, target);
1809 LLVMAddGlobalMapping (ee, callee, (gpointer)call->fptr);
1815 int size = sizeof (gpointer);
1818 g_assert (ins->inst_offset % size == 0);
1819 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);
1821 // FIXME: mono_arch_get_vcall_slot () can't decode the code
1822 // generated by LLVM
1823 //LLVM_FAILURE (ctx, "virtual call");
1826 * When using the llvm mono branch, we can support IMT directly, otherwise
1827 * we need to call a trampoline.
1829 if (call->method && call->method->klass->flags & TYPE_ATTRIBUTE_INTERFACE && !IS_LLVM_MONO_BRANCH) {
1830 #ifdef MONO_ARCH_HAVE_LLVM_IMT_TRAMPOLINE
1831 if (cfg->compile_aot) {
1832 MonoJumpInfoImtTramp *imt_tramp = g_new0 (MonoJumpInfoImtTramp, 1);
1833 imt_tramp->method = call->method;
1834 imt_tramp->vt_offset = call->inst.inst_offset;
1836 callee = get_plt_entry (ctx, llvm_sig, MONO_PATCH_INFO_LLVM_IMT_TRAMPOLINE, imt_tramp);
1838 callee = LLVMAddFunction (module, "", llvm_sig);
1839 target = mono_create_llvm_imt_trampoline (cfg->domain, call->method, call->inst.inst_offset);
1840 LLVMAddGlobalMapping (ee, callee, target);
1843 /* No support for passing the IMT argument */
1844 LLVM_FAILURE (ctx, "imt");
1847 callee = convert (ctx, LLVMBuildLoad (builder, LLVMBuildGEP (builder, convert (ctx, values [ins->inst_basereg], LLVMPointerType (LLVMPointerType (IntPtrType (), 0), 0)), &index, 1, ""), ""), LLVMPointerType (llvm_sig, 0));
1850 callee = convert (ctx, values [ins->sreg1], LLVMPointerType (llvm_sig, 0));
1852 if (ins->flags & MONO_INST_HAS_METHOD) {
1857 * Collect and convert arguments
1859 args = alloca (sizeof (LLVMValueRef) * ((sig->param_count * 2) + sig->hasthis + vretaddr + call->rgctx_reg));
1860 l = call->out_ireg_args;
1862 if (IS_LLVM_MONO_BRANCH) {
1863 if (call->rgctx_arg_reg) {
1864 g_assert (values [call->rgctx_arg_reg]);
1865 args [sinfo.rgctx_arg_pindex] = values [call->rgctx_arg_reg];
1867 if (call->imt_arg_reg) {
1868 g_assert (values [call->imt_arg_reg]);
1869 args [sinfo.imt_arg_pindex] = values [call->imt_arg_reg];
1874 if (!addresses [call->inst.dreg])
1875 addresses [call->inst.dreg] = build_alloca (ctx, sig->ret);
1876 args [sinfo.vret_arg_pindex] = LLVMBuildPtrToInt (builder, addresses [call->inst.dreg], IntPtrType (), "");
1879 for (i = 0; i < sig->param_count + sig->hasthis; ++i) {
1882 LLVMArgInfo *ainfo = call->cinfo ? &call->cinfo->args [i] : NULL;
1886 pindex = sinfo.this_arg_pindex;
1888 pindex = sinfo.pindexes [i - 1];
1890 pindex = sinfo.pindexes [i];
1893 regpair = (guint32)(gssize)(l->data);
1894 reg = regpair & 0xffffff;
1895 args [pindex] = values [reg];
1896 if (ainfo->storage == LLVMArgVtypeInReg) {
1898 LLVMValueRef regs [2];
1903 g_assert (addresses [reg]);
1905 emit_vtype_to_reg (ctx, builder, sig->params [i - sig->hasthis], addresses [reg], ainfo, regs, &nregs);
1906 for (j = 0; j < nregs; ++j)
1907 args [pindex ++] = regs [j];
1910 // FIXME: Get rid of the VMOVE
1911 } else if (ainfo->storage == LLVMArgVtypeByVal) {
1912 g_assert (addresses [reg]);
1913 args [pindex] = addresses [reg];
1915 g_assert (args [pindex]);
1916 if (i == 0 && sig->hasthis)
1917 args [pindex] = convert (ctx, args [pindex], IntPtrType ());
1919 args [pindex] = convert (ctx, args [pindex], type_to_llvm_arg_type (ctx, sig->params [i - sig->hasthis]));
1925 // FIXME: Align call sites
1931 lcall = emit_call (ctx, bb, &builder, callee, args, LLVMCountParamTypes (llvm_sig));
1933 #ifdef LLVM_MONO_BRANCH
1935 * Modify cconv and parameter attributes to pass rgctx/imt correctly.
1937 #if defined(MONO_ARCH_IMT_REG) && defined(MONO_ARCH_RGCTX_REG)
1938 g_assert (MONO_ARCH_IMT_REG == MONO_ARCH_RGCTX_REG);
1940 /* The two can't be used together, so use only one LLVM calling conv to pass them */
1941 g_assert (!(call->rgctx_arg_reg && call->imt_arg_reg));
1942 if (call->rgctx_arg_reg || call->imt_arg_reg)
1943 LLVMSetInstructionCallConv (lcall, LLVMMono1CallConv);
1945 if (call->rgctx_arg_reg)
1946 LLVMAddInstrAttribute (lcall, 1 + sinfo.rgctx_arg_pindex, LLVMInRegAttribute);
1947 if (call->imt_arg_reg)
1948 LLVMAddInstrAttribute (lcall, 1 + sinfo.imt_arg_pindex, LLVMInRegAttribute);
1951 /* Add byval attributes if needed */
1952 for (i = 0; i < sig->param_count; ++i) {
1953 LLVMArgInfo *ainfo = call->cinfo ? &call->cinfo->args [i + sig->hasthis] : NULL;
1955 if (ainfo && ainfo->storage == LLVMArgVtypeByVal) {
1956 LLVMAddInstrAttribute (lcall, 1 + sinfo.pindexes [i], LLVMByValAttribute);
1961 * Convert the result
1963 if (cinfo && cinfo->ret.storage == LLVMArgVtypeInReg) {
1964 LLVMValueRef regs [2];
1966 if (!addresses [ins->dreg])
1967 addresses [ins->dreg] = build_alloca (ctx, sig->ret);
1969 regs [0] = LLVMBuildExtractValue (builder, lcall, 0, "");
1970 if (cinfo->ret.pair_storage [1] != LLVMArgNone)
1971 regs [1] = LLVMBuildExtractValue (builder, lcall, 1, "");
1973 emit_reg_to_vtype (ctx, builder, sig->ret, addresses [ins->dreg], &cinfo->ret, regs);
1974 } else if (sig->ret->type != MONO_TYPE_VOID && !vretaddr) {
1975 /* If the method returns an unsigned value, need to zext it */
1977 values [ins->dreg] = convert_full (ctx, lcall, llvm_type_to_stack_type (type_to_llvm_type (ctx, sig->ret)), type_is_unsigned (ctx, sig->ret));
1980 *builder_ref = ctx->builder;
1982 g_free (sinfo.pindexes);
1990 process_bb (EmitContext *ctx, MonoBasicBlock *bb)
1992 MonoCompile *cfg = ctx->cfg;
1993 MonoMethodSignature *sig = ctx->sig;
1994 LLVMValueRef method = ctx->lmethod;
1995 LLVMValueRef *values = ctx->values;
1996 LLVMValueRef *addresses = ctx->addresses;
1998 LLVMCallInfo *linfo = ctx->linfo;
1999 LLVMModuleRef module = ctx->module;
2000 BBInfo *bblocks = ctx->bblocks;
2002 LLVMBasicBlockRef cbb;
2003 LLVMBuilderRef builder;
2004 gboolean has_terminator;
2006 LLVMValueRef lhs, rhs;
2008 cbb = get_bb (ctx, bb);
2009 builder = create_builder (ctx);
2010 ctx->builder = builder;
2011 LLVMPositionBuilderAtEnd (builder, cbb);
2013 if (bb == cfg->bb_entry)
2014 emit_entry_bb (ctx, builder);
2015 CHECK_FAILURE (ctx);
2017 if (bb->flags & BB_EXCEPTION_HANDLER) {
2019 LLVMValueRef eh_selector, eh_exception, personality, args [4];
2020 LLVMBasicBlockRef target_bb;
2022 static gint32 mapping_inited;
2023 static int ti_generator;
2026 LLVMValueRef type_info;
2029 if (!bblocks [bb->block_num].invoke_target) {
2031 * LLVM asserts if llvm.eh.selector is called from a bblock which
2032 * doesn't have an invoke pointing at it.
2034 LLVM_FAILURE (ctx, "handler without invokes");
2037 eh_selector = LLVMGetNamedFunction (module, eh_selector_name);
2039 if (cfg->compile_aot) {
2040 /* Use a dummy personality function */
2041 personality = LLVMGetNamedFunction (module, "mono_aot_personality");
2042 g_assert (personality);
2044 personality = LLVMGetNamedFunction (module, "mono_personality");
2045 if (InterlockedCompareExchange (&mapping_inited, 1, 0) == 0)
2046 LLVMAddGlobalMapping (ee, personality, mono_personality);
2049 i8ptr = LLVMPointerType (LLVMInt8Type (), 0);
2051 clause_index = (mono_get_block_region_notry (cfg, bb->region) >> 8) - 1;
2054 * Create the type info
2056 sprintf (ti_name, "type_info_%d", ti_generator);
2059 if (cfg->compile_aot) {
2060 /* decode_eh_frame () in aot-runtime.c will decode this */
2061 type_info = LLVMAddGlobal (module, LLVMInt32Type (), ti_name);
2062 LLVMSetInitializer (type_info, LLVMConstInt (LLVMInt32Type (), clause_index, FALSE));
2064 LLVMSetLinkage (type_info, LLVMPrivateLinkage);
2065 LLVMSetVisibility (type_info, LLVMHiddenVisibility);
2068 * Enabling this causes llc to crash:
2069 * http://llvm.org/bugs/show_bug.cgi?id=6102
2071 //LLVM_FAILURE (ctx, "aot+clauses");
2073 /* exception_cb will decode this */
2074 ti = g_malloc (sizeof (gint32));
2075 *(gint32*)ti = clause_index;
2077 type_info = LLVMAddGlobal (module, i8ptr, ti_name);
2079 LLVMAddGlobalMapping (ee, type_info, ti);
2082 args [0] = LLVMConstNull (i8ptr);
2083 args [1] = LLVMConstBitCast (personality, i8ptr);
2084 args [2] = type_info;
2085 LLVMBuildCall (builder, eh_selector, args, 3, "");
2087 /* Store the exception into the exvar */
2088 if (bb->in_scount == 1) {
2089 g_assert (bb->in_scount == 1);
2090 exvar = bb->in_stack [0];
2092 eh_exception = LLVMGetNamedFunction (module, "llvm.eh.exception");
2094 // FIXME: This is shared with filter clauses ?
2095 g_assert (!values [exvar->dreg]);
2096 values [exvar->dreg] = LLVMBuildCall (builder, eh_exception, NULL, 0, "");
2097 emit_volatile_store (ctx, exvar->dreg);
2100 /* Start a new bblock which CALL_HANDLER can branch to */
2101 target_bb = bblocks [bb->block_num].call_handler_target_bb;
2103 LLVMBuildBr (builder, target_bb);
2105 ctx->builder = builder = create_builder (ctx);
2106 LLVMPositionBuilderAtEnd (ctx->builder, target_bb);
2108 ctx->bblocks [bb->block_num].end_bblock = target_bb;
2112 has_terminator = FALSE;
2113 for (ins = bb->code; ins; ins = ins->next) {
2114 const char *spec = LLVM_INS_INFO (ins->opcode);
2116 char dname_buf [128];
2119 /* There could be instructions after a terminator, skip them */
2122 if (spec [MONO_INST_DEST] != ' ' && !MONO_IS_STORE_MEMBASE (ins)) {
2123 sprintf (dname_buf, "t%d", ins->dreg);
2127 if (spec [MONO_INST_SRC1] != ' ' && spec [MONO_INST_SRC1] != 'v') {
2128 MonoInst *var = get_vreg_to_inst (cfg, ins->sreg1);
2130 if (var && var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT)) {
2131 lhs = emit_volatile_load (ctx, ins->sreg1);
2133 /* It is ok for SETRET to have an uninitialized argument */
2134 if (!values [ins->sreg1] && ins->opcode != OP_SETRET)
2135 LLVM_FAILURE (ctx, "sreg1");
2136 lhs = values [ins->sreg1];
2142 if (spec [MONO_INST_SRC2] != ' ' && spec [MONO_INST_SRC2] != ' ') {
2143 MonoInst *var = get_vreg_to_inst (cfg, ins->sreg2);
2144 if (var && var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT)) {
2145 rhs = emit_volatile_load (ctx, ins->sreg2);
2147 if (!values [ins->sreg2])
2148 LLVM_FAILURE (ctx, "sreg2");
2149 rhs = values [ins->sreg2];
2155 //mono_print_ins (ins);
2156 switch (ins->opcode) {
2159 case OP_LIVERANGE_START:
2160 case OP_LIVERANGE_END:
2163 values [ins->dreg] = LLVMConstInt (LLVMInt32Type (), ins->inst_c0, FALSE);
2166 #if SIZEOF_VOID_P == 4
2167 values [ins->dreg] = LLVMConstInt (LLVMInt64Type (), GET_LONG_IMM (ins), FALSE);
2169 values [ins->dreg] = LLVMConstInt (LLVMInt64Type (), (gint64)ins->inst_c0, FALSE);
2173 values [ins->dreg] = LLVMConstReal (LLVMDoubleType (), *(double*)ins->inst_p0);
2176 values [ins->dreg] = LLVMConstFPExt (LLVMConstReal (LLVMFloatType (), *(float*)ins->inst_p0), LLVMDoubleType ());
2179 LLVMBuildBr (builder, get_bb (ctx, ins->inst_target_bb));
2180 has_terminator = TRUE;
2186 LLVMBasicBlockRef new_bb;
2187 LLVMBuilderRef new_builder;
2189 // The default branch is already handled
2190 // FIXME: Handle it here
2192 /* Start new bblock */
2193 sprintf (bb_name, "SWITCH_DEFAULT_BB%d", ctx->default_index ++);
2194 new_bb = LLVMAppendBasicBlock (ctx->lmethod, bb_name);
2196 lhs = convert (ctx, lhs, LLVMInt32Type ());
2197 v = LLVMBuildSwitch (builder, lhs, new_bb, GPOINTER_TO_UINT (ins->klass));
2198 for (i = 0; i < GPOINTER_TO_UINT (ins->klass); ++i) {
2199 MonoBasicBlock *target_bb = ins->inst_many_bb [i];
2201 LLVMAddCase (v, LLVMConstInt (LLVMInt32Type (), i, FALSE), get_bb (ctx, target_bb));
2204 new_builder = create_builder (ctx);
2205 LLVMPositionBuilderAtEnd (new_builder, new_bb);
2206 LLVMBuildUnreachable (new_builder);
2208 has_terminator = TRUE;
2209 g_assert (!ins->next);
2215 if (linfo->ret.storage == LLVMArgVtypeInReg) {
2216 LLVMTypeRef ret_type = LLVMGetReturnType (LLVMGetElementType (LLVMTypeOf (method)));
2217 LLVMValueRef part1, retval;
2220 size = get_vtype_size (sig->ret);
2222 g_assert (addresses [ins->sreg1]);
2224 g_assert (linfo->ret.pair_storage [0] == LLVMArgInIReg);
2225 g_assert (linfo->ret.pair_storage [1] == LLVMArgNone);
2227 part1 = convert (ctx, LLVMBuildLoad (builder, LLVMBuildBitCast (builder, addresses [ins->sreg1], LLVMPointerType (LLVMIntType (size * 8), 0), ""), ""), IntPtrType ());
2229 retval = LLVMBuildInsertValue (builder, LLVMGetUndef (ret_type), part1, 0, "");
2231 LLVMBuildRet (builder, retval);
2235 if (linfo->ret.storage == LLVMArgVtypeRetAddr) {
2236 LLVMBuildRetVoid (builder);
2240 if (!lhs || ctx->is_dead [ins->sreg1]) {
2242 * The method did not set its return value, probably because it
2243 * ends with a throw.
2246 LLVMBuildRetVoid (builder);
2248 LLVMBuildRet (builder, LLVMConstNull (type_to_llvm_type (ctx, sig->ret)));
2250 LLVMBuildRet (builder, convert (ctx, lhs, type_to_llvm_type (ctx, sig->ret)));
2252 has_terminator = TRUE;
2258 case OP_ICOMPARE_IMM:
2259 case OP_LCOMPARE_IMM:
2260 case OP_COMPARE_IMM: {
2264 if (ins->next->opcode == OP_NOP)
2267 if (ins->next->opcode == OP_BR)
2268 /* The comparison result is not needed */
2271 rel = mono_opcode_to_cond (ins->next->opcode);
2273 if (ins->opcode == OP_ICOMPARE_IMM) {
2274 lhs = convert (ctx, lhs, LLVMInt32Type ());
2275 rhs = LLVMConstInt (LLVMInt32Type (), ins->inst_imm, FALSE);
2277 if (ins->opcode == OP_LCOMPARE_IMM) {
2278 lhs = convert (ctx, lhs, LLVMInt64Type ());
2279 rhs = LLVMConstInt (LLVMInt64Type (), GET_LONG_IMM (ins), FALSE);
2281 if (ins->opcode == OP_LCOMPARE) {
2282 lhs = convert (ctx, lhs, LLVMInt64Type ());
2283 rhs = convert (ctx, rhs, LLVMInt64Type ());
2285 if (ins->opcode == OP_ICOMPARE) {
2286 lhs = convert (ctx, lhs, LLVMInt32Type ());
2287 rhs = convert (ctx, rhs, LLVMInt32Type ());
2291 if (LLVMGetTypeKind (LLVMTypeOf (lhs)) == LLVMPointerTypeKind)
2292 rhs = convert (ctx, rhs, LLVMTypeOf (lhs));
2293 else if (LLVMGetTypeKind (LLVMTypeOf (rhs)) == LLVMPointerTypeKind)
2294 lhs = convert (ctx, lhs, LLVMTypeOf (rhs));
2297 /* We use COMPARE+SETcc/Bcc, llvm uses SETcc+br cond */
2298 if (ins->opcode == OP_FCOMPARE)
2299 cmp = LLVMBuildFCmp (builder, fpcond_to_llvm_cond [rel], convert (ctx, lhs, LLVMDoubleType ()), convert (ctx, rhs, LLVMDoubleType ()), "");
2300 else if (ins->opcode == OP_COMPARE_IMM)
2301 cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], convert (ctx, lhs, IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_imm, FALSE), "");
2302 else if (ins->opcode == OP_COMPARE)
2303 cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], convert (ctx, lhs, IntPtrType ()), convert (ctx, rhs, IntPtrType ()), "");
2305 cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], lhs, rhs, "");
2307 if (MONO_IS_COND_BRANCH_OP (ins->next)) {
2308 LLVMBuildCondBr (builder, cmp, get_bb (ctx, ins->next->inst_true_bb), get_bb (ctx, ins->next->inst_false_bb));
2309 has_terminator = TRUE;
2310 } else if (MONO_IS_SETCC (ins->next)) {
2311 sprintf (dname_buf, "t%d", ins->next->dreg);
2313 values [ins->next->dreg] = LLVMBuildZExt (builder, cmp, LLVMInt32Type (), dname);
2315 /* Add stores for volatile variables */
2316 emit_volatile_store (ctx, ins->next->dreg);
2317 } else if (MONO_IS_COND_EXC (ins->next)) {
2318 emit_cond_system_exception (ctx, bb, ins->next->inst_p1, cmp);
2319 CHECK_FAILURE (ctx);
2320 builder = ctx->builder;
2322 LLVM_FAILURE (ctx, "next");
2336 rel = mono_opcode_to_cond (ins->opcode);
2338 cmp = LLVMBuildFCmp (builder, fpcond_to_llvm_cond [rel], convert (ctx, lhs, LLVMDoubleType ()), convert (ctx, rhs, LLVMDoubleType ()), "");
2339 values [ins->dreg] = LLVMBuildZExt (builder, cmp, LLVMInt32Type (), dname);
2347 gboolean empty = TRUE;
2349 /* Check that all input bblocks really branch to us */
2350 for (i = 0; i < bb->in_count; ++i) {
2351 if (bb->in_bb [i]->last_ins && bb->in_bb [i]->last_ins->opcode == OP_NOT_REACHED)
2352 ins->inst_phi_args [i + 1] = -1;
2358 /* LLVM doesn't like phi instructions with zero operands */
2359 ctx->is_dead [ins->dreg] = TRUE;
2363 /* Created earlier, insert it now */
2364 LLVMInsertIntoBuilder (builder, values [ins->dreg]);
2366 for (i = 0; i < ins->inst_phi_args [0]; i++) {
2367 int sreg1 = ins->inst_phi_args [i + 1];
2371 * Count the number of times the incoming bblock branches to us,
2372 * since llvm requires a separate entry for each.
2374 if (bb->in_bb [i]->last_ins && bb->in_bb [i]->last_ins->opcode == OP_SWITCH) {
2375 MonoInst *switch_ins = bb->in_bb [i]->last_ins;
2378 for (j = 0; j < GPOINTER_TO_UINT (switch_ins->klass); ++j) {
2379 if (switch_ins->inst_many_bb [j] == bb)
2386 /* Remember for later */
2387 for (j = 0; j < count; ++j) {
2388 PhiNode *node = mono_mempool_alloc0 (ctx->mempool, sizeof (PhiNode));
2391 node->in_bb = bb->in_bb [i];
2393 bblocks [bb->in_bb [i]->block_num].phi_nodes = g_slist_prepend_mempool (ctx->mempool, bblocks [bb->in_bb [i]->block_num].phi_nodes, node);
2402 values [ins->dreg] = lhs;
2405 MonoInst *var = get_vreg_to_inst (cfg, ins->dreg);
2408 values [ins->dreg] = lhs;
2410 if (var && var->klass->byval_arg.type == MONO_TYPE_R4) {
2412 * This is added by the spilling pass in case of the JIT,
2413 * but we have to do it ourselves.
2415 values [ins->dreg] = convert (ctx, values [ins->dreg], LLVMFloatType ());
2449 lhs = convert (ctx, lhs, regtype_to_llvm_type (spec [MONO_INST_DEST]));
2450 rhs = convert (ctx, rhs, regtype_to_llvm_type (spec [MONO_INST_DEST]));
2452 switch (ins->opcode) {
2455 values [ins->dreg] = LLVMBuildAdd (builder, lhs, rhs, dname);
2459 values [ins->dreg] = LLVMBuildSub (builder, lhs, rhs, dname);
2463 values [ins->dreg] = LLVMBuildMul (builder, lhs, rhs, dname);
2467 values [ins->dreg] = LLVMBuildSRem (builder, lhs, rhs, dname);
2471 values [ins->dreg] = LLVMBuildURem (builder, lhs, rhs, dname);
2475 values [ins->dreg] = LLVMBuildSDiv (builder, lhs, rhs, dname);
2479 values [ins->dreg] = LLVMBuildUDiv (builder, lhs, rhs, dname);
2482 values [ins->dreg] = LLVMBuildFDiv (builder, lhs, rhs, dname);
2486 values [ins->dreg] = LLVMBuildAnd (builder, lhs, rhs, dname);
2490 values [ins->dreg] = LLVMBuildOr (builder, lhs, rhs, dname);
2494 values [ins->dreg] = LLVMBuildXor (builder, lhs, rhs, dname);
2498 values [ins->dreg] = LLVMBuildShl (builder, lhs, rhs, dname);
2502 values [ins->dreg] = LLVMBuildAShr (builder, lhs, rhs, dname);
2506 values [ins->dreg] = LLVMBuildLShr (builder, lhs, rhs, dname);
2510 values [ins->dreg] = LLVMBuildFAdd (builder, lhs, rhs, dname);
2513 values [ins->dreg] = LLVMBuildFSub (builder, lhs, rhs, dname);
2516 values [ins->dreg] = LLVMBuildFMul (builder, lhs, rhs, dname);
2520 g_assert_not_reached ();
2527 case OP_IREM_UN_IMM:
2529 case OP_IDIV_UN_IMM:
2535 case OP_ISHR_UN_IMM:
2544 case OP_LSHR_UN_IMM:
2552 if (spec [MONO_INST_SRC1] == 'l') {
2553 imm = LLVMConstInt (LLVMInt64Type (), GET_LONG_IMM (ins), FALSE);
2555 imm = LLVMConstInt (LLVMInt32Type (), ins->inst_imm, FALSE);
2558 #if SIZEOF_VOID_P == 4
2559 if (ins->opcode == OP_LSHL_IMM || ins->opcode == OP_LSHR_IMM || ins->opcode == OP_LSHR_UN_IMM)
2560 imm = LLVMConstInt (LLVMInt32Type (), ins->inst_imm, FALSE);
2563 if (LLVMGetTypeKind (LLVMTypeOf (lhs)) == LLVMPointerTypeKind)
2564 lhs = convert (ctx, lhs, IntPtrType ());
2565 imm = convert (ctx, imm, LLVMTypeOf (lhs));
2566 switch (ins->opcode) {
2570 values [ins->dreg] = LLVMBuildAdd (builder, lhs, imm, dname);
2574 values [ins->dreg] = LLVMBuildSub (builder, lhs, imm, dname);
2578 values [ins->dreg] = LLVMBuildMul (builder, lhs, imm, dname);
2582 values [ins->dreg] = LLVMBuildSDiv (builder, lhs, imm, dname);
2584 case OP_IDIV_UN_IMM:
2585 case OP_LDIV_UN_IMM:
2586 values [ins->dreg] = LLVMBuildUDiv (builder, lhs, imm, dname);
2590 values [ins->dreg] = LLVMBuildSRem (builder, lhs, imm, dname);
2592 case OP_IREM_UN_IMM:
2593 values [ins->dreg] = LLVMBuildURem (builder, lhs, imm, dname);
2598 values [ins->dreg] = LLVMBuildAnd (builder, lhs, imm, dname);
2602 values [ins->dreg] = LLVMBuildOr (builder, lhs, imm, dname);
2606 values [ins->dreg] = LLVMBuildXor (builder, lhs, imm, dname);
2611 values [ins->dreg] = LLVMBuildShl (builder, lhs, imm, dname);
2616 values [ins->dreg] = LLVMBuildAShr (builder, lhs, imm, dname);
2618 case OP_ISHR_UN_IMM:
2619 /* This is used to implement conv.u4, so the lhs could be an i8 */
2620 lhs = convert (ctx, lhs, LLVMInt32Type ());
2621 imm = convert (ctx, imm, LLVMInt32Type ());
2622 values [ins->dreg] = LLVMBuildLShr (builder, lhs, imm, dname);
2624 case OP_LSHR_UN_IMM:
2625 values [ins->dreg] = LLVMBuildLShr (builder, lhs, imm, dname);
2628 g_assert_not_reached ();
2633 values [ins->dreg] = LLVMBuildSub (builder, LLVMConstInt (LLVMInt32Type (), 0, FALSE), convert (ctx, lhs, LLVMInt32Type ()), dname);
2636 values [ins->dreg] = LLVMBuildSub (builder, LLVMConstInt (LLVMInt64Type (), 0, FALSE), lhs, dname);
2639 lhs = convert (ctx, lhs, LLVMDoubleType ());
2640 values [ins->dreg] = LLVMBuildFSub (builder, LLVMConstReal (LLVMDoubleType (), 0.0), lhs, dname);
2643 guint32 v = 0xffffffff;
2644 values [ins->dreg] = LLVMBuildXor (builder, LLVMConstInt (LLVMInt32Type (), v, FALSE), lhs, dname);
2648 guint64 v = 0xffffffffffffffffLL;
2649 values [ins->dreg] = LLVMBuildXor (builder, LLVMConstInt (LLVMInt64Type (), v, FALSE), lhs, dname);
2652 #if defined(TARGET_X86) || defined(TARGET_AMD64)
2654 LLVMValueRef v1, v2;
2656 v1 = LLVMBuildMul (builder, convert (ctx, rhs, IntPtrType ()), LLVMConstInt (IntPtrType (), (1 << ins->backend.shift_amount), FALSE), "");
2657 v2 = LLVMBuildAdd (builder, convert (ctx, lhs, IntPtrType ()), v1, "");
2658 values [ins->dreg] = LLVMBuildAdd (builder, v2, LLVMConstInt (IntPtrType (), ins->inst_imm, FALSE), dname);
2663 case OP_ICONV_TO_I1:
2664 case OP_ICONV_TO_I2:
2665 case OP_ICONV_TO_I4:
2666 case OP_ICONV_TO_U1:
2667 case OP_ICONV_TO_U2:
2668 case OP_ICONV_TO_U4:
2669 case OP_LCONV_TO_I1:
2670 case OP_LCONV_TO_I2:
2671 case OP_LCONV_TO_U1:
2672 case OP_LCONV_TO_U2:
2673 case OP_LCONV_TO_U4: {
2676 sign = (ins->opcode == OP_ICONV_TO_I1) || (ins->opcode == OP_ICONV_TO_I2) || (ins->opcode == OP_ICONV_TO_I4) || (ins->opcode == OP_LCONV_TO_I1) || (ins->opcode == OP_LCONV_TO_I2);
2678 /* Have to do two casts since our vregs have type int */
2679 v = LLVMBuildTrunc (builder, lhs, op_to_llvm_type (ins->opcode), "");
2681 values [ins->dreg] = LLVMBuildSExt (builder, v, LLVMInt32Type (), dname);
2683 values [ins->dreg] = LLVMBuildZExt (builder, v, LLVMInt32Type (), dname);
2686 case OP_ICONV_TO_I8:
2687 values [ins->dreg] = LLVMBuildSExt (builder, lhs, LLVMInt64Type (), dname);
2689 case OP_ICONV_TO_U8:
2690 values [ins->dreg] = LLVMBuildZExt (builder, lhs, LLVMInt64Type (), dname);
2692 case OP_FCONV_TO_I4:
2693 values [ins->dreg] = LLVMBuildFPToSI (builder, lhs, LLVMInt32Type (), dname);
2695 case OP_FCONV_TO_I1:
2696 values [ins->dreg] = LLVMBuildSExt (builder, LLVMBuildFPToSI (builder, lhs, LLVMInt8Type (), dname), LLVMInt32Type (), "");
2698 case OP_FCONV_TO_U1:
2699 values [ins->dreg] = LLVMBuildZExt (builder, LLVMBuildFPToUI (builder, lhs, LLVMInt8Type (), dname), LLVMInt32Type (), "");
2701 case OP_FCONV_TO_I2:
2702 values [ins->dreg] = LLVMBuildSExt (builder, LLVMBuildFPToSI (builder, lhs, LLVMInt16Type (), dname), LLVMInt32Type (), "");
2704 case OP_FCONV_TO_U2:
2705 values [ins->dreg] = LLVMBuildZExt (builder, LLVMBuildFPToUI (builder, lhs, LLVMInt16Type (), dname), LLVMInt32Type (), "");
2707 case OP_FCONV_TO_I8:
2708 values [ins->dreg] = LLVMBuildFPToSI (builder, lhs, LLVMInt64Type (), dname);
2711 values [ins->dreg] = LLVMBuildFPToSI (builder, lhs, IntPtrType (), dname);
2713 case OP_ICONV_TO_R8:
2714 case OP_LCONV_TO_R8:
2715 values [ins->dreg] = LLVMBuildSIToFP (builder, lhs, LLVMDoubleType (), dname);
2717 case OP_LCONV_TO_R_UN:
2718 values [ins->dreg] = LLVMBuildUIToFP (builder, lhs, LLVMDoubleType (), dname);
2720 #if SIZEOF_VOID_P == 4
2723 case OP_LCONV_TO_I4:
2724 values [ins->dreg] = LLVMBuildTrunc (builder, lhs, LLVMInt32Type (), dname);
2726 case OP_ICONV_TO_R4:
2727 case OP_LCONV_TO_R4:
2728 v = LLVMBuildSIToFP (builder, lhs, LLVMFloatType (), "");
2729 values [ins->dreg] = LLVMBuildFPExt (builder, v, LLVMDoubleType (), dname);
2731 case OP_FCONV_TO_R4:
2732 v = LLVMBuildFPTrunc (builder, lhs, LLVMFloatType (), "");
2733 values [ins->dreg] = LLVMBuildFPExt (builder, v, LLVMDoubleType (), dname);
2736 values [ins->dreg] = LLVMBuildSExt (builder, lhs, LLVMInt64Type (), dname);
2739 values [ins->dreg] = LLVMBuildZExt (builder, lhs, LLVMInt64Type (), dname);
2742 values [ins->dreg] = LLVMBuildTrunc (builder, lhs, LLVMInt32Type (), dname);
2744 case OP_LOCALLOC_IMM: {
2747 guint32 size = ins->inst_imm;
2748 size = (size + (MONO_ARCH_FRAME_ALIGNMENT - 1)) & ~ (MONO_ARCH_FRAME_ALIGNMENT - 1);
2750 v = mono_llvm_build_alloca (builder, LLVMInt8Type (), LLVMConstInt (LLVMInt32Type (), size, FALSE), MONO_ARCH_FRAME_ALIGNMENT, "");
2752 if (ins->flags & MONO_INST_INIT) {
2753 LLVMValueRef args [5];
2756 args [1] = LLVMConstInt (LLVMInt8Type (), 0, FALSE);
2757 args [2] = LLVMConstInt (LLVMInt32Type (), size, FALSE);
2758 args [3] = LLVMConstInt (LLVMInt32Type (), MONO_ARCH_FRAME_ALIGNMENT, FALSE);
2759 args [4] = LLVMConstInt (LLVMInt1Type (), 0, FALSE);
2760 LLVMBuildCall (builder, LLVMGetNamedFunction (module, memset_func_name), args, memset_param_count, "");
2763 values [ins->dreg] = v;
2767 LLVMValueRef v, size;
2769 size = LLVMBuildAnd (builder, LLVMBuildAdd (builder, lhs, LLVMConstInt (LLVMInt32Type (), MONO_ARCH_FRAME_ALIGNMENT - 1, FALSE), ""), LLVMConstInt (LLVMInt32Type (), ~ (MONO_ARCH_FRAME_ALIGNMENT - 1), FALSE), "");
2771 v = mono_llvm_build_alloca (builder, LLVMInt8Type (), size, MONO_ARCH_FRAME_ALIGNMENT, "");
2773 if (ins->flags & MONO_INST_INIT) {
2774 LLVMValueRef args [5];
2777 args [1] = LLVMConstInt (LLVMInt8Type (), 0, FALSE);
2779 args [3] = LLVMConstInt (LLVMInt32Type (), MONO_ARCH_FRAME_ALIGNMENT, FALSE);
2780 args [4] = LLVMConstInt (LLVMInt1Type (), 0, FALSE);
2781 LLVMBuildCall (builder, LLVMGetNamedFunction (module, memset_func_name), args, memset_param_count, "");
2783 values [ins->dreg] = v;
2787 case OP_LOADI1_MEMBASE:
2788 case OP_LOADU1_MEMBASE:
2789 case OP_LOADI2_MEMBASE:
2790 case OP_LOADU2_MEMBASE:
2791 case OP_LOADI4_MEMBASE:
2792 case OP_LOADU4_MEMBASE:
2793 case OP_LOADI8_MEMBASE:
2794 case OP_LOADR4_MEMBASE:
2795 case OP_LOADR8_MEMBASE:
2796 case OP_LOAD_MEMBASE:
2804 LLVMValueRef index, addr;
2806 gboolean sext = FALSE, zext = FALSE;
2807 gboolean is_volatile = (ins->flags & MONO_INST_FAULT);
2809 t = load_store_to_llvm_type (ins->opcode, &size, &sext, &zext);
2814 if ((ins->opcode == OP_LOADI8_MEM) || (ins->opcode == OP_LOAD_MEM) || (ins->opcode == OP_LOADI4_MEM) || (ins->opcode == OP_LOADU4_MEM) || (ins->opcode == OP_LOADU1_MEM) || (ins->opcode == OP_LOADU2_MEM)) {
2815 addr = LLVMConstInt (IntPtrType (), ins->inst_imm, FALSE);
2816 } else if (ins->inst_offset == 0) {
2817 addr = values [ins->inst_basereg];
2818 } else if (ins->inst_offset % size != 0) {
2819 /* Unaligned load */
2820 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset, FALSE);
2821 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_basereg], LLVMPointerType (LLVMInt8Type (), 0)), &index, 1, "");
2823 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);
2824 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_basereg], LLVMPointerType (t, 0)), &index, 1, "");
2827 addr = convert (ctx, addr, LLVMPointerType (t, 0));
2829 values [ins->dreg] = emit_load (ctx, bb, &builder, size, addr, dname, is_volatile);
2831 if (!is_volatile && (ins->flags & MONO_INST_CONSTANT_LOAD)) {
2833 * These will signal LLVM that these loads do not alias any stores, and
2834 * they can't fail, allowing them to be hoisted out of loops.
2836 set_metadata_flag (values [ins->dreg], "mono.noalias");
2837 set_metadata_flag (values [ins->dreg], "mono.nofail.load");
2841 values [ins->dreg] = LLVMBuildSExt (builder, values [ins->dreg], LLVMInt32Type (), dname);
2843 values [ins->dreg] = LLVMBuildZExt (builder, values [ins->dreg], LLVMInt32Type (), dname);
2844 else if (ins->opcode == OP_LOADR4_MEMBASE)
2845 values [ins->dreg] = LLVMBuildFPExt (builder, values [ins->dreg], LLVMDoubleType (), dname);
2849 case OP_STOREI1_MEMBASE_REG:
2850 case OP_STOREI2_MEMBASE_REG:
2851 case OP_STOREI4_MEMBASE_REG:
2852 case OP_STOREI8_MEMBASE_REG:
2853 case OP_STORER4_MEMBASE_REG:
2854 case OP_STORER8_MEMBASE_REG:
2855 case OP_STORE_MEMBASE_REG: {
2857 LLVMValueRef index, addr;
2859 gboolean sext = FALSE, zext = FALSE;
2860 gboolean is_volatile = (ins->flags & MONO_INST_FAULT);
2862 if (!values [ins->inst_destbasereg])
2863 LLVM_FAILURE (ctx, "inst_destbasereg");
2865 t = load_store_to_llvm_type (ins->opcode, &size, &sext, &zext);
2867 if (ins->inst_offset % size != 0) {
2868 /* Unaligned store */
2869 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset, FALSE);
2870 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_destbasereg], LLVMPointerType (LLVMInt8Type (), 0)), &index, 1, "");
2872 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);
2873 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_destbasereg], LLVMPointerType (t, 0)), &index, 1, "");
2875 emit_store (ctx, bb, &builder, size, convert (ctx, values [ins->sreg1], t), convert (ctx, addr, LLVMPointerType (t, 0)), is_volatile);
2879 case OP_STOREI1_MEMBASE_IMM:
2880 case OP_STOREI2_MEMBASE_IMM:
2881 case OP_STOREI4_MEMBASE_IMM:
2882 case OP_STOREI8_MEMBASE_IMM:
2883 case OP_STORE_MEMBASE_IMM: {
2885 LLVMValueRef index, addr;
2887 gboolean sext = FALSE, zext = FALSE;
2888 gboolean is_volatile = (ins->flags & MONO_INST_FAULT);
2890 t = load_store_to_llvm_type (ins->opcode, &size, &sext, &zext);
2892 if (ins->inst_offset % size != 0) {
2893 /* Unaligned store */
2894 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset, FALSE);
2895 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_destbasereg], LLVMPointerType (LLVMInt8Type (), 0)), &index, 1, "");
2897 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);
2898 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_destbasereg], LLVMPointerType (t, 0)), &index, 1, "");
2900 emit_store (ctx, bb, &builder, size, convert (ctx, LLVMConstInt (IntPtrType (), ins->inst_imm, FALSE), t), addr, is_volatile);
2905 emit_load (ctx, bb, &builder, sizeof (gpointer), convert (ctx, values [ins->sreg1], LLVMPointerType (IntPtrType (), 0)), "", TRUE);
2907 case OP_OUTARG_VTRETADDR:
2914 case OP_VOIDCALL_MEMBASE:
2915 case OP_CALL_MEMBASE:
2916 case OP_LCALL_MEMBASE:
2917 case OP_FCALL_MEMBASE:
2918 case OP_VCALL_MEMBASE:
2919 case OP_VOIDCALL_REG:
2923 case OP_VCALL_REG: {
2924 process_call (ctx, bb, &builder, ins);
2925 CHECK_FAILURE (ctx);
2930 LLVMValueRef indexes [2];
2932 LLVMValueRef got_entry_addr;
2935 * FIXME: Can't allocate from the cfg mempool since that is freed if
2936 * the LLVM compile fails.
2938 ji = g_new0 (MonoJumpInfo, 1);
2939 ji->type = (MonoJumpInfoType)ins->inst_i1;
2940 ji->data.target = ins->inst_p0;
2942 ji = mono_aot_patch_info_dup (ji);
2944 ji->next = cfg->patch_info;
2945 cfg->patch_info = ji;
2947 //mono_add_patch_info (cfg, 0, (MonoJumpInfoType)ins->inst_i1, ins->inst_p0);
2948 got_offset = mono_aot_get_got_offset (cfg->patch_info);
2950 indexes [0] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
2951 indexes [1] = LLVMConstInt (LLVMInt32Type (), (gssize)got_offset, FALSE);
2952 got_entry_addr = LLVMBuildGEP (builder, ctx->lmodule->got_var, indexes, 2, "");
2954 // FIXME: This doesn't work right now, because it must be
2955 // paired with an invariant.end, and even then, its only in effect
2956 // inside its basic block
2959 LLVMValueRef args [3];
2960 LLVMValueRef ptr, val;
2962 ptr = LLVMBuildBitCast (builder, got_entry_addr, LLVMPointerType (LLVMInt8Type (), 0), "ptr");
2964 args [0] = LLVMConstInt (LLVMInt64Type (), sizeof (gpointer), FALSE);
2966 val = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.invariant.start"), args, 2, "");
2970 values [ins->dreg] = LLVMBuildLoad (builder, got_entry_addr, dname);
2973 case OP_NOT_REACHED:
2974 LLVMBuildUnreachable (builder);
2975 has_terminator = TRUE;
2976 g_assert (bb->block_num < cfg->max_block_num);
2977 ctx->unreachable [bb->block_num] = TRUE;
2978 /* Might have instructions after this */
2980 MonoInst *next = ins->next;
2982 * FIXME: If later code uses the regs defined by these instructions,
2983 * compilation will fail.
2985 MONO_DELETE_INS (bb, next);
2989 MonoInst *var = ins->inst_p0;
2991 values [ins->dreg] = addresses [var->dreg];
2995 LLVMValueRef args [1];
2997 args [0] = convert (ctx, lhs, LLVMDoubleType ());
2998 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.sin.f64"), args, 1, dname);
3002 LLVMValueRef args [1];
3004 args [0] = convert (ctx, lhs, LLVMDoubleType ());
3005 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.cos.f64"), args, 1, dname);
3009 LLVMValueRef args [1];
3012 * LLVM optimizes sqrt(nan) into undefined in
3013 * lib/Analysis/ConstantFolding.cpp
3014 * Also, sqrt(NegativeInfinity) is optimized into 0.
3016 LLVM_FAILURE (ctx, "sqrt");
3018 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.sqrt.f64"), args, 1, dname);
3022 LLVMValueRef args [1];
3025 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "fabs"), args, 1, dname);
3039 lhs = convert (ctx, lhs, regtype_to_llvm_type (spec [MONO_INST_DEST]));
3040 rhs = convert (ctx, rhs, regtype_to_llvm_type (spec [MONO_INST_DEST]));
3042 switch (ins->opcode) {
3045 v = LLVMBuildICmp (builder, LLVMIntSLE, lhs, rhs, "");
3049 v = LLVMBuildICmp (builder, LLVMIntSGE, lhs, rhs, "");
3053 v = LLVMBuildICmp (builder, LLVMIntULE, lhs, rhs, "");
3057 v = LLVMBuildICmp (builder, LLVMIntUGE, lhs, rhs, "");
3060 g_assert_not_reached ();
3063 values [ins->dreg] = LLVMBuildSelect (builder, v, lhs, rhs, dname);
3066 case OP_ATOMIC_EXCHANGE_I4: {
3067 LLVMValueRef args [2];
3069 g_assert (ins->inst_offset == 0);
3071 args [0] = convert (ctx, lhs, LLVMPointerType (LLVMInt32Type (), 0));
3073 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.atomic.swap.i32.p0i32"), args, 2, dname);
3076 case OP_ATOMIC_EXCHANGE_I8: {
3077 LLVMValueRef args [2];
3079 g_assert (ins->inst_offset == 0);
3081 args [0] = convert (ctx, lhs, LLVMPointerType (LLVMInt64Type (), 0));
3082 args [1] = convert (ctx, rhs, LLVMInt64Type ());
3083 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.atomic.swap.i64.p0i64"), args, 2, dname);
3086 case OP_ATOMIC_ADD_NEW_I4: {
3087 LLVMValueRef args [2];
3089 g_assert (ins->inst_offset == 0);
3091 args [0] = convert (ctx, lhs, LLVMPointerType (LLVMInt32Type (), 0));
3093 values [ins->dreg] = LLVMBuildAdd (builder, LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.atomic.load.add.i32.p0i32"), args, 2, ""), args [1], dname);
3096 case OP_ATOMIC_ADD_NEW_I8: {
3097 LLVMValueRef args [2];
3099 g_assert (ins->inst_offset == 0);
3101 args [0] = convert (ctx, lhs, LLVMPointerType (LLVMInt64Type (), 0));
3102 args [1] = convert (ctx, rhs, LLVMInt64Type ());
3103 values [ins->dreg] = LLVMBuildAdd (builder, LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.atomic.load.add.i64.p0i64"), args, 2, ""), args [1], dname);
3106 case OP_ATOMIC_CAS_I4:
3107 case OP_ATOMIC_CAS_I8: {
3108 LLVMValueRef args [3];
3110 const char *intrins;
3112 if (ins->opcode == OP_ATOMIC_CAS_I4) {
3113 t = LLVMInt32Type ();
3114 intrins = "llvm.atomic.cmp.swap.i32.p0i32";
3116 t = LLVMInt64Type ();
3117 intrins = "llvm.atomic.cmp.swap.i64.p0i64";
3120 args [0] = convert (ctx, lhs, LLVMPointerType (t, 0));
3122 args [1] = convert (ctx, values [ins->sreg3], t);
3124 args [2] = convert (ctx, values [ins->sreg2], t);
3125 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, intrins), args, 3, dname);
3128 case OP_MEMORY_BARRIER: {
3129 LLVMValueRef args [5];
3132 /* Not yet supported by llc on arm */
3133 LLVM_FAILURE (ctx, "memory-barrier+arm");
3136 for (i = 0; i < 5; ++i)
3137 args [i] = LLVMConstInt (LLVMInt1Type (), TRUE, TRUE);
3139 LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.memory.barrier"), args, 5, "");
3142 case OP_RELAXED_NOP: {
3143 #if defined(TARGET_AMD64) || defined(TARGET_X86)
3144 /* No way to get LLVM to emit this */
3145 LLVM_FAILURE (ctx, "relaxed_nop");
3151 #if defined(TARGET_AMD64) || defined(TARGET_X86)
3153 // 257 == FS segment register
3154 LLVMTypeRef ptrtype = LLVMPointerType (IntPtrType (), 257);
3156 // 256 == GS segment register
3157 LLVMTypeRef ptrtype = LLVMPointerType (IntPtrType (), 256);
3161 values [ins->dreg] = LLVMBuildLoad (builder, LLVMBuildIntToPtr (builder, LLVMConstInt (IntPtrType (), ins->inst_offset, TRUE), ptrtype, ""), "");
3163 LLVM_FAILURE (ctx, "opcode tls-get");
3173 case OP_IADD_OVF_UN:
3175 case OP_ISUB_OVF_UN:
3177 case OP_IMUL_OVF_UN:
3178 #if SIZEOF_VOID_P == 8
3180 case OP_LADD_OVF_UN:
3182 case OP_LSUB_OVF_UN:
3184 case OP_LMUL_OVF_UN:
3187 LLVMValueRef args [2], val, ovf, func;
3189 args [0] = convert (ctx, lhs, op_to_llvm_type (ins->opcode));
3190 args [1] = convert (ctx, rhs, op_to_llvm_type (ins->opcode));
3191 func = LLVMGetNamedFunction (module, ovf_op_to_intrins (ins->opcode));
3193 val = LLVMBuildCall (builder, func, args, 2, "");
3194 values [ins->dreg] = LLVMBuildExtractValue (builder, val, 0, dname);
3195 ovf = LLVMBuildExtractValue (builder, val, 1, "");
3196 emit_cond_system_exception (ctx, bb, "OverflowException", ovf);
3197 CHECK_FAILURE (ctx);
3198 builder = ctx->builder;
3204 * We currently model them using arrays. Promotion to local vregs is
3205 * disabled for them in mono_handle_global_vregs () in the LLVM case,
3206 * so we always have an entry in cfg->varinfo for them.
3207 * FIXME: Is this needed ?
3210 MonoClass *klass = ins->klass;
3211 LLVMValueRef args [5];
3215 LLVM_FAILURE (ctx, "!klass");
3219 if (!addresses [ins->dreg])
3220 addresses [ins->dreg] = build_alloca (ctx, &klass->byval_arg);
3221 args [0] = LLVMBuildBitCast (builder, addresses [ins->dreg], LLVMPointerType (LLVMInt8Type (), 0), "");
3222 args [1] = LLVMConstInt (LLVMInt8Type (), 0, FALSE);
3223 args [2] = LLVMConstInt (LLVMInt32Type (), mono_class_value_size (klass, NULL), FALSE);
3225 args [3] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
3226 args [4] = LLVMConstInt (LLVMInt1Type (), 0, FALSE);
3227 LLVMBuildCall (builder, LLVMGetNamedFunction (module, memset_func_name), args, memset_param_count, "");
3231 case OP_STOREV_MEMBASE:
3232 case OP_LOADV_MEMBASE:
3234 MonoClass *klass = ins->klass;
3235 LLVMValueRef src, dst, args [5];
3236 gboolean done = FALSE;
3240 LLVM_FAILURE (ctx, "!klass");
3244 switch (ins->opcode) {
3245 case OP_STOREV_MEMBASE:
3246 if (!addresses [ins->sreg1]) {
3248 g_assert (values [ins->sreg1]);
3249 dst = convert (ctx, LLVMBuildAdd (builder, convert (ctx, values [ins->inst_destbasereg], IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_offset, FALSE), ""), LLVMPointerType (type_to_llvm_type (ctx, &klass->byval_arg), 0));
3250 LLVMBuildStore (builder, values [ins->sreg1], dst);
3253 src = LLVMBuildBitCast (builder, addresses [ins->sreg1], LLVMPointerType (LLVMInt8Type (), 0), "");
3254 dst = convert (ctx, LLVMBuildAdd (builder, convert (ctx, values [ins->inst_destbasereg], IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_offset, FALSE), ""), LLVMPointerType (LLVMInt8Type (), 0));
3257 case OP_LOADV_MEMBASE:
3258 if (!addresses [ins->dreg])
3259 addresses [ins->dreg] = build_alloca (ctx, &klass->byval_arg);
3260 src = convert (ctx, LLVMBuildAdd (builder, convert (ctx, values [ins->inst_basereg], IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_offset, FALSE), ""), LLVMPointerType (LLVMInt8Type (), 0));
3261 dst = LLVMBuildBitCast (builder, addresses [ins->dreg], LLVMPointerType (LLVMInt8Type (), 0), "");
3264 if (!addresses [ins->sreg1])
3265 addresses [ins->sreg1] = build_alloca (ctx, &klass->byval_arg);
3266 if (!addresses [ins->dreg])
3267 addresses [ins->dreg] = build_alloca (ctx, &klass->byval_arg);
3268 src = LLVMBuildBitCast (builder, addresses [ins->sreg1], LLVMPointerType (LLVMInt8Type (), 0), "");
3269 dst = LLVMBuildBitCast (builder, addresses [ins->dreg], LLVMPointerType (LLVMInt8Type (), 0), "");
3272 g_assert_not_reached ();
3280 args [2] = LLVMConstInt (LLVMInt32Type (), mono_class_value_size (klass, NULL), FALSE);
3281 args [3] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
3283 args [3] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
3284 args [4] = LLVMConstInt (LLVMInt1Type (), 0, FALSE);
3285 LLVMBuildCall (builder, LLVMGetNamedFunction (module, memcpy_func_name), args, memcpy_param_count, "");
3288 case OP_LLVM_OUTARG_VT:
3289 if (!addresses [ins->sreg1]) {
3290 addresses [ins->sreg1] = build_alloca (ctx, &ins->klass->byval_arg);
3291 g_assert (values [ins->sreg1]);
3292 LLVMBuildStore (builder, values [ins->sreg1], addresses [ins->sreg1]);
3294 addresses [ins->dreg] = addresses [ins->sreg1];
3300 #if defined(TARGET_X86) || defined(TARGET_AMD64)
3302 values [ins->dreg] = LLVMConstNull (type_to_llvm_type (ctx, &ins->klass->byval_arg));
3305 case OP_LOADX_MEMBASE: {
3306 LLVMTypeRef t = type_to_llvm_type (ctx, &ins->klass->byval_arg);
3309 src = convert (ctx, LLVMBuildAdd (builder, convert (ctx, values [ins->inst_basereg], IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_offset, FALSE), ""), LLVMPointerType (t, 0));
3310 values [ins->dreg] = mono_llvm_build_aligned_load (builder, src, "", FALSE, 1);
3317 values [ins->dreg] = LLVMBuildAdd (builder, lhs, rhs, "");
3321 values [ins->dreg] = LLVMBuildFAdd (builder, lhs, rhs, "");
3327 values [ins->dreg] = LLVMBuildSub (builder, lhs, rhs, "");
3331 values [ins->dreg] = LLVMBuildFSub (builder, lhs, rhs, "");
3335 values [ins->dreg] = LLVMBuildFMul (builder, lhs, rhs, "");
3339 values [ins->dreg] = LLVMBuildFDiv (builder, lhs, rhs, "");
3342 values [ins->dreg] = LLVMBuildAnd (builder, lhs, rhs, "");
3345 values [ins->dreg] = LLVMBuildOr (builder, lhs, rhs, "");
3348 values [ins->dreg] = LLVMBuildXor (builder, lhs, rhs, "");
3361 switch (ins->opcode) {
3366 t = LLVMVectorType (LLVMInt32Type (), 4);
3367 rt = LLVMVectorType (LLVMFloatType (), 4);
3373 t = LLVMVectorType (LLVMInt64Type (), 2);
3374 rt = LLVMVectorType (LLVMDoubleType (), 2);
3377 t = LLVMInt32Type ();
3378 rt = LLVMInt32Type ();
3379 g_assert_not_reached ();
3382 lhs = LLVMBuildBitCast (builder, lhs, t, "");
3383 rhs = LLVMBuildBitCast (builder, rhs, t, "");
3384 switch (ins->opcode) {
3387 v = LLVMBuildAnd (builder, lhs, rhs, "");
3391 v = LLVMBuildOr (builder, lhs, rhs, "");
3395 v = LLVMBuildXor (builder, lhs, rhs, "");
3399 v = LLVMBuildAnd (builder, rhs, LLVMBuildNot (builder, lhs, ""), "");
3402 values [ins->dreg] = LLVMBuildBitCast (builder, v, rt, "");
3421 LLVMValueRef args [2];
3426 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, simd_op_to_intrins (ins->opcode)), args, 2, dname);
3435 case OP_EXTRACT_U1: {
3437 gboolean zext = FALSE;
3439 t = simd_op_to_llvm_type (ins->opcode);
3441 switch (ins->opcode) {
3453 t = LLVMInt32Type ();
3454 g_assert_not_reached ();
3457 lhs = LLVMBuildBitCast (builder, lhs, t, "");
3458 values [ins->dreg] = LLVMBuildExtractElement (builder, lhs, LLVMConstInt (LLVMInt32Type (), ins->inst_c0, FALSE), "");
3460 values [ins->dreg] = LLVMBuildZExt (builder, values [ins->dreg], LLVMInt32Type (), "");
3469 case OP_EXPAND_R8: {
3470 LLVMTypeRef t = simd_op_to_llvm_type (ins->opcode);
3471 LLVMValueRef mask [16], v;
3473 for (i = 0; i < 16; ++i)
3474 mask [i] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
3476 v = convert (ctx, values [ins->sreg1], LLVMGetElementType (t));
3478 values [ins->dreg] = LLVMBuildInsertElement (builder, LLVMConstNull (t), v, LLVMConstInt (LLVMInt32Type (), 0, FALSE), "");
3479 values [ins->dreg] = LLVMBuildShuffleVector (builder, values [ins->dreg], LLVMGetUndef (t), LLVMConstVector (mask, LLVMGetVectorSize (t)), "");
3488 * EXCEPTION HANDLING
3490 case OP_IMPLICIT_EXCEPTION:
3491 /* This marks a place where an implicit exception can happen */
3492 if (bb->region != -1)
3493 LLVM_FAILURE (ctx, "implicit-exception");
3497 MonoMethodSignature *throw_sig;
3498 LLVMValueRef callee, arg;
3499 gboolean rethrow = (ins->opcode == OP_RETHROW);
3500 const char *icall_name;
3502 callee = rethrow ? ctx->lmodule->rethrow : ctx->lmodule->throw;
3503 icall_name = rethrow ? "mono_arch_rethrow_exception" : "mono_arch_throw_exception";
3506 throw_sig = mono_metadata_signature_alloc (mono_get_corlib (), 1);
3507 throw_sig->ret = &mono_get_void_class ()->byval_arg;
3508 throw_sig->params [0] = &mono_get_object_class ()->byval_arg;
3509 if (cfg->compile_aot) {
3510 callee = get_plt_entry (ctx, sig_to_llvm_sig (ctx, throw_sig), MONO_PATCH_INFO_INTERNAL_METHOD, icall_name);
3512 callee = LLVMAddFunction (module, icall_name, sig_to_llvm_sig (ctx, throw_sig));
3516 * LLVM doesn't push the exception argument, so we need a different
3519 LLVMAddGlobalMapping (ee, callee, resolve_patch (cfg, MONO_PATCH_INFO_INTERNAL_METHOD, rethrow ? "llvm_rethrow_exception_trampoline" : "llvm_throw_exception_trampoline"));
3521 LLVMAddGlobalMapping (ee, callee, resolve_patch (cfg, MONO_PATCH_INFO_INTERNAL_METHOD, icall_name));
3525 mono_memory_barrier ();
3527 ctx->lmodule->rethrow = callee;
3529 ctx->lmodule->throw = callee;
3531 arg = convert (ctx, values [ins->sreg1], type_to_llvm_type (ctx, &mono_get_object_class ()->byval_arg));
3532 emit_call (ctx, bb, &builder, callee, &arg, 1);
3535 case OP_CALL_HANDLER: {
3537 * We don't 'call' handlers, but instead simply branch to them.
3538 * The code generated by ENDFINALLY will branch back to us.
3540 LLVMBasicBlockRef noex_bb;
3542 BBInfo *info = &bblocks [ins->inst_target_bb->block_num];
3544 bb_list = info->call_handler_return_bbs;
3547 * Set the indicator variable for the finally clause.
3549 lhs = info->finally_ind;
3551 LLVMBuildStore (builder, LLVMConstInt (LLVMInt32Type (), g_slist_length (bb_list) + 1, FALSE), lhs);
3553 /* Branch to the finally clause */
3554 LLVMBuildBr (builder, info->call_handler_target_bb);
3556 noex_bb = gen_bb (ctx, "CALL_HANDLER_CONT_BB");
3557 info->call_handler_return_bbs = g_slist_append_mempool (cfg->mempool, info->call_handler_return_bbs, noex_bb);
3559 builder = ctx->builder = create_builder (ctx);
3560 LLVMPositionBuilderAtEnd (ctx->builder, noex_bb);
3562 bblocks [bb->block_num].end_bblock = noex_bb;
3565 case OP_START_HANDLER: {
3568 case OP_ENDFINALLY: {
3569 LLVMBasicBlockRef resume_bb;
3570 MonoBasicBlock *handler_bb;
3571 LLVMValueRef val, switch_ins, callee;
3575 handler_bb = g_hash_table_lookup (ctx->region_to_handler, GUINT_TO_POINTER (mono_get_block_region_notry (cfg, bb->region)));
3576 g_assert (handler_bb);
3577 info = &bblocks [handler_bb->block_num];
3578 lhs = info->finally_ind;
3581 bb_list = info->call_handler_return_bbs;
3583 resume_bb = gen_bb (ctx, "ENDFINALLY_RESUME_BB");
3585 /* Load the finally variable */
3586 val = LLVMBuildLoad (builder, lhs, "");
3588 /* Reset the variable */
3589 LLVMBuildStore (builder, LLVMConstInt (LLVMInt32Type (), 0, FALSE), lhs);
3591 /* Branch to either resume_bb, or to the bblocks in bb_list */
3592 switch_ins = LLVMBuildSwitch (builder, val, resume_bb, g_slist_length (bb_list));
3594 * The other targets are added at the end to handle OP_CALL_HANDLER
3595 * opcodes processed later.
3597 info->endfinally_switch_ins_list = g_slist_append_mempool (cfg->mempool, info->endfinally_switch_ins_list, switch_ins);
3599 builder = ctx->builder = create_builder (ctx);
3600 LLVMPositionBuilderAtEnd (ctx->builder, resume_bb);
3602 if (ctx->cfg->compile_aot) {
3603 callee = get_plt_entry (ctx, LLVMFunctionType (LLVMVoidType (), NULL, 0, FALSE), MONO_PATCH_INFO_INTERNAL_METHOD, "llvm_resume_unwind_trampoline");
3605 callee = LLVMGetNamedFunction (module, "llvm_resume_unwind_trampoline");
3607 LLVMBuildCall (builder, callee, NULL, 0, "");
3609 LLVMBuildUnreachable (builder);
3610 has_terminator = TRUE;
3616 sprintf (reason, "opcode %s", mono_inst_name (ins->opcode));
3617 LLVM_FAILURE (ctx, reason);
3622 /* Convert the value to the type required by phi nodes */
3623 if (spec [MONO_INST_DEST] != ' ' && !MONO_IS_STORE_MEMBASE (ins) && ctx->vreg_types [ins->dreg]) {
3624 if (!values [ins->dreg])
3626 values [ins->dreg] = addresses [ins->dreg];
3628 values [ins->dreg] = convert (ctx, values [ins->dreg], ctx->vreg_types [ins->dreg]);
3631 /* Add stores for volatile variables */
3632 if (spec [MONO_INST_DEST] != ' ' && spec [MONO_INST_DEST] != 'v' && !MONO_IS_STORE_MEMBASE (ins))
3633 emit_volatile_store (ctx, ins->dreg);
3636 if (!has_terminator && bb->next_bb && (bb == cfg->bb_entry || bb->in_count > 0))
3637 LLVMBuildBr (builder, get_bb (ctx, bb->next_bb));
3639 if (bb == cfg->bb_exit && sig->ret->type == MONO_TYPE_VOID)
3640 LLVMBuildRetVoid (builder);
3642 if (bb == cfg->bb_entry)
3643 ctx->last_alloca = LLVMGetLastInstruction (get_bb (ctx, cfg->bb_entry));
3652 * mono_llvm_check_method_supported:
3654 * Do some quick checks to decide whenever cfg->method can be compiled by LLVM, to avoid
3655 * compiling a method twice.
3658 mono_llvm_check_method_supported (MonoCompile *cfg)
3661 MonoMethodHeader *header = cfg->header;
3662 MonoExceptionClause *clause;
3666 if (cfg->generic_sharing_context && !IS_LLVM_MONO_BRANCH) {
3667 /* No way to obtain location info for this/rgctx */
3668 cfg->exception_message = g_strdup ("gshared");
3669 cfg->disable_llvm = TRUE;
3672 if (cfg->method->save_lmf) {
3673 cfg->exception_message = g_strdup ("lmf");
3674 cfg->disable_llvm = TRUE;
3677 if (!LLVM_CHECK_VERSION (2, 8)) {
3679 * FIXME: LLLVM 2.6 no longer seems to generate correct exception info
3682 cfg->exception_message = g_strdup ("clauses");
3683 cfg->disable_llvm = TRUE;
3687 for (i = 0; i < header->num_clauses; ++i) {
3688 clause = &header->clauses [i];
3690 if (i > 0 && clause->try_offset <= header->clauses [i - 1].handler_offset + header->clauses [i - 1].handler_len) {
3692 * FIXME: Some tests still fail with nested clauses.
3694 cfg->exception_message = g_strdup ("nested clauses");
3695 cfg->disable_llvm = TRUE;
3701 if (cfg->method->dynamic) {
3702 cfg->exception_message = g_strdup ("dynamic.");
3703 cfg->disable_llvm = TRUE;
3708 * mono_llvm_emit_method:
3710 * Emit LLVM IL from the mono IL, and compile it to native code using LLVM.
3713 mono_llvm_emit_method (MonoCompile *cfg)
3716 MonoMethodSignature *sig;
3718 LLVMTypeRef method_type;
3719 LLVMValueRef method = NULL, debug_alias = NULL;
3720 char *method_name, *debug_name = NULL;
3721 LLVMValueRef *values;
3722 int i, max_block_num, bb_index;
3723 gboolean last = FALSE;
3724 GPtrArray *phi_values;
3725 LLVMCallInfo *linfo;
3727 LLVMModuleRef module;
3729 GPtrArray *bblock_list;
3730 MonoMethodHeader *header;
3731 MonoExceptionClause *clause;
3734 /* The code below might acquire the loader lock, so use it for global locking */
3735 mono_loader_lock ();
3737 /* Used to communicate with the callbacks */
3738 TlsSetValue (current_cfg_tls_id, cfg);
3740 ctx = g_new0 (EmitContext, 1);
3742 ctx->mempool = cfg->mempool;
3745 * This maps vregs to the LLVM instruction defining them
3747 values = g_new0 (LLVMValueRef, cfg->next_vreg);
3749 * This maps vregs for volatile variables to the LLVM instruction defining their
3752 ctx->addresses = g_new0 (LLVMValueRef, cfg->next_vreg);
3753 ctx->vreg_types = g_new0 (LLVMTypeRef, cfg->next_vreg);
3754 ctx->vreg_cli_types = g_new0 (MonoType*, cfg->next_vreg);
3755 phi_values = g_ptr_array_new ();
3757 * This signals whenever the vreg was defined by a phi node with no input vars
3758 * (i.e. all its input bblocks end with NOT_REACHABLE).
3760 ctx->is_dead = g_new0 (gboolean, cfg->next_vreg);
3761 /* Whenever the bblock is unreachable */
3762 ctx->unreachable = g_new0 (gboolean, cfg->max_block_num);
3764 bblock_list = g_ptr_array_new ();
3766 ctx->values = values;
3767 ctx->region_to_handler = g_hash_table_new (NULL, NULL);
3769 if (cfg->compile_aot) {
3770 ctx->lmodule = &aot_module;
3771 method_name = mono_aot_get_method_name (cfg);
3772 debug_name = mono_aot_get_method_debug_name (cfg);
3775 ctx->lmodule = &jit_module;
3776 method_name = mono_method_full_name (cfg->method, TRUE);
3780 module = ctx->module = ctx->lmodule->module;
3784 static int count = 0;
3787 if (getenv ("LLVM_COUNT")) {
3788 if (count == atoi (getenv ("LLVM_COUNT"))) {
3789 printf ("LAST: %s\n", mono_method_full_name (cfg->method, TRUE));
3793 if (count > atoi (getenv ("LLVM_COUNT")))
3794 LLVM_FAILURE (ctx, "");
3799 sig = mono_method_signature (cfg->method);
3802 linfo = mono_arch_get_llvm_call_info (cfg, sig);
3804 CHECK_FAILURE (ctx);
3806 if (cfg->rgctx_var) {
3807 if (IS_LLVM_MONO_BRANCH)
3808 linfo->rgctx_arg = TRUE;
3810 LLVM_FAILURE (ctx, "rgctx arg");
3812 method_type = sig_to_llvm_sig_full (ctx, sig, linfo, &sinfo);
3813 CHECK_FAILURE (ctx);
3816 * This maps parameter indexes in the original signature to the indexes in
3817 * the LLVM signature.
3819 ctx->pindexes = sinfo.pindexes;
3821 method = LLVMAddFunction (module, method_name, method_type);
3822 ctx->lmethod = method;
3824 #ifdef LLVM_MONO_BRANCH
3825 if (linfo->rgctx_arg)
3826 LLVMSetFunctionCallConv (method, LLVMMono1CallConv);
3828 LLVMSetLinkage (method, LLVMPrivateLinkage);
3830 if (cfg->method->save_lmf)
3831 LLVM_FAILURE (ctx, "lmf");
3834 LLVM_FAILURE (ctx, "pinvoke signature");
3836 header = cfg->header;
3837 for (i = 0; i < header->num_clauses; ++i) {
3838 clause = &header->clauses [i];
3839 if (clause->flags != MONO_EXCEPTION_CLAUSE_FINALLY && clause->flags != MONO_EXCEPTION_CLAUSE_NONE)
3840 LLVM_FAILURE (ctx, "non-finally/catch clause.");
3843 if (linfo->rgctx_arg) {
3844 ctx->rgctx_arg = LLVMGetParam (method, sinfo.rgctx_arg_pindex);
3846 * We mark the rgctx parameter with the inreg attribute, which is mapped to
3847 * MONO_ARCH_RGCTX_REG in the Mono calling convention in llvm, i.e.
3848 * CC_X86_64_Mono in X86CallingConv.td.
3850 LLVMAddAttribute (ctx->rgctx_arg, LLVMInRegAttribute);
3851 LLVMSetValueName (ctx->rgctx_arg, "rgctx");
3853 if (cfg->vret_addr) {
3854 values [cfg->vret_addr->dreg] = LLVMGetParam (method, sinfo.vret_arg_pindex);
3855 LLVMSetValueName (values [cfg->vret_addr->dreg], "vret");
3858 values [cfg->args [0]->dreg] = LLVMGetParam (method, sinfo.this_arg_pindex);
3859 LLVMSetValueName (values [cfg->args [0]->dreg], "this");
3861 for (i = 0; i < sig->param_count; ++i) {
3864 values [cfg->args [i + sig->hasthis]->dreg] = LLVMGetParam (method, sinfo.pindexes [i]);
3865 name = g_strdup_printf ("arg_%d", i);
3866 LLVMSetValueName (values [cfg->args [i + sig->hasthis]->dreg], name);
3868 if (linfo->args [i + sig->hasthis].storage == LLVMArgVtypeByVal)
3869 LLVMAddAttribute (LLVMGetParam (method, sinfo.pindexes [i]), LLVMByValAttribute);
3873 for (bb = cfg->bb_entry; bb; bb = bb->next_bb)
3874 max_block_num = MAX (max_block_num, bb->block_num);
3875 ctx->bblocks = bblocks = g_new0 (BBInfo, max_block_num + 1);
3877 /* Add branches between non-consecutive bblocks */
3878 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
3879 if (bb->last_ins && MONO_IS_COND_BRANCH_OP (bb->last_ins) &&
3880 bb->next_bb != bb->last_ins->inst_false_bb) {
3882 MonoInst *inst = mono_mempool_alloc0 (cfg->mempool, sizeof (MonoInst));
3883 inst->opcode = OP_BR;
3884 inst->inst_target_bb = bb->last_ins->inst_false_bb;
3885 mono_bblock_add_inst (bb, inst);
3890 * The INDIRECT flag added by OP_LDADDR inhibits optimizations, even if the LDADDR
3891 * was later optimized away, so clear these flags, and add them back for the still
3892 * present OP_LDADDR instructions.
3894 for (i = 0; i < cfg->next_vreg; ++i) {
3897 ins = get_vreg_to_inst (cfg, i);
3898 if (ins && ins != cfg->rgctx_var)
3899 ins->flags &= ~MONO_INST_INDIRECT;
3903 * Make a first pass over the code to precreate PHI nodes/set INDIRECT flags.
3905 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
3907 LLVMBuilderRef builder;
3909 char dname_buf[128];
3911 builder = create_builder (ctx);
3913 for (ins = bb->code; ins; ins = ins->next) {
3914 switch (ins->opcode) {
3919 LLVMTypeRef phi_type = llvm_type_to_stack_type (type_to_llvm_type (ctx, &ins->klass->byval_arg));
3921 CHECK_FAILURE (ctx);
3923 if (ins->opcode == OP_VPHI) {
3924 /* Treat valuetype PHI nodes as operating on the address itself */
3925 g_assert (ins->klass);
3926 phi_type = LLVMPointerType (type_to_llvm_type (ctx, &ins->klass->byval_arg), 0);
3930 * Have to precreate these, as they can be referenced by
3931 * earlier instructions.
3933 sprintf (dname_buf, "t%d", ins->dreg);
3935 values [ins->dreg] = LLVMBuildPhi (builder, phi_type, dname);
3937 if (ins->opcode == OP_VPHI)
3938 ctx->addresses [ins->dreg] = values [ins->dreg];
3940 g_ptr_array_add (phi_values, values [ins->dreg]);
3943 * Set the expected type of the incoming arguments since these have
3944 * to have the same type.
3946 for (i = 0; i < ins->inst_phi_args [0]; i++) {
3947 int sreg1 = ins->inst_phi_args [i + 1];
3950 ctx->vreg_types [sreg1] = phi_type;
3955 ((MonoInst*)ins->inst_p0)->flags |= MONO_INST_INDIRECT;
3964 * Create an ordering for bblocks, use the depth first order first, then
3965 * put the exception handling bblocks last.
3967 for (bb_index = 0; bb_index < cfg->num_bblocks; ++bb_index) {
3968 bb = cfg->bblocks [bb_index];
3969 if (!(bb->region != -1 && !MONO_BBLOCK_IS_IN_REGION (bb, MONO_REGION_TRY))) {
3970 g_ptr_array_add (bblock_list, bb);
3971 bblocks [bb->block_num].added = TRUE;
3975 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
3976 if (!bblocks [bb->block_num].added)
3977 g_ptr_array_add (bblock_list, bb);
3981 * Second pass: generate code.
3983 for (bb_index = 0; bb_index < bblock_list->len; ++bb_index) {
3984 bb = g_ptr_array_index (bblock_list, bb_index);
3986 if (!(bb == cfg->bb_entry || bb->in_count > 0))
3989 process_bb (ctx, bb);
3990 CHECK_FAILURE (ctx);
3993 /* Add incoming phi values */
3994 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
3995 GSList *l, *ins_list;
3997 ins_list = bblocks [bb->block_num].phi_nodes;
3999 for (l = ins_list; l; l = l->next) {
4000 PhiNode *node = l->data;
4001 MonoInst *phi = node->phi;
4002 int sreg1 = node->sreg;
4003 LLVMBasicBlockRef in_bb;
4008 in_bb = get_end_bb (ctx, node->in_bb);
4010 if (ctx->unreachable [node->in_bb->block_num])
4013 g_assert (values [sreg1]);
4015 if (phi->opcode == OP_VPHI) {
4016 g_assert (LLVMTypeOf (ctx->addresses [sreg1]) == LLVMTypeOf (values [phi->dreg]));
4017 LLVMAddIncoming (values [phi->dreg], &ctx->addresses [sreg1], &in_bb, 1);
4019 g_assert (LLVMTypeOf (values [sreg1]) == LLVMTypeOf (values [phi->dreg]));
4020 LLVMAddIncoming (values [phi->dreg], &values [sreg1], &in_bb, 1);
4025 /* Create the SWITCH statements for ENDFINALLY instructions */
4026 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
4027 BBInfo *info = &bblocks [bb->block_num];
4029 for (l = info->endfinally_switch_ins_list; l; l = l->next) {
4030 LLVMValueRef switch_ins = l->data;
4031 GSList *bb_list = info->call_handler_return_bbs;
4033 for (i = 0; i < g_slist_length (bb_list); ++i)
4034 LLVMAddCase (switch_ins, LLVMConstInt (LLVMInt32Type (), i + 1, FALSE), g_slist_nth (bb_list, i)->data);
4038 if (cfg->verbose_level > 1)
4039 mono_llvm_dump_value (method);
4041 mark_as_used (module, method);
4043 if (cfg->compile_aot) {
4044 /* Don't generate native code, keep the LLVM IR */
4046 /* Can't delete the method if it has an alias, so only add it if successful */
4048 debug_alias = LLVMAddAlias (module, LLVMTypeOf (method), method, debug_name);
4049 LLVMSetLinkage (debug_alias, LLVMInternalLinkage);
4050 LLVMSetVisibility (debug_alias, LLVMHiddenVisibility);
4053 if (cfg->compile_aot && cfg->verbose_level)
4054 printf ("%s emitted as %s\n", mono_method_full_name (cfg->method, TRUE), method_name);
4056 //LLVMVerifyFunction(method, 0);
4058 mono_llvm_optimize_method (method);
4060 if (cfg->verbose_level > 1)
4061 mono_llvm_dump_value (method);
4063 cfg->native_code = LLVMGetPointerToGlobal (ee, method);
4065 /* Set by emit_cb */
4066 g_assert (cfg->code_len);
4068 /* FIXME: Free the LLVM IL for the function */
4076 /* Need to add unused phi nodes as they can be referenced by other values */
4077 LLVMBasicBlockRef phi_bb = LLVMAppendBasicBlock (method, "PHI_BB");
4078 LLVMBuilderRef builder;
4080 builder = create_builder (ctx);
4081 LLVMPositionBuilderAtEnd (builder, phi_bb);
4083 for (i = 0; i < phi_values->len; ++i) {
4084 LLVMValueRef v = g_ptr_array_index (phi_values, i);
4085 if (LLVMGetInstructionParent (v) == NULL)
4086 LLVMInsertIntoBuilder (builder, v);
4089 LLVMDeleteFunction (method);
4094 g_free (ctx->addresses);
4095 g_free (ctx->vreg_types);
4096 g_free (ctx->vreg_cli_types);
4097 g_free (ctx->pindexes);
4098 g_free (ctx->is_dead);
4099 g_free (ctx->unreachable);
4100 g_free (debug_name);
4101 g_ptr_array_free (phi_values, TRUE);
4102 g_free (ctx->bblocks);
4103 g_hash_table_destroy (ctx->region_to_handler);
4104 g_free (method_name);
4105 g_ptr_array_free (bblock_list, TRUE);
4107 for (l = ctx->builders; l; l = l->next) {
4108 LLVMBuilderRef builder = l->data;
4109 LLVMDisposeBuilder (builder);
4114 TlsSetValue (current_cfg_tls_id, NULL);
4116 mono_loader_unlock ();
4120 * mono_llvm_emit_call:
4122 * Same as mono_arch_emit_call () for LLVM.
4125 mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
4128 MonoMethodSignature *sig;
4129 int i, n, stack_size;
4134 sig = call->signature;
4135 n = sig->param_count + sig->hasthis;
4137 call->cinfo = mono_arch_get_llvm_call_info (cfg, sig);
4139 if (cfg->disable_llvm)
4142 if (sig->call_convention == MONO_CALL_VARARG) {
4143 cfg->exception_message = g_strdup ("varargs");
4144 cfg->disable_llvm = TRUE;
4147 for (i = 0; i < n; ++i) {
4150 ainfo = call->cinfo->args + i;
4152 in = call->args [i];
4154 /* Simply remember the arguments */
4155 switch (ainfo->storage) {
4157 MONO_INST_NEW (cfg, ins, OP_MOVE);
4158 ins->dreg = mono_alloc_ireg (cfg);
4159 ins->sreg1 = in->dreg;
4161 case LLVMArgInFPReg:
4162 MONO_INST_NEW (cfg, ins, OP_FMOVE);
4163 ins->dreg = mono_alloc_freg (cfg);
4164 ins->sreg1 = in->dreg;
4166 case LLVMArgVtypeByVal:
4167 case LLVMArgVtypeInReg:
4168 MONO_INST_NEW (cfg, ins, OP_LLVM_OUTARG_VT);
4169 ins->dreg = mono_alloc_ireg (cfg);
4170 ins->sreg1 = in->dreg;
4171 ins->klass = mono_class_from_mono_type (sig->params [i - sig->hasthis]);
4174 call->cinfo = mono_arch_get_llvm_call_info (cfg, sig);
4175 cfg->exception_message = g_strdup ("ainfo->storage");
4176 cfg->disable_llvm = TRUE;
4180 if (!cfg->disable_llvm) {
4181 MONO_ADD_INS (cfg->cbb, ins);
4182 mono_call_inst_add_outarg_reg (cfg, call, ins->dreg, 0, FALSE);
4187 static unsigned char*
4188 alloc_cb (LLVMValueRef function, int size)
4192 cfg = TlsGetValue (current_cfg_tls_id);
4196 return mono_domain_code_reserve (cfg->domain, size);
4198 return mono_domain_code_reserve (mono_domain_get (), size);
4203 emitted_cb (LLVMValueRef function, void *start, void *end)
4207 cfg = TlsGetValue (current_cfg_tls_id);
4209 cfg->code_len = (guint8*)end - (guint8*)start;
4213 exception_cb (void *data)
4216 MonoJitExceptionInfo *ei;
4217 guint32 ei_len, i, j, nested_len, nindex;
4218 gpointer *type_info;
4219 int this_reg, this_offset;
4221 cfg = TlsGetValue (current_cfg_tls_id);
4225 * data points to a DWARF FDE structure, convert it to our unwind format and
4227 * An alternative would be to save it directly, and modify our unwinder to work
4230 cfg->encoded_unwind_ops = mono_unwind_decode_fde ((guint8*)data, &cfg->encoded_unwind_ops_len, NULL, &ei, &ei_len, &type_info, &this_reg, &this_offset);
4232 /* Count nested clauses */
4234 for (i = 0; i < ei_len; ++i) {
4235 for (j = 0; j < ei_len; ++j) {
4236 gint32 cindex1 = *(gint32*)type_info [i];
4237 MonoExceptionClause *clause1 = &cfg->header->clauses [cindex1];
4238 gint32 cindex2 = *(gint32*)type_info [j];
4239 MonoExceptionClause *clause2 = &cfg->header->clauses [cindex2];
4241 if (cindex1 != cindex2 && clause1->try_offset >= clause2->try_offset && clause1->handler_offset <= clause2->handler_offset) {
4247 cfg->llvm_ex_info = mono_mempool_alloc0 (cfg->mempool, (ei_len + nested_len) * sizeof (MonoJitExceptionInfo));
4248 cfg->llvm_ex_info_len = ei_len + nested_len;
4249 memcpy (cfg->llvm_ex_info, ei, ei_len * sizeof (MonoJitExceptionInfo));
4250 /* Fill the rest of the information from the type info */
4251 for (i = 0; i < ei_len; ++i) {
4252 gint32 clause_index = *(gint32*)type_info [i];
4253 MonoExceptionClause *clause = &cfg->header->clauses [clause_index];
4255 cfg->llvm_ex_info [i].flags = clause->flags;
4256 cfg->llvm_ex_info [i].data.catch_class = clause->data.catch_class;
4260 * For nested clauses, the LLVM produced exception info associates the try interval with
4261 * the innermost handler, while mono expects it to be associated with all nesting clauses.
4263 /* FIXME: These should be order with the normal clauses */
4265 for (i = 0; i < ei_len; ++i) {
4266 for (j = 0; j < ei_len; ++j) {
4267 gint32 cindex1 = *(gint32*)type_info [i];
4268 MonoExceptionClause *clause1 = &cfg->header->clauses [cindex1];
4269 gint32 cindex2 = *(gint32*)type_info [j];
4270 MonoExceptionClause *clause2 = &cfg->header->clauses [cindex2];
4272 if (cindex1 != cindex2 && clause1->try_offset >= clause2->try_offset && clause1->handler_offset <= clause2->handler_offset) {
4274 * The try interval comes from the nested clause, everything else from the
4277 memcpy (&cfg->llvm_ex_info [nindex], &cfg->llvm_ex_info [j], sizeof (MonoJitExceptionInfo));
4278 cfg->llvm_ex_info [nindex].try_start = cfg->llvm_ex_info [i].try_start;
4279 cfg->llvm_ex_info [nindex].try_end = cfg->llvm_ex_info [i].try_end;
4284 g_assert (nindex == ei_len + nested_len);
4285 cfg->llvm_this_reg = this_reg;
4286 cfg->llvm_this_offset = this_offset;
4293 add_intrinsics (LLVMModuleRef module)
4295 /* Emit declarations of instrinsics */
4297 LLVMTypeRef memset_params [] = { LLVMPointerType (LLVMInt8Type (), 0), LLVMInt8Type (), LLVMInt32Type (), LLVMInt32Type (), LLVMInt1Type () };
4299 if (LLVM_CHECK_VERSION(2, 8)) {
4300 memset_param_count = 5;
4301 memset_func_name = "llvm.memset.p0i8.i32";
4303 memset_param_count = 4;
4304 memset_func_name = "llvm.memset.i32";
4306 LLVMAddFunction (module, memset_func_name, LLVMFunctionType (LLVMVoidType (), memset_params, memset_param_count, FALSE));
4310 LLVMTypeRef memcpy_params [] = { LLVMPointerType (LLVMInt8Type (), 0), LLVMPointerType (LLVMInt8Type (), 0), LLVMInt32Type (), LLVMInt32Type (), LLVMInt1Type () };
4312 if (LLVM_CHECK_VERSION(2, 8)) {
4313 memcpy_param_count = 5;
4314 memcpy_func_name = "llvm.memcpy.p0i8.p0i8.i32";
4316 memcpy_param_count = 4;
4317 memcpy_func_name = "llvm.memcpy.i32";
4320 LLVMAddFunction (module, memcpy_func_name, LLVMFunctionType (LLVMVoidType (), memcpy_params, memcpy_param_count, FALSE));
4324 LLVMTypeRef params [] = { LLVMDoubleType () };
4326 LLVMAddFunction (module, "llvm.sin.f64", LLVMFunctionType (LLVMDoubleType (), params, 1, FALSE));
4327 LLVMAddFunction (module, "llvm.cos.f64", LLVMFunctionType (LLVMDoubleType (), params, 1, FALSE));
4328 LLVMAddFunction (module, "llvm.sqrt.f64", LLVMFunctionType (LLVMDoubleType (), params, 1, FALSE));
4330 /* This isn't an intrinsic, instead llvm seems to special case it by name */
4331 LLVMAddFunction (module, "fabs", LLVMFunctionType (LLVMDoubleType (), params, 1, FALSE));
4335 LLVMTypeRef membar_params [] = { LLVMInt1Type (), LLVMInt1Type (), LLVMInt1Type (), LLVMInt1Type (), LLVMInt1Type () };
4337 LLVMAddFunction (module, "llvm.atomic.swap.i32.p0i32", LLVMFunctionType2 (LLVMInt32Type (), LLVMPointerType (LLVMInt32Type (), 0), LLVMInt32Type (), FALSE));
4338 LLVMAddFunction (module, "llvm.atomic.swap.i64.p0i64", LLVMFunctionType2 (LLVMInt64Type (), LLVMPointerType (LLVMInt64Type (), 0), LLVMInt64Type (), FALSE));
4339 LLVMAddFunction (module, "llvm.atomic.load.add.i32.p0i32", LLVMFunctionType2 (LLVMInt32Type (), LLVMPointerType (LLVMInt32Type (), 0), LLVMInt32Type (), FALSE));
4340 LLVMAddFunction (module, "llvm.atomic.load.add.i64.p0i64", LLVMFunctionType2 (LLVMInt64Type (), LLVMPointerType (LLVMInt64Type (), 0), LLVMInt64Type (), FALSE));
4341 LLVMAddFunction (module, "llvm.atomic.cmp.swap.i32.p0i32", LLVMFunctionType3 (LLVMInt32Type (), LLVMPointerType (LLVMInt32Type (), 0), LLVMInt32Type (), LLVMInt32Type (), FALSE));
4342 LLVMAddFunction (module, "llvm.atomic.cmp.swap.i64.p0i64", LLVMFunctionType3 (LLVMInt64Type (), LLVMPointerType (LLVMInt64Type (), 0), LLVMInt64Type (), LLVMInt64Type (), FALSE));
4343 LLVMAddFunction (module, "llvm.memory.barrier", LLVMFunctionType (LLVMVoidType (), membar_params, 5, FALSE));
4347 LLVMTypeRef ovf_res_i32 [] = { LLVMInt32Type (), LLVMInt1Type () };
4348 LLVMTypeRef ovf_params_i32 [] = { LLVMInt32Type (), LLVMInt32Type () };
4350 LLVMAddFunction (module, "llvm.sadd.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4351 LLVMAddFunction (module, "llvm.uadd.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4352 LLVMAddFunction (module, "llvm.ssub.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4353 LLVMAddFunction (module, "llvm.usub.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4354 LLVMAddFunction (module, "llvm.smul.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4355 LLVMAddFunction (module, "llvm.umul.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4359 LLVMTypeRef ovf_res_i64 [] = { LLVMInt64Type (), LLVMInt1Type () };
4360 LLVMTypeRef ovf_params_i64 [] = { LLVMInt64Type (), LLVMInt64Type () };
4362 LLVMAddFunction (module, "llvm.sadd.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4363 LLVMAddFunction (module, "llvm.uadd.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4364 LLVMAddFunction (module, "llvm.ssub.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4365 LLVMAddFunction (module, "llvm.usub.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4366 LLVMAddFunction (module, "llvm.smul.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4367 LLVMAddFunction (module, "llvm.umul.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4371 LLVMTypeRef struct_ptr = LLVMPointerType (LLVMStructType (NULL, 0, FALSE), 0);
4372 LLVMTypeRef invariant_start_params [] = { LLVMInt64Type (), LLVMPointerType (LLVMInt8Type (), 0) };
4373 LLVMTypeRef invariant_end_params [] = { struct_ptr, LLVMInt64Type (), LLVMPointerType (LLVMInt8Type (), 0) };
4375 LLVMAddFunction (module, "llvm.invariant.start", LLVMFunctionType (struct_ptr, invariant_start_params, 2, FALSE));
4377 LLVMAddFunction (module, "llvm.invariant.end", LLVMFunctionType (LLVMVoidType (), invariant_end_params, 3, FALSE));
4382 LLVMTypeRef arg_types [2];
4383 LLVMTypeRef ret_type;
4385 arg_types [0] = LLVMPointerType (LLVMInt8Type (), 0);
4386 arg_types [1] = LLVMPointerType (LLVMInt8Type (), 0);
4387 if (LLVM_CHECK_VERSION(2, 8)) {
4388 eh_selector_name = "llvm.eh.selector";
4389 ret_type = LLVMInt32Type ();
4391 if (SIZEOF_VOID_P == 8) {
4392 eh_selector_name = "llvm.eh.selector.i64";
4393 ret_type = LLVMInt64Type ();
4395 eh_selector_name = "llvm.eh.selector.i32";
4396 ret_type = LLVMInt32Type ();
4399 LLVMAddFunction (module, eh_selector_name, LLVMFunctionType (ret_type, arg_types, 2, TRUE));
4401 LLVMAddFunction (module, "llvm.eh.exception", LLVMFunctionType (LLVMPointerType (LLVMInt8Type (), 0), NULL, 0, FALSE));
4403 LLVMAddFunction (module, "mono_personality", LLVMFunctionType (LLVMVoidType (), NULL, 0, FALSE));
4405 LLVMAddFunction (module, "llvm_resume_unwind_trampoline", LLVMFunctionType (LLVMVoidType (), NULL, 0, FALSE));
4408 /* SSE intrinsics */
4410 LLVMTypeRef vector_type, arg_types [2];
4412 vector_type = LLVMVectorType (LLVMInt32Type (), 4);
4413 arg_types [0] = vector_type;
4414 arg_types [1] = vector_type;
4415 LLVMAddFunction (module, "llvm.x86.sse41.pminud", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4416 LLVMAddFunction (module, "llvm.x86.sse41.pmaxud", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4417 LLVMAddFunction (module, "llvm.x86.sse2.pcmpeq.d", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4419 vector_type = LLVMVectorType (LLVMInt16Type (), 8);
4420 arg_types [0] = vector_type;
4421 arg_types [1] = vector_type;
4422 LLVMAddFunction (module, "llvm.x86.sse41.pminuw", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4423 LLVMAddFunction (module, "llvm.x86.sse2.pmins.w", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4424 LLVMAddFunction (module, "llvm.x86.sse41.pmaxuw", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4425 LLVMAddFunction (module, "llvm.x86.sse2.pcmpeq.w", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4427 vector_type = LLVMVectorType (LLVMInt8Type (), 16);
4428 arg_types [0] = vector_type;
4429 arg_types [1] = vector_type;
4430 LLVMAddFunction (module, "llvm.x86.sse2.pminu.b", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4431 LLVMAddFunction (module, "llvm.x86.sse2.pmaxu.b", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4432 LLVMAddFunction (module, "llvm.x86.sse2.pcmpeq.b", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4433 LLVMAddFunction (module, "llvm.x86.sse2.pcmpgt.b", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4435 vector_type = LLVMVectorType (LLVMInt64Type (), 2);
4436 arg_types [0] = vector_type;
4437 arg_types [1] = vector_type;
4438 LLVMAddFunction (module, "llvm.x86.sse41.pcmpeqq", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4440 vector_type = LLVMVectorType (LLVMDoubleType (), 2);
4441 arg_types [0] = vector_type;
4442 arg_types [1] = vector_type;
4443 LLVMAddFunction (module, "llvm.x86.sse2.min.pd", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4444 LLVMAddFunction (module, "llvm.x86.sse2.max.pd", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4446 vector_type = LLVMVectorType (LLVMFloatType (), 4);
4447 arg_types [0] = vector_type;
4448 arg_types [1] = vector_type;
4449 LLVMAddFunction (module, "llvm.x86.sse2.min.ps", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4450 LLVMAddFunction (module, "llvm.x86.sse2.max.ps", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4453 /* Load/Store intrinsics */
4454 if (IS_LLVM_MONO_BRANCH) {
4455 LLVMTypeRef arg_types [5];
4459 for (i = 1; i <= 8; i *= 2) {
4460 arg_types [0] = LLVMPointerType (LLVMIntType (i * 8), 0);
4461 arg_types [1] = LLVMInt32Type ();
4462 arg_types [2] = LLVMInt1Type ();
4463 sprintf (name, "llvm.mono.load.i%d.p0i%d", i * 8, i * 8);
4464 LLVMAddFunction (module, name, LLVMFunctionType (LLVMIntType (i * 8), arg_types, 3, FALSE));
4466 arg_types [0] = LLVMIntType (i * 8);
4467 arg_types [1] = LLVMPointerType (LLVMIntType (i * 8), 0);
4468 arg_types [2] = LLVMInt32Type ();
4469 arg_types [3] = LLVMInt1Type ();
4470 sprintf (name, "llvm.mono.store.i%d.p0i%d", i * 8, i * 8);
4471 LLVMAddFunction (module, name, LLVMFunctionType (LLVMVoidType (), arg_types, 4, FALSE));
4477 mono_llvm_init (void)
4479 current_cfg_tls_id = TlsAlloc ();
4483 init_jit_module (void)
4485 MonoJitICallInfo *info;
4487 if (jit_module_inited)
4490 mono_loader_lock ();
4492 if (jit_module_inited) {
4493 mono_loader_unlock ();
4497 jit_module.module = LLVMModuleCreateWithName ("mono");
4499 ee = mono_llvm_create_ee (LLVMCreateModuleProviderForExistingModule (jit_module.module), alloc_cb, emitted_cb, exception_cb);
4501 add_intrinsics (jit_module.module);
4503 jit_module.llvm_types = g_hash_table_new (NULL, NULL);
4505 info = mono_find_jit_icall_by_name ("llvm_resume_unwind_trampoline");
4507 LLVMAddGlobalMapping (ee, LLVMGetNamedFunction (jit_module.module, "llvm_resume_unwind_trampoline"), (void*)info->func);
4509 jit_module_inited = TRUE;
4511 mono_loader_unlock ();
4515 mono_llvm_cleanup (void)
4518 mono_llvm_dispose_ee (ee);
4520 if (jit_module.llvm_types)
4521 g_hash_table_destroy (jit_module.llvm_types);
4523 if (aot_module.module)
4524 LLVMDisposeModule (aot_module.module);
4526 LLVMContextDispose (LLVMGetGlobalContext ());
4530 mono_llvm_create_aot_module (const char *got_symbol)
4532 /* Delete previous module */
4533 if (aot_module.plt_entries)
4534 g_hash_table_destroy (aot_module.plt_entries);
4535 if (aot_module.module)
4536 LLVMDisposeModule (aot_module.module);
4538 memset (&aot_module, 0, sizeof (aot_module));
4540 aot_module.module = LLVMModuleCreateWithName ("aot");
4541 aot_module.got_symbol = got_symbol;
4543 add_intrinsics (aot_module.module);
4547 * We couldn't compute the type of the LLVM global representing the got because
4548 * its size is only known after all the methods have been emitted. So create
4549 * a dummy variable, and replace all uses it with the real got variable when
4550 * its size is known in mono_llvm_emit_aot_module ().
4553 LLVMTypeRef got_type = LLVMArrayType (IntPtrType (), 0);
4555 aot_module.got_var = LLVMAddGlobal (aot_module.module, got_type, "mono_dummy_got");
4556 LLVMSetInitializer (aot_module.got_var, LLVMConstNull (got_type));
4559 /* Add a dummy personality function */
4561 LLVMBasicBlockRef lbb;
4562 LLVMBuilderRef lbuilder;
4563 LLVMValueRef personality;
4565 personality = LLVMAddFunction (aot_module.module, "mono_aot_personality", LLVMFunctionType (LLVMVoidType (), NULL, 0, FALSE));
4566 LLVMSetLinkage (personality, LLVMPrivateLinkage);
4567 lbb = LLVMAppendBasicBlock (personality, "BB0");
4568 lbuilder = LLVMCreateBuilder ();
4569 LLVMPositionBuilderAtEnd (lbuilder, lbb);
4570 LLVMBuildRetVoid (lbuilder);
4573 aot_module.llvm_types = g_hash_table_new (NULL, NULL);
4574 aot_module.plt_entries = g_hash_table_new (g_str_hash, g_str_equal);
4578 * Emit the aot module into the LLVM bitcode file FILENAME.
4581 mono_llvm_emit_aot_module (const char *filename, int got_size)
4583 LLVMTypeRef got_type;
4584 LLVMValueRef real_got;
4587 * Create the real got variable and replace all uses of the dummy variable with
4590 got_type = LLVMArrayType (IntPtrType (), got_size);
4591 real_got = LLVMAddGlobal (aot_module.module, got_type, aot_module.got_symbol);
4592 LLVMSetInitializer (real_got, LLVMConstNull (got_type));
4593 LLVMSetLinkage (real_got, LLVMInternalLinkage);
4595 mono_llvm_replace_uses_of (aot_module.got_var, real_got);
4597 mark_as_used (aot_module.module, real_got);
4599 /* Delete the dummy got so it doesn't become a global */
4600 LLVMDeleteGlobal (aot_module.got_var);
4606 if (LLVMVerifyModule (aot_module.module, LLVMReturnStatusAction, &verifier_err)) {
4607 g_assert_not_reached ();
4612 LLVMWriteBitcodeToFile (aot_module.module, filename);
4617 - Emit LLVM IR from the mono IR using the LLVM C API.
4618 - The original arch specific code remains, so we can fall back to it if we run
4619 into something we can't handle.
4623 A partial list of issues:
4624 - Handling of opcodes which can throw exceptions.
4626 In the mono JIT, these are implemented using code like this:
4633 push throw_pos - method
4634 call <exception trampoline>
4636 The problematic part is push throw_pos - method, which cannot be represented
4637 in the LLVM IR, since it does not support label values.
4638 -> this can be implemented in AOT mode using inline asm + labels, but cannot
4639 be implemented in JIT mode ?
4640 -> a possible but slower implementation would use the normal exception
4641 throwing code but it would need to control the placement of the throw code
4642 (it needs to be exactly after the compare+branch).
4643 -> perhaps add a PC offset intrinsics ?
4645 - efficient implementation of .ovf opcodes.
4647 These are currently implemented as:
4648 <ins which sets the condition codes>
4651 Some overflow opcodes are now supported by LLVM SVN.
4653 - exception handling, unwinding.
4654 - SSA is disabled for methods with exception handlers
4655 - How to obtain unwind info for LLVM compiled methods ?
4656 -> this is now solved by converting the unwind info generated by LLVM
4658 - LLVM uses the c++ exception handling framework, while we use our home grown
4659 code, and couldn't use the c++ one:
4660 - its not supported under VC++, other exotic platforms.
4661 - it might be impossible to support filter clauses with it.
4665 The trampolines need a predictable call sequence, since they need to disasm
4666 the calling code to obtain register numbers / offsets.
4668 LLVM currently generates this code in non-JIT mode:
4669 mov -0x98(%rax),%eax
4671 Here, the vtable pointer is lost.
4672 -> solution: use one vtable trampoline per class.
4674 - passing/receiving the IMT pointer/RGCTX.
4675 -> solution: pass them as normal arguments ?
4679 LLVM does not allow the specification of argument registers etc. This means
4680 that all calls are made according to the platform ABI.
4682 - passing/receiving vtypes.
4684 Vtypes passed/received in registers are handled by the front end by using
4685 a signature with scalar arguments, and loading the parts of the vtype into those
4688 Vtypes passed on the stack are handled using the 'byval' attribute.
4692 Supported though alloca, we need to emit the load/store code.
4696 The mono JIT uses pointer sized iregs/double fregs, while LLVM uses precisely
4697 typed registers, so we have to keep track of the precise LLVM type of each vreg.
4698 This is made easier because the IR is already in SSA form.
4699 An additional problem is that our IR is not consistent with types, i.e. i32/ia64
4700 types are frequently used incorrectly.
4705 Emit LLVM bytecode into a .bc file, compile it using llc into a .s file, then
4706 append the AOT data structures to that file. For methods which cannot be
4707 handled by LLVM, the normal JIT compiled versions are used.
4710 /* FIXME: Normalize some aspects of the mono IR to allow easier translation, like:
4711 * - each bblock should end with a branch
4712 * - setting the return value, making cfg->ret non-volatile
4713 * - avoid some transformations in the JIT which make it harder for us to generate
4715 * - use pointer types to help optimizations.