forked from OSchip/llvm-project
[lldb] Encode `bool` as unsigned int
`bool` is considered to be unsigned according to `std::is_unsigned<bool>::value` (and `Type::GetTypeInfo`). Encoding it as signed int works fine for normal variables and fields, but breaks when reading the values of boolean bitfields. If the field is declared as `bool b : 1` and has a value of `0b1`, the call to `SBValue::GetValueAsSigned()` will return `-1`. Reviewed By: teemperor Differential Revision: https://reviews.llvm.org/D102685
This commit is contained in:
parent
ff95486513
commit
0bab7b26f4
|
@ -4698,7 +4698,6 @@ lldb::Encoding TypeSystemClang::GetEncoding(lldb::opaque_compiler_type_t type,
|
|||
case clang::BuiltinType::Void:
|
||||
break;
|
||||
|
||||
case clang::BuiltinType::Bool:
|
||||
case clang::BuiltinType::Char_S:
|
||||
case clang::BuiltinType::SChar:
|
||||
case clang::BuiltinType::WChar_S:
|
||||
|
@ -4709,6 +4708,7 @@ lldb::Encoding TypeSystemClang::GetEncoding(lldb::opaque_compiler_type_t type,
|
|||
case clang::BuiltinType::Int128:
|
||||
return lldb::eEncodingSint;
|
||||
|
||||
case clang::BuiltinType::Bool:
|
||||
case clang::BuiltinType::Char_U:
|
||||
case clang::BuiltinType::UChar:
|
||||
case clang::BuiltinType::WChar_U:
|
||||
|
|
|
@ -120,3 +120,36 @@ class CppBitfieldsTestCase(TestBase):
|
|||
'(uint32_t) b_a = 2',
|
||||
'(uint32_t:1) d_a = 1',
|
||||
])
|
||||
|
||||
self.expect(
|
||||
"frame variable --show-types bb",
|
||||
VARIABLES_DISPLAYED_CORRECTLY,
|
||||
substrs=[
|
||||
'(bool:1) a = true',
|
||||
'(bool:1) b = false',
|
||||
'(bool:2) c = true',
|
||||
'(bool:2) d = true',
|
||||
])
|
||||
|
||||
bb = self.frame().FindVariable('bb')
|
||||
self.assertTrue(bb.IsValid())
|
||||
|
||||
bb_a = bb.GetChildAtIndex(0)
|
||||
self.assertTrue(bb_a.IsValid())
|
||||
self.assertEqual(bb_a.GetValueAsUnsigned(), 1)
|
||||
self.assertEqual(bb_a.GetValueAsSigned(), 1)
|
||||
|
||||
bb_b = bb.GetChildAtIndex(1)
|
||||
self.assertTrue(bb_b.IsValid())
|
||||
self.assertEqual(bb_b.GetValueAsUnsigned(), 0)
|
||||
self.assertEqual(bb_b.GetValueAsSigned(), 0)
|
||||
|
||||
bb_c = bb.GetChildAtIndex(2)
|
||||
self.assertTrue(bb_c.IsValid())
|
||||
self.assertEqual(bb_c.GetValueAsUnsigned(), 1)
|
||||
self.assertEqual(bb_c.GetValueAsSigned(), 1)
|
||||
|
||||
bb_d = bb.GetChildAtIndex(3)
|
||||
self.assertTrue(bb_d.IsValid())
|
||||
self.assertEqual(bb_d.GetValueAsUnsigned(), 1)
|
||||
self.assertEqual(bb_d.GetValueAsSigned(), 1)
|
||||
|
|
|
@ -104,5 +104,17 @@ int main(int argc, char const *argv[]) {
|
|||
uwbf.x = 0xFFFFFFFF;
|
||||
uwubf.x = 0xFFFFFFFF;
|
||||
|
||||
struct BoolBits {
|
||||
bool a : 1;
|
||||
bool b : 1;
|
||||
bool c : 2;
|
||||
bool d : 2;
|
||||
} bb;
|
||||
|
||||
bb.a = 0b1;
|
||||
bb.b = 0b0;
|
||||
bb.c = 0b11;
|
||||
bb.d = 0b01;
|
||||
|
||||
return 0; // Set break point at this line.
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue