2010-07-09 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Fri, 9 Jul 2010 15:04:11 +0000 (15:04 -0000)
committerZoltan Varga <vargaz@gmail.com>
Fri, 9 Jul 2010 15:04:11 +0000 (15:04 -0000)
* ir-emit.h mini-llvm.c: Fix support for explicit-null-checks + LLVM.

svn path=/trunk/mono/; revision=160135

mono/mini/ChangeLog
mono/mini/ir-emit.h
mono/mini/mini-llvm.c

index db7f064fd1c5239d929800223aa7fa1be26d6c15..a7f70a78d38f4fc30cb3aa4a973e67d0c754be17 100755 (executable)
@@ -1,3 +1,7 @@
+2010-07-09  Zoltan Varga  <vargaz@gmail.com>
+
+       * ir-emit.h mini-llvm.c: Fix support for explicit-null-checks + LLVM.
+
 2010-07-09  Rolf Bjarne Kvinge  <RKvinge@novell.com>
 
        * driver.c: Moonlight: Force line buffering for stdout.
index 1f469f779c8c432b6f263812391a0c938df8af6f..b7eaaf98677e8ae043351ba588e698a3444348a3 100755 (executable)
@@ -781,7 +781,11 @@ static int ccount = 0;
 /* A load which can cause a nullref */
 #define NEW_LOAD_MEMBASE_FAULT(cfg,dest,op,dr,base,offset) do { \
                MONO_EMIT_NULL_CHECK ((cfg), (base));   \
-               NEW_LOAD_MEMBASE_FLAGS ((cfg), (dest), (op), (dr), (base), (offset), MONO_INST_FAULT); \
+               if (cfg->explicit_null_checks) {                                                          \
+                       NEW_LOAD_MEMBASE ((cfg), (dest), (op), (dr), (base), (offset)); \
+               } else { \
+                       NEW_LOAD_MEMBASE_FLAGS ((cfg), (dest), (op), (dr), (base), (offset), MONO_INST_FAULT); \
+               } \
        } while (0)
 
 #define EMIT_NEW_LOAD_MEMBASE_FAULT(cfg,dest,op,dr,base,offset) do { \
@@ -791,7 +795,11 @@ static int ccount = 0;
 
 #define MONO_EMIT_NEW_LOAD_MEMBASE_OP_FAULT(cfg,op,dr,base,offset) do { \
                MONO_EMIT_NULL_CHECK (cfg, base);               \
-               MONO_EMIT_NEW_LOAD_MEMBASE_OP_FLAGS ((cfg), (op), (dr), (base), (offset), MONO_INST_FAULT); \
+               if (cfg->explicit_null_checks) {                                                          \
+                       MONO_EMIT_NEW_LOAD_MEMBASE_OP ((cfg), (op), (dr), (base), (offset)); \
+               } else { \
+                       MONO_EMIT_NEW_LOAD_MEMBASE_OP_FLAGS ((cfg), (op), (dr), (base), (offset), MONO_INST_FAULT); \
+                       } \
        } while (0)
 
 #define MONO_EMIT_NEW_LOAD_MEMBASE_FAULT(cfg,dr,base,offset) MONO_EMIT_NEW_LOAD_MEMBASE_OP_FAULT ((cfg), (OP_LOAD_MEMBASE), (dr), (base), (offset))
index 475b7acb870b83773a2b6707639eb95b13a1a60e..4151ddfe3292bae57300066d45a58aed66b2619a 100644 (file)
@@ -1175,12 +1175,23 @@ emit_load (EmitContext *ctx, MonoBasicBlock *bb, LLVMBuilderRef *builder_ref, in
                
                return res;
        } else {
+               LLVMValueRef res, md_arg;
+               int md_kind;
+
                /* 
                 * We emit volatile loads for loads which can fault, because otherwise
                 * LLVM will generate invalid code when encountering a load from a
                 * NULL address.
                 */
-               return mono_llvm_build_load (*builder_ref, addr, name, is_faulting);
+                res = mono_llvm_build_load (*builder_ref, addr, name, is_faulting);
+
+                /* Mark it with a custom metadata */
+                if (is_faulting) {
+                        md_kind = LLVMGetMDKindID ("mono.faulting.load", strlen ("mono.faulting.load"));
+                        md_arg = LLVMMDString ("mono", 4);
+                        LLVMSetMetadata (res, md_kind, LLVMMDNode (&md_arg, 1));
+                }
+                return res;
        }
 }
 
@@ -2230,7 +2241,7 @@ process_bb (EmitContext *ctx, MonoBasicBlock *bb)
                                        g_assert (ins->inst_offset % size == 0);
                                        index = LLVMConstInt (LLVMInt32Type (), ins->inst_offset / size, FALSE);                                
 
-                                       lhs = emit_load (ctx, bb, &builder, 4, LLVMBuildGEP (builder, convert (ctx, values [ins->inst_basereg], LLVMPointerType (t, 0)), &index, 1, ""), "", TRUE);
+                                       lhs = emit_load (ctx, bb, &builder, 4, LLVMBuildGEP (builder, convert (ctx, values [ins->inst_basereg], LLVMPointerType (t, 0)), &index, 1, ""), "", !cfg->explicit_null_checks);
                                }
                                if (ins->opcode == OP_AMD64_ICOMPARE_MEMBASE_IMM) {
                                        lhs = convert (ctx, lhs, LLVMInt32Type ());