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 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