Skip to content

Instantly share code, notes, and snippets.

@A2nkF
Created December 25, 2020 19:17
Show Gist options
  • Save A2nkF/ce4b8fa77662593c57a09867b71749dc to your computer and use it in GitHub Desktop.
Save A2nkF/ce4b8fa77662593c57a09867b71749dc to your computer and use it in GitHub Desktop.
This patch gets lldb to save all the FPU registers when creating coredumps.
diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
index 463a2a52f5d..b8e9804b0e0 100644
--- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
+++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp
@@ -224,89 +224,52 @@ public:
PrintRegisterValue(reg_ctx, "fs", nullptr, 8, data);
PrintRegisterValue(reg_ctx, "gs", nullptr, 8, data);
- // // Write out the FPU registers
- // const size_t fpu_byte_size = sizeof(FPU);
- // size_t bytes_written = 0;
- // data.PutHex32 (FPURegSet);
- // data.PutHex32 (fpu_byte_size/sizeof(uint64_t));
- // bytes_written += data.PutHex32(0); // uint32_t pad[0]
- // bytes_written += data.PutHex32(0); // uint32_t pad[1]
- // bytes_written += WriteRegister (reg_ctx, "fcw", "fctrl", 2,
- // data); // uint16_t fcw; // "fctrl"
- // bytes_written += WriteRegister (reg_ctx, "fsw" , "fstat", 2,
- // data); // uint16_t fsw; // "fstat"
- // bytes_written += WriteRegister (reg_ctx, "ftw" , "ftag", 1,
- // data); // uint8_t ftw; // "ftag"
- // bytes_written += data.PutHex8 (0); // uint8_t pad1;
- // bytes_written += WriteRegister (reg_ctx, "fop" , NULL, 2,
- // data); // uint16_t fop; // "fop"
- // bytes_written += WriteRegister (reg_ctx, "fioff", "ip", 4,
- // data); // uint32_t ip; // "fioff"
- // bytes_written += WriteRegister (reg_ctx, "fiseg", NULL, 2,
- // data); // uint16_t cs; // "fiseg"
- // bytes_written += data.PutHex16 (0); // uint16_t pad2;
- // bytes_written += WriteRegister (reg_ctx, "dp", "fooff" , 4,
- // data); // uint32_t dp; // "fooff"
- // bytes_written += WriteRegister (reg_ctx, "foseg", NULL, 2,
- // data); // uint16_t ds; // "foseg"
- // bytes_written += data.PutHex16 (0); // uint16_t pad3;
- // bytes_written += WriteRegister (reg_ctx, "mxcsr", NULL, 4,
- // data); // uint32_t mxcsr;
- // bytes_written += WriteRegister (reg_ctx, "mxcsrmask", NULL,
- // 4, data);// uint32_t mxcsrmask;
- // bytes_written += WriteRegister (reg_ctx, "stmm0", NULL,
- // sizeof(MMSReg), data);
- // bytes_written += WriteRegister (reg_ctx, "stmm1", NULL,
- // sizeof(MMSReg), data);
- // bytes_written += WriteRegister (reg_ctx, "stmm2", NULL,
- // sizeof(MMSReg), data);
- // bytes_written += WriteRegister (reg_ctx, "stmm3", NULL,
- // sizeof(MMSReg), data);
- // bytes_written += WriteRegister (reg_ctx, "stmm4", NULL,
- // sizeof(MMSReg), data);
- // bytes_written += WriteRegister (reg_ctx, "stmm5", NULL,
- // sizeof(MMSReg), data);
- // bytes_written += WriteRegister (reg_ctx, "stmm6", NULL,
- // sizeof(MMSReg), data);
- // bytes_written += WriteRegister (reg_ctx, "stmm7", NULL,
- // sizeof(MMSReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm0" , NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm1" , NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm2" , NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm3" , NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm4" , NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm5" , NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm6" , NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm7" , NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm8" , NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm9" , NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm10", NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm11", NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm12", NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm13", NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm14", NULL,
- // sizeof(XMMReg), data);
- // bytes_written += WriteRegister (reg_ctx, "xmm15", NULL,
- // sizeof(XMMReg), data);
- //
- // // Fill rest with zeros
- // for (size_t i=0, n = fpu_byte_size - bytes_written; i<n; ++
- // i)
- // data.PutChar(0);
+ // Write out the FPU registers
+ const size_t fpu_byte_size = sizeof(FPU);
+ size_t bytes_written = 0;
+ data.PutHex32 (FPURegSet);
+ data.PutHex32 (fpu_byte_size/sizeof(uint64_t));
+ data.PutHex32(0); // uint32_t pad[0]
+ data.PutHex32(0); // uint32_t pad[1]
+ PrintRegisterValue(reg_ctx, "fcw", "fctrl", 2, data); // uint16_t fcw; // "fctrl"
+ PrintRegisterValue(reg_ctx, "fsw" , "fstat", 2, data); // uint16_t fsw; // "fstat"
+ PrintRegisterValue(reg_ctx, "ftw" , "ftag", 1, data); // uint8_t ftw; // "ftag"
+ data.PutHex8 (0); // uint8_t pad1;
+ PrintRegisterValue(reg_ctx, "fop" , NULL, 2, data); // uint16_t fop; // "fop"
+ PrintRegisterValue(reg_ctx, "fioff", "ip", 4, data); // uint32_t ip; // "fioff"
+ PrintRegisterValue(reg_ctx, "fiseg", NULL, 2, data); // uint16_t cs; // "fiseg"
+ data.PutHex16 (0); // uint16_t pad2;
+ PrintRegisterValue(reg_ctx, "dp", "fooff" , 4, data); // uint32_t dp; // "fooff"
+ PrintRegisterValue(reg_ctx, "foseg", NULL, 2, data); // uint16_t ds; // "foseg"
+ data.PutHex16 (0); // uint16_t pad3;
+ PrintRegisterValue(reg_ctx, "mxcsr", NULL, 4, data); // uint32_t mxcsr;
+ PrintRegisterValue(reg_ctx, "mxcsrmask", NULL, 4, data); // uint32_t mxcsrmask;
+ PrintRegisterValue(reg_ctx, "stmm0", NULL, sizeof(MMSReg), data);
+ PrintRegisterValue(reg_ctx, "stmm1", NULL, sizeof(MMSReg), data);
+ PrintRegisterValue(reg_ctx, "stmm2", NULL, sizeof(MMSReg), data);
+ PrintRegisterValue(reg_ctx, "stmm3", NULL, sizeof(MMSReg), data);
+ PrintRegisterValue(reg_ctx, "stmm4", NULL, sizeof(MMSReg), data);
+ PrintRegisterValue(reg_ctx, "stmm5", NULL, sizeof(MMSReg), data);
+ PrintRegisterValue(reg_ctx, "stmm6", NULL, sizeof(MMSReg), data);
+ PrintRegisterValue(reg_ctx, "stmm7", NULL, sizeof(MMSReg), data);
+ PrintRegisterValue(reg_ctx, "xmm0" , NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm1" , NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm2" , NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm3" , NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm4" , NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm5" , NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm6" , NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm7" , NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm8" , NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm9" , NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm10", NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm11", NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm12", NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm13", NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm14", NULL, sizeof(XMMReg), data);
+ PrintRegisterValue(reg_ctx, "xmm15", NULL, sizeof(XMMReg), data);
+ // Fill rest with zeros
+ for (size_t i=0, n=92; i<n; ++i) data.PutChar(0);
// Write out the EXC registers
data.PutHex32(EXCRegSet);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment