Skip to content

Commit cad6ed6

Browse files
committed
Fix pretty-printers not working when constexpr variables are optimized away
Also do a few other things. * `groups` and `elements` are now stored inside `self` * `mask`, `n0`, and `n` aren't declared ahead of their first assignment * Remove trailing whitespace
1 parent e2891f0 commit cad6ed6

File tree

1 file changed

+28
-31
lines changed

1 file changed

+28
-31
lines changed

extra/boost_unordered_printers.py

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def maybe_unwrap_atomic(n):
1414
return n.cast(underlying_type)
1515
else:
1616
return n
17-
17+
1818
def maybe_unwrap_foa_element(e):
1919
if f"{e.type.strip_typedefs()}".startswith("boost::unordered::detail::foa::element_type<"):
2020
return e["p"]
@@ -84,7 +84,7 @@ def generator():
8484
count += 1
8585
node = self.cpo.to_address(node.dereference()["next"])
8686
bucket_index += 1
87-
87+
8888
return generator()
8989

9090
class BoostUnorderedFcaIteratorPrinter:
@@ -119,7 +119,7 @@ def generator():
119119
yield "", member
120120
yield "", self.val[member]
121121
return generator()
122-
122+
123123
class BoostUnorderedFoaCumulativeStatsPrinter:
124124
def __init__(self, val):
125125
self.val = val
@@ -128,7 +128,7 @@ def __init__(self, val):
128128

129129
def display_hint(self):
130130
return "map"
131-
131+
132132
def children(self):
133133
def generator():
134134
yield "", "count"
@@ -161,6 +161,11 @@ def __init__(self, val):
161161
self.name = self.name.replace("boost::unordered::", "boost::")
162162
self.is_map = self.name.endswith("map")
163163
self.cpo = BoostUnorderedPointerCustomizationPoint(self.table["arrays"]["groups_"])
164+
self.groups = self.cpo.to_address(self.table["arrays"]["groups_"])
165+
self.elements = self.cpo.to_address(self.table["arrays"]["elements_"])
166+
167+
self.N = 15 # `self.groups.dereference()["N"]` may be optimized out
168+
self.sentinel_ = 1 # `self.groups.dereference()["sentinel_"]` may be optimized out
164169

165170
def to_string(self):
166171
size = BoostUnorderedHelpers.maybe_unwrap_atomic(self.table["size_ctrl"]["size"])
@@ -193,29 +198,21 @@ def is_sentinel(self, group, pos):
193198
m = group["m"]
194199
at = lambda b: BoostUnorderedHelpers.maybe_unwrap_atomic(m[b]["n"])
195200

196-
N = group["N"]
197-
sentinel_ = group["sentinel_"]
198201
if self.is_regular_layout(group):
199-
return pos == N-1 and at(N-1) == sentinel_
202+
return pos == self.N-1 and at(self.N-1) == self.sentinel_
200203
else:
201-
return pos == N-1 and (at(0) & 0x4000400040004000) == 0x4000 and (at(1) & 0x4000400040004000) == 0
204+
return pos == self.N-1 and (at(0) & 0x4000400040004000) == 0x4000 and (at(1) & 0x4000400040004000) == 0
202205

203206
def children(self):
204207
def generator():
205-
groups = self.cpo.to_address(self.table["arrays"]["groups_"])
206-
elements = self.cpo.to_address(self.table["arrays"]["elements_"])
207-
208-
pc_ = groups.cast(gdb.lookup_type("unsigned char").pointer())
209-
p_ = elements
208+
pc_ = self.groups.cast(gdb.lookup_type("unsigned char").pointer())
209+
p_ = self.elements
210210
first_time = True
211-
mask = 0
212-
n0 = 0
213-
n = 0
214211

215212
count = 0
216213
while p_ != 0:
217214
# This if block mirrors the condition in the begin() call
218-
if (not first_time) or (self.match_occupied(groups.dereference()) & 1):
215+
if (not first_time) or (self.match_occupied(self.groups.dereference()) & 1):
219216
pointer = BoostUnorderedHelpers.maybe_unwrap_foa_element(p_)
220217
value = self.cpo.to_address(pointer).dereference()
221218
if self.is_map:
@@ -229,17 +226,17 @@ def generator():
229226
count += 1
230227
first_time = False
231228

