dwarftree 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -2
- data/exe/dwarftree +14 -1
- data/lib/dwarftree/die.rb +12 -1
- data/lib/dwarftree/tree_merger.rb +19 -0
- data/lib/dwarftree/tree_visualizer.rb +7 -9
- data/lib/dwarftree/version.rb +1 -1
- data/lib/dwarftree.rb +6 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7ca6679b550fa279774d1d4b83ed090a970ece0114214eca60778af139f826ce
|
4
|
+
data.tar.gz: 65f1faa1444db68193f911e6bfbbc767e37215aa6ca5e3cd2eb34a653ba6218b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 69b8bb1233adbe80b18e1b54f2f41f64b7e6af23e36b8191ac7c37b034ad5d6d02117161e93f6b2499352b37372a2798ab94e904a98f1a52bbea6f3dd542003e
|
7
|
+
data.tar.gz: c538f326be28b0deb95c5cfbdc5849c6bf3ab51562aff3dfc5ae49aa64a46512af12228b992da4918aa8b208d613f3eb615920e767da08922853c4dd0e643c11
|
data/CHANGELOG.md
CHANGED
data/exe/dwarftree
CHANGED
@@ -8,6 +8,7 @@ subprograms = Set.new
|
|
8
8
|
dies = Set.new
|
9
9
|
show_size = false
|
10
10
|
sort_size = false
|
11
|
+
merge = false
|
11
12
|
flat = false
|
12
13
|
|
13
14
|
objects = OptionParser.new do |o|
|
@@ -25,11 +26,23 @@ objects = OptionParser.new do |o|
|
|
25
26
|
show_size = true
|
26
27
|
sort_size = true
|
27
28
|
end
|
29
|
+
o.on('--merge', 'Merge sibling DIEs with the same attributes') do
|
30
|
+
show_size = true
|
31
|
+
merge = true
|
32
|
+
end
|
28
33
|
o.on('--flat', 'Skip constructing a tree') do
|
29
34
|
flat = true
|
30
35
|
end
|
31
36
|
end.parse!(ARGV)
|
32
37
|
|
33
38
|
objects.each do |object|
|
34
|
-
Dwarftree.run(
|
39
|
+
Dwarftree.run(
|
40
|
+
object,
|
41
|
+
dies: dies,
|
42
|
+
subprograms: subprograms,
|
43
|
+
show_size: show_size,
|
44
|
+
sort_size: sort_size,
|
45
|
+
merge: merge,
|
46
|
+
flat: flat,
|
47
|
+
)
|
35
48
|
end
|
data/lib/dwarftree/die.rb
CHANGED
@@ -29,11 +29,22 @@ module Dwarftree::DIE
|
|
29
29
|
self.attributes = members
|
30
30
|
|
31
31
|
# Not in members to avoid a conflict with DIE attributes
|
32
|
-
attr_accessor :type, :level, :children
|
32
|
+
attr_accessor :type, :level, :children, :merged
|
33
33
|
|
34
34
|
def initialize(**)
|
35
35
|
super
|
36
36
|
self.children = []
|
37
|
+
self.merged = []
|
38
|
+
end
|
39
|
+
|
40
|
+
def attributes
|
41
|
+
attrs = {}
|
42
|
+
self.class.attributes.each do |attr|
|
43
|
+
if value = send(attr)
|
44
|
+
attrs[attr] = value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
attrs
|
37
48
|
end
|
38
49
|
|
39
50
|
if block
|
@@ -0,0 +1,19 @@
|
|
1
|
+
class << Dwarftree::TreeMerger = Object.new
|
2
|
+
# @param [Array<Dwarftree::DIE::*>] nodes
|
3
|
+
def merge!(nodes)
|
4
|
+
merged = []
|
5
|
+
nodes.group_by(&:attributes).each do |attrs, same_nodes|
|
6
|
+
first_node = same_nodes.first
|
7
|
+
same_nodes.drop(1).each do |node|
|
8
|
+
first_node.children.push(*node.children)
|
9
|
+
first_node.merged << node
|
10
|
+
end
|
11
|
+
merged << first_node
|
12
|
+
end
|
13
|
+
nodes.replace(merged)
|
14
|
+
|
15
|
+
nodes.each do |node|
|
16
|
+
merge!(node.children)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -22,7 +22,7 @@ class Dwarftree::TreeVisualizer
|
|
22
22
|
def visualize_node(node, depth: 0)
|
23
23
|
size = node_code_size(node)
|
24
24
|
print "#{' ' * depth}#{node.type}"
|
25
|
-
puts "#{(" size=#{human_size(size)}" if @show_size && size)} #{node_attributes(node)}"
|
25
|
+
puts "#{(" size=#{human_size(size)}" if @show_size && size > 0)} #{node_attributes(node)}"
|
26
26
|
|
27
27
|
sort(node.children).each do |child|
|
28
28
|
visualize_node(child, depth: depth + 1)
|
@@ -30,23 +30,21 @@ class Dwarftree::TreeVisualizer
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def node_attributes(node)
|
33
|
-
attrs = node.
|
34
|
-
|
35
|
-
"#{attr}: #{value}"
|
36
|
-
end
|
33
|
+
attrs = node.attributes.map do |attr, value|
|
34
|
+
"#{attr}: #{value}"
|
37
35
|
end
|
38
|
-
attrs.compact!
|
39
|
-
|
40
36
|
return '' if attrs.empty?
|
41
37
|
"(#{attrs.join(', ')})"
|
42
38
|
end
|
43
39
|
|
44
40
|
def node_code_size(node)
|
41
|
+
size = node.merged.map { |n| node_code_size(n) }.compact.sum
|
45
42
|
if node.respond_to?(:ranges) && node.ranges
|
46
|
-
node.ranges.map { |range| range.end - range.begin }.sum
|
43
|
+
size += node.ranges.map { |range| range.end - range.begin }.sum
|
47
44
|
elsif node.respond_to?(:high_pc) && node.high_pc
|
48
|
-
node.high_pc.to_i(16) # surprisingly low_pc is not needed to know code size
|
45
|
+
size += node.high_pc.to_i(16) # surprisingly low_pc is not needed to know code size
|
49
46
|
end
|
47
|
+
size
|
50
48
|
end
|
51
49
|
|
52
50
|
def human_size(size)
|
data/lib/dwarftree/version.rb
CHANGED
data/lib/dwarftree.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
module Dwarftree
|
2
2
|
require 'dwarftree/debug_info_parser'
|
3
3
|
require 'dwarftree/tree_filter'
|
4
|
+
require 'dwarftree/tree_merger'
|
4
5
|
require 'dwarftree/tree_visualizer'
|
5
6
|
|
6
7
|
# @param [String] object
|
@@ -8,8 +9,9 @@ module Dwarftree
|
|
8
9
|
# @param [Array<String>] subprograms
|
9
10
|
# @param [TrueClass,FalseClass] show_size
|
10
11
|
# @param [TrueClass,FalseClass] sort_size
|
12
|
+
# @param [TrueClass,FalseClass] merge
|
11
13
|
# @param [TrueClass,FalseClass] flat
|
12
|
-
def self.run(object, dies:, subprograms:, show_size:, sort_size:, flat:)
|
14
|
+
def self.run(object, dies:, subprograms:, show_size:, sort_size:, merge:, flat:)
|
13
15
|
begin
|
14
16
|
nodes = DebugInfoParser.parse(object, flat: flat)
|
15
17
|
rescue DebugInfoParser::CommandError => e
|
@@ -20,6 +22,9 @@ module Dwarftree
|
|
20
22
|
end
|
21
23
|
|
22
24
|
Dwarftree::TreeFilter.new(dies: dies, subprograms: subprograms).filter!(nodes)
|
25
|
+
if merge
|
26
|
+
Dwarftree::TreeMerger.merge!(nodes)
|
27
|
+
end
|
23
28
|
Dwarftree::TreeVisualizer.new(show_size: show_size, sort_size: sort_size).visualize(nodes)
|
24
29
|
end
|
25
30
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dwarftree
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Takashi Kokubun
|
@@ -59,6 +59,7 @@ files:
|
|
59
59
|
- lib/dwarftree/die/variable.rb
|
60
60
|
- lib/dwarftree/die/volatile_type.rb
|
61
61
|
- lib/dwarftree/tree_filter.rb
|
62
|
+
- lib/dwarftree/tree_merger.rb
|
62
63
|
- lib/dwarftree/tree_visualizer.rb
|
63
64
|
- lib/dwarftree/version.rb
|
64
65
|
homepage: https://github.com/k0kubun/dwarftree
|