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

Instance Method Details

#data_layoutString

Get module data layout.

Returns:

  • (String)


44
45
46
# File 'lib/llvm/core/module.rb', line 44

def data_layout
  C.get_data_layout(self)
end

#data_layout=(data_layout) ⇒ Object

Set module data layout.

Parameters:



51
52
53
# File 'lib/llvm/core/module.rb', line 51

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.



237
238
239
# File 'lib/llvm/core/module.rb', line 237

def dump
  C.dump_module(self)
end

#functionsObject

Returns a FunctionCollection of all the Functions in the module.



148
149
150
# File 'lib/llvm/core/module.rb', line 148

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

#globalsObject

Returns an Enumerable of all the GlobalVariables in the module.



74
75
76
# File 'lib/llvm/core/module.rb', line 74

def globals
  @globals ||= GlobalCollection.new(self)
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.



232
233
234
# File 'lib/llvm/core/module.rb', line 232

def to_s
  C.print_module_to_string(self)
end

#tripleString

Get module triple.

Returns:

  • (String)


30
31
32
# File 'lib/llvm/core/module.rb', line 30

def triple
  C.get_target(self)
end

#triple=(triple) ⇒ Object

Set module triple.

Parameters:

  • triple (String)


37
38
39
# File 'lib/llvm/core/module.rb', line 37

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

#typesObject

Returns a TypeCollection of all the Types in the module.



56
57
58
# File 'lib/llvm/core/module.rb', line 56

def types
  @types ||= TypeCollection.new(self)
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