forked from Imagelibrary/binutils-gdb
Convert the unavailable vector to be bit, not byte, based.
https://sourceware.org/ml/gdb-patches/2013-12/msg00144.html The vector of unavailable parts of a value is currently byte based. Given that we can model a value down to the bit level, we can potentially loose information with the current implementation. After this patch we model the unavailable information in bits. gdb/ChangeLog * dwarf2loc.c (read_pieced_value): Mark bits, not bytes unavailable, use correct bit length. * value.c (struct value): Extend comment on unavailable to indicate that it is bit based. (value_bits_available): New function. (value_bytes_available): Call value_bits_available. (value_entirely_available): Check against the bit length, not byte length. (mark_value_bits_unavailable): New function. (mark_value_bytes_unavailable): Move contents to mark_value_bits_unavailable, call to same. (memcmp_with_bit_offsets): New function. (value_available_contents_bits_eq): New function, takes the functionality from value_available_contents_eq but uses memcmp_with_bit_offsets now, and is bit not byte based. (value_available_contents_eq): Move implementation into value_available_contents_bits_eq, call to same. (value_contents_copy_raw): Work on bits, not bytes. (unpack_value_bits_as_long_1): Check availability in bits, not bytes. * value.h (value_bits_available): Declare new function. (mark_value_bits_unavailable): Declare new function. gdb/testsuite/ChangeLog * gdb.trace/unavailable-dwarf-piece.c: New file. * gdb.trace/unavailable-dwarf-piece.exp: New file.
This commit is contained in:
14
gdb/value.h
14
gdb/value.h
@@ -436,6 +436,14 @@ extern int value_bits_synthetic_pointer (const struct value *value,
|
||||
extern int value_bytes_available (const struct value *value,
|
||||
int offset, int length);
|
||||
|
||||
/* Given a value, determine whether the contents bits starting at
|
||||
OFFSET and extending for LENGTH bits are available. This returns
|
||||
nonzero if all bits in the given range are available, zero if any
|
||||
bit is unavailable. */
|
||||
|
||||
extern int value_bits_available (const struct value *value,
|
||||
int offset, int length);
|
||||
|
||||
/* Like value_bytes_available, but return false if any byte in the
|
||||
whole object is unavailable. */
|
||||
extern int value_entirely_available (struct value *value);
|
||||
@@ -450,6 +458,12 @@ extern int value_entirely_unavailable (struct value *value);
|
||||
extern void mark_value_bytes_unavailable (struct value *value,
|
||||
int offset, int length);
|
||||
|
||||
/* Mark VALUE's content bits starting at OFFSET and extending for
|
||||
LENGTH bits as unavailable. */
|
||||
|
||||
extern void mark_value_bits_unavailable (struct value *value,
|
||||
int offset, int length);
|
||||
|
||||
/* Compare LENGTH bytes of VAL1's contents starting at OFFSET1 with
|
||||
LENGTH bytes of VAL2's contents starting at OFFSET2.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user