[arm] Simplify the seq point code used for soft breakpoints.
authorZoltan Varga <vargaz@gmail.com>
Mon, 16 Nov 2015 03:55:00 +0000 (03:55 +0000)
committerZoltan Varga <vargaz@gmail.com>
Mon, 16 Nov 2015 03:55:00 +0000 (03:55 +0000)
mono/mini/mini-arm.c
mono/mini/mini-arm.h

index fb502fb547452824c7e66b227f86219687f9d9a7..6016ab56ab279be2575726bd12205643d3a46eb6 100644 (file)
@@ -147,8 +147,6 @@ static int vfp_scratch2 = ARM_VFP_D1;
 
 static int i8_align;
 
-static volatile int ss_trigger_var = 0;
-
 static gpointer single_step_tramp, breakpoint_tramp;
 
 /*
@@ -919,7 +917,6 @@ mono_arch_init (void)
 
        mono_mutex_init_recursive (&mini_arch_mutex);
        if (mini_get_debug_options ()->soft_breakpoints) {
-               single_step_tramp = mini_get_single_step_trampoline ();
                breakpoint_tramp = mini_get_breakpoint_trampoline ();
        } else {
                ss_trigger_page = mono_valloc (NULL, mono_pagesize (), MONO_MMAP_READ|MONO_MMAP_32BIT);
@@ -2002,20 +1999,9 @@ mono_arch_allocate_vars (MonoCompile *cfg)
                offset += size;
        }
 
-       if (cfg->arch.seq_point_read_var) {
+       if (cfg->arch.seq_point_ss_method_var) {
                MonoInst *ins;
 
-               ins = cfg->arch.seq_point_read_var;
-
-               size = 4;
-               align = 4;
-               offset += align - 1;
-               offset &= ~(align - 1);
-               ins->opcode = OP_REGOFFSET;
-               ins->inst_basereg = cfg->frame_reg;
-               ins->inst_offset = offset;
-               offset += size;
-
                ins = cfg->arch.seq_point_ss_method_var;
                size = 4;
                align = 4;
@@ -2206,9 +2192,7 @@ mono_arch_create_vars (MonoCompile *cfg)
 
        if (cfg->gen_sdb_seq_points) {
                if (cfg->soft_breakpoints) {
-                       MonoInst *ins = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_LOCAL);
-                       ins->flags |= MONO_INST_VOLATILE;
-                       cfg->arch.seq_point_read_var = ins;
+                       MonoInst *ins;
 
                        ins = mono_compile_create_var (cfg, &mono_defaults.int_class->byval_arg, OP_LOCAL);
                        ins->flags |= MONO_INST_VOLATILE;
@@ -4617,7 +4601,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        int i;
                        MonoInst *info_var = cfg->arch.seq_point_info_var;
                        MonoInst *ss_trigger_page_var = cfg->arch.ss_trigger_page_var;
-                       MonoInst *ss_read_var = cfg->arch.seq_point_read_var;
                        MonoInst *ss_method_var = cfg->arch.seq_point_ss_method_var;
                        MonoInst *bp_method_var = cfg->arch.seq_point_bp_method_var;
                        MonoInst *var;
@@ -4650,8 +4633,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
 
                        if (ins->flags & MONO_INST_SINGLE_STEP_LOC) {
                                if (cfg->soft_breakpoints) {
-                                       /* Load the address of the sequence point trigger variable. */
-                                       var = ss_read_var;
+                                       /* Load the address of the sequence point method variable. */
+                                       var = ss_method_var;
                                        g_assert (var);
                                        g_assert (var->opcode == OP_REGOFFSET);
                                        g_assert (arm_is_imm12 (var->inst_offset));
@@ -4660,14 +4643,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                                        /* Read the value and check whether it is non-zero. */
                                        ARM_LDR_IMM (code, dreg, dreg, 0);
                                        ARM_CMP_REG_IMM (code, dreg, 0, 0);
