binding for Target, Triple, TargetMachine

This commit is contained in:
Siu Kwan Lam 2013-02-01 14:19:22 -06:00
commit 9485d03e18
9 changed files with 199 additions and 8 deletions

View file

@ -185,6 +185,11 @@ class Class(_Type):
writer.die_if_false(casted) writer.die_if_false(casted)
return casted return casted
def wrap(self, writer, val):
copy = 'new %s(%s)' % (self.fullname, val)
return writer.pycapsule_new(copy, self.capsule_name, self.fullname)
class Enum(object): class Enum(object):
format = 'O' format = 'O'
@ -466,13 +471,17 @@ class ref(_Type):
def __init__(self, element): def __init__(self, element):
assert isinstance(element, Class), type(element) assert isinstance(element, Class), type(element)
self.element = element self.element = element
self.const = False
def __str__(self): def __str__(self):
return self.fullname return self.fullname
@property @property
def fullname(self): def fullname(self):
return '%s&' % self.element.fullname if self.const:
return 'const %s&' % self.element.fullname
else:
return '%s&' % self.element.fullname
@property @property
def capsule_name(self): def capsule_name(self):
@ -483,7 +492,7 @@ class ref(_Type):
return self.element.format return self.element.format
def wrap(self, writer, val): def wrap(self, writer, val):
p = writer.declare(ptr(self.element).fullname, '&%s' % val) p = writer.declare(const(ptr(self.element)).fullname, '&%s' % val)
return writer.pycapsule_new(p, self.capsule_name, self.element.fullname) return writer.pycapsule_new(p, self.capsule_name, self.element.fullname)
def unwrap(self, writer, val): def unwrap(self, writer, val):
@ -522,9 +531,9 @@ class ptr(_Type):
class ownedptr(ptr): class ownedptr(ptr):
pass pass
def const(ptr): def const(ptr_or_ref):
ptr.const = True ptr_or_ref.const = True
return ptr return ptr_or_ref
class cast(_Type): class cast(_Type):
format = 'O' format = 'O'

View file

