Skip to content

Commit 1fb8e3d

Browse files
sedymrakMatej KošíkJDevlieghere
authored
[lldb] Support integer registers with more than 64 bits. (#166363)
In this PR we are proposing to change LLDB codebase so that LLDB is able to print values of integer registers that have more than 64-bits (even if the number of bits is not equal to 128). --------- Co-authored-by: Matej Košík <[email protected]> Co-authored-by: Jonas Devlieghere <[email protected]>
1 parent 67d5c14 commit 1fb8e3d

File tree

4 files changed

+308
-53
lines changed

4 files changed

+308
-53
lines changed

lldb/include/lldb/Utility/RegisterValue.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ class RegisterValue {
4646
eTypeUInt16,
4747
eTypeUInt32,
4848
eTypeUInt64,
49-
eTypeUInt128,
49+
eTypeUIntN, /// < This value is used when the (integer) register is larger
50+
/// than 64-bits.
5051
eTypeFloat,
5152
eTypeDouble,
5253
eTypeLongDouble,
@@ -69,7 +70,7 @@ class RegisterValue {
6970
m_scalar = inst;
7071
}
7172

72-
explicit RegisterValue(llvm::APInt inst) : m_type(eTypeUInt128) {
73+
explicit RegisterValue(llvm::APInt inst) : m_type(eTypeUIntN) {
7374
m_scalar = llvm::APInt(std::move(inst));
7475
}
7576

@@ -178,7 +179,7 @@ class RegisterValue {
178179
}
179180

180181
void operator=(llvm::APInt uint) {
181-
m_type = eTypeUInt128;
182+
m_type = eTypeUIntN;
182183
m_scalar = llvm::APInt(std::move(uint));
183184
}
184185

@@ -217,8 +218,8 @@ class RegisterValue {
217218
m_scalar = uint;
218219
}
219220

220-
void SetUInt128(llvm::APInt uint) {
221-
m_type = eTypeUInt128;
221+
void SetUIntN(llvm::APInt uint) {
222+
m_type = eTypeUIntN;
222223
m_scalar = std::move(uint);
223224
}
224225

lldb/source/Utility/DataExtractor.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -662,10 +662,6 @@ size_t DataExtractor::ExtractBytes(offset_t offset, offset_t length,
662662
const uint8_t *src = PeekData(offset, length);
663663
if (src) {
664664
if (dst_byte_order != GetByteOrder()) {
665-
// Validate that only a word- or register-sized dst is byte swapped
666-
assert(length == 1 || length == 2 || length == 4 || length == 8 ||
667-
length == 10 || length == 16 || length == 32);
668-
669665
for (uint32_t i = 0; i < length; ++i)
670666
(static_cast<uint8_t *>(dst))[i] = src[length - i - 1];
671667
} else

lldb/source/Utility/RegisterValue.cpp

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ bool RegisterValue::GetScalarValue(Scalar &scalar) const {
127127
case eTypeUInt16:
128128
case eTypeUInt32:
129129
case eTypeUInt64:
130-
case eTypeUInt128:
130+
case eTypeUIntN:
131131
case eTypeFloat:
132132
case eTypeDouble:
133133
case eTypeLongDouble:
@@ -180,8 +180,6 @@ Status RegisterValue::SetValueFromData(const RegisterInfo &reg_info,
180180
if (src_len > reg_info.byte_size)
181181
src_len = reg_info.byte_size;
182182

183-
type128 int128;
184-
185183
m_type = eTypeInvalid;
186184
switch (reg_info.encoding) {
187185
case eEncodingInvalid:
@@ -196,17 +194,15 @@ Status RegisterValue::SetValueFromData(const RegisterInfo &reg_info,
196194
SetUInt32(src.GetMaxU32(&src_offset, src_len));
197195
else if (reg_info.byte_size <= 8)
198196
SetUInt64(src.GetMaxU64(&src_offset, src_len));
199-
else if (reg_info.byte_size <= 16) {
200-
uint64_t data1 = src.GetU64(&src_offset);
201-
uint64_t data2 = src.GetU64(&src_offset);
202-
if (src.GetByteOrder() == eByteOrderLittle) {
203-
int128.x[0] = data1;
204-
int128.x[1] = data2;
205-
} else {
206-
int128.x[0] = data2;
207-
int128.x[1] = data1;
208-
}
209-
SetUInt128(llvm::APInt(128, int128.x));
197+
else {
198+
std::vector<uint8_t> native_endian_src(src_len, 0);
199+
src.ExtractBytes(src_offset, src_len,
200+
llvm::sys::IsLittleEndianHost ? eByteOrderLittle
201+
: eByteOrderBig,
202+
native_endian_src.data());
203+
llvm::APInt uint = llvm::APInt::getZero(src_len * 8);
204+
llvm::LoadIntFromMemory(uint, native_endian_src.data(), src_len);
205+
SetUIntN(uint);
210206
}
211207
break;
212208
case eEncodingIEEE754:
@@ -442,7 +438,7 @@ bool RegisterValue::SignExtend(uint32_t sign_bitpos) {
442438
case eTypeUInt16:
443439
case eTypeUInt32:
444440
case eTypeUInt64:
445-
case eTypeUInt128:
441+
case eTypeUIntN:
446442
return m_scalar.SignExtend(sign_bitpos);
447443
case eTypeFloat:
448444
case eTypeDouble:
@@ -465,7 +461,7 @@ bool RegisterValue::CopyValue(const RegisterValue &rhs) {
465461
case eTypeUInt16:
466462
case eTypeUInt32:
467463
case eTypeUInt64:
468-
case eTypeUInt128:
464+
case eTypeUIntN:
469465
case eTypeFloat:
470466
case eTypeDouble:
471467
case eTypeLongDouble:
@@ -581,7 +577,7 @@ llvm::APInt RegisterValue::GetAsUInt128(const llvm::APInt &fail_value,
581577
case eTypeUInt16:
582578
case eTypeUInt32:
583579
case eTypeUInt64:
584-
case eTypeUInt128:
580+
case eTypeUIntN:
585581
case eTypeFloat:
586582
case eTypeDouble:
587583
case eTypeLongDouble:
@@ -616,7 +612,7 @@ float RegisterValue::GetAsFloat(float fail_value, bool *success_ptr) const {
616612
break;
617613
case eTypeUInt32:
618614
case eTypeUInt64:
619-
case eTypeUInt128:
615+
case eTypeUIntN:
620616
case eTypeFloat:
621617
case eTypeDouble:
622618
case eTypeLongDouble:
@@ -636,7 +632,7 @@ double RegisterValue::GetAsDouble(double fail_value, bool *success_ptr) const {
636632

637633
case eTypeUInt32:
638634
case eTypeUInt64:
639-
case eTypeUInt128:
635+
case eTypeUIntN:
640636
case eTypeFloat:
641637
case eTypeDouble:
642638
case eTypeLongDouble:
@@ -657,7 +653,7 @@ long double RegisterValue::GetAsLongDouble(long double fail_value,
657653

658654
case eTypeUInt32:
659655
case eTypeUInt64:
660-
case eTypeUInt128:
656+
case eTypeUIntN:
661657
case eTypeFloat:
662658
case eTypeDouble:
663659
case eTypeLongDouble:
@@ -676,7 +672,7 @@ const void *RegisterValue::GetBytes() const {
676672
case eTypeUInt16:
677673
case eTypeUInt32:
678674
case eTypeUInt64:
679-
case eTypeUInt128:
675+
case eTypeUIntN:
680676
case eTypeFloat:
681677
case eTypeDouble:
682678
case eTypeLongDouble:
@@ -698,7 +694,7 @@ uint32_t RegisterValue::GetByteSize() const {
698694
return 2;
699695
case eTypeUInt32:
700696
case eTypeUInt64:
701-
case eTypeUInt128:
697+
case eTypeUIntN:
702698
case eTypeFloat:
703699
case eTypeDouble:
704700
case eTypeLongDouble:
@@ -721,7 +717,7 @@ bool RegisterValue::SetUInt(uint64_t uint, uint32_t byte_size) {
721717
} else if (byte_size <= 8) {
722718
SetUInt64(uint);
723719
} else if (byte_size <= 16) {
724-
SetUInt128(llvm::APInt(128, uint));
720+
SetUIntN(llvm::APInt(128, uint));
725721
} else
726722
return false;
727723
return true;
@@ -749,7 +745,7 @@ bool RegisterValue::operator==(const RegisterValue &rhs) const {
749745
case eTypeUInt16:
750746
case eTypeUInt32:
751747
case eTypeUInt64:
752-
case eTypeUInt128:
748+
case eTypeUIntN:
753749
case eTypeFloat:
754750
case eTypeDouble:
755751
case eTypeLongDouble:
@@ -774,7 +770,7 @@ bool RegisterValue::ClearBit(uint32_t bit) {
774770
case eTypeUInt16:
775771
case eTypeUInt32:
776772
case eTypeUInt64:
777-
case eTypeUInt128:
773+
case eTypeUIntN:
778774
if (bit < (GetByteSize() * 8)) {
779775
return m_scalar.ClearBit(bit);
780776
}
@@ -814,7 +810,7 @@ bool RegisterValue::SetBit(uint32_t bit) {
814810
case eTypeUInt16:
815811
case eTypeUInt32:
816812
case eTypeUInt64:
817-
case eTypeUInt128:
813+
case eTypeUIntN:
818814
if (bit < (GetByteSize() * 8)) {
819815
return m_scalar.SetBit(bit);
820816
}

0 commit comments

Comments
 (0)