ruby-llvm 13.0.0 → 13.0.1

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.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/ext/ruby-llvm-support/Rakefile +2 -0
  3. data/lib/llvm/analysis.rb +2 -0
  4. data/lib/llvm/core/bitcode.rb +2 -0
  5. data/lib/llvm/core/builder.rb +2 -0
  6. data/lib/llvm/core/context.rb +2 -0
  7. data/lib/llvm/core/module.rb +2 -0
  8. data/lib/llvm/core/pass_manager.rb +2 -0
  9. data/lib/llvm/core/type.rb +7 -0
  10. data/lib/llvm/core/value.rb +16 -0
  11. data/lib/llvm/core.rb +2 -0
  12. data/lib/llvm/execution_engine.rb +2 -0
  13. data/lib/llvm/linker.rb +2 -0
  14. data/lib/llvm/support.rb +2 -0
  15. data/lib/llvm/target.rb +2 -0
  16. data/lib/llvm/transforms/builder.rb +2 -0
  17. data/lib/llvm/transforms/ipo.rb +2 -0
  18. data/lib/llvm/transforms/scalar.rb +12 -0
  19. data/lib/llvm/transforms/vectorize.rb +2 -0
  20. data/lib/llvm/version.rb +5 -3
  21. data/lib/llvm.rb +2 -0
  22. data/test/array_test.rb +2 -0
  23. data/test/basic_block_test.rb +2 -0
  24. data/test/binary_operations_test.rb +2 -0
  25. data/test/bitcode_test.rb +2 -0
  26. data/test/branch_test.rb +2 -0
  27. data/test/call_test.rb +2 -0
  28. data/test/comparisons_test.rb +2 -0
  29. data/test/conversions_test.rb +2 -0
  30. data/test/double_test.rb +2 -0
  31. data/test/equality_test.rb +2 -0
  32. data/test/function_test.rb +2 -0
  33. data/test/generic_value_test.rb +2 -0
  34. data/test/instruction_test.rb +2 -0
  35. data/test/integer_test.rb +28 -0
  36. data/test/ipo_test.rb +2 -0
  37. data/test/linker_test.rb +2 -0
  38. data/test/mcjit_test.rb +2 -0
  39. data/test/memory_access_test.rb +2 -0
  40. data/test/module_test.rb +2 -0
  41. data/test/parameter_collection_test.rb +2 -0
  42. data/test/pass_manager_builder_test.rb +21 -0
  43. data/test/phi_test.rb +2 -0
  44. data/test/select_test.rb +2 -0
  45. data/test/struct_test.rb +2 -0
  46. data/test/target_test.rb +15 -3
  47. data/test/test_helper.rb +2 -0
  48. data/test/type_test.rb +47 -0
  49. data/test/vector_test.rb +2 -0
  50. metadata +6 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 93a0f0ec49145c009677352d8765f8c1f79d4aa0b88aa7c17bb005d4b18f44c1
4
- data.tar.gz: '03604842f13d9f1108e36ff5f2089884fe3673f43a08866d8c73bb5135f05cb8'
3
+ metadata.gz: e4728b4463e1ffaea0e8b00c976923fe77404b01c55ff3c25b015aa2fef5decf
4
+ data.tar.gz: 35e6017a7035f29b9a39cfd6cbf18116a181f9e2706b12c0318a251525250bc7
5
5
  SHA512:
6
- metadata.gz: 0ef8e20027e12ea46c5f4764fe50f4e7e07aab58579e84c2692ad323c5fb2c6b77c329bc97ae742d226eba0c345c5b9e774ef8381f8336db8927d4d678159691
7
- data.tar.gz: 29c3b9e27042468d2db9d6bf0745675390d665824fd0149e9c55617c6d4da1627635576ced6722e8638fd3061b46127b49aaf449ad5e957105a903409d23dd06
6
+ metadata.gz: 5353f3dfc22fcaa701ffa5bc70d5987e03a678881ad03a530ed99f4baada579396c9d8720a999cb9fff9fb93d4efad13fb2cd4ed6486b9a0658f54ad5676f663
7
+ data.tar.gz: 95cbae2bfda937b9d8eb1a821083bc04858a3e19942ffbf8c195671f51f817d17be2829c51015e3bcd9b699eb467e9dca127e0ff0bb743a2f76288180014846d
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rubygems'
2
4
  require 'rake/clean'
3
5
  require 'ffi'
data/lib/llvm/analysis.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'llvm'
2
4
  require 'llvm/core'
