rltk 2.2.1 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +12 -12
  3. data/README.md +458 -285
  4. data/Rakefile +99 -92
  5. data/lib/rltk/ast.rb +221 -126
  6. data/lib/rltk/cfg.rb +218 -239
  7. data/lib/rltk/cg/basic_block.rb +1 -1
  8. data/lib/rltk/cg/bindings.rb +9 -26
  9. data/lib/rltk/cg/builder.rb +40 -8
  10. data/lib/rltk/cg/context.rb +1 -1
  11. data/lib/rltk/cg/contractor.rb +51 -0
  12. data/lib/rltk/cg/execution_engine.rb +45 -8
  13. data/lib/rltk/cg/function.rb +12 -2
  14. data/lib/rltk/cg/generated_bindings.rb +2541 -575
  15. data/lib/rltk/cg/generic_value.rb +2 -2
  16. data/lib/rltk/cg/instruction.rb +104 -83
  17. data/lib/rltk/cg/llvm.rb +44 -3
  18. data/lib/rltk/cg/memory_buffer.rb +22 -5
  19. data/lib/rltk/cg/module.rb +85 -36
  20. data/lib/rltk/cg/old_generated_bindings.rb +6152 -0
  21. data/lib/rltk/cg/pass_manager.rb +87 -43
  22. data/lib/rltk/cg/support.rb +2 -4
  23. data/lib/rltk/cg/target.rb +158 -28
  24. data/lib/rltk/cg/triple.rb +8 -8
  25. data/lib/rltk/cg/type.rb +69 -25
  26. data/lib/rltk/cg/value.rb +107 -66
  27. data/lib/rltk/cg.rb +16 -17
  28. data/lib/rltk/lexer.rb +21 -11
  29. data/lib/rltk/lexers/calculator.rb +1 -1
  30. data/lib/rltk/lexers/ebnf.rb +8 -7
  31. data/lib/rltk/parser.rb +300 -247
  32. data/lib/rltk/parsers/infix_calc.rb +1 -1
  33. data/lib/rltk/parsers/postfix_calc.rb +2 -2
  34. data/lib/rltk/parsers/prefix_calc.rb +2 -2
  35. data/lib/rltk/token.rb +1 -2
  36. data/lib/rltk/version.rb +3 -3
  37. data/lib/rltk.rb +6 -6
  38. data/test/cg/tc_basic_block.rb +83 -0
  39. data/test/cg/tc_control_flow.rb +191 -0
  40. data/test/cg/tc_function.rb +54 -0
  41. data/test/cg/tc_generic_value.rb +33 -0
  42. data/test/cg/tc_instruction.rb +256 -0
  43. data/test/cg/tc_llvm.rb +25 -0
  44. data/test/cg/tc_math.rb +88 -0
  45. data/test/cg/tc_module.rb +89 -0
  46. data/test/cg/tc_transforms.rb +68 -0
  47. data/test/cg/tc_type.rb +69 -0
  48. data/test/cg/tc_value.rb +151 -0
  49. data/test/cg/ts_cg.rb +23 -0
  50. data/test/tc_ast.rb +105 -8
  51. data/test/tc_cfg.rb +63 -48
  52. data/test/tc_lexer.rb +84 -96
  53. data/test/tc_parser.rb +224 -52
  54. data/test/tc_token.rb +6 -6
  55. data/test/ts_rltk.rb +12 -15
  56. metadata +149 -75
  57. data/lib/rltk/cg/generated_extended_bindings.rb +0 -287
  58. data/lib/rltk/util/abstract_class.rb +0 -25
  59. data/lib/rltk/util/monkeys.rb +0 -129
@@ -14,7 +14,7 @@ require 'rltk/cg/bindings'
14
14
  # Classes and Modules #
15
15
  #######################
16
16
 
17
- module RLTK::CG # :nodoc:
17
+ module RLTK::CG
18
18
 
19
19
  # A PassManager is responsible for scheduling and running optimization
20
20
  # passes on modules.
@@ -27,48 +27,53 @@ module RLTK::CG # :nodoc:
27
27
  # A list of passes that are available to be added to the pass
28
28
  # manager via the {PassManager#add} method.
29
29
  PASSES = {
30
- :ADCE => :agressive_dce,
31
- :AlwaysInline => :always_inliner,
32
- :ArgPromote => :argument_promotion,
33
- :BasicAliasAnalysis => :basic_alias_analysis,
34
- :CFGSimplify => :cfg_simplification,
35
- :ConstMerge => :constant_merge,
36
- :ConstProp => :constant_propagation,
37
- :CorValProp => :correlated_value_propagation,
38
- :DAE => :dead_arg_elimination,
39
- :DSE => :dead_store_elimination,
40
- :DemoteMemToReg => :demote_memory_to_register,
41
- :EarlyCSE => :early_cse,
42
- :FunctionAttrs => :function_attrs,
43
- :FunctionInline => :function_inlining,
44
- :GDCE => :global_dce,
45
- :GlobalOpt => :global_optimizer,
46
- :GVN => :gvn,
47
- :Internalize => :internalize,
48
- :IndVarSimplify => :ind_var_simplify,
49
- :InstCombine => :instruction_combining,
50
- :IPConstProp => :ip_constant_propagation,
51
- :IPSCCP => :ipsccp,
52
- :JumpThreading => :jump_threading,
53
- :LICM => :licm,
54
- :LoopDeletion => :loop_deletion,
55
- :LoopIdiom => :loop_idiom,
56
- :LoopRotate => :loop_rotate,
57
- :LoopUnroll => :loop_unroll,
58
- :LoopUnswitch => :loop_unswitch,
59
- :LEI => :lower_expect_intrinsics,
60
- :MemCopyOpt => :mem_cpy_opt,
61
- :PromoteMemToReg => :promote_memory_to_register,
62
- :PruneEH => :prune_eh,
63
- :Reassociate => :reassociate,
64
- :SCCP => :sccp,
65
- :ScalarRepl => :scalar_repl_aggregates,
66
- :SimplifyLibCalls => :simplify_lib_calls,
67
- :StripDeadProtos => :strip_dead_prototypes,
68
- :StripSymbols => :strip_symbols,
69
- :TailCallElim => :tail_call_elimination,
70
- :TBAA => :type_based_alias_analysis,
71
- :Verifier => :verifier
30
+ :ADCE => :aggressive_dce,
31
+ :AlwaysInline => :always_inliner,
32
+ :ArgPromote => :argument_promotion,
33
+ :BasicAliasAnalysis => :basic_alias_analysis,
34
+ :BBVectorize => :bb_vectorize,
35
+ :CFGSimplify => :cfg_simplification,
36
+ :ConstMerge => :constant_merge,
37
+ :ConstProp => :constant_propagation,
38
+ :CorValProp => :correlated_value_propagation,
39
+ :DAE => :dead_arg_elimination,
40
+ :DSE => :dead_store_elimination,
41
+ :DemoteMemToReg => :demote_memory_to_register,
42
+ :EarlyCSE => :early_cse,
43
+ :FunctionAttrs => :function_attrs,
44
+ :FunctionInline => :function_inlining,
45
+ :GDCE => :global_dce,
46
+ :GlobalOpt => :global_optimizer,
47
+ :GVN => :gvn,
48
+ :Internalize => :internalize,
49
+ :IndVarSimplify => :ind_var_simplify,
50
+ :InstCombine => :instruction_combining,
51
+ :IPConstProp => :ip_constant_propagation,
52
+ :IPSCCP => :ipsccp,
53
+ :JumpThreading => :jump_threading,
54
+ :LICM => :licm,
55
+ :LoopDeletion => :loop_deletion,
56
+ :LoopIdiom => :loop_idiom,
57
+ :LoopReroll => :loop_reroll,
58
+ :LoopRotate => :loop_rotate,
59
+ :LoopUnroll => :loop_unroll,
60
+ :LoopUnswitch => :loop_unswitch,
61
+ :LoopVectorize => :loop_vectorize,
62
+ :LEI => :lower_expect_intrinsics,
63
+ :MemCopyOpt => :mem_cpy_opt,
64
+ :PILC => :partially_inline_lib_calls,
65
+ :PromoteMemToReg => :promote_memory_to_register,
66
+ :PruneEH => :prune_eh,
67
+ :Reassociate => :reassociate,
68
+ :SCCP => :sccp,
69
+ :ScalarRepl => :scalar_repl_aggregates,
70
+ :SimplifyLibCalls => :simplify_lib_calls,
71
+ :SLPVectorize => :slp_vectorize,
72
+ :StripDeadProtos => :strip_dead_prototypes,
73
+ :StripSymbols => :strip_symbols,
74
+ :TailCallElim => :tail_call_elimination,
75
+ :TBAA => :type_based_alias_analysis,
76
+ :Verifier => :verifier
72
77
  }
