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: