Skip to content

Commit fe92977

Browse files
[lldb] Add a single bit constructor for RegisterFlags::Field (#69315)
This means you don't have to do RegisterField("", 0, 0), you can do RegisterField("", 0). Which is useful for testing and even more useful when we are writing definitions of real registers which have 10s of single bit fields.
1 parent 2e69407 commit fe92977

File tree

2 files changed

+25
-16
lines changed

2 files changed

+25
-16
lines changed

lldb/include/lldb/Target/RegisterFlags.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,17 @@ class RegisterFlags {
1717
public:
1818
class Field {
1919
public:
20+
/// Where start is the least significant bit and end is the most
21+
/// significant bit. The start bit must be <= the end bit.
2022
Field(std::string name, unsigned start, unsigned end)
2123
: m_name(std::move(name)), m_start(start), m_end(end) {
2224
assert(m_start <= m_end && "Start bit must be <= end bit.");
2325
}
2426

27+
/// Construct a field that occupies a single bit.
28+
Field(std::string name, unsigned bit_position)
29+
: m_name(std::move(name)), m_start(bit_position), m_end(bit_position) {}
30+
2531
/// Get size of the field in bits. Will always be at least 1.
2632
unsigned GetSizeInBits() const { return m_end - m_start + 1; }
2733

lldb/unittests/Target/RegisterFlagsTest.cpp

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ using namespace lldb;
1616
TEST(RegisterFlagsTest, Field) {
1717
// We assume that start <= end is always true, so that is not tested here.
1818

19-
RegisterFlags::Field f1("abc", 0, 0);
19+
RegisterFlags::Field f1("abc", 0);
2020
ASSERT_EQ(f1.GetName(), "abc");
2121
// start == end means a 1 bit field.
2222
ASSERT_EQ(f1.GetSizeInBits(), (unsigned)1);
@@ -51,11 +51,15 @@ static RegisterFlags::Field make_field(unsigned start, unsigned end) {
5151
return RegisterFlags::Field("", start, end);
5252
}
5353

54+
static RegisterFlags::Field make_field(unsigned bit) {
55+
return RegisterFlags::Field("", bit);
56+
}
57+
5458
TEST(RegisterFlagsTest, FieldOverlaps) {
5559
// Single bit fields
56-
ASSERT_FALSE(make_field(0, 0).Overlaps(make_field(1, 1)));
57-
ASSERT_TRUE(make_field(1, 1).Overlaps(make_field(1, 1)));
58-
ASSERT_FALSE(make_field(1, 1).Overlaps(make_field(3, 3)));
60+
ASSERT_FALSE(make_field(0, 0).Overlaps(make_field(1)));
61+
ASSERT_TRUE(make_field(1, 1).Overlaps(make_field(1)));
62+
ASSERT_FALSE(make_field(1, 1).Overlaps(make_field(3)));
5963

6064
ASSERT_TRUE(make_field(0, 1).Overlaps(make_field(1, 2)));
6165
ASSERT_TRUE(make_field(1, 2).Overlaps(make_field(0, 1)));
@@ -71,13 +75,13 @@ TEST(RegisterFlagsTest, PaddingDistance) {
7175
// (start bit is higher) field first and that they do not overlap.
7276

7377
// [field 1][field 2]
74-
ASSERT_EQ(make_field(1, 1).PaddingDistance(make_field(0, 0)), 0ULL);
78+
ASSERT_EQ(make_field(1, 1).PaddingDistance(make_field(0)), 0ULL);
7579
// [field 1][..][field 2]
76-
ASSERT_EQ(make_field(2, 2).PaddingDistance(make_field(0, 0)), 1ULL);
80+
ASSERT_EQ(make_field(2, 2).PaddingDistance(make_field(0)), 1ULL);
7781
// [field 1][field 1][field 2]
78-
ASSERT_EQ(make_field(1, 2).PaddingDistance(make_field(0, 0)), 0ULL);
82+
ASSERT_EQ(make_field(1, 2).PaddingDistance(make_field(0)), 0ULL);
7983
// [field 1][30 bits free][field 2]
80-
ASSERT_EQ(make_field(31, 31).PaddingDistance(make_field(0, 0)), 30ULL);
84+
ASSERT_EQ(make_field(31, 31).PaddingDistance(make_field(0)), 30ULL);
8185
}
8286

8387
static void test_padding(const std::vector<RegisterFlags::Field> &fields,
@@ -99,18 +103,18 @@ TEST(RegisterFlagsTest, RegisterFlagsPadding) {
99103

100104
// Needs padding in between the fields, single bit.
101105
test_padding({make_field(17, 31), make_field(0, 15)},
102-
{make_field(17, 31), make_field(16, 16), make_field(0, 15)});
106+
{make_field(17, 31), make_field(16), make_field(0, 15)});
103107
// Multiple bits of padding.
104108
test_padding({make_field(17, 31), make_field(0, 14)},
105109
{make_field(17, 31), make_field(15, 16), make_field(0, 14)});
106110

107111
// Padding before first field, single bit.
108-
test_padding({make_field(0, 30)}, {make_field(31, 31), make_field(0, 30)});
112+
test_padding({make_field(0, 30)}, {make_field(31), make_field(0, 30)});
109113
// Multiple bits.
110114
test_padding({make_field(0, 15)}, {make_field(16, 31), make_field(0, 15)});
111115

112116
// Padding after last field, single bit.
113-
test_padding({make_field(1, 31)}, {make_field(1, 31), make_field(0, 0)});
117+
test_padding({make_field(1, 31)}, {make_field(1, 31), make_field(0)});
114118
// Multiple bits.
115119
test_padding({make_field(2, 31)}, {make_field(2, 31), make_field(0, 1)});
116120

@@ -132,9 +136,8 @@ TEST(RegisterFieldsTest, ReverseFieldOrder) {
132136
ASSERT_EQ(0x56781234ULL, (unsigned long long)rf2.ReverseFieldOrder(0x12345678));
133137

134138
// Many small fields.
135-
RegisterFlags rf3("", 4,
136-
{make_field(31, 31), make_field(30, 30), make_field(29, 29),
137-
make_field(28, 28)});
139+
RegisterFlags rf3(
140+
"", 4, {make_field(31), make_field(30), make_field(29), make_field(28)});
138141
ASSERT_EQ(0x00000005ULL, rf3.ReverseFieldOrder(0xA0000000));
139142
}
140143

@@ -167,7 +170,7 @@ TEST(RegisterFlagsTest, AsTable) {
167170
pos_wider.AsTable(100));
168171

169172
// Single bit fields don't need to show start and end, just one of them.
170-
RegisterFlags single_bit("", 4, {make_field(31, 31)});
173+
RegisterFlags single_bit("", 4, {make_field(31)});
171174
ASSERT_EQ("| 31 | 30-0 |\n"
172175
"|----|------|\n"
173176
"| | |",
@@ -177,7 +180,7 @@ TEST(RegisterFlagsTest, AsTable) {
177180
RegisterFlags many_fields("", 4,
178181
{RegisterFlags::Field("cat", 28, 31),
179182
RegisterFlags::Field("pigeon", 20, 23),
180-
RegisterFlags::Field("wolf", 12, 12),
183+
RegisterFlags::Field("wolf", 12),
181184
RegisterFlags::Field("x", 0, 4)});
182185
ASSERT_EQ("| 31-28 | 27-24 | 23-20 | 19-13 | 12 | 11-5 | 4-0 |\n"
183186
"|-------|-------|--------|-------|------|------|-----|\n"

0 commit comments

Comments
 (0)