Jelajahi Sumber

* fixed CFI registers for leave on x86-64, and place CFI directives closer to
the instructions they apply to

git-svn-id: branches/debug_eh@41576 -

Jonas Maebe 6 tahun lalu
induk
melakukan
866331de34
1 mengubah file dengan 6 tambahan dan 3 penghapusan
  1. 6 3
      compiler/x86/cgx86.pas

+ 6 - 3
compiler/x86/cgx86.pas

@@ -3710,19 +3710,22 @@ unit cgx86;
         else
           begin
 {$if defined(x86_64)}
+            current_asmdata.asmcfi.cfa_def_cfa_register(list,NR_RSP);
             list.Concat(taicpu.op_reg_reg(A_MOV,S_Q,NR_RBP,NR_RSP));
+            current_asmdata.asmcfi.cfa_restore(list,NR_RBP);
+            current_asmdata.asmcfi.cfa_def_cfa_offset(list,8);
             list.Concat(taicpu.op_reg(A_POP,S_Q,NR_RBP));
 {$elseif defined(i386)}
+            current_asmdata.asmcfi.cfa_def_cfa_register(list,NR_ESP);
             list.Concat(taicpu.op_reg_reg(A_MOV,S_L,NR_EBP,NR_ESP));
+            current_asmdata.asmcfi.cfa_restore(list,NR_EBP);
+            current_asmdata.asmcfi.cfa_def_cfa_offset(list,4);
             list.Concat(taicpu.op_reg(A_POP,S_L,NR_EBP));
 {$elseif defined(i8086)}
             list.Concat(taicpu.op_reg_reg(A_MOV,S_W,NR_BP,NR_SP));
             list.Concat(taicpu.op_reg(A_POP,S_W,NR_BP));
 {$endif}
           end;
-        current_asmdata.asmcfi.cfa_restore(list,NR_EBP);
-        current_asmdata.asmcfi.cfa_def_cfa_register(list,NR_ESP);
-        current_asmdata.asmcfi.cfa_def_cfa_offset(list,sizeof(pint));
       end;