3
5
  require 'llvm/target'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'llvm/core/bitcode_ffi'
2
4
 
3
5
  module LLVM
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LLVM
2
4
  class Builder
3
5
  # Important: Call #dispose to free backend memory after use.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LLVM
2
4
  class Context
3
5
  def initialize(ptr = nil)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LLVM
2
4
  class Module
3
5
  include PointerIdentity
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LLVM
2
4
  # The PassManager runs a queue of passes on a module. See
3
5
  # http://llvm.org/docs/Passes.html for the list of available passes.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LLVM
2
4
  class Type
3
5
  include PointerIdentity
@@ -59,6 +61,11 @@ module LLVM
59
61
  C.dump_type(self)
60
62
  end
61
63
 
64
+ # Build string of LLVM type representation.
65
+ def to_s
66
+ C.print_type_to_string(self)
67
+ end
68
+
62
69
  # Creates an array type of Type with the given size.
63
70
  def self.array(ty, sz = 0)
64
71
  from_ptr(C.array_type(LLVM::Type(ty), sz), :array)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LLVM
2
4
  class Value
3
5
  include PointerIdentity
@@ -40,6 +42,10 @@ module LLVM
40
42
  C.dump_value(self)
41
43
  end
42
44
 
45
+ def to_s
46
+ C.print_value_to_string(self)
47
+ end
48
+
43
49
  # Returns whether the value is constant.
44
50
  def constant?
45
51
  case C.is_constant(self)
@@ -483,6 +489,16 @@ module LLVM
483
489
  def int_to_ptr(type)
484
490
  ConstantExpr.from_ptr(C.const_int_to_ptr(self, type))
485
491
  end
492
+
493
+ # constant zext
494
+ def zext(type)
495
+ self.class.from_ptr(C.const_z_ext(self, type))
496
+ end
497
+
498
+ # constant sext
499
+ def sext(type)
500
+ self.class.from_ptr(C.const_s_ext(self, type))
501
+ end
486
502
  end
487
503
 
488
504
  def self.const_missing(const)
data/lib/llvm/core.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'llvm'
2
4
  require 'llvm/core_ffi'
3
5
  require 'llvm/support'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'llvm'
2
4
  require 'llvm/core'
3
5
  require 'llvm/target'
data/lib/llvm/linker.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'llvm'
2
4
  require 'llvm/core'
3
5
  require 'llvm/linker_ffi'
data/lib/llvm/support.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'llvm/core_ffi'
2
4
 
3
5
  module LLVM
data/lib/llvm/target.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'llvm'
2
4
  require 'llvm/core'
3
5
  require 'llvm/target_ffi'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'llvm'
2
4
  require 'llvm/core'
3
5
  require 'llvm/transforms/builder_ffi'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Interprocedural optimization (IPO)
2
4
  require 'llvm'
3
5
  require 'llvm/core'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'llvm'
2
4
  require 'llvm/core'
3
5
  require 'llvm/transforms/scalar_ffi'
@@ -148,5 +150,15 @@ module LLVM
148
150
  def basicaa!
149
151
  C.add_basic_alias_analysis_pass(self)
150
152
  end
153
+
154
+ # @LLVMpass mergefunc
155
+ def mergefunc!
156
+ C.add_merge_functions_pass(self)
157
+ end
158
+
159
+ end
160
+
161
+ module C
162
+ attach_function :add_merge_functions_pass, :LLVMAddMergeFunctionsPass, [:pointer], :void
151
163
  end
152
164
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'llvm'
2
4
  require 'llvm/core'
3
5
  require 'llvm/transforms/vectorize_ffi'
data/lib/llvm/version.rb CHANGED
@@ -1,5 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LLVM
2
- LLVM_VERSION = "13".freeze
3
- LLVM_REQUIRED_VERSION = "13.0".freeze
4
- RUBY_LLVM_VERSION = "13.0.0".freeze
4
+ LLVM_VERSION = "13"
5
+ LLVM_REQUIRED_VERSION = "13.0"
6
+ RUBY_LLVM_VERSION = "13.0.1"
5
7
  end
data/lib/llvm.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'ffi'
2
4
 
3
5
  module LLVM
data/test/array_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class ArrayTestCase < Minitest::Test
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class BasicBlockTestCase < Minitest::Test
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class BasicOperationsTestCase < Minitest::Test
data/test/bitcode_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
  require "tempfile"
3
5
 
