Fixes to read the floating point and exception registers sets out
of arm Mach-O core files.
<rdar://problem/13665075>
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@181755 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index 7047395..da32acd 100644
--- a/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -289,25 +289,43 @@
SetError (GPRRegSet, Read, -1);
SetError (FPURegSet, Read, -1);
SetError (EXCRegSet, Read, -1);
- int flavor = data.GetU32 (&offset);
- uint32_t count = data.GetU32 (&offset);
- switch (flavor)
+ bool done = false;
+
+ while (!done)
{
- case GPRRegSet:
- for (uint32_t i=0; i<count; ++i)
- gpr.r[i] = data.GetU32(&offset);
- SetError (GPRRegSet, Read, 0);
- break;
- case FPURegSet:
- // TODO: fill in FPU regs....
- //SetError (FPURegSet, Read, -1);
- break;
- case EXCRegSet:
- exc.exception = data.GetU32(&offset);
- exc.fsr = data.GetU32(&offset);
- exc.far = data.GetU32(&offset);
- SetError (EXCRegSet, Read, 0);
- break;
+ int flavor = data.GetU32 (&offset);
+ uint32_t count = data.GetU32 (&offset);
+ switch (flavor)
+ {
+ case GPRRegSet:
+ for (uint32_t i=0; i<count; ++i)
+ gpr.r[i] = data.GetU32(&offset);
+ SetError (GPRRegSet, Read, 0);
+ break;
+
+ case FPURegSet:
+ {
+ uint32_t *d = &fpu.floats.s[0];
+ for (uint32_t i = 0; i < count && d < d + (sizeof (fpu.floats) / sizeof (uint32_t)); i++)
+ {
+ *d++ = data.GetU32(&offset);
+ }
+ SetError (FPURegSet, Read, 0);
+ }
+ break;
+
+ case EXCRegSet:
+ exc.exception = data.GetU32(&offset);
+ exc.fsr = data.GetU32(&offset);
+ exc.far = data.GetU32(&offset);
+ SetError (EXCRegSet, Read, 0);
+ done = true;
+ break;
+
+ // Unknown register set flavor, stop trying to parse.
+ default:
+ done = true;
+ }
}
}
protected: