Class: LLVM::Module
- Inherits:
-
Object
- Object
- LLVM::Module
- Includes:
- PointerIdentity
- Defined in:
- lib/llvm/linker.rb,
lib/llvm/analysis.rb,
lib/llvm/core/module.rb,
lib/llvm/core/bitcode.rb
Defined Under Namespace
Classes: FunctionCollection, GlobalCollection, TypeCollection
Class Method Summary collapse
- .from_ptr(ptr) ⇒ Object
-
.parse_bitcode(path_or_memory_buffer) ⇒ LLVM::Module
Parse a module from a memory buffer.
- .parse_ir(path_or_memory_buffer, context = Context.global) ⇒ Object
Instance Method Summary collapse
- #clone_module ⇒ Object
-
#data_layout ⇒ String
Get module data layout.
-
#data_layout=(data_layout) ⇒ Object
Set module data layout.
- #dispose ⇒ Object
-
#dump ⇒ Object
Print the module’s IR to the standard error.
-
#functions ⇒ Object
Returns a FunctionCollection of all the Functions in the module.
-
#globals ⇒ Object
Returns an Enumerable of all the GlobalVariables in the module.
-
#initialize(name) ⇒ Module
constructor
Important: Call #dispose to free backend memory after use, but not when using JITCompiler with this module.
- #inspect ⇒ Object
-
#link_into(other) ⇒ nil, String
Link the current module into
other
. -
#to_s ⇒ Object
Returns the LLVM IR of the module as a string.
-
#triple ⇒ String
Get module triple.
-
#triple=(triple) ⇒ Object
Set module triple.
-
#types ⇒ Object
Returns a TypeCollection of all the Types in the module.
- #valid? ⇒ Boolean
-
#verify ⇒ nil, String
Verify that the module is valid.
-
#verify! ⇒ nil
Verify that a module is valid, and abort the process if not.
-
#write_bitcode(path_or_io) ⇒ true, false
Write bitcode to the given path, IO object or file descriptor.
- #write_ir!(filename) ⇒ Object
Methods included from PointerIdentity
Constructor Details
#initialize(name) ⇒ Module
Important: Call #dispose to free backend memory after use, but not when using JITCompiler with this module.
16 17 18 |
# File 'lib/llvm/core/module.rb', line 16 def initialize(name) @ptr = C.module_create_with_name(name) end |
Class Method Details
.from_ptr(ptr) ⇒ Object
8 9 10 11 12 13 |
# File 'lib/llvm/core/module.rb', line 8 def self.from_ptr(ptr) return if ptr.null? mod = allocate mod.instance_variable_set(:@ptr, ptr) mod end |
.parse_bitcode(path_or_memory_buffer) ⇒ LLVM::Module
Parse a module from a memory buffer
10 11 12 13 14 15 16 17 18 19 20 21 22 |
# File 'lib/llvm/core/bitcode.rb', line 10 def self.parse_bitcode(path_or_memory_buffer) memory_buffer = case path_or_memory_buffer when MemoryBuffer then path_or_memory_buffer else MemoryBuffer.from_file(path_or_memory_buffer) end FFI::MemoryPointer.new(:pointer) do |mod_ref| FFI::MemoryPointer.new(:pointer) do |msg_ref| status = C.parse_bitcode(memory_buffer, mod_ref, msg_ref) raise msg_ref.get_pointer(0).get_string(0) if status != 0 return from_ptr(mod_ref.get_pointer(0)) end end end |
.parse_ir(path_or_memory_buffer, context = Context.global) ⇒ Object
40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/llvm/core/bitcode.rb', line 40 def self.parse_ir(path_or_memory_buffer, context = Context.global) memory_buffer = case path_or_memory_buffer when MemoryBuffer then path_or_memory_buffer else MemoryBuffer.from_file(path_or_memory_buffer) end FFI::MemoryPointer.new(:pointer) do |mod_ref| FFI::MemoryPointer.new(:pointer) do |msg_ref| status = C.parse_ir_in_context(context, memory_buffer, mod_ref, msg_ref) raise msg_ref.get_pointer(0).get_string(0) if status return from_ptr(mod_ref.get_pointer(0)) end end end |
Instance Method Details
#clone_module ⇒ Object
27 28 29 |
# File 'lib/llvm/core/module.rb', line 27 def clone_module Module.from_ptr(C.clone_module(self)) end |
#data_layout ⇒ String
Get module data layout.
58 59 60 |
# File 'lib/llvm/core/module.rb', line 58 def data_layout C.get_data_layout(self) end |
#data_layout=(data_layout) ⇒ Object
Set module data layout.
65 66 67 |
# File 'lib/llvm/core/module.rb', line 65 def data_layout=(data_layout) C.set_data_layout(self, data_layout.to_s) end |
#dispose ⇒ Object
20 21 22 23 24 25 |
# File 'lib/llvm/core/module.rb', line 20 def dispose return if @ptr.nil? C.dispose_module(@ptr) @ptr = nil end |
#dump ⇒ Object
Print the module’s IR to the standard error.
251 252 253 |
# File 'lib/llvm/core/module.rb', line 251 def dump C.dump_module(self) end |
#functions ⇒ Object
Returns a FunctionCollection of all the Functions in the module.
162 163 164 |
# File 'lib/llvm/core/module.rb', line 162 def functions @functions ||= FunctionCollection.new(self) end |
#globals ⇒ Object
Returns an Enumerable of all the GlobalVariables in the module.
88 89 90 |
# File 'lib/llvm/core/module.rb', line 88 def globals @globals ||= GlobalCollection.new(self) end |
#inspect ⇒ Object
31 32 33 34 35 36 37 38 39 |
# File 'lib/llvm/core/module.rb', line 31 def inspect { triple: triple, globals: globals.count, functions: functions.count, lines: to_s.lines.size, valid: valid?, }.to_s end |
#link_into(other) ⇒ nil, String
Link the current module into other
.
12 13 14 15 16 |
# File 'lib/llvm/linker.rb', line 12 def link_into(other) LLVM. do |msg| C.link_modules2(other, self) end end |
#to_s ⇒ Object
Returns the LLVM IR of the module as a string.
246 247 248 |
# File 'lib/llvm/core/module.rb', line 246 def to_s C.print_module_to_string(self) end |
#triple ⇒ String
Get module triple.
44 45 46 |
# File 'lib/llvm/core/module.rb', line 44 def triple C.get_target(self) end |
#triple=(triple) ⇒ Object
Set module triple.
51 52 53 |
# File 'lib/llvm/core/module.rb', line 51 def triple=(triple) C.set_target(self, triple.to_s) end |
#types ⇒ Object
Returns a TypeCollection of all the Types in the module.
70 71 72 |
# File 'lib/llvm/core/module.rb', line 70 def types @types ||= TypeCollection.new(self) end |
#valid? ⇒ Boolean
25 26 27 |
# File 'lib/llvm/analysis.rb', line 25 def valid? verify.nil? end |
#verify ⇒ nil, String
Verify that the module is valid.
13 14 15 |
# File 'lib/llvm/analysis.rb', line 13 def verify do_verification(:return_status) end |
#verify! ⇒ nil
Verify that a module is valid, and abort the process if not.
19 20 21 22 23 |
# File 'lib/llvm/analysis.rb', line 19 def verify! # :nocov: do_verification(:abort_process) # :nocov: end |
#write_bitcode(path_or_io) ⇒ true, false
Write bitcode to the given path, IO object or file descriptor
27 28 29 30 31 32 33 34 35 36 37 38 |
# File 'lib/llvm/core/bitcode.rb', line 27 def write_bitcode(path_or_io) status = if path_or_io.respond_to?(:path) C.write_bitcode_to_file(self, path_or_io.path) elsif path_or_io.respond_to?(:fileno) C.write_bitcode_to_fd(self, path_or_io.fileno, 0, 1) elsif path_or_io.kind_of?(Integer) C.write_bitcode_to_fd(self, path_or_io, 0, 1) else C.write_bitcode_to_file(self, path_or_io.to_str) end status == 0 end |
#write_ir!(filename) ⇒ Object
54 55 56 57 58 59 60 |
# File 'lib/llvm/core/bitcode.rb', line 54 def write_ir!(filename) FFI::MemoryPointer.new(:pointer) do |msg_ref| status = C.print_module_to_file(self, filename, msg_ref) raise msg_ref.get_pointer(0).get_string(0) if status != 0 end self end |