2 * mini-llvm.c: llvm "Backend" for the mono JIT
4 * Copyright 2009-2011 Novell Inc (http://www.novell.com)
5 * Copyright 2011 Xamarin Inc (http://www.xamarin.com)
9 #include <mono/metadata/debug-helpers.h>
10 #include <mono/metadata/mempool-internals.h>
11 #include <mono/utils/mono-tls.h>
12 #include <mono/utils/mono-dl.h>
14 #ifndef __STDC_LIMIT_MACROS
15 #define __STDC_LIMIT_MACROS
17 #ifndef __STDC_CONSTANT_MACROS
18 #define __STDC_CONSTANT_MACROS
21 #include "llvm-c/Core.h"
22 #include "llvm-c/ExecutionEngine.h"
23 #include "llvm-c/BitWriter.h"
24 #include "llvm-c/Analysis.h"
26 #include "mini-llvm-cpp.h"
29 * Information associated by mono with LLVM modules.
33 LLVMValueRef throw, rethrow, throw_corlib_exception;
34 GHashTable *llvm_types;
36 const char *got_symbol;
37 GHashTable *plt_entries;
41 * Information associated by the backend with mono basic blocks.
44 LLVMBasicBlockRef bblock, end_bblock;
45 LLVMValueRef finally_ind;
46 gboolean added, invoke_target;
48 * If this bblock is the start of a finally clause, this is a list of bblocks it
49 * needs to branch to in ENDFINALLY.
51 GSList *call_handler_return_bbs;
53 * If this bblock is the start of a finally clause, this is the bblock that
54 * CALL_HANDLER needs to branch to.
56 LLVMBasicBlockRef call_handler_target_bb;
57 /* The list of switch statements generated by ENDFINALLY instructions */
58 GSList *endfinally_switch_ins_list;
63 * Structure containing emit state
68 /* Maps method names to the corresponding LLVMValueRef */
69 GHashTable *emitted_method_decls;
73 MonoLLVMModule *lmodule;
76 int sindex, default_index, ex_index;
77 LLVMBuilderRef builder;
78 LLVMValueRef *values, *addresses;
79 MonoType **vreg_cli_types;
81 MonoMethodSignature *sig;
83 GHashTable *region_to_handler;
84 LLVMBuilderRef alloca_builder;
85 LLVMValueRef last_alloca;
86 LLVMValueRef rgctx_arg;
87 LLVMTypeRef *vreg_types;
89 gboolean *unreachable;
98 MonoBasicBlock *in_bb;
103 * Instruction metadata
104 * This is the same as ins_info, but LREG != IREG.
112 #define MINI_OP(a,b,dest,src1,src2) dest, src1, src2, ' ',
113 #define MINI_OP3(a,b,dest,src1,src2,src3) dest, src1, src2, src3,
120 /* keep in sync with the enum in mini.h */
123 #include "mini-ops.h"
128 #if SIZEOF_VOID_P == 4
129 #define GET_LONG_IMM(ins) (((guint64)(ins)->inst_ms_word << 32) | (guint64)(guint32)(ins)->inst_ls_word)
131 #define GET_LONG_IMM(ins) ((ins)->inst_imm)
134 #define LLVM_INS_INFO(opcode) (&llvm_ins_info [((opcode) - OP_START - 1) * 4])
137 #define TRACE_FAILURE(msg) do { printf ("%s\n", msg); } while (0)
139 #define TRACE_FAILURE(msg)
143 #define IS_TARGET_X86 1
145 #define IS_TARGET_X86 0
148 #define LLVM_FAILURE(ctx, reason) do { \
149 TRACE_FAILURE (reason); \
150 (ctx)->cfg->exception_message = g_strdup (reason); \
151 (ctx)->cfg->disable_llvm = TRUE; \
155 #define CHECK_FAILURE(ctx) do { \
156 if ((ctx)->cfg->disable_llvm) \
160 static LLVMIntPredicate cond_to_llvm_cond [] = {
173 static LLVMRealPredicate fpcond_to_llvm_cond [] = {
186 static LLVMExecutionEngineRef ee;
187 static MonoNativeTlsKey current_cfg_tls_id;
189 static MonoLLVMModule jit_module, aot_module;
190 static gboolean jit_module_inited;
191 static int memset_param_count, memcpy_param_count;
192 static const char *memset_func_name;
193 static const char *memcpy_func_name;
195 static void init_jit_module (void);
200 * The LLVM type with width == sizeof (gpointer)
205 return sizeof (gpointer) == 8 ? LLVMInt64Type () : LLVMInt32Type ();
211 return sizeof (gpointer) == 8 ? LLVMPointerType (LLVMInt64Type (), 0) : LLVMPointerType (LLVMInt32Type (), 0);
217 return sizeof (gpointer) == 8 ? LLVMPointerType (LLVMInt64Type (), 0) : LLVMPointerType (LLVMInt32Type (), 0);
223 * Return the size of the LLVM representation of the vtype T.
226 get_vtype_size (MonoType *t)
230 size = mono_class_value_size (mono_class_from_mono_type (t), NULL);
232 while (size < 2 * sizeof (gpointer) && mono_is_power_of_two (size) == -1)
239 * simd_class_to_llvm_type:
241 * Return the LLVM type corresponding to the Mono.SIMD class KLASS
244 simd_class_to_llvm_type (EmitContext *ctx, MonoClass *klass)
246 if (!strcmp (klass->name, "Vector2d")) {
247 return LLVMVectorType (LLVMDoubleType (), 2);
248 } else if (!strcmp (klass->name, "Vector2l")) {
249 return LLVMVectorType (LLVMInt64Type (), 2);
250 } else if (!strcmp (klass->name, "Vector2ul")) {
251 return LLVMVectorType (LLVMInt64Type (), 2);
252 } else if (!strcmp (klass->name, "Vector4i")) {
253 return LLVMVectorType (LLVMInt32Type (), 4);
254 } else if (!strcmp (klass->name, "Vector4ui")) {
255 return LLVMVectorType (LLVMInt32Type (), 4);
256 } else if (!strcmp (klass->name, "Vector4f")) {
257 return LLVMVectorType (LLVMFloatType (), 4);
258 } else if (!strcmp (klass->name, "Vector8s")) {
259 return LLVMVectorType (LLVMInt16Type (), 8);
260 } else if (!strcmp (klass->name, "Vector8us")) {
261 return LLVMVectorType (LLVMInt16Type (), 8);
262 } else if (!strcmp (klass->name, "Vector16sb")) {
263 return LLVMVectorType (LLVMInt8Type (), 16);
264 } else if (!strcmp (klass->name, "Vector16b")) {
265 return LLVMVectorType (LLVMInt8Type (), 16);
267 printf ("%s\n", klass->name);
273 /* Return the 128 bit SIMD type corresponding to the mono type TYPE */
274 static inline G_GNUC_UNUSED LLVMTypeRef
275 type_to_simd_type (int type)
279 return LLVMVectorType (LLVMInt8Type (), 16);
281 return LLVMVectorType (LLVMInt16Type (), 8);
283 return LLVMVectorType (LLVMInt32Type (), 4);
285 return LLVMVectorType (LLVMInt64Type (), 2);
287 return LLVMVectorType (LLVMDoubleType (), 2);
289 return LLVMVectorType (LLVMFloatType (), 4);
291 g_assert_not_reached ();
299 * Return the LLVM type corresponding to T.
302 type_to_llvm_type (EmitContext *ctx, MonoType *t)
305 return LLVMPointerType (LLVMInt8Type (), 0);
308 return LLVMVoidType ();
310 return LLVMInt8Type ();
312 return LLVMInt16Type ();
314 return LLVMInt32Type ();
316 return LLVMInt8Type ();
318 return LLVMInt16Type ();
320 return LLVMInt32Type ();
321 case MONO_TYPE_BOOLEAN:
322 return LLVMInt8Type ();
325 return LLVMInt64Type ();
327 return LLVMInt16Type ();
329 return LLVMFloatType ();
331 return LLVMDoubleType ();
334 return IntPtrType ();
335 case MONO_TYPE_OBJECT:
336 case MONO_TYPE_CLASS:
337 case MONO_TYPE_ARRAY:
338 case MONO_TYPE_SZARRAY:
339 case MONO_TYPE_STRING:
341 return ObjRefType ();
344 /* Because of generic sharing */
345 return ObjRefType ();
346 case MONO_TYPE_GENERICINST:
347 if (!mono_type_generic_inst_is_valuetype (t))
348 return ObjRefType ();
350 case MONO_TYPE_VALUETYPE:
351 case MONO_TYPE_TYPEDBYREF: {
355 klass = mono_class_from_mono_type (t);
357 if (MONO_CLASS_IS_SIMD (ctx->cfg, klass))
358 return simd_class_to_llvm_type (ctx, klass);
361 return type_to_llvm_type (ctx, mono_class_enum_basetype (klass));
362 ltype = g_hash_table_lookup (ctx->lmodule->llvm_types, klass);
365 LLVMTypeRef *eltypes;
368 size = get_vtype_size (t);
370 eltypes = g_new (LLVMTypeRef, size);
371 for (i = 0; i < size; ++i)
372 eltypes [i] = LLVMInt8Type ();
374 name = mono_type_full_name (&klass->byval_arg);
375 ltype = LLVMStructCreateNamed (LLVMGetGlobalContext (), name);
376 LLVMStructSetBody (ltype, eltypes, size, FALSE);
377 g_hash_table_insert (ctx->lmodule->llvm_types, klass, ltype);
384 printf ("X: %d\n", t->type);
385 ctx->cfg->exception_message = g_strdup_printf ("type %s", mono_type_full_name (t));
386 ctx->cfg->disable_llvm = TRUE;
394 * Return whenever T is an unsigned int type.
397 type_is_unsigned (EmitContext *ctx, MonoType *t)
413 * type_to_llvm_arg_type:
415 * Same as type_to_llvm_type, but treat i8/i16 as i32.
418 type_to_llvm_arg_type (EmitContext *ctx, MonoType *t)
420 LLVMTypeRef ptype = type_to_llvm_type (ctx, t);
422 if (ptype == LLVMInt8Type () || ptype == LLVMInt16Type ()) {
424 * LLVM generates code which only sets the lower bits, while JITted
425 * code expects all the bits to be set.
427 ptype = LLVMInt32Type ();
434 * llvm_type_to_stack_type:
436 * Return the LLVM type which needs to be used when a value of type TYPE is pushed
439 static G_GNUC_UNUSED LLVMTypeRef
440 llvm_type_to_stack_type (LLVMTypeRef type)
444 if (type == LLVMInt8Type ())
445 return LLVMInt32Type ();
446 else if (type == LLVMInt16Type ())
447 return LLVMInt32Type ();
448 else if (type == LLVMFloatType ())
449 return LLVMDoubleType ();
455 * regtype_to_llvm_type:
457 * Return the LLVM type corresponding to the regtype C used in instruction
461 regtype_to_llvm_type (char c)
465 return LLVMInt32Type ();
467 return LLVMInt64Type ();
469 return LLVMDoubleType ();
478 * Return the LLVM type corresponding to the unary/binary opcode OPCODE.
481 op_to_llvm_type (int opcode)
486 return LLVMInt8Type ();
489 return LLVMInt8Type ();
492 return LLVMInt16Type ();
495 return LLVMInt16Type ();
498 return LLVMInt32Type ();
501 return LLVMInt32Type ();
503 return LLVMInt64Type ();
505 return LLVMFloatType ();
507 return LLVMDoubleType ();
509 return LLVMInt64Type ();
511 return LLVMInt32Type ();
513 return LLVMInt64Type ();
516 return LLVMInt8Type ();
519 return LLVMInt16Type ();
522 return sizeof (gpointer) == 8 ? LLVMInt64Type () : LLVMInt32Type ();
529 return LLVMInt32Type ();
536 return LLVMInt64Type ();
538 printf ("%s\n", mono_inst_name (opcode));
539 g_assert_not_reached ();
545 * load_store_to_llvm_type:
547 * Return the size/sign/zero extension corresponding to the load/store opcode
551 load_store_to_llvm_type (int opcode, int *size, gboolean *sext, gboolean *zext)
557 case OP_LOADI1_MEMBASE:
558 case OP_STOREI1_MEMBASE_REG:
559 case OP_STOREI1_MEMBASE_IMM:
562 return LLVMInt8Type ();
563 case OP_LOADU1_MEMBASE:
567 return LLVMInt8Type ();
568 case OP_LOADI2_MEMBASE:
569 case OP_STOREI2_MEMBASE_REG:
570 case OP_STOREI2_MEMBASE_IMM:
573 return LLVMInt16Type ();
574 case OP_LOADU2_MEMBASE:
578 return LLVMInt16Type ();
579 case OP_LOADI4_MEMBASE:
580 case OP_LOADU4_MEMBASE:
583 case OP_STOREI4_MEMBASE_REG:
584 case OP_STOREI4_MEMBASE_IMM:
586 return LLVMInt32Type ();
587 case OP_LOADI8_MEMBASE:
589 case OP_STOREI8_MEMBASE_REG:
590 case OP_STOREI8_MEMBASE_IMM:
592 return LLVMInt64Type ();
593 case OP_LOADR4_MEMBASE:
594 case OP_STORER4_MEMBASE_REG:
596 return LLVMFloatType ();
597 case OP_LOADR8_MEMBASE:
598 case OP_STORER8_MEMBASE_REG:
600 return LLVMDoubleType ();
601 case OP_LOAD_MEMBASE:
603 case OP_STORE_MEMBASE_REG:
604 case OP_STORE_MEMBASE_IMM:
605 *size = sizeof (gpointer);
606 return IntPtrType ();
608 g_assert_not_reached ();
616 * Return the LLVM intrinsics corresponding to the overflow opcode OPCODE.
619 ovf_op_to_intrins (int opcode)
623 return "llvm.sadd.with.overflow.i32";
625 return "llvm.uadd.with.overflow.i32";
627 return "llvm.ssub.with.overflow.i32";
629 return "llvm.usub.with.overflow.i32";
631 return "llvm.smul.with.overflow.i32";
633 return "llvm.umul.with.overflow.i32";
635 return "llvm.sadd.with.overflow.i64";
637 return "llvm.uadd.with.overflow.i64";
639 return "llvm.ssub.with.overflow.i64";
641 return "llvm.usub.with.overflow.i64";
643 return "llvm.smul.with.overflow.i64";
645 return "llvm.umul.with.overflow.i64";
647 g_assert_not_reached ();
653 simd_op_to_intrins (int opcode)
656 #if defined(TARGET_X86) || defined(TARGET_AMD64)
658 return "llvm.x86.sse2.min.pd";
660 return "llvm.x86.sse.min.ps";
662 return "llvm.x86.sse41.pminud";
664 return "llvm.x86.sse41.pminuw";
666 return "llvm.x86.sse2.pminu.b";
668 return "llvm.x86.sse2.pmins.w";
670 return "llvm.x86.sse2.max.pd";
672 return "llvm.x86.sse.max.ps";
674 return "llvm.x86.sse3.hadd.pd";
676 return "llvm.x86.sse3.hadd.ps";
678 return "llvm.x86.sse3.hsub.pd";
680 return "llvm.x86.sse3.hsub.ps";
682 return "llvm.x86.sse41.pmaxud";
684 return "llvm.x86.sse41.pmaxuw";
686 return "llvm.x86.sse2.pmaxu.b";
688 return "llvm.x86.sse3.addsub.ps";
690 return "llvm.x86.sse3.addsub.pd";
691 case OP_EXTRACT_MASK:
692 return "llvm.x86.sse2.pmovmskb.128";
695 return "llvm.x86.sse2.psrli.w";
698 return "llvm.x86.sse2.psrli.d";
701 return "llvm.x86.sse2.psrli.q";
704 return "llvm.x86.sse2.pslli.w";
707 return "llvm.x86.sse2.pslli.d";
710 return "llvm.x86.sse2.pslli.q";
713 return "llvm.x86.sse2.psrai.w";
716 return "llvm.x86.sse2.psrai.d";
718 return "llvm.x86.sse2.padds.b";
720 return "llvm.x86.sse2.padds.w";
722 return "llvm.x86.sse2.psubs.b";
724 return "llvm.x86.sse2.psubs.w";
725 case OP_PADDB_SAT_UN:
726 return "llvm.x86.sse2.paddus.b";
727 case OP_PADDW_SAT_UN:
728 return "llvm.x86.sse2.paddus.w";
729 case OP_PSUBB_SAT_UN:
730 return "llvm.x86.sse2.psubus.b";
731 case OP_PSUBW_SAT_UN:
732 return "llvm.x86.sse2.psubus.w";
734 return "llvm.x86.sse2.pavg.b";
736 return "llvm.x86.sse2.pavg.w";
738 return "llvm.x86.sse.sqrt.ps";
740 return "llvm.x86.sse2.sqrt.pd";
742 return "llvm.x86.sse.rsqrt.ps";
744 return "llvm.x86.sse.rcp.ps";
746 return "llvm.x86.sse2.cvtdq2pd";
748 return "llvm.x86.sse2.cvtdq2ps";
750 return "llvm.x86.sse2.cvtpd2dq";
752 return "llvm.x86.sse2.cvtps2dq";
754 return "llvm.x86.sse2.cvtpd2ps";
756 return "llvm.x86.sse2.cvtps2pd";
758 return "llvm.x86.sse2.cvttpd2dq";
760 return "llvm.x86.sse2.cvttps2dq";
762 return "llvm.x86.sse.cmp.ps";
764 return "llvm.x86.sse2.cmp.pd";
766 return "llvm.x86.sse2.packsswb.128";
768 return "llvm.x86.sse2.packssdw.128";
770 return "llvm.x86.sse2.packuswb.128";
772 return "llvm.x86.sse41.packusdw";
774 return "llvm.x86.sse2.pmulh.w";
775 case OP_PMULW_HIGH_UN:
776 return "llvm.x86.sse2.pmulhu.w";
779 g_assert_not_reached ();
785 simd_op_to_llvm_type (int opcode)
787 #if defined(TARGET_X86) || defined(TARGET_AMD64)
791 return type_to_simd_type (MONO_TYPE_R8);
794 return type_to_simd_type (MONO_TYPE_I8);
797 return type_to_simd_type (MONO_TYPE_I4);
802 return type_to_simd_type (MONO_TYPE_I2);
806 return type_to_simd_type (MONO_TYPE_I1);
808 return type_to_simd_type (MONO_TYPE_R4);
811 return type_to_simd_type (MONO_TYPE_I4);
815 return type_to_simd_type (MONO_TYPE_R8);
819 return type_to_simd_type (MONO_TYPE_R4);
820 case OP_EXTRACT_MASK:
821 return type_to_simd_type (MONO_TYPE_I1);
827 return type_to_simd_type (MONO_TYPE_R4);
830 return type_to_simd_type (MONO_TYPE_R8);
832 g_assert_not_reached ();
843 * Return the LLVM basic block corresponding to BB.
845 static LLVMBasicBlockRef
846 get_bb (EmitContext *ctx, MonoBasicBlock *bb)
850 if (ctx->bblocks [bb->block_num].bblock == NULL) {
851 if (bb->flags & BB_EXCEPTION_HANDLER) {
852 int clause_index = (mono_get_block_region_notry (ctx->cfg, bb->region) >> 8) - 1;
853 sprintf (bb_name, "EH_CLAUSE%d_BB%d", clause_index, bb->block_num);
855 sprintf (bb_name, "BB%d", bb->block_num);
858 ctx->bblocks [bb->block_num].bblock = LLVMAppendBasicBlock (ctx->lmethod, bb_name);
859 ctx->bblocks [bb->block_num].end_bblock = ctx->bblocks [bb->block_num].bblock;
862 return ctx->bblocks [bb->block_num].bblock;
868 * Return the last LLVM bblock corresponding to BB.
869 * This might not be equal to the bb returned by get_bb () since we need to generate
870 * multiple LLVM bblocks for a mono bblock to handle throwing exceptions.
872 static LLVMBasicBlockRef
873 get_end_bb (EmitContext *ctx, MonoBasicBlock *bb)
876 return ctx->bblocks [bb->block_num].end_bblock;
879 static LLVMBasicBlockRef
880 gen_bb (EmitContext *ctx, const char *prefix)
884 sprintf (bb_name, "%s%d", prefix, ++ ctx->ex_index);
885 return LLVMAppendBasicBlock (ctx->lmethod, bb_name);
891 * Return the target of the patch identified by TYPE and TARGET.
894 resolve_patch (MonoCompile *cfg, MonoJumpInfoType type, gconstpointer target)
898 memset (&ji, 0, sizeof (ji));
900 ji.data.target = target;
902 return mono_resolve_patch_target (cfg->method, cfg->domain, NULL, &ji, FALSE);
908 * Emit code to convert the LLVM value V to DTYPE.
911 convert_full (EmitContext *ctx, LLVMValueRef v, LLVMTypeRef dtype, gboolean is_unsigned)
913 LLVMTypeRef stype = LLVMTypeOf (v);
915 if (stype != dtype) {
916 gboolean ext = FALSE;
919 if (dtype == LLVMInt64Type () && (stype == LLVMInt32Type () || stype == LLVMInt16Type () || stype == LLVMInt8Type ()))
921 else if (dtype == LLVMInt32Type () && (stype == LLVMInt16Type () || stype == LLVMInt8Type ()))
923 else if (dtype == LLVMInt16Type () && (stype == LLVMInt8Type ()))
927 return is_unsigned ? LLVMBuildZExt (ctx->builder, v, dtype, "") : LLVMBuildSExt (ctx->builder, v, dtype, "");
929 if (dtype == LLVMDoubleType () && stype == LLVMFloatType ())
930 return LLVMBuildFPExt (ctx->builder, v, dtype, "");
933 if (stype == LLVMInt64Type () && (dtype == LLVMInt32Type () || dtype == LLVMInt16Type () || dtype == LLVMInt8Type ()))
934 return LLVMBuildTrunc (ctx->builder, v, dtype, "");
935 if (stype == LLVMInt32Type () && (dtype == LLVMInt16Type () || dtype == LLVMInt8Type ()))
936 return LLVMBuildTrunc (ctx->builder, v, dtype, "");
937 if (stype == LLVMInt16Type () && dtype == LLVMInt8Type ())
938 return LLVMBuildTrunc (ctx->builder, v, dtype, "");
939 if (stype == LLVMDoubleType () && dtype == LLVMFloatType ())
940 return LLVMBuildFPTrunc (ctx->builder, v, dtype, "");
942 if (LLVMGetTypeKind (stype) == LLVMPointerTypeKind && LLVMGetTypeKind (dtype) == LLVMPointerTypeKind)
943 return LLVMBuildBitCast (ctx->builder, v, dtype, "");
944 if (LLVMGetTypeKind (dtype) == LLVMPointerTypeKind)
945 return LLVMBuildIntToPtr (ctx->builder, v, dtype, "");
946 if (LLVMGetTypeKind (stype) == LLVMPointerTypeKind)
947 return LLVMBuildPtrToInt (ctx->builder, v, dtype, "");
949 if (mono_arch_is_soft_float ()) {
950 if (stype == LLVMInt32Type () && dtype == LLVMFloatType ())
951 return LLVMBuildBitCast (ctx->builder, v, dtype, "");
952 if (stype == LLVMInt32Type () && dtype == LLVMDoubleType ())
953 return LLVMBuildBitCast (ctx->builder, LLVMBuildZExt (ctx->builder, v, LLVMInt64Type (), ""), dtype, "");
956 if (LLVMGetTypeKind (stype) == LLVMVectorTypeKind && LLVMGetTypeKind (dtype) == LLVMVectorTypeKind)
957 return LLVMBuildBitCast (ctx->builder, v, dtype, "");
960 LLVMDumpValue (LLVMConstNull (dtype));
961 g_assert_not_reached ();
969 convert (EmitContext *ctx, LLVMValueRef v, LLVMTypeRef dtype)
971 return convert_full (ctx, v, dtype, FALSE);
975 * emit_volatile_load:
977 * If vreg is volatile, emit a load from its address.
980 emit_volatile_load (EmitContext *ctx, int vreg)
984 LLVMValueRef v = LLVMBuildLoad (ctx->builder, ctx->addresses [vreg], "");
985 t = ctx->vreg_cli_types [vreg];
986 if (t && !t->byref) {
988 * Might have to zero extend since llvm doesn't have
991 if (t->type == MONO_TYPE_U1 || t->type == MONO_TYPE_U2 || t->type == MONO_TYPE_CHAR || t->type == MONO_TYPE_BOOLEAN)
992 v = LLVMBuildZExt (ctx->builder, v, LLVMInt32Type (), "");
993 else if (t->type == MONO_TYPE_U8)
994 v = LLVMBuildZExt (ctx->builder, v, LLVMInt64Type (), "");
1001 * emit_volatile_store:
1003 * If VREG is volatile, emit a store from its value to its address.
1006 emit_volatile_store (EmitContext *ctx, int vreg)
1008 MonoInst *var = get_vreg_to_inst (ctx->cfg, vreg);
1010 if (var && var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT)) {
1011 g_assert (ctx->addresses [vreg]);
1012 LLVMBuildStore (ctx->builder, convert (ctx, ctx->values [vreg], type_to_llvm_type (ctx, var->inst_vtype)), ctx->addresses [vreg]);
1018 * Maps parameter indexes in the original signature to parameter indexes
1019 * in the LLVM signature.
1022 /* The indexes of various special arguments in the LLVM signature */
1023 int vret_arg_pindex, this_arg_pindex, rgctx_arg_pindex, imt_arg_pindex;
1027 * sig_to_llvm_sig_full:
1029 * Return the LLVM signature corresponding to the mono signature SIG using the
1030 * calling convention information in CINFO. Return parameter mapping information in SINFO.
1033 sig_to_llvm_sig_full (EmitContext *ctx, MonoMethodSignature *sig, LLVMCallInfo *cinfo,
1036 LLVMTypeRef ret_type;
1037 LLVMTypeRef *param_types = NULL;
1039 int i, j, pindex, vret_arg_pindex = 0;
1041 gboolean vretaddr = FALSE;
1044 memset (sinfo, 0, sizeof (LLVMSigInfo));
1046 ret_type = type_to_llvm_type (ctx, sig->ret);
1047 CHECK_FAILURE (ctx);
1049 if (cinfo && cinfo->ret.storage == LLVMArgVtypeInReg) {
1050 /* LLVM models this by returning an aggregate value */
1051 if (cinfo->ret.pair_storage [0] == LLVMArgInIReg && cinfo->ret.pair_storage [1] == LLVMArgNone) {
1052 LLVMTypeRef members [2];
1054 members [0] = IntPtrType ();
1055 ret_type = LLVMStructType (members, 1, FALSE);
1057 g_assert_not_reached ();
1059 } else if (cinfo && mini_type_is_vtype (ctx->cfg, sig->ret)) {
1060 g_assert (cinfo->ret.storage == LLVMArgVtypeRetAddr);
1062 ret_type = LLVMVoidType ();
1065 pindexes = g_new0 (int, sig->param_count);
1066 param_types = g_new0 (LLVMTypeRef, (sig->param_count * 2) + 3);
1068 if (cinfo && cinfo->rgctx_arg) {
1070 sinfo->rgctx_arg_pindex = pindex;
1071 param_types [pindex] = IntPtrType ();
1074 if (cinfo && cinfo->imt_arg) {
1076 sinfo->imt_arg_pindex = pindex;
1077 param_types [pindex] = IntPtrType ();
1081 /* Compute the index in the LLVM signature where the vret arg needs to be passed */
1082 vret_arg_pindex = pindex;
1083 if (cinfo->vret_arg_index == 1) {
1084 /* Add the slots consumed by the first argument */
1085 LLVMArgInfo *ainfo = &cinfo->args [0];
1086 switch (ainfo->storage) {
1087 case LLVMArgVtypeInReg:
1088 for (j = 0; j < 2; ++j) {
1089 if (ainfo->pair_storage [j] == LLVMArgInIReg)
1099 sinfo->vret_arg_pindex = vret_arg_pindex;
1102 if (vretaddr && vret_arg_pindex == pindex)
1103 param_types [pindex ++] = IntPtrType ();
1106 sinfo->this_arg_pindex = pindex;
1107 param_types [pindex ++] = ThisType ();
1109 if (vretaddr && vret_arg_pindex == pindex)
1110 param_types [pindex ++] = IntPtrType ();
1111 for (i = 0; i < sig->param_count; ++i) {
1112 if (vretaddr && vret_arg_pindex == pindex)
1113 param_types [pindex ++] = IntPtrType ();
1114 pindexes [i] = pindex;
1115 if (cinfo && cinfo->args [i + sig->hasthis].storage == LLVMArgVtypeInReg) {
1116 for (j = 0; j < 2; ++j) {
1117 switch (cinfo->args [i + sig->hasthis].pair_storage [j]) {
1119 param_types [pindex ++] = LLVMIntType (sizeof (gpointer) * 8);
1124 g_assert_not_reached ();
1127 } else if (cinfo && cinfo->args [i + sig->hasthis].storage == LLVMArgVtypeByVal) {
1128 param_types [pindex] = type_to_llvm_arg_type (ctx, sig->params [i]);
1129 CHECK_FAILURE (ctx);
1130 param_types [pindex] = LLVMPointerType (param_types [pindex], 0);
1133 param_types [pindex ++] = type_to_llvm_arg_type (ctx, sig->params [i]);
1136 if (vretaddr && vret_arg_pindex == pindex)
1137 param_types [pindex ++] = IntPtrType ();
1139 CHECK_FAILURE (ctx);
1141 res = LLVMFunctionType (ret_type, param_types, pindex, FALSE);
1142 g_free (param_types);
1145 sinfo->pindexes = pindexes;
1153 g_free (param_types);
1159 sig_to_llvm_sig (EmitContext *ctx, MonoMethodSignature *sig)
1161 return sig_to_llvm_sig_full (ctx, sig, NULL, NULL);
1165 * LLVMFunctionType1:
1167 * Create an LLVM function type from the arguments.
1169 static G_GNUC_UNUSED LLVMTypeRef
1170 LLVMFunctionType1(LLVMTypeRef ReturnType,
1171 LLVMTypeRef ParamType1,
1174 LLVMTypeRef param_types [1];
1176 param_types [0] = ParamType1;
1178 return LLVMFunctionType (ReturnType, param_types, 1, IsVarArg);
1182 * LLVMFunctionType2:
1184 * Create an LLVM function type from the arguments.
1186 static G_GNUC_UNUSED LLVMTypeRef
1187 LLVMFunctionType2(LLVMTypeRef ReturnType,
1188 LLVMTypeRef ParamType1,
1189 LLVMTypeRef ParamType2,
1192 LLVMTypeRef param_types [2];
1194 param_types [0] = ParamType1;
1195 param_types [1] = ParamType2;
1197 return LLVMFunctionType (ReturnType, param_types, 2, IsVarArg);
1201 * LLVMFunctionType3:
1203 * Create an LLVM function type from the arguments.
1205 static G_GNUC_UNUSED LLVMTypeRef
1206 LLVMFunctionType3(LLVMTypeRef ReturnType,
1207 LLVMTypeRef ParamType1,
1208 LLVMTypeRef ParamType2,
1209 LLVMTypeRef ParamType3,
1212 LLVMTypeRef param_types [3];
1214 param_types [0] = ParamType1;
1215 param_types [1] = ParamType2;
1216 param_types [2] = ParamType3;
1218 return LLVMFunctionType (ReturnType, param_types, 3, IsVarArg);
1224 * Create an LLVM builder and remember it so it can be freed later.
1226 static LLVMBuilderRef
1227 create_builder (EmitContext *ctx)
1229 LLVMBuilderRef builder = LLVMCreateBuilder ();
1231 ctx->builders = g_slist_prepend_mempool (ctx->cfg->mempool, ctx->builders, builder);
1237 get_plt_entry (EmitContext *ctx, LLVMTypeRef llvm_sig, MonoJumpInfoType type, gconstpointer data)
1239 char *callee_name = mono_aot_get_plt_symbol (type, data);
1240 LLVMValueRef callee;
1245 if (ctx->cfg->compile_aot)
1246 /* Add a patch so referenced wrappers can be compiled in full aot mode */
1247 mono_add_patch_info (ctx->cfg, 0, type, data);
1250 callee = g_hash_table_lookup (ctx->lmodule->plt_entries, callee_name);
1252 callee = LLVMAddFunction (ctx->module, callee_name, llvm_sig);
1254 LLVMSetVisibility (callee, LLVMHiddenVisibility);
1256 g_hash_table_insert (ctx->lmodule->plt_entries, (char*)callee_name, callee);
1263 get_handler_clause (MonoCompile *cfg, MonoBasicBlock *bb)
1265 MonoMethodHeader *header = cfg->header;
1266 MonoExceptionClause *clause;
1270 if (bb->region != -1 && MONO_BBLOCK_IS_IN_REGION (bb, MONO_REGION_TRY))
1271 return (bb->region >> 8) - 1;
1274 for (i = 0; i < header->num_clauses; ++i) {
1275 clause = &header->clauses [i];
1277 if (MONO_OFFSET_IN_CLAUSE (clause, bb->real_offset) && clause->flags == MONO_EXCEPTION_CLAUSE_NONE)
1285 set_metadata_flag (LLVMValueRef v, const char *flag_name)
1287 LLVMValueRef md_arg;
1290 md_kind = LLVMGetMDKindID (flag_name, strlen (flag_name));
1291 md_arg = LLVMMDString ("mono", 4);
1292 LLVMSetMetadata (v, md_kind, LLVMMDNode (&md_arg, 1));
1296 set_invariant_load_flag (LLVMValueRef v)
1298 LLVMValueRef md_arg;
1300 const char *flag_name;
1302 // FIXME: Cache this
1303 flag_name = "invariant.load";
1304 md_kind = LLVMGetMDKindID (flag_name, strlen (flag_name));
1305 md_arg = LLVMMDString ("<index>", strlen ("<index>"));
1306 LLVMSetMetadata (v, md_kind, LLVMMDNode (&md_arg, 1));
1312 * Emit an LLVM call or invoke instruction depending on whenever the call is inside
1316 emit_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, LLVMValueRef callee, LLVMValueRef *args, int pindex)
1318 MonoCompile *cfg = ctx->cfg;
1320 LLVMBuilderRef builder = *builder_ref;
1323 clause_index = get_handler_clause (cfg, bb);
1325 if (clause_index != -1) {
1326 MonoMethodHeader *header = cfg->header;
1327 MonoExceptionClause *ec = &header->clauses [clause_index];
1328 MonoBasicBlock *tblock;
1329 LLVMBasicBlockRef ex_bb, noex_bb;
1332 * Have to use an invoke instead of a call, branching to the
1333 * handler bblock of the clause containing this bblock.
1336 g_assert (ec->flags == MONO_EXCEPTION_CLAUSE_NONE || ec->flags == MONO_EXCEPTION_CLAUSE_FINALLY);
1338 tblock = cfg->cil_offset_to_bb [ec->handler_offset];
1341 ctx->bblocks [tblock->block_num].invoke_target = TRUE;
1343 ex_bb = get_bb (ctx, tblock);
1345 noex_bb = gen_bb (ctx, "NOEX_BB");
1348 lcall = LLVMBuildInvoke (builder, callee, args, pindex, noex_bb, ex_bb, "");
1350 builder = ctx->builder = create_builder (ctx);
1351 LLVMPositionBuilderAtEnd (ctx->builder, noex_bb);
1353 ctx->bblocks [bb->block_num].end_bblock = noex_bb;
1355 lcall = LLVMBuildCall (builder, callee, args, pindex, "");
1356 ctx->builder = builder;
1359 *builder_ref = ctx->builder;
1365 emit_load (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, int size, LLVMValueRef addr, const char *name, gboolean is_faulting)
1367 const char *intrins_name;
1368 LLVMValueRef args [16], res;
1369 LLVMTypeRef addr_type;
1371 if (is_faulting && bb->region != -1) {
1373 * We handle loads which can fault by calling a mono specific intrinsic
1374 * using an invoke, so they are handled properly inside try blocks.
1375 * We can't use this outside clauses, since LLVM optimizes intrinsics which
1376 * are marked with IntrReadArgMem.
1380 intrins_name = "llvm.mono.load.i8.p0i8";
1383 intrins_name = "llvm.mono.load.i16.p0i16";
1386 intrins_name = "llvm.mono.load.i32.p0i32";
1389 intrins_name = "llvm.mono.load.i64.p0i64";
1392 g_assert_not_reached ();
1395 addr_type = LLVMTypeOf (addr);
1396 if (addr_type == LLVMPointerType (LLVMDoubleType (), 0) || addr_type == LLVMPointerType (LLVMFloatType (), 0))
1397 addr = LLVMBuildBitCast (*builder_ref, addr, LLVMPointerType (LLVMIntType (size * 8), 0), "");
1400 args [1] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
1401 args [2] = LLVMConstInt (LLVMInt1Type (), TRUE, FALSE);
1402 res = emit_call (ctx, bb, builder_ref, LLVMGetNamedFunction (ctx->module, intrins_name), args, 3);
1404 if (addr_type == LLVMPointerType (LLVMDoubleType (), 0))
1405 res = LLVMBuildBitCast (*builder_ref, res, LLVMDoubleType (), "");
1406 else if (addr_type == LLVMPointerType (LLVMFloatType (), 0))
1407 res = LLVMBuildBitCast (*builder_ref, res, LLVMFloatType (), "");
1414 * We emit volatile loads for loads which can fault, because otherwise
1415 * LLVM will generate invalid code when encountering a load from a
1418 res = mono_llvm_build_load (*builder_ref, addr, name, is_faulting);
1420 /* Mark it with a custom metadata */
1423 set_metadata_flag (res, "mono.faulting.load");
1431 emit_store (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, int size, LLVMValueRef value, LLVMValueRef addr, gboolean is_faulting)
1433 const char *intrins_name;
1434 LLVMValueRef args [16];
1436 if (is_faulting && bb->region != -1) {
1439 intrins_name = "llvm.mono.store.i8.p0i8";
1442 intrins_name = "llvm.mono.store.i16.p0i16";
1445 intrins_name = "llvm.mono.store.i32.p0i32";
1448 intrins_name = "llvm.mono.store.i64.p0i64";
1451 g_assert_not_reached ();
1454 if (LLVMTypeOf (value) == LLVMDoubleType () || LLVMTypeOf (value) == LLVMFloatType ()) {
1455 value = LLVMBuildBitCast (*builder_ref, value, LLVMIntType (size * 8), "");
1456 addr = LLVMBuildBitCast (*builder_ref, addr, LLVMPointerType (LLVMIntType (size * 8), 0), "");
1461 args [2] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
1462 args [3] = LLVMConstInt (LLVMInt1Type (), TRUE, FALSE);
1463 emit_call (ctx, bb, builder_ref, LLVMGetNamedFunction (ctx->module, intrins_name), args, 4);
1465 LLVMBuildStore (*builder_ref, value, addr);
1470 * emit_cond_system_exception:
1472 * Emit code to throw the exception EXC_TYPE if the condition CMP is false.
1473 * Might set the ctx exception.
1476 emit_cond_system_exception (EmitContext *ctx, MonoBasicBlock *bb, const char *exc_type, LLVMValueRef cmp)
1478 LLVMBasicBlockRef ex_bb, noex_bb;
1479 LLVMBuilderRef builder;
1480 MonoClass *exc_class;
1481 LLVMValueRef args [2];
1483 ex_bb = gen_bb (ctx, "EX_BB");
1484 noex_bb = gen_bb (ctx, "NOEX_BB");
1486 LLVMBuildCondBr (ctx->builder, cmp, ex_bb, noex_bb);
1488 exc_class = mono_class_from_name (mono_get_corlib (), "System", exc_type);
1489 g_assert (exc_class);
1491 /* Emit exception throwing code */
1492 builder = create_builder (ctx);
1493 LLVMPositionBuilderAtEnd (builder, ex_bb);
1495 if (!ctx->lmodule->throw_corlib_exception) {
1496 LLVMValueRef callee;
1498 const char *icall_name;
1500 MonoMethodSignature *throw_sig = mono_metadata_signature_alloc (mono_get_corlib (), 2);
1501 throw_sig->ret = &mono_get_void_class ()->byval_arg;
1502 throw_sig->params [0] = &mono_get_int32_class ()->byval_arg;
1503 icall_name = "llvm_throw_corlib_exception_abs_trampoline";
1504 throw_sig->params [1] = &mono_get_intptr_class ()->byval_arg;
1505 sig = sig_to_llvm_sig (ctx, throw_sig);
1507 if (ctx->cfg->compile_aot) {
1508 callee = get_plt_entry (ctx, sig, MONO_PATCH_INFO_INTERNAL_METHOD, icall_name);
1510 callee = LLVMAddFunction (ctx->module, "llvm_throw_corlib_exception_trampoline", sig_to_llvm_sig (ctx, throw_sig));
1513 * Differences between the LLVM/non-LLVM throw corlib exception trampoline:
1514 * - On x86, LLVM generated code doesn't push the arguments
1515 * - When using the LLVM mono branch, the trampoline takes the throw address as an
1516 * arguments, not a pc offset.
1518 LLVMAddGlobalMapping (ee, callee, resolve_patch (ctx->cfg, MONO_PATCH_INFO_INTERNAL_METHOD, icall_name));
1521 mono_memory_barrier ();
1522 ctx->lmodule->throw_corlib_exception = callee;
1526 args [0] = LLVMConstInt (LLVMInt32Type (), exc_class->type_token - MONO_TOKEN_TYPE_DEF, FALSE);
1528 args [0] = LLVMConstInt (LLVMInt32Type (), exc_class->type_token, FALSE);
1531 * The LLVM mono branch contains changes so a block address can be passed as an
1532 * argument to a call.
1534 args [1] = LLVMBuildPtrToInt (builder, LLVMBlockAddress (ctx->lmethod, ex_bb), IntPtrType (), "");
1535 emit_call (ctx, bb, &builder, ctx->lmodule->throw_corlib_exception, args, 2);
1537 LLVMBuildUnreachable (builder);
1539 ctx->builder = create_builder (ctx);
1540 LLVMPositionBuilderAtEnd (ctx->builder, noex_bb);
1542 ctx->bblocks [bb->block_num].end_bblock = noex_bb;
1549 * emit_reg_to_vtype:
1551 * Emit code to store the vtype in the registers REGS to the address ADDRESS.
1554 emit_reg_to_vtype (EmitContext *ctx, LLVMBuilderRef builder, MonoType *t, LLVMValueRef address, LLVMArgInfo *ainfo, LLVMValueRef *regs)
1558 size = get_vtype_size (t);
1560 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) {
1561 address = LLVMBuildBitCast (ctx->builder, address, LLVMPointerType (LLVMInt8Type (), 0), "");
1564 for (j = 0; j < 2; ++j) {
1565 LLVMValueRef index [2], addr;
1566 int part_size = size > sizeof (gpointer) ? sizeof (gpointer) : size;
1567 LLVMTypeRef part_type;
1569 if (ainfo->pair_storage [j] == LLVMArgNone)
1572 part_type = LLVMIntType (part_size * 8);
1573 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) {
1574 index [0] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE);
1575 addr = LLVMBuildGEP (builder, address, index, 1, "");
1577 index [0] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
1578 index [1] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE);
1579 addr = LLVMBuildGEP (builder, address, index, 2, "");
1581 switch (ainfo->pair_storage [j]) {
1583 LLVMBuildStore (builder, convert (ctx, regs [j], part_type), LLVMBuildBitCast (ctx->builder, addr, LLVMPointerType (part_type, 0), ""));
1588 g_assert_not_reached ();
1591 size -= sizeof (gpointer);
1596 * emit_vtype_to_reg:
1598 * Emit code to load a vtype at address ADDRESS into registers. Store the registers
1599 * into REGS, and the number of registers into NREGS.
1602 emit_vtype_to_reg (EmitContext *ctx, LLVMBuilderRef builder, MonoType *t, LLVMValueRef address, LLVMArgInfo *ainfo, LLVMValueRef *regs, guint32 *nregs)
1607 size = get_vtype_size (t);
1609 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) {
1610 address = LLVMBuildBitCast (ctx->builder, address, LLVMPointerType (LLVMInt8Type (), 0), "");
1613 for (j = 0; j < 2; ++j) {
1614 LLVMValueRef index [2], addr;
1615 int partsize = size > sizeof (gpointer) ? sizeof (gpointer) : size;
1617 if (ainfo->pair_storage [j] == LLVMArgNone)
1620 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (t))) {
1621 index [0] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE);
1622 addr = LLVMBuildGEP (builder, address, index, 1, "");
1624 index [0] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
1625 index [1] = LLVMConstInt (LLVMInt32Type (), j * sizeof (gpointer), FALSE);
1626 addr = LLVMBuildGEP (builder, address, index, 2, "");
1628 switch (ainfo->pair_storage [j]) {
1630 regs [pindex ++] = convert (ctx, LLVMBuildLoad (builder, LLVMBuildBitCast (ctx->builder, addr, LLVMPointerType (LLVMIntType (partsize * 8), 0), ""), ""), IntPtrType ());
1635 g_assert_not_reached ();
1637 size -= sizeof (gpointer);
1644 build_alloca (EmitContext *ctx, MonoType *t)
1646 MonoClass *k = mono_class_from_mono_type (t);
1649 if (MONO_CLASS_IS_SIMD (ctx->cfg, k))
1652 align = mono_class_min_align (k);
1654 /* Sometimes align is not a power of 2 */
1655 while (mono_is_power_of_two (align) == -1)
1659 * Have to place all alloca's at the end of the entry bb, since otherwise they would
1660 * get executed every time control reaches them.
1662 LLVMPositionBuilder (ctx->alloca_builder, get_bb (ctx, ctx->cfg->bb_entry), ctx->last_alloca);
1664 ctx->last_alloca = mono_llvm_build_alloca (ctx->alloca_builder, type_to_llvm_type (ctx, t), NULL, align, "");
1665 return ctx->last_alloca;
1669 * Put the global into the 'llvm.used' array to prevent it from being optimized away.
1672 mark_as_used (LLVMModuleRef module, LLVMValueRef global)
1674 LLVMTypeRef used_type;
1675 LLVMValueRef used, used_elem;
1677 used_type = LLVMArrayType (LLVMPointerType (LLVMInt8Type (), 0), 1);
1678 used = LLVMAddGlobal (module, used_type, "llvm.used");
1679 used_elem = LLVMConstBitCast (global, LLVMPointerType (LLVMInt8Type (), 0));
1680 LLVMSetInitializer (used, LLVMConstArray (LLVMPointerType (LLVMInt8Type (), 0), &used_elem, 1));
1681 LLVMSetLinkage (used, LLVMAppendingLinkage);
1682 LLVMSetSection (used, "llvm.metadata");
1688 * Emit code to load/convert arguments.
1691 emit_entry_bb (EmitContext *ctx, LLVMBuilderRef builder)
1694 MonoCompile *cfg = ctx->cfg;
1695 MonoMethodSignature *sig = ctx->sig;
1696 LLVMCallInfo *linfo = ctx->linfo;
1699 ctx->alloca_builder = create_builder (ctx);
1702 * Handle indirect/volatile variables by allocating memory for them
1703 * using 'alloca', and storing their address in a temporary.
1705 for (i = 0; i < cfg->num_varinfo; ++i) {
1706 MonoInst *var = cfg->varinfo [i];
1709 if (var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT) || mini_type_is_vtype (cfg, var->inst_vtype)) {
1710 vtype = type_to_llvm_type (ctx, var->inst_vtype);
1711 CHECK_FAILURE (ctx);
1712 /* Could be already created by an OP_VPHI */
1713 if (!ctx->addresses [var->dreg])
1714 ctx->addresses [var->dreg] = build_alloca (ctx, var->inst_vtype);
1715 ctx->vreg_cli_types [var->dreg] = var->inst_vtype;
1719 for (i = 0; i < sig->param_count; ++i) {
1720 LLVMArgInfo *ainfo = &linfo->args [i + sig->hasthis];
1721 int reg = cfg->args [i + sig->hasthis]->dreg;
1723 if (ainfo->storage == LLVMArgVtypeInReg) {
1724 LLVMValueRef regs [2];
1727 * Emit code to save the argument from the registers to
1728 * the real argument.
1730 pindex = ctx->pindexes [i];
1731 regs [0] = LLVMGetParam (ctx->lmethod, pindex);
1732 if (ainfo->pair_storage [1] != LLVMArgNone)
1733 regs [1] = LLVMGetParam (ctx->lmethod, pindex + 1);
1737 ctx->addresses [reg] = build_alloca (ctx, sig->params [i]);
1739 emit_reg_to_vtype (ctx, builder, sig->params [i], ctx->addresses [reg], ainfo, regs);
1741 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (sig->params [i]))) {
1742 /* Treat these as normal values */
1743 ctx->values [reg] = LLVMBuildLoad (builder, ctx->addresses [reg], "");
1745 } else if (ainfo->storage == LLVMArgVtypeByVal) {
1746 ctx->addresses [reg] = LLVMGetParam (ctx->lmethod, ctx->pindexes [i]);
1748 if (MONO_CLASS_IS_SIMD (ctx->cfg, mono_class_from_mono_type (sig->params [i]))) {
1749 /* Treat these as normal values */
1750 ctx->values [reg] = LLVMBuildLoad (builder, ctx->addresses [reg], "");
1753 ctx->values [reg] = convert (ctx, ctx->values [reg], llvm_type_to_stack_type (type_to_llvm_type (ctx, sig->params [i])));
1758 emit_volatile_store (ctx, cfg->vret_addr->dreg);
1760 emit_volatile_store (ctx, cfg->args [0]->dreg);
1761 for (i = 0; i < sig->param_count; ++i)
1762 if (!mini_type_is_vtype (cfg, sig->params [i]))
1763 emit_volatile_store (ctx, cfg->args [i + sig->hasthis]->dreg);
1765 if (sig->hasthis && !cfg->rgctx_var && cfg->generic_sharing_context) {
1766 LLVMValueRef this_alloc;
1769 * The exception handling code needs the location where the this argument was
1770 * stored for gshared methods. We create a separate alloca to hold it, and mark it
1771 * with the "mono.this" custom metadata to tell llvm that it needs to save its
1772 * location into the LSDA.
1774 this_alloc = mono_llvm_build_alloca (builder, ThisType (), LLVMConstInt (LLVMInt32Type (), 1, FALSE), 0, "");
1775 /* This volatile store will keep the alloca alive */
1776 mono_llvm_build_store (builder, ctx->values [cfg->args [0]->dreg], this_alloc, TRUE);
1778 set_metadata_flag (this_alloc, "mono.this");
1781 if (cfg->rgctx_var) {
1782 LLVMValueRef rgctx_alloc, store;
1785 * We handle the rgctx arg similarly to the this pointer.
1787 g_assert (ctx->addresses [cfg->rgctx_var->dreg]);
1788 rgctx_alloc = ctx->addresses [cfg->rgctx_var->dreg];
1789 /* This volatile store will keep the alloca alive */
1790 store = mono_llvm_build_store (builder, ctx->rgctx_arg, rgctx_alloc, TRUE);
1792 set_metadata_flag (rgctx_alloc, "mono.this");
1796 * For finally clauses, create an indicator variable telling OP_ENDFINALLY whenever
1797 * it needs to continue normally, or return back to the exception handling system.
1799 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
1800 if (bb->region != -1 && (bb->flags & BB_EXCEPTION_HANDLER))
1801 g_hash_table_insert (ctx->region_to_handler, GUINT_TO_POINTER (mono_get_block_region_notry (cfg, bb->region)), bb);
1802 if (bb->region != -1 && (bb->flags & BB_EXCEPTION_HANDLER) && bb->in_scount == 0) {
1806 sprintf (name, "finally_ind_bb%d", bb->block_num);
1807 val = LLVMBuildAlloca (builder, LLVMInt32Type (), name);
1808 LLVMBuildStore (builder, LLVMConstInt (LLVMInt32Type (), 0, FALSE), val);
1810 ctx->bblocks [bb->block_num].finally_ind = val;
1813 * Create a new bblock which CALL_HANDLER can branch to, because branching to the
1814 * LLVM bblock containing the call to llvm.eh.selector causes problems for the
1815 * LLVM optimizer passes.
1817 sprintf (name, "BB_%d_CALL_HANDLER_TARGET", bb->block_num);
1818 ctx->bblocks [bb->block_num].call_handler_target_bb = LLVMAppendBasicBlock (ctx->lmethod, name);
1826 /* Have to export this for AOT */
1828 mono_personality (void);
1831 mono_personality (void)
1834 g_assert_not_reached ();
1838 process_call (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, MonoInst *ins)
1840 MonoCompile *cfg = ctx->cfg;
1841 LLVMModuleRef module = ctx->module;
1842 LLVMValueRef *values = ctx->values;
1843 LLVMValueRef *addresses = ctx->addresses;
1844 MonoCallInst *call = (MonoCallInst*)ins;
1845 MonoMethodSignature *sig = call->signature;
1846 LLVMValueRef callee = NULL, lcall;
1848 LLVMCallInfo *cinfo;
1852 LLVMTypeRef llvm_sig;
1854 gboolean virtual, calli;
1855 LLVMBuilderRef builder = *builder_ref;
1858 if (call->signature->call_convention != MONO_CALL_DEFAULT)
1859 LLVM_FAILURE (ctx, "non-default callconv");
1861 cinfo = call->cinfo;
1862 if (call->rgctx_arg_reg)
1863 cinfo->rgctx_arg = TRUE;
1864 if (call->imt_arg_reg)
1865 cinfo->imt_arg = TRUE;
1867 vretaddr = cinfo && cinfo->ret.storage == LLVMArgVtypeRetAddr;
1869 llvm_sig = sig_to_llvm_sig_full (ctx, sig, cinfo, &sinfo);
1870 CHECK_FAILURE (ctx);
1872 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);
1873 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);
1875 /* FIXME: Avoid creating duplicate methods */
1877 if (ins->flags & MONO_INST_HAS_METHOD) {
1881 if (cfg->compile_aot) {
1882 callee = get_plt_entry (ctx, llvm_sig, MONO_PATCH_INFO_METHOD, call->method);
1884 LLVM_FAILURE (ctx, "can't encode patch");
1886 callee = LLVMAddFunction (module, "", llvm_sig);
1889 mono_create_jit_trampoline_in_domain (mono_domain_get (),
1891 LLVMAddGlobalMapping (ee, callee, target);
1895 if (call->method && strstr (call->method->klass->name, "AsyncVoidMethodBuilder"))
1896 /* LLVM miscompiles async methods */
1897 LLVM_FAILURE (ctx, "#13734");
1900 MonoJitICallInfo *info = mono_find_jit_icall_by_addr (call->fptr);
1906 memset (&ji, 0, sizeof (ji));
1907 ji.type = MONO_PATCH_INFO_JIT_ICALL_ADDR;
1908 ji.data.target = info->name;
1910 target = mono_resolve_patch_target (cfg->method, cfg->domain, NULL, &ji, FALSE);
1912 if (cfg->compile_aot) {
1913 callee = get_plt_entry (ctx, llvm_sig, MONO_PATCH_INFO_INTERNAL_METHOD, (char*)info->name);
1915 LLVM_FAILURE (ctx, "can't encode patch");
1917 callee = LLVMAddFunction (module, "", llvm_sig);
1918 target = (gpointer)mono_icall_get_wrapper (info);
1919 LLVMAddGlobalMapping (ee, callee, target);
1922 if (cfg->compile_aot) {
1924 if (cfg->abs_patches) {
1925 MonoJumpInfo *abs_ji = g_hash_table_lookup (cfg->abs_patches, call->fptr);
1927 callee = get_plt_entry (ctx, llvm_sig, abs_ji->type, abs_ji->data.target);
1929 LLVM_FAILURE (ctx, "can't encode patch");
1933 LLVM_FAILURE (ctx, "aot");
1935 callee = LLVMAddFunction (module, "", llvm_sig);
1937 if (cfg->abs_patches) {
1938 MonoJumpInfo *abs_ji = g_hash_table_lookup (cfg->abs_patches, call->fptr);
1941 * FIXME: Some trampolines might have
1942 * their own calling convention on some platforms.
1944 #ifndef TARGET_AMD64
1945 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)
1946 LLVM_FAILURE (ctx, "trampoline with own cconv");
1948 target = mono_resolve_patch_target (cfg->method, cfg->domain, NULL, abs_ji, FALSE);
1949 LLVMAddGlobalMapping (ee, callee, target);
1953 LLVMAddGlobalMapping (ee, callee, (gpointer)call->fptr);
1959 int size = sizeof (gpointer);
1962 g_assert (ins->inst_offset % size == 0);
1963 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);
1965 callee = convert (ctx, LLVMBuildLoad (builder, LLVMBuildGEP (builder, convert (ctx, values [ins->inst_basereg], LLVMPointerType (LLVMPointerType (IntPtrType (), 0), 0)), &index, 1, ""), ""), LLVMPointerType (llvm_sig, 0));
1967 callee = convert (ctx, values [ins->sreg1], LLVMPointerType (llvm_sig, 0));
1969 if (ins->flags & MONO_INST_HAS_METHOD) {
1974 * Collect and convert arguments
1976 nargs = (sig->param_count * 2) + sig->hasthis + vretaddr + call->rgctx_reg + call->imt_arg_reg;
1977 len = sizeof (LLVMValueRef) * nargs;
1978 args = alloca (len);
1979 memset (args, 0, len);
1980 l = call->out_ireg_args;
1982 if (call->rgctx_arg_reg) {
1983 g_assert (values [call->rgctx_arg_reg]);
1984 g_assert (sinfo.rgctx_arg_pindex < nargs);
1985 args [sinfo.rgctx_arg_pindex] = values [call->rgctx_arg_reg];
1987 if (call->imt_arg_reg) {
1988 g_assert (values [call->imt_arg_reg]);
1989 g_assert (sinfo.imt_arg_pindex < nargs);
1990 args [sinfo.imt_arg_pindex] = values [call->imt_arg_reg];
1994 if (!addresses [call->inst.dreg])
1995 addresses [call->inst.dreg] = build_alloca (ctx, sig->ret);
1996 g_assert (sinfo.vret_arg_pindex < nargs);
1997 args [sinfo.vret_arg_pindex] = LLVMBuildPtrToInt (builder, addresses [call->inst.dreg], IntPtrType (), "");
2000 for (i = 0; i < sig->param_count + sig->hasthis; ++i) {
2003 LLVMArgInfo *ainfo = call->cinfo ? &call->cinfo->args [i] : NULL;
2007 pindex = sinfo.this_arg_pindex;
2009 pindex = sinfo.pindexes [i - 1];
2011 pindex = sinfo.pindexes [i];
2014 regpair = (guint32)(gssize)(l->data);
2015 reg = regpair & 0xffffff;
2016 args [pindex] = values [reg];
2017 if (ainfo->storage == LLVMArgVtypeInReg) {
2019 LLVMValueRef regs [2];
2024 g_assert (addresses [reg]);
2026 emit_vtype_to_reg (ctx, builder, sig->params [i - sig->hasthis], addresses [reg], ainfo, regs, &nregs);
2027 for (j = 0; j < nregs; ++j)
2028 args [pindex ++] = regs [j];
2031 // FIXME: Get rid of the VMOVE
2032 } else if (ainfo->storage == LLVMArgVtypeByVal) {
2033 g_assert (addresses [reg]);
2034 args [pindex] = addresses [reg];
2036 g_assert (args [pindex]);
2037 if (i == 0 && sig->hasthis)
2038 args [pindex] = convert (ctx, args [pindex], ThisType ());
2040 args [pindex] = convert (ctx, args [pindex], type_to_llvm_arg_type (ctx, sig->params [i - sig->hasthis]));
2046 // FIXME: Align call sites
2052 lcall = emit_call (ctx, bb, &builder, callee, args, LLVMCountParamTypes (llvm_sig));
2055 * Modify cconv and parameter attributes to pass rgctx/imt correctly.
2057 #if defined(MONO_ARCH_IMT_REG) && defined(MONO_ARCH_RGCTX_REG)
2058 g_assert (MONO_ARCH_IMT_REG == MONO_ARCH_RGCTX_REG);
2060 /* The two can't be used together, so use only one LLVM calling conv to pass them */
2061 g_assert (!(call->rgctx_arg_reg && call->imt_arg_reg));
2063 LLVMSetInstructionCallConv (lcall, LLVMMono1CallConv);
2065 if (call->rgctx_arg_reg)
2066 LLVMAddInstrAttribute (lcall, 1 + sinfo.rgctx_arg_pindex, LLVMInRegAttribute);
2067 if (call->imt_arg_reg)
2068 LLVMAddInstrAttribute (lcall, 1 + sinfo.imt_arg_pindex, LLVMInRegAttribute);
2070 /* Add byval attributes if needed */
2071 for (i = 0; i < sig->param_count; ++i) {
2072 LLVMArgInfo *ainfo = call->cinfo ? &call->cinfo->args [i + sig->hasthis] : NULL;
2074 if (ainfo && ainfo->storage == LLVMArgVtypeByVal) {
2075 LLVMAddInstrAttribute (lcall, 1 + sinfo.pindexes [i], LLVMByValAttribute);
2080 * Convert the result
2082 if (cinfo && cinfo->ret.storage == LLVMArgVtypeInReg) {
2083 LLVMValueRef regs [2];
2085 if (!addresses [ins->dreg])
2086 addresses [ins->dreg] = build_alloca (ctx, sig->ret);
2088 regs [0] = LLVMBuildExtractValue (builder, lcall, 0, "");
2089 if (cinfo->ret.pair_storage [1] != LLVMArgNone)
2090 regs [1] = LLVMBuildExtractValue (builder, lcall, 1, "");
2092 emit_reg_to_vtype (ctx, builder, sig->ret, addresses [ins->dreg], &cinfo->ret, regs);
2093 } else if (sig->ret->type != MONO_TYPE_VOID && !vretaddr) {
2094 /* If the method returns an unsigned value, need to zext it */
2096 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));
2099 *builder_ref = ctx->builder;
2101 g_free (sinfo.pindexes);
2109 process_bb (EmitContext *ctx, MonoBasicBlock *bb)
2111 MonoCompile *cfg = ctx->cfg;
2112 MonoMethodSignature *sig = ctx->sig;
2113 LLVMValueRef method = ctx->lmethod;
2114 LLVMValueRef *values = ctx->values;
2115 LLVMValueRef *addresses = ctx->addresses;
2117 LLVMCallInfo *linfo = ctx->linfo;
2118 LLVMModuleRef module = ctx->module;
2119 BBInfo *bblocks = ctx->bblocks;
2121 LLVMBasicBlockRef cbb;
2122 LLVMBuilderRef builder, starting_builder;
2123 gboolean has_terminator;
2125 LLVMValueRef lhs, rhs;
2128 cbb = get_bb (ctx, bb);
2129 builder = create_builder (ctx);
2130 ctx->builder = builder;
2131 LLVMPositionBuilderAtEnd (builder, cbb);
2133 if (bb == cfg->bb_entry)
2134 emit_entry_bb (ctx, builder);
2135 CHECK_FAILURE (ctx);
2137 if (bb->flags & BB_EXCEPTION_HANDLER) {
2139 LLVMValueRef personality;
2140 LLVMBasicBlockRef target_bb;
2142 static gint32 mapping_inited;
2143 static int ti_generator;
2146 LLVMValueRef type_info;
2149 if (!bblocks [bb->block_num].invoke_target) {
2151 * LLVM asserts if llvm.eh.selector is called from a bblock which
2152 * doesn't have an invoke pointing at it.
2153 * Update: LLVM no longer asserts, but some tests in exceptions.exe now fail.
2155 LLVM_FAILURE (ctx, "handler without invokes");
2158 // <resultval> = landingpad <somety> personality <type> <pers_fn> <clause>+
2160 if (cfg->compile_aot) {
2161 /* Use a dummy personality function */
2162 personality = LLVMGetNamedFunction (module, "mono_aot_personality");
2163 g_assert (personality);
2165 personality = LLVMGetNamedFunction (module, "mono_personality");
2166 if (InterlockedCompareExchange (&mapping_inited, 1, 0) == 0)
2167 LLVMAddGlobalMapping (ee, personality, mono_personality);
2170 i8ptr = LLVMPointerType (LLVMInt8Type (), 0);
2172 clause_index = (mono_get_block_region_notry (cfg, bb->region) >> 8) - 1;
2175 * Create the type info
2177 sprintf (ti_name, "type_info_%d", ti_generator);
2180 if (cfg->compile_aot) {
2181 /* decode_eh_frame () in aot-runtime.c will decode this */
2182 type_info = LLVMAddGlobal (module, LLVMInt32Type (), ti_name);
2183 LLVMSetInitializer (type_info, LLVMConstInt (LLVMInt32Type (), clause_index, FALSE));
2186 * These symbols are not really used, the clause_index is embedded into the EH tables generated by DwarfMonoException in LLVM.
2188 LLVMSetLinkage (type_info, LLVMInternalLinkage);
2191 * Enabling this causes llc to crash:
2192 * http://llvm.org/bugs/show_bug.cgi?id=6102
2194 //LLVM_FAILURE (ctx, "aot+clauses");
2196 // test_0_invalid_unbox_arrays () fails
2197 LLVM_FAILURE (ctx, "aot+clauses");
2201 * After the cfg mempool is freed, the type info will point to stale memory,
2202 * but this is not a problem, since we decode it once in exception_cb during
2205 ti = mono_mempool_alloc (cfg->mempool, sizeof (gint32));
2206 *(gint32*)ti = clause_index;
2208 type_info = LLVMAddGlobal (module, i8ptr, ti_name);
2210 LLVMAddGlobalMapping (ee, type_info, ti);
2214 LLVMTypeRef members [2], ret_type;
2215 LLVMValueRef landing_pad;
2217 members [0] = i8ptr;
2218 members [1] = LLVMInt32Type ();
2219 ret_type = LLVMStructType (members, 2, FALSE);
2221 landing_pad = LLVMBuildLandingPad (builder, ret_type, personality, 1, "");
2222 LLVMAddClause (landing_pad, type_info);
2224 /* Store the exception into the exvar */
2225 if (bb->in_scount == 1) {
2226 g_assert (bb->in_scount == 1);
2227 exvar = bb->in_stack [0];
2229 // FIXME: This is shared with filter clauses ?
2230 g_assert (!values [exvar->dreg]);
2232 values [exvar->dreg] = LLVMBuildExtractValue (builder, landing_pad, 0, "ex_obj");
2233 emit_volatile_store (ctx, exvar->dreg);
2237 /* Start a new bblock which CALL_HANDLER can branch to */
2238 target_bb = bblocks [bb->block_num].call_handler_target_bb;
2240 LLVMBuildBr (builder, target_bb);
2242 ctx->builder = builder = create_builder (ctx);
2243 LLVMPositionBuilderAtEnd (ctx->builder, target_bb);
2245 ctx->bblocks [bb->block_num].end_bblock = target_bb;
2249 has_terminator = FALSE;
2250 starting_builder = builder;
2251 for (ins = bb->code; ins; ins = ins->next) {
2252 const char *spec = LLVM_INS_INFO (ins->opcode);
2254 char dname_buf [128];
2257 if (nins > 5000 && builder == starting_builder) {
2258 /* some steps in llc are non-linear in the size of basic blocks, see #5714 */
2259 LLVM_FAILURE (ctx, "basic block too long");
2263 /* There could be instructions after a terminator, skip them */
2266 if (spec [MONO_INST_DEST] != ' ' && !MONO_IS_STORE_MEMBASE (ins)) {
2267 sprintf (dname_buf, "t%d", ins->dreg);
2271 if (spec [MONO_INST_SRC1] != ' ' && spec [MONO_INST_SRC1] != 'v') {
2272 MonoInst *var = get_vreg_to_inst (cfg, ins->sreg1);
2274 if (var && var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT)) {
2275 lhs = emit_volatile_load (ctx, ins->sreg1);
2277 /* It is ok for SETRET to have an uninitialized argument */
2278 if (!values [ins->sreg1] && ins->opcode != OP_SETRET)
2279 LLVM_FAILURE (ctx, "sreg1");
2280 lhs = values [ins->sreg1];
2286 if (spec [MONO_INST_SRC2] != ' ' && spec [MONO_INST_SRC2] != ' ') {
2287 MonoInst *var = get_vreg_to_inst (cfg, ins->sreg2);
2288 if (var && var->flags & (MONO_INST_VOLATILE|MONO_INST_INDIRECT)) {
2289 rhs = emit_volatile_load (ctx, ins->sreg2);
2291 if (!values [ins->sreg2])
2292 LLVM_FAILURE (ctx, "sreg2");
2293 rhs = values [ins->sreg2];
2299 //mono_print_ins (ins);
2300 switch (ins->opcode) {
2303 case OP_LIVERANGE_START:
2304 case OP_LIVERANGE_END:
2307 values [ins->dreg] = LLVMConstInt (LLVMInt32Type (), ins->inst_c0, FALSE);
2310 #if SIZEOF_VOID_P == 4
2311 values [ins->dreg] = LLVMConstInt (LLVMInt64Type (), GET_LONG_IMM (ins), FALSE);
2313 values [ins->dreg] = LLVMConstInt (LLVMInt64Type (), (gint64)ins->inst_c0, FALSE);
2317 values [ins->dreg] = LLVMConstReal (LLVMDoubleType (), *(double*)ins->inst_p0);
2320 values [ins->dreg] = LLVMConstFPExt (LLVMConstReal (LLVMFloatType (), *(float*)ins->inst_p0), LLVMDoubleType ());
2323 LLVMBuildBr (builder, get_bb (ctx, ins->inst_target_bb));
2324 has_terminator = TRUE;
2330 LLVMBasicBlockRef new_bb;
2331 LLVMBuilderRef new_builder;
2333 // The default branch is already handled
2334 // FIXME: Handle it here
2336 /* Start new bblock */
2337 sprintf (bb_name, "SWITCH_DEFAULT_BB%d", ctx->default_index ++);
2338 new_bb = LLVMAppendBasicBlock (ctx->lmethod, bb_name);
2340 lhs = convert (ctx, lhs, LLVMInt32Type ());
2341 v = LLVMBuildSwitch (builder, lhs, new_bb, GPOINTER_TO_UINT (ins->klass));
2342 for (i = 0; i < GPOINTER_TO_UINT (ins->klass); ++i) {
2343 MonoBasicBlock *target_bb = ins->inst_many_bb [i];
2345 LLVMAddCase (v, LLVMConstInt (LLVMInt32Type (), i, FALSE), get_bb (ctx, target_bb));
2348 new_builder = create_builder (ctx);
2349 LLVMPositionBuilderAtEnd (new_builder, new_bb);
2350 LLVMBuildUnreachable (new_builder);
2352 has_terminator = TRUE;
2353 g_assert (!ins->next);
2359 if (linfo->ret.storage == LLVMArgVtypeInReg) {
2360 LLVMTypeRef ret_type = LLVMGetReturnType (LLVMGetElementType (LLVMTypeOf (method)));
2361 LLVMValueRef part1, retval;
2364 size = get_vtype_size (sig->ret);
2366 g_assert (addresses [ins->sreg1]);
2368 g_assert (linfo->ret.pair_storage [0] == LLVMArgInIReg);
2369 g_assert (linfo->ret.pair_storage [1] == LLVMArgNone);
2371 part1 = convert (ctx, LLVMBuildLoad (builder, LLVMBuildBitCast (builder, addresses [ins->sreg1], LLVMPointerType (LLVMIntType (size * 8), 0), ""), ""), IntPtrType ());
2373 retval = LLVMBuildInsertValue (builder, LLVMGetUndef (ret_type), part1, 0, "");
2375 LLVMBuildRet (builder, retval);
2379 if (linfo->ret.storage == LLVMArgVtypeRetAddr) {
2380 LLVMBuildRetVoid (builder);
2384 if (!lhs || ctx->is_dead [ins->sreg1]) {
2386 * The method did not set its return value, probably because it
2387 * ends with a throw.
2390 LLVMBuildRetVoid (builder);
2392 LLVMBuildRet (builder, LLVMConstNull (type_to_llvm_type (ctx, sig->ret)));
2394 LLVMBuildRet (builder, convert (ctx, lhs, type_to_llvm_type (ctx, sig->ret)));
2396 has_terminator = TRUE;
2402 case OP_ICOMPARE_IMM:
2403 case OP_LCOMPARE_IMM:
2404 case OP_COMPARE_IMM: {
2408 if (ins->next->opcode == OP_NOP)
2411 if (ins->next->opcode == OP_BR)
2412 /* The comparison result is not needed */
2415 rel = mono_opcode_to_cond (ins->next->opcode);
2417 if (ins->opcode == OP_ICOMPARE_IMM) {
2418 lhs = convert (ctx, lhs, LLVMInt32Type ());
2419 rhs = LLVMConstInt (LLVMInt32Type (), ins->inst_imm, FALSE);
2421 if (ins->opcode == OP_LCOMPARE_IMM) {
2422 lhs = convert (ctx, lhs, LLVMInt64Type ());
2423 rhs = LLVMConstInt (LLVMInt64Type (), GET_LONG_IMM (ins), FALSE);
2425 if (ins->opcode == OP_LCOMPARE) {
2426 lhs = convert (ctx, lhs, LLVMInt64Type ());
2427 rhs = convert (ctx, rhs, LLVMInt64Type ());
2429 if (ins->opcode == OP_ICOMPARE) {
2430 lhs = convert (ctx, lhs, LLVMInt32Type ());
2431 rhs = convert (ctx, rhs, LLVMInt32Type ());
2435 if (LLVMGetTypeKind (LLVMTypeOf (lhs)) == LLVMPointerTypeKind)
2436 rhs = convert (ctx, rhs, LLVMTypeOf (lhs));
2437 else if (LLVMGetTypeKind (LLVMTypeOf (rhs)) == LLVMPointerTypeKind)
2438 lhs = convert (ctx, lhs, LLVMTypeOf (rhs));
2441 /* We use COMPARE+SETcc/Bcc, llvm uses SETcc+br cond */
2442 if (ins->opcode == OP_FCOMPARE)
2443 cmp = LLVMBuildFCmp (builder, fpcond_to_llvm_cond [rel], convert (ctx, lhs, LLVMDoubleType ()), convert (ctx, rhs, LLVMDoubleType ()), "");
2444 else if (ins->opcode == OP_COMPARE_IMM)
2445 cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], convert (ctx, lhs, IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_imm, FALSE), "");
2446 else if (ins->opcode == OP_LCOMPARE_IMM) {
2447 if (SIZEOF_REGISTER == 4 && COMPILE_LLVM (cfg)) {
2448 /* The immediate is encoded in two fields */
2449 guint64 l = ((guint64)(guint32)ins->inst_offset << 32) | ((guint32)ins->inst_imm);
2450 cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], convert (ctx, lhs, LLVMInt64Type ()), LLVMConstInt (LLVMInt64Type (), l, FALSE), "");
2452 cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], convert (ctx, lhs, LLVMInt64Type ()), LLVMConstInt (LLVMInt64Type (), ins->inst_imm, FALSE), "");
2455 else if (ins->opcode == OP_COMPARE)
2456 cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], convert (ctx, lhs, IntPtrType ()), convert (ctx, rhs, IntPtrType ()), "");
2458 cmp = LLVMBuildICmp (builder, cond_to_llvm_cond [rel], lhs, rhs, "");
2460 if (MONO_IS_COND_BRANCH_OP (ins->next)) {
2461 if (ins->next->inst_true_bb == ins->next->inst_false_bb) {
2463 * If the target bb contains PHI instructions, LLVM requires
2464 * two PHI entries for this bblock, while we only generate one.
2465 * So convert this to an unconditional bblock. (bxc #171).
2467 LLVMBuildBr (builder, get_bb (ctx, ins->next->inst_true_bb));
2469 LLVMBuildCondBr (builder, cmp, get_bb (ctx, ins->next->inst_true_bb), get_bb (ctx, ins->next->inst_false_bb));
2471 has_terminator = TRUE;
2472 } else if (MONO_IS_SETCC (ins->next)) {
2473 sprintf (dname_buf, "t%d", ins->next->dreg);
2475 values [ins->next->dreg] = LLVMBuildZExt (builder, cmp, LLVMInt32Type (), dname);
2477 /* Add stores for volatile variables */
2478 emit_volatile_store (ctx, ins->next->dreg);
2479 } else if (MONO_IS_COND_EXC (ins->next)) {
2480 emit_cond_system_exception (ctx, bb, ins->next->inst_p1, cmp);
2481 CHECK_FAILURE (ctx);
2482 builder = ctx->builder;
2484 LLVM_FAILURE (ctx, "next");
2498 rel = mono_opcode_to_cond (ins->opcode);
2500 cmp = LLVMBuildFCmp (builder, fpcond_to_llvm_cond [rel], convert (ctx, lhs, LLVMDoubleType ()), convert (ctx, rhs, LLVMDoubleType ()), "");
2501 values [ins->dreg] = LLVMBuildZExt (builder, cmp, LLVMInt32Type (), dname);
2509 gboolean empty = TRUE;
2511 /* Check that all input bblocks really branch to us */
2512 for (i = 0; i < bb->in_count; ++i) {
2513 if (bb->in_bb [i]->last_ins && bb->in_bb [i]->last_ins->opcode == OP_NOT_REACHED)
2514 ins->inst_phi_args [i + 1] = -1;
2520 /* LLVM doesn't like phi instructions with zero operands */
2521 ctx->is_dead [ins->dreg] = TRUE;
2525 /* Created earlier, insert it now */
2526 LLVMInsertIntoBuilder (builder, values [ins->dreg]);
2528 for (i = 0; i < ins->inst_phi_args [0]; i++) {
2529 int sreg1 = ins->inst_phi_args [i + 1];
2533 * Count the number of times the incoming bblock branches to us,
2534 * since llvm requires a separate entry for each.
2536 if (bb->in_bb [i]->last_ins && bb->in_bb [i]->last_ins->opcode == OP_SWITCH) {
2537 MonoInst *switch_ins = bb->in_bb [i]->last_ins;
2540 for (j = 0; j < GPOINTER_TO_UINT (switch_ins->klass); ++j) {
2541 if (switch_ins->inst_many_bb [j] == bb)
2548 /* Remember for later */
2549 for (j = 0; j < count; ++j) {
2550 PhiNode *node = mono_mempool_alloc0 (ctx->mempool, sizeof (PhiNode));
2553 node->in_bb = bb->in_bb [i];
2555 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);
2565 values [ins->dreg] = lhs;
2568 MonoInst *var = get_vreg_to_inst (cfg, ins->dreg);
2571 values [ins->dreg] = lhs;
2573 if (var && var->klass->byval_arg.type == MONO_TYPE_R4) {
2575 * This is added by the spilling pass in case of the JIT,
2576 * but we have to do it ourselves.
2578 values [ins->dreg] = convert (ctx, values [ins->dreg], LLVMFloatType ());
2612 lhs = convert (ctx, lhs, regtype_to_llvm_type (spec [MONO_INST_DEST]));
2613 rhs = convert (ctx, rhs, regtype_to_llvm_type (spec [MONO_INST_DEST]));
2615 switch (ins->opcode) {
2618 values [ins->dreg] = LLVMBuildAdd (builder, lhs, rhs, dname);
2622 values [ins->dreg] = LLVMBuildSub (builder, lhs, rhs, dname);
2626 values [ins->dreg] = LLVMBuildMul (builder, lhs, rhs, dname);
2630 values [ins->dreg] = LLVMBuildSRem (builder, lhs, rhs, dname);
2634 values [ins->dreg] = LLVMBuildURem (builder, lhs, rhs, dname);
2638 values [ins->dreg] = LLVMBuildSDiv (builder, lhs, rhs, dname);
2642 values [ins->dreg] = LLVMBuildUDiv (builder, lhs, rhs, dname);
2645 values [ins->dreg] = LLVMBuildFDiv (builder, lhs, rhs, dname);
2649 values [ins->dreg] = LLVMBuildAnd (builder, lhs, rhs, dname);
2653 values [ins->dreg] = LLVMBuildOr (builder, lhs, rhs, dname);
2657 values [ins->dreg] = LLVMBuildXor (builder, lhs, rhs, dname);
2661 values [ins->dreg] = LLVMBuildShl (builder, lhs, rhs, dname);
2665 values [ins->dreg] = LLVMBuildAShr (builder, lhs, rhs, dname);
2669 values [ins->dreg] = LLVMBuildLShr (builder, lhs, rhs, dname);
2673 values [ins->dreg] = LLVMBuildFAdd (builder, lhs, rhs, dname);
2676 values [ins->dreg] = LLVMBuildFSub (builder, lhs, rhs, dname);
2679 values [ins->dreg] = LLVMBuildFMul (builder, lhs, rhs, dname);
2683 g_assert_not_reached ();
2690 case OP_IREM_UN_IMM:
2692 case OP_IDIV_UN_IMM:
2698 case OP_ISHR_UN_IMM:
2707 case OP_LSHR_UN_IMM:
2713 case OP_SHR_UN_IMM: {
2716 if (spec [MONO_INST_SRC1] == 'l') {
2717 imm = LLVMConstInt (LLVMInt64Type (), GET_LONG_IMM (ins), FALSE);
2719 imm = LLVMConstInt (LLVMInt32Type (), ins->inst_imm, FALSE);
2722 #if SIZEOF_VOID_P == 4
2723 if (ins->opcode == OP_LSHL_IMM || ins->opcode == OP_LSHR_IMM || ins->opcode == OP_LSHR_UN_IMM)
2724 imm = LLVMConstInt (LLVMInt32Type (), ins->inst_imm, FALSE);
2727 if (LLVMGetTypeKind (LLVMTypeOf (lhs)) == LLVMPointerTypeKind)
2728 lhs = convert (ctx, lhs, IntPtrType ());
2729 imm = convert (ctx, imm, LLVMTypeOf (lhs));
2730 switch (ins->opcode) {
2734 values [ins->dreg] = LLVMBuildAdd (builder, lhs, imm, dname);
2738 values [ins->dreg] = LLVMBuildSub (builder, lhs, imm, dname);
2742 values [ins->dreg] = LLVMBuildMul (builder, lhs, imm, dname);
2746 values [ins->dreg] = LLVMBuildSDiv (builder, lhs, imm, dname);
2748 case OP_IDIV_UN_IMM:
2749 case OP_LDIV_UN_IMM:
2750 values [ins->dreg] = LLVMBuildUDiv (builder, lhs, imm, dname);
2754 values [ins->dreg] = LLVMBuildSRem (builder, lhs, imm, dname);
2756 case OP_IREM_UN_IMM:
2757 values [ins->dreg] = LLVMBuildURem (builder, lhs, imm, dname);
2762 values [ins->dreg] = LLVMBuildAnd (builder, lhs, imm, dname);
2766 values [ins->dreg] = LLVMBuildOr (builder, lhs, imm, dname);
2770 values [ins->dreg] = LLVMBuildXor (builder, lhs, imm, dname);
2775 values [ins->dreg] = LLVMBuildShl (builder, lhs, imm, dname);
2780 values [ins->dreg] = LLVMBuildAShr (builder, lhs, imm, dname);
2782 case OP_ISHR_UN_IMM:
2783 /* This is used to implement conv.u4, so the lhs could be an i8 */
2784 lhs = convert (ctx, lhs, LLVMInt32Type ());
2785 imm = convert (ctx, imm, LLVMInt32Type ());
2786 values [ins->dreg] = LLVMBuildLShr (builder, lhs, imm, dname);
2788 case OP_LSHR_UN_IMM:
2790 values [ins->dreg] = LLVMBuildLShr (builder, lhs, imm, dname);
2793 g_assert_not_reached ();
2798 values [ins->dreg] = LLVMBuildSub (builder, LLVMConstInt (LLVMInt32Type (), 0, FALSE), convert (ctx, lhs, LLVMInt32Type ()), dname);
2801 values [ins->dreg] = LLVMBuildSub (builder, LLVMConstInt (LLVMInt64Type (), 0, FALSE), lhs, dname);
2804 lhs = convert (ctx, lhs, LLVMDoubleType ());
2805 values [ins->dreg] = LLVMBuildFSub (builder, LLVMConstReal (LLVMDoubleType (), 0.0), lhs, dname);
2808 guint32 v = 0xffffffff;
2809 values [ins->dreg] = LLVMBuildXor (builder, LLVMConstInt (LLVMInt32Type (), v, FALSE), convert (ctx, lhs, LLVMInt32Type ()), dname);
2813 guint64 v = 0xffffffffffffffffLL;
2814 values [ins->dreg] = LLVMBuildXor (builder, LLVMConstInt (LLVMInt64Type (), v, FALSE), lhs, dname);
2817 #if defined(TARGET_X86) || defined(TARGET_AMD64)
2819 LLVMValueRef v1, v2;
2821 v1 = LLVMBuildMul (builder, convert (ctx, rhs, IntPtrType ()), LLVMConstInt (IntPtrType (), (1 << ins->backend.shift_amount), FALSE), "");
2822 v2 = LLVMBuildAdd (builder, convert (ctx, lhs, IntPtrType ()), v1, "");
2823 values [ins->dreg] = LLVMBuildAdd (builder, v2, LLVMConstInt (IntPtrType (), ins->inst_imm, FALSE), dname);
2828 case OP_ICONV_TO_I1:
2829 case OP_ICONV_TO_I2:
2830 case OP_ICONV_TO_I4:
2831 case OP_ICONV_TO_U1:
2832 case OP_ICONV_TO_U2:
2833 case OP_ICONV_TO_U4:
2834 case OP_LCONV_TO_I1:
2835 case OP_LCONV_TO_I2:
2836 case OP_LCONV_TO_U1:
2837 case OP_LCONV_TO_U2:
2838 case OP_LCONV_TO_U4: {
2841 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);
2843 /* Have to do two casts since our vregs have type int */
2844 v = LLVMBuildTrunc (builder, lhs, op_to_llvm_type (ins->opcode), "");
2846 values [ins->dreg] = LLVMBuildSExt (builder, v, LLVMInt32Type (), dname);
2848 values [ins->dreg] = LLVMBuildZExt (builder, v, LLVMInt32Type (), dname);
2851 case OP_ICONV_TO_I8:
2852 values [ins->dreg] = LLVMBuildSExt (builder, lhs, LLVMInt64Type (), dname);
2854 case OP_ICONV_TO_U8:
2855 values [ins->dreg] = LLVMBuildZExt (builder, lhs, LLVMInt64Type (), dname);
2857 case OP_FCONV_TO_I4:
2858 values [ins->dreg] = LLVMBuildFPToSI (builder, lhs, LLVMInt32Type (), dname);
2860 case OP_FCONV_TO_I1:
2861 values [ins->dreg] = LLVMBuildSExt (builder, LLVMBuildFPToSI (builder, lhs, LLVMInt8Type (), dname), LLVMInt32Type (), "");
2863 case OP_FCONV_TO_U1:
2864 values [ins->dreg] = LLVMBuildZExt (builder, LLVMBuildFPToUI (builder, lhs, LLVMInt8Type (), dname), LLVMInt32Type (), "");
2866 case OP_FCONV_TO_I2:
2867 values [ins->dreg] = LLVMBuildSExt (builder, LLVMBuildFPToSI (builder, lhs, LLVMInt16Type (), dname), LLVMInt32Type (), "");
2869 case OP_FCONV_TO_U2:
2870 values [ins->dreg] = LLVMBuildZExt (builder, LLVMBuildFPToUI (builder, lhs, LLVMInt16Type (), dname), LLVMInt32Type (), "");
2872 case OP_FCONV_TO_I8:
2873 values [ins->dreg] = LLVMBuildFPToSI (builder, lhs, LLVMInt64Type (), dname);
2876 values [ins->dreg] = LLVMBuildFPToSI (builder, lhs, IntPtrType (), dname);
2878 case OP_ICONV_TO_R8:
2879 case OP_LCONV_TO_R8:
2880 values [ins->dreg] = LLVMBuildSIToFP (builder, lhs, LLVMDoubleType (), dname);
2882 case OP_LCONV_TO_R_UN:
2883 values [ins->dreg] = LLVMBuildUIToFP (builder, lhs, LLVMDoubleType (), dname);
2885 #if SIZEOF_VOID_P == 4
2888 case OP_LCONV_TO_I4:
2889 values [ins->dreg] = LLVMBuildTrunc (builder, lhs, LLVMInt32Type (), dname);
2891 case OP_ICONV_TO_R4:
2892 case OP_LCONV_TO_R4:
2893 v = LLVMBuildSIToFP (builder, lhs, LLVMFloatType (), "");
2894 values [ins->dreg] = LLVMBuildFPExt (builder, v, LLVMDoubleType (), dname);
2896 case OP_FCONV_TO_R4:
2897 v = LLVMBuildFPTrunc (builder, lhs, LLVMFloatType (), "");
2898 values [ins->dreg] = LLVMBuildFPExt (builder, v, LLVMDoubleType (), dname);
2901 values [ins->dreg] = LLVMBuildSExt (builder, convert (ctx, lhs, LLVMInt32Type ()), LLVMInt64Type (), dname);
2904 values [ins->dreg] = LLVMBuildZExt (builder, convert (ctx, lhs, LLVMInt32Type ()), LLVMInt64Type (), dname);
2907 values [ins->dreg] = LLVMBuildTrunc (builder, lhs, LLVMInt32Type (), dname);
2909 case OP_LOCALLOC_IMM: {
2912 guint32 size = ins->inst_imm;
2913 size = (size + (MONO_ARCH_FRAME_ALIGNMENT - 1)) & ~ (MONO_ARCH_FRAME_ALIGNMENT - 1);
2915 v = mono_llvm_build_alloca (builder, LLVMInt8Type (), LLVMConstInt (LLVMInt32Type (), size, FALSE), MONO_ARCH_FRAME_ALIGNMENT, "");
2917 if (ins->flags & MONO_INST_INIT) {
2918 LLVMValueRef args [5];
2921 args [1] = LLVMConstInt (LLVMInt8Type (), 0, FALSE);
2922 args [2] = LLVMConstInt (LLVMInt32Type (), size, FALSE);
2923 args [3] = LLVMConstInt (LLVMInt32Type (), MONO_ARCH_FRAME_ALIGNMENT, FALSE);
2924 args [4] = LLVMConstInt (LLVMInt1Type (), 0, FALSE);
2925 LLVMBuildCall (builder, LLVMGetNamedFunction (module, memset_func_name), args, memset_param_count, "");
2928 values [ins->dreg] = v;
2932 LLVMValueRef v, size;
2934 size = LLVMBuildAnd (builder, LLVMBuildAdd (builder, convert (ctx, lhs, LLVMInt32Type ()), LLVMConstInt (LLVMInt32Type (), MONO_ARCH_FRAME_ALIGNMENT - 1, FALSE), ""), LLVMConstInt (LLVMInt32Type (), ~ (MONO_ARCH_FRAME_ALIGNMENT - 1), FALSE), "");
2936 v = mono_llvm_build_alloca (builder, LLVMInt8Type (), size, MONO_ARCH_FRAME_ALIGNMENT, "");
2938 if (ins->flags & MONO_INST_INIT) {
2939 LLVMValueRef args [5];
2942 args [1] = LLVMConstInt (LLVMInt8Type (), 0, FALSE);
2944 args [3] = LLVMConstInt (LLVMInt32Type (), MONO_ARCH_FRAME_ALIGNMENT, FALSE);
2945 args [4] = LLVMConstInt (LLVMInt1Type (), 0, FALSE);
2946 LLVMBuildCall (builder, LLVMGetNamedFunction (module, memset_func_name), args, memset_param_count, "");
2948 values [ins->dreg] = v;
2952 case OP_LOADI1_MEMBASE:
2953 case OP_LOADU1_MEMBASE:
2954 case OP_LOADI2_MEMBASE:
2955 case OP_LOADU2_MEMBASE:
2956 case OP_LOADI4_MEMBASE:
2957 case OP_LOADU4_MEMBASE:
2958 case OP_LOADI8_MEMBASE:
2959 case OP_LOADR4_MEMBASE:
2960 case OP_LOADR8_MEMBASE:
2961 case OP_LOAD_MEMBASE:
2969 LLVMValueRef base, index, addr;
2971 gboolean sext = FALSE, zext = FALSE;
2972 gboolean is_volatile = (ins->flags & MONO_INST_FAULT);
2974 t = load_store_to_llvm_type (ins->opcode, &size, &sext, &zext);
2979 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)) {
2980 addr = LLVMConstInt (IntPtrType (), ins->inst_imm, FALSE);
2985 if (ins->inst_offset == 0) {
2987 } else if (ins->inst_offset % size != 0) {
2988 /* Unaligned load */
2989 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset, FALSE);
2990 addr = LLVMBuildGEP (builder, convert (ctx, base, LLVMPointerType (LLVMInt8Type (), 0)), &index, 1, "");
2992 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);
2993 addr = LLVMBuildGEP (builder, convert (ctx, base, LLVMPointerType (t, 0)), &index, 1, "");
2997 addr = convert (ctx, addr, LLVMPointerType (t, 0));
2999 values [ins->dreg] = emit_load (ctx, bb, &builder, size, addr, dname, is_volatile);
3001 if (!is_volatile && (ins->flags & MONO_INST_INVARIANT_LOAD)) {
3003 * These will signal LLVM that these loads do not alias any stores, and
3004 * they can't fail, allowing them to be hoisted out of loops.
3006 set_invariant_load_flag (values [ins->dreg]);
3007 set_metadata_flag (values [ins->dreg], "mono.nofail.load");
3011 values [ins->dreg] = LLVMBuildSExt (builder, values [ins->dreg], LLVMInt32Type (), dname);
3013 values [ins->dreg] = LLVMBuildZExt (builder, values [ins->dreg], LLVMInt32Type (), dname);
3014 else if (ins->opcode == OP_LOADR4_MEMBASE)
3015 values [ins->dreg] = LLVMBuildFPExt (builder, values [ins->dreg], LLVMDoubleType (), dname);
3019 case OP_STOREI1_MEMBASE_REG:
3020 case OP_STOREI2_MEMBASE_REG:
3021 case OP_STOREI4_MEMBASE_REG:
3022 case OP_STOREI8_MEMBASE_REG:
3023 case OP_STORER4_MEMBASE_REG:
3024 case OP_STORER8_MEMBASE_REG:
3025 case OP_STORE_MEMBASE_REG: {
3027 LLVMValueRef index, addr;
3029 gboolean sext = FALSE, zext = FALSE;
3030 gboolean is_volatile = (ins->flags & MONO_INST_FAULT);
3032 if (!values [ins->inst_destbasereg])
3033 LLVM_FAILURE (ctx, "inst_destbasereg");
3035 t = load_store_to_llvm_type (ins->opcode, &size, &sext, &zext);
3037 if (ins->inst_offset % size != 0) {
3038 /* Unaligned store */
3039 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset, FALSE);
3040 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_destbasereg], LLVMPointerType (LLVMInt8Type (), 0)), &index, 1, "");
3042 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);
3043 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_destbasereg], LLVMPointerType (t, 0)), &index, 1, "");
3045 emit_store (ctx, bb, &builder, size, convert (ctx, values [ins->sreg1], t), convert (ctx, addr, LLVMPointerType (t, 0)), is_volatile);
3049 case OP_STOREI1_MEMBASE_IMM:
3050 case OP_STOREI2_MEMBASE_IMM:
3051 case OP_STOREI4_MEMBASE_IMM:
3052 case OP_STOREI8_MEMBASE_IMM:
3053 case OP_STORE_MEMBASE_IMM: {
3055 LLVMValueRef index, addr;
3057 gboolean sext = FALSE, zext = FALSE;
3058 gboolean is_volatile = (ins->flags & MONO_INST_FAULT);
3060 t = load_store_to_llvm_type (ins->opcode, &size, &sext, &zext);
3062 if (ins->inst_offset % size != 0) {
3063 /* Unaligned store */
3064 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset, FALSE);
3065 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_destbasereg], LLVMPointerType (LLVMInt8Type (), 0)), &index, 1, "");
3067 index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);
3068 addr = LLVMBuildGEP (builder, convert (ctx, values [ins->inst_destbasereg], LLVMPointerType (t, 0)), &index, 1, "");
3070 emit_store (ctx, bb, &builder, size, convert (ctx, LLVMConstInt (IntPtrType (), ins->inst_imm, FALSE), t), addr, is_volatile);
3075 emit_load (ctx, bb, &builder, sizeof (gpointer), convert (ctx, lhs, LLVMPointerType (IntPtrType (), 0)), "", TRUE);
3077 case OP_OUTARG_VTRETADDR:
3084 case OP_VOIDCALL_MEMBASE:
3085 case OP_CALL_MEMBASE:
3086 case OP_LCALL_MEMBASE:
3087 case OP_FCALL_MEMBASE:
3088 case OP_VCALL_MEMBASE:
3089 case OP_VOIDCALL_REG:
3093 case OP_VCALL_REG: {
3094 process_call (ctx, bb, &builder, ins);
3095 CHECK_FAILURE (ctx);
3100 LLVMValueRef indexes [2];
3102 LLVMValueRef got_entry_addr;
3105 * FIXME: Can't allocate from the cfg mempool since that is freed if
3106 * the LLVM compile fails.
3108 ji = g_new0 (MonoJumpInfo, 1);
3109 ji->type = (MonoJumpInfoType)ins->inst_i1;
3110 ji->data.target = ins->inst_p0;
3112 ji = mono_aot_patch_info_dup (ji);
3114 ji->next = cfg->patch_info;
3115 cfg->patch_info = ji;
3117 //mono_add_patch_info (cfg, 0, (MonoJumpInfoType)ins->inst_i1, ins->inst_p0);
3118 got_offset = mono_aot_get_got_offset (cfg->patch_info);
3120 indexes [0] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
3121 indexes [1] = LLVMConstInt (LLVMInt32Type (), (gssize)got_offset, FALSE);
3122 got_entry_addr = LLVMBuildGEP (builder, ctx->lmodule->got_var, indexes, 2, "");
3124 values [ins->dreg] = LLVMBuildLoad (builder, got_entry_addr, dname);
3125 set_invariant_load_flag (values [ins->dreg]);
3128 case OP_NOT_REACHED:
3129 LLVMBuildUnreachable (builder);
3130 has_terminator = TRUE;
3131 g_assert (bb->block_num < cfg->max_block_num);
3132 ctx->unreachable [bb->block_num] = TRUE;
3133 /* Might have instructions after this */
3135 MonoInst *next = ins->next;
3137 * FIXME: If later code uses the regs defined by these instructions,
3138 * compilation will fail.
3140 MONO_DELETE_INS (bb, next);
3144 MonoInst *var = ins->inst_p0;
3146 values [ins->dreg] = addresses [var->dreg];
3150 LLVMValueRef args [1];
3152 args [0] = convert (ctx, lhs, LLVMDoubleType ());
3153 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.sin.f64"), args, 1, dname);
3157 LLVMValueRef args [1];
3159 args [0] = convert (ctx, lhs, LLVMDoubleType ());
3160 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.cos.f64"), args, 1, dname);
3164 LLVMValueRef args [1];
3167 /* This no longer seems to happen */
3169 * LLVM optimizes sqrt(nan) into undefined in
3170 * lib/Analysis/ConstantFolding.cpp
3171 * Also, sqrt(NegativeInfinity) is optimized into 0.
3173 LLVM_FAILURE (ctx, "sqrt");
3175 args [0] = convert (ctx, lhs, LLVMDoubleType ());
3176 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "llvm.sqrt.f64"), args, 1, dname);
3180 LLVMValueRef args [1];
3182 args [0] = convert (ctx, lhs, LLVMDoubleType ());
3183 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, "fabs"), args, 1, dname);
3197 lhs = convert (ctx, lhs, regtype_to_llvm_type (spec [MONO_INST_DEST]));
3198 rhs = convert (ctx, rhs, regtype_to_llvm_type (spec [MONO_INST_DEST]));
3200 switch (ins->opcode) {
3203 v = LLVMBuildICmp (builder, LLVMIntSLE, lhs, rhs, "");
3207 v = LLVMBuildICmp (builder, LLVMIntSGE, lhs, rhs, "");
3211 v = LLVMBuildICmp (builder, LLVMIntULE, lhs, rhs, "");
3215 v = LLVMBuildICmp (builder, LLVMIntUGE, lhs, rhs, "");
3218 g_assert_not_reached ();
3221 values [ins->dreg] = LLVMBuildSelect (builder, v, lhs, rhs, dname);
3224 case OP_ATOMIC_EXCHANGE_I4:
3225 case OP_ATOMIC_EXCHANGE_I8: {
3226 LLVMValueRef args [2];
3229 if (ins->opcode == OP_ATOMIC_EXCHANGE_I4)
3230 t = LLVMInt32Type ();
3232 t = LLVMInt64Type ();
3234 g_assert (ins->inst_offset == 0);
3236 args [0] = convert (ctx, lhs, LLVMPointerType (t, 0));
3237 args [1] = convert (ctx, rhs, t);
3239 values [ins->dreg] = mono_llvm_build_atomic_rmw (builder, LLVM_ATOMICRMW_OP_XCHG, args [0], args [1]);
3242 case OP_ATOMIC_ADD_NEW_I4:
3243 case OP_ATOMIC_ADD_NEW_I8: {
3244 LLVMValueRef args [2];
3247 if (ins->opcode == OP_ATOMIC_ADD_NEW_I4)
3248 t = LLVMInt32Type ();
3250 t = LLVMInt64Type ();
3252 g_assert (ins->inst_offset == 0);
3254 args [0] = convert (ctx, lhs, LLVMPointerType (t, 0));
3255 args [1] = convert (ctx, rhs, t);
3256 values [ins->dreg] = LLVMBuildAdd (builder, mono_llvm_build_atomic_rmw (builder, LLVM_ATOMICRMW_OP_ADD, args [0], args [1]), args [1], dname);
3259 case OP_ATOMIC_CAS_I4:
3260 case OP_ATOMIC_CAS_I8: {
3261 LLVMValueRef args [3];
3264 if (ins->opcode == OP_ATOMIC_CAS_I4)
3265 t = LLVMInt32Type ();
3267 t = LLVMInt64Type ();
3269 args [0] = convert (ctx, lhs, LLVMPointerType (t, 0));
3271 args [1] = convert (ctx, values [ins->sreg3], t);
3273 args [2] = convert (ctx, values [ins->sreg2], t);
3274 values [ins->dreg] = mono_llvm_build_cmpxchg (builder, args [0], args [1], args [2]);
3277 case OP_MEMORY_BARRIER: {
3278 mono_llvm_build_fence (builder);
3281 case OP_RELAXED_NOP: {
3282 #if defined(TARGET_AMD64) || defined(TARGET_X86)
3283 emit_call (ctx, bb, &builder, LLVMGetNamedFunction (ctx->module, "llvm.x86.sse2.pause"), NULL, 0);
3290 #if (defined(TARGET_AMD64) || defined(TARGET_X86)) && defined(__linux__)
3292 // 257 == FS segment register
3293 LLVMTypeRef ptrtype = LLVMPointerType (IntPtrType (), 257);
3295 // 256 == GS segment register
3296 LLVMTypeRef ptrtype = LLVMPointerType (IntPtrType (), 256);
3299 values [ins->dreg] = LLVMBuildLoad (builder, LLVMBuildIntToPtr (builder, LLVMConstInt (IntPtrType (), ins->inst_offset, TRUE), ptrtype, ""), "");
3300 #elif defined(TARGET_AMD64) && defined(TARGET_OSX)
3301 /* See mono_amd64_emit_tls_get () */
3302 int offset = mono_amd64_get_tls_gs_offset () + (ins->inst_offset * 8);
3304 // 256 == GS segment register
3305 LLVMTypeRef ptrtype = LLVMPointerType (IntPtrType (), 256);
3306 values [ins->dreg] = LLVMBuildLoad (builder, LLVMBuildIntToPtr (builder, LLVMConstInt (IntPtrType (), offset, TRUE), ptrtype, ""), "");
3308 LLVM_FAILURE (ctx, "opcode tls-get");
3318 case OP_IADD_OVF_UN:
3320 case OP_ISUB_OVF_UN:
3322 case OP_IMUL_OVF_UN:
3323 #if SIZEOF_VOID_P == 8
3325 case OP_LADD_OVF_UN:
3327 case OP_LSUB_OVF_UN:
3329 case OP_LMUL_OVF_UN:
3332 LLVMValueRef args [2], val, ovf, func;
3334 args [0] = convert (ctx, lhs, op_to_llvm_type (ins->opcode));
3335 args [1] = convert (ctx, rhs, op_to_llvm_type (ins->opcode));
3336 func = LLVMGetNamedFunction (module, ovf_op_to_intrins (ins->opcode));
3338 val = LLVMBuildCall (builder, func, args, 2, "");
3339 values [ins->dreg] = LLVMBuildExtractValue (builder, val, 0, dname);
3340 ovf = LLVMBuildExtractValue (builder, val, 1, "");
3341 emit_cond_system_exception (ctx, bb, "OverflowException", ovf);
3342 CHECK_FAILURE (ctx);
3343 builder = ctx->builder;
3349 * We currently model them using arrays. Promotion to local vregs is
3350 * disabled for them in mono_handle_global_vregs () in the LLVM case,
3351 * so we always have an entry in cfg->varinfo for them.
3352 * FIXME: Is this needed ?
3355 MonoClass *klass = ins->klass;
3356 LLVMValueRef args [5];
3360 LLVM_FAILURE (ctx, "!klass");
3364 if (!addresses [ins->dreg])
3365 addresses [ins->dreg] = build_alloca (ctx, &klass->byval_arg);
3366 args [0] = LLVMBuildBitCast (builder, addresses [ins->dreg], LLVMPointerType (LLVMInt8Type (), 0), "");
3367 args [1] = LLVMConstInt (LLVMInt8Type (), 0, FALSE);
3368 args [2] = LLVMConstInt (LLVMInt32Type (), mono_class_value_size (klass, NULL), FALSE);
3370 args [3] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
3371 args [4] = LLVMConstInt (LLVMInt1Type (), 0, FALSE);
3372 LLVMBuildCall (builder, LLVMGetNamedFunction (module, memset_func_name), args, memset_param_count, "");
3376 case OP_STOREV_MEMBASE:
3377 case OP_LOADV_MEMBASE:
3379 MonoClass *klass = ins->klass;
3380 LLVMValueRef src = NULL, dst, args [5];
3381 gboolean done = FALSE;
3385 LLVM_FAILURE (ctx, "!klass");
3389 if (mini_is_gsharedvt_klass (cfg, klass)) {
3391 LLVM_FAILURE (ctx, "gsharedvt");
3395 switch (ins->opcode) {
3396 case OP_STOREV_MEMBASE:
3397 if (cfg->gen_write_barriers && klass->has_references && ins->inst_destbasereg != cfg->frame_reg) {
3398 /* FIXME: Emit write barriers like in mini_emit_stobj () */
3399 LLVM_FAILURE (ctx, "storev_membase + write barriers");
3402 if (!addresses [ins->sreg1]) {
3404 g_assert (values [ins->sreg1]);
3405 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));
3406 LLVMBuildStore (builder, values [ins->sreg1], dst);
3409 src = LLVMBuildBitCast (builder, addresses [ins->sreg1], LLVMPointerType (LLVMInt8Type (), 0), "");
3410 dst = convert (ctx, LLVMBuildAdd (builder, convert (ctx, values [ins->inst_destbasereg], IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_offset, FALSE), ""), LLVMPointerType (LLVMInt8Type (), 0));
3413 case OP_LOADV_MEMBASE:
3414 if (!addresses [ins->dreg])
3415 addresses [ins->dreg] = build_alloca (ctx, &klass->byval_arg);
3416 src = convert (ctx, LLVMBuildAdd (builder, convert (ctx, values [ins->inst_basereg], IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_offset, FALSE), ""), LLVMPointerType (LLVMInt8Type (), 0));
3417 dst = LLVMBuildBitCast (builder, addresses [ins->dreg], LLVMPointerType (LLVMInt8Type (), 0), "");
3420 if (!addresses [ins->sreg1])
3421 addresses [ins->sreg1] = build_alloca (ctx, &klass->byval_arg);
3422 if (!addresses [ins->dreg])
3423 addresses [ins->dreg] = build_alloca (ctx, &klass->byval_arg);
3424 src = LLVMBuildBitCast (builder, addresses [ins->sreg1], LLVMPointerType (LLVMInt8Type (), 0), "");
3425 dst = LLVMBuildBitCast (builder, addresses [ins->dreg], LLVMPointerType (LLVMInt8Type (), 0), "");
3428 g_assert_not_reached ();
3430 CHECK_FAILURE (ctx);
3437 args [2] = LLVMConstInt (LLVMInt32Type (), mono_class_value_size (klass, NULL), FALSE);
3438 args [3] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
3440 args [3] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
3441 args [4] = LLVMConstInt (LLVMInt1Type (), 0, FALSE);
3442 LLVMBuildCall (builder, LLVMGetNamedFunction (module, memcpy_func_name), args, memcpy_param_count, "");
3445 case OP_LLVM_OUTARG_VT:
3446 if (!addresses [ins->sreg1]) {
3447 addresses [ins->sreg1] = build_alloca (ctx, &ins->klass->byval_arg);
3448 g_assert (values [ins->sreg1]);
3449 LLVMBuildStore (builder, values [ins->sreg1], addresses [ins->sreg1]);
3451 addresses [ins->dreg] = addresses [ins->sreg1];
3457 #if defined(TARGET_X86) || defined(TARGET_AMD64)
3459 values [ins->dreg] = LLVMConstNull (type_to_llvm_type (ctx, &ins->klass->byval_arg));
3462 case OP_LOADX_MEMBASE: {
3463 LLVMTypeRef t = type_to_llvm_type (ctx, &ins->klass->byval_arg);
3466 src = convert (ctx, LLVMBuildAdd (builder, convert (ctx, values [ins->inst_basereg], IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_offset, FALSE), ""), LLVMPointerType (t, 0));
3467 values [ins->dreg] = mono_llvm_build_aligned_load (builder, src, "", FALSE, 1);
3470 case OP_STOREX_MEMBASE: {
3471 LLVMTypeRef t = LLVMTypeOf (values [ins->sreg1]);
3474 dest = convert (ctx, LLVMBuildAdd (builder, convert (ctx, values [ins->inst_destbasereg], IntPtrType ()), LLVMConstInt (IntPtrType (), ins->inst_offset, FALSE), ""), LLVMPointerType (t, 0));
3475 mono_llvm_build_aligned_store (builder, values [ins->sreg1], dest, FALSE, 1);
3482 values [ins->dreg] = LLVMBuildAdd (builder, lhs, rhs, "");
3486 values [ins->dreg] = LLVMBuildFAdd (builder, lhs, rhs, "");
3492 values [ins->dreg] = LLVMBuildSub (builder, lhs, rhs, "");
3496 values [ins->dreg] = LLVMBuildFSub (builder, lhs, rhs, "");
3500 values [ins->dreg] = LLVMBuildFMul (builder, lhs, rhs, "");
3504 values [ins->dreg] = LLVMBuildFDiv (builder, lhs, rhs, "");
3507 values [ins->dreg] = LLVMBuildAnd (builder, lhs, rhs, "");
3510 values [ins->dreg] = LLVMBuildOr (builder, lhs, rhs, "");
3513 values [ins->dreg] = LLVMBuildXor (builder, lhs, rhs, "");
3517 values [ins->dreg] = LLVMBuildMul (builder, lhs, rhs, "");
3528 LLVMValueRef v = NULL;
3530 switch (ins->opcode) {
3535 t = LLVMVectorType (LLVMInt32Type (), 4);
3536 rt = LLVMVectorType (LLVMFloatType (), 4);
3542 t = LLVMVectorType (LLVMInt64Type (), 2);
3543 rt = LLVMVectorType (LLVMDoubleType (), 2);
3546 t = LLVMInt32Type ();
3547 rt = LLVMInt32Type ();
3548 g_assert_not_reached ();
3551 lhs = LLVMBuildBitCast (builder, lhs, t, "");
3552 rhs = LLVMBuildBitCast (builder, rhs, t, "");
3553 switch (ins->opcode) {
3556 v = LLVMBuildAnd (builder, lhs, rhs, "");
3560 v = LLVMBuildOr (builder, lhs, rhs, "");
3564 v = LLVMBuildXor (builder, lhs, rhs, "");
3568 v = LLVMBuildAnd (builder, rhs, LLVMBuildNot (builder, lhs, ""), "");
3571 values [ins->dreg] = LLVMBuildBitCast (builder, v, rt, "");
3595 case OP_PADDB_SAT_UN:
3596 case OP_PADDW_SAT_UN:
3597 case OP_PSUBB_SAT_UN:
3598 case OP_PSUBW_SAT_UN:
3606 case OP_PMULW_HIGH_UN: {
3607 LLVMValueRef args [2];
3612 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, simd_op_to_intrins (ins->opcode)), args, 2, dname);
3619 values [ins->dreg] = LLVMBuildSExt (builder, LLVMBuildICmp (builder, LLVMIntEQ, lhs, rhs, ""), LLVMTypeOf (lhs), "");
3623 values [ins->dreg] = LLVMBuildSExt (builder, LLVMBuildICmp (builder, LLVMIntSGT, lhs, rhs, ""), LLVMTypeOf (lhs), "");
3631 case OP_EXTRACTX_U2:
3633 case OP_EXTRACT_U1: {
3635 gboolean zext = FALSE;
3637 t = simd_op_to_llvm_type (ins->opcode);
3639 switch (ins->opcode) {
3647 case OP_EXTRACTX_U2:
3652 t = LLVMInt32Type ();
3653 g_assert_not_reached ();
3656 lhs = LLVMBuildBitCast (builder, lhs, t, "");
3657 values [ins->dreg] = LLVMBuildExtractElement (builder, lhs, LLVMConstInt (LLVMInt32Type (), ins->inst_c0, FALSE), "");
3659 values [ins->dreg] = LLVMBuildZExt (builder, values [ins->dreg], LLVMInt32Type (), "");
3668 case OP_EXPAND_R8: {
3669 LLVMTypeRef t = simd_op_to_llvm_type (ins->opcode);
3670 LLVMValueRef mask [16], v;
3672 for (i = 0; i < 16; ++i)
3673 mask [i] = LLVMConstInt (LLVMInt32Type (), 0, FALSE);
3675 v = convert (ctx, values [ins->sreg1], LLVMGetElementType (t));
3677 values [ins->dreg] = LLVMBuildInsertElement (builder, LLVMConstNull (t), v, LLVMConstInt (LLVMInt32Type (), 0, FALSE), "");
3678 values [ins->dreg] = LLVMBuildShuffleVector (builder, values [ins->dreg], LLVMGetUndef (t), LLVMConstVector (mask, LLVMGetVectorSize (t)), "");
3683 values [ins->dreg] = LLVMBuildInsertElement (builder, values [ins->sreg1], convert (ctx, values [ins->sreg2], LLVMInt8Type ()), LLVMConstInt (LLVMInt32Type (), ins->inst_c0, FALSE), dname);
3686 values [ins->dreg] = LLVMBuildInsertElement (builder, values [ins->sreg1], convert (ctx, values [ins->sreg2], LLVMInt16Type ()), LLVMConstInt (LLVMInt32Type (), ins->inst_c0, FALSE), dname);
3689 values [ins->dreg] = LLVMBuildInsertElement (builder, values [ins->sreg1], convert (ctx, values [ins->sreg2], LLVMInt32Type ()), LLVMConstInt (LLVMInt32Type (), ins->inst_c0, FALSE), dname);
3692 values [ins->dreg] = LLVMBuildInsertElement (builder, values [ins->sreg1], convert (ctx, values [ins->sreg2], LLVMInt64Type ()), LLVMConstInt (LLVMInt32Type (), ins->inst_c0, FALSE), dname);
3695 values [ins->dreg] = LLVMBuildInsertElement (builder, values [ins->sreg1], convert (ctx, values [ins->sreg2], LLVMFloatType ()), LLVMConstInt (LLVMInt32Type (), ins->inst_c0, FALSE), dname);
3698 values [ins->dreg] = LLVMBuildInsertElement (builder, values [ins->sreg1], convert (ctx, values [ins->sreg2], LLVMDoubleType ()), LLVMConstInt (LLVMInt32Type (), ins->inst_c0, FALSE), dname);
3709 case OP_EXTRACT_MASK:
3716 v = convert (ctx, values [ins->sreg1], simd_op_to_llvm_type (ins->opcode));
3718 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, simd_op_to_intrins (ins->opcode)), &v, 1, dname);
3722 case OP_ICONV_TO_R8_RAW:
3723 /* Same as OP_ICONV_TO_R8 */
3724 values [ins->dreg] = convert (ctx, LLVMBuildBitCast (builder, lhs, LLVMFloatType (), ""), LLVMDoubleType ());
3729 LLVMValueRef args [3];
3733 args [2] = LLVMConstInt (LLVMInt8Type (), ins->inst_c0, FALSE);
3735 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, simd_op_to_intrins (ins->opcode)), args, 3, dname);
3740 /* This is only used for implementing shifts by non-immediate */
3741 values [ins->dreg] = lhs;
3752 LLVMValueRef args [3];
3755 args [1] = LLVMConstInt (LLVMInt32Type (), ins->inst_imm, FALSE);
3757 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, simd_op_to_intrins (ins->opcode)), args, 2, dname);
3768 case OP_PSHLQ_REG: {
3769 LLVMValueRef args [3];
3772 args [1] = values [ins->sreg2];
3774 values [ins->dreg] = LLVMBuildCall (builder, LLVMGetNamedFunction (module, simd_op_to_intrins (ins->opcode)), args, 2, dname);
3781 case OP_PSHUFLEW_LOW:
3782 case OP_PSHUFLEW_HIGH: {
3784 LLVMValueRef v1 = NULL, v2 = NULL, mask_values [16];
3785 int i, mask_size = 0;
3786 int imask = ins->inst_c0;
3788 /* Convert the x86 shuffle mask to LLVM's */
3789 switch (ins->opcode) {
3792 mask [0] = ((imask >> 0) & 3);
3793 mask [1] = ((imask >> 2) & 3);
3794 mask [2] = ((imask >> 4) & 3) + 4;
3795 mask [3] = ((imask >> 6) & 3) + 4;
3796 v1 = values [ins->sreg1];
3797 v2 = values [ins->sreg2];
3801 mask [0] = ((imask >> 0) & 1);
3802 mask [1] = ((imask >> 1) & 1) + 2;
3803 v1 = values [ins->sreg1];
3804 v2 = values [ins->sreg2];
3806 case OP_PSHUFLEW_LOW:
3808 mask [0] = ((imask >> 0) & 3);
3809 mask [1] = ((imask >> 2) & 3);
3810 mask [2] = ((imask >> 4) & 3);
3811 mask [3] = ((imask >> 6) & 3);
3816 v1 = values [ins->sreg1];
3817 v2 = LLVMGetUndef (LLVMTypeOf (v1));
3819 case OP_PSHUFLEW_HIGH:
3825 mask [4] = 4 + ((imask >> 0) & 3);
3826 mask [5] = 4 + ((imask >> 2) & 3);
3827 mask [6] = 4 + ((imask >> 4) & 3);
3828 mask [7] = 4 + ((imask >> 6) & 3);
3829 v1 = values [ins->sreg1];
3830 v2 = LLVMGetUndef (LLVMTypeOf (v1));
3834 mask [0] = ((imask >> 0) & 3);
3835 mask [1] = ((imask >> 2) & 3);
3836 mask [2] = ((imask >> 4) & 3);
3837 mask [3] = ((imask >> 6) & 3);
3838 v1 = values [ins->sreg1];
3839 v2 = LLVMGetUndef (LLVMTypeOf (v1));
3842 g_assert_not_reached ();
3844 for (i = 0; i < mask_size; ++i)
3845 mask_values [i] = LLVMConstInt (LLVMInt32Type (), mask [i], FALSE);
3847 values [ins->dreg] =
3848 LLVMBuildShuffleVector (builder, v1, v2,
3849 LLVMConstVector (mask_values, mask_size), dname);
3853 case OP_UNPACK_LOWB:
3854 case OP_UNPACK_LOWW:
3855 case OP_UNPACK_LOWD:
3856 case OP_UNPACK_LOWQ:
3857 case OP_UNPACK_LOWPS:
3858 case OP_UNPACK_LOWPD:
3859 case OP_UNPACK_HIGHB:
3860 case OP_UNPACK_HIGHW:
3861 case OP_UNPACK_HIGHD:
3862 case OP_UNPACK_HIGHQ:
3863 case OP_UNPACK_HIGHPS:
3864 case OP_UNPACK_HIGHPD: {
3866 LLVMValueRef mask_values [16];
3867 int i, mask_size = 0;
3868 gboolean low = FALSE;
3870 switch (ins->opcode) {
3871 case OP_UNPACK_LOWB:
3875 case OP_UNPACK_LOWW:
3879 case OP_UNPACK_LOWD:
3880 case OP_UNPACK_LOWPS:
3884 case OP_UNPACK_LOWQ:
3885 case OP_UNPACK_LOWPD:
3889 case OP_UNPACK_HIGHB:
3892 case OP_UNPACK_HIGHW:
3895 case OP_UNPACK_HIGHD:
3896 case OP_UNPACK_HIGHPS:
3899 case OP_UNPACK_HIGHQ:
3900 case OP_UNPACK_HIGHPD:
3904 g_assert_not_reached ();
3908 for (i = 0; i < (mask_size / 2); ++i) {
3910 mask [(i * 2) + 1] = mask_size + i;
3913 for (i = 0; i < (mask_size / 2); ++i) {
3914 mask [(i * 2)] = (mask_size / 2) + i;
3915 mask [(i * 2) + 1] = mask_size + (mask_size / 2) + i;
3919 for (i = 0; i < mask_size; ++i)
3920 mask_values [i] = LLVMConstInt (LLVMInt32Type (), mask [i], FALSE);
3922 values [ins->dreg] =
3923 LLVMBuildShuffleVector (builder, values [ins->sreg1], values [ins->sreg2],
3924 LLVMConstVector (mask_values, mask_size), dname);
3929 LLVMTypeRef t = simd_op_to_llvm_type (ins->opcode);
3930 LLVMValueRef v, val;
3932 v = LLVMBuildExtractElement (builder, lhs, LLVMConstInt (LLVMInt32Type (), 0, FALSE), "");
3933 val = LLVMConstNull (t);
3934 val = LLVMBuildInsertElement (builder, val, v, LLVMConstInt (LLVMInt32Type (), 0, FALSE), "");
3935 val = LLVMBuildInsertElement (builder, val, v, LLVMConstInt (LLVMInt32Type (), 1, FALSE), dname);
3937 values [ins->dreg] = val;
3941 case OP_DUPPS_HIGH: {
3942 LLVMTypeRef t = simd_op_to_llvm_type (ins->opcode);
3943 LLVMValueRef v1, v2, val;
3946 if (ins->opcode == OP_DUPPS_LOW) {
3947 v1 = LLVMBuildExtractElement (builder, lhs, LLVMConstInt (LLVMInt32Type (), 0, FALSE), "");
3948 v2 = LLVMBuildExtractElement (builder, lhs, LLVMConstInt (LLVMInt32Type (), 2, FALSE), "");
3950 v1 = LLVMBuildExtractElement (builder, lhs, LLVMConstInt (LLVMInt32Type (), 1, FALSE), "");
3951 v2 = LLVMBuildExtractElement (builder, lhs, LLVMConstInt (LLVMInt32Type (), 3, FALSE), "");
3953 val = LLVMConstNull (t);
3954 val = LLVMBuildInsertElement (builder, val, v1, LLVMConstInt (LLVMInt32Type (), 0, FALSE), "");
3955 val = LLVMBuildInsertElement (builder, val, v1, LLVMConstInt (LLVMInt32Type (), 1, FALSE), "");
3956 val = LLVMBuildInsertElement (builder, val, v2, LLVMConstInt (LLVMInt32Type (), 2, FALSE), "");
3957 val = LLVMBuildInsertElement (builder, val, v2, LLVMConstInt (LLVMInt32Type (), 3, FALSE), "");
3959 values [ins->dreg] = val;
3969 * EXCEPTION HANDLING
3971 case OP_IMPLICIT_EXCEPTION:
3972 /* This marks a place where an implicit exception can happen */
3973 if (bb->region != -1)
3974 LLVM_FAILURE (ctx, "implicit-exception");
3978 MonoMethodSignature *throw_sig;
3979 LLVMValueRef callee, arg;
3980 gboolean rethrow = (ins->opcode == OP_RETHROW);
3981 const char *icall_name;
3983 callee = rethrow ? ctx->lmodule->rethrow : ctx->lmodule->throw;
3984 icall_name = rethrow ? "mono_arch_rethrow_exception" : "mono_arch_throw_exception";
3987 throw_sig = mono_metadata_signature_alloc (mono_get_corlib (), 1);
3988 throw_sig->ret = &mono_get_void_class ()->byval_arg;
3989 throw_sig->params [0] = &mono_get_object_class ()->byval_arg;
3990 if (cfg->compile_aot) {
3991 callee = get_plt_entry (ctx, sig_to_llvm_sig (ctx, throw_sig), MONO_PATCH_INFO_INTERNAL_METHOD, icall_name);
3993 callee = LLVMAddFunction (module, icall_name, sig_to_llvm_sig (ctx, throw_sig));
3997 * LLVM doesn't push the exception argument, so we need a different
4000 LLVMAddGlobalMapping (ee, callee, resolve_patch (cfg, MONO_PATCH_INFO_INTERNAL_METHOD, rethrow ? "llvm_rethrow_exception_trampoline" : "llvm_throw_exception_trampoline"));
4002 LLVMAddGlobalMapping (ee, callee, resolve_patch (cfg, MONO_PATCH_INFO_INTERNAL_METHOD, icall_name));
4006 mono_memory_barrier ();
4008 ctx->lmodule->rethrow = callee;
4010 ctx->lmodule->throw = callee;
4012 arg = convert (ctx, lhs, type_to_llvm_type (ctx, &mono_get_object_class ()->byval_arg));
4013 emit_call (ctx, bb, &builder, callee, &arg, 1);
4016 case OP_CALL_HANDLER: {
4018 * We don't 'call' handlers, but instead simply branch to them.
4019 * The code generated by ENDFINALLY will branch back to us.
4021 LLVMBasicBlockRef noex_bb;
4023 BBInfo *info = &bblocks [ins->inst_target_bb->block_num];
4025 bb_list = info->call_handler_return_bbs;
4028 * Set the indicator variable for the finally clause.
4030 lhs = info->finally_ind;
4032 LLVMBuildStore (builder, LLVMConstInt (LLVMInt32Type (), g_slist_length (bb_list) + 1, FALSE), lhs);
4034 /* Branch to the finally clause */
4035 LLVMBuildBr (builder, info->call_handler_target_bb);
4037 noex_bb = gen_bb (ctx, "CALL_HANDLER_CONT_BB");
4038 info->call_handler_return_bbs = g_slist_append_mempool (cfg->mempool, info->call_handler_return_bbs, noex_bb);
4040 builder = ctx->builder = create_builder (ctx);
4041 LLVMPositionBuilderAtEnd (ctx->builder, noex_bb);
4043 bblocks [bb->block_num].end_bblock = noex_bb;
4046 case OP_START_HANDLER: {
4049 case OP_ENDFINALLY: {
4050 LLVMBasicBlockRef resume_bb;
4051 MonoBasicBlock *handler_bb;
4052 LLVMValueRef val, switch_ins, callee;
4056 handler_bb = g_hash_table_lookup (ctx->region_to_handler, GUINT_TO_POINTER (mono_get_block_region_notry (cfg, bb->region)));
4057 g_assert (handler_bb);
4058 info = &bblocks [handler_bb->block_num];
4059 lhs = info->finally_ind;
4062 bb_list = info->call_handler_return_bbs;
4064 resume_bb = gen_bb (ctx, "ENDFINALLY_RESUME_BB");
4066 /* Load the finally variable */
4067 val = LLVMBuildLoad (builder, lhs, "");
4069 /* Reset the variable */
4070 LLVMBuildStore (builder, LLVMConstInt (LLVMInt32Type (), 0, FALSE), lhs);
4072 /* Branch to either resume_bb, or to the bblocks in bb_list */
4073 switch_ins = LLVMBuildSwitch (builder, val, resume_bb, g_slist_length (bb_list));
4075 * The other targets are added at the end to handle OP_CALL_HANDLER
4076 * opcodes processed later.
4078 info->endfinally_switch_ins_list = g_slist_append_mempool (cfg->mempool, info->endfinally_switch_ins_list, switch_ins);
4080 builder = ctx->builder = create_builder (ctx);
4081 LLVMPositionBuilderAtEnd (ctx->builder, resume_bb);
4083 if (ctx->cfg->compile_aot) {
4084 callee = get_plt_entry (ctx, LLVMFunctionType (LLVMVoidType (), NULL, 0, FALSE), MONO_PATCH_INFO_INTERNAL_METHOD, "llvm_resume_unwind_trampoline");
4086 callee = LLVMGetNamedFunction (module, "llvm_resume_unwind_trampoline");
4088 LLVMBuildCall (builder, callee, NULL, 0, "");
4090 LLVMBuildUnreachable (builder);
4091 has_terminator = TRUE;
4097 sprintf (reason, "opcode %s", mono_inst_name (ins->opcode));
4098 LLVM_FAILURE (ctx, reason);
4103 /* Convert the value to the type required by phi nodes */
4104 if (spec [MONO_INST_DEST] != ' ' && !MONO_IS_STORE_MEMBASE (ins) && ctx->vreg_types [ins->dreg]) {
4105 if (!values [ins->dreg])
4107 values [ins->dreg] = addresses [ins->dreg];
4109 values [ins->dreg] = convert (ctx, values [ins->dreg], ctx->vreg_types [ins->dreg]);
4112 /* Add stores for volatile variables */
4113 if (spec [MONO_INST_DEST] != ' ' && spec [MONO_INST_DEST] != 'v' && !MONO_IS_STORE_MEMBASE (ins))
4114 emit_volatile_store (ctx, ins->dreg);
4117 if (!has_terminator && bb->next_bb && (bb == cfg->bb_entry || bb->in_count > 0))
4118 LLVMBuildBr (builder, get_bb (ctx, bb->next_bb));
4120 if (bb == cfg->bb_exit && sig->ret->type == MONO_TYPE_VOID)
4121 LLVMBuildRetVoid (builder);
4123 if (bb == cfg->bb_entry)
4124 ctx->last_alloca = LLVMGetLastInstruction (get_bb (ctx, cfg->bb_entry));
4133 * mono_llvm_check_method_supported:
4135 * Do some quick checks to decide whenever cfg->method can be compiled by LLVM, to avoid
4136 * compiling a method twice.
4139 mono_llvm_check_method_supported (MonoCompile *cfg)
4141 MonoMethodHeader *header = cfg->header;
4142 MonoExceptionClause *clause;
4145 if (cfg->method->save_lmf) {
4146 cfg->exception_message = g_strdup ("lmf");
4147 cfg->disable_llvm = TRUE;
4151 for (i = 0; i < header->num_clauses; ++i) {
4152 clause = &header->clauses [i];
4154 if (i > 0 && clause->try_offset <= header->clauses [i - 1].handler_offset + header->clauses [i - 1].handler_len) {
4156 * FIXME: Some tests still fail with nested clauses.
4158 cfg->exception_message = g_strdup ("nested clauses");
4159 cfg->disable_llvm = TRUE;
4165 if (cfg->method->dynamic) {
4166 cfg->exception_message = g_strdup ("dynamic.");
4167 cfg->disable_llvm = TRUE;
4172 * mono_llvm_emit_method:
4174 * Emit LLVM IL from the mono IL, and compile it to native code using LLVM.
4177 mono_llvm_emit_method (MonoCompile *cfg)
4180 MonoMethodSignature *sig;
4182 LLVMTypeRef method_type;
4183 LLVMValueRef method = NULL;
4185 LLVMValueRef *values;
4186 int i, max_block_num, bb_index;
4187 gboolean last = FALSE;
4188 GPtrArray *phi_values;
4189 LLVMCallInfo *linfo;
4191 LLVMModuleRef module;
4193 GPtrArray *bblock_list;
4194 MonoMethodHeader *header;
4195 MonoExceptionClause *clause;
4199 /* The code below might acquire the loader lock, so use it for global locking */
4200 mono_loader_lock ();
4202 /* Used to communicate with the callbacks */
4203 mono_native_tls_set_value (current_cfg_tls_id, cfg);
4205 ctx = g_new0 (EmitContext, 1);
4207 ctx->mempool = cfg->mempool;
4210 * This maps vregs to the LLVM instruction defining them
4212 values = g_new0 (LLVMValueRef, cfg->next_vreg);
4214 * This maps vregs for volatile variables to the LLVM instruction defining their
4217 ctx->addresses = g_new0 (LLVMValueRef, cfg->next_vreg);
4218 ctx->vreg_types = g_new0 (LLVMTypeRef, cfg->next_vreg);
4219 ctx->vreg_cli_types = g_new0 (MonoType*, cfg->next_vreg);
4220 phi_values = g_ptr_array_new ();
4222 * This signals whenever the vreg was defined by a phi node with no input vars
4223 * (i.e. all its input bblocks end with NOT_REACHABLE).
4225 ctx->is_dead = g_new0 (gboolean, cfg->next_vreg);
4226 /* Whenever the bblock is unreachable */
4227 ctx->unreachable = g_new0 (gboolean, cfg->max_block_num);
4229 bblock_list = g_ptr_array_new ();
4231 ctx->values = values;
4232 ctx->region_to_handler = g_hash_table_new (NULL, NULL);
4234 if (cfg->compile_aot) {
4235 ctx->lmodule = &aot_module;
4236 method_name = mono_aot_get_method_name (cfg);
4237 cfg->llvm_method_name = g_strdup (method_name);
4240 ctx->lmodule = &jit_module;
4241 method_name = mono_method_full_name (cfg->method, TRUE);
4244 module = ctx->module = ctx->lmodule->module;
4247 LLVM_FAILURE (ctx, "gsharedvt");
4251 static int count = 0;
4254 if (g_getenv ("LLVM_COUNT")) {
4255 if (count == atoi (g_getenv ("LLVM_COUNT"))) {
4256 printf ("LAST: %s\n", mono_method_full_name (cfg->method, TRUE));
4260 if (count > atoi (g_getenv ("LLVM_COUNT")))
4261 LLVM_FAILURE (ctx, "");
4266 sig = mono_method_signature (cfg->method);
4269 linfo = mono_arch_get_llvm_call_info (cfg, sig);
4271 CHECK_FAILURE (ctx);
4274 linfo->rgctx_arg = TRUE;
4275 method_type = sig_to_llvm_sig_full (ctx, sig, linfo, &sinfo);
4276 CHECK_FAILURE (ctx);
4279 * This maps parameter indexes in the original signature to the indexes in
4280 * the LLVM signature.
4282 ctx->pindexes = sinfo.pindexes;
4284 method = LLVMAddFunction (module, method_name, method_type);
4285 ctx->lmethod = method;
4287 LLVMSetFunctionCallConv (method, LLVMMono1CallConv);
4288 LLVMSetLinkage (method, LLVMPrivateLinkage);
4290 LLVMAddFunctionAttr (method, LLVMUWTable);
4292 if (cfg->compile_aot) {
4293 LLVMSetLinkage (method, LLVMInternalLinkage);
4294 LLVMSetVisibility (method, LLVMHiddenVisibility);
4296 LLVMSetLinkage (method, LLVMPrivateLinkage);
4299 if (cfg->method->save_lmf)
4300 LLVM_FAILURE (ctx, "lmf");
4302 if (sig->pinvoke && cfg->method->wrapper_type != MONO_WRAPPER_RUNTIME_INVOKE)
4303 LLVM_FAILURE (ctx, "pinvoke signature");
4305 header = cfg->header;
4306 for (i = 0; i < header->num_clauses; ++i) {
4307 clause = &header->clauses [i];
4308 if (clause->flags != MONO_EXCEPTION_CLAUSE_FINALLY && clause->flags != MONO_EXCEPTION_CLAUSE_NONE)
4309 LLVM_FAILURE (ctx, "non-finally/catch clause.");
4312 if (linfo->rgctx_arg) {
4313 ctx->rgctx_arg = LLVMGetParam (method, sinfo.rgctx_arg_pindex);
4315 * We mark the rgctx parameter with the inreg attribute, which is mapped to
4316 * MONO_ARCH_RGCTX_REG in the Mono calling convention in llvm, i.e.
4317 * CC_X86_64_Mono in X86CallingConv.td.
4319 LLVMAddAttribute (ctx->rgctx_arg, LLVMInRegAttribute);
4320 LLVMSetValueName (ctx->rgctx_arg, "rgctx");
4322 if (cfg->vret_addr) {
4323 values [cfg->vret_addr->dreg] = LLVMGetParam (method, sinfo.vret_arg_pindex);
4324 LLVMSetValueName (values [cfg->vret_addr->dreg], "vret");
4327 values [cfg->args [0]->dreg] = LLVMGetParam (method, sinfo.this_arg_pindex);
4328 LLVMSetValueName (values [cfg->args [0]->dreg], "this");
4331 names = g_new (char *, sig->param_count);
4332 mono_method_get_param_names (cfg->method, (const char **) names);
4334 for (i = 0; i < sig->param_count; ++i) {
4337 values [cfg->args [i + sig->hasthis]->dreg] = LLVMGetParam (method, sinfo.pindexes [i]);
4338 if (names [i] && names [i][0] != '\0')
4339 name = g_strdup_printf ("arg_%s", names [i]);
4341 name = g_strdup_printf ("arg_%d", i);
4342 LLVMSetValueName (values [cfg->args [i + sig->hasthis]->dreg], name);
4344 if (linfo->args [i + sig->hasthis].storage == LLVMArgVtypeByVal)
4345 LLVMAddAttribute (LLVMGetParam (method, sinfo.pindexes [i]), LLVMByValAttribute);
4350 for (bb = cfg->bb_entry; bb; bb = bb->next_bb)
4351 max_block_num = MAX (max_block_num, bb->block_num);
4352 ctx->bblocks = bblocks = g_new0 (BBInfo, max_block_num + 1);
4354 /* Add branches between non-consecutive bblocks */
4355 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
4356 if (bb->last_ins && MONO_IS_COND_BRANCH_OP (bb->last_ins) &&
4357 bb->next_bb != bb->last_ins->inst_false_bb) {
4359 MonoInst *inst = mono_mempool_alloc0 (cfg->mempool, sizeof (MonoInst));
4360 inst->opcode = OP_BR;
4361 inst->inst_target_bb = bb->last_ins->inst_false_bb;
4362 mono_bblock_add_inst (bb, inst);
4367 * The INDIRECT flag added by OP_LDADDR inhibits optimizations, even if the LDADDR
4368 * was later optimized away, so clear these flags, and add them back for the still
4369 * present OP_LDADDR instructions.
4371 for (i = 0; i < cfg->next_vreg; ++i) {
4374 ins = get_vreg_to_inst (cfg, i);
4375 if (ins && ins != cfg->rgctx_var)
4376 ins->flags &= ~MONO_INST_INDIRECT;
4380 * Make a first pass over the code to precreate PHI nodes/set INDIRECT flags.
4382 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
4384 LLVMBuilderRef builder;
4386 char dname_buf[128];
4388 builder = create_builder (ctx);
4390 for (ins = bb->code; ins; ins = ins->next) {
4391 switch (ins->opcode) {
4396 LLVMTypeRef phi_type = llvm_type_to_stack_type (type_to_llvm_type (ctx, &ins->klass->byval_arg));
4398 CHECK_FAILURE (ctx);
4400 if (ins->opcode == OP_VPHI) {
4401 /* Treat valuetype PHI nodes as operating on the address itself */
4402 g_assert (ins->klass);
4403 phi_type = LLVMPointerType (type_to_llvm_type (ctx, &ins->klass->byval_arg), 0);
4407 * Have to precreate these, as they can be referenced by
4408 * earlier instructions.
4410 sprintf (dname_buf, "t%d", ins->dreg);
4412 values [ins->dreg] = LLVMBuildPhi (builder, phi_type, dname);
4414 if (ins->opcode == OP_VPHI)
4415 ctx->addresses [ins->dreg] = values [ins->dreg];
4417 g_ptr_array_add (phi_values, values [ins->dreg]);
4420 * Set the expected type of the incoming arguments since these have
4421 * to have the same type.
4423 for (i = 0; i < ins->inst_phi_args [0]; i++) {
4424 int sreg1 = ins->inst_phi_args [i + 1];
4427 ctx->vreg_types [sreg1] = phi_type;
4432 ((MonoInst*)ins->inst_p0)->flags |= MONO_INST_INDIRECT;
4441 * Create an ordering for bblocks, use the depth first order first, then
4442 * put the exception handling bblocks last.
4444 for (bb_index = 0; bb_index < cfg->num_bblocks; ++bb_index) {
4445 bb = cfg->bblocks [bb_index];
4446 if (!(bb->region != -1 && !MONO_BBLOCK_IS_IN_REGION (bb, MONO_REGION_TRY))) {
4447 g_ptr_array_add (bblock_list, bb);
4448 bblocks [bb->block_num].added = TRUE;
4452 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
4453 if (!bblocks [bb->block_num].added)
4454 g_ptr_array_add (bblock_list, bb);
4458 * Second pass: generate code.
4460 for (bb_index = 0; bb_index < bblock_list->len; ++bb_index) {
4461 bb = g_ptr_array_index (bblock_list, bb_index);
4463 if (!(bb == cfg->bb_entry || bb->in_count > 0))
4466 process_bb (ctx, bb);
4467 CHECK_FAILURE (ctx);
4470 /* Add incoming phi values */
4471 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
4472 GSList *l, *ins_list;
4474 ins_list = bblocks [bb->block_num].phi_nodes;
4476 for (l = ins_list; l; l = l->next) {
4477 PhiNode *node = l->data;
4478 MonoInst *phi = node->phi;
4479 int sreg1 = node->sreg;
4480 LLVMBasicBlockRef in_bb;
4485 in_bb = get_end_bb (ctx, node->in_bb);
4487 if (ctx->unreachable [node->in_bb->block_num])
4490 if (!values [sreg1])
4491 /* Can happen with values in EH clauses */
4492 LLVM_FAILURE (ctx, "incoming phi sreg1");
4494 if (phi->opcode == OP_VPHI) {
4495 g_assert (LLVMTypeOf (ctx->addresses [sreg1]) == LLVMTypeOf (values [phi->dreg]));
4496 LLVMAddIncoming (values [phi->dreg], &ctx->addresses [sreg1], &in_bb, 1);
4498 g_assert (LLVMTypeOf (values [sreg1]) == LLVMTypeOf (values [phi->dreg]));
4499 LLVMAddIncoming (values [phi->dreg], &values [sreg1], &in_bb, 1);
4504 /* Create the SWITCH statements for ENDFINALLY instructions */
4505 for (bb = cfg->bb_entry; bb; bb = bb->next_bb) {
4506 BBInfo *info = &bblocks [bb->block_num];
4508 for (l = info->endfinally_switch_ins_list; l; l = l->next) {
4509 LLVMValueRef switch_ins = l->data;
4510 GSList *bb_list = info->call_handler_return_bbs;
4512 for (i = 0; i < g_slist_length (bb_list); ++i)
4513 LLVMAddCase (switch_ins, LLVMConstInt (LLVMInt32Type (), i + 1, FALSE), g_slist_nth (bb_list, i)->data);
4517 if (cfg->verbose_level > 1)
4518 mono_llvm_dump_value (method);
4520 mark_as_used (module, method);
4522 if (cfg->compile_aot) {
4523 LLVMValueRef md_args [16];
4524 LLVMValueRef md_node;
4527 method_index = mono_aot_get_method_index (cfg->orig_method);
4528 md_args [0] = LLVMMDString (method_name, strlen (method_name));
4529 md_args [1] = LLVMConstInt (LLVMInt32Type (), method_index, FALSE);
4530 md_node = LLVMMDNode (md_args, 2);
4531 LLVMAddNamedMetadataOperand (module, "mono.function_indexes", md_node);
4532 //LLVMSetMetadata (method, md_kind, LLVMMDNode (&md_arg, 1));
4535 if (cfg->compile_aot) {
4536 /* Don't generate native code, keep the LLVM IR */
4537 if (cfg->compile_aot && cfg->verbose_level)
4538 printf ("%s emitted as %s\n", mono_method_full_name (cfg->method, TRUE), method_name);
4540 //LLVMVerifyFunction(method, 0);
4542 mono_llvm_optimize_method (method);
4544 if (cfg->verbose_level > 1)
4545 mono_llvm_dump_value (method);
4547 cfg->native_code = LLVMGetPointerToGlobal (ee, method);
4549 /* Set by emit_cb */
4550 g_assert (cfg->code_len);
4552 /* FIXME: Free the LLVM IL for the function */
4560 /* Need to add unused phi nodes as they can be referenced by other values */
4561 LLVMBasicBlockRef phi_bb = LLVMAppendBasicBlock (method, "PHI_BB");
4562 LLVMBuilderRef builder;
4564 builder = create_builder (ctx);
4565 LLVMPositionBuilderAtEnd (builder, phi_bb);
4567 for (i = 0; i < phi_values->len; ++i) {
4568 LLVMValueRef v = g_ptr_array_index (phi_values, i);
4569 if (LLVMGetInstructionParent (v) == NULL)
4570 LLVMInsertIntoBuilder (builder, v);
4573 LLVMDeleteFunction (method);
4578 g_free (ctx->addresses);
4579 g_free (ctx->vreg_types);
4580 g_free (ctx->vreg_cli_types);
4581 g_free (ctx->pindexes);
4582 g_free (ctx->is_dead);
4583 g_free (ctx->unreachable);
4584 g_ptr_array_free (phi_values, TRUE);
4585 g_free (ctx->bblocks);
4586 g_hash_table_destroy (ctx->region_to_handler);
4587 g_free (method_name);
4588 g_ptr_array_free (bblock_list, TRUE);
4590 for (l = ctx->builders; l; l = l->next) {
4591 LLVMBuilderRef builder = l->data;
4592 LLVMDisposeBuilder (builder);
4597 mono_native_tls_set_value (current_cfg_tls_id, NULL);
4599 mono_loader_unlock ();
4603 * mono_llvm_emit_call:
4605 * Same as mono_arch_emit_call () for LLVM.
4608 mono_llvm_emit_call (MonoCompile *cfg, MonoCallInst *call)
4611 MonoMethodSignature *sig;
4612 int i, n, stack_size;
4617 sig = call->signature;
4618 n = sig->param_count + sig->hasthis;
4620 call->cinfo = mono_arch_get_llvm_call_info (cfg, sig);
4622 if (cfg->disable_llvm)
4625 if (sig->call_convention == MONO_CALL_VARARG) {
4626 cfg->exception_message = g_strdup ("varargs");
4627 cfg->disable_llvm = TRUE;
4630 for (i = 0; i < n; ++i) {
4633 ainfo = call->cinfo->args + i;
4635 in = call->args [i];
4637 /* Simply remember the arguments */
4638 switch (ainfo->storage) {
4640 case LLVMArgInFPReg: {
4641 MonoType *t = (sig->hasthis && i == 0) ? &mono_get_intptr_class ()->byval_arg : sig->params [i - sig->hasthis];
4643 if (!t->byref && (t->type == MONO_TYPE_R8 || t->type == MONO_TYPE_R4)) {
4644 MONO_INST_NEW (cfg, ins, OP_FMOVE);
4645 ins->dreg = mono_alloc_freg (cfg);
4647 MONO_INST_NEW (cfg, ins, OP_MOVE);
4648 ins->dreg = mono_alloc_ireg (cfg);
4650 ins->sreg1 = in->dreg;
4653 case LLVMArgVtypeByVal:
4654 case LLVMArgVtypeInReg:
4655 MONO_INST_NEW (cfg, ins, OP_LLVM_OUTARG_VT);
4656 ins->dreg = mono_alloc_ireg (cfg);
4657 ins->sreg1 = in->dreg;
4658 ins->klass = mono_class_from_mono_type (sig->params [i - sig->hasthis]);
4661 call->cinfo = mono_arch_get_llvm_call_info (cfg, sig);
4662 cfg->exception_message = g_strdup ("ainfo->storage");
4663 cfg->disable_llvm = TRUE;
4667 if (!cfg->disable_llvm) {
4668 MONO_ADD_INS (cfg->cbb, ins);
4669 mono_call_inst_add_outarg_reg (cfg, call, ins->dreg, 0, FALSE);
4674 static unsigned char*
4675 alloc_cb (LLVMValueRef function, int size)
4679 cfg = mono_native_tls_get_value (current_cfg_tls_id);
4683 return mono_domain_code_reserve (cfg->domain, size);
4685 return mono_domain_code_reserve (mono_domain_get (), size);
4690 emitted_cb (LLVMValueRef function, void *start, void *end)
4694 cfg = mono_native_tls_get_value (current_cfg_tls_id);
4696 cfg->code_len = (guint8*)end - (guint8*)start;
4700 exception_cb (void *data)
4703 MonoJitExceptionInfo *ei;
4704 guint32 ei_len, i, j, nested_len, nindex;
4705 gpointer *type_info;
4706 int this_reg, this_offset;
4708 cfg = mono_native_tls_get_value (current_cfg_tls_id);
4712 * data points to a DWARF FDE structure, convert it to our unwind format and
4714 * An alternative would be to save it directly, and modify our unwinder to work
4717 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);
4718 if (cfg->verbose_level > 1)
4719 mono_print_unwind_info (cfg->encoded_unwind_ops, cfg->encoded_unwind_ops_len);
4721 /* Count nested clauses */
4723 for (i = 0; i < ei_len; ++i) {
4724 for (j = 0; j < ei_len; ++j) {
4725 gint32 cindex1 = *(gint32*)type_info [i];
4726 MonoExceptionClause *clause1 = &cfg->header->clauses [cindex1];
4727 gint32 cindex2 = *(gint32*)type_info [j];
4728 MonoExceptionClause *clause2 = &cfg->header->clauses [cindex2];
4730 if (cindex1 != cindex2 && clause1->try_offset >= clause2->try_offset && clause1->handler_offset <= clause2->handler_offset) {
4736 cfg->llvm_ex_info = mono_mempool_alloc0 (cfg->mempool, (ei_len + nested_len) * sizeof (MonoJitExceptionInfo));
4737 cfg->llvm_ex_info_len = ei_len + nested_len;
4738 memcpy (cfg->llvm_ex_info, ei, ei_len * sizeof (MonoJitExceptionInfo));
4739 /* Fill the rest of the information from the type info */
4740 for (i = 0; i < ei_len; ++i) {
4741 gint32 clause_index = *(gint32*)type_info [i];
4742 MonoExceptionClause *clause = &cfg->header->clauses [clause_index];
4744 cfg->llvm_ex_info [i].flags = clause->flags;
4745 cfg->llvm_ex_info [i].data.catch_class = clause->data.catch_class;
4749 * For nested clauses, the LLVM produced exception info associates the try interval with
4750 * the innermost handler, while mono expects it to be associated with all nesting clauses.
4752 /* FIXME: These should be order with the normal clauses */
4754 for (i = 0; i < ei_len; ++i) {
4755 for (j = 0; j < ei_len; ++j) {
4756 gint32 cindex1 = *(gint32*)type_info [i];
4757 MonoExceptionClause *clause1 = &cfg->header->clauses [cindex1];
4758 gint32 cindex2 = *(gint32*)type_info [j];
4759 MonoExceptionClause *clause2 = &cfg->header->clauses [cindex2];
4761 if (cindex1 != cindex2 && clause1->try_offset >= clause2->try_offset && clause1->handler_offset <= clause2->handler_offset) {
4763 * The try interval comes from the nested clause, everything else from the
4766 memcpy (&cfg->llvm_ex_info [nindex], &cfg->llvm_ex_info [j], sizeof (MonoJitExceptionInfo));
4767 cfg->llvm_ex_info [nindex].try_start = cfg->llvm_ex_info [i].try_start;
4768 cfg->llvm_ex_info [nindex].try_end = cfg->llvm_ex_info [i].try_end;
4773 g_assert (nindex == ei_len + nested_len);
4774 cfg->llvm_this_reg = this_reg;
4775 cfg->llvm_this_offset = this_offset;
4777 /* type_info [i] is cfg mempool allocated, no need to free it */
4784 dlsym_cb (const char *name, void **symbol)
4790 if (!strcmp (name, "__bzero")) {
4791 *symbol = (void*)bzero;
4793 current = mono_dl_open (NULL, 0, NULL);
4796 err = mono_dl_symbol (current, name, symbol);
4798 #ifdef MONO_ARCH_HAVE_CREATE_LLVM_NATIVE_THUNK
4799 *symbol = (char*)mono_arch_create_llvm_native_thunk (mono_domain_get (), (guint8*)(*symbol));
4805 AddFunc (LLVMModuleRef module, const char *name, LLVMTypeRef ret_type, LLVMTypeRef *param_types, int nparams)
4807 LLVMAddFunction (module, name, LLVMFunctionType (ret_type, param_types, nparams, FALSE));
4811 AddFunc2 (LLVMModuleRef module, const char *name, LLVMTypeRef ret_type, LLVMTypeRef param_type1, LLVMTypeRef param_type2)
4813 LLVMTypeRef param_types [4];
4815 param_types [0] = param_type1;
4816 param_types [1] = param_type2;
4818 AddFunc (module, name, ret_type, param_types, 2);
4822 add_intrinsics (LLVMModuleRef module)
4824 /* Emit declarations of instrinsics */
4826 * It would be nicer to emit only the intrinsics actually used, but LLVM's Module
4827 * type doesn't seem to do any locking.
4830 LLVMTypeRef memset_params [] = { LLVMPointerType (LLVMInt8Type (), 0), LLVMInt8Type (), LLVMInt32Type (), LLVMInt32Type (), LLVMInt1Type () };
4832 memset_param_count = 5;
4833 memset_func_name = "llvm.memset.p0i8.i32";
4835 LLVMAddFunction (module, memset_func_name, LLVMFunctionType (LLVMVoidType (), memset_params, memset_param_count, FALSE));
4839 LLVMTypeRef memcpy_params [] = { LLVMPointerType (LLVMInt8Type (), 0), LLVMPointerType (LLVMInt8Type (), 0), LLVMInt32Type (), LLVMInt32Type (), LLVMInt1Type () };
4841 memcpy_param_count = 5;
4842 memcpy_func_name = "llvm.memcpy.p0i8.p0i8.i32";
4844 LLVMAddFunction (module, memcpy_func_name, LLVMFunctionType (LLVMVoidType (), memcpy_params, memcpy_param_count, FALSE));
4848 LLVMTypeRef params [] = { LLVMDoubleType () };
4850 LLVMAddFunction (module, "llvm.sin.f64", LLVMFunctionType (LLVMDoubleType (), params, 1, FALSE));
4851 LLVMAddFunction (module, "llvm.cos.f64", LLVMFunctionType (LLVMDoubleType (), params, 1, FALSE));
4852 LLVMAddFunction (module, "llvm.sqrt.f64", LLVMFunctionType (LLVMDoubleType (), params, 1, FALSE));
4854 /* This isn't an intrinsic, instead llvm seems to special case it by name */
4855 LLVMAddFunction (module, "fabs", LLVMFunctionType (LLVMDoubleType (), params, 1, FALSE));
4859 LLVMTypeRef ovf_res_i32 [] = { LLVMInt32Type (), LLVMInt1Type () };
4860 LLVMTypeRef ovf_params_i32 [] = { LLVMInt32Type (), LLVMInt32Type () };
4862 LLVMAddFunction (module, "llvm.sadd.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4863 LLVMAddFunction (module, "llvm.uadd.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4864 LLVMAddFunction (module, "llvm.ssub.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4865 LLVMAddFunction (module, "llvm.usub.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4866 LLVMAddFunction (module, "llvm.smul.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4867 LLVMAddFunction (module, "llvm.umul.with.overflow.i32", LLVMFunctionType (LLVMStructType (ovf_res_i32, 2, FALSE), ovf_params_i32, 2, FALSE));
4871 LLVMTypeRef ovf_res_i64 [] = { LLVMInt64Type (), LLVMInt1Type () };
4872 LLVMTypeRef ovf_params_i64 [] = { LLVMInt64Type (), LLVMInt64Type () };
4874 LLVMAddFunction (module, "llvm.sadd.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4875 LLVMAddFunction (module, "llvm.uadd.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4876 LLVMAddFunction (module, "llvm.ssub.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4877 LLVMAddFunction (module, "llvm.usub.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4878 LLVMAddFunction (module, "llvm.smul.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4879 LLVMAddFunction (module, "llvm.umul.with.overflow.i64", LLVMFunctionType (LLVMStructType (ovf_res_i64, 2, FALSE), ovf_params_i64, 2, FALSE));
4884 LLVMTypeRef arg_types [2];
4885 LLVMTypeRef ret_type;
4887 arg_types [0] = LLVMPointerType (LLVMInt8Type (), 0);
4888 arg_types [1] = LLVMPointerType (LLVMInt8Type (), 0);
4889 ret_type = LLVMInt32Type ();
4891 LLVMAddFunction (module, "mono_personality", LLVMFunctionType (LLVMVoidType (), NULL, 0, FALSE));
4893 LLVMAddFunction (module, "llvm_resume_unwind_trampoline", LLVMFunctionType (LLVMVoidType (), NULL, 0, FALSE));
4896 /* SSE intrinsics */
4897 #if defined(TARGET_X86) || defined(TARGET_AMD64)
4899 LLVMTypeRef ret_type, arg_types [16];
4902 ret_type = type_to_simd_type (MONO_TYPE_I4);
4903 arg_types [0] = ret_type;
4904 arg_types [1] = ret_type;
4905 AddFunc (module, "llvm.x86.sse41.pminud", ret_type, arg_types, 2);
4906 AddFunc (module, "llvm.x86.sse41.pmaxud", ret_type, arg_types, 2);
4908 ret_type = type_to_simd_type (MONO_TYPE_I2);
4909 arg_types [0] = ret_type;
4910 arg_types [1] = ret_type;
4911 AddFunc (module, "llvm.x86.sse41.pminuw", ret_type, arg_types, 2);
4912 AddFunc (module, "llvm.x86.sse2.pmins.w", ret_type, arg_types, 2);
4913 AddFunc (module, "llvm.x86.sse41.pmaxuw", ret_type, arg_types, 2);
4914 AddFunc (module, "llvm.x86.sse2.padds.w", ret_type, arg_types, 2);
4915 AddFunc (module, "llvm.x86.sse2.psubs.w", ret_type, arg_types, 2);
4916 AddFunc (module, "llvm.x86.sse2.paddus.w", ret_type, arg_types, 2);
4917 AddFunc (module, "llvm.x86.sse2.psubus.w", ret_type, arg_types, 2);
4918 AddFunc (module, "llvm.x86.sse2.pavg.w", ret_type, arg_types, 2);
4919 AddFunc (module, "llvm.x86.sse2.pmulh.w", ret_type, arg_types, 2);
4920 AddFunc (module, "llvm.x86.sse2.pmulhu.w", ret_type, arg_types, 2);
4922 ret_type = type_to_simd_type (MONO_TYPE_I1);
4923 arg_types [0] = ret_type;
4924 arg_types [1] = ret_type;
4925 AddFunc (module, "llvm.x86.sse2.pminu.b", ret_type, arg_types, 2);
4926 AddFunc (module, "llvm.x86.sse2.pmaxu.b", ret_type, arg_types, 2);
4927 AddFunc (module, "llvm.x86.sse2.padds.b", ret_type, arg_types, 2);
4928 AddFunc (module, "llvm.x86.sse2.psubs.b", ret_type, arg_types, 2);
4929 AddFunc (module, "llvm.x86.sse2.paddus.b", ret_type, arg_types, 2);
4930 AddFunc (module, "llvm.x86.sse2.psubus.b", ret_type, arg_types, 2);
4931 AddFunc (module, "llvm.x86.sse2.pavg.b", ret_type, arg_types, 2);
4933 ret_type = type_to_simd_type (MONO_TYPE_R8);
4934 arg_types [0] = ret_type;
4935 arg_types [1] = ret_type;
4936 AddFunc (module, "llvm.x86.sse2.min.pd", ret_type, arg_types, 2);
4937 AddFunc (module, "llvm.x86.sse2.max.pd", ret_type, arg_types, 2);
4938 AddFunc (module, "llvm.x86.sse3.hadd.pd", ret_type, arg_types, 2);
4939 AddFunc (module, "llvm.x86.sse3.hsub.pd", ret_type, arg_types, 2);
4940 AddFunc (module, "llvm.x86.sse3.addsub.pd", ret_type, arg_types, 2);
4942 ret_type = type_to_simd_type (MONO_TYPE_R4);
4943 arg_types [0] = ret_type;
4944 arg_types [1] = ret_type;
4945 AddFunc (module, "llvm.x86.sse.min.ps", ret_type, arg_types, 2);
4946 AddFunc (module, "llvm.x86.sse.max.ps", ret_type, arg_types, 2);
4947 AddFunc (module, "llvm.x86.sse3.hadd.ps", ret_type, arg_types, 2);
4948 AddFunc (module, "llvm.x86.sse3.hsub.ps", ret_type, arg_types, 2);
4949 AddFunc (module, "llvm.x86.sse3.addsub.ps", ret_type, arg_types, 2);
4952 ret_type = type_to_simd_type (MONO_TYPE_I1);
4953 arg_types [0] = type_to_simd_type (MONO_TYPE_I2);
4954 arg_types [1] = type_to_simd_type (MONO_TYPE_I2);
4955 AddFunc (module, "llvm.x86.sse2.packsswb.128", ret_type, arg_types, 2);
4956 AddFunc (module, "llvm.x86.sse2.packuswb.128", ret_type, arg_types, 2);
4957 ret_type = type_to_simd_type (MONO_TYPE_I2);
4958 arg_types [0] = type_to_simd_type (MONO_TYPE_I4);
4959 arg_types [1] = type_to_simd_type (MONO_TYPE_I4);
4960 AddFunc (module, "llvm.x86.sse2.packssdw.128", ret_type, arg_types, 2);
4961 AddFunc (module, "llvm.x86.sse41.packusdw", ret_type, arg_types, 2);
4964 ret_type = type_to_simd_type (MONO_TYPE_R8);
4965 arg_types [0] = ret_type;
4966 arg_types [1] = ret_type;
4967 arg_types [2] = LLVMInt8Type ();
4968 AddFunc (module, "llvm.x86.sse2.cmp.pd", ret_type, arg_types, 3);
4969 ret_type = type_to_simd_type (MONO_TYPE_R4);
4970 arg_types [0] = ret_type;
4971 arg_types [1] = ret_type;
4972 arg_types [2] = LLVMInt8Type ();
4973 AddFunc (module, "llvm.x86.sse.cmp.ps", ret_type, arg_types, 3);
4975 /* Conversion ops */
4976 ret_type = type_to_simd_type (MONO_TYPE_R8);
4977 arg_types [0] = type_to_simd_type (MONO_TYPE_I4);
4978 AddFunc (module, "llvm.x86.sse2.cvtdq2pd", ret_type, arg_types, 1);
4979 ret_type = type_to_simd_type (MONO_TYPE_R4);
4980 arg_types [0] = type_to_simd_type (MONO_TYPE_I4);
4981 AddFunc (module, "llvm.x86.sse2.cvtdq2ps", ret_type, arg_types, 1);
4982 ret_type = type_to_simd_type (MONO_TYPE_I4);
4983 arg_types [0] = type_to_simd_type (MONO_TYPE_R8);
4984 AddFunc (module, "llvm.x86.sse2.cvtpd2dq", ret_type, arg_types, 1);
4985 ret_type = type_to_simd_type (MONO_TYPE_I4);
4986 arg_types [0] = type_to_simd_type (MONO_TYPE_R4);
4987 AddFunc (module, "llvm.x86.sse2.cvtps2dq", ret_type, arg_types, 1);
4988 ret_type = type_to_simd_type (MONO_TYPE_R4);
4989 arg_types [0] = type_to_simd_type (MONO_TYPE_R8);
4990 AddFunc (module, "llvm.x86.sse2.cvtpd2ps", ret_type, arg_types, 1);
4991 ret_type = type_to_simd_type (MONO_TYPE_R8);
4992 arg_types [0] = type_to_simd_type (MONO_TYPE_R4);
4993 AddFunc (module, "llvm.x86.sse2.cvtps2pd", ret_type, arg_types, 1);
4995 ret_type = type_to_simd_type (MONO_TYPE_I4);
4996 arg_types [0] = type_to_simd_type (MONO_TYPE_R8);
4997 AddFunc (module, "llvm.x86.sse2.cvttpd2dq", ret_type, arg_types, 1);
4998 ret_type = type_to_simd_type (MONO_TYPE_I4);
4999 arg_types [0] = type_to_simd_type (MONO_TYPE_R4);
5000 AddFunc (module, "llvm.x86.sse2.cvttps2dq", ret_type, arg_types, 1);
5003 ret_type = type_to_simd_type (MONO_TYPE_R8);
5004 arg_types [0] = ret_type;
5005 AddFunc (module, "llvm.x86.sse2.sqrt.pd", ret_type, arg_types, 1);
5006 ret_type = type_to_simd_type (MONO_TYPE_R4);
5007 arg_types [0] = ret_type;
5008 AddFunc (module, "llvm.x86.sse.sqrt.ps", ret_type, arg_types, 1);
5009 ret_type = type_to_simd_type (MONO_TYPE_R4);
5010 arg_types [0] = ret_type;
5011 AddFunc (module, "llvm.x86.sse.rsqrt.ps", ret_type, arg_types, 1);
5012 ret_type = type_to_simd_type (MONO_TYPE_R4);
5013 arg_types [0] = ret_type;
5014 AddFunc (module, "llvm.x86.sse.rcp.ps", ret_type, arg_types, 1);
5017 ret_type = type_to_simd_type (MONO_TYPE_I2);
5018 arg_types [0] = ret_type;
5019 arg_types [1] = LLVMInt32Type ();
5020 AddFunc (module, "llvm.x86.sse2.psrli.w", ret_type, arg_types, 2);
5021 AddFunc (module, "llvm.x86.sse2.psrai.w", ret_type, arg_types, 2);
5022 AddFunc (module, "llvm.x86.sse2.pslli.w", ret_type, arg_types, 2);
5023 ret_type = type_to_simd_type (MONO_TYPE_I4);
5024 arg_types [0] = ret_type;
5025 arg_types [1] = LLVMInt32Type ();
5026 AddFunc (module, "llvm.x86.sse2.psrli.d", ret_type, arg_types, 2);
5027 AddFunc (module, "llvm.x86.sse2.psrai.d", ret_type, arg_types, 2);
5028 AddFunc (module, "llvm.x86.sse2.pslli.d", ret_type, arg_types, 2);
5029 ret_type = type_to_simd_type (MONO_TYPE_I8);
5030 arg_types [0] = ret_type;
5031 arg_types [1] = LLVMInt32Type ();
5032 AddFunc (module, "llvm.x86.sse2.psrli.q", ret_type, arg_types, 2);
5033 AddFunc (module, "llvm.x86.sse2.pslli.q", ret_type, arg_types, 2);
5036 ret_type = LLVMInt32Type ();
5037 arg_types [0] = type_to_simd_type (MONO_TYPE_I1);
5038 AddFunc (module, "llvm.x86.sse2.pmovmskb.128", ret_type, arg_types, 1);
5041 AddFunc (module, "llvm.x86.sse2.pause", LLVMVoidType (), NULL, 0);
5044 /* Load/Store intrinsics */
5046 LLVMTypeRef arg_types [5];
5050 for (i = 1; i <= 8; i *= 2) {
5051 arg_types [0] = LLVMPointerType (LLVMIntType (i * 8), 0);
5052 arg_types [1] = LLVMInt32Type ();
5053 arg_types [2] = LLVMInt1Type ();
5054 sprintf (name, "llvm.mono.load.i%d.p0i%d", i * 8, i * 8);
5055 LLVMAddFunction (module, name, LLVMFunctionType (LLVMIntType (i * 8), arg_types, 3, FALSE));
5057 arg_types [0] = LLVMIntType (i * 8);
5058 arg_types [1] = LLVMPointerType (LLVMIntType (i * 8), 0);
5059 arg_types [2] = LLVMInt32Type ();
5060 arg_types [3] = LLVMInt1Type ();
5061 sprintf (name, "llvm.mono.store.i%d.p0i%d", i * 8, i * 8);
5062 LLVMAddFunction (module, name, LLVMFunctionType (LLVMVoidType (), arg_types, 4, FALSE));
5068 mono_llvm_init (void)
5070 mono_native_tls_alloc (¤t_cfg_tls_id, NULL);
5074 init_jit_module (void)
5076 MonoJitICallInfo *info;
5078 if (jit_module_inited)
5081 mono_loader_lock ();
5083 if (jit_module_inited) {
5084 mono_loader_unlock ();
5088 jit_module.module = LLVMModuleCreateWithName ("mono");
5090 ee = mono_llvm_create_ee (LLVMCreateModuleProviderForExistingModule (jit_module.module), alloc_cb, emitted_cb, exception_cb, dlsym_cb);
5092 add_intrinsics (jit_module.module);
5094 jit_module.llvm_types = g_hash_table_new (NULL, NULL);
5096 info = mono_find_jit_icall_by_name ("llvm_resume_unwind_trampoline");
5098 LLVMAddGlobalMapping (ee, LLVMGetNamedFunction (jit_module.module, "llvm_resume_unwind_trampoline"), (void*)info->func);
5100 jit_module_inited = TRUE;
5102 mono_loader_unlock ();
5106 mono_llvm_cleanup (void)
5109 mono_llvm_dispose_ee (ee);
5111 if (jit_module.llvm_types)
5112 g_hash_table_destroy (jit_module.llvm_types);
5114 if (aot_module.module)
5115 LLVMDisposeModule (aot_module.module);
5117 LLVMContextDispose (LLVMGetGlobalContext ());
5121 mono_llvm_create_aot_module (const char *got_symbol)
5123 /* Delete previous module */
5124 if (aot_module.plt_entries)
5125 g_hash_table_destroy (aot_module.plt_entries);
5126 if (aot_module.module)
5127 LLVMDisposeModule (aot_module.module);
5129 memset (&aot_module, 0, sizeof (aot_module));
5131 aot_module.module = LLVMModuleCreateWithName ("aot");
5132 aot_module.got_symbol = got_symbol;
5134 add_intrinsics (aot_module.module);
5138 * We couldn't compute the type of the LLVM global representing the got because
5139 * its size is only known after all the methods have been emitted. So create
5140 * a dummy variable, and replace all uses it with the real got variable when
5141 * its size is known in mono_llvm_emit_aot_module ().
5144 LLVMTypeRef got_type = LLVMArrayType (IntPtrType (), 0);
5146 aot_module.got_var = LLVMAddGlobal (aot_module.module, got_type, "mono_dummy_got");
5147 LLVMSetInitializer (aot_module.got_var, LLVMConstNull (got_type));
5150 /* Add a dummy personality function */
5152 LLVMBasicBlockRef lbb;
5153 LLVMBuilderRef lbuilder;
5154 LLVMValueRef personality;
5156 personality = LLVMAddFunction (aot_module.module, "mono_aot_personality", LLVMFunctionType (LLVMVoidType (), NULL, 0, FALSE));
5157 LLVMSetLinkage (personality, LLVMInternalLinkage);
5158 lbb = LLVMAppendBasicBlock (personality, "BB0");
5159 lbuilder = LLVMCreateBuilder ();
5160 LLVMPositionBuilderAtEnd (lbuilder, lbb);
5161 LLVMBuildRetVoid (lbuilder);
5164 aot_module.llvm_types = g_hash_table_new (NULL, NULL);
5165 aot_module.plt_entries = g_hash_table_new (g_str_hash, g_str_equal);
5169 * Emit the aot module into the LLVM bitcode file FILENAME.
5172 mono_llvm_emit_aot_module (const char *filename, int got_size)
5174 LLVMTypeRef got_type;
5175 LLVMValueRef real_got;
5178 * Create the real got variable and replace all uses of the dummy variable with
5181 got_type = LLVMArrayType (IntPtrType (), got_size);
5182 real_got = LLVMAddGlobal (aot_module.module, got_type, aot_module.got_symbol);
5183 LLVMSetInitializer (real_got, LLVMConstNull (got_type));
5184 LLVMSetLinkage (real_got, LLVMInternalLinkage);
5186 mono_llvm_replace_uses_of (aot_module.got_var, real_got);
5188 mark_as_used (aot_module.module, real_got);
5190 /* Delete the dummy got so it doesn't become a global */
5191 LLVMDeleteGlobal (aot_module.got_var);
5197 if (LLVMVerifyModule (aot_module.module, LLVMReturnStatusAction, &verifier_err)) {
5198 g_assert_not_reached ();
5203 LLVMWriteBitcodeToFile (aot_module.module, filename);
5208 - Emit LLVM IR from the mono IR using the LLVM C API.
5209 - The original arch specific code remains, so we can fall back to it if we run
5210 into something we can't handle.
5214 A partial list of issues:
5215 - Handling of opcodes which can throw exceptions.
5217 In the mono JIT, these are implemented using code like this:
5224 push throw_pos - method
5225 call <exception trampoline>
5227 The problematic part is push throw_pos - method, which cannot be represented
5228 in the LLVM IR, since it does not support label values.
5229 -> this can be implemented in AOT mode using inline asm + labels, but cannot
5230 be implemented in JIT mode ?
5231 -> a possible but slower implementation would use the normal exception
5232 throwing code but it would need to control the placement of the throw code
5233 (it needs to be exactly after the compare+branch).
5234 -> perhaps add a PC offset intrinsics ?
5236 - efficient implementation of .ovf opcodes.
5238 These are currently implemented as:
5239 <ins which sets the condition codes>
5242 Some overflow opcodes are now supported by LLVM SVN.
5244 - exception handling, unwinding.
5245 - SSA is disabled for methods with exception handlers
5246 - How to obtain unwind info for LLVM compiled methods ?
5247 -> this is now solved by converting the unwind info generated by LLVM
5249 - LLVM uses the c++ exception handling framework, while we use our home grown
5250 code, and couldn't use the c++ one:
5251 - its not supported under VC++, other exotic platforms.
5252 - it might be impossible to support filter clauses with it.
5256 The trampolines need a predictable call sequence, since they need to disasm
5257 the calling code to obtain register numbers / offsets.
5259 LLVM currently generates this code in non-JIT mode:
5260 mov -0x98(%rax),%eax
5262 Here, the vtable pointer is lost.
5263 -> solution: use one vtable trampoline per class.
5265 - passing/receiving the IMT pointer/RGCTX.
5266 -> solution: pass them as normal arguments ?
5270 LLVM does not allow the specification of argument registers etc. This means
5271 that all calls are made according to the platform ABI.
5273 - passing/receiving vtypes.
5275 Vtypes passed/received in registers are handled by the front end by using
5276 a signature with scalar arguments, and loading the parts of the vtype into those
5279 Vtypes passed on the stack are handled using the 'byval' attribute.
5283 Supported though alloca, we need to emit the load/store code.
5287 The mono JIT uses pointer sized iregs/double fregs, while LLVM uses precisely
5288 typed registers, so we have to keep track of the precise LLVM type of each vreg.
5289 This is made easier because the IR is already in SSA form.
5290 An additional problem is that our IR is not consistent with types, i.e. i32/ia64
5291 types are frequently used incorrectly.
5296 Emit LLVM bytecode into a .bc file, compile it using llc into a .s file, then
5297 append the AOT data structures to that file. For methods which cannot be
5298 handled by LLVM, the normal JIT compiled versions are used.
5301 /* FIXME: Normalize some aspects of the mono IR to allow easier translation, like:
5302 * - each bblock should end with a branch
5303 * - setting the return value, making cfg->ret non-volatile
5304 * - avoid some transformations in the JIT which make it harder for us to generate
5306 * - use pointer types to help optimizations.