ruby-llvm 3.5.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 (62) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +21 -4
  3. data/ext/ruby-llvm-support/Rakefile +17 -6
  4. data/lib/llvm/analysis.rb +2 -0
  5. data/lib/llvm/analysis_ffi.rb +27 -28
  6. data/lib/llvm/config.rb +4 -4
  7. data/lib/llvm/core/bitcode.rb +12 -10
  8. data/lib/llvm/core/bitcode_ffi.rb +89 -65
  9. data/lib/llvm/core/builder.rb +4 -3
  10. data/lib/llvm/core/context.rb +3 -1
  11. data/lib/llvm/core/module.rb +2 -0
  12. data/lib/llvm/core/pass_manager.rb +6 -2
  13. data/lib/llvm/core/type.rb +9 -2
  14. data/lib/llvm/core/value.rb +154 -24
  15. data/lib/llvm/core.rb +47 -2
  16. data/lib/llvm/core_ffi.rb +3863 -3730
  17. data/lib/llvm/execution_engine.rb +39 -35
  18. data/lib/llvm/execution_engine_ffi.rb +238 -276
  19. data/lib/llvm/linker.rb +3 -14
  20. data/lib/llvm/linker_ffi.rb +22 -26
  21. data/lib/llvm/support.rb +2 -0
  22. data/lib/llvm/target.rb +11 -15
  23. data/lib/llvm/target_ffi.rb +301 -293
  24. data/lib/llvm/transforms/builder.rb +3 -1
  25. data/lib/llvm/transforms/builder_ffi.rb +57 -58
  26. data/lib/llvm/transforms/ipo.rb +3 -1
  27. data/lib/llvm/transforms/ipo_ffi.rb +59 -60
  28. data/lib/llvm/transforms/scalar.rb +12 -0
  29. data/lib/llvm/transforms/scalar_ffi.rb +199 -143
  30. data/lib/llvm/transforms/vectorize.rb +2 -0
  31. data/lib/llvm/transforms/vectorize_ffi.rb +15 -16
  32. data/lib/llvm/version.rb +5 -2
  33. data/lib/llvm.rb +2 -0
  34. data/test/array_test.rb +2 -0
  35. data/test/basic_block_test.rb +2 -1
  36. data/test/binary_operations_test.rb +2 -0
  37. data/test/bitcode_test.rb +3 -2
  38. data/test/branch_test.rb +2 -0
  39. data/test/call_test.rb +3 -1
  40. data/test/comparisons_test.rb +2 -0
  41. data/test/conversions_test.rb +2 -0
  42. data/test/double_test.rb +10 -7
  43. data/test/equality_test.rb +4 -4
  44. data/test/function_test.rb +29 -0
  45. data/test/generic_value_test.rb +3 -1
  46. data/test/instruction_test.rb +2 -2
  47. data/test/integer_test.rb +28 -0
  48. data/test/ipo_test.rb +3 -1
  49. data/test/linker_test.rb +2 -9
  50. data/test/mcjit_test.rb +11 -3
  51. data/test/memory_access_test.rb +2 -0
  52. data/test/module_test.rb +18 -1
  53. data/test/parameter_collection_test.rb +2 -0
  54. data/test/pass_manager_builder_test.rb +22 -2
  55. data/test/phi_test.rb +2 -0
  56. data/test/select_test.rb +2 -0
  57. data/test/struct_test.rb +2 -0
  58. data/test/target_test.rb +16 -20
  59. data/test/test_helper.rb +6 -1
  60. data/test/type_test.rb +47 -0
  61. data/test/vector_test.rb +2 -0
  62. metadata +105 -40
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: e559929d919c913ffacaef820430b37093a23adc
4
- data.tar.gz: d98b42343be29f103dbbb9f518cc304542d0fdff
2
+ SHA256:
3
+ metadata.gz: e4728b4463e1ffaea0e8b00c976923fe77404b01c55ff3c25b015aa2fef5decf
4
+ data.tar.gz: 35e6017a7035f29b9a39cfd6cbf18116a181f9e2706b12c0318a251525250bc7
5
5
  SHA512:
6
- metadata.gz: 3ad54d41292618fb2c48a56b89812e97ce66fd4a8708858d5137ac7064721fbe339eefe3c938f57af1c596acc8f019ff278f9e62d3a6e259e638cbd7dfcdd029
7
- data.tar.gz: 2743c5a6ef7e374eb158f436d01ca39f1f0dd5f218957060f57fb54d5d205f14322ffc2957b39f4cf2f60e78feefd5cb314723fb11012d76885b0c001beecf6e
6
+ metadata.gz: 5353f3dfc22fcaa701ffa5bc70d5987e03a678881ad03a530ed99f4baada579396c9d8720a999cb9fff9fb93d4efad13fb2cd4ed6486b9a0658f54ad5676f663
7
+ data.tar.gz: 95cbae2bfda937b9d8eb1a821083bc04858a3e19942ffbf8c195671f51f817d17be2829c51015e3bcd9b699eb467e9dca127e0ff0bb743a2f76288180014846d
data/README.md CHANGED
@@ -1,3 +1,7 @@
1
+ [![Known Vulnerabilities](https://snyk.io/test/github/ruby-llvm/ruby-llvm/badge.svg)](https://snyk.io/test/github/ruby-llvm/ruby-llvm)
2
+ [![Code Climate Maintainability](https://codeclimate.com/github/ruby-llvm/ruby-llvm/badges/gpa.svg)](https://codeclimate.com/github/ruby-llvm/ruby-llvm)
3
+ [![Code Climate Issue Count](https://codeclimate.com/github/ruby-llvm/ruby-llvm/badges/issue_count.svg)](https://codeclimate.com/github/ruby-llvm/ruby-llvm/issues)
4
+
1
5
  Ruby-LLVM
2
6
  =========
3
7
 
@@ -7,10 +11,10 @@ library. LLVM allows users to create just-in-time (JIT) compilers, ahead-of-time
7
11
  bindings can also be used to speed up Ruby code by compiling and loading
8
12
  computationally intensive algorithms on the fly.
9
13
 
10
- Requirements
11
- ------------
12
- * LLVM 3.4, including libLLVM-3.4 (compile LLVM with --enable-shared).
13
- * In order to ensure the usability of JIT features (i.e. create_jit_compiler), compile LLVM with --enable-jit as well.
14
+ Current version
15
+ ---------------
16
+
17
+ This library currently binds to LLVM-13 (specifically llvm-c 13).
14
18
 
15
19
  About version numbers
16
20
  ---------------------
@@ -20,13 +24,26 @@ major and minor version of LLVM. The third digit refers to the ruby-llvm
20
24
  release itself. Because LLVM's api changes often, this coupling between
21
25
  LLVM and ruby-llvm versions is useful.
22
26
 
27
+ Debian/Ubuntu
28
+ -------------
29
+
30
+ [LLVM Debian/Ubuntu Packages](https://apt.llvm.org/)
31
+
23
32
  Homebrew
24
33
  --------
34
+
25
35
  LLVM can be installed with Homebrew by executing `brew install llvm --shared`
26
36
 
37
+ Source and other binaries
38
+ -------------------------
39
+
40
+ * [LLVM Download Page](https://releases.llvm.org/download.html)
41
+ * If compiling from source the --enable-shared and --enable-jit flags may be needed.
42
+
27
43
  See Also
28
44
  --------
29
45
  * [The LLVM project](http://llvm.org)
46
+ * [Mirror of llvm-c on github](https://github.com/llvm-mirror/llvm/tree/master/include/llvm-c)
30
47
  * [ffi-gen](https://github.com/neelance/ffi-gen) – Generate
31
48
  [FFI](https://github.com/ffi/ffi) bindings with LLVM and Clang
32
49
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rubygems'
2
4
  require 'rake/clean'
3
5
  require 'ffi'
@@ -21,7 +23,7 @@ def check_for(what, variants, env_var)
21
23
  if result
22
24
  result
23
25
  else
24
- raise RuntimeError, "Cannot find #{what}: tried #{variants}"
26
+ raise "Cannot find #{what}: tried #{variants}"
25
27
  end
26
28
  end
27
29
 
@@ -34,7 +36,7 @@ def find_llvm_config
34
36
  actual_version = `#{llvm_config} --version`.strip
35
37
  actual_maj, actual_min, _ = actual_version.split('.')
36
38
 
37
- required_maj, required_min = LLVM_VERSION.split('.')
39
+ required_maj, required_min = LLVM_REQUIRED_VERSION.split('.')
38
40
 
39
41
  actual_maj == required_maj && actual_min == required_min
40
42
  rescue Errno::ENOENT
@@ -54,7 +56,16 @@ LLVM_CONFIG = find_llvm_config
54
56
  CXX = find_cxx
55
57
 
56
58
  def invoke_llvm_config(options)
57
- `#{LLVM_CONFIG} #{options}`.gsub("\n", " ")
59
+ `#{LLVM_CONFIG} #{options}`.tr("\n", " ")
60
+ end
61
+
62
+ def llvm_lib_name
63
+ lib_dir = invoke_llvm_config('--libdir').strip
64
+ lib_name = 'LLVM'
65
+ versioned_lib_name = "#{lib_name}-#{LLVM_VERSION}"
66
+ versioned_lib_pattern = "lib#{versioned_lib_name}.*"
67
+ versioned_lib_found = Dir.glob(File.join(lib_dir, versioned_lib_pattern)) != []
68
+ versioned_lib_found ? versioned_lib_name : lib_name
58
69
  end
59
70
 
60
71
  SUPPORT_LIB = FFI.map_library_name("RubyLLVMSupport-#{LLVM_VERSION}")
@@ -66,8 +77,8 @@ desc "Build the shared library and config module"
66
77
  task :default => [SUPPORT_LIB, CONFIG_MOD]
67
78
 
68
79
  file SUPPORT_LIB => %w(support.cpp) do |task|
69
- sh "#{CXX} -shared #{task.prerequisites.join(' ')} -lLLVM-#{LLVM_VERSION} " \
70
- "#{invoke_llvm_config('--cxxflags --ldflags')} -o #{SUPPORT_LIB}"
80
+ sh "#{CXX} -shared #{task.prerequisites.join(' ')} -l#{llvm_lib_name} " \
81
+ "#{invoke_llvm_config('--cxxflags --ldflags')} -fPIC -o #{SUPPORT_LIB}"
71
82
  end
72
83
 
73
84
  LLVM_CONFIG_OPTS = [
@@ -76,7 +87,7 @@ LLVM_CONFIG_OPTS = [
76
87
  ['HOST_TARGET', :string, '--host-target'],
77
88
  ['BUILD_MODE', :string, '--build-mode'],
78
89
  ['CFLAGS', :string, '--cflags'],
79
- ]
90
+ ].freeze
80
91
 
81
92
  file CONFIG_MOD do
82
93
  open(CONFIG_MOD, 'w') do |f|
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'
@@ -4,29 +4,29 @@ require 'ffi'
4
4
 
5
5
  module LLVM::C
6
6
  extend FFI::Library
7
- ffi_lib ["libLLVM-3.5.so.1", "LLVM-3.5"]
8
-
7
+ ffi_lib ["libLLVM-13.so.1", "libLLVM.so.13", "LLVM-13"]
8
+
9
9
  def self.attach_function(name, *_)
10
10
  begin; super; rescue FFI::NotFoundError => e
11
11
  (class << self; self; end).class_eval { define_method(name) { |*_| raise e } }
12
12
  end
13
13
  end
14
-
14
+
15
15
  # @defgroup LLVMCAnalysis Analysis
16
16
  # @ingroup LLVMC
17
- #
17
+ #
18
18
  # @{
19
- #
19
+ #
20
20
  # <em>This entry is only for documentation and no real method. The FFI::Enum can be accessed via #enum_type(:verifier_failure_action).</em>
21
- #
21
+ #
22
22
  # === Options:
23
23
  # :abort_process ::
24
- #
24
+ #
25
25
  # :print_message ::
26
26
  # verifier will print to stderr and abort()
27
27
  # :return_status ::
28
28
  # verifier will print to stderr and return 1
29
- #
29
+ #
30
30
  # @method _enum_verifier_failure_action_
31
31
  # @return [Symbol]
32
32
  # @scope class
@@ -35,44 +35,43 @@ module LLVM::C
35
35
  :print_message, 1,
36
36
  :return_status, 2
37
37
  ]
38
-
38
+
39
39
  # Verifies that a module is valid, taking the specified action if not.
40
40
  # Optionally returns a human-readable description of any invalid constructs.
41
41
  # OutMessage must be disposed with LLVMDisposeMessage.
42
- #
42
+ #
43
43
  # @method verify_module(m, action, out_message)
44
- # @param [FFI::Pointer(ModuleRef)] m
45
- # @param [Symbol from _enum_verifier_failure_action_] action
46
- # @param [FFI::Pointer(**CharS)] out_message
47
- # @return [Integer]
44
+ # @param [FFI::Pointer(ModuleRef)] m
45
+ # @param [Symbol from _enum_verifier_failure_action_] action
46
+ # @param [FFI::Pointer(**CharS)] out_message
47
+ # @return [Integer]
48
48
  # @scope class
49
49
  attach_function :verify_module, :LLVMVerifyModule, [:pointer, :verifier_failure_action, :pointer], :int
50
-
50
+
51
51
  # Verifies that a single function is valid, taking the specified action. Useful
52
52
  # for debugging.
53
- #
53
+ #
54
54
  # @method verify_function(fn, action)
55
- # @param [FFI::Pointer(ValueRef)] fn
56
- # @param [Symbol from _enum_verifier_failure_action_] action
57
- # @return [Integer]
55
+ # @param [FFI::Pointer(ValueRef)] fn
56
+ # @param [Symbol from _enum_verifier_failure_action_] action
57
+ # @return [Integer]
58
58
  # @scope class
59
59
  attach_function :verify_function, :LLVMVerifyFunction, [:pointer, :verifier_failure_action], :int
60
-
60
+
61
61
  # Open up a ghostview window that displays the CFG of the current function.
62
62
  # Useful for debugging.
63
- #
63
+ #
64
64
  # @method view_function_cfg(fn)
65
- # @param [FFI::Pointer(ValueRef)] fn
66
- # @return [nil]
65
+ # @param [FFI::Pointer(ValueRef)] fn
66
+ # @return [nil]
67
67
  # @scope class
68
68
  attach_function :view_function_cfg, :LLVMViewFunctionCFG, [:pointer], :void
69
-
69
+
70
70
  # (Not documented)
71
- #
71
+ #
72
72
  # @method view_function_cfg_only(fn)
73
- # @param [FFI::Pointer(ValueRef)] fn
74
- # @return [nil]
73
+ # @param [FFI::Pointer(ValueRef)] fn
74
+ # @return [nil]
75
75
  # @scope class
76
76
  attach_function :view_function_cfg_only, :LLVMViewFunctionCFGOnly, [:pointer], :void
77
-
78
77
  end
data/lib/llvm/config.rb CHANGED
@@ -1,10 +1,10 @@
1
1
  # Generated by ruby-llvm. Please do not change this file by hand.
2
2
  module LLVM
3
3
  module CONFIG
4
- COMPONENTS = ["aarch64", "aarch64asmparser", "aarch64asmprinter", "aarch64codegen", "aarch64desc", "aarch64disassembler", "aarch64info", "aarch64utils", "all", "all-targets", "analysis", "arm", "armasmparser", "armasmprinter", "armcodegen", "armdesc", "armdisassembler", "arminfo", "asmparser", "asmprinter", "bitreader", "bitwriter", "codegen", "core", "cppbackend", "cppbackendcodegen", "cppbackendinfo", "debuginfo", "engine", "executionengine", "hexagon", "hexagonasmprinter", "hexagoncodegen", "hexagondesc", "hexagoninfo", "instcombine", "instrumentation", "interpreter", "ipa", "ipo", "irreader", "jit", "lineeditor", "linker", "lto", "mc", "mcanalysis", "mcdisassembler", "mcjit", "mcparser", "mips", "mipsasmparser", "mipsasmprinter", "mipscodegen", "mipsdesc", "mipsdisassembler", "mipsinfo", "msp430", "msp430asmprinter", "msp430codegen", "msp430desc", "msp430info", "native", "nativecodegen", "nvptx", "nvptxasmprinter", "nvptxcodegen", "nvptxdesc", "nvptxinfo", "objcarcopts", "object", "option", "powerpc", "powerpcasmparser", "powerpcasmprinter", "powerpccodegen", "powerpcdesc", "powerpcdisassembler", "powerpcinfo", "profiledata", "r600", "r600asmprinter", "r600codegen", "r600desc", "r600info", "runtimedyld", "scalaropts", "selectiondag", "sparc", "sparcasmparser", "sparcasmprinter", "sparccodegen", "sparcdesc", "sparcdisassembler", "sparcinfo", "support", "systemz", "systemzasmparser", "systemzasmprinter", "systemzcodegen", "systemzdesc", "systemzdisassembler", "systemzinfo", "tablegen", "target", "transformutils", "vectorize", "x86", "x86asmparser", "x86asmprinter", "x86codegen", "x86desc", "x86disassembler", "x86info", "x86utils", "xcore", "xcoreasmprinter", "xcorecodegen", "xcoredesc", "xcoredisassembler", "xcoreinfo"]
5
- TARGETS_BUILT = ["X86", "Sparc", "PowerPC", "ARM", "AArch64", "Mips", "XCore", "MSP430", "CppBackend", "NVPTX", "Hexagon", "SystemZ", "R600"]
4
+ COMPONENTS = ["aarch64", "aarch64asmparser", "aarch64codegen", "aarch64desc", "aarch64disassembler", "aarch64info", "aarch64utils", "aggressiveinstcombine", "all", "all-targets", "amdgpu", "amdgpuasmparser", "amdgpucodegen", "amdgpudesc", "amdgpudisassembler", "amdgpuinfo", "amdgpuutils", "analysis", "arm", "armasmparser", "armcodegen", "armdesc", "armdisassembler", "arminfo", "armutils", "asmparser", "asmprinter", "avr", "avrasmparser", "avrcodegen", "avrdesc", "avrdisassembler", "avrinfo", "binaryformat", "bitreader", "bitstreamreader", "bitwriter", "bpf", "bpfasmparser", "bpfcodegen", "bpfdesc", "bpfdisassembler", "bpfinfo", "cfguard", "codegen", "core", "coroutines", "coverage", "debuginfocodeview", "debuginfodwarf", "debuginfogsym", "debuginfomsf", "debuginfopdb", "demangle", "dlltooldriver", "dwarflinker", "engine", "executionengine", "frontendopenmp", "fuzzmutate", "globalisel", "hexagon", "hexagonasmparser", "hexagoncodegen", "hexagondesc", "hexagondisassembler", "hexagoninfo", "instcombine", "instrumentation", "interpreter", "ipo", "irreader", "jitlink", "lanai", "lanaiasmparser", "lanaicodegen", "lanaidesc", "lanaidisassembler", "lanaiinfo", "libdriver", "lineeditor", "linker", "lto", "mc", "mca", "mcdisassembler", "mcjit", "mcparser", "mips", "mipsasmparser", "mipscodegen", "mipsdesc", "mipsdisassembler", "mipsinfo", "mirparser", "msp430", "msp430asmparser", "msp430codegen", "msp430desc", "msp430disassembler", "msp430info", "native", "nativecodegen", "nvptx", "nvptxcodegen", "nvptxdesc", "nvptxinfo", "objcarcopts", "object", "objectyaml", "option", "orcerror", "orcjit", "passes", "perfjitevents", "powerpc", "powerpcasmparser", "powerpccodegen", "powerpcdesc", "powerpcdisassembler", "powerpcinfo", "profiledata", "remarks", "riscv", "riscvasmparser", "riscvcodegen", "riscvdesc", "riscvdisassembler", "riscvinfo", "riscvutils", "runtimedyld", "scalaropts", "selectiondag", "sparc", "sparcasmparser", "sparccodegen", "sparcdesc", "sparcdisassembler", "sparcinfo", "support", "symbolize", "systemz", "systemzasmparser", "systemzcodegen", "systemzdesc", "systemzdisassembler", "systemzinfo", "tablegen", "target", "textapi", "transformutils", "vectorize", "webassembly", "webassemblyasmparser", "webassemblycodegen", "webassemblydesc", "webassemblydisassembler", "webassemblyinfo", "windowsmanifest", "x86", "x86asmparser", "x86codegen", "x86desc", "x86disassembler", "x86info", "x86utils", "xcore", "xcorecodegen", "xcoredesc", "xcoredisassembler", "xcoreinfo", "xray"]
5
+ TARGETS_BUILT = ["AArch64", "AMDGPU", "ARM", "BPF", "Hexagon", "Lanai", "Mips", "MSP430", "NVPTX", "PowerPC", "RISCV", "Sparc", "SystemZ", "WebAssembly", "X86", "XCore", "AVR"]
6
6
  HOST_TARGET = "x86_64-pc-linux-gnu "
7
- BUILD_MODE = "Release "
8
- CFLAGS = "-I/usr/lib/llvm-3.5/include -DNDEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -g -O2 -fomit-frame-pointer -fPIC "
7
+ BUILD_MODE = "RelWithDebInfo "
8
+ CFLAGS = "-I/usr/lib/llvm-11/include -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS "
9
9
  end
10
10
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'llvm/core/bitcode_ffi'
2
4
 
3
5
  module LLVM
@@ -9,7 +11,7 @@ module LLVM
9
11
  memory_buffer = case path_or_memory_buffer
10
12
  when MemoryBuffer then path_or_memory_buffer
11
13
  else MemoryBuffer.from_file(path_or_memory_buffer)
12
- end
14
+ end
13
15
  FFI::MemoryPointer.new(:pointer) do |mod_ref|
14
16
  FFI::MemoryPointer.new(:pointer) do |msg_ref|
15
17
  status = C.parse_bitcode(memory_buffer, mod_ref, msg_ref)
@@ -24,15 +26,15 @@ module LLVM
24
26
  # @return [true, false] Success
25
27
  def write_bitcode(path_or_io)
26
28
  status = if path_or_io.respond_to?(:path)
27
- C.write_bitcode_to_file(self, path_or_io.path)
28
- elsif path_or_io.respond_to?(:fileno)
29
- C.write_bitcode_to_fd(self, path_or_io.fileno, 0, 1)
30
- elsif path_or_io.kind_of?(Integer)
31
- C.write_bitcode_to_fd(self, path_or_io, 0, 1)
32
- else
33
- C.write_bitcode_to_file(self, path_or_io.to_str)
34
- end
35
- return status == 0
29
+ C.write_bitcode_to_file(self, path_or_io.path)
30
+ elsif path_or_io.respond_to?(:fileno)
31
+ C.write_bitcode_to_fd(self, path_or_io.fileno, 0, 1)
32
+ elsif path_or_io.kind_of?(Integer)
33
+ C.write_bitcode_to_fd(self, path_or_io, 0, 1)
34
+ else
35
+ C.write_bitcode_to_file(self, path_or_io.to_str)
36
+ end
37
+ status == 0
36
38
  end
37
39
  end
38
40
 
@@ -4,105 +4,129 @@ require 'ffi'
4
4
 
5
5
  module LLVM::C
6
6
  extend FFI::Library
7
- ffi_lib ["libLLVM-3.5.so.1", "LLVM-3.5"]
8
-
7
+ ffi_lib ["libLLVM-13.so.1", "libLLVM.so.13", "LLVM-13"]
8
+
9
9
  def self.attach_function(name, *_)
10
10
  begin; super; rescue FFI::NotFoundError => e
11
11
  (class << self; self; end).class_eval { define_method(name) { |*_| raise e } }
12
12
  end
13
13
  end
14
-
14
+
15
15
  # (Not documented)
16
- #
16
+ #
17
17
  # @method parse_bitcode(mem_buf, out_module, out_message)
18
- # @param [FFI::Pointer(MemoryBufferRef)] mem_buf
19
- # @param [FFI::Pointer(*ModuleRef)] out_module
20
- # @param [FFI::Pointer(**CharS)] out_message
21
- # @return [Integer]
18
+ # @param [FFI::Pointer(MemoryBufferRef)] mem_buf
19
+ # @param [FFI::Pointer(*ModuleRef)] out_module
20
+ # @param [FFI::Pointer(**CharS)] out_message
21
+ # @return [Integer]
22
22
  # @scope class
23
23
  attach_function :parse_bitcode, :LLVMParseBitcode, [:pointer, :pointer, :pointer], :int
24
-
24
+
25
+ # (Not documented)
26
+ #
27
+ # @method parse_bitcode2(mem_buf, out_module)
28
+ # @param [FFI::Pointer(MemoryBufferRef)] mem_buf
29
+ # @param [FFI::Pointer(*ModuleRef)] out_module
30
+ # @return [Integer]
31
+ # @scope class
32
+ attach_function :parse_bitcode2, :LLVMParseBitcode2, [:pointer, :pointer], :int
33
+
25
34
  # (Not documented)
26
- #
35
+ #
27
36
  # @method parse_bitcode_in_context(context_ref, mem_buf, out_module, out_message)
28
- # @param [FFI::Pointer(ContextRef)] context_ref
29
- # @param [FFI::Pointer(MemoryBufferRef)] mem_buf
30
- # @param [FFI::Pointer(*ModuleRef)] out_module
31
- # @param [FFI::Pointer(**CharS)] out_message
32
- # @return [Integer]
37
+ # @param [FFI::Pointer(ContextRef)] context_ref
38
+ # @param [FFI::Pointer(MemoryBufferRef)] mem_buf
39
+ # @param [FFI::Pointer(*ModuleRef)] out_module
40
+ # @param [FFI::Pointer(**CharS)] out_message
41
+ # @return [Integer]
33
42
  # @scope class
34
43
  attach_function :parse_bitcode_in_context, :LLVMParseBitcodeInContext, [:pointer, :pointer, :pointer, :pointer], :int
35
-
44
+
36
45
  # (Not documented)
37
- #
46
+ #
47
+ # @method parse_bitcode_in_context2(context_ref, mem_buf, out_module)
48
+ # @param [FFI::Pointer(ContextRef)] context_ref
49
+ # @param [FFI::Pointer(MemoryBufferRef)] mem_buf
50
+ # @param [FFI::Pointer(*ModuleRef)] out_module
51
+ # @return [Integer]
52
+ # @scope class
53
+ attach_function :parse_bitcode_in_context2, :LLVMParseBitcodeInContext2, [:pointer, :pointer, :pointer], :int
54
+
55
+ # (Not documented)
56
+ #
38
57
  # @method get_bitcode_module_in_context(context_ref, mem_buf, out_m, out_message)
39
- # @param [FFI::Pointer(ContextRef)] context_ref
40
- # @param [FFI::Pointer(MemoryBufferRef)] mem_buf
41
- # @param [FFI::Pointer(*ModuleRef)] out_m
42
- # @param [FFI::Pointer(**CharS)] out_message
43
- # @return [Integer]
58
+ # @param [FFI::Pointer(ContextRef)] context_ref
59
+ # @param [FFI::Pointer(MemoryBufferRef)] mem_buf
60
+ # @param [FFI::Pointer(*ModuleRef)] out_m
61
+ # @param [FFI::Pointer(**CharS)] out_message
62
+ # @return [Integer]
44
63
  # @scope class
45
64
  attach_function :get_bitcode_module_in_context, :LLVMGetBitcodeModuleInContext, [:pointer, :pointer, :pointer, :pointer], :int
46
-
65
+
47
66
  # (Not documented)
48
- #
49
- # @method get_bitcode_module(mem_buf, out_m, out_message)
50
- # @param [FFI::Pointer(MemoryBufferRef)] mem_buf
51
- # @param [FFI::Pointer(*ModuleRef)] out_m
52
- # @param [FFI::Pointer(**CharS)] out_message
53
- # @return [Integer]
67
+ #
68
+ # @method get_bitcode_module_in_context2(context_ref, mem_buf, out_m)
69
+ # @param [FFI::Pointer(ContextRef)] context_ref
70
+ # @param [FFI::Pointer(MemoryBufferRef)] mem_buf
71
+ # @param [FFI::Pointer(*ModuleRef)] out_m
72
+ # @return [Integer]
54
73
  # @scope class
55
- attach_function :get_bitcode_module, :LLVMGetBitcodeModule, [:pointer, :pointer, :pointer], :int
56
-
74
+ attach_function :get_bitcode_module_in_context2, :LLVMGetBitcodeModuleInContext2, [:pointer, :pointer, :pointer], :int
75
+
57
76
  # (Not documented)
58
- #
59
- # @method get_bitcode_module_provider_in_context(context_ref, mem_buf, out_mp, out_message)
60
- # @param [FFI::Pointer(ContextRef)] context_ref
61
- # @param [FFI::Pointer(MemoryBufferRef)] mem_buf
62
- # @param [FFI::Pointer(*ModuleProviderRef)] out_mp
63
- # @param [FFI::Pointer(**CharS)] out_message
64
- # @return [Integer]
77
+ #
78
+ # @method get_bitcode_module(mem_buf, out_m, out_message)
79
+ # @param [FFI::Pointer(MemoryBufferRef)] mem_buf
80
+ # @param [FFI::Pointer(*ModuleRef)] out_m
81
+ # @param [FFI::Pointer(**CharS)] out_message
82
+ # @return [Integer]
65
83
  # @scope class
66
- attach_function :get_bitcode_module_provider_in_context, :LLVMGetBitcodeModuleProviderInContext, [:pointer, :pointer, :pointer, :pointer], :int
67
-
84
+ attach_function :get_bitcode_module, :LLVMGetBitcodeModule, [:pointer, :pointer, :pointer], :int
85
+
68
86
  # (Not documented)
69
- #
70
- # @method get_bitcode_module_provider(mem_buf, out_mp, out_message)
71
- # @param [FFI::Pointer(MemoryBufferRef)] mem_buf
72
- # @param [FFI::Pointer(*ModuleProviderRef)] out_mp
73
- # @param [FFI::Pointer(**CharS)] out_message
74
- # @return [Integer]
87
+ #
88
+ # @method get_bitcode_module2(mem_buf, out_m)
89
+ # @param [FFI::Pointer(MemoryBufferRef)] mem_buf
90
+ # @param [FFI::Pointer(*ModuleRef)] out_m
91
+ # @return [Integer]
75
92
  # @scope class
76
- attach_function :get_bitcode_module_provider, :LLVMGetBitcodeModuleProvider, [:pointer, :pointer, :pointer], :int
77
-
93
+ attach_function :get_bitcode_module2, :LLVMGetBitcodeModule2, [:pointer, :pointer], :int
94
+
78
95
  # Writes a module to the specified path. Returns 0 on success.
79
- #
96
+ #
80
97
  # @method write_bitcode_to_file(m, path)
81
- # @param [FFI::Pointer(ModuleRef)] m
82
- # @param [String] path
83
- # @return [Integer]
98
+ # @param [FFI::Pointer(ModuleRef)] m
99
+ # @param [String] path
100
+ # @return [Integer]
84
101
  # @scope class
85
102
  attach_function :write_bitcode_to_file, :LLVMWriteBitcodeToFile, [:pointer, :string], :int
86
-
103
+
87
104
  # Writes a module to an open file descriptor. Returns 0 on success.
88
- #
105
+ #
89
106
  # @method write_bitcode_to_fd(m, fd, should_close, unbuffered)
90
- # @param [FFI::Pointer(ModuleRef)] m
91
- # @param [Integer] fd
92
- # @param [Integer] should_close
93
- # @param [Integer] unbuffered
94
- # @return [Integer]
107
+ # @param [FFI::Pointer(ModuleRef)] m
108
+ # @param [Integer] fd
109
+ # @param [Integer] should_close
110
+ # @param [Integer] unbuffered
111
+ # @return [Integer]
95
112
  # @scope class
96
113
  attach_function :write_bitcode_to_fd, :LLVMWriteBitcodeToFD, [:pointer, :int, :int, :int], :int
97
-
114
+
98
115
  # Deprecated for LLVMWriteBitcodeToFD. Writes a module to an open file
99
116
  # descriptor. Returns 0 on success. Closes the Handle.
100
- #
117
+ #
101
118
  # @method write_bitcode_to_file_handle(m, handle)
102
- # @param [FFI::Pointer(ModuleRef)] m
103
- # @param [Integer] handle
104
- # @return [Integer]
119
+ # @param [FFI::Pointer(ModuleRef)] m
120
+ # @param [Integer] handle
121
+ # @return [Integer]
105
122
  # @scope class
106
123
  attach_function :write_bitcode_to_file_handle, :LLVMWriteBitcodeToFileHandle, [:pointer, :int], :int
107
-
124
+
125
+ # Writes a module to a new memory buffer and returns it.
126
+ #
127
+ # @method write_bitcode_to_memory_buffer(m)
128
+ # @param [FFI::Pointer(ModuleRef)] m
129
+ # @return [FFI::Pointer(MemoryBufferRef)]
130
+ # @scope class
131
+ attach_function :write_bitcode_to_memory_buffer, :LLVMWriteBitcodeToMemoryBuffer, [:pointer], :pointer
108
132
  end
@@ -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.
@@ -118,8 +120,8 @@ module LLVM
118
120
  # @return [LLVM::Instruction]
119
121
  def switch(val, default, cases)
120
122
  inst = SwitchInst.from_ptr(C.build_switch(self, val, default, cases.size))
121
- cases.each do |(val, block)|
122
- inst.add_case(val, block)
123
+ cases.each do |(c, block)|
124
+ inst.add_case(c, block)
123
125
  end
124
126
  inst
125
127
  end
@@ -820,7 +822,6 @@ module LLVM
820
822
  # @return [LLVM::Instruction] The phi node
821
823
  # @LLVMinst phi
822
824
  def phi(ty, incoming, name = "")
823
-
824
825
  phi = Phi.from_ptr(C.build_phi(self, LLVM::Type(ty), name))
825
826
  phi.add_incoming(incoming)
826
827
  phi
@@ -1,4 +1,6 @@
1
- module LLVM
1
+ # frozen_string_literal: true
2
+
3
+ module LLVM
2
4
  class Context
3
5
  def initialize(ptr = nil)
4
6
  @ptr = ptr || C.context_create()
@@ -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.
@@ -5,9 +7,11 @@ module LLVM
5
7
  # Creates a new pass manager.
6
8
  #
7
9
  # @param [LLVM::ExecutionEngine, LLVM::TargetMachine] machine
8
- def initialize(machine)
10
+ def initialize(machine = nil)
11
+ if machine
12
+ warn("[DEPRECATION] PassManager.new should be called without parameters")
13
+ end
9
14
  @ptr = C.create_pass_manager()
10
- C.add_target_data(machine.data_layout, @ptr)
11
15
  end
12
16
 
13
17
  # @private
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module LLVM
2
4
  class Type
3
5
  include PointerIdentity
@@ -33,7 +35,7 @@ module LLVM
33
35
 
34
36
  # Returns the type of this types elements (works only for Pointer, Vector, and Array types.)
35
37
  def element_type
36
- case self.kind
38
+ case kind
37
39
  when :pointer, :vector, :array
38
40
  Type.from_ptr(C.get_element_type(self), nil)
39
41
  end
@@ -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)
@@ -128,7 +135,7 @@ module LLVM
128
135
  C.get_param_types(self, types_ptr)
129
136
  result = types_ptr.read_array_of_pointer(size)
130
137
  end
131
- result.map{ |p| Type.from_ptr(p, nil) }
138
+ result.map { |p| Type.from_ptr(p, nil) }
132
139
  end
133
140
 
134
141
  def vararg?