binding for Target, Triple, TargetMachine
This commit is contained in:
parent
ca0a2b9fdd
commit
9485d03e18
9 changed files with 199 additions and 8 deletions
|
|
@ -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'
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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')
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
27
newbinding/src/Target.py
Normal 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()
|
||||||
|
|
@ -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)))
|
||||||
|
|
|
||||||
14
newbinding/src/TargetTransformInfo.py
Normal file
14
newbinding/src/TargetTransformInfo.py
Normal 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
55
newbinding/src/Triple.py
Normal 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)
|
||||||
|
|
||||||
|
|
@ -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():
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue