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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bc07b0f8ac78b5bc79d5b961c13bd85a17f8560a1bba4de668a16c61c59b8e50
4
- data.tar.gz: 9d065ba961225885c646be8727506011b52da34aa5921009d8f97b4e858b4723
3
+ metadata.gz: 7ca6679b550fa279774d1d4b83ed090a970ece0114214eca60778af139f826ce
4
+ data.tar.gz: 65f1faa1444db68193f911e6bfbbc767e37215aa6ca5e3cd2eb34a653ba6218b
5
5
  SHA512:
6
- metadata.gz: 55d33ac42c431d22105aae69c5c003923f102dead9054bf33820365126056a0125a9a46e6ea07d0ed002f7b0e7b84f2b9ffe2d3a7d56a29e1d229aabeee60a8e
7
- data.tar.gz: 45a2501201183a1d49a211f6b9d089462c8f6899706a5066ea134fd3d3af130f61552172c81b83c29196791962bd56ec3f7b663f4755771b383563011ba13cc0
6
+ metadata.gz: 69b8bb1233adbe80b18e1b54f2f41f64b7e6af23e36b8191ac7c37b034ad5d6d02117161e93f6b2499352b37372a2798ab94e904a98f1a52bbea6f3dd542003e
7
+ data.tar.gz: c538f326be28b0deb95c5cfbdc5849c6bf3ab51562aff3dfc5ae49aa64a46512af12228b992da4918aa8b208d613f3eb615920e767da08922853c4dd0e643c11
data/CHANGELOG.md CHANGED
@@ -1,8 +1,11 @@
1
+ ## v0.1.2
2
+
3
+ * Add `--merge` option
4
+
1
5
  ## v0.1.1
2
6
 
3
7
  * Add `--flat` option
4
8
 
5
9
  ## v0.1.0
6
10
 
7
- * Initial release
8
- * Features: `--die`, `--subprogram`, `--show-size`, `--sort-size`
11
+ * Add `--die`, `--subprogram`, `--show-size`, `--sort-size` options
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(object, dies: dies, subprograms: subprograms, show_size: show_size, sort_size: sort_size, flat: flat)
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.class.attributes.map do |attr|
34
- if value = node.public_send(attr)
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)
@@ -1,3 +1,3 @@
1
1
  module Dwarftree
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
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.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