Index: gdb/i387-tdep.c |
diff --git a/gdb/i387-tdep.c b/gdb/i387-tdep.c |
index d2ff9e54ad5b838ec0ed12ad80340bfe80dffbb4..97bd5f65540b894086ff8a4038ded200381810c2 100644 |
--- a/gdb/i387-tdep.c |
+++ b/gdb/i387-tdep.c |
@@ -113,13 +113,21 @@ print_i387_ext (struct gdbarch *gdbarch, |
fputs_filtered (" Unsupported", file); |
} |
-/* Print the status word STATUS. */ |
+/* Print the status word STATUS. If STATUS_P is false, then STATUS |
+ was unavailable. */ |
static void |
-print_i387_status_word (unsigned int status, struct ui_file *file) |
+print_i387_status_word (int status_p, |
+ unsigned int status, struct ui_file *file) |
{ |
- fprintf_filtered (file, "Status Word: %s", |
- hex_string_custom (status, 4)); |
+ fprintf_filtered (file, "Status Word: "); |
+ if (!status_p) |
+ { |
+ fprintf_filtered (file, "%s\n", _("<unavailable>")); |
+ return; |
+ } |
+ |
+ fprintf_filtered (file, "%s", hex_string_custom (status, 4)); |
fputs_filtered (" ", file); |
fprintf_filtered (file, " %s", (status & 0x0001) ? "IE" : " "); |
fprintf_filtered (file, " %s", (status & 0x0002) ? "DE" : " "); |
@@ -143,13 +151,21 @@ print_i387_status_word (unsigned int status, struct ui_file *file) |
" TOP: %d\n", ((status >> 11) & 7)); |
} |
-/* Print the control word CONTROL. */ |
+/* Print the control word CONTROL. If CONTROL_P is false, then |
+ CONTROL was unavailable. */ |
static void |
-print_i387_control_word (unsigned int control, struct ui_file *file) |
+print_i387_control_word (int control_p, |
+ unsigned int control, struct ui_file *file) |
{ |
- fprintf_filtered (file, "Control Word: %s", |
- hex_string_custom (control, 4)); |
+ fprintf_filtered (file, "Control Word: "); |
+ if (!control_p) |
+ { |
+ fprintf_filtered (file, "%s\n", _("<unavailable>")); |
+ return; |
+ } |
+ |
+ fprintf_filtered (file, "%s", hex_string_custom (control, 4)); |
fputs_filtered (" ", file); |
fprintf_filtered (file, " %s", (control & 0x0001) ? "IM" : " "); |
fprintf_filtered (file, " %s", (control & 0x0002) ? "DM" : " "); |
@@ -205,81 +221,117 @@ i387_print_float_info (struct gdbarch *gdbarch, struct ui_file *file, |
{ |
struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (frame)); |
ULONGEST fctrl; |
+ int fctrl_p; |
ULONGEST fstat; |
+ int fstat_p; |
ULONGEST ftag; |
+ int ftag_p; |
ULONGEST fiseg; |
+ int fiseg_p; |
ULONGEST fioff; |
+ int fioff_p; |
ULONGEST foseg; |
+ int foseg_p; |
ULONGEST fooff; |
+ int fooff_p; |
ULONGEST fop; |
+ int fop_p; |
int fpreg; |
int top; |
gdb_assert (gdbarch == get_frame_arch (frame)); |
- fctrl = get_frame_register_unsigned (frame, I387_FCTRL_REGNUM (tdep)); |
- fstat = get_frame_register_unsigned (frame, I387_FSTAT_REGNUM (tdep)); |
- ftag = get_frame_register_unsigned (frame, I387_FTAG_REGNUM (tdep)); |
- fiseg = get_frame_register_unsigned (frame, I387_FISEG_REGNUM (tdep)); |
- fioff = get_frame_register_unsigned (frame, I387_FIOFF_REGNUM (tdep)); |
- foseg = get_frame_register_unsigned (frame, I387_FOSEG_REGNUM (tdep)); |
- fooff = get_frame_register_unsigned (frame, I387_FOOFF_REGNUM (tdep)); |
- fop = get_frame_register_unsigned (frame, I387_FOP_REGNUM (tdep)); |
+ fctrl_p = read_frame_register_unsigned (frame, |
+ I387_FCTRL_REGNUM (tdep), &fctrl); |
+ fstat_p = read_frame_register_unsigned (frame, |
+ I387_FSTAT_REGNUM (tdep), &fstat); |
+ ftag_p = read_frame_register_unsigned (frame, |
+ I387_FTAG_REGNUM (tdep), &ftag); |
+ fiseg_p = read_frame_register_unsigned (frame, |
+ I387_FISEG_REGNUM (tdep), &fiseg); |
+ fioff_p = read_frame_register_unsigned (frame, |
+ I387_FIOFF_REGNUM (tdep), &fioff); |
+ foseg_p = read_frame_register_unsigned (frame, |
+ I387_FOSEG_REGNUM (tdep), &foseg); |
+ fooff_p = read_frame_register_unsigned (frame, |
+ I387_FOOFF_REGNUM (tdep), &fooff); |
+ fop_p = read_frame_register_unsigned (frame, |
+ I387_FOP_REGNUM (tdep), &fop); |
+ |
+ if (fstat_p) |
+ { |
+ top = ((fstat >> 11) & 7); |
- top = ((fstat >> 11) & 7); |
+ for (fpreg = 7; fpreg >= 0; fpreg--) |
+ { |
+ struct value *regval; |
+ int regnum; |
+ int i; |
+ int tag = -1; |
- for (fpreg = 7; fpreg >= 0; fpreg--) |
- { |
- gdb_byte raw[I386_MAX_REGISTER_SIZE]; |
- int tag = (ftag >> (fpreg * 2)) & 3; |
- int i; |
+ fprintf_filtered (file, "%sR%d: ", fpreg == top ? "=>" : " ", fpreg); |
- fprintf_filtered (file, "%sR%d: ", fpreg == top ? "=>" : " ", fpreg); |
+ if (ftag_p) |
+ { |
+ tag = (ftag >> (fpreg * 2)) & 3; |
- switch (tag) |
- { |
- case 0: |
- fputs_filtered ("Valid ", file); |
- break; |
- case 1: |
- fputs_filtered ("Zero ", file); |
- break; |
- case 2: |
- fputs_filtered ("Special ", file); |
- break; |
- case 3: |
- fputs_filtered ("Empty ", file); |
- break; |
- } |
+ switch (tag) |
+ { |
+ case 0: |
+ fputs_filtered ("Valid ", file); |
+ break; |
+ case 1: |
+ fputs_filtered ("Zero ", file); |
+ break; |
+ case 2: |
+ fputs_filtered ("Special ", file); |
+ break; |
+ case 3: |
+ fputs_filtered ("Empty ", file); |
+ break; |
+ } |
+ } |
+ else |
+ fputs_filtered ("Unknown ", file); |
- get_frame_register (frame, |
- (fpreg + 8 - top) % 8 + I387_ST0_REGNUM (tdep), |
- raw); |
+ regnum = (fpreg + 8 - top) % 8 + I387_ST0_REGNUM (tdep); |
+ regval = get_frame_register_value (frame, regnum); |
- fputs_filtered ("0x", file); |
- for (i = 9; i >= 0; i--) |
- fprintf_filtered (file, "%02x", raw[i]); |
+ if (value_entirely_available (regval)) |
+ { |
+ const char *raw = value_contents (regval); |
- if (tag != 3) |
- print_i387_ext (gdbarch, raw, file); |
+ fputs_filtered ("0x", file); |
+ for (i = 9; i >= 0; i--) |
+ fprintf_filtered (file, "%02x", raw[i]); |
- fputs_filtered ("\n", file); |
+ if (tag != -1 && tag != 3) |
+ print_i387_ext (gdbarch, raw, file); |
+ } |
+ else |
+ fprintf_filtered (file, "%s", _("<unavailable>")); |
+ |
+ fputs_filtered ("\n", file); |
+ } |
} |
fputs_filtered ("\n", file); |
- |
- print_i387_status_word (fstat, file); |
- print_i387_control_word (fctrl, file); |
+ print_i387_status_word (fstat_p, fstat, file); |
+ print_i387_control_word (fctrl_p, fctrl, file); |
fprintf_filtered (file, "Tag Word: %s\n", |
- hex_string_custom (ftag, 4)); |
+ ftag_p ? hex_string_custom (ftag, 4) : _("<unavailable>")); |
fprintf_filtered (file, "Instruction Pointer: %s:", |
- hex_string_custom (fiseg, 2)); |
- fprintf_filtered (file, "%s\n", hex_string_custom (fioff, 8)); |
+ fiseg_p ? hex_string_custom (fiseg, 2) : _("<unavailable>")); |
+ fprintf_filtered (file, "%s\n", |
+ fioff_p ? hex_string_custom (fioff, 8) : _("<unavailable>")); |
fprintf_filtered (file, "Operand Pointer: %s:", |
- hex_string_custom (foseg, 2)); |
- fprintf_filtered (file, "%s\n", hex_string_custom (fooff, 8)); |
+ foseg_p ? hex_string_custom (foseg, 2) : _("<unavailable>")); |
+ fprintf_filtered (file, "%s\n", |
+ fooff_p ? hex_string_custom (fooff, 8) : _("<unavailable>")); |
fprintf_filtered (file, "Opcode: %s\n", |
- hex_string_custom (fop ? (fop | 0xd800) : 0, 4)); |
+ fop_p |
+ ? (hex_string_custom (fop ? (fop | 0xd800) : 0, 4)) |
+ : _("<unavailable>")); |
} |
@@ -726,7 +778,6 @@ i387_supply_xsave (struct regcache *regcache, int regnum, |
int i; |
unsigned int clear_bv; |
static const gdb_byte zero[MAX_REGISTER_SIZE] = { 0 }; |
- const gdb_byte *p; |
enum |
{ |
none = 0x0, |
@@ -736,6 +787,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, |
all = x87 | sse | avxh |
} regclass; |
+ gdb_assert (regs != NULL); |
gdb_assert (tdep->st0_regnum >= I386_ST0_REGNUM); |
gdb_assert (tdep->num_xmm_regs > 0); |
@@ -753,7 +805,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, |
else |
regclass = none; |
- if (regs != NULL && regclass != none) |
+ if (regclass != none) |
{ |
/* Get `xstat_bv'. */ |
const gdb_byte *xstate_bv_p = XSAVE_XSTATE_BV_ADDR (regs); |
@@ -772,11 +824,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, |
time in a program. This means that from the user-space programs' |
perspective, it's the same as if the registers have always been |
zero from the start of the program. Therefore, the debugger |
- should provide the same illusion to the user. |
- |
- Note however, the case when REGS is NULL is a different case. |
- That case means we do not have access to the x87 states, so we |
- should mark the registers as unavailable (by supplying NULL). */ |
+ should provide the same illusion to the user. */ |
switch (regclass) |
{ |
@@ -785,7 +833,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, |
case avxh: |
if ((clear_bv & I386_XSTATE_AVX)) |
- regcache_raw_supply (regcache, regnum, regs == NULL ? NULL : zero); |
+ regcache_raw_supply (regcache, regnum, zero); |
else |
regcache_raw_supply (regcache, regnum, |
XSAVE_AVXH_ADDR (tdep, regs, regnum)); |
@@ -793,7 +841,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, |
case sse: |
if ((clear_bv & I386_XSTATE_SSE)) |
- regcache_raw_supply (regcache, regnum, regs == NULL ? NULL : zero); |
+ regcache_raw_supply (regcache, regnum, zero); |
else |
regcache_raw_supply (regcache, regnum, |
FXSAVE_ADDR (tdep, regs, regnum)); |
@@ -801,7 +849,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, |
case x87: |
if ((clear_bv & I386_XSTATE_X87)) |
- regcache_raw_supply (regcache, regnum, regs == NULL ? NULL : zero); |
+ regcache_raw_supply (regcache, regnum, zero); |
else |
regcache_raw_supply (regcache, regnum, |
FXSAVE_ADDR (tdep, regs, regnum)); |
@@ -816,7 +864,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, |
for (i = I387_YMM0H_REGNUM (tdep); |
i < I387_YMMENDH_REGNUM (tdep); |
i++) |
- regcache_raw_supply (regcache, i, regs == NULL ? NULL : zero); |
+ regcache_raw_supply (regcache, i, zero); |
} |
else |
{ |
@@ -836,7 +884,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, |
for (i = I387_XMM0_REGNUM (tdep); |
i < I387_MXCSR_REGNUM (tdep); |
i++) |
- regcache_raw_supply (regcache, i, regs == NULL ? NULL : zero); |
+ regcache_raw_supply (regcache, i, zero); |
} |
else |
{ |
@@ -855,7 +903,7 @@ i387_supply_xsave (struct regcache *regcache, int regnum, |
for (i = I387_ST0_REGNUM (tdep); |
i < I387_FCTRL_REGNUM (tdep); |
i++) |
- regcache_raw_supply (regcache, i, regs == NULL ? NULL : zero); |
+ regcache_raw_supply (regcache, i, zero); |
} |
else |
{ |
@@ -872,12 +920,6 @@ i387_supply_xsave (struct regcache *regcache, int regnum, |
for (i = I387_FCTRL_REGNUM (tdep); i < I387_XMM0_REGNUM (tdep); i++) |
if (regnum == -1 || regnum == i) |
{ |
- if (regs == NULL) |
- { |
- regcache_raw_supply (regcache, i, NULL); |
- continue; |
- } |
- |
/* Most of the FPU control registers occupy only 16 bits in |
the xsave extended state. Give those a special treatment. */ |
if (i != I387_FIOFF_REGNUM (tdep) |
@@ -928,10 +970,8 @@ i387_supply_xsave (struct regcache *regcache, int regnum, |
} |
if (regnum == I387_MXCSR_REGNUM (tdep) || regnum == -1) |
- { |
- p = regs == NULL ? NULL : FXSAVE_MXCSR_ADDR (regs); |
- regcache_raw_supply (regcache, I387_MXCSR_REGNUM (tdep), p); |
- } |
+ regcache_raw_supply (regcache, I387_MXCSR_REGNUM (tdep), |
+ FXSAVE_MXCSR_ADDR (regs)); |
} |
/* Similar to i387_collect_fxsave, but use XSAVE extended state. */ |