module Carbon::Core::Main

Public Class Methods

define_main_function(mod, index, pass) click to toggle source
# File lib/carbon/core/main.rb, line 8
def define_main_function(mod, index, pass)
  main_params = [LLVM::Int32.type, LLVM::Int8.type.pointer.pointer]
  main = mod.functions.add("main", main_params, LLVM::Int32.type)
  define_main_definition(mod, main, index, pass)
end

Private Class Methods

define_main_definition(mod, func, index, pass) click to toggle source
# File lib/carbon/core/main.rb, line 16
def define_main_definition(mod, func, index, pass)
  if pass.function.parameters.size == 2
    define_main_definition_params(mod, func, index, pass)
  else
    define_main_definition_noparams(mod, func, index, pass)
  end
end
define_main_definition_noparams(mod, func, index, pass) click to toggle source
# File lib/carbon/core/main.rb, line 37
def define_main_definition_noparams(mod, func, index, pass)
  func.basic_blocks.append("entry").build do |b|
    if index.fetch(pass).first.return != Carbon::Void
      b.ret(b.call(mod.functions[pass.to_s]))
    else
      b.call(mod.function[pass.to_s])
      b.ret(LLVM::Int(0))
    end
  end
end
define_main_definition_params(mod, func, index, pass) click to toggle source
# File lib/carbon/core/main.rb, line 24
def define_main_definition_params(mod, func, index, pass)
  argc, argv = func.params
  argc.name, argv.name = "argc", "argv"
  func.basic_blocks.append("entry").build do |b|
    if index.fetch(pass).first.return != Carbon::Void
      b.ret(b.call(mod.functions[pass.to_s], argc, argv))
    else
      b.call(mod.function[pass.to_s], argc, argv)
      b.ret(LLVM::Int(0))
    end
  end
end