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.max.pd";
630 return "llvm.x86.sse2.max.ps";
632 return "llvm.x86.sse41.pmaxud";
634 return "llvm.x86.sse41.pmaxuw";
636 return "llvm.x86.sse2.pmaxu.b";
639 g_assert_not_reached ();
647 * Return the LLVM basic block corresponding to BB.
649 static LLVMBasicBlockRef
650 get_bb (EmitContext *ctx, MonoBasicBlock *bb)
654 if (ctx->bblocks [bb->block_num].bblock == NULL) {
655 sprintf (bb_name, "BB%d", bb->block_num);
657 ctx->bblocks [bb->block_num].bblock = LLVMAppendBasicBlock (ctx->lmethod, bb_name);
658 ctx->bblocks [bb->block_num].end_bblock = ctx->bblocks [bb->block_num].bblock;
661 return ctx->bblocks [bb->block_num].bblock;
667 * Return the last LLVM bblock corresponding to BB.
668 * This might not be equal to the bb returned by get_bb () since we need to generate
669 * multiple LLVM bblocks for a mono bblock to handle throwing exceptions.
671 static LLVMBasicBlockRef
672 get_end_bb (EmitContext *ctx, MonoBasicBlock *bb)
675 return ctx->bblocks [bb->block_num].end_bblock;
678 static LLVMBasicBlockRef
679 gen_bb (EmitContext *ctx, const char *prefix)
683 sprintf (bb_name, "%s%d", prefix, ++ ctx->ex_index);
684 return LLVMAppendBasicBlock (ctx->lmethod, bb_name);
690 * Return the target of the patch identified by TYPE and TARGET.
693 resolve_patch (MonoCompile *cfg, MonoJumpInfoType type, gconstpointer target)
697 memset (&ji, 0, sizeof (ji));
699 ji.data.target = target;
701 return mono_resolve_patch_target (cfg->method, cfg->domain, NULL, &ji, FALSE);
707 * Emit code to convert the LLVM value V to DTYPE.
710 convert_full (EmitContext *ctx, LLVMValueRef v, LLVMTypeRef dtype, gboolean is_unsigned)
712 LLVMTypeRef stype = LLVMTypeOf (v);
714 if (stype != dtype) {
715 gboolean ext = FALSE;
718 if (dtype == LLVMInt64Type () && (stype == LLVMInt32Type () || stype == LLVMInt16Type () || stype == LLVMInt8Type ()))
720 else if (dtype == LLVMInt32Type () && (stype == LLVMInt16Type () || stype == LLVMInt8Type ()))
722 else if (dtype == LLVMInt16Type () && (stype == LLVMInt8Type ()))
726 return is_unsigned ? LLVMBuildZExt (ctx->builder, v, dtype, "") : LLVMBuildSExt (ctx->builder, v, dtype, "");
728 if (dtype == LLVMDoubleType () && stype == LLVMFloatType ())
729 return LLVMBuildFPExt (ctx->builder, v, dtype, "");
732 if (stype == LLVMInt64Type () && (dtype == LLVMInt32Type () || dtype == LLVMInt16Type () || dtype == LLVMInt8Type ()))
733 return LLVMBuildTrunc (ctx->builder, v, dtype, "");
734 if (stype == LLVMInt32Type () && (dtype == LLVMInt16Type () || dtype == LLVMInt8Type ()))
735 return LLVMBuildTrunc (ctx->builder, v, dtype, "");
736 if (stype == LLVMInt16Type () && dtype == LLVMInt8Type ())
737 return LLVMBuildTrunc (ctx->builder, v, dtype, "");
738 if (stype == LLVMDoubleType () && dtype == LLVMFloatType ())
739 return LLVMBuildFPTrunc (ctx->builder, v, dtype, "");
741 if (LLVMGetTypeKind (stype) == LLVMPointerTypeKind && LLVMGetTypeKind (dtype) == LLVMPointerTypeKind)
742 return LLVMBuildBitCast (ctx->builder, v, dtype, "");
743 if (LLVMGetTypeKind (dtype) == LLVMPointerTypeKind)
744 return LLVMBuildIntToPtr (ctx->builder, v, dtype, "");
745 if (LLVMGetTypeKind (stype) == LLVMPointerTypeKind)
746 return LLVMBuildPtrToInt (ctx->builder, v, dtype, "");
748 #ifdef MONO_ARCH_SOFT_FLOAT
749 if (stype == LLVMInt32Type () && dtype == LLVMFloatType ())
750 return LLVMBuildBitCast (ctx->builder, v, dtype, "");
751 if (stype == LLVMInt32Type () && dtype == LLVMDoubleType ())
752 return LLVMBuildBitCast (ctx->builder, LLVMBuildZExt (ctx->builder, v, LLVMInt64Type (), ""), dtype, "");
756 LLVMDumpValue (LLVMConstNull (dtype));
757 g_assert_not_reached ();
765 convert (EmitContext *ctx, LLVMValueRef v, LLVMTypeRef dtype)
767 return convert_full (ctx, v, dtype, FALSE);
771 * emit_volatile_load:
773 * If vreg is volatile, emit a load from its address.
776 emit_volatile_load (EmitContext *ctx, int vreg)
780 LLVMValueRef v = LLVMBuildLoad (ctx->builder, ctx->addresses [vreg], "");
781 t = ctx->vreg_cli_types [vreg];
782 if (t && !t->byref) {
784 * Might have to zero extend since llvm doesn't have
787 if (t->type == MONO_TYPE_U1 || t->type == MONO_TYPE_U2)
788 v = LLVMBuildZExt (ctx->builder, v, LLVMInt32Type (), "");
789 else if (t->type == MONO_TYPE_U8)
790 v = LLVMBuildZExt (ctx->builder, v, LLVMInt64Type (), "");
797 * emit_volatile_store:
799 * If VREG is volatile, emit a store from its value to its address.
802 emit_volatile_store (EmitContext *ctx, int vreg)
804 MonoInst *var = get_vreg_to_inst (ctx->cfg, vreg);
806 if (var && var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT)) {
807 g_assert (ctx->addresses [vreg]);
808 LLVMBuildStore (ctx->builder, convert (ctx, ctx->values [vreg], type_to_llvm_type (ctx, var->inst_vtype)), ctx->addresses [vreg]);
814 * Maps parameter indexes in the original signature to parameter indexes
815 * in the LLVM signature.
818 /* The indexes of various special arguments in the LLVM signature */
819 int vret_arg_pindex, this_arg_pindex, rgctx_arg_pindex, imt_arg_pindex;
823 * sig_to_llvm_sig_full:
825 * Return the LLVM signature corresponding to the mono signature SIG using the
826 * calling convention information in CINFO. Return parameter mapping information in SINFO.
829 sig_to_llvm_sig_full (EmitContext *ctx, MonoMethodSignature *sig, LLVMCallInfo *cinfo,
832 LLVMTypeRef ret_type;
833 LLVMTypeRef *param_types = NULL;
835 int i, j, pindex, vret_arg_pindex = 0;
837 gboolean vretaddr = FALSE;
840 memset (sinfo, 0, sizeof (LLVMSigInfo));
842 ret_type = type_to_llvm_type (ctx, sig->ret);
845 if (cinfo && cinfo->ret.storage == LLVMArgVtypeInReg) {
846 /* LLVM models this by returning an aggregate value */
847 if (cinfo->ret.pair_storage [0] == LLVMArgInIReg && cinfo->ret.pair_storage [1] == LLVMArgNone) {
848 LLVMTypeRef members [2];
850 members [0] = IntPtrType ();
851 ret_type = LLVMStructType (members, 1, FALSE);
853 g_assert_not_reached ();
855 } else if (cinfo && MONO_TYPE_ISSTRUCT (sig->ret)) {
856 g_assert (cinfo->ret.storage == LLVMArgVtypeRetAddr);
858 ret_type = LLVMVoidType ();
861 pindexes = g_new0 (int, sig->param_count);
862 param_types = g_new0 (LLVMTypeRef, (sig->param_count * 2) + 3);
864 if (cinfo && cinfo->rgctx_arg) {
866 sinfo->rgctx_arg_pindex = pindex;
867 param_types [pindex] = IntPtrType ();
870 if (cinfo && cinfo->imt_arg) {
872 sinfo->imt_arg_pindex = pindex;
873 param_types [pindex] = IntPtrType ();
877 /* Compute the index in the LLVM signature where the vret arg needs to be passed */
878 vret_arg_pindex = pindex;
879 if (cinfo->vret_arg_index == 1) {
880 /* Add the slots consumed by the first argument */
881 LLVMArgInfo *ainfo = &cinfo->args [0];
882 switch (ainfo->storage) {
883 case LLVMArgVtypeInReg:
884 for (j = 0; j < 2; ++j) {
885 if (ainfo->pair_storage [j] == LLVMArgInIReg)
895 sinfo->vret_arg_pindex = vret_arg_pindex;
898 if (vretaddr && vret_arg_pindex == pindex)
899 param_types [pindex ++] = IntPtrType ();
902 sinfo->this_arg_pindex = pindex;
903 param_types [pindex ++] = IntPtrType ();
905 if (vretaddr && vret_arg_pindex == pindex)
906 param_types [pindex ++] = IntPtrType ();
907 for (i = 0; i < sig->param_count; ++i) {
908 if (vretaddr && vret_arg_pindex == pindex)
909 param_types [pindex ++] = IntPtrType ();
910 pindexes [i] = pindex;
911 if (cinfo && cinfo->args [i + sig->hasthis].storage == LLVMArgVtypeInReg) {
912 for (j = 0; j < 2; ++j) {
913 switch (cinfo->args [i + sig->hasthis].pair_storage [j]) {
915 param_types [pindex ++] = LLVMIntType (sizeof (gpointer) * 8);
920 g_assert_not_reached ();
923 } else if (cinfo && cinfo->args [i + sig->hasthis].storage == LLVMArgVtypeByVal) {
924 param_types [pindex] = type_to_llvm_arg_type (ctx, sig->params [i]);
926 param_types [pindex] = LLVMPointerType (param_types [pindex], 0);
929 param_types [pindex ++] = type_to_llvm_arg_type (ctx, sig->params [i]);
932 if (vretaddr && vret_arg_pindex == pindex)
933 param_types [pindex ++] = IntPtrType ();
937 res = LLVMFunctionType (ret_type, param_types, pindex, FALSE);
938 g_free (param_types);
941 sinfo->pindexes = pindexes;
949 g_free (param_types);
955 sig_to_llvm_sig (EmitContext *ctx, MonoMethodSignature *sig)
957 return sig_to_llvm_sig_full (ctx, sig, NULL, NULL);
963 * Create an LLVM function type from the arguments.
965 static G_GNUC_UNUSED LLVMTypeRef
966 LLVMFunctionType1(LLVMTypeRef ReturnType,
967 LLVMTypeRef ParamType1,
970 LLVMTypeRef param_types [1];
972 param_types [0] = ParamType1;
974 return LLVMFunctionType (ReturnType, param_types, 1, IsVarArg);
980 * Create an LLVM function type from the arguments.
983 LLVMFunctionType2(LLVMTypeRef ReturnType,
984 LLVMTypeRef ParamType1,
985 LLVMTypeRef ParamType2,
988 LLVMTypeRef param_types [2];
990 param_types [0] = ParamType1;
991 param_types [1] = ParamType2;
993 return LLVMFunctionType (ReturnType, param_types, 2, IsVarArg);
999 * Create an LLVM function type from the arguments.
1002 LLVMFunctionType3(LLVMTypeRef ReturnType,
1003 LLVMTypeRef ParamType1,
1004 LLVMTypeRef ParamType2,
1005 LLVMTypeRef ParamType3,
1008 LLVMTypeRef param_types [3];
1010 param_types [0] = ParamType1;
1011 param_types [1] = ParamType2;
1012 param_types [2] = ParamType3;
1014 return LLVMFunctionType (ReturnType, param_types, 3, IsVarArg);
1020 * Create an LLVM builder and remember it so it can be freed later.
1022 static LLVMBuilderRef
1023 create_builder (EmitContext *ctx)
1025 LLVMBuilderRef builder = LLVMCreateBuilder ();
1027 ctx->builders = g_slist_prepend_mempool (ctx->cfg->mempool, ctx->builders, builder);
1033 get_plt_entry (EmitContext *ctx, LLVMTypeRef llvm_sig, MonoJumpInfoType type, gconstpointer data)
1035 char *callee_name = mono_aot_get_plt_symbol (type, data);
1036 LLVMValueRef callee;
1042 callee = g_hash_table_lookup (ctx->lmodule->plt_entries, callee_name);
1044 callee = LLVMAddFunction (ctx->module, callee_name, llvm_sig);
1046 LLVMSetVisibility (callee, LLVMHiddenVisibility);
1048 g_hash_table_insert (ctx->lmodule->plt_entries, (char*)callee_name, callee);
1055 get_handler_clause (MonoCompile *cfg, MonoBasicBlock *bb)
1057 MonoMethodHeader *header = cfg->header;
1058 MonoExceptionClause *clause;
1062 if (bb->region != -1 && MONO_BBLOCK_IS_IN_REGION (bb, MONO_REGION_TRY))
1063 return (bb->region >> 8) - 1;
1066 for (i = 0; i < header->num_clauses; ++i) {
1067 clause = &header->clauses [i];
1069 if (MONO_OFFSET_IN_CLAUSE (clause, bb->real_offset) && clause->flags == MONO_EXCEPTION_CLAUSE_NONE)
1079 * Emit an LLVM call or invoke instruction depending on whenever the call is inside
1083 emit_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, LLVMValueRef callee, LLVMValueRef *args, int pindex)
1085 MonoCompile *cfg = ctx->cfg;
1087 LLVMBuilderRef builder = *builder_ref;
1090 clause_index = get_handler_clause (cfg, bb);
1092 if (clause_index != -1) {
1093 MonoMethodHeader *header = cfg->header;
1094 MonoExceptionClause *ec = &header->clauses [clause_index];
1095 MonoBasicBlock *tblock;
1096 LLVMBasicBlockRef ex_bb, noex_bb;
1099 * Have to use an invoke instead of a call, branching to the
1100 * handler bblock of the clause containing this bblock.
1103 g_assert (ec->flags == MONO_EXCEPTION_CLAUSE_NONE || ec->flags == MONO_EXCEPTION_CLAUSE_FINALLY);
1105 tblock = cfg->cil_offset_to_bb [ec->handler_offset];
1108 ctx->bblocks [tblock->block_num].invoke_target = TRUE;
1110 ex_bb = get_bb (ctx, tblock);
1112 noex_bb = gen_bb (ctx, "NOEX_BB");
1115 lcall = LLVMBuildInvoke (builder, callee, args, pindex, noex_bb, ex_bb, "");
1117 builder = ctx->builder = create_builder (ctx);
1118 LLVMPositionBuilderAtEnd (ctx->builder, noex_bb);
1120 ctx->bblocks [bb->block_num].end_bblock = noex_bb;
1122 lcall = LLVMBuildCall (builder, callee, args, pindex, "");
1123 ctx->builder = builder;
1126 *builder_ref = ctx->builder;
1132 emit_load (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, int size, LLVMValueRef addr, const char *name, gboolean is_faulting)
1134 const char *intrins_name;
1135 LLVMValueRef args [16], res;
1136 LLVMTypeRef addr_type;
1138 if (is_faulting && bb->region != -1 && IS_LLVM_MONO_BRANCH) {
1140 * We handle loads which can fault by calling a mono specific intrinsic
1141 * using an invoke, so they are handled properly inside try blocks.
1142 * We can't use this outside clauses, since LLVM optimizes intrinsics which
1143 * are marked with IntrReadArgMem.
1147 intrins_name = "llvm.mono.load.i8.p0i8";
1150 intrins_name = "llvm.mono.load.i16.p0i16";
1153 intrins_name = "llvm.mono.load.i32.p0i32";
1156 intrins_name = "llvm.mono.load.i64.p0i64";
1159 g_assert_not_reached ();
1162 addr_type = LLVMTypeOf (addr);
1163 if (addr_type == LLVMPointerType (LLVMDoubleType (), 0) || addr_type == LLVMPointerType (LLVMFloatType (), 0))
1164 addr = LLVMBuildBitCast (*builder_ref, addr, LLVMPointerType (LLVMIntType (size * 8), 0), "");
1167 args [1] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
1168 args [2] = LLVMConstInt (LLVMInt1Type (), TRUE, FALSE);
1169 res = emit_call (ctx, bb, builder_ref, LLVMGetNamedFunction (ctx->module, intrins_name), args, 3);
1171 if (addr_type == LLVMPointerType (LLVMDoubleType (), 0))
1172 res = LLVMBuildBitCast (*builder_ref, res, LLVMDoubleType (), "");
1173 else if (addr_type == LLVMPointerType (LLVMFloatType (), 0))
1174 res = LLVMBuildBitCast (*builder_ref, res, LLVMFloatType (), "");
1179 * We emit volatile loads for loads which can fault, because otherwise
1180 * LLVM will generate invalid code when encountering a load from a
1183 return mono_llvm_build_load (*builder_ref, addr, name, is_faulting);
1188 emit_store (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, int size, LLVMValueRef value, LLVMValueRef addr, gboolean is_faulting)
1190 const char *intrins_name;
1191 LLVMValueRef args [16];
1193 if (is_faulting && bb->region != -1 && IS_LLVM_MONO_BRANCH) {
1196 intrins_name = "llvm.mono.store.i8.p0i8";
1199 intrins_name = "llvm.mono.store.i16.p0i16";
1202 intrins_name = "llvm.mono.store.i32.p0i32";
1205 intrins_name = "llvm.mono.store.i64.p0i64";
1208 g_assert_not_reached ();
1211 if (LLVMTypeOf (value) == LLVMDoubleType () || LLVMTypeOf (value) == LLVMFloatType ()) {
1212 value = LLVMBuildBitCast (*builder_ref, value, LLVMIntType (size * 8), "");
1213 addr = LLVMBuildBitCast (*builder_ref, addr, LLVMPointerType (LLVMIntType (size * 8), 0), "");
1218 args [2] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
1219 args [3] = LLVMConstInt (LLVMInt1Type (), TRUE, FALSE);
1220 emit_call (ctx, bb, builder_ref, LLVMGetNamedFunction (ctx->module, intrins_name), args, 4);
1222 LLVMBuildStore (*builder_ref, value, addr);
1227 * emit_cond_system_exception:
1229 * Emit code to throw the exception EXC_TYPE if the condition CMP is false.
1230 * Might set the ctx exception.
1233 emit_cond_system_exception (EmitContext *ctx, MonoBasicBlock *bb, const char *exc_type, LLVMValueRef cmp)
1235 LLVMBasicBlockRef ex_bb, noex_bb;
1236 LLVMBuilderRef builder;
1237 MonoClass *exc_class;
1238 LLVMValueRef args [2];
1240 ex_bb = gen_bb (ctx, "EX_BB");
1241 noex_bb = gen_bb (ctx, "NOEX_BB");
1243 LLVMBuildCondBr (ctx->builder, cmp, ex_bb, noex_bb);
1245 exc_class = mono_class_from_name (mono_get_corlib (), "System", exc_type);
1246 g_assert (exc_class);
1248 /* Emit exception throwing code */
1249 builder = create_builder (ctx);
1250 LLVMPositionBuilderAtEnd (builder, ex_bb);
1252 if (!ctx->lmodule->throw_corlib_exception) {
1253 LLVMValueRef callee;
1255 const char *icall_name;
1257 MonoMethodSignature *throw_sig = mono_metadata_signature_alloc (mono_get_corlib (), 2);
1258 throw_sig->ret = &mono_get_void_class ()->byval_arg;
1259 throw_sig->params [0] = &mono_get_int32_class ()->byval_arg;
1260 if (IS_LLVM_MONO_BRANCH) {
1261 icall_name = "llvm_throw_corlib_exception_abs_trampoline";
1262 throw_sig->params [1] = &mono_get_intptr_class ()->byval_arg;
1264 icall_name = "llvm_throw_corlib_exception_trampoline";
1265 throw_sig->params [1] = &mono_get_int32_class ()->byval_arg;
1267 sig = sig_to_llvm_sig (ctx, throw_sig);
1269 if (ctx->cfg->compile_aot) {
1270 callee = get_plt_entry (ctx, sig, MONO_PATCH_INFO_INTERNAL_METHOD, icall_name);
1272 callee = LLVMAddFunction (ctx->module, "llvm_throw_corlib_exception_trampoline", sig_to_llvm_sig (ctx, throw_sig));
1275 * Differences between the LLVM/non-LLVM throw corlib exception trampoline:
1276 * - On x86, LLVM generated code doesn't push the arguments
1277 * - When using the LLVM mono branch, the trampoline takes the throw address as an
1278 * arguments, not a pc offset.
1280 LLVMAddGlobalMapping (ee, callee, resolve_patch (ctx->cfg, MONO_PATCH_INFO_INTERNAL_METHOD, icall_name));
1283 mono_memory_barrier ();
1284 ctx->lmodule->throw_corlib_exception = callee;
1288 args [0] = LLVMConstInt (LLVMInt32Type (), exc_class->type_token - MONO_TOKEN_TYPE_DEF, FALSE);
1290 args [0] = LLVMConstInt (LLVMInt32Type (), exc_class->type_token, FALSE);
1292 if (IS_LLVM_MONO_BRANCH) {
1294 * The LLVM mono branch contains changes so a block address can be passed as an
1295 * argument to a call.
1297 args [1] = LLVMBuildPtrToInt (builder, LLVMBlockAddress (ctx->lmethod, ex_bb), IntPtrType (), "");
1298 emit_call (ctx, bb, &builder, ctx->lmodule->throw_corlib_exception, args, 2);
1301 * FIXME: The offset is 0, this is only a problem if the code is inside a clause,
1302 * otherwise only the line numbers in stack traces are incorrect.
1304 if (bb->region != -1 && !IS_LLVM_MONO_BRANCH)
1305 LLVM_FAILURE (ctx, "system-ex-in-region");
1307 args [1] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
1308 emit_call (ctx, bb, &builder, ctx->lmodule->throw_corlib_exception, args, 2);
1311 LLVMBuildUnreachable (builder);
1313 ctx->builder = create_builder (ctx);
1314 LLVMPositionBuilderAtEnd (ctx->builder, noex_bb);
1316 ctx->bblocks [bb->block_num].end_bblock = noex_bb;
1326 * emit_reg_to_vtype:
1328 * Emit code to store the vtype in the registers REGS to the address ADDRESS.
1331 emit_reg_to_vtype (EmitContext *ctx, LLVMBuilderRef builder, MonoType *t, LLVMValueRef address, LLVMArgInfo *ainfo, LLVMValueRef *regs)
1335 size = get_vtype_size (t);
1337 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) {
1338 address = LLVMBuildBitCast (ctx->builder, address, LLVMPointerType (LLVMInt8Type (), 0), "");
1341 for (j = 0; j < 2; ++j) {
1342 LLVMValueRef index [2], addr;
1343 int part_size = size > sizeof (gpointer) ? sizeof (gpointer) : size;
1344 LLVMTypeRef part_type;
1346 if (ainfo->pair_storage [j] == LLVMArgNone)
1349 part_type = LLVMIntType (part_size * 8);
1350 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) {
1351 index [0] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE);
1352 addr = LLVMBuildGEP (builder, address, index, 1, "");
1354 index [0] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
1355 index [1] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE);
1356 addr = LLVMBuildGEP (builder, address, index, 2, "");
1358 switch (ainfo->pair_storage [j]) {
1360 LLVMBuildStore (builder, convert (ctx, regs [j], part_type), LLVMBuildBitCast (ctx->builder, addr, LLVMPointerType (part_type, 0), ""));
1365 g_assert_not_reached ();
1368 size -= sizeof (gpointer);
1373 * emit_vtype_to_reg:
1375 * Emit code to load a vtype at address ADDRESS into registers. Store the registers
1376 * into REGS, and the number of registers into NREGS.
1379 emit_vtype_to_reg (EmitContext *ctx, LLVMBuilderRef builder, MonoType *t, LLVMValueRef address, LLVMArgInfo *ainfo, LLVMValueRef *regs, guint32 *nregs)
1384 size = get_vtype_size (t);
1386 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) {
1387 address = LLVMBuildBitCast (ctx->builder, address, LLVMPointerType (LLVMInt8Type (), 0), "");
1390 for (j = 0; j < 2; ++j) {
1391 LLVMValueRef index [2], addr;
1392 int partsize = size > sizeof (gpointer) ? sizeof (gpointer) : size;
1394 if (ainfo->pair_storage [j] == LLVMArgNone)
1397 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) {
1398 index [0] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE);
1399 addr = LLVMBuildGEP (builder, address, index, 1, "");
1401 index [0] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
1402 index [1] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE);
1403 addr = LLVMBuildGEP (builder, address, index, 2, "");
1405 switch (ainfo->pair_storage [j]) {
1407 regs [pindex ++] = convert (ctx, LLVMBuildLoad (builder, LLVMBuildBitCast (ctx->builder, addr, LLVMPointerType (LLVMIntType (partsize * 8), 0), ""), ""), IntPtrType ());
1412 g_assert_not_reached ();
1414 size -= sizeof (gpointer);
1421 build_alloca (EmitContext *ctx, MonoType *t)
1423 MonoClass *k = mono_class_from_mono_type (t);
1426 if (MONO_CLASS_IS_SIMD (ctx->cfg, k))
1429 align = mono_class_min_align (k);
1431 /* Sometimes align is not a power of 2 */
1432 while (mono_is_power_of_two (align) == -1)
1436 * Have to place all alloca's at the end of the entry bb, since otherwise they would
1437 * get executed every time control reaches them.
1439 LLVMPositionBuilder (ctx->alloca_builder, get_bb (ctx, ctx->cfg->bb_entry), ctx->last_alloca);
1441 ctx->last_alloca = mono_llvm_build_alloca (ctx->alloca_builder, type_to_llvm_type (ctx, t), NULL, align, "");
1442 return ctx->last_alloca;
1446 * Put the global into the 'llvm.used' array to prevent it from being optimized away.
1449 mark_as_used (LLVMModuleRef module, LLVMValueRef global)
1451 LLVMTypeRef used_type;
1452 LLVMValueRef used, used_elem;
1454 used_type = LLVMArrayType (LLVMPointerType (LLVMInt8Type (), 0), 1);
1455 used = LLVMAddGlobal (module, used_type, "llvm.used");
1456 used_elem = LLVMConstBitCast (global, LLVMPointerType (LLVMInt8Type (), 0));
1457 LLVMSetInitializer (used, LLVMConstArray (LLVMPointerType (LLVMInt8Type (), 0), &used_elem, 1));
1458 LLVMSetLinkage (used, LLVMAppendingLinkage);
1459 LLVMSetSection (used, "llvm.metadata");
1465 * Emit code to load/convert arguments.
1468 emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder)
1471 MonoCompile *cfg = ctx->cfg;
1472 MonoMethodSignature *sig = ctx->sig;
1473 LLVMCallInfo *linfo = ctx->linfo;
1476 ctx->alloca_builder = create_builder (ctx);
1479 * Handle indirect/volatile variables by allocating memory for them
1480 * using 'alloca', and storing their address in a temporary.
1482 for (i = 0; i < cfg->num_varinfo; ++i) {
1483 MonoInst *var = cfg->varinfo [i];
1486 if (var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT) || MONO_TYPE_ISSTRUCT (var->inst_vtype)) {
1487 vtype = type_to_llvm_type (ctx, var->inst_vtype);
1488 CHECK_FAILURE (ctx);
1489 /* Could be already created by an OP_VPHI */
1490 if (!ctx->addresses [var->dreg])
1491 ctx->addresses [var->dreg] = build_alloca (ctx, var->inst_vtype);
1492 ctx->vreg_cli_types [var->dreg] = var->inst_vtype;
1496 for (i = 0; i < sig->param_count; ++i) {
1497 LLVMArgInfo *ainfo = &linfo->args [i + sig->hasthis];
1498 int reg = cfg->args [i + sig->hasthis]->dreg;
1500 if (ainfo->storage == LLVMArgVtypeInReg) {
1501 LLVMValueRef regs [2];
1504 * Emit code to save the argument from the registers to
1505 * the real argument.
1507 pindex = ctx->pindexes [i];
1508 regs [0] = LLVMGetParam (ctx->lmethod, pindex);
1509 if (ainfo->pair_storage [1] != LLVMArgNone)
1510 regs [1] = LLVMGetParam (ctx->lmethod, pindex + 1);
1514 ctx->addresses [reg] = build_alloca (ctx, sig->params [i]);
1516 emit_reg_to_vtype (ctx, builder, sig->params [i], ctx->addresses [reg], ainfo, regs);
1518 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (sig->params [i]))) {
1519 /* Treat these as normal values */
1520 ctx->values [reg] = LLVMBuildLoad (builder, ctx->addresses [reg], "");
1522 } else if (ainfo->storage == LLVMArgVtypeByVal) {
1523 ctx->addresses [reg] = LLVMGetParam (ctx->lmethod, ctx->pindexes [i]);
1525 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (sig->params [i]))) {
1526 /* Treat these as normal values */
1527 ctx->values [reg] = LLVMBuildLoad (builder, ctx->addresses [reg], "");
1530 ctx->values [reg] = convert (ctx, ctx->values [reg], llvm_type_to_stack_type (type_to_llvm_type (ctx, sig->params [i])));
1535 emit_volatile_store (ctx, cfg->vret_addr->dreg);
1537 emit_volatile_store (ctx, cfg->args [0]->dreg);
1538 for (i = 0; i < sig->param_count; ++i)
1539 if (!MONO_TYPE_ISSTRUCT (sig->params [i]))
1540 emit_volatile_store (ctx, cfg->args [i + sig->hasthis]->dreg);
1542 if (sig->hasthis && !cfg->rgctx_var && cfg->generic_sharing_context) {
1543 #if LLVM_CHECK_VERSION (2, 8)
1544 LLVMValueRef this_alloc, md_arg;
1548 * The exception handling code needs the location where the this argument was
1549 * stored for gshared methods. We create a separate alloca to hold it, and mark it
1550 * with the "mono.this" custom metadata to tell llvm that it needs to save its
1551 * location into the LSDA.
1553 this_alloc = mono_llvm_build_alloca (builder, IntPtrType (), LLVMConstInt (LLVMInt32Type (), 1, FALSE), 0, "");
1554 /* This volatile store will keep the alloca alive */
1555 mono_llvm_build_store (builder, ctx->values [cfg->args [0]->dreg], this_alloc, TRUE);
1557 md_kind = LLVMGetMDKindID ("mono.this", strlen ("mono.this"));
1558 md_arg = LLVMMDString ("this", 4);
1559 LLVMSetMetadata (this_alloc, md_kind, LLVMMDNode (&md_arg, 1));
1563 if (cfg->rgctx_var) {
1564 #if LLVM_CHECK_VERSION (2, 8)
1565 LLVMValueRef rgctx_alloc, store, md_arg;
1569 * We handle the rgctx arg similarly to the this pointer.
1571 g_assert (ctx->addresses [cfg->rgctx_var->dreg]);
1572 rgctx_alloc = ctx->addresses [cfg->rgctx_var->dreg];
1573 /* This volatile store will keep the alloca alive */
1574 store = mono_llvm_build_store (builder, ctx->rgctx_arg, rgctx_alloc, TRUE);
1576 md_kind = LLVMGetMDKindID ("mono.this", strlen ("mono.this"));
1577 md_arg = LLVMMDString ("this", 4);
1578 LLVMSetMetadata (rgctx_alloc, md_kind, LLVMMDNode (&md_arg, 1));
1583 * For finally clauses, create an indicator variable telling OP_ENDFINALLY whenever
1584 * it needs to continue normally, or return back to the exception handling system.
1586 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
1587 if (bb->region != -1 && (bb->flags & BB_EXCEPTION_HANDLER))
1588 g_hash_table_insert (ctx->region_to_handler, GUINT_TO_POINTER (mono_get_block_region_notry (cfg, bb->region)), bb);
1589 if (bb->region != -1 && (bb->flags & BB_EXCEPTION_HANDLER) && bb->in_scount == 0) {
1593 sprintf (name, "finally_ind_bb%d", bb->block_num);
1594 val = LLVMBuildAlloca (builder, LLVMInt32Type (), name);
1595 LLVMBuildStore (builder, LLVMConstInt (LLVMInt32Type (), 0, FALSE), val);
1597 ctx->bblocks [bb->block_num].finally_ind = val;
1600 * Create a new bblock which CALL_HANDLER can branch to, because branching to the
1601 * LLVM bblock containing the call to llvm.eh.selector causes problems for the
1602 * LLVM optimizer passes.
1604 sprintf (name, "BB_%d_CALL_HANDLER_TARGET", bb->block_num);
1605 ctx->bblocks [bb->block_num].call_handler_target_bb = LLVMAppendBasicBlock (ctx->lmethod, name);
1613 /* Have to export this for AOT */
1615 mono_personality (void);
1618 mono_personality (void)
1621 g_assert_not_reached ();
1625 process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, MonoInst *ins)
1627 MonoCompile *cfg = ctx->cfg;
1628 LLVMModuleRef module = ctx->module;
1629 LLVMValueRef *values = ctx->values;
1630 LLVMValueRef *addresses = ctx->addresses;
1631 MonoCallInst *call = (MonoCallInst*)ins;
1632 MonoMethodSignature *sig = call->signature;
1633 LLVMValueRef callee, lcall;
1635 LLVMCallInfo *cinfo;
1639 LLVMTypeRef llvm_sig;
1641 gboolean virtual, calli;
1642 LLVMBuilderRef builder = *builder_ref;
1645 if (call->signature->call_convention != MONO_CALL_DEFAULT)
1646 LLVM_FAILURE (ctx, "non-default callconv");
1648 if (call->rgctx_arg_reg && !IS_LLVM_MONO_BRANCH)
1649 LLVM_FAILURE (ctx, "rgctx reg in call");
1651 if (call->rgctx_reg && !IS_LLVM_MONO_BRANCH) {
1653 * It might be possible to support this by creating a static rgctx trampoline, but
1654 * common_call_trampoline () would patch callsites to call the trampoline, which
1655 * would be incorrect if the rgctx arg is computed dynamically.
1657 LLVM_FAILURE (ctx, "rgctx reg");
1660 cinfo = call->cinfo;
1661 if (call->rgctx_arg_reg)
1662 cinfo->rgctx_arg = TRUE;
1663 if (call->imt_arg_reg)
1664 cinfo->imt_arg = TRUE;
1666 vretaddr = cinfo && cinfo->ret.storage == LLVMArgVtypeRetAddr;
1668 llvm_sig = sig_to_llvm_sig_full (ctx, sig, cinfo, &sinfo);
1669 CHECK_FAILURE (ctx);
1671 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);
1672 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);
1674 /* FIXME: Avoid creating duplicate methods */
1676 if (ins->flags & MONO_INST_HAS_METHOD) {
1680 if (cfg->compile_aot) {
1681 callee = get_plt_entry (ctx, llvm_sig, MONO_PATCH_INFO_METHOD, call->method);
1683 LLVM_FAILURE (ctx, "can't encode patch");
1685 callee = LLVMAddFunction (module, "", llvm_sig);
1688 mono_create_jit_trampoline_in_domain (mono_domain_get (),
1690 LLVMAddGlobalMapping (ee, callee, target);
1695 MonoJitICallInfo *info = mono_find_jit_icall_by_addr (call->fptr);
1701 memset (&ji, 0, sizeof (ji));
1702 ji.type = MONO_PATCH_INFO_JIT_ICALL_ADDR;
1703 ji.data.target = info->name;
1705 target = mono_resolve_patch_target (cfg->method, cfg->domain, NULL, &ji, FALSE);
1707 if (cfg->compile_aot) {
1708 callee = get_plt_entry (ctx, llvm_sig, MONO_PATCH_INFO_INTERNAL_METHOD, (char*)info->name);
1710 LLVM_FAILURE (ctx, "can't encode patch");
1712 callee = LLVMAddFunction (module, "", llvm_sig);
1713 target = (gpointer)mono_icall_get_wrapper (info);
1714 LLVMAddGlobalMapping (ee, callee, target);
1717 if (cfg->compile_aot) {
1719 if (cfg->abs_patches) {
1720 MonoJumpInfo *abs_ji = g_hash_table_lookup (cfg->abs_patches, call->fptr);
1722 callee = get_plt_entry (ctx, llvm_sig, abs_ji->type, abs_ji->data.target);
1724 LLVM_FAILURE (ctx, "can't encode patch");
1728 LLVM_FAILURE (ctx, "aot");
1730 callee = LLVMAddFunction (module, "", llvm_sig);
1732 if (cfg->abs_patches) {
1733 MonoJumpInfo *abs_ji = g_hash_table_lookup (cfg->abs_patches, call->fptr);
1736 * FIXME: Some trampolines might have
1737 * their own calling convention on some platforms.
1739 #ifndef TARGET_AMD64
1740 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)
1741 LLVM_FAILURE (ctx, "trampoline with own cconv");
1743 target = mono_resolve_patch_target (cfg->method, cfg->domain, NULL, abs_ji, FALSE);
1744 LLVMAddGlobalMapping (ee, callee, target);
1748 LLVMAddGlobalMapping (ee, callee, (gpointer)call->fptr);
1754 int size = sizeof (gpointer);
1757 g_assert (ins->inst_offset % size == 0);
1758 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);
1760 // FIXME: mono_arch_get_vcall_slot () can't decode the code
1761 // generated by LLVM
1762 //LLVM_FAILURE (ctx, "virtual call");
1765 * When using the llvm mono branch, we can support IMT directly, otherwise
1766 * we need to call a trampoline.
1768 if (call->method && call->method->klass->flags & TYPE_ATTRIBUTE_INTERFACE && !IS_LLVM_MONO_BRANCH) {
1769 #ifdef MONO_ARCH_HAVE_LLVM_IMT_TRAMPOLINE
1770 if (cfg->compile_aot) {
1771 MonoJumpInfoImtTramp *imt_tramp = g_new0 (MonoJumpInfoImtTramp, 1);
1772 imt_tramp->method = call->method;
1773 imt_tramp->vt_offset = call->inst.inst_offset;
1775 callee = get_plt_entry (ctx, llvm_sig, MONO_PATCH_INFO_LLVM_IMT_TRAMPOLINE, imt_tramp);
1777 callee = LLVMAddFunction (module, "", llvm_sig);
1778 target = mono_create_llvm_imt_trampoline (cfg->domain, call->method, call->inst.inst_offset);
1779 LLVMAddGlobalMapping (ee, callee, target);
1782 /* No support for passing the IMT argument */
1783 LLVM_FAILURE (ctx, "imt");
1786 callee = convert (ctx, LLVMBuildLoad (builder, LLVMBuildGEP (builder, convert (ctx, values [ins->inst_basereg], LLVMPointerType (LLVMPointerType (IntPtrType (), 0), 0)), &index, 1, ""), ""), LLVMPointerType (llvm_sig, 0));
1789 callee = convert (ctx, values [ins->sreg1], LLVMPointerType (llvm_sig, 0));
1791 if (ins->flags & MONO_INST_HAS_METHOD) {
1796 * Collect and convert arguments
1798 args = alloca (sizeof (LLVMValueRef) * ((sig->param_count * 2) + sig->hasthis + vretaddr + call->rgctx_reg));
1799 l = call->out_ireg_args;
1801 if (IS_LLVM_MONO_BRANCH) {
1802 if (call->rgctx_arg_reg) {
1803 g_assert (values [call->rgctx_arg_reg]);
1804 args [sinfo.rgctx_arg_pindex] = values [call->rgctx_arg_reg];
1806 if (call->imt_arg_reg) {
1807 g_assert (values [call->imt_arg_reg]);
1808 args [sinfo.imt_arg_pindex] = values [call->imt_arg_reg];
1813 if (!addresses [call->inst.dreg])
1814 addresses [call->inst.dreg] = build_alloca (ctx, sig->ret);
1815 args [sinfo.vret_arg_pindex] = LLVMBuildPtrToInt (builder, addresses [call->inst.dreg], IntPtrType (), "");
1818 for (i = 0; i < sig->param_count + sig->hasthis; ++i) {
1821 LLVMArgInfo *ainfo = call->cinfo ? &call->cinfo->args [i] : NULL;
1825 pindex = sinfo.this_arg_pindex;
1827 pindex = sinfo.pindexes [i - 1];
1829 pindex = sinfo.pindexes [i];
1832 regpair = (guint32)(gssize)(l->data);
1833 reg = regpair & 0xffffff;
1834 args [pindex] = values [reg];
1835 if (ainfo->storage == LLVMArgVtypeInReg) {
1837 LLVMValueRef regs [2];
1842 g_assert (addresses [reg]);
1844 emit_vtype_to_reg (ctx, builder, sig->params [i - sig->hasthis], addresses [reg], ainfo, regs, &nregs);
1845 for (j = 0; j < nregs; ++j)
1846 args [pindex ++] = regs [j];
1849 // FIXME: Get rid of the VMOVE
1850 } else if (ainfo->storage == LLVMArgVtypeByVal) {
1851 g_assert (addresses [reg]);
1852 args [pindex] = addresses [reg];
1854 g_assert (args [pindex]);
1855 if (i == 0 && sig->hasthis)
1856 args [pindex] = convert (ctx, args [pindex], IntPtrType ());
1858 args [pindex] = convert (ctx, args [pindex], type_to_llvm_arg_type (ctx, sig->params [i - sig->hasthis]));
1864 // FIXME: Align call sites
1870 lcall = emit_call (ctx, bb, &builder, callee, args, LLVMCountParamTypes (llvm_sig));
1872 #ifdef LLVM_MONO_BRANCH
1874 * Modify cconv and parameter attributes to pass rgctx/imt correctly.
1876 #if defined(MONO_ARCH_IMT_REG) && defined(MONO_ARCH_RGCTX_REG)
1877 g_assert (MONO_ARCH_IMT_REG == MONO_ARCH_RGCTX_REG);
1879 /* The two can't be used together, so use only one LLVM calling conv to pass them */
1880 g_assert (!(call->rgctx_arg_reg && call->imt_arg_reg));
1881 if (call->rgctx_arg_reg || call->imt_arg_reg)
1882 LLVMSetInstructionCallConv (lcall, LLVMMono1CallConv);
1884 if (call->rgctx_arg_reg)
1885 LLVMAddInstrAttribute (lcall, 1 + sinfo.rgctx_arg_pindex, LLVMInRegAttribute);
1886 if (call->imt_arg_reg)
1887 LLVMAddInstrAttribute (lcall, 1 + sinfo.imt_arg_pindex, LLVMInRegAttribute);
1890 /* Add byval attributes if needed */
1891 for (i = 0; i < sig->param_count; ++i) {
1892 LLVMArgInfo *ainfo = call->cinfo ? &call->cinfo->args [i + sig->hasthis] : NULL;
1894 if (ainfo && ainfo->storage == LLVMArgVtypeByVal) {
1895 LLVMAddInstrAttribute (lcall, 1 + sinfo.pindexes [i], LLVMByValAttribute);
1900 * Convert the result
1902 if (cinfo && cinfo->ret.storage == LLVMArgVtypeInReg) {
1903 LLVMValueRef regs [2];
1905 if (!addresses [ins->dreg])
1906 addresses [ins->dreg] = build_alloca (ctx, sig->ret);
1908 regs [0] = LLVMBuildExtractValue (builder, lcall, 0, "");
1909 if (cinfo->ret.pair_storage [1] != LLVMArgNone)
1910 regs [1] = LLVMBuildExtractValue (builder, lcall, 1, "");
1912 emit_reg_to_vtype (ctx, builder, sig->ret, addresses [ins->dreg], &cinfo->ret, regs);
1913 } else if (sig->ret->type != MONO_TYPE_VOID && !vretaddr) {
1914 /* If the method returns an unsigned value, need to zext it */
1916 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));
1919 *builder_ref = ctx->builder;
1921 g_free (sinfo.pindexes);
1929 process_bb (EmitContext *ctx, MonoBasicBlock *bb)
1931 MonoCompile *cfg = ctx->cfg;
1932 MonoMethodSignature *sig = ctx->sig;
1933 LLVMValueRef method = ctx->lmethod;
1934 LLVMValueRef *values = ctx->values;
1935 LLVMValueRef *addresses = ctx->addresses;
1937 LLVMCallInfo *linfo = ctx->linfo;
1938 LLVMModuleRef module = ctx->module;
1939 BBInfo *bblocks = ctx->bblocks;
1941 LLVMBasicBlockRef cbb;
1942 LLVMBuilderRef builder;
1943 gboolean has_terminator;
1945 LLVMValueRef lhs, rhs;
1947 cbb = get_bb (ctx, bb);
1948 builder = create_builder (ctx);
1949 ctx->builder = builder;
1950 LLVMPositionBuilderAtEnd (builder, cbb);
1952 if (bb == cfg->bb_entry)
1953 emit_entry_bb (ctx, builder);
1954 CHECK_FAILURE (ctx);
1956 if (bb->flags & BB_EXCEPTION_HANDLER) {
1958 LLVMValueRef eh_selector, eh_exception, personality, args [4];
1959 LLVMBasicBlockRef target_bb;
1961 static gint32 mapping_inited;
1962 static int ti_generator;
1965 LLVMValueRef type_info;
1968 if (!bblocks [bb->block_num].invoke_target) {
1970 * LLVM asserts if llvm.eh.selector is called from a bblock which
1971 * doesn't have an invoke pointing at it.
1973 LLVM_FAILURE (ctx, "handler without invokes");
1976 eh_selector = LLVMGetNamedFunction (module, eh_selector_name);
1978 if (cfg->compile_aot) {
1979 /* Use a dummy personality function */
1980 personality = LLVMGetNamedFunction (module, "mono_aot_personality");
1981 g_assert (personality);
1983 personality = LLVMGetNamedFunction (module, "mono_personality");
1984 if (InterlockedCompareExchange (&mapping_inited, 1, 0) == 0)
1985 LLVMAddGlobalMapping (ee, personality, mono_personality);
1988 i8ptr = LLVMPointerType (LLVMInt8Type (), 0);
1990 clause_index = (mono_get_block_region_notry (cfg, bb->region) >> 8) - 1;
1993 * Create the type info
1995 sprintf (ti_name, "type_info_%d", ti_generator);
1998 if (cfg->compile_aot) {
1999 /* decode_eh_frame () in aot-runtime.c will decode this */
2000 type_info = LLVMAddGlobal (module, LLVMInt32Type (), ti_name);
2001 LLVMSetInitializer (type_info, LLVMConstInt (LLVMInt32Type (), clause_index, FALSE));
2003 LLVMSetLinkage (type_info, LLVMPrivateLinkage);
2004 LLVMSetVisibility (type_info, LLVMHiddenVisibility);
2007 * Enabling this causes llc to crash:
2008 * http://llvm.org/bugs/show_bug.cgi?id=6102
2010 //LLVM_FAILURE (ctx, "aot+clauses");
2012 /* exception_cb will decode this */
2013 ti = g_malloc (sizeof (gint32));
2014 *(gint32*)ti = clause_index;
2016 type_info = LLVMAddGlobal (module, i8ptr, ti_name);
2018 LLVMAddGlobalMapping (ee, type_info, ti);
2021 args [0] = LLVMConstNull (i8ptr);
2022 args [1] = LLVMConstBitCast (personality, i8ptr);
2023 args [2] = type_info;
2024 LLVMBuildCall (builder, eh_selector, args, 3, "");
2026 /* Store the exception into the exvar */
2027 if (bb->in_scount == 1) {
2028 g_assert (bb->in_scount == 1);
2029 exvar = bb->in_stack [0];
2031 eh_exception = LLVMGetNamedFunction (module, "llvm.eh.exception");
2033 // FIXME: This is shared with filter clauses ?
2034 g_assert (!values [exvar->dreg]);
2035 values [exvar->dreg] = LLVMBuildCall (builder, eh_exception, NULL, 0, "");
2036 emit_volatile_store (ctx, exvar->dreg);
2039 /* Start a new bblock which CALL_HANDLER can branch to */
2040 target_bb = bblocks [bb->block_num].call_handler_target_bb;
2042 LLVMBuildBr (builder, target_bb);
2044 ctx->builder = builder = create_builder (ctx);
2045 LLVMPositionBuilderAtEnd (ctx->builder, target_bb);
2047 ctx->bblocks [bb->block_num].end_bblock = target_bb;
2051 has_terminator = FALSE;
2052 for (ins = bb->code; ins; ins = ins->next) {
2053 const char *spec = LLVM_INS_INFO (ins->opcode);
2055 char dname_buf [128];
2058 /* There could be instructions after a terminator, skip them */
2061 if (spec [MONO_INST_DEST] != ' ' && !MONO_IS_STORE_MEMBASE (ins)) {
2062 sprintf (dname_buf, "t%d", ins->dreg);
2066 if (spec [MONO_INST_SRC1] != ' ' && spec [MONO_INST_SRC1] != 'v') {
2067 MonoInst *var = get_vreg_to_inst (cfg, ins->sreg1);
2069 if (var && var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT)) {
2070 lhs = emit_volatile_load (ctx, ins->sreg1);
2072 /* It is ok for SETRET to have an uninitialized argument */
2073 if (!values [ins->sreg1] && ins->opcode != OP_SETRET)
2074 LLVM_FAILURE (ctx, "sreg1");
2075 lhs = values [ins->sreg1];
2081 if (spec [MONO_INST_SRC2] != ' ' && spec [MONO_INST_SRC2] != ' ') {
2082 MonoInst *var = get_vreg_to_inst (cfg, ins->sreg2);
2083 if (var && var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT)) {
2084 rhs = emit_volatile_load (ctx, ins->sreg2);
2086 if (!values [ins->sreg2])
2087 LLVM_FAILURE (ctx, "sreg2");
2088 rhs = values [ins->sreg2];
2094 //mono_print_ins (ins);
2095 switch (ins->opcode) {
2098 case OP_LIVERANGE_START:
2099 case OP_LIVERANGE_END:
2102 values [ins->dreg] = LLVMConstInt (LLVMInt32Type (), ins->inst_c0, FALSE);
2105 #if SIZEOF_VOID_P == 4
2106 values [ins->dreg] = LLVMConstInt (LLVMInt64Type (), GET_LONG_IMM (ins), FALSE);
2108 values [ins->dreg] = LLVMConstInt (LLVMInt64Type (), (gint64)ins->inst_c0, FALSE);
2112 values [ins->dreg] = LLVMConstReal (LLVMDoubleType (), *(double*)ins->inst_p0);
2115 values [ins->dreg] = LLVMConstFPExt (LLVMConstReal (LLVMFloatType (), *(float*)ins->inst_p0), LLVMDoubleType ());
2118 LLVMBuildBr (builder, get_bb (ctx, ins->inst_target_bb));
2119 has_terminator = TRUE;
2125 LLVMBasicBlockRef new_bb;
2126 LLVMBuilderRef new_builder;
2128 // The default branch is already handled
2129 // FIXME: Handle it here
2131 /* Start new bblock */
2132 sprintf (bb_name, "SWITCH_DEFAULT_BB%d", ctx->default_index ++);
2133 new_bb = LLVMAppendBasicBlock (ctx->lmethod, bb_name);
2135 lhs = convert (ctx, lhs, LLVMInt32Type ());
2136 v = LLVMBuildSwitch (builder, lhs, new_bb, GPOINTER_TO_UINT (ins->klass));
2137 for (i = 0; i < GPOINTER_TO_UINT (ins->klass); ++i) {
2138 MonoBasicBlock *target_bb = ins->inst_many_bb [i];
2140 LLVMAddCase (v, LLVMConstInt (LLVMInt32Type (), i, FALSE), get_bb (ctx, target_bb));
2143 new_builder = create_builder (ctx);
2144 LLVMPositionBuilderAtEnd (new_builder, new_bb);
2145 LLVMBuildUnreachable (new_builder);
2147 has_terminator = TRUE;
2148 g_assert (!ins->next);
2154 if (linfo->ret.storage == LLVMArgVtypeInReg) {
2155 LLVMTypeRef ret_type = LLVMGetReturnType (LLVMGetElementType (LLVMTypeOf (method)));
2156 LLVMValueRef part1, retval;
2159 size = get_vtype_size (sig->ret);
2161 g_assert (addresses [ins->sreg1]);
2163 g_assert (linfo->ret.pair_storage [0] == LLVMArgInIReg);
2164 g_assert (linfo->ret.pair_storage [1] == LLVMArgNone);
2166 part1 = convert (ctx, LLVMBuildLoad (builder, LLVMBuildBitCast (builder, addresses [ins->sreg1], LLVMPointerType (LLVMIntType (size * 8), 0), ""), ""), IntPtrType ());
2168 retval = LLVMBuildInsertValue (builder, LLVMGetUndef (ret_type), part1, 0, "");
2170 LLVMBuildRet (builder, retval);
2174 if (linfo->ret.storage == LLVMArgVtypeRetAddr) {
2175 LLVMBuildRetVoid (builder);
2179 if (!lhs || ctx->is_dead [ins->sreg1]) {
2181 * The method did not set its return value, probably because it
2182 * ends with a throw.
2185 LLVMBuildRetVoid (builder);
2187 LLVMBuildRet (builder, LLVMConstNull (type_to_llvm_type (ctx, sig->ret)));
2189 LLVMBuildRet (builder, convert (ctx, lhs, type_to_llvm_type (ctx, sig->ret)));
2191 has_terminator = TRUE;
2197 case OP_ICOMPARE_IMM:
2198 case OP_LCOMPARE_IMM:
2199 case OP_COMPARE_IMM:
2201 case OP_AMD64_ICOMPARE_MEMBASE_REG:
2202 case OP_AMD64_ICOMPARE_MEMBASE_IMM:
2205 case OP_X86_COMPARE_MEMBASE_REG:
2206 case OP_X86_COMPARE_MEMBASE_IMM:
2212 if (ins->next->opcode == OP_NOP)
2215 if (ins->next->opcode == OP_BR)
2216 /* The comparison result is not needed */
2219 rel = mono_opcode_to_cond (ins->next->opcode);
2221 /* Used for implementing bound checks */
2223 if ((ins->opcode == OP_AMD64_ICOMPARE_MEMBASE_REG) || (ins->opcode == OP_AMD64_ICOMPARE_MEMBASE_IMM)) {
2228 t = LLVMInt32Type ();
2230 g_assert (ins->inst_offset % size == 0);
2231 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);
2233 lhs = emit_load (ctx, bb, &builder, 4, LLVMBuildGEP (builder, convert (ctx, values [ins->inst_basereg], LLVMPointerType (t, 0)), &index, 1, ""), "", TRUE);
2235 if (ins->opcode == OP_AMD64_ICOMPARE_MEMBASE_IMM) {
2236 lhs = convert (ctx, lhs, LLVMInt32Type ());
2237 rhs = LLVMConstInt (LLVMInt32Type (), ins->inst_imm, FALSE);
2239 if (ins->opcode == OP_AMD64_ICOMPARE_MEMBASE_REG)
2240 rhs = convert (ctx, rhs, LLVMInt32Type ());
2244 if ((ins->opcode == OP_X86_COMPARE_MEMBASE_REG) || (ins->opcode == OP_X86_COMPARE_MEMBASE_IMM)) {
2249 t = LLVMInt32Type ();
2251 g_assert (ins->inst_offset % size == 0);
2252 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);
2254 lhs = LLVMBuildLoad (builder, LLVMBuildGEP (builder, convert (ctx, values [ins->inst_basereg], LLVMPointerType (t, 0)), &index, 1, ""), "");
2256 if (ins->opcode == OP_X86_COMPARE_MEMBASE_IMM) {
2257 lhs = convert (ctx, lhs, LLVMInt32Type ());
2258 rhs = LLVMConstInt (LLVMInt32Type (), ins->inst_imm, FALSE);
2260 if (ins->opcode == OP_X86_COMPARE_MEMBASE_REG)
2261 rhs = convert (ctx, rhs, LLVMInt32Type ());
2264 if (ins->opcode == OP_ICOMPARE_IMM) {
2265 lhs = convert (ctx, lhs, LLVMInt32Type ());
2266 rhs = LLVMConstInt (LLVMInt32Type (), ins->inst_imm, FALSE);
2268 if (ins->opcode == OP_LCOMPARE_IMM) {
2269 lhs = convert (ctx, lhs, LLVMInt64Type ());
2270 rhs = LLVMConstInt (LLVMInt64Type (), GET_LONG_IMM (ins), FALSE);
2272 if (ins->opcode == OP_LCOMPARE) {
2273 lhs = convert (ctx, lhs, LLVMInt64Type ());
2274 rhs = convert (ctx, rhs, LLVMInt64Type ());
2276 if (ins->opcode == OP_ICOMPARE) {
2277 lhs = convert (ctx, lhs, LLVMInt32Type ());
2278 rhs = convert (ctx, rhs, LLVMInt32Type ());
2282 if (LLVMGetTypeKind (LLVMTypeOf (lhs)) == LLVMPointerTypeKind)
2283 rhs = convert (ctx, rhs, LLVMTypeOf (lhs));
2284 else if (LLVMGetTypeKind (LLVMTypeOf (rhs)) == LLVMPointerTypeKind)
2285 lhs = convert (ctx, lhs, LLVMTypeOf (rhs));
2288 /* We use COMPARE+SETcc/Bcc, llvm uses SETcc+br cond */
2289 if (ins->opcode == OP_FCOMPARE)
2290 cmp = LLVMBuildFCmp (builder, fpcond_to_llvm_cond [rel], convert (ctx, lhs, LLVMDoubleType ()), convert (ctx, rhs, LLVMDoubleType ()), "");
2291 else if (ins->opcode == OP_COMPARE_IMM)
2292 cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], convert (ctx, lhs, IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_imm, FALSE), "");
2293 else if (ins->opcode == OP_COMPARE)
2294 cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], convert (ctx, lhs, IntPtrType ()), convert (ctx, rhs, IntPtrType ()), "");
2296 cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], lhs, rhs, "");
2298 if (MONO_IS_COND_BRANCH_OP (ins->next)) {
2299 LLVMBuildCondBr (builder, cmp, get_bb (ctx, ins->next->inst_true_bb), get_bb (ctx, ins->next->inst_false_bb));
2300 has_terminator = TRUE;
2301 } else if (MONO_IS_SETCC (ins->next)) {
2302 sprintf (dname_buf, "t%d", ins->next->dreg);
2304 values [ins->next->dreg] = LLVMBuildZExt (builder, cmp, LLVMInt32Type (), dname);
2306 /* Add stores for volatile variables */
2307 emit_volatile_store (ctx, ins->next->dreg);
2308 } else if (MONO_IS_COND_EXC (ins->next)) {
2309 emit_cond_system_exception (ctx, bb, ins->next->inst_p1, cmp);
2310 CHECK_FAILURE (ctx);
2311 builder = ctx->builder;
2313 LLVM_FAILURE (ctx, "next");
2327 rel = mono_opcode_to_cond (ins->opcode);
2329 cmp = LLVMBuildFCmp (builder, fpcond_to_llvm_cond [rel], convert (ctx, lhs, LLVMDoubleType ()), convert (ctx, rhs, LLVMDoubleType ()), "");
2330 values [ins->dreg] = LLVMBuildZExt (builder, cmp, LLVMInt32Type (), dname);
2338 gboolean empty = TRUE;
2340 /* Check that all input bblocks really branch to us */
2341 for (i = 0; i < bb->in_count; ++i) {
2342 if (bb->in_bb [i]->last_ins && bb->in_bb [i]->last_ins->opcode == OP_NOT_REACHED)
2343 ins->inst_phi_args [i + 1] = -1;
2349 /* LLVM doesn't like phi instructions with zero operands */
2350 ctx->is_dead [ins->dreg] = TRUE;
2354 /* Created earlier, insert it now */
2355 LLVMInsertIntoBuilder (builder, values [ins->dreg]);
2357 for (i = 0; i < ins->inst_phi_args [0]; i++) {
2358 int sreg1 = ins->inst_phi_args [i + 1];
2362 * Count the number of times the incoming bblock branches to us,
2363 * since llvm requires a separate entry for each.
2365 if (bb->in_bb [i]->last_ins && bb->in_bb [i]->last_ins->opcode == OP_SWITCH) {
2366 MonoInst *switch_ins = bb->in_bb [i]->last_ins;
2369 for (j = 0; j < GPOINTER_TO_UINT (switch_ins->klass); ++j) {
2370 if (switch_ins->inst_many_bb [j] == bb)
2377 /* Remember for later */
2378 for (j = 0; j < count; ++j) {
2379 PhiNode *node = mono_mempool_alloc0 (ctx->mempool, sizeof (PhiNode));
2382 node->in_bb = bb->in_bb [i];
2384 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);
2393 values [ins->dreg] = lhs;
2396 MonoInst *var = get_vreg_to_inst (cfg, ins->dreg);
2399 values [ins->dreg] = lhs;
2401 if (var && var->klass->byval_arg.type == MONO_TYPE_R4) {
2403 * This is added by the spilling pass in case of the JIT,
2404 * but we have to do it ourselves.
2406 values [ins->dreg] = convert (ctx, values [ins->dreg], LLVMFloatType ());
2440 lhs = convert (ctx, lhs, regtype_to_llvm_type (spec [MONO_INST_DEST]));
2441 rhs = convert (ctx, rhs, regtype_to_llvm_type (spec [MONO_INST_DEST]));
2443 switch (ins->opcode) {
2446 values [ins->dreg] = LLVMBuildAdd (builder, lhs, rhs, dname);
2450 values [ins->dreg] = LLVMBuildSub (builder, lhs, rhs, dname);
2454 values [ins->dreg] = LLVMBuildMul (builder, lhs, rhs, dname);
2458 values [ins->dreg] = LLVMBuildSRem (builder, lhs, rhs, dname);
2462 values [ins->dreg] = LLVMBuildURem (builder, lhs, rhs, dname);
2466 values [ins->dreg] = LLVMBuildSDiv (builder, lhs, rhs, dname);
2470 values [ins->dreg] = LLVMBuildUDiv (builder, lhs, rhs, dname);
2473 values [ins->dreg] = LLVMBuildFDiv (builder, lhs, rhs, dname);
2477 values [ins->dreg] = LLVMBuildAnd (builder, lhs, rhs, dname);
2481 values [ins->dreg] = LLVMBuildOr (builder, lhs, rhs, dname);
2485 values [ins->dreg] = LLVMBuildXor (builder, lhs, rhs, dname);
2489 values [ins->dreg] = LLVMBuildShl (builder, lhs, rhs, dname);
2493 values [ins->dreg] = LLVMBuildAShr (builder, lhs, rhs, dname);
2497 values [ins->dreg] = LLVMBuildLShr (builder, lhs, rhs, dname);
2501 values [ins->dreg] = LLVMBuildFAdd (builder, lhs, rhs, dname);
2504 values [ins->dreg] = LLVMBuildFSub (builder, lhs, rhs, dname);
2507 values [ins->dreg] = LLVMBuildFMul (builder, lhs, rhs, dname);
2511 g_assert_not_reached ();
2518 case OP_IREM_UN_IMM:
2520 case OP_IDIV_UN_IMM:
2526 case OP_ISHR_UN_IMM:
2535 case OP_LSHR_UN_IMM:
2543 if (spec [MONO_INST_SRC1] == 'l') {
2544 imm = LLVMConstInt (LLVMInt64Type (), GET_LONG_IMM (ins), FALSE);
2546 imm = LLVMConstInt (LLVMInt32Type (), ins->inst_imm, FALSE);
2549 #if SIZEOF_VOID_P == 4
2550 if (ins->opcode == OP_LSHL_IMM || ins->opcode == OP_LSHR_IMM || ins->opcode == OP_LSHR_UN_IMM)
2551 imm = LLVMConstInt (LLVMInt32Type (), ins->inst_imm, FALSE);
2554 if (LLVMGetTypeKind (LLVMTypeOf (lhs)) == LLVMPointerTypeKind)
2555 lhs = convert (ctx, lhs, IntPtrType ());
2556 imm = convert (ctx, imm, LLVMTypeOf (lhs));
2557 switch (ins->opcode) {
2561 values [ins->dreg] = LLVMBuildAdd (builder, lhs, imm, dname);
2565 values [ins->dreg] = LLVMBuildSub (builder, lhs, imm, dname);
2569 values [ins->dreg] = LLVMBuildMul (builder, lhs, imm, dname);
2573 values [ins->dreg] = LLVMBuildSDiv (builder, lhs, imm, dname);
2575 case OP_IDIV_UN_IMM:
2576 case OP_LDIV_UN_IMM:
2577 values [ins->dreg] = LLVMBuildUDiv (builder, lhs, imm, dname);
2581 values [ins->dreg] = LLVMBuildSRem (builder, lhs, imm, dname);
2583 case OP_IREM_UN_IMM:
2584 values [ins->dreg] = LLVMBuildURem (builder, lhs, imm, dname);
2589 values [ins->dreg] = LLVMBuildAnd (builder, lhs, imm, dname);
2593 values [ins->dreg] = LLVMBuildOr (builder, lhs, imm, dname);
2597 values [ins->dreg] = LLVMBuildXor (builder, lhs, imm, dname);
2602 values [ins->dreg] = LLVMBuildShl (builder, lhs, imm, dname);
2607 values [ins->dreg] = LLVMBuildAShr (builder, lhs, imm, dname);
2609 case OP_ISHR_UN_IMM:
2610 /* This is used to implement conv.u4, so the lhs could be an i8 */
2611 lhs = convert (ctx, lhs, LLVMInt32Type ());
2612 imm = convert (ctx, imm, LLVMInt32Type ());
2613 values [ins->dreg] = LLVMBuildLShr (builder, lhs, imm, dname);
2615 case OP_LSHR_UN_IMM:
2616 values [ins->dreg] = LLVMBuildLShr (builder, lhs, imm, dname);
2619 g_assert_not_reached ();
2624 values [ins->dreg] = LLVMBuildSub (builder, LLVMConstInt (LLVMInt32Type (), 0, FALSE), convert (ctx, lhs, LLVMInt32Type ()), dname);
2627 values [ins->dreg] = LLVMBuildSub (builder, LLVMConstInt (LLVMInt64Type (), 0, FALSE), lhs, dname);
2630 lhs = convert (ctx, lhs, LLVMDoubleType ());
2631 values [ins->dreg] = LLVMBuildFSub (builder, LLVMConstReal (LLVMDoubleType (), 0.0), lhs, dname);
2634 guint32 v = 0xffffffff;
2635 values [ins->dreg] = LLVMBuildXor (builder, LLVMConstInt (LLVMInt32Type (), v, FALSE), lhs, dname);
2639 guint64 v = 0xffffffffffffffffLL;
2640 values [ins->dreg] = LLVMBuildXor (builder, LLVMConstInt (LLVMInt64Type (), v, FALSE), lhs, dname);
2643 #if defined(TARGET_X86) || defined(TARGET_AMD64)
2645 LLVMValueRef v1, v2;
2647 v1 = LLVMBuildMul (builder, convert (ctx, rhs, IntPtrType ()), LLVMConstInt (IntPtrType (), (1 << ins->backend.shift_amount), FALSE), "");
2648 v2 = LLVMBuildAdd (builder, convert (ctx, lhs, IntPtrType ()), v1, "");
2649 values [ins->dreg] = LLVMBuildAdd (builder, v2, LLVMConstInt (IntPtrType (), ins->inst_imm, FALSE), dname);
2654 case OP_ICONV_TO_I1:
2655 case OP_ICONV_TO_I2:
2656 case OP_ICONV_TO_I4:
2657 case OP_ICONV_TO_U1:
2658 case OP_ICONV_TO_U2:
2659 case OP_ICONV_TO_U4:
2660 case OP_LCONV_TO_I1:
2661 case OP_LCONV_TO_I2:
2662 case OP_LCONV_TO_U1:
2663 case OP_LCONV_TO_U2:
2664 case OP_LCONV_TO_U4: {
2667 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);
2669 /* Have to do two casts since our vregs have type int */
2670 v = LLVMBuildTrunc (builder, lhs, op_to_llvm_type (ins->opcode), "");
2672 values [ins->dreg] = LLVMBuildSExt (builder, v, LLVMInt32Type (), dname);
2674 values [ins->dreg] = LLVMBuildZExt (builder, v, LLVMInt32Type (), dname);
2677 case OP_ICONV_TO_I8:
2678 values [ins->dreg] = LLVMBuildSExt (builder, lhs, LLVMInt64Type (), dname);
2680 case OP_ICONV_TO_U8:
2681 values [ins->dreg] = LLVMBuildZExt (builder, lhs, LLVMInt64Type (), dname);
2683 case OP_FCONV_TO_I4:
2684 values [ins->dreg] = LLVMBuildFPToSI (builder, lhs, LLVMInt32Type (), dname);
2686 case OP_FCONV_TO_I1:
2687 values [ins->dreg] = LLVMBuildSExt (builder, LLVMBuildFPToSI (builder, lhs, LLVMInt8Type (), dname), LLVMInt32Type (), "");
2689 case OP_FCONV_TO_U1:
2690 values [ins->dreg] = LLVMBuildZExt (builder, LLVMBuildFPToUI (builder, lhs, LLVMInt8Type (), dname), LLVMInt32Type (), "");
2692 case OP_FCONV_TO_I2:
2693 values [ins->dreg] = LLVMBuildSExt (builder, LLVMBuildFPToSI (builder, lhs, LLVMInt16Type (), dname), LLVMInt32Type (), "");
2695 case OP_FCONV_TO_U2:
2696 values [ins->dreg] = LLVMBuildZExt (builder, LLVMBuildFPToUI (builder, lhs, LLVMInt16Type (), dname), LLVMInt32Type (), "");
2698 case OP_FCONV_TO_I8:
2699 values [ins->dreg] = LLVMBuildFPToSI (builder, lhs, LLVMInt64Type (), dname);
2702 values [ins->dreg] = LLVMBuildFPToSI (builder, lhs, IntPtrType (), dname);
2704 case OP_ICONV_TO_R8:
2705 case OP_LCONV_TO_R8:
2706 values [ins->dreg] = LLVMBuildSIToFP (builder, lhs, LLVMDoubleType (), dname);
2708 case OP_LCONV_TO_R_UN:
2709 values [ins->dreg] = LLVMBuildUIToFP (builder, lhs, LLVMDoubleType (), dname);
2711 #if SIZEOF_VOID_P == 4
2714 case OP_LCONV_TO_I4:
2715 values [ins->dreg] = LLVMBuildTrunc (builder, lhs, LLVMInt32Type (), dname);
2717 case OP_ICONV_TO_R4:
2718 case OP_LCONV_TO_R4:
2719 v = LLVMBuildSIToFP (builder, lhs, LLVMFloatType (), "");
2720 values [ins->dreg] = LLVMBuildFPExt (builder, v, LLVMDoubleType (), dname);
2722 case OP_FCONV_TO_R4:
2723 v = LLVMBuildFPTrunc (builder, lhs, LLVMFloatType (), "");
2724 values [ins->dreg] = LLVMBuildFPExt (builder, v, LLVMDoubleType (), dname);
2727 values [ins->dreg] = LLVMBuildSExt (builder, lhs, LLVMInt64Type (), dname);
2730 values [ins->dreg] = LLVMBuildZExt (builder, lhs, LLVMInt64Type (), dname);
2733 values [ins->dreg] = LLVMBuildTrunc (builder, lhs, LLVMInt32Type (), dname);
2735 case OP_LOCALLOC_IMM: {
2738 guint32 size = ins->inst_imm;
2739 size = (size + (MONO_ARCH_FRAME_ALIGNMENT - 1)) & ~ (MONO_ARCH_FRAME_ALIGNMENT - 1);
2741 v = mono_llvm_build_alloca (builder, LLVMInt8Type (), LLVMConstInt (LLVMInt32Type (), size, FALSE), MONO_ARCH_FRAME_ALIGNMENT, "");
2743 if (ins->flags & MONO_INST_INIT) {
2744 LLVMValueRef args [5];
2747 args [1] = LLVMConstInt (LLVMInt8Type (), 0, FALSE);
2748 args [2] = LLVMConstInt (LLVMInt32Type (), size, FALSE);
2749 args [3] = LLVMConstInt (LLVMInt32Type (), MONO_ARCH_FRAME_ALIGNMENT, FALSE);
2750 args [4] = LLVMConstInt (LLVMInt1Type (), 0, FALSE);
2751 LLVMBuildCall (builder, LLVMGetNamedFunction (module, memset_func_name), args, memset_param_count, "");
2754 values [ins->dreg] = v;
2758 LLVMValueRef v, size;
2760 size = LLVMBuildAnd (builder, LLVMBuildAdd (builder, lhs, LLVMConstInt (LLVMInt32Type (), MONO_ARCH_FRAME_ALIGNMENT - 1, FALSE), ""), LLVMConstInt (LLVMInt32Type (), ~ (MONO_ARCH_FRAME_ALIGNMENT - 1), FALSE), "");
2762 v = mono_llvm_build_alloca (builder, LLVMInt8Type (), size, MONO_ARCH_FRAME_ALIGNMENT, "");
2764 if (ins->flags & MONO_INST_INIT) {
2765 LLVMValueRef args [5];
2768 args [1] = LLVMConstInt (LLVMInt8Type (), 0, FALSE);
2770 args [3] = LLVMConstInt (LLVMInt32Type (), MONO_ARCH_FRAME_ALIGNMENT, FALSE);
2771 args [4] = LLVMConstInt (LLVMInt1Type (), 0, FALSE);
2772 LLVMBuildCall (builder, LLVMGetNamedFunction (module, memset_func_name), args, memset_param_count, "");
2774 values [ins->dreg] = v;
2778 case OP_LOADI1_MEMBASE:
2779 case OP_LOADU1_MEMBASE:
2780 case OP_LOADI2_MEMBASE:
2781 case OP_LOADU2_MEMBASE:
2782 case OP_LOADI4_MEMBASE:
2783 case OP_LOADU4_MEMBASE:
2784 case OP_LOADI8_MEMBASE:
2785 case OP_LOADR4_MEMBASE:
2786 case OP_LOADR8_MEMBASE:
2787 case OP_LOAD_MEMBASE:
2795 LLVMValueRef index, addr;
2797 gboolean sext = FALSE, zext = FALSE;
2798 gboolean is_volatile = (ins->flags & MONO_INST_FAULT);
2800 t = load_store_to_llvm_type (ins->opcode, &size, &sext, &zext);
2805 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)) {
2806 addr = LLVMConstInt (IntPtrType (), ins->inst_imm, FALSE);
2807 } else if (ins->inst_offset == 0) {
2808 addr = values [ins->inst_basereg];
2809 } else if (ins->inst_offset % size != 0) {
2810 /* Unaligned load */
2811 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset, FALSE);
2812 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_basereg], LLVMPointerType (LLVMInt8Type (), 0)), &index, 1, "");
2814 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);
2815 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_basereg], LLVMPointerType (t, 0)), &index, 1, "");
2818 addr = convert (ctx, addr, LLVMPointerType (t, 0));
2820 values [ins->dreg] = emit_load (ctx, bb, &builder, size, addr, dname, is_volatile);
2823 values [ins->dreg] = LLVMBuildSExt (builder, values [ins->dreg], LLVMInt32Type (), dname);
2825 values [ins->dreg] = LLVMBuildZExt (builder, values [ins->dreg], LLVMInt32Type (), dname);
2826 else if (ins->opcode == OP_LOADR4_MEMBASE)
2827 values [ins->dreg] = LLVMBuildFPExt (builder, values [ins->dreg], LLVMDoubleType (), dname);
2831 case OP_STOREI1_MEMBASE_REG:
2832 case OP_STOREI2_MEMBASE_REG:
2833 case OP_STOREI4_MEMBASE_REG:
2834 case OP_STOREI8_MEMBASE_REG:
2835 case OP_STORER4_MEMBASE_REG:
2836 case OP_STORER8_MEMBASE_REG:
2837 case OP_STORE_MEMBASE_REG: {
2839 LLVMValueRef index, addr;
2841 gboolean sext = FALSE, zext = FALSE;
2842 gboolean is_volatile = (ins->flags & MONO_INST_FAULT);
2844 if (!values [ins->inst_destbasereg])
2845 LLVM_FAILURE (ctx, "inst_destbasereg");
2847 t = load_store_to_llvm_type (ins->opcode, &size, &sext, &zext);
2849 if (ins->inst_offset % size != 0) {
2850 /* Unaligned store */
2851 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset, FALSE);
2852 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_destbasereg], LLVMPointerType (LLVMInt8Type (), 0)), &index, 1, "");
2854 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);
2855 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_destbasereg], LLVMPointerType (t, 0)), &index, 1, "");
2857 emit_store (ctx, bb, &builder, size, convert (ctx, values [ins->sreg1], t), convert (ctx, addr, LLVMPointerType (t, 0)), is_volatile);
2861 case OP_STOREI1_MEMBASE_IMM:
2862 case OP_STOREI2_MEMBASE_IMM:
2863 case OP_STOREI4_MEMBASE_IMM:
2864 case OP_STOREI8_MEMBASE_IMM:
2865 case OP_STORE_MEMBASE_IMM: {
2867 LLVMValueRef index, addr;
2869 gboolean sext = FALSE, zext = FALSE;
2870 gboolean is_volatile = (ins->flags & MONO_INST_FAULT);
2872 t = load_store_to_llvm_type (ins->opcode, &size, &sext, &zext);
2874 if (ins->inst_offset % size != 0) {
2875 /* Unaligned store */
2876 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset, FALSE);
2877 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_destbasereg], LLVMPointerType (LLVMInt8Type (), 0)), &index, 1, "");
2879 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);
2880 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_destbasereg], LLVMPointerType (t, 0)), &index, 1, "");
2882 emit_store (ctx, bb, &builder, size, convert (ctx, LLVMConstInt (IntPtrType (), ins->inst_imm, FALSE), t), addr, is_volatile);
2887 emit_load (ctx, bb, &builder, sizeof (gpointer), convert (ctx, values [ins->sreg1], LLVMPointerType (IntPtrType (), 0)), "", TRUE);
2889 case OP_OUTARG_VTRETADDR:
2896 case OP_VOIDCALL_MEMBASE:
2897 case OP_CALL_MEMBASE:
2898 case OP_LCALL_MEMBASE:
2899 case OP_FCALL_MEMBASE:
2900 case OP_VCALL_MEMBASE:
2901 case OP_VOIDCALL_REG:
2905 case OP_VCALL_REG: {
2906 process_call (ctx, bb, &builder, ins);
2907 CHECK_FAILURE (ctx);
2912 LLVMValueRef indexes [2];
2914 LLVMValueRef got_entry_addr;
2917 * FIXME: Can't allocate from the cfg mempool since that is freed if
2918 * the LLVM compile fails.
2920 ji = g_new0 (MonoJumpInfo, 1);
2921 ji->type = (MonoJumpInfoType)ins->inst_i1;
2922 ji->data.target = ins->inst_p0;
2924 ji = mono_aot_patch_info_dup (ji);
2926 ji->next = cfg->patch_info;
2927 cfg->patch_info = ji;
2929 //mono_add_patch_info (cfg, 0, (MonoJumpInfoType)ins->inst_i1, ins->inst_p0);
2930 got_offset = mono_aot_get_got_offset (cfg->patch_info);
2932 indexes [0] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
2933 indexes [1] = LLVMConstInt (LLVMInt32Type (), (gssize)got_offset, FALSE);
2934 got_entry_addr = LLVMBuildGEP (builder, ctx->lmodule->got_var, indexes, 2, "");
2936 // FIXME: This doesn't work right now, because it must be
2937 // paired with an invariant.end, and even then, its only in effect
2938 // inside its basic block
2941 LLVMValueRef args [3];
2942 LLVMValueRef ptr, val;
2944 ptr = LLVMBuildBitCast (builder, got_entry_addr, LLVMPointerType (LLVMInt8Type (), 0), "ptr");
2946 args [0] = LLVMConstInt (LLVMInt64Type (), sizeof (gpointer), FALSE);
2948 val = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.invariant.start"), args, 2, "");
2952 values [ins->dreg] = LLVMBuildLoad (builder, got_entry_addr, dname);
2955 case OP_NOT_REACHED:
2956 LLVMBuildUnreachable (builder);
2957 has_terminator = TRUE;
2958 g_assert (bb->block_num < cfg->max_block_num);
2959 ctx->unreachable [bb->block_num] = TRUE;
2960 /* Might have instructions after this */
2962 MonoInst *next = ins->next;
2964 * FIXME: If later code uses the regs defined by these instructions,
2965 * compilation will fail.
2967 MONO_DELETE_INS (bb, next);
2971 MonoInst *var = ins->inst_p0;
2973 values [ins->dreg] = addresses [var->dreg];
2977 LLVMValueRef args [1];
2979 args [0] = convert (ctx, lhs, LLVMDoubleType ());
2980 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.sin.f64"), args, 1, dname);
2984 LLVMValueRef args [1];
2986 args [0] = convert (ctx, lhs, LLVMDoubleType ());
2987 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.cos.f64"), args, 1, dname);
2991 LLVMValueRef args [1];
2994 * LLVM optimizes sqrt(nan) into undefined in
2995 * lib/Analysis/ConstantFolding.cpp
2996 * Also, sqrt(NegativeInfinity) is optimized into 0.
2998 LLVM_FAILURE (ctx, "sqrt");
3000 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.sqrt.f64"), args, 1, dname);
3004 LLVMValueRef args [1];
3007 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "fabs"), args, 1, dname);
3021 lhs = convert (ctx, lhs, regtype_to_llvm_type (spec [MONO_INST_DEST]));
3022 rhs = convert (ctx, rhs, regtype_to_llvm_type (spec [MONO_INST_DEST]));
3024 switch (ins->opcode) {
3027 v = LLVMBuildICmp (builder, LLVMIntSLE, lhs, rhs, "");
3031 v = LLVMBuildICmp (builder, LLVMIntSGE, lhs, rhs, "");
3035 v = LLVMBuildICmp (builder, LLVMIntULE, lhs, rhs, "");
3039 v = LLVMBuildICmp (builder, LLVMIntUGE, lhs, rhs, "");
3042 g_assert_not_reached ();
3045 values [ins->dreg] = LLVMBuildSelect (builder, v, lhs, rhs, dname);
3048 case OP_ATOMIC_EXCHANGE_I4: {
3049 LLVMValueRef args [2];
3051 g_assert (ins->inst_offset == 0);
3053 args [0] = convert (ctx, lhs, LLVMPointerType (LLVMInt32Type (), 0));
3055 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.atomic.swap.i32.p0i32"), args, 2, dname);
3058 case OP_ATOMIC_EXCHANGE_I8: {
3059 LLVMValueRef args [2];
3061 g_assert (ins->inst_offset == 0);
3063 args [0] = convert (ctx, lhs, LLVMPointerType (LLVMInt64Type (), 0));
3064 args [1] = convert (ctx, rhs, LLVMInt64Type ());
3065 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.atomic.swap.i64.p0i64"), args, 2, dname);
3068 case OP_ATOMIC_ADD_NEW_I4: {
3069 LLVMValueRef args [2];
3071 g_assert (ins->inst_offset == 0);
3073 args [0] = convert (ctx, lhs, LLVMPointerType (LLVMInt32Type (), 0));
3075 values [ins->dreg] = LLVMBuildAdd (builder, LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.atomic.load.add.i32.p0i32"), args, 2, ""), args [1], dname);
3078 case OP_ATOMIC_ADD_NEW_I8: {
3079 LLVMValueRef args [2];
3081 g_assert (ins->inst_offset == 0);
3083 args [0] = convert (ctx, lhs, LLVMPointerType (LLVMInt64Type (), 0));
3084 args [1] = convert (ctx, rhs, LLVMInt64Type ());
3085 values [ins->dreg] = LLVMBuildAdd (builder, LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.atomic.load.add.i64.p0i64"), args, 2, ""), args [1], dname);
3088 case OP_ATOMIC_CAS_I4:
3089 case OP_ATOMIC_CAS_I8: {
3090 LLVMValueRef args [3];
3092 const char *intrins;
3094 if (ins->opcode == OP_ATOMIC_CAS_I4) {
3095 t = LLVMInt32Type ();
3096 intrins = "llvm.atomic.cmp.swap.i32.p0i32";
3098 t = LLVMInt64Type ();
3099 intrins = "llvm.atomic.cmp.swap.i64.p0i64";
3102 args [0] = convert (ctx, lhs, LLVMPointerType (t, 0));
3104 args [1] = convert (ctx, values [ins->sreg3], t);
3106 args [2] = convert (ctx, values [ins->sreg2], t);
3107 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, intrins), args, 3, dname);
3110 case OP_MEMORY_BARRIER: {
3111 LLVMValueRef args [5];
3114 /* Not yet supported by llc on arm */
3115 LLVM_FAILURE (ctx, "memory-barrier+arm");
3118 for (i = 0; i < 5; ++i)
3119 args [i] = LLVMConstInt (LLVMInt1Type (), TRUE, TRUE);
3121 LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.memory.barrier"), args, 5, "");
3124 case OP_RELAXED_NOP: {
3125 #if defined(TARGET_AMD64) || defined(TARGET_X86)
3126 /* No way to get LLVM to emit this */
3127 LLVM_FAILURE (ctx, "relaxed_nop");
3133 #if defined(TARGET_AMD64) || defined(TARGET_X86)
3135 // 257 == FS segment register
3136 LLVMTypeRef ptrtype = LLVMPointerType (IntPtrType (), 257);
3138 // 256 == GS segment register
3139 LLVMTypeRef ptrtype = LLVMPointerType (IntPtrType (), 256);
3143 values [ins->dreg] = LLVMBuildLoad (builder, LLVMBuildIntToPtr (builder, LLVMConstInt (IntPtrType (), ins->inst_offset, TRUE), ptrtype, ""), "");
3145 LLVM_FAILURE (ctx, "opcode tls-get");
3155 case OP_IADD_OVF_UN:
3157 case OP_ISUB_OVF_UN:
3159 case OP_IMUL_OVF_UN:
3160 #if SIZEOF_VOID_P == 8
3162 case OP_LADD_OVF_UN:
3164 case OP_LSUB_OVF_UN:
3166 case OP_LMUL_OVF_UN:
3169 LLVMValueRef args [2], val, ovf, func;
3171 args [0] = convert (ctx, lhs, op_to_llvm_type (ins->opcode));
3172 args [1] = convert (ctx, rhs, op_to_llvm_type (ins->opcode));
3173 func = LLVMGetNamedFunction (module, ovf_op_to_intrins (ins->opcode));
3175 val = LLVMBuildCall (builder, func, args, 2, "");
3176 values [ins->dreg] = LLVMBuildExtractValue (builder, val, 0, dname);
3177 ovf = LLVMBuildExtractValue (builder, val, 1, "");
3178 emit_cond_system_exception (ctx, bb, "OverflowException", ovf);
3179 CHECK_FAILURE (ctx);
3180 builder = ctx->builder;
3186 * We currently model them using arrays. Promotion to local vregs is
3187 * disabled for them in mono_handle_global_vregs () in the LLVM case,
3188 * so we always have an entry in cfg->varinfo for them.
3189 * FIXME: Is this needed ?
3192 MonoClass *klass = ins->klass;
3193 LLVMValueRef args [5];
3197 LLVM_FAILURE (ctx, "!klass");
3201 if (!addresses [ins->dreg])
3202 addresses [ins->dreg] = build_alloca (ctx, &klass->byval_arg);
3203 args [0] = LLVMBuildBitCast (builder, addresses [ins->dreg], LLVMPointerType (LLVMInt8Type (), 0), "");
3204 args [1] = LLVMConstInt (LLVMInt8Type (), 0, FALSE);
3205 args [2] = LLVMConstInt (LLVMInt32Type (), mono_class_value_size (klass, NULL), FALSE);
3207 args [3] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
3208 args [4] = LLVMConstInt (LLVMInt1Type (), 0, FALSE);
3209 LLVMBuildCall (builder, LLVMGetNamedFunction (module, memset_func_name), args, memset_param_count, "");
3213 case OP_STOREV_MEMBASE:
3214 case OP_LOADV_MEMBASE:
3216 MonoClass *klass = ins->klass;
3217 LLVMValueRef src, dst, args [5];
3218 gboolean done = FALSE;
3222 LLVM_FAILURE (ctx, "!klass");
3226 switch (ins->opcode) {
3227 case OP_STOREV_MEMBASE:
3228 if (!addresses [ins->sreg1]) {
3230 g_assert (values [ins->sreg1]);
3231 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));
3232 LLVMBuildStore (builder, values [ins->sreg1], dst);
3235 src = LLVMBuildBitCast (builder, addresses [ins->sreg1], LLVMPointerType (LLVMInt8Type (), 0), "");
3236 dst = convert (ctx, LLVMBuildAdd (builder, convert (ctx, values [ins->inst_destbasereg], IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_offset, FALSE), ""), LLVMPointerType (LLVMInt8Type (), 0));
3239 case OP_LOADV_MEMBASE:
3240 if (!addresses [ins->dreg])
3241 addresses [ins->dreg] = build_alloca (ctx, &klass->byval_arg);
3242 src = convert (ctx, LLVMBuildAdd (builder, convert (ctx, values [ins->inst_basereg], IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_offset, FALSE), ""), LLVMPointerType (LLVMInt8Type (), 0));
3243 dst = LLVMBuildBitCast (builder, addresses [ins->dreg], LLVMPointerType (LLVMInt8Type (), 0), "");
3246 if (!addresses [ins->sreg1])
3247 addresses [ins->sreg1] = build_alloca (ctx, &klass->byval_arg);
3248 if (!addresses [ins->dreg])
3249 addresses [ins->dreg] = build_alloca (ctx, &klass->byval_arg);
3250 src = LLVMBuildBitCast (builder, addresses [ins->sreg1], LLVMPointerType (LLVMInt8Type (), 0), "");
3251 dst = LLVMBuildBitCast (builder, addresses [ins->dreg], LLVMPointerType (LLVMInt8Type (), 0), "");
3254 g_assert_not_reached ();
3262 args [2] = LLVMConstInt (LLVMInt32Type (), mono_class_value_size (klass, NULL), FALSE);
3263 args [3] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
3265 args [3] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
3266 args [4] = LLVMConstInt (LLVMInt1Type (), 0, FALSE);
3267 LLVMBuildCall (builder, LLVMGetNamedFunction (module, memcpy_func_name), args, memcpy_param_count, "");
3270 case OP_LLVM_OUTARG_VT:
3271 if (!addresses [ins->sreg1]) {
3272 addresses [ins->sreg1] = build_alloca (ctx, &ins->klass->byval_arg);
3273 g_assert (values [ins->sreg1]);
3274 LLVMBuildStore (builder, values [ins->sreg1], addresses [ins->sreg1]);
3276 addresses [ins->dreg] = addresses [ins->sreg1];
3282 #if defined(TARGET_X86) || defined(TARGET_AMD64)
3284 values [ins->dreg] = LLVMConstNull (type_to_llvm_type (ctx, &ins->klass->byval_arg));
3287 case OP_LOADX_MEMBASE: {
3288 LLVMTypeRef t = type_to_llvm_type (ctx, &ins->klass->byval_arg);
3291 src = convert (ctx, LLVMBuildAdd (builder, convert (ctx, values [ins->inst_basereg], IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_offset, FALSE), ""), LLVMPointerType (t, 0));
3292 values [ins->dreg] = mono_llvm_build_aligned_load (builder, src, "", FALSE, 1);
3299 values [ins->dreg] = LLVMBuildAdd (builder, lhs, rhs, "");
3303 values [ins->dreg] = LLVMBuildFAdd (builder, lhs, rhs, "");
3309 values [ins->dreg] = LLVMBuildSub (builder, lhs, rhs, "");
3313 values [ins->dreg] = LLVMBuildFSub (builder, lhs, rhs, "");
3317 values [ins->dreg] = LLVMBuildFMul (builder, lhs, rhs, "");
3321 values [ins->dreg] = LLVMBuildFDiv (builder, lhs, rhs, "");
3324 values [ins->dreg] = LLVMBuildAnd (builder, lhs, rhs, "");
3327 values [ins->dreg] = LLVMBuildOr (builder, lhs, rhs, "");
3330 values [ins->dreg] = LLVMBuildXor (builder, lhs, rhs, "");
3343 switch (ins->opcode) {
3348 t = LLVMVectorType (LLVMInt32Type (), 4);
3349 rt = LLVMVectorType (LLVMFloatType (), 4);
3355 t = LLVMVectorType (LLVMInt64Type (), 2);
3356 rt = LLVMVectorType (LLVMDoubleType (), 2);
3359 t = LLVMInt32Type ();
3360 rt = LLVMInt32Type ();
3361 g_assert_not_reached ();
3364 lhs = LLVMBuildBitCast (builder, lhs, t, "");
3365 rhs = LLVMBuildBitCast (builder, rhs, t, "");
3366 switch (ins->opcode) {
3369 v = LLVMBuildAnd (builder, lhs, rhs, "");
3373 v = LLVMBuildOr (builder, lhs, rhs, "");
3377 v = LLVMBuildXor (builder, lhs, rhs, "");
3381 v = LLVMBuildAnd (builder, rhs, LLVMBuildNot (builder, lhs, ""), "");
3384 values [ins->dreg] = LLVMBuildBitCast (builder, v, rt, "");
3397 LLVMValueRef args [2];
3402 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, simd_op_to_intrins (ins->opcode)), args, 2, dname);
3411 case OP_EXTRACT_U1: {
3413 gboolean zext = FALSE;
3415 switch (ins->opcode) {
3417 t = LLVMVectorType (LLVMDoubleType (), 2);
3420 t = LLVMVectorType (LLVMInt64Type (), 2);
3423 t = LLVMVectorType (LLVMInt32Type (), 4);
3426 t = LLVMVectorType (LLVMInt16Type (), 8);
3429 t = LLVMVectorType (LLVMInt16Type (), 8);
3433 t = LLVMVectorType (LLVMInt8Type (), 16);
3436 t = LLVMVectorType (LLVMInt8Type (), 16);
3440 t = LLVMInt32Type ();
3441 g_assert_not_reached ();
3444 lhs = LLVMBuildBitCast (builder, lhs, t, "");
3445 values [ins->dreg] = LLVMBuildExtractElement (builder, lhs, LLVMConstInt (LLVMInt32Type (), ins->inst_c0, FALSE), "");
3447 values [ins->dreg] = LLVMBuildZExt (builder, values [ins->dreg], LLVMInt32Type (), "");
3456 * EXCEPTION HANDLING
3458 case OP_IMPLICIT_EXCEPTION:
3459 /* This marks a place where an implicit exception can happen */
3460 if (bb->region != -1)
3461 LLVM_FAILURE (ctx, "implicit-exception");
3465 MonoMethodSignature *throw_sig;
3466 LLVMValueRef callee, arg;
3467 gboolean rethrow = (ins->opcode == OP_RETHROW);
3468 const char *icall_name;
3470 callee = rethrow ? ctx->lmodule->rethrow : ctx->lmodule->throw;
3471 icall_name = rethrow ? "mono_arch_rethrow_exception" : "mono_arch_throw_exception";
3474 throw_sig = mono_metadata_signature_alloc (mono_get_corlib (), 1);
3475 throw_sig->ret = &mono_get_void_class ()->byval_arg;
3476 throw_sig->params [0] = &mono_get_object_class ()->byval_arg;
3477 if (cfg->compile_aot) {
3478 callee = get_plt_entry (ctx, sig_to_llvm_sig (ctx, throw_sig), MONO_PATCH_INFO_INTERNAL_METHOD, icall_name);
3480 callee = LLVMAddFunction (module, icall_name, sig_to_llvm_sig (ctx, throw_sig));
3484 * LLVM doesn't push the exception argument, so we need a different
3487 LLVMAddGlobalMapping (ee, callee, resolve_patch (cfg, MONO_PATCH_INFO_INTERNAL_METHOD, rethrow ? "llvm_rethrow_exception_trampoline" : "llvm_throw_exception_trampoline"));
3489 LLVMAddGlobalMapping (ee, callee, resolve_patch (cfg, MONO_PATCH_INFO_INTERNAL_METHOD, icall_name));
3493 mono_memory_barrier ();
3495 ctx->lmodule->rethrow = callee;
3497 ctx->lmodule->throw = callee;
3499 arg = convert (ctx, values [ins->sreg1], type_to_llvm_type (ctx, &mono_get_object_class ()->byval_arg));
3500 emit_call (ctx, bb, &builder, callee, &arg, 1);
3503 case OP_CALL_HANDLER: {
3505 * We don't 'call' handlers, but instead simply branch to them.
3506 * The code generated by ENDFINALLY will branch back to us.
3508 LLVMBasicBlockRef noex_bb;
3510 BBInfo *info = &bblocks [ins->inst_target_bb->block_num];
3512 bb_list = info->call_handler_return_bbs;
3515 * Set the indicator variable for the finally clause.
3517 lhs = info->finally_ind;
3519 LLVMBuildStore (builder, LLVMConstInt (LLVMInt32Type (), g_slist_length (bb_list) + 1, FALSE), lhs);
3521 /* Branch to the finally clause */
3522 LLVMBuildBr (builder, info->call_handler_target_bb);
3524 noex_bb = gen_bb (ctx, "CALL_HANDLER_CONT_BB");
3525 info->call_handler_return_bbs = g_slist_append_mempool (cfg->mempool, info->call_handler_return_bbs, noex_bb);
3527 builder = ctx->builder = create_builder (ctx);
3528 LLVMPositionBuilderAtEnd (ctx->builder, noex_bb);
3530 bblocks [bb->block_num].end_bblock = noex_bb;
3533 case OP_START_HANDLER: {
3536 case OP_ENDFINALLY: {
3537 LLVMBasicBlockRef resume_bb;
3538 MonoBasicBlock *handler_bb;
3539 LLVMValueRef val, switch_ins, callee;
3543 handler_bb = g_hash_table_lookup (ctx->region_to_handler, GUINT_TO_POINTER (mono_get_block_region_notry (cfg, bb->region)));
3544 g_assert (handler_bb);
3545 info = &bblocks [handler_bb->block_num];
3546 lhs = info->finally_ind;
3549 bb_list = info->call_handler_return_bbs;
3551 resume_bb = gen_bb (ctx, "ENDFINALLY_RESUME_BB");
3553 /* Load the finally variable */
3554 val = LLVMBuildLoad (builder, lhs, "");
3556 /* Reset the variable */
3557 LLVMBuildStore (builder, LLVMConstInt (LLVMInt32Type (), 0, FALSE), lhs);
3559 /* Branch to either resume_bb, or to the bblocks in bb_list */
3560 switch_ins = LLVMBuildSwitch (builder, val, resume_bb, g_slist_length (bb_list));
3562 * The other targets are added at the end to handle OP_CALL_HANDLER
3563 * opcodes processed later.
3565 info->endfinally_switch_ins_list = g_slist_append_mempool (cfg->mempool, info->endfinally_switch_ins_list, switch_ins);
3567 builder = ctx->builder = create_builder (ctx);
3568 LLVMPositionBuilderAtEnd (ctx->builder, resume_bb);
3570 if (ctx->cfg->compile_aot) {
3571 callee = get_plt_entry (ctx, LLVMFunctionType (LLVMVoidType (), NULL, 0, FALSE), MONO_PATCH_INFO_INTERNAL_METHOD, "llvm_resume_unwind_trampoline");
3573 callee = LLVMGetNamedFunction (module, "llvm_resume_unwind_trampoline");
3575 LLVMBuildCall (builder, callee, NULL, 0, "");
3577 LLVMBuildUnreachable (builder);
3578 has_terminator = TRUE;
3584 sprintf (reason, "opcode %s", mono_inst_name (ins->opcode));
3585 LLVM_FAILURE (ctx, reason);
3590 /* Convert the value to the type required by phi nodes */
3591 if (spec [MONO_INST_DEST] != ' ' && !MONO_IS_STORE_MEMBASE (ins) && ctx->vreg_types [ins->dreg]) {
3592 if (!values [ins->dreg])
3594 values [ins->dreg] = addresses [ins->dreg];
3596 values [ins->dreg] = convert (ctx, values [ins->dreg], ctx->vreg_types [ins->dreg]);
3599 /* Add stores for volatile variables */
3600 if (spec [MONO_INST_DEST] != ' ' && spec [MONO_INST_DEST] != 'v' && !MONO_IS_STORE_MEMBASE (ins))
3601 emit_volatile_store (ctx, ins->dreg);
3604 if (!has_terminator && bb->next_bb && (bb == cfg->bb_entry || bb->in_count > 0))
3605 LLVMBuildBr (builder, get_bb (ctx, bb->next_bb));
3607 if (bb == cfg->bb_exit && sig->ret->type == MONO_TYPE_VOID)
3608 LLVMBuildRetVoid (builder);
3610 if (bb == cfg->bb_entry)
3611 ctx->last_alloca = LLVMGetLastInstruction (get_bb (ctx, cfg->bb_entry));
3620 * mono_llvm_check_method_supported:
3622 * Do some quick checks to decide whenever cfg->method can be compiled by LLVM, to avoid
3623 * compiling a method twice.
3626 mono_llvm_check_method_supported (MonoCompile *cfg)
3629 MonoMethodHeader *header = cfg->header;
3630 MonoExceptionClause *clause;
3634 if (cfg->generic_sharing_context && !IS_LLVM_MONO_BRANCH) {
3635 /* No way to obtain location info for this/rgctx */
3636 cfg->exception_message = g_strdup ("gshared");
3637 cfg->disable_llvm = TRUE;
3640 if (cfg->method->save_lmf) {
3641 cfg->exception_message = g_strdup ("lmf");
3642 cfg->disable_llvm = TRUE;
3645 if (!LLVM_CHECK_VERSION (2, 8)) {
3647 * FIXME: LLLVM 2.6 no longer seems to generate correct exception info
3650 cfg->exception_message = g_strdup ("clauses");
3651 cfg->disable_llvm = TRUE;
3655 for (i = 0; i < header->num_clauses; ++i) {
3656 clause = &header->clauses [i];
3658 if (i > 0 && clause->try_offset <= header->clauses [i - 1].handler_offset + header->clauses [i - 1].handler_len) {
3660 * FIXME: Some tests still fail with nested clauses.
3662 cfg->exception_message = g_strdup ("nested clauses");
3663 cfg->disable_llvm = TRUE;
3669 if (cfg->method->dynamic) {
3670 cfg->exception_message = g_strdup ("dynamic.");
3671 cfg->disable_llvm = TRUE;
3676 * mono_llvm_emit_method:
3678 * Emit LLVM IL from the mono IL, and compile it to native code using LLVM.
3681 mono_llvm_emit_method (MonoCompile *cfg)
3684 MonoMethodSignature *sig;
3686 LLVMTypeRef method_type;
3687 LLVMValueRef method = NULL, debug_alias = NULL;
3688 char *method_name, *debug_name = NULL;
3689 LLVMValueRef *values;
3690 int i, max_block_num, bb_index;
3691 gboolean last = FALSE;
3692 GPtrArray *phi_values;
3693 LLVMCallInfo *linfo;
3695 LLVMModuleRef module;
3697 GPtrArray *bblock_list;
3698 MonoMethodHeader *header;
3699 MonoExceptionClause *clause;
3702 /* The code below might acquire the loader lock, so use it for global locking */
3703 mono_loader_lock ();
3705 /* Used to communicate with the callbacks */
3706 TlsSetValue (current_cfg_tls_id, cfg);
3708 ctx = g_new0 (EmitContext, 1);
3710 ctx->mempool = cfg->mempool;
3713 * This maps vregs to the LLVM instruction defining them
3715 values = g_new0 (LLVMValueRef, cfg->next_vreg);
3717 * This maps vregs for volatile variables to the LLVM instruction defining their
3720 ctx->addresses = g_new0 (LLVMValueRef, cfg->next_vreg);
3721 ctx->vreg_types = g_new0 (LLVMTypeRef, cfg->next_vreg);
3722 ctx->vreg_cli_types = g_new0 (MonoType*, cfg->next_vreg);
3723 phi_values = g_ptr_array_new ();
3725 * This signals whenever the vreg was defined by a phi node with no input vars
3726 * (i.e. all its input bblocks end with NOT_REACHABLE).
3728 ctx->is_dead = g_new0 (gboolean, cfg->next_vreg);
3729 /* Whenever the bblock is unreachable */
3730 ctx->unreachable = g_new0 (gboolean, cfg->max_block_num);
3732 bblock_list = g_ptr_array_new ();
3734 ctx->values = values;
3735 ctx->region_to_handler = g_hash_table_new (NULL, NULL);
3737 if (cfg->compile_aot) {
3738 ctx->lmodule = &aot_module;
3739 method_name = mono_aot_get_method_name (cfg);
3740 debug_name = mono_aot_get_method_debug_name (cfg);
3743 ctx->lmodule = &jit_module;
3744 method_name = mono_method_full_name (cfg->method, TRUE);
3748 module = ctx->module = ctx->lmodule->module;
3752 static int count = 0;
3755 if (getenv ("LLVM_COUNT")) {
3756 if (count == atoi (getenv ("LLVM_COUNT"))) {
3757 printf ("LAST: %s\n", mono_method_full_name (cfg->method, TRUE));
3761 if (count > atoi (getenv ("LLVM_COUNT")))
3762 LLVM_FAILURE (ctx, "");
3767 sig = mono_method_signature (cfg->method);
3770 linfo = mono_arch_get_llvm_call_info (cfg, sig);
3772 CHECK_FAILURE (ctx);
3774 if (cfg->rgctx_var) {
3775 if (IS_LLVM_MONO_BRANCH)
3776 linfo->rgctx_arg = TRUE;
3778 LLVM_FAILURE (ctx, "rgctx arg");
3780 method_type = sig_to_llvm_sig_full (ctx, sig, linfo, &sinfo);
3781 CHECK_FAILURE (ctx);
3784 * This maps parameter indexes in the original signature to the indexes in
3785 * the LLVM signature.
3787 ctx->pindexes = sinfo.pindexes;
3789 method = LLVMAddFunction (module, method_name, method_type);
3790 ctx->lmethod = method;
3792 #ifdef LLVM_MONO_BRANCH
3793 if (linfo->rgctx_arg)
3794 LLVMSetFunctionCallConv (method, LLVMMono1CallConv);
3796 LLVMSetLinkage (method, LLVMPrivateLinkage);
3798 if (cfg->method->save_lmf)
3799 LLVM_FAILURE (ctx, "lmf");
3802 LLVM_FAILURE (ctx, "pinvoke signature");
3804 header = cfg->header;
3805 for (i = 0; i < header->num_clauses; ++i) {
3806 clause = &header->clauses [i];
3807 if (clause->flags != MONO_EXCEPTION_CLAUSE_FINALLY && clause->flags != MONO_EXCEPTION_CLAUSE_NONE)
3808 LLVM_FAILURE (ctx, "non-finally/catch clause.");
3811 if (linfo->rgctx_arg) {
3812 ctx->rgctx_arg = LLVMGetParam (method, sinfo.rgctx_arg_pindex);
3814 * We mark the rgctx parameter with the inreg attribute, which is mapped to
3815 * MONO_ARCH_RGCTX_REG in the Mono calling convention in llvm, i.e.
3816 * CC_X86_64_Mono in X86CallingConv.td.
3818 LLVMAddAttribute (ctx->rgctx_arg, LLVMInRegAttribute);
3819 LLVMSetValueName (ctx->rgctx_arg, "rgctx");
3821 if (cfg->vret_addr) {
3822 values [cfg->vret_addr->dreg] = LLVMGetParam (method, sinfo.vret_arg_pindex);
3823 LLVMSetValueName (values [cfg->vret_addr->dreg], "vret");
3826 values [cfg->args [0]->dreg] = LLVMGetParam (method, sinfo.this_arg_pindex);
3827 LLVMSetValueName (values [cfg->args [0]->dreg], "this");
3829 for (i = 0; i < sig->param_count; ++i) {
3832 values [cfg->args [i + sig->hasthis]->dreg] = LLVMGetParam (method, sinfo.pindexes [i]);
3833 name = g_strdup_printf ("arg_%d", i);
3834 LLVMSetValueName (values [cfg->args [i + sig->hasthis]->dreg], name);
3836 if (linfo->args [i + sig->hasthis].storage == LLVMArgVtypeByVal)
3837 LLVMAddAttribute (LLVMGetParam (method, sinfo.pindexes [i]), LLVMByValAttribute);
3841 for (bb = cfg->bb_entry; bb; bb = bb->next_bb)
3842 max_block_num = MAX (max_block_num, bb->block_num);
3843 ctx->bblocks = bblocks = g_new0 (BBInfo, max_block_num + 1);
3845 /* Add branches between non-consecutive bblocks */
3846 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
3847 if (bb->last_ins && MONO_IS_COND_BRANCH_OP (bb->last_ins) &&
3848 bb->next_bb != bb->last_ins->inst_false_bb) {
3850 MonoInst *inst = mono_mempool_alloc0 (cfg->mempool, sizeof (MonoInst));
3851 inst->opcode = OP_BR;
3852 inst->inst_target_bb = bb->last_ins->inst_false_bb;
3853 mono_bblock_add_inst (bb, inst);
3858 * The INDIRECT flag added by OP_LDADDR inhibits optimizations, even if the LDADDR
3859 * was later optimized away, so clear these flags, and add them back for the still
3860 * present OP_LDADDR instructions.
3862 for (i = 0; i < cfg->next_vreg; ++i) {
3865 ins = get_vreg_to_inst (cfg, i);
3866 if (ins && ins != cfg->rgctx_var)
3867 ins->flags &= ~MONO_INST_INDIRECT;
3871 * Make a first pass over the code to precreate PHI nodes/set INDIRECT flags.
3873 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
3875 LLVMBuilderRef builder;
3877 char dname_buf[128];
3879 builder = create_builder (ctx);
3881 for (ins = bb->code; ins; ins = ins->next) {
3882 switch (ins->opcode) {
3887 LLVMTypeRef phi_type = llvm_type_to_stack_type (type_to_llvm_type (ctx, &ins->klass->byval_arg));
3889 CHECK_FAILURE (ctx);
3891 if (ins->opcode == OP_VPHI) {
3892 /* Treat valuetype PHI nodes as operating on the address itself */
3893 g_assert (ins->klass);
3894 phi_type = LLVMPointerType (type_to_llvm_type (ctx, &ins->klass->byval_arg), 0);
3898 * Have to precreate these, as they can be referenced by
3899 * earlier instructions.
3901 sprintf (dname_buf, "t%d", ins->dreg);
3903 values [ins->dreg] = LLVMBuildPhi (builder, phi_type, dname);
3905 if (ins->opcode == OP_VPHI)
3906 ctx->addresses [ins->dreg] = values [ins->dreg];
3908 g_ptr_array_add (phi_values, values [ins->dreg]);
3911 * Set the expected type of the incoming arguments since these have
3912 * to have the same type.
3914 for (i = 0; i < ins->inst_phi_args [0]; i++) {
3915 int sreg1 = ins->inst_phi_args [i + 1];
3918 ctx->vreg_types [sreg1] = phi_type;
3923 ((MonoInst*)ins->inst_p0)->flags |= MONO_INST_INDIRECT;
3932 * Create an ordering for bblocks, use the depth first order first, then
3933 * put the exception handling bblocks last.
3935 for (bb_index = 0; bb_index < cfg->num_bblocks; ++bb_index) {
3936 bb = cfg->bblocks [bb_index];
3937 if (!(bb->region != -1 && !MONO_BBLOCK_IS_IN_REGION (bb, MONO_REGION_TRY))) {
3938 g_ptr_array_add (bblock_list, bb);
3939 bblocks [bb->block_num].added = TRUE;
3943 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
3944 if (!bblocks [bb->block_num].added)
3945 g_ptr_array_add (bblock_list, bb);
3949 * Second pass: generate code.
3951 for (bb_index = 0; bb_index < bblock_list->len; ++bb_index) {
3952 bb = g_ptr_array_index (bblock_list, bb_index);
3954 if (!(bb == cfg->bb_entry || bb->in_count > 0))
3957 process_bb (ctx, bb);
3958 CHECK_FAILURE (ctx);
3961 /* Add incoming phi values */
3962 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
3963 GSList *l, *ins_list;
3965 ins_list = bblocks [bb->block_num].phi_nodes;
3967 for (l = ins_list; l; l = l->next) {
3968 PhiNode *node = l->data;
3969 MonoInst *phi = node->phi;
3970 int sreg1 = node->sreg;
3971 LLVMBasicBlockRef in_bb;
3976 in_bb = get_end_bb (ctx, node->in_bb);
3978 if (ctx->unreachable [node->in_bb->block_num])
3981 g_assert (values [sreg1]);
3983 if (phi->opcode == OP_VPHI) {
3984 g_assert (LLVMTypeOf (ctx->addresses [sreg1]) == LLVMTypeOf (values [phi->dreg]));
3985 LLVMAddIncoming (values [phi->dreg], &ctx->addresses [sreg1], &in_bb, 1);
3987 g_assert (LLVMTypeOf (values [sreg1]) == LLVMTypeOf (values [phi->dreg]));
3988 LLVMAddIncoming (values [phi->dreg], &values [sreg1], &in_bb, 1);
3993 /* Create the SWITCH statements for ENDFINALLY instructions */
3994 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
3995 BBInfo *info = &bblocks [bb->block_num];
3997 for (l = info->endfinally_switch_ins_list; l; l = l->next) {
3998 LLVMValueRef switch_ins = l->data;
3999 GSList *bb_list = info->call_handler_return_bbs;
4001 for (i = 0; i < g_slist_length (bb_list); ++i)
4002 LLVMAddCase (switch_ins, LLVMConstInt (LLVMInt32Type (), i + 1, FALSE), g_slist_nth (bb_list, i)->data);
4006 if (cfg->verbose_level > 1)
4007 mono_llvm_dump_value (method);
4009 mark_as_used (module, method);
4011 if (cfg->compile_aot) {
4012 /* Don't generate native code, keep the LLVM IR */
4014 /* Can't delete the method if it has an alias, so only add it if successful */
4016 debug_alias = LLVMAddAlias (module, LLVMTypeOf (method), method, debug_name);
4017 LLVMSetLinkage (debug_alias, LLVMInternalLinkage);
4018 LLVMSetVisibility (debug_alias, LLVMHiddenVisibility);
4021 if (cfg->compile_aot && cfg->verbose_level)
4022 printf ("%s emitted as %s\n", mono_method_full_name (cfg->method, TRUE), method_name);
4024 //LLVMVerifyFunction(method, 0);
4026 mono_llvm_optimize_method (method);
4028 if (cfg->verbose_level > 1)
4029 mono_llvm_dump_value (method);
4031 cfg->native_code = LLVMGetPointerToGlobal (ee, method);
4033 /* Set by emit_cb */
4034 g_assert (cfg->code_len);
4036 /* FIXME: Free the LLVM IL for the function */
4044 /* Need to add unused phi nodes as they can be referenced by other values */
4045 LLVMBasicBlockRef phi_bb = LLVMAppendBasicBlock (method, "PHI_BB");
4046 LLVMBuilderRef builder;
4048 builder = create_builder (ctx);
4049 LLVMPositionBuilderAtEnd (builder, phi_bb);
4051 for (i = 0; i < phi_values->len; ++i) {
4052 LLVMValueRef v = g_ptr_array_index (phi_values, i);
4053 if (LLVMGetInstructionParent (v) == NULL)
4054 LLVMInsertIntoBuilder (builder, v);
4057 LLVMDeleteFunction (method);
4062 g_free (ctx->addresses);
4063 g_free (ctx->vreg_types);
4064 g_free (ctx->vreg_cli_types);
4065 g_free (ctx->pindexes);
4066 g_free (ctx->is_dead);
4067 g_free (ctx->unreachable);
4068 g_free (debug_name);
4069 g_ptr_array_free (phi_values, TRUE);
4070 g_free (ctx->bblocks);
4071 g_hash_table_destroy (ctx->region_to_handler);
4072 g_free (method_name);
4073 g_ptr_array_free (bblock_list, TRUE);
4075 for (l = ctx->builders; l; l = l->next) {
4076 LLVMBuilderRef builder = l->data;
4077 LLVMDisposeBuilder (builder);
4082 TlsSetValue (current_cfg_tls_id, NULL);
4084 mono_loader_unlock ();
4088 * mono_llvm_emit_call:
4090 * Same as mono_arch_emit_call () for LLVM.
4093 mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
4096 MonoMethodSignature *sig;
4097 int i, n, stack_size;
4102 sig = call->signature;
4103 n = sig->param_count + sig->hasthis;
4105 call->cinfo = mono_arch_get_llvm_call_info (cfg, sig);
4107 if (cfg->disable_llvm)
4110 if (sig->call_convention == MONO_CALL_VARARG) {
4111 cfg->exception_message = g_strdup ("varargs");
4112 cfg->disable_llvm = TRUE;
4115 for (i = 0; i < n; ++i) {
4118 ainfo = call->cinfo->args + i;
4120 in = call->args [i];
4122 /* Simply remember the arguments */
4123 switch (ainfo->storage) {
4125 MONO_INST_NEW (cfg, ins, OP_MOVE);
4126 ins->dreg = mono_alloc_ireg (cfg);
4127 ins->sreg1 = in->dreg;
4129 case LLVMArgInFPReg:
4130 MONO_INST_NEW (cfg, ins, OP_FMOVE);
4131 ins->dreg = mono_alloc_freg (cfg);
4132 ins->sreg1 = in->dreg;
4134 case LLVMArgVtypeByVal:
4135 case LLVMArgVtypeInReg:
4136 MONO_INST_NEW (cfg, ins, OP_LLVM_OUTARG_VT);
4137 ins->dreg = mono_alloc_ireg (cfg);
4138 ins->sreg1 = in->dreg;
4139 ins->klass = mono_class_from_mono_type (sig->params [i - sig->hasthis]);
4142 call->cinfo = mono_arch_get_llvm_call_info (cfg, sig);
4143 cfg->exception_message = g_strdup ("ainfo->storage");
4144 cfg->disable_llvm = TRUE;
4148 if (!cfg->disable_llvm) {
4149 MONO_ADD_INS (cfg->cbb, ins);
4150 mono_call_inst_add_outarg_reg (cfg, call, ins->dreg, 0, FALSE);
4155 static unsigned char*
4156 alloc_cb (LLVMValueRef function, int size)
4160 cfg = TlsGetValue (current_cfg_tls_id);
4164 return mono_domain_code_reserve (cfg->domain, size);
4166 return mono_domain_code_reserve (mono_domain_get (), size);
4171 emitted_cb (LLVMValueRef function, void *start, void *end)
4175 cfg = TlsGetValue (current_cfg_tls_id);
4177 cfg->code_len = (guint8*)end - (guint8*)start;
4181 exception_cb (void *data)
4184 MonoJitExceptionInfo *ei;
4185 guint32 ei_len, i, j, nested_len, nindex;
4186 gpointer *type_info;
4187 int this_reg, this_offset;
4189 cfg = TlsGetValue (current_cfg_tls_id);
4193 * data points to a DWARF FDE structure, convert it to our unwind format and
4195 * An alternative would be to save it directly, and modify our unwinder to work
4198 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);
4200 /* Count nested clauses */
4202 for (i = 0; i < ei_len; ++i) {
4203 for (j = 0; j < ei_len; ++j) {
4204 gint32 cindex1 = *(gint32*)type_info [i];
4205 MonoExceptionClause *clause1 = &cfg->header->clauses [cindex1];
4206 gint32 cindex2 = *(gint32*)type_info [j];
4207 MonoExceptionClause *clause2 = &cfg->header->clauses [cindex2];
4209 if (cindex1 != cindex2 && clause1->try_offset >= clause2->try_offset && clause1->handler_offset <= clause2->handler_offset) {
4215 cfg->llvm_ex_info = mono_mempool_alloc0 (cfg->mempool, (ei_len + nested_len) * sizeof (MonoJitExceptionInfo));
4216 cfg->llvm_ex_info_len = ei_len + nested_len;
4217 memcpy (cfg->llvm_ex_info, ei, ei_len * sizeof (MonoJitExceptionInfo));
4218 /* Fill the rest of the information from the type info */
4219 for (i = 0; i < ei_len; ++i) {
4220 gint32 clause_index = *(gint32*)type_info [i];
4221 MonoExceptionClause *clause = &cfg->header->clauses [clause_index];
4223 cfg->llvm_ex_info [i].flags = clause->flags;
4224 cfg->llvm_ex_info [i].data.catch_class = clause->data.catch_class;
4228 * For nested clauses, the LLVM produced exception info associates the try interval with
4229 * the innermost handler, while mono expects it to be associated with all nesting clauses.
4231 /* FIXME: These should be order with the normal clauses */
4233 for (i = 0; i < ei_len; ++i) {
4234 for (j = 0; j < ei_len; ++j) {
4235 gint32 cindex1 = *(gint32*)type_info [i];
4236 MonoExceptionClause *clause1 = &cfg->header->clauses [cindex1];
4237 gint32 cindex2 = *(gint32*)type_info [j];
4238 MonoExceptionClause *clause2 = &cfg->header->clauses [cindex2];
4240 if (cindex1 != cindex2 && clause1->try_offset >= clause2->try_offset && clause1->handler_offset <= clause2->handler_offset) {
4242 * The try interval comes from the nested clause, everything else from the
4245 memcpy (&cfg->llvm_ex_info [nindex], &cfg->llvm_ex_info [j], sizeof (MonoJitExceptionInfo));
4246 cfg->llvm_ex_info [nindex].try_start = cfg->llvm_ex_info [i].try_start;
4247 cfg->llvm_ex_info [nindex].try_end = cfg->llvm_ex_info [i].try_end;
4252 g_assert (nindex == ei_len + nested_len);
4253 cfg->llvm_this_reg = this_reg;
4254 cfg->llvm_this_offset = this_offset;
4261 add_intrinsics (LLVMModuleRef module)
4263 /* Emit declarations of instrinsics */
4265 LLVMTypeRef memset_params [] = { LLVMPointerType (LLVMInt8Type (), 0), LLVMInt8Type (), LLVMInt32Type (), LLVMInt32Type (), LLVMInt1Type () };
4267 if (LLVM_CHECK_VERSION(2, 8)) {
4268 memset_param_count = 5;
4269 memset_func_name = "llvm.memset.p0i8.i32";
4271 memset_param_count = 4;
4272 memset_func_name = "llvm.memset.i32";
4274 LLVMAddFunction (module, memset_func_name, LLVMFunctionType (LLVMVoidType (), memset_params, memset_param_count, FALSE));
4278 LLVMTypeRef memcpy_params [] = { LLVMPointerType (LLVMInt8Type (), 0), LLVMPointerType (LLVMInt8Type (), 0), LLVMInt32Type (), LLVMInt32Type (), LLVMInt1Type () };
4280 if (LLVM_CHECK_VERSION(2, 8)) {
4281 memcpy_param_count = 5;
4282 memcpy_func_name = "llvm.memcpy.p0i8.p0i8.i32";
4284 memcpy_param_count = 4;
4285 memcpy_func_name = "llvm.memcpy.i32";
4288 LLVMAddFunction (module, memcpy_func_name, LLVMFunctionType (LLVMVoidType (), memcpy_params, memcpy_param_count, FALSE));
4292 LLVMTypeRef params [] = { LLVMDoubleType () };
4294 LLVMAddFunction (module, "llvm.sin.f64", LLVMFunctionType (LLVMDoubleType (), params, 1, FALSE));
4295 LLVMAddFunction (module, "llvm.cos.f64", LLVMFunctionType (LLVMDoubleType (), params, 1, FALSE));
4296 LLVMAddFunction (module, "llvm.sqrt.f64", LLVMFunctionType (LLVMDoubleType (), params, 1, FALSE));
4298 /* This isn't an intrinsic, instead llvm seems to special case it by name */
4299 LLVMAddFunction (module, "fabs", LLVMFunctionType (LLVMDoubleType (), params, 1, FALSE));
4303 LLVMTypeRef membar_params [] = { LLVMInt1Type (), LLVMInt1Type (), LLVMInt1Type (), LLVMInt1Type (), LLVMInt1Type () };
4305 LLVMAddFunction (module, "llvm.atomic.swap.i32.p0i32", LLVMFunctionType2 (LLVMInt32Type (), LLVMPointerType (LLVMInt32Type (), 0), LLVMInt32Type (), FALSE));
4306 LLVMAddFunction (module, "llvm.atomic.swap.i64.p0i64", LLVMFunctionType2 (LLVMInt64Type (), LLVMPointerType (LLVMInt64Type (), 0), LLVMInt64Type (), FALSE));
4307 LLVMAddFunction (module, "llvm.atomic.load.add.i32.p0i32", LLVMFunctionType2 (LLVMInt32Type (), LLVMPointerType (LLVMInt32Type (), 0), LLVMInt32Type (), FALSE));
4308 LLVMAddFunction (module, "llvm.atomic.load.add.i64.p0i64", LLVMFunctionType2 (LLVMInt64Type (), LLVMPointerType (LLVMInt64Type (), 0), LLVMInt64Type (), FALSE));
4309 LLVMAddFunction (module, "llvm.atomic.cmp.swap.i32.p0i32", LLVMFunctionType3 (LLVMInt32Type (), LLVMPointerType (LLVMInt32Type (), 0), LLVMInt32Type (), LLVMInt32Type (), FALSE));
4310 LLVMAddFunction (module, "llvm.atomic.cmp.swap.i64.p0i64", LLVMFunctionType3 (LLVMInt64Type (), LLVMPointerType (LLVMInt64Type (), 0), LLVMInt64Type (), LLVMInt64Type (), FALSE));
4311 LLVMAddFunction (module, "llvm.memory.barrier", LLVMFunctionType (LLVMVoidType (), membar_params, 5, FALSE));
4315 LLVMTypeRef ovf_res_i32 [] = { LLVMInt32Type (), LLVMInt1Type () };
4316 LLVMTypeRef ovf_params_i32 [] = { LLVMInt32Type (), LLVMInt32Type () };
4318 LLVMAddFunction (module, "llvm.sadd.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4319 LLVMAddFunction (module, "llvm.uadd.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4320 LLVMAddFunction (module, "llvm.ssub.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4321 LLVMAddFunction (module, "llvm.usub.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4322 LLVMAddFunction (module, "llvm.smul.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4323 LLVMAddFunction (module, "llvm.umul.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4327 LLVMTypeRef ovf_res_i64 [] = { LLVMInt64Type (), LLVMInt1Type () };
4328 LLVMTypeRef ovf_params_i64 [] = { LLVMInt64Type (), LLVMInt64Type () };
4330 LLVMAddFunction (module, "llvm.sadd.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4331 LLVMAddFunction (module, "llvm.uadd.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4332 LLVMAddFunction (module, "llvm.ssub.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4333 LLVMAddFunction (module, "llvm.usub.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4334 LLVMAddFunction (module, "llvm.smul.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4335 LLVMAddFunction (module, "llvm.umul.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4339 LLVMTypeRef struct_ptr = LLVMPointerType (LLVMStructType (NULL, 0, FALSE), 0);
4340 LLVMTypeRef invariant_start_params [] = { LLVMInt64Type (), LLVMPointerType (LLVMInt8Type (), 0) };
4341 LLVMTypeRef invariant_end_params [] = { struct_ptr, LLVMInt64Type (), LLVMPointerType (LLVMInt8Type (), 0) };
4343 LLVMAddFunction (module, "llvm.invariant.start", LLVMFunctionType (struct_ptr, invariant_start_params, 2, FALSE));
4345 LLVMAddFunction (module, "llvm.invariant.end", LLVMFunctionType (LLVMVoidType (), invariant_end_params, 3, FALSE));
4350 LLVMTypeRef arg_types [2];
4351 LLVMTypeRef ret_type;
4353 arg_types [0] = LLVMPointerType (LLVMInt8Type (), 0);
4354 arg_types [1] = LLVMPointerType (LLVMInt8Type (), 0);
4355 if (LLVM_CHECK_VERSION(2, 8)) {
4356 eh_selector_name = "llvm.eh.selector";
4357 ret_type = LLVMInt32Type ();
4359 if (SIZEOF_VOID_P == 8) {
4360 eh_selector_name = "llvm.eh.selector.i64";
4361 ret_type = LLVMInt64Type ();
4363 eh_selector_name = "llvm.eh.selector.i32";
4364 ret_type = LLVMInt32Type ();
4367 LLVMAddFunction (module, eh_selector_name, LLVMFunctionType (ret_type, arg_types, 2, TRUE));
4369 LLVMAddFunction (module, "llvm.eh.exception", LLVMFunctionType (LLVMPointerType (LLVMInt8Type (), 0), NULL, 0, FALSE));
4371 LLVMAddFunction (module, "mono_personality", LLVMFunctionType (LLVMVoidType (), NULL, 0, FALSE));
4373 LLVMAddFunction (module, "llvm_resume_unwind_trampoline", LLVMFunctionType (LLVMVoidType (), NULL, 0, FALSE));
4376 /* SSE intrinsics */
4378 LLVMTypeRef vector_type, arg_types [2];
4380 vector_type = LLVMVectorType (LLVMInt32Type (), 4);
4381 arg_types [0] = vector_type;
4382 arg_types [1] = vector_type;
4383 LLVMAddFunction (module, "llvm.x86.sse41.pminud", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4384 LLVMAddFunction (module, "llvm.x86.sse41.pmaxud", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4386 vector_type = LLVMVectorType (LLVMInt16Type (), 8);
4387 arg_types [0] = vector_type;
4388 arg_types [1] = vector_type;
4389 LLVMAddFunction (module, "llvm.x86.sse41.pminuw", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4390 LLVMAddFunction (module, "llvm.x86.sse41.pmaxuw", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4392 vector_type = LLVMVectorType (LLVMInt8Type (), 16);
4393 arg_types [0] = vector_type;
4394 arg_types [1] = vector_type;
4395 LLVMAddFunction (module, "llvm.x86.sse2.pminu.b", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4396 LLVMAddFunction (module, "llvm.x86.sse2.pmaxu.b", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4398 vector_type = LLVMVectorType (LLVMDoubleType (), 2);
4399 arg_types [0] = vector_type;
4400 arg_types [1] = vector_type;
4401 LLVMAddFunction (module, "llvm.x86.sse2.min.pd", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4402 LLVMAddFunction (module, "llvm.x86.sse2.max.pd", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4404 vector_type = LLVMVectorType (LLVMFloatType (), 4);
4405 arg_types [0] = vector_type;
4406 arg_types [1] = vector_type;
4407 LLVMAddFunction (module, "llvm.x86.sse2.min.ps", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4408 LLVMAddFunction (module, "llvm.x86.sse2.max.ps", LLVMFunctionType (vector_type, arg_types, 2, FALSE));
4411 /* Load/Store intrinsics */
4412 if (IS_LLVM_MONO_BRANCH) {
4413 LLVMTypeRef arg_types [5];
4417 for (i = 1; i <= 8; i *= 2) {
4418 arg_types [0] = LLVMPointerType (LLVMIntType (i * 8), 0);
4419 arg_types [1] = LLVMInt32Type ();
4420 arg_types [2] = LLVMInt1Type ();
4421 sprintf (name, "llvm.mono.load.i%d.p0i%d", i * 8, i * 8);
4422 LLVMAddFunction (module, name, LLVMFunctionType (LLVMIntType (i * 8), arg_types, 3, FALSE));
4424 arg_types [0] = LLVMIntType (i * 8);
4425 arg_types [1] = LLVMPointerType (LLVMIntType (i * 8), 0);
4426 arg_types [2] = LLVMInt32Type ();
4427 arg_types [3] = LLVMInt1Type ();
4428 sprintf (name, "llvm.mono.store.i%d.p0i%d", i * 8, i * 8);
4429 LLVMAddFunction (module, name, LLVMFunctionType (LLVMVoidType (), arg_types, 4, FALSE));
4435 mono_llvm_init (void)
4437 current_cfg_tls_id = TlsAlloc ();
4441 init_jit_module (void)
4443 MonoJitICallInfo *info;
4445 if (jit_module_inited)
4448 mono_loader_lock ();
4450 if (jit_module_inited) {
4451 mono_loader_unlock ();
4455 jit_module.module = LLVMModuleCreateWithName ("mono");
4457 ee = mono_llvm_create_ee (LLVMCreateModuleProviderForExistingModule (jit_module.module), alloc_cb, emitted_cb, exception_cb);
4459 add_intrinsics (jit_module.module);
4461 jit_module.llvm_types = g_hash_table_new (NULL, NULL);
4463 info = mono_find_jit_icall_by_name ("llvm_resume_unwind_trampoline");
4465 LLVMAddGlobalMapping (ee, LLVMGetNamedFunction (jit_module.module, "llvm_resume_unwind_trampoline"), (void*)info->func);
4467 jit_module_inited = TRUE;
4469 mono_loader_unlock ();
4473 mono_llvm_cleanup (void)
4476 mono_llvm_dispose_ee (ee);
4478 if (jit_module.llvm_types)
4479 g_hash_table_destroy (jit_module.llvm_types);
4481 if (aot_module.module)
4482 LLVMDisposeModule (aot_module.module);
4484 LLVMContextDispose (LLVMGetGlobalContext ());
4488 mono_llvm_create_aot_module (const char *got_symbol)
4490 /* Delete previous module */
4491 if (aot_module.plt_entries)
4492 g_hash_table_destroy (aot_module.plt_entries);
4493 if (aot_module.module)
4494 LLVMDisposeModule (aot_module.module);
4496 memset (&aot_module, 0, sizeof (aot_module));
4498 aot_module.module = LLVMModuleCreateWithName ("aot");
4499 aot_module.got_symbol = got_symbol;
4501 add_intrinsics (aot_module.module);
4505 * We couldn't compute the type of the LLVM global representing the got because
4506 * its size is only known after all the methods have been emitted. So create
4507 * a dummy variable, and replace all uses it with the real got variable when
4508 * its size is known in mono_llvm_emit_aot_module ().
4511 LLVMTypeRef got_type = LLVMArrayType (IntPtrType (), 0);
4513 aot_module.got_var = LLVMAddGlobal (aot_module.module, got_type, "mono_dummy_got");
4514 LLVMSetInitializer (aot_module.got_var, LLVMConstNull (got_type));
4517 /* Add a dummy personality function */
4519 LLVMBasicBlockRef lbb;
4520 LLVMBuilderRef lbuilder;
4521 LLVMValueRef personality;
4523 personality = LLVMAddFunction (aot_module.module, "mono_aot_personality", LLVMFunctionType (LLVMVoidType (), NULL, 0, FALSE));
4524 LLVMSetLinkage (personality, LLVMPrivateLinkage);
4525 lbb = LLVMAppendBasicBlock (personality, "BB0");
4526 lbuilder = LLVMCreateBuilder ();
4527 LLVMPositionBuilderAtEnd (lbuilder, lbb);
4528 LLVMBuildRetVoid (lbuilder);
4531 aot_module.llvm_types = g_hash_table_new (NULL, NULL);
4532 aot_module.plt_entries = g_hash_table_new (g_str_hash, g_str_equal);
4536 * Emit the aot module into the LLVM bitcode file FILENAME.
4539 mono_llvm_emit_aot_module (const char *filename, int got_size)
4541 LLVMTypeRef got_type;
4542 LLVMValueRef real_got;
4545 * Create the real got variable and replace all uses of the dummy variable with
4548 got_type = LLVMArrayType (IntPtrType (), got_size);
4549 real_got = LLVMAddGlobal (aot_module.module, got_type, aot_module.got_symbol);
4550 LLVMSetInitializer (real_got, LLVMConstNull (got_type));
4551 LLVMSetLinkage (real_got, LLVMInternalLinkage);
4553 mono_llvm_replace_uses_of (aot_module.got_var, real_got);
4555 mark_as_used (aot_module.module, real_got);
4557 /* Delete the dummy got so it doesn't become a global */
4558 LLVMDeleteGlobal (aot_module.got_var);
4564 if (LLVMVerifyModule (aot_module.module, LLVMReturnStatusAction, &verifier_err)) {
4565 g_assert_not_reached ();
4570 LLVMWriteBitcodeToFile (aot_module.module, filename);
4575 - Emit LLVM IR from the mono IR using the LLVM C API.
4576 - The original arch specific code remains, so we can fall back to it if we run
4577 into something we can't handle.
4581 A partial list of issues:
4582 - Handling of opcodes which can throw exceptions.
4584 In the mono JIT, these are implemented using code like this:
4591 push throw_pos - method
4592 call <exception trampoline>
4594 The problematic part is push throw_pos - method, which cannot be represented
4595 in the LLVM IR, since it does not support label values.
4596 -> this can be implemented in AOT mode using inline asm + labels, but cannot
4597 be implemented in JIT mode ?
4598 -> a possible but slower implementation would use the normal exception
4599 throwing code but it would need to control the placement of the throw code
4600 (it needs to be exactly after the compare+branch).
4601 -> perhaps add a PC offset intrinsics ?
4603 - efficient implementation of .ovf opcodes.
4605 These are currently implemented as:
4606 <ins which sets the condition codes>
4609 Some overflow opcodes are now supported by LLVM SVN.
4611 - exception handling, unwinding.
4612 - SSA is disabled for methods with exception handlers
4613 - How to obtain unwind info for LLVM compiled methods ?
4614 -> this is now solved by converting the unwind info generated by LLVM
4616 - LLVM uses the c++ exception handling framework, while we use our home grown
4617 code, and couldn't use the c++ one:
4618 - its not supported under VC++, other exotic platforms.
4619 - it might be impossible to support filter clauses with it.
4623 The trampolines need a predictable call sequence, since they need to disasm
4624 the calling code to obtain register numbers / offsets.
4626 LLVM currently generates this code in non-JIT mode:
4627 mov -0x98(%rax),%eax
4629 Here, the vtable pointer is lost.
4630 -> solution: use one vtable trampoline per class.
4632 - passing/receiving the IMT pointer/RGCTX.
4633 -> solution: pass them as normal arguments ?
4637 LLVM does not allow the specification of argument registers etc. This means
4638 that all calls are made according to the platform ABI.
4640 - passing/receiving vtypes.
4642 Vtypes passed/received in registers are handled by the front end by using
4643 a signature with scalar arguments, and loading the parts of the vtype into those
4646 Vtypes passed on the stack are handled using the 'byval' attribute.
4650 Supported though alloca, we need to emit the load/store code.
4654 The mono JIT uses pointer sized iregs/double fregs, while LLVM uses precisely
4655 typed registers, so we have to keep track of the precise LLVM type of each vreg.
4656 This is made easier because the IR is already in SSA form.
4657 An additional problem is that our IR is not consistent with types, i.e. i32/ia64
4658 types are frequently used incorrectly.
4663 Emit LLVM bytecode into a .bc file, compile it using llc into a .s file, then
4664 append the AOT data structures to that file. For methods which cannot be
4665 handled by LLVM, the normal JIT compiled versions are used.
4668 /* FIXME: Normalize some aspects of the mono IR to allow easier translation, like:
4669 * - each bblock should end with a branch
4670 * - setting the return value, making cfg->ret non-volatile
4671 * - avoid some transformations in the JIT which make it harder for us to generate
4673 * - use pointer types to help optimizations.