73
78
 
74
79
  # Create a new pass manager. You should never have to do this as
@@ -205,4 +210,43 @@ module RLTK::CG # :nodoc:
205
210
  Bindings.finalize_function_pass_manager(@ptr).to_bool
206
211
  end
207
212
  end
213
+
214
+ PASS_GROUPS = [
215
+ :analysis,
216
+ :core,
217
+ :inst_combine,
218
+ :instrumentation,
219
+ :ipa,
220
+ :ipo,
221
+ :objc_arc_opts,
222
+ :scalar_opts,
223
+ :target,
224
+ :transform_utils,
225
+ :vectorization
226
+ ]
227
+
228
+ class PassRegistry
229
+ include BindingClass
230
+
231
+ def self.global
232
+ PassRegistry.allocate.tap { |pr| pr.ptr = Bindings.get_global_pass_registry }
233
+ end
234
+
235
+ def initialize
236
+ @ptr = Bindings::OpaquePassRegistry.new
237
+ end
238
+
239
+ def init(pass_group = :all)
240
+ if pass_group == :all
241
+ PASS_GROUPS.each { |pg| Bindings.send("initialize_#{pg}", @ptr) }
242
+
243
+ elsif PASS_GROUPS.include?(pass_group)
244
+ Bindings.send("initialize_#{pass_group}", @ptr)
245
+ end
246
+ end
247
+
248
+ def init(pass_group)
249
+
250
+ end
251
+ end
208
252
  end
@@ -14,16 +14,14 @@ require 'rltk/cg/bindings'
14
14
  # Classes and Modules #
15
15
  #######################
16
16
 
17
- module RLTK::CG # :nodoc:
17
+ module RLTK::CG
18
18
 
19
19
  # Support functionality for LLVM code generation.
20
20
  module Support
21
21
  # Load a shared library into memory and make its exported symbols
22
22
  # available to execution engines.
23
23
  #
24
- # @LLVMECB
25
- #
26
- # @param [String] lib Path to the shared library to load.
24
+ # @param [String] lib Path to the shared library to load
27
25
  def self.load_library(lib)
28
26
  Bindings.load_library_permanently(lib).to_bool
29
27
  end
@@ -15,20 +15,35 @@ require 'rltk/cg/triple'
15
15
  # Classes and Modules #
16
16
  #######################
17
17
 
18
- module RLTK::CG # :nodoc:
18
+ module RLTK::CG
19
19
 
20
20
  # Class binding for the LLVM Triple class.
21
21
  class Target
22
22
  include BindingClass
23
23
 
24
- # @return [Triple] Triple object for this target.
25
- attr_reader :triple
24
+ #################
25
+ # Class Methods #
26
+ #################
27
+
28
+ # @return [Target] First target in the target list
29
+ def self.first
30
+ @first ||= self.new(Bindings.get_first_target)
31
+ end
26
32
 
27
33
  # @return [Target] Target object for the host architecture.
28
34
  def self.host
29
35
  @host ||= self.new(Triple.host)
30
36
  end
31
37
 
38
+ # @return [Target] Next target in the target list
39
+ def self.next_target(target)
40
+ self.new(Bindings.get_next_target(target))
41
+ end
42
+
43
+ ####################
44
+ # Instance Methods #
45
+ ####################
46
+
32
47
  # Create an object representing a particular code generation target.
33
48
  # You can create a target either from a string or a Triple.
34
49
  #
@@ -36,10 +51,57 @@ module RLTK::CG # :nodoc:
36
51
  def initialize(overloaded)
37
52
  @ptr, @triple =
38
53
  case overloaded
39
- when String then [Bindings.get_target_from_string(overloaded), Triple.new(overloaded)]
40
- when Triple then [Bindings.get_target_from_triple(overloaded), overloaded]
54
+ when String
55
+ [Bindings.get_target_from_name(overloaded), Triple.new(overloaded)]
56
+
57
+ when RLTK::CG::Triple
58
+ ptr = FFI::MemoryPointer.new(:pointer)
59
+ error = FFI::MemoryPointer.new(:pointer)
60
+ status = Bindings.get_target_from_triple(overloaded.to_s, ptr, error)
61
+
62
+ if status.zero?
63
+ [ptr, overloaded]
64
+
65
+ else
66
+ errorp = error.read_pointer
67
+ message = errorp.null? ? 'Unknown' : errorp.read_string
68
+
69
+ error.autorelease = false
70
+
71
+ Bindings.dispose_message(error)
72
+
73
+ raise "Error creating target: #{message}"
74
+ end
75
+
76
+ when RLTK::CG::Bindings::Triple
77
+ [overloaded, nil]
41
78
  end
42
79
  end
80
+
81
+ # @return [Boolean] Whether or not the target has an ASM backend
82
+ def asm_backend?
83
+ Bindings.target_has_asm_backend(@ptr).to_bool
84
+ end
85
+
86
+ # @return [Boolean] Whether or not the target has a JIT
87
+ def jit?
88
+ Bindings.target_has_jit(@ptr).to_bool
89
+ end
90
+
91
+ # @return [Boolean] Whether or not the target has a TargetMachine
92
+ def target_machine?
93
+ Bindings.target_has_target_machine(@ptr).to_bool
94
+ end
95
+
96
+ # @return [String] Description of the target
97
+ def describe
98
+ Bindings.get_target_description(@ptr)
99
+ end
100
+
101
+ # @return [Triple] Triple object for this target
102
+ def triple
103
+ @triple ||= Triple.new(Bindings.get_target_name(@ptr))
104
+ end
43
105
  end
44
106
 
45
107
  # This class represents data about a specific architecture. Currently it
@@ -51,6 +113,16 @@ module RLTK::CG # :nodoc:
51
113
  def initialize(ptr)
52
114
  @ptr = ptr
53
115
  end
116
+
117
+ # Gets the pointer size for this target machine and address space
118
+ # combination.
119
+ #
120
+ # @param [Integer] as Address space
121
+ #
122
+ # @return [Integer] Size of pointer
123
+ def pointer_size(as)
124
+ Bindings.pointer_size_for_as(@ptr, as)
125
+ end
54
126
  end
55
127
 
56
128
  # This class represents a specific architecture that wil be targeted by
@@ -58,18 +130,8 @@ module RLTK::CG # :nodoc:
58
130
  class TargetMachine
59
131
  include BindingClass
60
132
 
61
- # Convert an array of strings representing features of a target
62
- # machine into a single string.
63
- #
64
- # @param [Array<String>] features Strings representing features of a target machine.
65
- #
66
- # @return [String] A single string representing all of the given features.
67
- def self.build_feature_string(features)
68
- strings_ptr = FFI::MemoryPointer.new(:pointer, features.length)
69
- strings_ptr.write_array_of_pointer(features.map { |str| FFI::MemoryPointer.from_string(str) })
70
-
71
- Bindings.build_features_string(strings_ptr, features.length)
72
- end
133
+ # The Proc object called by the garbage collector to free resources used by LLVM.
134
+ CLASS_FINALIZER = Proc.new { |id| Bindings.dispose_target_machine(ptr) if ptr = ObjectSpace._id2ref(id).ptr }
73
135
 
74
136
  # @return [TargetMachine] TargetMachine representation of the host machine.
75
137
  def self.host
@@ -81,20 +143,88 @@ module RLTK::CG # :nodoc:
81
143
  # @see Bindings._enum_reloc_model_
82
144
  # @see Bindings._enum_code_model_
83
145
  #
84
- # @param [Target] target Target description.
85
- # @param [String] mcpu Specific CPU type to target.
86
- # @param [Array<String>, String] features Features present for this target machine.
87
- # @param [Symbol] reloc_model Code relocation model.
88
- # @param [Symbol] code_model Code generation model.
89
- def initialize(target, mcpu = '', features = '', reloc_model = :default, code_model = :default)
90
- # Just to make things easier on developers.
91
- reloc_model = :default_rmodel if reloc_model == :default
92
- code_model = :default_cmodel if code_model == :default
93
-
146
+ # @param [Target] target Target description
147
+ # @param [String] mcpu Specific CPU type to target
148
+ # @param [Array<String>, String] features Features present for this target machine
149
+ # @param [Symbol from _enum_code_gen_opt_level_] opt_level Optimization level
150
+ # @param [Symbol from _enum_reloc_mode_] reloc_mode Code relocation model
151
+ # @param [Symbol from _enum_code_model_] code_model Code generation model
152
+ def initialize(target, mcpu = '', features = '', opt_level = :none, reloc_mode = :default, code_model = :default)
94
153
  # Convert the features parameter if necessary.
95
154
  features = TargetMachine.build_feature_string(features) if features.is_a?(Array)
96
155
 
97
- @ptr = Bindings.create_target_machine(target, target.triple.to_s, mcpu, features, reloc_model, code_model)
156
+ @ptr = Bindings.create_target_machine(target, target.triple.to_s, mcpu, features, opt_level, reloc_mode, code_model)
157
+
158
+ # Define a finalizer to free the memory used by LLVM for
159
+ # this target machine.
160
+ ObjectSpace.define_finalizer(self, CLASS_FINALIZER)
161
+ end
162
+
163
+ # @return [String] Name of the target machine's CPU
164
+ def cpu
165
+ Bindings.get_target_machine_cpu(@ptr)
166
+ end
167
+
168
+ # @return [TargetData]
169
+ def data
170
+ TargetData.new(Bindings.get_target_machine_data(@pt))
171
+ end
172
+
173
+ # Emit assembly or object code for the given module to the file
174
+ # specified.
175
+ #
176
+ # @param [Module] mod Module to emit code for
177
+ # @param [String] file_name File to emit code to
178
+ # @param [:assembly, :object] emit_type Type of code to emit
179
+ #
180
+ # @return [void]
181
+ #
182
+ # @raise LLVM error message if unable to emite code for module
183
+ def emit_module(mod, file_name, emit_type)
184
+ error = FFI::MemoryPointer.new(:pointer)
185
+ status = Bindings.target_machine_emit_to_file(@ptr, mod, file_name, emit_type, error)
186
+
187
+ if not status.zero?
188
+ errorp = error.read_pointer
189
+ message = errorp.null? ? 'Unknown' : errorp.read_string
190
+
191
+ error.autorelease = false
192
+
193
+ Bindings.dispose_message(error)
194
+
195
+ raise "Error emiting code for module: #{message}"
196
+ end
197
+ end
198
+
199
+ # @return [String] Feature string for this target machine
200
+ def feature_string
201
+ Bindings.get_target_machine_feature_string(@ptr)
202
+ end
203
+
204
+ # @return [Target]
205
+ def target
206
+ Target.new(Bindings.get_target_machine_target(@ptr))
207
+ end
208
+
209
+ # @return [Triple]
210
+ def triple
211
+ Triple.new(Bindings.get_target_machine_triple(@ptr))
212
+ end
213
+
214
+ # Set verbose ASM property.
215
+ #
216
+ # @param [Boolean] bool Verbose ASM or not
217
+ #
218
+ # @return [void]
219
+ def verbose_asm=(bool)
220
+ @verbose_asm = bool
221
+
222
+ Bindings.set_target_machine_asm_verbosity(@ptr, bool.to_i)
223
+ end
224
+
225
+ # @return [Boolean] If this target machine should print verbose ASM
226
+ def verbose_asm?
227
+ @verbose_asm ||= false
98
228
  end