data/test/branch_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class BranchTestCase < Minitest::Test
data/test/call_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class CallTestCase < Minitest::Test
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class ComparisonsTestCase < Minitest::Test
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class ConversionsTestCase < Minitest::Test
data/test/double_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class DoubleTestCase < Minitest::Test
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
  require "llvm/core"
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
  require "llvm/core"
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class GenericValueTestCase < Minitest::Test
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class InstructionTestCase < Minitest::Test
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class IntegerTestCase < Minitest::Test
6
+
7
+ def test_const_zext
8
+ assert i = LLVM::Int8.from_i(-1)
9
+ assert_equal 'i8 -1', i.to_s
10
+ assert_equal :integer, i.type.kind
11
+ assert_equal 8, i.type.width
12
+ assert zext = i.zext(LLVM::Int64)
13
+ assert_equal 'i64 255', zext.to_s
14
+ assert_equal :integer, zext.type.kind
15
+ assert_equal 64, zext.type.width
16
+ end
17
+
18
+ def test_const_sext
19
+ assert i = LLVM::Int8.from_i(-1)
20
+ assert_equal 'i8 -1', i.to_s
21
+ assert_equal :integer, i.type.kind
22
+ assert_equal 8, i.type.width
23
+ assert sext = i.sext(LLVM::Int64)
24
+ assert_equal 'i64 -1', sext.to_s
25
+ assert_equal :integer, sext.type.kind
26
+ assert_equal 64, sext.type.width
27
+ end
28
+ end
data/test/ipo_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
  require "llvm/core"
3
5
  require 'llvm/transforms/ipo'
data/test/linker_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
  require 'llvm/core'
3
5
  require 'llvm/linker'
data/test/mcjit_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
 
3
5
  class MCJITTestCase < Minitest::Test
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class MemoryAccessTestCase < Minitest::Test
data/test/module_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
  require "tempfile"
3
5
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class ParameterCollectionTestCase < Minitest::Test
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'test_helper'
2
4
  require 'llvm/config'
3
5
  require 'llvm/transforms/builder'
@@ -50,4 +52,23 @@ class PassManagerBuilderTest < Minitest::Test
50
52
  @builder.build_with_lto(@pass_manager, false, 0)
51
53
  end
52
54
  end
55
+
56
+ PASSES = [
57
+ 'always_inline!',
58
+ 'adce!',
59
+ 'tailcallelim!',
60
+ 'fun_attrs!',
61
+ 'mergefunc!',
62
+ ].freeze
63
+
64
+ describe "PassManager Passes" do
65
+ before do
66
+ assert @pass_manager = LLVM::PassManager.new
67
+ end
68
+ PASSES.each do |pass|
69
+ it "should return '#{pass}'" do
70
+ assert_nil @pass_manager.send(pass)
71
+ end
72
+ end
73
+ end
53
74
  end
data/test/phi_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class PhiTest < Minitest::Test
data/test/select_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class SelectTestCase < Minitest::Test
data/test/struct_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class StructTestCase < Minitest::Test
data/test/target_test.rb CHANGED
@@ -1,4 +1,5 @@
1
1
  # encoding: ascii-8bit
2
+ # frozen_string_literal: true
2
3
 
3
4
  require "test_helper"
4
5
  require 'tempfile'
@@ -71,13 +72,24 @@ class TargetTestCase < Minitest::Test
71
72
 
72
73
  Tempfile.open('emit') do |tmp|
73
74
  mach.emit(mod, tmp.path)
74
- assert_match(/xorl\t%eax, %eax/, tmp.read)
75
+ data = tmp.read
76
+ assert_match(/xorl\t%eax, %eax/, data)
77
+ assert_equal 218, data.length
75
78
  end
76
79
 
77
- skip "This changes from LLVM 11 to 13"
80
+ # despite the above test, in LLVM <= 11 the objdump output was:
81
+ # 00000000 <main>:
82
+ # 0: 66 31 c0 xor %ax,%ax
83
+ # 3: 66 c3 retw
84
+ # In LLVM 13, the objdump output is:
85
+ # 00000000 <main>:
86
+ # 0: 31 c0 xor %eax,%eax
87
+ # 2: c3 ret
78
88
  Tempfile.open('emit') do |tmp|
79
89
  mach.emit(mod, tmp.path, :object)
80
- assert_match(/\x66\x31\xc0/, File.read(tmp.path, mode: 'rb'))
90
+ data = File.read(tmp.path, mode: 'rb')
91
+ assert_match(/\x31\xc0\xc3/, data)
92
+ assert_equal 528, data.length
81
93
  end