232-
n0 = pc_.cast(gdb.lookup_type("uintptr_t")) % groups.dereference().type.sizeof
229+
n0 = pc_.cast(gdb.lookup_type("uintptr_t")) % self.groups.dereference().type.sizeof
233230
pc_ = self.cpo.next(pc_, -n0)
234231

235-
mask = (self.match_occupied(pc_.cast(groups.type).dereference()) >> (n0+1)) << (n0+1)
232+
mask = (self.match_occupied(pc_.cast(self.groups.type).dereference()) >> (n0+1)) << (n0+1)
236233
while mask == 0:
237-
pc_ = self.cpo.next(pc_, groups.dereference().type.sizeof)
238-
p_ = self.cpo.next(p_, groups.dereference()["N"])
239-
mask = self.match_occupied(pc_.cast(groups.type).dereference())
240-
234+
pc_ = self.cpo.next(pc_, self.groups.dereference().type.sizeof)
235+
p_ = self.cpo.next(p_, self.N)
236+
mask = self.match_occupied(pc_.cast(self.groups.type).dereference())
237+
241238
n = BoostUnorderedHelpers.countr_zero(mask)
242-
if self.is_sentinel(pc_.cast(groups.type).dereference(), n):
239+
if self.is_sentinel(pc_.cast(self.groups.type).dereference(), n):
243240
p_ = 0
244241
else:
245242
pc_ = self.cpo.next(pc_, n)
@@ -285,7 +282,7 @@ def boost_unordered_build_pretty_printer():
285282
add_template_printer("boost::unordered::concurrent_flat_set", BoostUnorderedFoaPrinter)
286283
add_template_printer("boost::unordered::concurrent_node_map", BoostUnorderedFoaPrinter)
287284
add_template_printer("boost::unordered::concurrent_node_set", BoostUnorderedFoaPrinter)
288-
285+
289286
add_template_printer("boost::unordered::detail::foa::table_iterator", BoostUnorderedFoaIteratorPrinter)
290287

291288
add_concrete_printer("boost::unordered::detail::foa::table_core_cumulative_stats", BoostUnorderedFoaTableCoreCumulativeStatsPrinter)
@@ -302,7 +299,7 @@ def boost_unordered_build_pretty_printer():
302299
class BoostUnorderedFoaGetStatsMethod(gdb.xmethod.XMethod):
303300
def __init__(self):
304301
gdb.xmethod.XMethod.__init__(self, "get_stats")
305-
302+
306303
def get_worker(self, method_name):
307304
if method_name == "get_stats":
308305
return BoostUnorderedFoaGetStatsWorker()
@@ -313,19 +310,19 @@ def get_arg_types(self):
313310

314311
def get_result_type(self, obj):
315312
return gdb.lookup_type("boost::unordered::detail::foa::table_core_cumulative_stats")
316-
313+
317314
def __call__(self, obj):
318315
try:
319316
return obj["table_"]["cstats"]
320317
except gdb.error:
321318
print("Error: Binary was compiled without stats. Recompile with `BOOST_UNORDERED_ENABLE_STATS` defined.")
322319
return
323-
320+
324321
class BoostUnorderedFoaMatcher(gdb.xmethod.XMethodMatcher):
325322
def __init__(self):
326323
gdb.xmethod.XMethodMatcher.__init__(self, 'BoostUnorderedFoaMatcher')
327324
self.methods = [BoostUnorderedFoaGetStatsMethod()]
328-
325+
329326
def match(self, class_type, method_name):
330327
template_name = f"{class_type.strip_typedefs()}".split("<")[0]
331328
regex = "^boost::unordered::(unordered|concurrent)_(flat|node)_(map|set)$"
@@ -381,12 +378,12 @@ class MyFancyPtrPrinter:
381378
def boost_to_address(fancy_ptr):
382379
...
383380
return ...
384-
381+
385382
# Equivalent to `operator+()`
386383
def boost_next(raw_ptr, offset):
387384
...
388385
return ...
389-
386+
390387
...
391388
```
392389
"""

0 commit comments

Comments
 (0)