99
229
  end
100
230
  end
@@ -14,7 +14,7 @@ require 'rltk/cg/bindings'
14
14
  # Classes and Modules #
15
15
  #######################
16
16
 
17
- module RLTK::CG # :nodoc:
17
+ module RLTK::CG
18
18
 
19
19
  # Class binding for the LLVM Triple class.
20
20
  class Triple
@@ -26,12 +26,12 @@ module RLTK::CG # :nodoc:
26
26
 
27
27
  # @return [Triple] Object representing the host architecture, vendor, OS, and environment.
28
28
  def self.host
29
- @host ||= self.new(Bindings.get_host_triple)
29
+ @host ||= Triple.new(host_string)
30
30
  end
31
-
31
+
32
32
  # @return [String] String representation of the host architecture, vendor, OS, and environment.
33
33
  def self.host_string
34
- @host_string ||= Bindings.get_host_triple_string
34
+ @host_string ||= Bindings.get_default_target_triple
35
35
  end
36
36
 
37
37
  ####################
@@ -43,16 +43,16 @@ module RLTK::CG # :nodoc:
43
43
  #
44
44
  # @param [FFI::Pointer, String] overloaded
45
45
  def initialize(overloaded)
46
- @ptr =
46
+ @ptr, @str =
47
47
  case overloaded
48
- when FFI::Pointer then overloaded
49
- when String then Bindings.triple_create(overloaded)
48
+ when FFI::Pointer then [overloaded, nil]
49
+ when String then [Bindings.triple_create(overloaded), overloaded]
50
50
  end
51
51
  end
52
52
 
53
53
  # @return [String] String representation of this triple.
54
54
  def to_s
55
- Bindings.get_triple_string(@ptr)
55
+ @str ||= Bindings.get_triple_string(@ptr)
56
56
  end
57
57
  end
58
58
  end
data/lib/rltk/cg/type.rb CHANGED
@@ -10,8 +10,10 @@
10
10
  # Standard Library
11
11
  require 'singleton'
12
12
 
13
+ # Gems
14
+ require 'filigree/abstract_class'
15
+
13
16
  # Ruby Language Toolkit
14
- require 'rltk/util/abstract_class'
15
17
  require 'rltk/cg/bindings'
16
18
  require 'rltk/cg/context'
17
19
 
@@ -19,7 +21,7 @@ require 'rltk/cg/context'
19
21
  # Classes and Modules #
20
22
  #######################
21
23
 
22
- module RLTK::CG # :nodoc:
24
+ module RLTK::CG
23
25
 
24
26
  # The Type class and its sub-classes are used to describe the size and
25
27
  # structure of various data objects inside LLVM and how different
@@ -29,7 +31,7 @@ module RLTK::CG # :nodoc:
29
31
  # @abstract Root of the type class hierarchy.
30
32
  class Type
31
33
  include BindingClass
32
- include AbstractClass
34
+ include Filigree::AbstractClass
33
35
 