@ -368,9 +368,9 @@ PyObject* EngineBuilder_setMAttrs(llvm::EngineBuilder* eb,
return NULL; return NULL;
} }
std::vector<const char*> tmp; std::vector<const char*> tmp;
const int N = PyList_Size(strlist); const Py_ssize_t N = PyList_Size(strlist);
tmp.reserve(N); tmp.reserve(N);
for (int i = 0; i < N; ++i) { for (Py_ssize_t i = 0; i < N; ++i) {
const char * elem = PyString_AsString(PyList_GetItem(strlist, i)); const char * elem = PyString_AsString(PyList_GetItem(strlist, i));
if (!elem) { if (!elem) {
return NULL; return NULL;
@ -381,3 +381,27 @@ PyObject* EngineBuilder_setMAttrs(llvm::EngineBuilder* eb,
return pycapsule_new(eb, "llvm::EngineBuilder"); return pycapsule_new(eb, "llvm::EngineBuilder");
} }
static
PyObject* EngineBuilder_selectTarget(llvm::EngineBuilder* eb,
const llvm::Triple& TargetTriple,
llvm::StringRef MArch,
llvm::StringRef MCPU,
PyObject* strlist)
{
const Py_ssize_t N = PySequence_Size(strlist);
llvm::SmallVector<std::string, 8> MAttrs;
MAttrs.reserve(N);
for (Py_ssize_t i = 0; i < N; ++i) {
PyObject* str = PySequence_GetItem(strlist, i);
const char * cp = PyString_AsString(str);
if (!cp) {
Py_DECREF(str);
return NULL;
}
MAttrs.push_back(cp);
Py_DECREF(str);
}
eb->selectTarget(TargetTriple, MArch, MCPU, MAttrs);
return pycapsule_new(eb, "llvm::EngineBuilder");
}

View file

@ -17,3 +17,4 @@ class TLSModel:
class CodeGenOpt: class CodeGenOpt:
'Actually a namespace' 'Actually a namespace'
Level = Enum('None', 'Less', 'Default', 'Aggressive') Level = Enum('None', 'Less', 'Default', 'Aggressive')

View file

@ -6,6 +6,7 @@ from CodeGen import CodeGenOpt, Reloc, CodeModel
from StringRef import StringRef from StringRef import StringRef
from ExecutionEngine import ExecutionEngine from ExecutionEngine import ExecutionEngine
from TargetMachine import TargetMachine from TargetMachine import TargetMachine
from Triple import Triple
EngineBuilder = llvm.Class() EngineBuilder = llvm.Class()
@ -45,5 +46,17 @@ class EngineBuilder:
create = Method(ptr(ExecutionEngine), create = Method(ptr(ExecutionEngine),
ownedptr(TargetMachine)).require_only(0) ownedptr(TargetMachine)).require_only(0)
selectTarget = Method(ptr(TargetMachine)) _selectTarget0 = Method(ptr(TargetMachine))
_selectTarget0.realname = 'selectTarget'
_selectTarget1 = CustomMethod('EngineBuilder_selectTarget',
const(ref(Triple)), cast(str, StringRef),
cast(str, StringRef), PyObjectPtr),
@CustomPythonMethod
def selectTarget(self, *args):
if not args:
return self._selectTarget0()
else:
return self._selectTarget1(*args)

27
newbinding/src/Target.py Normal file
View file

@ -0,0 +1,27 @@
from binding import *
from namespace import llvm
from StringRef import StringRef
Target = llvm.Class()
@Target
class Target:
_include_ = 'llvm/Support/TargetRegistry.h'
getNext = Method(const(ptr(Target)))
getName = Method(cast(StringRef, str))
getShortDescription = Method(cast(StringRef, str))
def _has():
return Method(cast(Bool, bool))
hasJIT = _has()
hasTargetMachine = _has()
hasMCAsmBackend = _has()
hasMCAsmParser = _has()
hasAsmPrinter = _has()
hasMCDisassembler = _has()
hasMCInstPrinter = _has()
hasMCCodeEmitter = _has()
hasMCObjectStreamer = _has()
hasAsmStreamer = _has()

View file

@ -1,5 +1,12 @@
from binding import * from binding import *
from namespace import llvm from namespace import llvm
from StringRef import StringRef
from CodeGen import CodeModel, TLSModel, CodeGenOpt, Reloc
from GlobalValue import GlobalValue
from Target import Target
from DataLayout import DataLayout
from TargetTransformInfo import (ScalarTargetTransformInfo,
VectorTargetTransformInfo)
TargetMachine = llvm.Class() TargetMachine = llvm.Class()
@ -8,4 +15,22 @@ class TargetMachine:
_include_ = 'llvm/Target/TargetMachine.h' _include_ = 'llvm/Target/TargetMachine.h'
delete = Destructor() delete = Destructor()
getTarget = Method(const(ref(Target)))
getTargetTriple = Method(cast(StringRef, str))
getTargetCPU = Method(cast(StringRef, str))
getTargetFeatureString = Method(cast(StringRef, str))
getRelocationModel = Method(Reloc.Model)
getCodeModel = Method(CodeModel.Model)
getTLSModel = Method(TLSModel.Model, ptr(GlobalValue))
getOptLevel = Method(CodeGenOpt.Level)
hasMCUseDwarfDirectory = Method(cast(Bool, bool))
setMCUseDwarfDirectory = Method(Void, cast(bool, Bool))
getDataLayout = Method(const(ownedptr(DataLayout)))
getScalarTargetTransformInfo = Method(const(
ownedptr(ScalarTargetTransformInfo)))
getVectorTargetTransformInfo = Method(const(
ownedptr(VectorTargetTransformInfo)))

View file

@ -0,0 +1,14 @@
from binding import *
from namespace import llvm
ScalarTargetTransformInfo = llvm.Class()
VectorTargetTransformInfo = llvm.Class()
@ScalarTargetTransformInfo
class ScalarTargetTransformInfo:
delete = Destructor()
@VectorTargetTransformInfo
class VectorTargetTransformInfo:
delete = Destructor()

55
newbinding/src/Triple.py Normal file
View file

@ -0,0 +1,55 @@
from binding import *
from namespace import llvm
from StringRef import StringRef
Triple = llvm.Class()
@Triple
class Triple:
_include_ = 'llvm/ADT/Triple.h'
new = Constructor()
new |= Constructor(cast(str, StringRef))
new |= Constructor(cast(str, StringRef),
cast(str, StringRef), cast(str, StringRef))
def _return_str():
return Method(cast(StringRef, str))
getTriple = _return_str()
getArchName = _return_str()
getVendorName = _return_str()
getOSName = _return_str()
getEnvironmentName = _return_str()
getOSAndEnvironmentName = _return_str()
@CustomPythonMethod
def __str__(self):
return self.getTriple()
def _return_bool(*args):
return Method(cast(bool, Bool), *args)
isArch64Bit = _return_bool()
isArch32Bit = _return_bool()
isArch16Bit = _return_bool()
isOSVersionLT = _return_bool(cast(int, Unsigned),
cast(int, Unsigned),
cast(int, Unsigned)).require_only(1)
isMacOSXVersionLT = _return_bool(cast(int, Unsigned),
cast(int, Unsigned),
cast(int, Unsigned)).require_only(1)
isMacOSX = _return_bool()
isOSDarwin = _return_bool()
isOSCygMing = _return_bool()
isOSWindows = _return_bool()
# isOSNaCl = _return_bool()
isOSBinFormatELF = _return_bool()
isOSBinFormatCOFF = _return_bool()
isEnvironmentMachO = _return_bool()
get32BitArchVariant = Method(Triple)
get64BitArchVariant = Method(Triple)

View file

@ -124,8 +124,31 @@ def test_engine_builder():
eb.setOptLevel(api.CodeGenOpt.Level.Aggressive).setUseMCJIT(False) eb.setOptLevel(api.CodeGenOpt.Level.Aggressive).setUseMCJIT(False)
tm = eb.selectTarget() tm = eb.selectTarget()
print 'target triple:', tm.getTargetTriple()
print 'target cpu:', tm.getTargetCPU()
print 'target feature string:', tm.getTargetFeatureString()
target = tm.getTarget()
print 'target name:', target.getName()
print 'target short description:', target.getShortDescription()
assert target.hasJIT()
assert target.hasTargetMachine()
ee = eb.create(tm) ee = eb.create(tm)
triple = api.Triple.new('x86_64-unknown-linux')
assert triple.getArchName() == 'x86_64'
assert triple.getVendorName() == 'unknown'
assert triple.getOSName() == 'linux'
assert triple.isArch64Bit()
assert not triple.isArch32Bit()
triple_32variant = triple.get32BitArchVariant()
assert triple_32variant.isArch32Bit()
print tm.getDataLayout()
def main(): def main():
for name, value in globals().items(): for name, value in globals().items():