Home | History | Annotate | Download | only in llvm
      1 //===- executionengine.go - Bindings for executionengine ------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file defines bindings for the executionengine component.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 package llvm
     15 
     16 /*
     17 #include "llvm-c/Core.h"
     18 #include "llvm-c/ExecutionEngine.h"
     19 #include <stdlib.h>
     20 */
     21 import "C"
     22 import "unsafe"
     23 import "errors"
     24 
     25 func LinkInMCJIT()       { C.LLVMLinkInMCJIT() }
     26 func LinkInInterpreter() { C.LLVMLinkInInterpreter() }
     27 
     28 type GenericValue struct {
     29 	C C.LLVMGenericValueRef
     30 }
     31 type ExecutionEngine struct {
     32 	C C.LLVMExecutionEngineRef
     33 }
     34 
     35 type MCJITCompilerOptions struct {
     36 	C C.struct_LLVMMCJITCompilerOptions
     37 }
     38 
     39 func (options *MCJITCompilerOptions) SetMCJITOptimizationLevel(level uint) {
     40 	options.C.OptLevel = C.uint(level)
     41 }
     42 
     43 func (options *MCJITCompilerOptions) SetMCJITNoFramePointerElim(nfp bool) {
     44 	options.C.NoFramePointerElim = boolToLLVMBool(nfp)
     45 }
     46 
     47 func (options *MCJITCompilerOptions) SetMCJITEnableFastISel(fastisel bool) {
     48 	options.C.EnableFastISel = boolToLLVMBool(fastisel)
     49 }
     50 
     51 func (options *MCJITCompilerOptions) SetMCJITCodeModel(CodeModel CodeModel) {
     52 	options.C.CodeModel = C.LLVMCodeModel(CodeModel)
     53 }
     54 
     55 // helpers
     56 func llvmGenericValueRefPtr(t *GenericValue) *C.LLVMGenericValueRef {
     57 	return (*C.LLVMGenericValueRef)(unsafe.Pointer(t))
     58 }
     59 
     60 //-------------------------------------------------------------------------
     61 // llvm.GenericValue
     62 //-------------------------------------------------------------------------
     63 
     64 func NewGenericValueFromInt(t Type, n uint64, signed bool) (g GenericValue) {
     65 	g.C = C.LLVMCreateGenericValueOfInt(t.C, C.ulonglong(n), boolToLLVMBool(signed))
     66 	return
     67 }
     68 func NewGenericValueFromPointer(p unsafe.Pointer) (g GenericValue) {
     69 	g.C = C.LLVMCreateGenericValueOfPointer(p)
     70 	return
     71 }
     72 func NewGenericValueFromFloat(t Type, n float64) (g GenericValue) {
     73 	g.C = C.LLVMCreateGenericValueOfFloat(t.C, C.double(n))
     74 	return
     75 }
     76 func (g GenericValue) IntWidth() int { return int(C.LLVMGenericValueIntWidth(g.C)) }
     77 func (g GenericValue) Int(signed bool) uint64 {
     78 	return uint64(C.LLVMGenericValueToInt(g.C, boolToLLVMBool(signed)))
     79 }
     80 func (g GenericValue) Float(t Type) float64 {
     81 	return float64(C.LLVMGenericValueToFloat(t.C, g.C))
     82 }
     83 func (g GenericValue) Pointer() unsafe.Pointer {
     84 	return C.LLVMGenericValueToPointer(g.C)
     85 }
     86 func (g GenericValue) Dispose() { C.LLVMDisposeGenericValue(g.C) }
     87 
     88 //-------------------------------------------------------------------------
     89 // llvm.ExecutionEngine
     90 //-------------------------------------------------------------------------
     91 
     92 func NewExecutionEngine(m Module) (ee ExecutionEngine, err error) {
     93 	var cmsg *C.char
     94 	fail := C.LLVMCreateExecutionEngineForModule(&ee.C, m.C, &cmsg)
     95 	if fail != 0 {
     96 		ee.C = nil
     97 		err = errors.New(C.GoString(cmsg))
     98 		C.LLVMDisposeMessage(cmsg)
     99 	}
    100 	return
    101 }
    102 
    103 func NewInterpreter(m Module) (ee ExecutionEngine, err error) {
    104 	var cmsg *C.char
    105 	fail := C.LLVMCreateInterpreterForModule(&ee.C, m.C, &cmsg)
    106 	if fail != 0 {
    107 		ee.C = nil
    108 		err = errors.New(C.GoString(cmsg))
    109 		C.LLVMDisposeMessage(cmsg)
    110 	}
    111 	return
    112 }
    113 
    114 func NewMCJITCompilerOptions() MCJITCompilerOptions {
    115 	var options C.struct_LLVMMCJITCompilerOptions
    116 	C.LLVMInitializeMCJITCompilerOptions(&options, C.size_t(unsafe.Sizeof(C.struct_LLVMMCJITCompilerOptions{})))
    117 	return MCJITCompilerOptions{options}
    118 }
    119 
    120 func NewMCJITCompiler(m Module, options MCJITCompilerOptions) (ee ExecutionEngine, err error) {
    121 	var cmsg *C.char
    122 	fail := C.LLVMCreateMCJITCompilerForModule(&ee.C, m.C, &options.C, C.size_t(unsafe.Sizeof(C.struct_LLVMMCJITCompilerOptions{})), &cmsg)
    123 	if fail != 0 {
    124 		ee.C = nil
    125 		err = errors.New(C.GoString(cmsg))
    126 		C.LLVMDisposeMessage(cmsg)
    127 	}
    128 	return
    129 }
    130 
    131 func (ee ExecutionEngine) Dispose()               { C.LLVMDisposeExecutionEngine(ee.C) }
    132 func (ee ExecutionEngine) RunStaticConstructors() { C.LLVMRunStaticConstructors(ee.C) }
    133 func (ee ExecutionEngine) RunStaticDestructors()  { C.LLVMRunStaticDestructors(ee.C) }
    134 
    135 func (ee ExecutionEngine) RunFunction(f Value, args []GenericValue) (g GenericValue) {
    136 	nargs := len(args)
    137 	var argptr *GenericValue
    138 	if nargs > 0 {
    139 		argptr = &args[0]
    140 	}
    141 	g.C = C.LLVMRunFunction(ee.C, f.C,
    142 		C.unsigned(nargs), llvmGenericValueRefPtr(argptr))
    143 	return
    144 }
    145 
    146 func (ee ExecutionEngine) FreeMachineCodeForFunction(f Value) {
    147 	C.LLVMFreeMachineCodeForFunction(ee.C, f.C)
    148 }
    149 func (ee ExecutionEngine) AddModule(m Module) { C.LLVMAddModule(ee.C, m.C) }
    150 
    151 func (ee ExecutionEngine) RemoveModule(m Module) {
    152 	var modtmp C.LLVMModuleRef
    153 	C.LLVMRemoveModule(ee.C, m.C, &modtmp, nil)
    154 }
    155 
    156 func (ee ExecutionEngine) FindFunction(name string) (f Value) {
    157 	cname := C.CString(name)
    158 	defer C.free(unsafe.Pointer(cname))
    159 	C.LLVMFindFunction(ee.C, cname, &f.C)
    160 	return
    161 }
    162 
    163 func (ee ExecutionEngine) RecompileAndRelinkFunction(f Value) unsafe.Pointer {
    164 	return C.LLVMRecompileAndRelinkFunction(ee.C, f.C)
    165 }
    166 
    167 func (ee ExecutionEngine) TargetData() (td TargetData) {
    168 	td.C = C.LLVMGetExecutionEngineTargetData(ee.C)
    169 	return
    170 }
    171 
    172 func (ee ExecutionEngine) AddGlobalMapping(global Value, addr unsafe.Pointer) {
    173 	C.LLVMAddGlobalMapping(ee.C, global.C, addr)
    174 }
    175 
    176 func (ee ExecutionEngine) PointerToGlobal(global Value) unsafe.Pointer {
    177 	return C.LLVMGetPointerToGlobal(ee.C, global.C)
    178 }
    179