Skip to content

Instantly share code, notes, and snippets.

@spiiin
Created June 9, 2021 20:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save spiiin/9b19c549d1367fb00ad301896423a82b to your computer and use it in GitHub Desktop.
Save spiiin/9b19c549d1367fb00ad301896423a82b to your computer and use it in GitHub Desktop.
Parse Clang dump-record-layouts output
import os
import tkinter as tk
from tkinter import ttk
import itertools
root=tk.Tk()
frame = tk.Frame(root)
tree=ttk.Treeview(frame, show='tree')
ybar=tk.Scrollbar(frame, orient=tk.VERTICAL, command=tree.yview)
tree.configure(yscroll=ybar.set)
tree["show"] = "tree headings"
tree["columns"] = ["Layout", "Size"]
tree.heading('#0',text='Name' ,anchor='nw')
tree.heading('Layout',text='Layout',anchor='nw')
tree.heading('Size',text='Size',anchor='nw')
#tree.column('#0', stretch=1, width=32)
tree.column("#0", stretch=1)
tree.column("Layout", stretch=1)
tree.column("Size", stretch=1)
#
#read sizes from parsed dict
class_sizes = {}
with open("struct_size.txt", "rt") as f:
lines = f.readlines()
for l in lines:
c,s = l.split("=")
class_sizes[c] = int(s)
#
#node = tree.insert('','end',text="Root", values=[0],open=False)
#---------------------------------
fname = "std_function.txt"
with open(fname, "rt") as f:
lines = f.readlines()
def split_line(line):
align, name = line.split("|")
space_count = len(list(itertools.takewhile(lambda f: f == " ", name)))
name = name.strip(" ")
return name, align, space_count
def get_class_name_from_full(name):
name = name.replace("(virtual base)", "").replace("(base", "").replace("(primary base", "")
last_space = name.rfind(" ")
if last_space > -1:
name = name[:last_space]
return name
def need_open(name):
return False #name.find("__ndk") == -1
node_stack = []
for line in lines:
name, align, space_count = split_line(line)
size = 0
#
short_name = name
if len(name) > 160:
short_name = name[:80] + "........." + name[-80:]
#
class_name = get_class_name_from_full(name)
if class_name in class_sizes:
size = class_sizes[class_name]
#
prev_node, prev_spaces = None, 0
if len(node_stack) > 0:
prev_node, prev_spaces = node_stack[-1]
while space_count < prev_spaces:
prev_node, prev_spaces = node_stack.pop()
if prev_spaces == space_count:
node = tree.insert(tree.parent(prev_node) if prev_node!=None else '', 'end', text = short_name, values=[align, size],open=need_open(name))
else:
node = tree.insert(prev_node if prev_node!=None else '', 'end', text = short_name, values=[align, size],open=need_open(name))
node_stack.append((node, space_count))
ybar.pack(side=tk.RIGHT,fill=tk.Y)
tree.pack(side=tk.TOP,fill=tk.BOTH, expand=1)
frame.pack(fill=tk.BOTH, expand=1)
root.mainloop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment