ruby-llvm 13.0.0 → 13.0.1

Sign up to get free protection for your applications and to get access to all the features.
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