furnace 0.3.1 → 0.4.0.beta.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.travis.yml +4 -0
- data/Gemfile +1 -2
- data/{LICENSE → LICENSE.MIT} +14 -14
- data/Rakefile +1 -5
- data/furnace.gemspec +7 -3
- data/lib/furnace/ast/node.rb +14 -0
- data/lib/furnace/ast/processor.rb +7 -7
- data/lib/furnace/ssa/argument.rb +23 -0
- data/lib/furnace/ssa/basic_block.rb +117 -0
- data/lib/furnace/ssa/builder.rb +100 -0
- data/lib/furnace/ssa/constant.rb +43 -0
- data/lib/furnace/ssa/function.rb +191 -0
- data/lib/furnace/ssa/generic_instruction.rb +14 -0
- data/lib/furnace/ssa/generic_type.rb +16 -0
- data/lib/furnace/ssa/instruction.rb +92 -0
- data/lib/furnace/ssa/instruction_syntax.rb +109 -0
- data/lib/furnace/ssa/instructions/branch.rb +11 -0
- data/lib/furnace/ssa/instructions/phi.rb +63 -0
- data/lib/furnace/ssa/instructions/return.rb +11 -0
- data/lib/furnace/ssa/module.rb +52 -0
- data/lib/furnace/ssa/named_value.rb +25 -0
- data/lib/furnace/ssa/pretty_printer.rb +113 -0
- data/lib/furnace/ssa/terminator_instruction.rb +24 -0
- data/lib/furnace/ssa/type.rb +27 -0
- data/lib/furnace/ssa/types/basic_block.rb +11 -0
- data/lib/furnace/ssa/types/function.rb +11 -0
- data/lib/furnace/ssa/types/void.rb +15 -0
- data/lib/furnace/ssa/user.rb +84 -0
- data/lib/furnace/ssa/value.rb +62 -0
- data/lib/furnace/ssa.rb +66 -0
- data/lib/furnace/transform/iterative.rb +27 -0
- data/lib/furnace/transform/pipeline.rb +3 -3
- data/lib/furnace/version.rb +1 -1
- data/lib/furnace.rb +3 -3
- data/test/ast_test.rb +32 -3
- data/test/ssa_test.rb +1129 -0
- data/test/test_helper.rb +17 -28
- data/test/transform_test.rb +74 -0
- metadata +136 -58
- data/lib/furnace/cfg/algorithms.rb +0 -193
- data/lib/furnace/cfg/graph.rb +0 -99
- data/lib/furnace/cfg/node.rb +0 -78
- data/lib/furnace/cfg.rb +0 -7
- data/lib/furnace/transform/iterative_process.rb +0 -26
data/lib/furnace/cfg/node.rb
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
module Furnace::CFG
|
2
|
-
class Node
|
3
|
-
attr_reader :cfg, :label
|
4
|
-
|
5
|
-
attr_accessor :target_labels, :exception_label
|
6
|
-
attr_accessor :instructions, :control_transfer_instruction
|
7
|
-
|
8
|
-
attr_accessor :metadata
|
9
|
-
|
10
|
-
alias :insns :instructions
|
11
|
-
alias :insns= :instructions=
|
12
|
-
alias :cti :control_transfer_instruction
|
13
|
-
alias :cti= :control_transfer_instruction=
|
14
|
-
|
15
|
-
def initialize(cfg, label=nil, insns=[], cti=nil,
|
16
|
-
target_labels=[], exception_label=nil,
|
17
|
-
metadata={})
|
18
|
-
@cfg, @label = cfg, label
|
19
|
-
@metadata = metadata
|
20
|
-
|
21
|
-
@instructions = insns
|
22
|
-
@control_transfer_instruction = cti
|
23
|
-
|
24
|
-
@target_labels = target_labels
|
25
|
-
@exception_label = exception_label
|
26
|
-
end
|
27
|
-
|
28
|
-
def target_labels
|
29
|
-
@target_labels
|
30
|
-
end
|
31
|
-
|
32
|
-
def targets
|
33
|
-
@target_labels.map do |label|
|
34
|
-
@cfg.find_node label
|
35
|
-
end.freeze
|
36
|
-
end
|
37
|
-
|
38
|
-
def source_labels
|
39
|
-
sources.map &:label
|
40
|
-
end
|
41
|
-
|
42
|
-
def sources
|
43
|
-
@cfg.sources_for(self)
|
44
|
-
end
|
45
|
-
|
46
|
-
def exception
|
47
|
-
@cfg.find_node @exception_label if @exception_label
|
48
|
-
end
|
49
|
-
|
50
|
-
def exception_source_labels
|
51
|
-
exception_sources.map &:label
|
52
|
-
end
|
53
|
-
|
54
|
-
def exception_sources
|
55
|
-
@cfg.sources_for(self, true)
|
56
|
-
end
|
57
|
-
|
58
|
-
def exits?
|
59
|
-
targets == [@cfg.exit]
|
60
|
-
end
|
61
|
-
|
62
|
-
def ==(other)
|
63
|
-
other.is_a?(Node) && self.label == other.label
|
64
|
-
end
|
65
|
-
|
66
|
-
def inspect
|
67
|
-
if @label && @instructions
|
68
|
-
"<#{@label}:#{@instructions.join ", "}>"
|
69
|
-
elsif @label
|
70
|
-
"<#{@label}>"
|
71
|
-
elsif @instructions
|
72
|
-
"<!unlabeled:#{@instructions.join ", "}>"
|
73
|
-
else
|
74
|
-
"<!exit#{metadata}>"
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
data/lib/furnace/cfg.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
module Furnace
|
2
|
-
module Transform
|
3
|
-
class IterativeProcess
|
4
|
-
def initialize(stages)
|
5
|
-
@stages = stages
|
6
|
-
end
|
7
|
-
|
8
|
-
def transform(*sequence)
|
9
|
-
loop do
|
10
|
-
changed = false
|
11
|
-
|
12
|
-
@stages.each do |stage|
|
13
|
-
return sequence if stage.nil?
|
14
|
-
|
15
|
-
if new_sequence = stage.transform(*sequence)
|
16
|
-
changed = true
|
17
|
-
sequence = new_sequence
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
return sequence unless changed
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|