82
94
  end
83
95
 
data/test/test_helper.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
2
4
 
3
5
  begin
data/test/type_test.rb CHANGED
@@ -1,7 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class TypeTestCase < Minitest::Test
4
6
 
7
+ extend MiniTest::Spec::DSL
8
+
5
9
  def test_element_type
6
10
  pointer = LLVM.Pointer(LLVM::Int32.type)
7
11
  pointee = pointer.element_type
@@ -12,4 +16,47 @@ class TypeTestCase < Minitest::Test
12
16
  assert_nil pointee.element_type
13
17
  end
14
18
 
19
+ TO_S_TESTS = [
20
+ [LLVM.Struct(LLVM::Int32, LLVM::Int32), '{ i32, i32 }'],
21
+ [LLVM.Struct(LLVM::Int32, LLVM::Int32, "s1"), '%s1 = type { i32, i32 }'],
22
+ [LLVM::Type.struct([LLVM::Int32, LLVM::Int32], true), '<{ i32, i32 }>'],
23
+ [LLVM::Type.struct([LLVM::Int32, LLVM::Int32], true, "s2"), '%s2 = type <{ i32, i32 }>'],
24
+
25
+ [LLVM.Array(LLVM::Int8), '[0 x i8]'],
26
+ [LLVM.Array(LLVM::Int8, 42), '[42 x i8]'],
27
+ [LLVM::Type.array(LLVM::Int1), '[0 x i1]'],
28
+ [LLVM::Type.array(LLVM::Int1, 42), '[42 x i1]'],
29
+
30
+ [LLVM.Vector(LLVM::Int8, 42), '<42 x i8>'],
31
+ [LLVM::Type.vector(LLVM::Int1, 42), '<42 x i1>'],
32
+
33
+ [LLVM.Void, 'void'],
34
+ [LLVM::Type.void, 'void'],
35
+
36
+ [LLVM.Pointer(LLVM::Int8), 'i8*'],
37
+ [LLVM::Type.pointer(LLVM::Int1), 'i1*'],
38
+
39
+ [LLVM.Function([LLVM::Int8], LLVM.Void), 'void (i8)'],
40
+ [LLVM.Function([LLVM::Int8], LLVM::Int8), 'i8 (i8)'],
41
+ [LLVM.Function([], LLVM::Int8), 'i8 ()'],
42
+ [LLVM.Function([], LLVM.Void), 'void ()'],
43
+ [LLVM::Type.function([LLVM::Int1], LLVM.Void), 'void (i1)'],
44
+ [LLVM::Type.function([LLVM::Int1], LLVM::Int1), 'i1 (i1)'],
45
+ [LLVM::Type.function([], LLVM::Int1), 'i1 ()'],
46
+ [LLVM::Type.function([], LLVM.Void), 'void ()'],
47
+ ].freeze
48
+
49
+ describe "LLVM::Type#to_s" do
50
+ TO_S_TESTS.each do |(type, string)|
51
+ it "should return '#{string}'" do
52
+ assert type.is_a?(LLVM::Type)
53
+ assert_equal string, type.to_s
54
+ end
55
+ end
56
+
57
+ it 'should have 22 dynamic tests' do
58
+ assert_equal 22, TO_S_TESTS.size
59
+ end
60
+ end
61
+
15
62
  end
data/test/vector_test.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "test_helper"
2
4
 
3
5
  class VectorTestCase < Minitest::Test
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-llvm
3
3
  version: !ruby/object:Gem::Version
4
- version: 13.0.0
4
+ version: 13.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jesse Johnson
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-10-21 00:00:00.000000000 Z
12
+ date: 2021-12-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: ffi
@@ -17,14 +17,14 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: 1.13.1
20
+ version: '1.13'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: 1.13.1
27
+ version: '1.13'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: rake
30
30
  requirement: !ruby/object:Gem::Requirement
@@ -216,6 +216,7 @@ files:
216
216
  - test/function_test.rb
217
217
  - test/generic_value_test.rb
218
218
  - test/instruction_test.rb
219
+ - test/integer_test.rb
219
220
  - test/ipo_test.rb
220
221
  - test/linker_test.rb
221
222
  - test/mcjit_test.rb
@@ -279,4 +280,5 @@ test_files:
279
280
  - test/linker_test.rb
280
281
  - test/generic_value_test.rb
281
282
  - test/phi_test.rb
283
+ - test/integer_test.rb
282
284
  - test/mcjit_test.rb