[arm] Fix another bunch of frame alignment problems.
authorZoltan Varga <vargaz@gmail.com>
Mon, 28 Sep 2015 17:36:43 +0000 (13:36 -0400)
committerZoltan Varga <vargaz@gmail.com>
Mon, 28 Sep 2015 17:36:47 +0000 (13:36 -0400)
mono/mini/mini-arm.c

index 9f3f307e5a3aec7d666af717708018c0c30232fd..ff1eb77e49e693c39fb2986193f4e4b951b07402 100644 (file)
@@ -5214,8 +5214,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                }
                case OP_LOCALLOC: {
                        /* round the size to 8 bytes */
-                       ARM_ADD_REG_IMM8 (code, ins->dreg, ins->sreg1, 7);
-                       ARM_BIC_REG_IMM8 (code, ins->dreg, ins->dreg, 7);
+                       ARM_ADD_REG_IMM8 (code, ins->dreg, ins->sreg1, (MONO_ARCH_FRAME_ALIGNMENT - 1));
+                       ARM_BIC_REG_IMM8 (code, ins->dreg, ins->dreg, (MONO_ARCH_FRAME_ALIGNMENT - 1));
                        ARM_SUB_REG_REG (code, ARMREG_SP, ARMREG_SP, ins->dreg);
                        /* memzero the area: dreg holds the size, sp is the pointer */
                        if (ins->flags & MONO_INST_INIT) {
@@ -5290,14 +5290,15 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                }
                case OP_START_HANDLER: {
                        MonoInst *spvar = mono_find_spvar_for_region (cfg, bb->region);
+                       int param_area = ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT);
                        int i, rot_amount;
 
                        /* Reserve a param area, see filter-stack.exe */
-                       if (cfg->param_area) {
-                               if ((i = mono_arm_is_rotated_imm8 (cfg->param_area, &rot_amount)) >= 0) {
+                       if (param_area) {
+                               if ((i = mono_arm_is_rotated_imm8 (param_area, &rot_amount)) >= 0) {
                                        ARM_SUB_REG_IMM (code, ARMREG_SP, ARMREG_SP, i, rot_amount);
                                } else {
-                                       code = mono_arm_emit_load_imm (code, ARMREG_IP, cfg->param_area);
+                                       code = mono_arm_emit_load_imm (code, ARMREG_IP, param_area);
                                        ARM_SUB_REG_REG (code, ARMREG_SP, ARMREG_SP, ARMREG_IP);
                                }
                        }
@@ -5312,14 +5313,15 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                }
                case OP_ENDFILTER: {
                        MonoInst *spvar = mono_find_spvar_for_region (cfg, bb->region);
+                       int param_area = ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT);
                        int i, rot_amount;
 
                        /* Free the param area */
-                       if (cfg->param_area) {
-                               if ((i = mono_arm_is_rotated_imm8 (cfg->param_area, &rot_amount)) >= 0) {
+                       if (param_area) {
+                               if ((i = mono_arm_is_rotated_imm8 (param_area, &rot_amount)) >= 0) {
                                        ARM_ADD_REG_IMM (code, ARMREG_SP, ARMREG_SP, i, rot_amount);
                                } else {
-                                       code = mono_arm_emit_load_imm (code, ARMREG_IP, cfg->param_area);
+                                       code = mono_arm_emit_load_imm (code, ARMREG_IP, param_area);
                                        ARM_ADD_REG_REG (code, ARMREG_SP, ARMREG_SP, ARMREG_IP);
                                }
                        }
@@ -5338,14 +5340,15 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                }
                case OP_ENDFINALLY: {
                        MonoInst *spvar = mono_find_spvar_for_region (cfg, bb->region);
+                       int param_area = ALIGN_TO (cfg->param_area, MONO_ARCH_FRAME_ALIGNMENT);
                        int i, rot_amount;
 
                        /* Free the param area */
-                       if (cfg->param_area) {
-                               if ((i = mono_arm_is_rotated_imm8 (cfg->param_area, &rot_amount)) >= 0) {
+                       if (param_area) {
+                               if ((i = mono_arm_is_rotated_imm8 (param_area, &rot_amount)) >= 0) {
                                        ARM_ADD_REG_IMM (code, ARMREG_SP, ARMREG_SP, i, rot_amount);
                                } else {
-                                       code = mono_arm_emit_load_imm (code, ARMREG_IP, cfg->param_area);
+                                       code = mono_arm_emit_load_imm (code, ARMREG_IP, param_area);
                                        ARM_ADD_REG_REG (code, ARMREG_SP, ARMREG_SP, ARMREG_IP);
                                }
                        }