34
36
  # Instantiate a Type object from a pointer. This function is used
35
37
  # internally, and as a library user you should never have to call it.
@@ -40,6 +42,7 @@ module RLTK::CG # :nodoc:
40
42
  def self.from_ptr(ptr)
41
43
  case Bindings.get_type_kind(ptr)
42
44
  when :array then ArrayType.new(ptr)
45
+ when :half then HalfType.new
43
46
  when :double then DoubleType.new
44
47
  when :float then FloatType.new
45
48
  when :function then FunctionType.new(ptr)
@@ -73,7 +76,7 @@ module RLTK::CG # :nodoc:
73
76
 
74
77
  # @return [NativeInt] Alignment of the type.
75
78
  def allignment
76
- Int64.new(Bindings.align_of(@ptr))
79
+ NativeInt.new(Bindings.align_of(@ptr))
77
80
  end
78
81
 
79
82
  # @return [Context] Context in which this type was created.
@@ -81,6 +84,13 @@ module RLTK::CG # :nodoc:
81
84
  Context.new(Bindings.get_type_context(@ptr))
82
85
  end
83
86
 
87
+ # Dump a string representation of the type to stdout.
88
+ #
89
+ # @return [void]
90
+ def dump
91
+ Bindings.dump_type(@ptr)
92
+ end
93
+
84
94
  # @return [Fixnum] Hashed value of the pointer representing this type.
85
95
  def hash
86
96
  @ptr.address.hash
@@ -97,13 +107,18 @@ module RLTK::CG # :nodoc:
97
107
  def size
98
108
  Int64.new(Bindings.size_of(@ptr))
99
109
  end
110
+
111
+ # @return [String] LLVM IR representation of the type
112
+ def to_s
113
+ Bindings.print_type_to_string(@ptr)
114
+ end
100
115
  end
101
116
 
102
117
  # All types that are used to represent numbers inherit from this class.
103
118
  #
104
119
  # @abstract
105
120
  class NumberType < Type
106
- include AbstractClass
121
+ include Filigree::AbstractClass
107
122
 
108
123
  # @return [Value] The corresponding Value sub-class that is used to represent values of this type.
109
124
  def self.value_class
@@ -126,7 +141,7 @@ module RLTK::CG # :nodoc:
126
141
  #
127
142
  # @abstract
128
143
  class BasicIntType < NumberType
129
- include AbstractClass
144
+ include Filigree::AbstractClass
130
145
 
131
146
  # @return [Integer] Number of bits used to represent an integer type.
132
147
  def width
@@ -165,7 +180,7 @@ module RLTK::CG # :nodoc:
165
180
  #
166
181
  # @abstract
167
182
  class SimpleIntType < BasicIntType
168
- include AbstractClass
183
+ include Filigree::AbstractClass
169
184
  include Singleton
170
185
  end
171
186
 
@@ -173,7 +188,7 @@ module RLTK::CG # :nodoc:
173
188
  #
174
189
  # @abstract
175
190
  class RealType < NumberType
176
- include AbstractClass
191
+ include Filigree::AbstractClass
177
192
  include Singleton
178
193
  end
179
194
 
@@ -181,48 +196,77 @@ module RLTK::CG # :nodoc:
181
196
  #
182
197
  # @abstract
183
198
  class SimpleType < Type
184
- include AbstractClass
199
+ include Filigree::AbstractClass
185
200
  include Singleton
186
201
  end
187
202
 
188
203
  # 1 bit integer type. Often used to represent Boolean values.
189
- class Int1Type < SimpleIntType; end
204
+ class Int1Type < SimpleIntType; end
190
205
  # 8 bit (1 byte) integer type.
191
- class Int8Type < SimpleIntType; end
206
+ class Int8Type < SimpleIntType; end
192
207
  # 16 bit (2 byte) integer type.
193
- class Int16Type < SimpleIntType; end
208
+ class Int16Type < SimpleIntType; end
194
209
  # 32 bit (4 byte) integer type.
