summaryrefslogtreecommitdiff
path: root/source/Symbol/CompactUnwindInfo.cpp
diff options
context:
space:
mode:
authorEd Maste <emaste@FreeBSD.org>2015-02-09 01:44:09 +0000
committerEd Maste <emaste@FreeBSD.org>2015-02-09 01:44:09 +0000
commit12bd4897ff0678fa663e09d78ebc22dd255ceb86 (patch)
treea8f4b3abea3e6937e60728991c736e6e3d322fc1 /source/Symbol/CompactUnwindInfo.cpp
parent205afe679855a4ce8149cdaa94d3f0868ce796dc (diff)
Notes
Diffstat (limited to 'source/Symbol/CompactUnwindInfo.cpp')
-rw-r--r--source/Symbol/CompactUnwindInfo.cpp29
1 files changed, 23 insertions, 6 deletions
diff --git a/source/Symbol/CompactUnwindInfo.cpp b/source/Symbol/CompactUnwindInfo.cpp
index 8c6a2e7214c3d..e7153446cd164 100644
--- a/source/Symbol/CompactUnwindInfo.cpp
+++ b/source/Symbol/CompactUnwindInfo.cpp
@@ -809,8 +809,16 @@ CompactUnwindInfo::CreateUnwindPlan_x86_64 (Target &target, FunctionInfo &functi
}
}
+ if (mode == UNWIND_X86_64_MODE_STACK_IND)
+ {
+ row->SetCFAOffset (stack_size);
+ }
+ else
+ {
+ row->SetCFAOffset (stack_size * wordsize);
+ }
+
row->SetCFARegister (x86_64_eh_regnum::rsp);
- row->SetCFAOffset (stack_size * wordsize);
row->SetOffset (0);
row->SetRegisterLocationToAtCFAPlusOffset (x86_64_eh_regnum::rip, wordsize * -1, true);
row->SetRegisterLocationToIsCFAPlusOffset (x86_64_eh_regnum::rsp, 0, true);
@@ -919,10 +927,10 @@ CompactUnwindInfo::CreateUnwindPlan_x86_64 (Target &target, FunctionInfo &functi
case UNWIND_X86_64_REG_R14:
case UNWIND_X86_64_REG_R15:
case UNWIND_X86_64_REG_RBP:
- row->SetRegisterLocationToAtCFAPlusOffset (translate_to_eh_frame_regnum_x86_64 (registers[i]), wordsize * -saved_registers_offset, true);
+ row->SetRegisterLocationToAtCFAPlusOffset (translate_to_eh_frame_regnum_x86_64 (registers[i]), wordsize * -saved_registers_offset, true);
+ saved_registers_offset++;
break;
}
- saved_registers_offset++;
}
}
unwind_plan.AppendRow (row);
@@ -1084,7 +1092,16 @@ CompactUnwindInfo::CreateUnwindPlan_i386 (Target &target, FunctionInfo &function
}
row->SetCFARegister (i386_eh_regnum::esp);
- row->SetCFAOffset (stack_size * wordsize);
+
+ if (mode == UNWIND_X86_MODE_STACK_IND)
+ {
+ row->SetCFAOffset (stack_size);
+ }
+ else
+ {
+ row->SetCFAOffset (stack_size * wordsize);
+ }
+
row->SetOffset (0);
row->SetRegisterLocationToAtCFAPlusOffset (i386_eh_regnum::eip, wordsize * -1, true);
row->SetRegisterLocationToIsCFAPlusOffset (i386_eh_regnum::esp, 0, true);
@@ -1193,10 +1210,10 @@ CompactUnwindInfo::CreateUnwindPlan_i386 (Target &target, FunctionInfo &function
case UNWIND_X86_REG_EDI:
case UNWIND_X86_REG_ESI:
case UNWIND_X86_REG_EBP:
- row->SetRegisterLocationToAtCFAPlusOffset (translate_to_eh_frame_regnum_i386 (registers[i]), wordsize * -saved_registers_offset, true);
+ row->SetRegisterLocationToAtCFAPlusOffset (translate_to_eh_frame_regnum_i386 (registers[i]), wordsize * -saved_registers_offset, true);
+ saved_registers_offset++;
break;
}
- saved_registers_offset++;
}
}