-
-                                       /* Load the address of the sequence point method. */
-                                       var = ss_method_var;
-                                       g_assert (var);
-                                       g_assert (var->opcode == OP_REGOFFSET);
-                                       g_assert (arm_is_imm12 (var->inst_offset));
-                                       ARM_LDR_IMM (code, dreg, var->inst_basereg, var->inst_offset);
-
                                        /* Call it conditionally. */
                                        ARM_BLX_REG_COND (code, ARMCOND_NE, dreg);
                                } else {
@@ -6588,15 +6563,12 @@ mono_arch_emit_prolog (MonoCompile *cfg)
                }
        }
 
-       if (cfg->arch.seq_point_read_var) {
-               MonoInst *read_ins = cfg->arch.seq_point_read_var;
+       if (cfg->arch.seq_point_ss_method_var) {
                MonoInst *ss_method_ins = cfg->arch.seq_point_ss_method_var;
                MonoInst *bp_method_ins = cfg->arch.seq_point_bp_method_var;
 #ifdef USE_JUMP_TABLES
                gpointer *jte;
 #endif
-               g_assert (read_ins->opcode == OP_REGOFFSET);
-               g_assert (arm_is_imm12 (read_ins->inst_offset));
                g_assert (ss_method_ins->opcode == OP_REGOFFSET);
                g_assert (arm_is_imm12 (ss_method_ins->inst_offset));
                g_assert (bp_method_ins->opcode == OP_REGOFFSET);
@@ -6604,26 +6576,21 @@ mono_arch_emit_prolog (MonoCompile *cfg)
 
 #ifdef USE_JUMP_TABLES
                jte = mono_jumptable_add_entries (3);
-               jte [0] = (gpointer)&ss_trigger_var;
-               jte [1] = single_step_tramp;
-               jte [2] = breakpoint_tramp;
+               jte [0] = &single_step_tramp;
+               jte [1] = breakpoint_tramp;
                code = mono_arm_load_jumptable_entry_addr (code, jte, ARMREG_LR);
 #else
                ARM_MOV_REG_REG (code, ARMREG_LR, ARMREG_PC);
                ARM_B (code, 2);
-               *(volatile int **)code = &ss_trigger_var;
-               code += 4;
-               *(gpointer*)code = single_step_tramp;
+               *(gpointer*)code = &single_step_tramp;
                code += 4;
                *(gpointer*)code = breakpoint_tramp;
                code += 4;
 #endif
 
                ARM_LDR_IMM (code, ARMREG_IP, ARMREG_LR, 0);
-               ARM_STR_IMM (code, ARMREG_IP, read_ins->inst_basereg, read_ins->inst_offset);
-               ARM_LDR_IMM (code, ARMREG_IP, ARMREG_LR, 4);
                ARM_STR_IMM (code, ARMREG_IP, ss_method_ins->inst_basereg, ss_method_ins->inst_offset);
-               ARM_LDR_IMM (code, ARMREG_IP, ARMREG_LR, 8);
+               ARM_LDR_IMM (code, ARMREG_IP, ARMREG_LR, 4);
                ARM_STR_IMM (code, ARMREG_IP, bp_method_ins->inst_basereg, bp_method_ins->inst_offset);
        }
 
@@ -7494,7 +7461,7 @@ mono_arch_start_single_stepping (void)
        if (ss_trigger_page)
                mono_mprotect (ss_trigger_page, mono_pagesize (), 0);
        else
-               ss_trigger_var = 1;
+               single_step_tramp = mini_get_single_step_trampoline ();
 }
        
 /*
@@ -7508,7 +7475,7 @@ mono_arch_stop_single_stepping (void)
        if (ss_trigger_page)
                mono_mprotect (ss_trigger_page, mono_pagesize (), MONO_MMAP_READ);
        else
-               ss_trigger_var = 0;
+               single_step_tramp = NULL;
 }
 
 #if __APPLE__
index f6b2e2eac93f70e3d6869f061a6630f3db6fe98c..b09db53452a1993fc7f13f51d056a678d1ef3a03 100644 (file)
@@ -233,7 +233,7 @@ struct MonoLMF {
 
 typedef struct MonoCompileArch {
        gpointer seq_point_info_var, ss_trigger_page_var;
-       gpointer seq_point_read_var, seq_point_ss_method_var;
+       gpointer seq_point_ss_method_var;
        gpointer seq_point_bp_method_var;
        gpointer vret_addr_loc;
        gboolean omit_fp, omit_fp_computed;