dwarftree 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|