195
- class Int32Type < SimpleIntType; end
210
+ class Int32Type < SimpleIntType; end
196
211
  # 64 bit (8 byte) integer type.
197
- class Int64Type < SimpleIntType; end
212
+ class Int64Type < SimpleIntType; end
213
+
214
+ # Integer the same size as a native pointer.
215
+ class IntPtr < SimpleIntType
216
+ # Create an integer that is the same size as a pointer on the target
217
+ # machine. Additionally, an address space and a context may be
218
+ # provided.
219
+ #
220
+ # @param [TargetData] target_data Data on compilation target
221
+ # @param [Integer] addr_space Target address space
222
+ # @param [Context] context Context in which to get the type
223
+ def initialize(target_data, addr_space = nil, context = nil)
224
+ call = 'int_type'
225
+ args = [target_data]
226
+
227
+ if addr_space
228
+ call += '_for_as'
229
+ args << addr_space
230
+ end
231
+
232
+ if context
233
+ call += '_in_context'
234
+ args << context
235
+ end
236
+
237
+ Bindings.send(call.to_s, *args)
238
+ end
239
+ end
198
240
 
199
241
  # The native integer type on the current (not the target) platform.
200
242
  NativeIntType = RLTK::CG.const_get("Int#{FFI.type_size(:int) * 8}Type")
201
243
 
244
+ # A 16-bit floating point number type.
245
+ class HalfType < RealType; end
202
246
  # A double precision floating point number type.
203
- class DoubleType < RealType; end
247
+ class DoubleType < RealType; end
204
248
  # A single precision floating point number type.
205
- class FloatType < RealType; end
249
+ class FloatType < RealType; end
206
250
  # A 128 bit (16 byte) floating point number type.
207
- class FP128Type < RealType; end
251
+ class FP128Type < RealType; end
208
252
  # A 128 bit (16 byte) floating point number type for the PPC architecture.
209
- class PPCFP128Type < RealType; end
253
+ class PPCFP128Type < RealType; end
210
254
  # A 80 bit (10 byte) floating point number type for the x86 architecture.
211
- class X86FP80Type < RealType; end
255
+ class X86FP80Type < RealType; end
212
256
 
213
257
  # A type for x86 MMX instructions.
214
- class X86MMXType < SimpleType; end
258
+ class X86MMXType < SimpleType; end
215
259
 
216
260
  # A type used in representing void pointers and functions that return no values.
217
- class VoidType < SimpleType; end
261
+ class VoidType < SimpleType; end
218
262
  # A type used to represent labels in LLVM IR.
219
- class LabelType < SimpleType; end
263
+ class LabelType < SimpleType; end
220
264
 
221
265
  # The common ancestor for array, pointer, and struct types.
222
266
  #
223
267
  # @abstract
224
268
  class AggregateType < Type
225
- include AbstractClass
269
+ include Filigree::AbstractClass
226
270
  end
227
271
 
228
272
  # {ArrayType} and {PointerType} inherit from this class so they can share
@@ -230,7 +274,7 @@ module RLTK::CG # :nodoc:
230
274
  #
231
275
  # @abstract
232
276
  class SimpleAggregateType < AggregateType
233
- include AbstractClass
277
+ include Filigree::AbstractClass
234
278
 
235
279
  # Used to initialize {ArrayType ArrayTypes} and {PointerType PointerTypes}.
236
280
  #
@@ -376,7 +420,7 @@ module RLTK::CG # :nodoc:
376
420
  if name
377
421
  @name = check_type(name, String, 'name')
378
422
 
379
- returning Bindings.struct_create_named(Context.global, @name) do |ptr|
423
+ Bindings.struct_create_named(Context.global, @name).tap do |ptr|
380
424
  Bindings.struct_set_body(ptr, el_types_ptr, @element_types.length, packed.to_i) unless @element_types.empty?
381
425
  end
382
426