Fix an assert in the arm backend if an offset is too large.
authorZoltan Varga <vargaz@gmail.com>
Thu, 5 Jul 2012 02:59:11 +0000 (04:59 +0200)
committerZoltan Varga <vargaz@gmail.com>
Thu, 5 Jul 2012 02:59:24 +0000 (04:59 +0200)
mono/mini/mini-arm.c

index d78bd911bd2080dbfbb4c48eb250be66e413c72f..823761f9f33b7d7c30edb9ca10ddba2584830601 100644 (file)
@@ -5237,10 +5237,18 @@ mono_arch_emit_prolog (MonoCompile *cfg)
                                        }
                                        break;
                                case 8:
-                                       g_assert (arm_is_imm12 (inst->inst_offset));
-                                       ARM_STR_IMM (code, ainfo->reg, inst->inst_basereg, inst->inst_offset);
-                                       g_assert (arm_is_imm12 (inst->inst_offset + 4));
-                                       ARM_STR_IMM (code, ainfo->reg + 1, inst->inst_basereg, inst->inst_offset + 4);
+                                       if (arm_is_imm12 (inst->inst_offset)) {
+                                               ARM_STR_IMM (code, ainfo->reg, inst->inst_basereg, inst->inst_offset);
+                                       } else {
+                                               code = mono_arm_emit_load_imm (code, ARMREG_IP, inst->inst_offset);
+                                               ARM_STR_REG_REG (code, ainfo->reg, inst->inst_basereg, ARMREG_IP);
+                                       }
+                                       if (arm_is_imm12 (inst->inst_offset + 4)) {
+                                               ARM_STR_IMM (code, ainfo->reg + 1, inst->inst_basereg, inst->inst_offset + 4);
+                                       } else {
+                                               code = mono_arm_emit_load_imm (code, ARMREG_IP, inst->inst_offset + 4);
+                                               ARM_STR_REG_REG (code, ainfo->reg + 1, inst->inst_basereg, ARMREG_IP);
+                                       }
                                        break;
                                default:
                                        if (arm_is_imm12 (inst->inst_offset)) {