Debugger: Fix boost::unordered_set dumper for older boost versions

Somewhere between 1.48 and 1.58 structure layout changed.

Change-Id: Id8bcb473f364537342261dd2596f9f1bdacb5c79
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
hjk
2016-11-17 19:12:05 +01:00
parent 952c3e3b64
commit c9067ff28c
2 changed files with 28 additions and 40 deletions
+24 -39
View File
@@ -108,45 +108,30 @@ def qdump__boost__posix_time__time_duration(d, value):
def qdump__boost__unordered__unordered_set(d, value):
base = value.address()
ptrSize = d.ptrSize()
size = d.extractInt(base + 2 * ptrSize)
innerType = value.type[0]
newer = value.type.size() == 6 * d.ptrSize() # 48 for boost 1.58, 40 for boost 1.48
if newer:
# boost 1.58
# bases are 3? bytes, and mlf is actually a float, but since
# its followed by size_t maxload, it's # effectively padded to a size_t
bases, bucketCount, size, mlf, maxload, buckets = value.split('tttttp')
code = 'pp{%s}' % innerType.name
else:
# boost 1.48
# Values are stored before the next pointers. Determine the offset.
buckets, bucketCount, size, mlf, maxload = value.split('ptttt')
code = '{%s}@p' % innerType.name
(pp, ssize, fields) = d.describeStruct(code)
offset = fields[2].offset()
d.putItemCount(size)
if d.isExpanded():
innerType = value.type[0]
bucketCount = d.extractInt(base + ptrSize)
#warn("A BUCKET COUNT: %s" % bucketCount)
#warn("X BUCKET COUNT: %s" % d.parseAndEvaluate("s1.table_.bucket_count_").value())
try:
# boost 1.58
table = value["table_"]
bucketsAddr = table["buckets_"].integer()
#warn("A BUCKETS: 0x%x" % bucketsAddr)
#warn("X BUCKETS: 0x%x" % d.parseAndEvaluate("s1.table_.buckets_").pointer())
lastBucketAddr = bucketsAddr + bucketCount * ptrSize
#warn("A LAST BUCKET: 0x%x" % lastBucketAddr)
#warn("X LAST BUCKET: 0x%x" % d.parseAndEvaluate("s1.table_.get_bucket(s1.table_.bucket_count_)").pointer())
previousStartAddr = lastBucketAddr
#warn("A PREVIOUS START: 0x%x" % previousStartAddr)
#warn("X PREVIOUS START: 0x%x" % d.parseAndEvaluate("s1.table_.get_previous_start()").pointer())
item = d.extractPointer(previousStartAddr)
#warn("A KEY ADDR: 0x%x" % item)
#warn("X KEY ADDR: 0x%x" % d.parseAndEvaluate("s1.table_.get_previous_start()->next_").pointer())
item = d.extractPointer(previousStartAddr)
#warn("A VALUE: %x" % d.extractInt(item + ptrSize))
#warn("X VALUE: %x" % d.parseAndEvaluate("*(int*)(s1.table_.get_previous_start()->next_ + 1)").integer())
with Children(d, size, maxNumChild=10000):
for j in d.childRange():
d.putSubItem(j, d.createValue(item + 2 * ptrSize, innerType))
item = d.extractPointer(item)
except:
# boost 1.48
offset = int((innerType.size() + ptrSize - 1) / ptrSize) * ptrSize
with Children(d, size, maxNumChild=10000):
afterBuckets = d.extractPointer(base + 5 * ptrSize)
afterBuckets += bucketCount * ptrSize
item = d.extractPointer(afterBuckets)
for j in d.childRange():
d.putSubItem(j, d.createValue(item - offset, innerType))
item = d.extractPointer(item)
p = d.extractPointer(buckets + bucketCount * d.ptrSize())
with Children(d, size, maxNumChild=10000):
for j in d.childRange():
if newer:
p, dummy, val = d.split(code, p)
else:
val, pad, p = d.split(code, p - offset)
d.putSubItem(j, val)
+4 -1
View File
@@ -3768,11 +3768,14 @@ class DumperBase:
readingTypeName = False
fieldType = self.createType(typeName)
fieldAlign = fieldType.alignment()
builder.addField(n, fieldIsStruct = True, fieldType = fieldType, fieldAlign = fieldAlign)
builder.addField(n, fieldIsStruct = True,
fieldType = fieldType, fieldAlign = fieldAlign)
typeName = None
n = None
else:
typeName += c
elif c == 't': # size_t
builder.addField(ptrSize, self.ptrCode(), fieldAlign = ptrSize)
elif c == 'p': # Pointer as int
builder.addField(ptrSize, self.ptrCode(), fieldAlign = ptrSize)
elif c == 'P': # Pointer as Value