Class: LLVM::Module

Inherits:
Object
  • Object
show all
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

Instance Method Summary collapse

Methods included from PointerIdentity

#==, #eql?, #hash, #to_ptr

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

Parameters:

Returns:



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

#data_layoutString

Get module data layout.

Returns:

  • (String)


54
55
56
# File 'lib/llvm/core/module.rb', line 54

def data_layout
  C.get_data_layout(self)
end

#data_layout=(data_layout) ⇒ Object

Set module data layout.

Parameters:



61
62
63
# File 'lib/llvm/core/module.rb', line 61

def data_layout=(data_layout)
  C.set_data_layout(self, data_layout.to_s)
end

#disposeObject



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

#dumpObject

Print the module’s IR to the standard error.



247
248
249
# File 'lib/llvm/core/module.rb', line 247

def dump
  C.dump_module(self)
end

#functionsObject

Returns a FunctionCollection of all the Functions in the module.



158
159
160
# File 'lib/llvm/core/module.rb', line 158

def functions
  @functions ||= FunctionCollection.new(self)
end

#globalsObject

Returns an Enumerable of all the GlobalVariables in the module.



84
85
86
# File 'lib/llvm/core/module.rb', line 84

def globals
  @globals ||= GlobalCollection.new(self)
end

#inspectObject



27
28
29
30
31
32
33
34
35
# File 'lib/llvm/core/module.rb', line 27

def inspect
  {
    triple: triple,
    globals: globals.count,
    functions: functions.count,
    lines: to_s.lines.size,
    valid: valid?,
  }.to_s
end

Link the current module into other.

Returns:

  • (nil, String)

    human-readable error if linking has failed



12
13
14
15
16
# File 'lib/llvm/linker.rb', line 12

def link_into(other)
  LLVM.with_message_output do |msg|
    C.link_modules2(other, self)
  end
end

#to_sObject

Returns the LLVM IR of the module as a string.



242
243
244
# File 'lib/llvm/core/module.rb', line 242

def to_s
  C.print_module_to_string(self)
end

#tripleString

Get module triple.

Returns:

  • (String)


40
41
42
# File 'lib/llvm/core/module.rb', line 40

def triple
  C.get_target(self)
end

#triple=(triple) ⇒ Object

Set module triple.

Parameters:

  • triple (String)


47
48
49
# File 'lib/llvm/core/module.rb', line 47

def triple=(triple)
  C.set_target(self, triple.to_s)
end

#typesObject

Returns a TypeCollection of all the Types in the module.



66
67
68
# File 'lib/llvm/core/module.rb', line 66

def types
  @types ||= TypeCollection.new(self)
end

#valid?Boolean

Returns:

  • (Boolean)


23
24
25
# File 'lib/llvm/analysis.rb', line 23

def valid?
  verify.nil?
end

#verifynil, String

Verify that the module is valid.

Returns:

  • (nil, String)

    human-readable description of any invalid constructs if invalid.



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.

Returns:

  • (nil)


19
20
21
# File 'lib/llvm/analysis.rb', line 19

def verify!
  do_verification(:abort_process)
end

#write_bitcode(path_or_io) ⇒ true, false

Write bitcode to the given path, IO object or file descriptor

Parameters:

  • path_or_io (String, IO, Integer)

    Pathname, IO object or file descriptor

Returns:

  • (true, false)

    Success



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