static
+ Td* from(Ts* src) {
+ return llvm::dyn_cast| (src);
+ }
+
+ static
+ Td* from(void* src) {
+ return static_cast | (src);
+ }
+};
+
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h
new file mode 100644
index 0000000..a7388a2
--- /dev/null
+++ b/newbinding/include/llvm_binding/extra.h
@@ -0,0 +1,34 @@
+#include
+#include
+#include
+
+namespace llvm{
+
+class raw_svector_ostream_helper: public raw_svector_ostream {
+ SmallVectorImpl *SV;
+public:
+ static
+ raw_svector_ostream_helper* create(){
+ SmallVectorImpl* sv = new SmallVector();
+ return new raw_svector_ostream_helper(sv);
+ }
+
+ ~raw_svector_ostream_helper(){
+ delete SV;
+ }
+
+protected:
+
+ explicit
+ raw_svector_ostream_helper(SmallVectorImpl* sv)
+ : raw_svector_ostream(*sv), SV(sv) {}
+
+private:
+ // no copy
+ raw_svector_ostream_helper(const raw_svector_ostream_helper&);
+ // no assign
+ void operator = (const raw_svector_ostream_helper&);
+};
+
+}
+
diff --git a/newbinding/setup.py b/newbinding/setup.py
new file mode 100644
index 0000000..6e2ceb5
--- /dev/null
+++ b/newbinding/setup.py
@@ -0,0 +1,54 @@
+import sys, os
+from distutils.core import setup, Extension
+
+llvm_config = os.environ.get('LLVM_CONFIG_PATH')
+
+def run_llvm_config(args):
+ cmd = llvm_config + ' ' + ' '.join(args)
+ return os.popen(cmd).read().rstrip()
+
+def get_libs_and_objs(components):
+ parts = run_llvm_config(['--libs'] + components).split()
+ libs = []
+ objs = []
+ for part in parts:
+ if part.startswith('-l'):
+ libs.append(part[2:])
+ elif part.endswith('.o'):
+ objs.append(part)
+ return libs, objs
+
+incdir = run_llvm_config(['--includedir'])
+libdir = run_llvm_config(['--libdir'])
+ldflags = run_llvm_config(['--ldflags'])
+macros = [('__STDC_CONSTANT_MACROS', None),
+ ('__STDC_LIMIT_MACROS', None)]
+
+extra_link_args = ldflags.split()
+
+libs_core, objs_core = get_libs_and_objs(['core', 'analysis', 'scalaropts',
+ 'executionengine', 'jit', 'native',
+ 'interpreter', 'bitreader',
+ 'bitwriter', 'instrumentation', 'ipa',
+ 'ipo', 'transformutils', 'asmparser',
+ 'linker', 'support', 'vectorize'])
+
+ext_modules = [Extension(name='_api',
+ sources=['api.cpp'],
+ include_dirs = ['include', incdir],
+ library_dirs = [libdir],
+ libraries = libs_core,
+ define_macros = macros,
+ extra_objects = objs_core,
+ extra_link_args = extra_link_args),
+ Extension(name='_capsule',
+ sources=['capsule.cpp'],
+ include_dirs = ['include'],),
+ ]
+
+
+setup(name = 'llvmpy2',
+ description = 'Python bindings for LLVM',
+ author = 'Siu Kwan Lam',
+ ext_modules = ext_modules,
+ license = "BSD")
diff --git a/newbinding/test.py b/newbinding/test.py
new file mode 100644
index 0000000..bed9e1a
--- /dev/null
+++ b/newbinding/test.py
@@ -0,0 +1,32 @@
+import _api
+
+context = _api.getGlobalContext()
+modname = "modname"
+module = _api.Module.new(modname, context)
+assert modname == _api.Module.getModuleIdentifier(module)
+modname2 = "newmodname"
+_api.Module.setModuleIdentifier(module, modname2)
+assert modname2 == _api.Module.getModuleIdentifier(module)
+
+_api.Module.dump(module)
+
+_api.Module.delete(module)
+
+voidty = _api.Type.getVoidTy(context)
+assert _api.Type.isVoidTy(voidty)
+assert not _api.Type.isLabelTy(voidty)
+
+int21ty = _api.Type.getIntNTy(context, 21)
+assert _api.Type.isIntegerTy(int21ty)
+assert _api.Type.isIntegerTy(int21ty, 21)
+_api.Type.dump(int21ty)
+
+halfty = _api.Type.getHalfTy(context)
+assert _api.Type.isHalfTy(halfty)
+_api.Type.dump(halfty)
+
+fnty = _api.FunctionType.get(halfty, False)
+_api.Type.dump(fnty)
+
+
+
diff --git a/newbinding/test2.py b/newbinding/test2.py
new file mode 100644
index 0000000..25a59d7
--- /dev/null
+++ b/newbinding/test2.py
@@ -0,0 +1,20 @@
+import api
+#api.enable_capsule_dtor_debug(True)
+context = api.getGlobalContext()
+
+m = api.Module.new("modname", context)
+print m.getModuleIdentifier()
+m.setModuleIdentifier('modname2')
+print m.getModuleIdentifier()
+m.dump()
+os = api.raw_svector_ostream_helper.create()
+m.print_(os, None)
+print os.str()
+
+int1ty = api.Type.getInt1Ty(context)
+int1ty.dump()
+
+print int1ty.isIntegerTy(1)
+
+
+
From 47771d8dbcd61d86c01dab07696e1238b7d64d9b Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 22 Jan 2013 10:13:41 -0600
Subject: [PATCH 101/414] Add README
---
newbinding/README | 5 +++++
1 file changed, 5 insertions(+)
create mode 100644 newbinding/README
diff --git a/newbinding/README b/newbinding/README
new file mode 100644
index 0000000..2bfabcd
--- /dev/null
+++ b/newbinding/README
@@ -0,0 +1,5 @@
+# README
+
+This is a reimplementation of the LLVM binding, aiming to provide a more familiar interface to the C++ API whenever possible.
+
+The implementation uses a custom DSL in python to describe the interface (under binding directory). The DSL serves as input to *gen.py* for generation of the .cpp and .py files for the actual binding.
From 5c1e8985a13f2ef4deb44015d74a856ec7977d29 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 22 Jan 2013 10:16:15 -0600
Subject: [PATCH 102/414] Delete empty unused Makefile
---
newbinding/binding/Makefile | 0
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 newbinding/binding/Makefile
diff --git a/newbinding/binding/Makefile b/newbinding/binding/Makefile
deleted file mode 100644
index e69de29..0000000
From d0935fe53383a3916d3fdd62aeb448c0339726af Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 22 Jan 2013 10:41:22 -0600
Subject: [PATCH 103/414] Organize code layout
---
newbinding/Makefile | 10 ++++----
newbinding/{binding => }/binding.py | 0
newbinding/{binding => }/gen.py | 23 ++++++++++++++-----
.../AssemblyAnnotationWriter.py | 0
newbinding/{binding => src}/DerivedTypes.py | 0
newbinding/{binding => src}/LLVMContext.py | 0
newbinding/{binding => src}/Module.py | 0
newbinding/{binding => src}/StringRef.py | 0
newbinding/{binding => src}/Type.py | 0
newbinding/{binding => src}/_Debug.py | 0
newbinding/src/__init__.py | 0
newbinding/{binding => src}/namespace.py | 0
newbinding/{binding => src}/raw_ostream.py | 0
newbinding/{binding => }/utils.py | 0
14 files changed, 22 insertions(+), 11 deletions(-)
rename newbinding/{binding => }/binding.py (100%)
rename newbinding/{binding => }/gen.py (92%)
rename newbinding/{binding => src}/AssemblyAnnotationWriter.py (100%)
rename newbinding/{binding => src}/DerivedTypes.py (100%)
rename newbinding/{binding => src}/LLVMContext.py (100%)
rename newbinding/{binding => src}/Module.py (100%)
rename newbinding/{binding => src}/StringRef.py (100%)
rename newbinding/{binding => src}/Type.py (100%)
rename newbinding/{binding => src}/_Debug.py (100%)
create mode 100644 newbinding/src/__init__.py
rename newbinding/{binding => src}/namespace.py (100%)
rename newbinding/{binding => src}/raw_ostream.py (100%)
rename newbinding/{binding => }/utils.py (100%)
diff --git a/newbinding/Makefile b/newbinding/Makefile
index ba902e3..0db1f29 100644
--- a/newbinding/Makefile
+++ b/newbinding/Makefile
@@ -5,14 +5,14 @@ all: _api.so _capsule.so
_api.so _capsule.so: api.cpp capsule.cpp
python setup.py build_ext --inplace
-
-api.cpp api.py: binding/*.py include/llvm_binding/*.h
- cd binding; python gen.py api $(PYMODS)
- mv binding/api.cpp api.cpp
- mv binding/api.py api.py
+api.cpp api.py: src/*.py include/llvm_binding/*.h
+ python gen.py api src $(PYMODS)
clean:
rm -f _api.so _capsule.so
rm -f api.cpp api.py
+check: _api.so api.py
+ python test2.py
+@PHONY: all clean check
diff --git a/newbinding/binding/binding.py b/newbinding/binding.py
similarity index 100%
rename from newbinding/binding/binding.py
rename to newbinding/binding.py
diff --git a/newbinding/binding/gen.py b/newbinding/gen.py
similarity index 92%
rename from newbinding/binding/gen.py
rename to newbinding/gen.py
index f662979..c2126ab 100644
--- a/newbinding/binding/gen.py
+++ b/newbinding/gen.py
@@ -136,8 +136,7 @@ class Context(object):
println('')
- def add_module(self, modname):
- module = __import__(modname)
+ def add_module(self, module):
allsyms = [(k, v) for k, v in vars(module).items()
if isinstance(v, Binding)]
symtab = sorted(allsyms, key=lambda x: x[1].rank)
@@ -190,17 +189,29 @@ def wrap_println(f):
return println
if __name__ == '__main__':
+ outputfilename = sys.argv[1]
+ srcdir = sys.argv[2]
+ modnames = sys.argv[3:]
+
+ modules = []
+ for m in modnames:
+ path = '%s.%s' % (srcdir, m)
+ print path
+ module = __import__(path)
+ for token in path.split('.')[1:]:
+ module = getattr(module, token)
+ modules.append(module)
context = Context()
- for mod in sys.argv[2:]:
+
+ for mod in modules:
context.add_module(mod)
- filename = sys.argv[1]
- with open('%s.cpp' % filename, 'w') as outfile:
+ with open('%s.cpp' % outputfilename, 'w') as outfile:
println = wrap_println(outfile)
populate_headers(println)
context.generate_cpp(println)
- with open('%s.py' % filename, 'w') as outfile:
+ with open('%s.py' % outputfilename, 'w') as outfile:
println = wrap_println(outfile)
context.generate_py(println)
diff --git a/newbinding/binding/AssemblyAnnotationWriter.py b/newbinding/src/AssemblyAnnotationWriter.py
similarity index 100%
rename from newbinding/binding/AssemblyAnnotationWriter.py
rename to newbinding/src/AssemblyAnnotationWriter.py
diff --git a/newbinding/binding/DerivedTypes.py b/newbinding/src/DerivedTypes.py
similarity index 100%
rename from newbinding/binding/DerivedTypes.py
rename to newbinding/src/DerivedTypes.py
diff --git a/newbinding/binding/LLVMContext.py b/newbinding/src/LLVMContext.py
similarity index 100%
rename from newbinding/binding/LLVMContext.py
rename to newbinding/src/LLVMContext.py
diff --git a/newbinding/binding/Module.py b/newbinding/src/Module.py
similarity index 100%
rename from newbinding/binding/Module.py
rename to newbinding/src/Module.py
diff --git a/newbinding/binding/StringRef.py b/newbinding/src/StringRef.py
similarity index 100%
rename from newbinding/binding/StringRef.py
rename to newbinding/src/StringRef.py
diff --git a/newbinding/binding/Type.py b/newbinding/src/Type.py
similarity index 100%
rename from newbinding/binding/Type.py
rename to newbinding/src/Type.py
diff --git a/newbinding/binding/_Debug.py b/newbinding/src/_Debug.py
similarity index 100%
rename from newbinding/binding/_Debug.py
rename to newbinding/src/_Debug.py
diff --git a/newbinding/src/__init__.py b/newbinding/src/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/newbinding/binding/namespace.py b/newbinding/src/namespace.py
similarity index 100%
rename from newbinding/binding/namespace.py
rename to newbinding/src/namespace.py
diff --git a/newbinding/binding/raw_ostream.py b/newbinding/src/raw_ostream.py
similarity index 100%
rename from newbinding/binding/raw_ostream.py
rename to newbinding/src/raw_ostream.py
diff --git a/newbinding/binding/utils.py b/newbinding/utils.py
similarity index 100%
rename from newbinding/binding/utils.py
rename to newbinding/utils.py
From 36df29ba71df48beb838e60d9a5a2616fb3a8fb3 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 22 Jan 2013 11:49:41 -0600
Subject: [PATCH 104/414] Add enum support
---
newbinding/binding.py | 46 +++++++++++++++++++++++++++++++++++++++++++
newbinding/gen.py | 8 ++++++++
2 files changed, 54 insertions(+)
diff --git a/newbinding/binding.py b/newbinding/binding.py
index 1230813..fa9ce90 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -222,6 +222,50 @@ class Wrapper(object):
println('if (!%(out)s) return NULL;' % locals())
return out
+class Enum(Binding):
+ def __init__(self, ns, *values):
+ super(Enum, self).__init__()
+ self.values = values
+ self.ns = ns
+ self.name = None
+
+ def compile(self, name, println):
+ self.name = self.name or name
+
+ @property
+ def fullname(self):
+ return '::'.join([self.ns, self.name])
+
+class ClassEnum(Enum):
+ def __init__(self, cls, *values):
+ super(ClassEnum, self).__init__(None, *values)
+ self.cls = cls
+ self.cls.enums.append(self)
+
+ def compile(self, name, println):
+ self.ns = self.cls.fullname
+ super(ClassEnum, self).compile(name, println)
+
+ def wrap(self, println, var):
+ println2 = indent_println(println)
+ ret = declare(println, 'PyObject*', NULL)
+ println('switch(%s) { ' % var)
+ for v in self.values:
+ println('case %s::%s:' % (self.ns, v))
+ println2('%(ret)s = PyString_FromString("%(v)s");' % locals())
+ println2('break;')
+ else:
+ println('default:')
+ println2('PyErr_SetString(PyExc_TypeError, "Invalid enum: %s");' %
+ v)
+ println2('return NULL;')
+ println('}')
+ return ret
+
+ def unwrap(self, println, var):
+ pass
+
+
class Class(Binding):
def __init__(self, ns):
super(Class, self).__init__()
@@ -229,6 +273,8 @@ class Class(Binding):
self.Ref = Ref(self)
self.Pointer = Pointer(self)
self.Subclass = lambda: Subclass(self)
+ self.Enum = lambda *v: ClassEnum(self, *v)
+ self.enums = []
self.ns = ns
self.methods = []
self.name = None
diff --git a/newbinding/gen.py b/newbinding/gen.py
index c2126ab..87c0697 100644
--- a/newbinding/gen.py
+++ b/newbinding/gen.py
@@ -115,6 +115,14 @@ class Context(object):
println('pass')
else:
mod = cls.name
+ # generate class enums
+ for enum in cls.enums:
+ println('class %s:' % enum.name)
+ println2 = indent_println(println)
+ for v in enum.values:
+ println2('%(v)s = "%(v)s"' % locals())
+ println('')
+ # generate class methods
for method in cls.methods:
name = method.name
if isinstance(method, StaticMethod):
From e39e1c72057981f2cf3bbc42354e3f85e7592c62 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 22 Jan 2013 11:50:06 -0600
Subject: [PATCH 105/414] Add logging
---
newbinding/binding.py | 3 +++
newbinding/gen.py | 11 +++++++----
2 files changed, 10 insertions(+), 4 deletions(-)
diff --git a/newbinding/binding.py b/newbinding/binding.py
index fa9ce90..ab0e1c0 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -1,5 +1,8 @@
+import logging
from utils import *
+logger = logging.getLogger(__name__)
+
_py2capi_fmtmap = {
str: 's#',
}
diff --git a/newbinding/gen.py b/newbinding/gen.py
index 87c0697..81a4815 100644
--- a/newbinding/gen.py
+++ b/newbinding/gen.py
@@ -1,8 +1,11 @@
-import sys
+import sys, logging
from binding import *
from utils import *
from cStringIO import StringIO
+logging.basicConfig(level=logging.INFO)
+logger = logging.getLogger(__name__)
+
extension_entry = '''
extern "C" {
@@ -143,7 +146,6 @@ class Context(object):
println2('return capsule.wrap(ret)')
println('')
-
def add_module(self, module):
allsyms = [(k, v) for k, v in vars(module).items()
if isinstance(v, Binding)]
@@ -159,6 +161,7 @@ class Context(object):
def println_to_def(s):
buf.write(s)
buf.write('\n')
+ logger.info('compiling %s', k)
v.compile(k, println_to_def)
self.definitions.append(buf.getvalue())
buf.close()
@@ -200,11 +203,11 @@ if __name__ == '__main__':
outputfilename = sys.argv[1]
srcdir = sys.argv[2]
modnames = sys.argv[3:]
-
+
modules = []
for m in modnames:
path = '%s.%s' % (srcdir, m)
- print path
+ logger.info("import module %s", path)
module = __import__(path)
for token in path.split('.')[1:]:
module = getattr(module, token)
From 089c825b0cdd89384b639f1f1b233f8aab59074d Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 22 Jan 2013 11:50:39 -0600
Subject: [PATCH 106/414] Add cleantemp rule in Makefile
---
newbinding/Makefile | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/newbinding/Makefile b/newbinding/Makefile
index 0db1f29..77a012b 100644
--- a/newbinding/Makefile
+++ b/newbinding/Makefile
@@ -8,9 +8,13 @@ _api.so _capsule.so: api.cpp capsule.cpp
api.cpp api.py: src/*.py include/llvm_binding/*.h
python gen.py api src $(PYMODS)
-clean:
+clean: cleantemp
rm -f _api.so _capsule.so
+
+cleantemp:
rm -f api.cpp api.py
+ rm -f src/*.pyc
+
check: _api.so api.py
python test2.py
From f88036274a3d9e7de2a7cbcd3e064f16e847962e Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 22 Jan 2013 15:31:13 -0600
Subject: [PATCH 107/414] Fix and rewrite the memory management for capsules.
---
newbinding/Makefile | 3 +-
newbinding/binding.py | 4 +-
newbinding/capsule.cpp | 29 --------------
newbinding/capsule.py | 39 ++++++++++++++++---
.../include/llvm_binding/capsule_context.h | 39 +++----------------
newbinding/src/_Debug.py | 3 --
newbinding/test2.py | 26 ++++++++++++-
7 files changed, 69 insertions(+), 74 deletions(-)
delete mode 100644 newbinding/src/_Debug.py
diff --git a/newbinding/Makefile b/newbinding/Makefile
index 77a012b..49e244b 100644
--- a/newbinding/Makefile
+++ b/newbinding/Makefile
@@ -1,4 +1,5 @@
-PYMODS = _Debug raw_ostream Type DerivedTypes LLVMContext StringRef AssemblyAnnotationWriter Module
+PYTHON = python
+PYMODS = raw_ostream Type DerivedTypes LLVMContext StringRef AssemblyAnnotationWriter Module
all: _api.so _capsule.so
diff --git a/newbinding/binding.py b/newbinding/binding.py
index ab0e1c0..63fcf9e 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -45,13 +45,15 @@ def mangle(name):
name = name.replace('_', '__').replace(' ', '_')
return name.replace('::', '_').rstrip('*&')
-def pycapsule_new(println, ptr, name, clsname, dtor='capsule_destructor'):
+def pycapsule_new(println, ptr, name, clsname, dtor=NULL):
# build capsule
name_soften = mangle(name)
var = new_symbol('pycap_%s' % name_soften)
fmt = 'PyObject* %(var)s = PyCapsule_New(%(ptr)s, "%(name)s", %(dtor)s);'
println(fmt % locals())
+ println('if (!%(var)s) return NULL;' % locals())
+
# build context
fmt = 'new CapsuleContext("%(clsname)s")'
context = declare(println, 'CapsuleContext*', fmt % locals())
diff --git a/newbinding/capsule.cpp b/newbinding/capsule.cpp
index 40d135b..e7e4932 100644
--- a/newbinding/capsule.cpp
+++ b/newbinding/capsule.cpp
@@ -66,34 +66,6 @@ PyObject* getClassName(PyObject* self, PyObject* args) {
}
}
-static
-PyObject* setDestructor(PyObject* self, PyObject* args) {
- PyObject* cap;
- PyObject* callable;
- if (!PyArg_ParseTuple(args, "OO", &cap, &callable)) {
- return NULL;
- }
- PyObject* arglist = Py_BuildValue("(O)", cap);
- CapsuleContext* context = getContext(self, arglist);
- Py_DECREF(arglist);
- if (!context) {
- return NULL;
- } else {
- void* ptr;
- if (callable != Py_None) {
- if (PyCallable_Check(callable)) {
- ptr = callable;
- } else {
- PyErr_SetString(PyExc_TypeError, "Argument is not callable.");
- return NULL;
- }
- } else {
- ptr = NULL;
- }
- context->destructor = (Destructor_Fn)ptr;
- }
- Py_RETURN_NONE;
-}
static PyMethodDef core_methods[] = {
#define declmethod(func) { #func , ( PyCFunction )func , METH_VARARGS , NULL }
@@ -101,7 +73,6 @@ static PyMethodDef core_methods[] = {
declmethod(getPointer),
declmethod(check),
declmethod(getClassName),
- declmethod(setDestructor),
{ NULL },
#undef declmethod
};
diff --git a/newbinding/capsule.py b/newbinding/capsule.py
index b82154b..509b4c4 100644
--- a/newbinding/capsule.py
+++ b/newbinding/capsule.py
@@ -1,18 +1,44 @@
import _capsule
-from weakref import WeakValueDictionary
+from weakref import WeakValueDictionary, ref
+import logging
+logger = logging.getLogger(__name__)
+
+def set_debug(enabled):
+ '''
+ Side-effect: configure logger with it is not configured.
+ '''
+ if enabled:
+ # If no handlers are configured for the root logger,
+ # build a default handler for debugging.
+ # Can we do better?
+ if not logger.root.handlers:
+ logging.basicConfig()
+ logger.setLevel(logging.DEBUG)
+ else:
+ logger.setLevel(logging.WARNING)
+
+
+class WeakRef(ref):
+ __slots__ = 'capsule', 'dtor'
_pyclasses = {}
_addr2obj = WeakValueDictionary()
-
+_owners = {}
def _sentry(ptr):
assert _capsule.check(ptr)
-
def classof(cap):
cls = _capsule.getClassName(cap)
return _pyclasses[cls]
+def _capsule_destructor(weak):
+ cap = weak.capsule
+ addr = _capsule.getPointer(cap)
+ cls = _capsule.getClassName(cap)
+ logger.debug("destroy pointer %s to %s", addr, cls)
+ weak.dtor(cap)
+ del _owners[addr]
def wrap(cap):
'''Wrap a PyCapsule with the corresponding Wrapper class.
@@ -29,9 +55,12 @@ def wrap(cap):
cls = classof(cap)
obj = cls(cap)
_addr2obj[addr] = obj # cache object by address
- # set destructor if cls.delete is defined
+ # set ownership if *cls* defines *_delete_*
if hasattr(cls, '_delete_'):
- _capsule.setDestructor(cap, cls._delete_)
+ weak = WeakRef(obj, _capsule_destructor)
+ _owners[addr] = weak
+ weak.capsule = cap
+ weak.dtor = cls._delete_
else:
assert classof(obj._ptr) is classof(cap)
# Unset destructor for capsules that are repeated
diff --git a/newbinding/include/llvm_binding/capsule_context.h b/newbinding/include/llvm_binding/capsule_context.h
index bb45566..dacfc89 100644
--- a/newbinding/include/llvm_binding/capsule_context.h
+++ b/newbinding/include/llvm_binding/capsule_context.h
@@ -1,48 +1,19 @@
#ifndef LLVMPY_CAPSULE_CONTEXT_H_
#define LLVMPY_CAPSULE_CONTEXT_H_
+
#include
#include
typedef PyObject* Destructor_Fn;
-static bool CapsuleContextDebug = false;
-
struct CapsuleContext {
const char* className;
- Destructor_Fn destructor;
-
- CapsuleContext(const char* cn, Destructor_Fn dtor=NULL)
- : className(cn), destructor(dtor) { }
+
+ CapsuleContext(const char* cn)
+ : className(cn)
+ { }
};
-void capsule_destructor(PyObject* capsule){
- using std::cerr;
- using std::endl;
- CapsuleContext* context = (CapsuleContext*)PyCapsule_GetContext(capsule);
- if (context->destructor) {
- if (CapsuleContextDebug) {
- cerr << clock()
- << " == DEBUG =="
- << " destroy pointer: "
- << context->className
- << endl;
- }
- PyObject_CallMethodObjArgs(context->destructor, capsule, NULL);
- } else {
- if (CapsuleContextDebug) {
- cerr << clock()
- << " == DEBUG =="
- << " keep pointer alive: "
- << context->className
- << endl;
- }
- }
- delete context;
-}
-
-void enable_capsule_dtor_debug(bool enabled){
- CapsuleContextDebug = enabled;
-}
#endif //LLVMPY_CAPSULE_CONTEXT_H_
diff --git a/newbinding/src/_Debug.py b/newbinding/src/_Debug.py
deleted file mode 100644
index be092f3..0000000
--- a/newbinding/src/_Debug.py
+++ /dev/null
@@ -1,3 +0,0 @@
-from binding import *
-
-enable_capsule_dtor_debug = Function('', Void, Bool.From(bool))
diff --git a/newbinding/test2.py b/newbinding/test2.py
index 25a59d7..872dfc0 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -1,20 +1,44 @@
import api
-#api.enable_capsule_dtor_debug(True)
+#api.capsule.set_debug(True)
context = api.getGlobalContext()
+def test():
+ print '*' * 80
+ m = api.Module.new("modname", context)
+ print m.getModuleIdentifier()
+ m.setModuleIdentifier('modname2')
+ print m.getModuleIdentifier()
+ print 'endianness', m.getEndianness()
+ assert m.getEndianness() == api.Module.Endianness.AnyEndianness
+ print 'pointer-size', m.getPointerSize()
+ assert m.getPointerSize() == api.Module.PointerSize.AnyPointerSize
+ m.dump()
+
m = api.Module.new("modname", context)
print m.getModuleIdentifier()
m.setModuleIdentifier('modname2')
print m.getModuleIdentifier()
+print 'endianness', m.getEndianness()
+assert m.getEndianness() == api.Module.Endianness.AnyEndianness
+print 'pointer-size', m.getPointerSize()
+assert m.getPointerSize() == api.Module.PointerSize.AnyPointerSize
m.dump()
+
+
+
os = api.raw_svector_ostream_helper.create()
m.print_(os, None)
print os.str()
+
int1ty = api.Type.getInt1Ty(context)
int1ty.dump()
print int1ty.isIntegerTy(1)
+fnty = api.FunctionType.get(int1ty, False)
+os2 = api.raw_svector_ostream_helper.create()
+fnty.print_(os2)
+print os2.str()
From bd550e3c0ed70dfe4c55864c3ea3b95a4c250d24 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 22 Jan 2013 15:33:23 -0600
Subject: [PATCH 108/414] Implement StaticMultiMethod
---
newbinding/binding.py | 52 ++++++++++++++++++++++++++++++++++
newbinding/gen.py | 3 +-
newbinding/src/DerivedTypes.py | 6 +++-
3 files changed, 59 insertions(+), 2 deletions(-)
diff --git a/newbinding/binding.py b/newbinding/binding.py
index 63fcf9e..de68b55 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -314,6 +314,11 @@ class Class(Binding):
mm = MultiMethod(self, signatures)
self.methods.append(mm)
return mm
+
+ def staticmultimethod(self, *signatures):
+ smm = StaticMultiMethod(self, signatures)
+ self.methods.append(smm)
+ return smm
def compile(self, name, println):
# set name
@@ -518,6 +523,53 @@ class StaticMethod(Method):
println('%s;' % call)
return_none(println)
+class StaticMultiMethod(Binding):
+ '''Can only differs by the number of arguments.
+ '''
+ def __init__(self, cls, signatures):
+ super(StaticMultiMethod, self).__init__()
+ nargs = set()
+ for sig in signatures:
+ n = len(sig)
+ if n in nargs:
+ raise TypeError("StaticMultiMethod only supports overloaded "
+ "version with different number of arguments")
+ nargs.add(n)
+ self.cls = cls
+ self.signatures = signatures
+ self.name = None
+
+
+ def compile(self, name, println):
+ # set name
+ self.name = self.name or name
+ # generate wrapper
+ println('static')
+ println('PyObject*')
+ mangled = self.mangled_name
+ println('%(mangled)s(PyObject* self, PyObject* args)' % locals())
+ println('{')
+ println2 = indent_println(println)
+ nargs = declare(println2, 'Py_ssize_t', 'PyTuple_Size(args)')
+ for sig in self.signatures:
+ expect = len(sig) - 1
+ println2('if (%(nargs)s == %(expect)d) {' % locals())
+ method = StaticMethod(self.cls, sig[0], *sig[1:])
+ method.name = self.name
+ method.compile_body(indent_println(println2))
+ println2('}')
+ println2('PyErr_SetString(PyExc_TypeError, "Wrong # of args");')
+ println2('return NULL;')
+ println('}')
+
+ @property
+ def fullname(self):
+ return '::'.join([self.cls.fullname, self.name])
+
+ @property
+ def mangled_name(self):
+ return mangle(self.fullname)
+
class Constructor(StaticMethod):
def compile_body(self, println):
args = parse_arguments(println, 'args', *self.args)
diff --git a/newbinding/gen.py b/newbinding/gen.py
index 81a4815..4081f01 100644
--- a/newbinding/gen.py
+++ b/newbinding/gen.py
@@ -128,7 +128,8 @@ class Context(object):
# generate class methods
for method in cls.methods:
name = method.name
- if isinstance(method, StaticMethod):
+ if(isinstance(method, StaticMethod) or
+ isinstance(method, StaticMultiMethod)):
println('@staticmethod')
println('def %(name)s(*args):' % locals())
println2 = indent_println(println)
diff --git a/newbinding/src/DerivedTypes.py b/newbinding/src/DerivedTypes.py
index 10d5fbf..edf4297 100644
--- a/newbinding/src/DerivedTypes.py
+++ b/newbinding/src/DerivedTypes.py
@@ -6,7 +6,11 @@ from Type import Type
FunctionType = Type.Subclass()
FunctionType.include.add('llvm/DerivedTypes.h')
-get = FunctionType.staticmethod(FunctionType.Pointer, Type.Pointer, Bool.From(bool))
+get = FunctionType.staticmultimethod([FunctionType.Pointer,
+ Type.Pointer, Bool.From(bool)],)
+# (FunctionType.Pointer,
+# Type.Pointer, )])
+
isVarArg = FunctionType.method(Bool.To(bool))
getReturnType = FunctionType.method(Type.Pointer)
getParamType = FunctionType.method(Type.Pointer, Unsigned.From(int))
From 3e89a97fdb22e97c529f55380ca632dd53f18fb0 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 22 Jan 2013 15:33:50 -0600
Subject: [PATCH 109/414] Improve Makefile
---
newbinding/Makefile | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/newbinding/Makefile b/newbinding/Makefile
index 49e244b..3996d8b 100644
--- a/newbinding/Makefile
+++ b/newbinding/Makefile
@@ -4,10 +4,10 @@ PYMODS = raw_ostream Type DerivedTypes LLVMContext StringRef AssemblyAnnotationW
all: _api.so _capsule.so
_api.so _capsule.so: api.cpp capsule.cpp
- python setup.py build_ext --inplace
+ $(PYTHON) setup.py build_ext --inplace
api.cpp api.py: src/*.py include/llvm_binding/*.h
- python gen.py api src $(PYMODS)
+ $(PYTHON) gen.py api src $(PYMODS)
clean: cleantemp
rm -f _api.so _capsule.so
@@ -18,6 +18,6 @@ cleantemp:
check: _api.so api.py
- python test2.py
+ $(PYTHON) test2.py
@PHONY: all clean check
From f95b691b61520f8f0d6a7be12ca112ab8bf6e841 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 22 Jan 2013 15:35:05 -0600
Subject: [PATCH 110/414] Expand Module binding
---
newbinding/src/Module.py | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/newbinding/src/Module.py b/newbinding/src/Module.py
index a458401..5923859 100644
--- a/newbinding/src/Module.py
+++ b/newbinding/src/Module.py
@@ -5,21 +5,42 @@ from StringRef import StringRef
from raw_ostream import raw_svector_ostream_helper
from AssemblyAnnotationWriter import AssemblyAnnotationWriter
+# class Module
Module = llvm.Class()
Module.include.add("llvm/Module.h")
+# Enumerators
+Endianness = Module.Enum('AnyEndianness', 'LittleEndian', 'BigEndian')
+PointerSize = Module.Enum('AnyPointerSize', 'Pointer32', 'Pointer64')
+
+# Constructors & Destructors
new = Module.new(StringRef.From(str), LLVMContext.Ref)
delete = Module.delete()
+
+# Module Level Accessor
getModuleIdentifier = Module.method(ConstStdString.To(str))
+getDataLayout = Module.method(ConstStdString.To(str))
+getTargetTriple = Module.method(ConstStdString.To(str))
+getEndianness = Module.method(Endianness)
+getPointerSize = Module.method(PointerSize)
+getContext = Module.method(LLVMContext.Ref)
+getModuleInlineAsm = Module.method(ConstStdString.To(str))
+
+# Module Level Mutators
setModuleIdentifier = Module.method(Void, StringRef.From(str))
setDataLayout = Module.method(Void, StringRef.From(str))
setTargetTriple = Module.method(Void, StringRef.From(str))
setModuleInlineAsm = Module.method(Void, StringRef.From(str))
appendModuleInlineAsm = Module.method(Void, StringRef.From(str))
-getContext = Module.method(LLVMContext.Ref)
+
+# Function Accessors
+#getOrInsertFunction = Module.method(Constant, StringRef.From(str), FunctionType.Pointer)
+
+
+
+# Utilities
dump = Module.method(Void)
print_ = Module.method(Void, raw_svector_ostream_helper.Ref,
AssemblyAnnotationWriter.Pointer)
print_.realname = 'print'
-#getOrInsertFunction = Module.method(Constant, StringRef.From(str), FunctionType.Pointer)
-
+dropAllReferences = Module.method(Void)
From ce103975b853d5fc53246153f617a392a6a79a8d Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 22 Jan 2013 15:40:44 -0600
Subject: [PATCH 111/414] Clean up test
---
newbinding/test2.py | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/newbinding/test2.py b/newbinding/test2.py
index 872dfc0..0d64716 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -2,17 +2,6 @@ import api
#api.capsule.set_debug(True)
context = api.getGlobalContext()
-def test():
- print '*' * 80
- m = api.Module.new("modname", context)
- print m.getModuleIdentifier()
- m.setModuleIdentifier('modname2')
- print m.getModuleIdentifier()
- print 'endianness', m.getEndianness()
- assert m.getEndianness() == api.Module.Endianness.AnyEndianness
- print 'pointer-size', m.getPointerSize()
- assert m.getPointerSize() == api.Module.PointerSize.AnyPointerSize
- m.dump()
m = api.Module.new("modname", context)
print m.getModuleIdentifier()
From 6b88ffbaed4757f95814aa650c7297bd8e6d8f6a Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 22 Jan 2013 21:23:20 -0600
Subject: [PATCH 112/414] Add custom binding to SmallVector
---
newbinding/Makefile | 4 +++-
newbinding/binding.py | 10 ++++++++++
newbinding/include/llvm_binding/extra.h | 24 +++++++++++++++++++++++-
newbinding/src/DerivedTypes.py | 11 +++++++----
newbinding/test2.py | 10 ++++++++--
5 files changed, 51 insertions(+), 8 deletions(-)
diff --git a/newbinding/Makefile b/newbinding/Makefile
index 3996d8b..6ae50be 100644
--- a/newbinding/Makefile
+++ b/newbinding/Makefile
@@ -1,5 +1,7 @@
PYTHON = python
-PYMODS = raw_ostream Type DerivedTypes LLVMContext StringRef AssemblyAnnotationWriter Module
+
+PYMODS = raw_ostream SmallVector Type DerivedTypes StringRef
+PYMODS += LLVMContext AssemblyAnnotationWriter Module
all: _api.so _capsule.so
diff --git a/newbinding/binding.py b/newbinding/binding.py
index de68b55..adeb284 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -190,6 +190,16 @@ Bool = BuiltinType('bool')
Unsigned = BuiltinType('unsigned')
ConstStdString = BuiltinType('const std::string')
+class PyObjectImpl(object):
+ name = 'PyObject*'
+ fullname = name
+ format = 'O'
+
+ def unwrap(self, println, var):
+ return var
+
+PyObject = PyObjectImpl()
+
class Unwrapper(object):
def __init__(self, cls, pytype):
self.cls = cls
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h
index a7388a2..e78f0e2 100644
--- a/newbinding/include/llvm_binding/extra.h
+++ b/newbinding/include/llvm_binding/extra.h
@@ -4,6 +4,8 @@
namespace llvm{
+class Type; //forward declaration
+
class raw_svector_ostream_helper: public raw_svector_ostream {
SmallVectorImpl *SV;
public:
@@ -30,5 +32,25 @@ private:
void operator = (const raw_svector_ostream_helper&);
};
-}
+
+class SmallVector_Type : public SmallVector {
+public:
+ static
+ SmallVector_Type* fromPySequence(PyObject* obj) {
+ SmallVector_Type* SV = new SmallVector_Type;
+ Py_ssize_t sz = PySequence_Size(obj);
+ for (Py_ssize_t i = 0; i < sz; ++i) {
+ PyObject* item = PySequence_GetItem(obj, i);
+ PyObject* cap = PyObject_GetAttrString(item, "_ptr");
+ Type* type = (Type*)PyCapsule_GetPointer(cap, "llvm::Type");
+ SV->push_back(type);
+ Py_XDECREF(cap);
+ Py_XDECREF(item);
+ }
+ return SV;
+ }
+};
+
+
+} // end namespace llvm
diff --git a/newbinding/src/DerivedTypes.py b/newbinding/src/DerivedTypes.py
index edf4297..d9dbb53 100644
--- a/newbinding/src/DerivedTypes.py
+++ b/newbinding/src/DerivedTypes.py
@@ -2,14 +2,17 @@ from binding import *
from namespace import llvm
from LLVMContext import LLVMContext
from Type import Type
+from SmallVector import SmallVector_Type
FunctionType = Type.Subclass()
FunctionType.include.add('llvm/DerivedTypes.h')
-get = FunctionType.staticmultimethod([FunctionType.Pointer,
- Type.Pointer, Bool.From(bool)],)
-# (FunctionType.Pointer,
-# Type.Pointer, )])
+_get_signatures = [(FunctionType.Pointer,
+ Type.Pointer, Bool.From(bool)),
+ (FunctionType.Pointer,
+ Type.Pointer, SmallVector_Type.Ref, Bool.From(bool))]
+
+get = FunctionType.staticmultimethod(*_get_signatures)
isVarArg = FunctionType.method(Bool.To(bool))
getReturnType = FunctionType.method(Type.Pointer)
diff --git a/newbinding/test2.py b/newbinding/test2.py
index 0d64716..6cb8a06 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -1,5 +1,5 @@
import api
-#api.capsule.set_debug(True)
+api.capsule.set_debug(True)
context = api.getGlobalContext()
@@ -14,7 +14,6 @@ assert m.getPointerSize() == api.Module.PointerSize.AnyPointerSize
m.dump()
-
os = api.raw_svector_ostream_helper.create()
m.print_(os, None)
print os.str()
@@ -26,6 +25,13 @@ int1ty.dump()
print int1ty.isIntegerTy(1)
fnty = api.FunctionType.get(int1ty, False)
+fnty.dump()
+print
+
+types = [int1ty, api.Type.getIntNTy(context, 21)]
+sv = api.SmallVector_Type.fromPySequence(types)
+
+fnty = api.FunctionType.get(int1ty, sv, False)
os2 = api.raw_svector_ostream_helper.create()
fnty.print_(os2)
From 6afab6268cca2ff0bdd3c689a22e98dfc1395cb9 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 22 Jan 2013 21:24:14 -0600
Subject: [PATCH 113/414] Refactor mangle
---
newbinding/binding.py | 17 +++++++++++++++--
newbinding/capsule.py | 2 +-
2 files changed, 16 insertions(+), 3 deletions(-)
diff --git a/newbinding/binding.py b/newbinding/binding.py
index adeb284..57d7c7d 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -1,4 +1,5 @@
import logging
+import re
from utils import *
logger = logging.getLogger(__name__)
@@ -41,9 +42,21 @@ def parse_arguments(println, var, *args):
return unwrapped
+_re_mangle_pattern = re.compile(r'[ _<>\*&]')
+
def mangle(name):
- name = name.replace('_', '__').replace(' ', '_')
- return name.replace('::', '_').rstrip('*&')
+ def repl(m):
+ s = m.group(0)
+ if s in '<>*&':
+ return ''
+ elif s in ' ':
+ return '_'
+ elif s in '_':
+ return '__'
+ else:
+ assert False
+ name = _re_mangle_pattern.sub(repl, name)
+ return name.replace('::', '_')
def pycapsule_new(println, ptr, name, clsname, dtor=NULL):
# build capsule
diff --git a/newbinding/capsule.py b/newbinding/capsule.py
index 509b4c4..e4cd4fa 100644
--- a/newbinding/capsule.py
+++ b/newbinding/capsule.py
@@ -36,7 +36,7 @@ def _capsule_destructor(weak):
cap = weak.capsule
addr = _capsule.getPointer(cap)
cls = _capsule.getClassName(cap)
- logger.debug("destroy pointer %s to %s", addr, cls)
+ logger.debug("destroy pointer 0x%08X to %s", addr, cls)
weak.dtor(cap)
del _owners[addr]
From ef4c0d3be395a3c756d414667b4f07ec4a3a48e1 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Wed, 23 Jan 2013 11:18:06 -0600
Subject: [PATCH 114/414] Rename extra.h to llvm_extra.h
---
newbinding/gen.py | 10 +++++-----
.../include/llvm_binding/{extra.h => llvm_extra.h} | 6 +++---
2 files changed, 8 insertions(+), 8 deletions(-)
rename newbinding/include/llvm_binding/{extra.h => llvm_extra.h} (98%)
diff --git a/newbinding/gen.py b/newbinding/gen.py
index 4081f01..bfde891 100644
--- a/newbinding/gen.py
+++ b/newbinding/gen.py
@@ -186,11 +186,11 @@ class Context(object):
def populate_headers(println):
includes = [
- 'llvm_binding/conversion.h',
- 'llvm_binding/binding.h',
- 'llvm_binding/extra.h',
- 'llvm_binding/capsule_context.h',
- ]
+ 'llvm_binding/conversion.h',
+ 'llvm_binding/binding.h',
+ 'llvm_binding/llvm_extra.h',
+ 'llvm_binding/capsule_context.h',
+ ]
for inc in includes:
println('#include "%s"' % inc)
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/llvm_extra.h
similarity index 98%
rename from newbinding/include/llvm_binding/extra.h
rename to newbinding/include/llvm_binding/llvm_extra.h
index e78f0e2..620c3e2 100644
--- a/newbinding/include/llvm_binding/extra.h
+++ b/newbinding/include/llvm_binding/llvm_extra.h
@@ -2,10 +2,10 @@
#include
#include
-namespace llvm{
+namespace llvm{
class Type; //forward declaration
-
+
class raw_svector_ostream_helper: public raw_svector_ostream {
SmallVectorImpl *SV;
public:
@@ -51,6 +51,6 @@ public:
}
};
-
+
} // end namespace llvm
From 6a861d82e6a46fca38565946dac1e604c8bcd093 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Wed, 23 Jan 2013 14:50:17 -0600
Subject: [PATCH 115/414] Implement SmallVector_Type, pycapsule_new
---
newbinding/binding.py | 14 ++---------
newbinding/gen.py | 21 ++++++++++++++++-
newbinding/include/llvm_binding/binding.h | 9 +++++---
.../include/llvm_binding/capsule_context.h | 22 ++++++++++++++++++
newbinding/include/llvm_binding/extra.h | 23 +++++++++++++++++++
newbinding/include/llvm_binding/llvm_extra.h | 20 +---------------
newbinding/src/SmallVector.py | 5 ++++
newbinding/test2.py | 7 +++---
8 files changed, 82 insertions(+), 39 deletions(-)
create mode 100644 newbinding/include/llvm_binding/extra.h
create mode 100644 newbinding/src/SmallVector.py
diff --git a/newbinding/binding.py b/newbinding/binding.py
index 57d7c7d..c9de593 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -58,23 +58,13 @@ def mangle(name):
name = _re_mangle_pattern.sub(repl, name)
return name.replace('::', '_')
-def pycapsule_new(println, ptr, name, clsname, dtor=NULL):
+def pycapsule_new(println, ptr, name, clsname):
# build capsule
name_soften = mangle(name)
var = new_symbol('pycap_%s' % name_soften)
- fmt = 'PyObject* %(var)s = PyCapsule_New(%(ptr)s, "%(name)s", %(dtor)s);'
+ fmt = 'PyObject* %(var)s = pycapsule_new(%(ptr)s, "%(name)s", "%(clsname)s");'
println(fmt % locals())
-
println('if (!%(var)s) return NULL;' % locals())
-
- # build context
- fmt = 'new CapsuleContext("%(clsname)s")'
- context = declare(println, 'CapsuleContext*', fmt % locals())
-
- fmt = 'PyCapsule_SetContext(%(var)s, (void*)%(context)s)'
- err = declare(println, 'int', fmt % locals())
-
- println('if (%(err)s) return NULL;' % locals())
return var
diff --git a/newbinding/gen.py b/newbinding/gen.py
index bfde891..d73b29a 100644
--- a/newbinding/gen.py
+++ b/newbinding/gen.py
@@ -81,7 +81,8 @@ class Context(object):
for name, cls in self.classes.items():
table = cls.mangled_name
println('{ "%(name)s", %(table)s },' % locals())
- println('{ NULL },')
+ println('{ "extra", extra_methodtable },')
+ println('{ NULL }')
println('};')
println('')
@@ -92,6 +93,23 @@ class Context(object):
def generate_py(self, println):
println('import _api, capsule')
println('')
+ # wraps all extras
+ extra_wrapper = '''
+def _init_extra_wrapper():
+ def wrap(callee):
+ def _wrapped(*args):
+ args = map(capsule.unwrap, args)
+ ret = callee(*args)
+ return capsule.wrap(ret)
+ return _wrapped
+ for k in dir(_api.extra):
+ v = getattr(_api.extra, k)
+ if not k.startswith('__') and callable(v):
+ globals()[k] = wrap(v)
+_init_extra_wrapper()
+ '''
+ println(extra_wrapper)
+ println('')
# global function
for name in self.functions:
println('def %(name)s(*args):' % locals())
@@ -190,6 +208,7 @@ def populate_headers(println):
'llvm_binding/binding.h',
'llvm_binding/llvm_extra.h',
'llvm_binding/capsule_context.h',
+ 'llvm_binding/extra.h', # extra submodule to add
]
for inc in includes:
println('#include "%s"' % inc)
diff --git a/newbinding/include/llvm_binding/binding.h b/newbinding/include/llvm_binding/binding.h
index f7bfde6..58a8ad0 100644
--- a/newbinding/include/llvm_binding/binding.h
+++ b/newbinding/include/llvm_binding/binding.h
@@ -51,10 +51,12 @@ create_python_submodule(PyObject* parent, const char* name,
strcpy(fullname + len_parent + 1, name);
PyObject* submod = create_python_module(fullname, methtable);
delete [] fullname;
- if (!submod)
+ if (!submod){
return NULL;
- if( -1 == PyModule_AddObject(parent, name, submod) )
+ }
+ if (-1 == PyModule_AddObject(parent, name, submod)) {
return NULL;
+ }
return submod;
}
@@ -70,4 +72,5 @@ int populate_submodules(PyObject* parent, SubModuleEntry* entries){
return 0;
}
return 1;
-}
\ No newline at end of file
+}
+
diff --git a/newbinding/include/llvm_binding/capsule_context.h b/newbinding/include/llvm_binding/capsule_context.h
index dacfc89..a4070dc 100644
--- a/newbinding/include/llvm_binding/capsule_context.h
+++ b/newbinding/include/llvm_binding/capsule_context.h
@@ -15,5 +15,27 @@ struct CapsuleContext {
};
+static
+PyObject* pycapsule_new(void* ptr,
+ const char* basename,
+ const char* classname=NULL)
+{
+ if (!classname) {
+ classname = basename;
+ }
+ PyObject* cap = PyCapsule_New(ptr, basename, NULL);
+ if (!cap) {
+ PyErr_SetString(PyExc_TypeError, "Error creating new PyCapsule");
+ return NULL;
+ }
+ CapsuleContext* context = new CapsuleContext(classname);
+ if (PyCapsule_SetContext(cap, context)) {
+ return NULL;
+ }
+ return cap;
+}
+
+
+
#endif //LLVMPY_CAPSULE_CONTEXT_H_
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h
new file mode 100644
index 0000000..23548ff
--- /dev/null
+++ b/newbinding/include/llvm_binding/extra.h
@@ -0,0 +1,23 @@
+#include
+#include
+
+static
+PyObject* small_vector_from_types(PyObject* self, PyObject* args) {
+ using llvm::Type;
+ using llvm::SmallVector_Type;
+ SmallVector_Type* SV = new SmallVector_Type;
+ Py_ssize_t size = PyTuple_Size(args);
+ for (Py_ssize_t i = 0; i < size; ++i) {
+ PyObject* cap = PyTuple_GetItem(args, i);
+ Type* type = (Type*)PyCapsule_GetPointer(cap, "llvm::Type");
+ SV->push_back(type);
+ }
+ return pycapsule_new(SV, "llvm::SmallVector_Type");
+}
+
+static PyMethodDef extra_methodtable[] = {
+#define method(func) { #func, (PyCFunction)func, METH_VARARGS, NULL }
+method( small_vector_from_types ),
+{ NULL }
+#undef method
+};
diff --git a/newbinding/include/llvm_binding/llvm_extra.h b/newbinding/include/llvm_binding/llvm_extra.h
index 620c3e2..f920a47 100644
--- a/newbinding/include/llvm_binding/llvm_extra.h
+++ b/newbinding/include/llvm_binding/llvm_extra.h
@@ -32,25 +32,7 @@ private:
void operator = (const raw_svector_ostream_helper&);
};
+typedef SmallVector SmallVector_Type;
-class SmallVector_Type : public SmallVector {
-public:
- static
- SmallVector_Type* fromPySequence(PyObject* obj) {
- SmallVector_Type* SV = new SmallVector_Type;
- Py_ssize_t sz = PySequence_Size(obj);
- for (Py_ssize_t i = 0; i < sz; ++i) {
- PyObject* item = PySequence_GetItem(obj, i);
- PyObject* cap = PyObject_GetAttrString(item, "_ptr");
- Type* type = (Type*)PyCapsule_GetPointer(cap, "llvm::Type");
- SV->push_back(type);
- Py_XDECREF(cap);
- Py_XDECREF(item);
- }
- return SV;
- }
-};
-
-
} // end namespace llvm
diff --git a/newbinding/src/SmallVector.py b/newbinding/src/SmallVector.py
new file mode 100644
index 0000000..225c720
--- /dev/null
+++ b/newbinding/src/SmallVector.py
@@ -0,0 +1,5 @@
+from binding import *
+from namespace import llvm
+
+SmallVector_Type = llvm.Class()
+delete = SmallVector_Type.delete()
diff --git a/newbinding/test2.py b/newbinding/test2.py
index 6cb8a06..6f087c2 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -1,4 +1,5 @@
import api
+import _capsule
api.capsule.set_debug(True)
context = api.getGlobalContext()
@@ -26,12 +27,10 @@ print int1ty.isIntegerTy(1)
fnty = api.FunctionType.get(int1ty, False)
fnty.dump()
-print
types = [int1ty, api.Type.getIntNTy(context, 21)]
-sv = api.SmallVector_Type.fromPySequence(types)
-
-fnty = api.FunctionType.get(int1ty, sv, False)
+svt = api.small_vector_from_types(*types)
+fnty = api.FunctionType.get(int1ty, svt, False)
os2 = api.raw_svector_ostream_helper.create()
fnty.print_(os2)
From e9be14ca0e18fbe8fe4b79af20288db8f9dcad4f Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Wed, 23 Jan 2013 15:24:37 -0600
Subject: [PATCH 116/414] Refactor raw_svector_stream_helper
---
newbinding/include/llvm_binding/extra.h | 26 +++++++++++++++++++++++--
newbinding/src/Module.py | 11 +++++------
newbinding/src/Type.py | 4 ++--
newbinding/src/raw_ostream.py | 9 ++-------
newbinding/test2.py | 14 ++++++++-----
5 files changed, 42 insertions(+), 22 deletions(-)
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h
index 23548ff..417c0f8 100644
--- a/newbinding/include/llvm_binding/extra.h
+++ b/newbinding/include/llvm_binding/extra.h
@@ -1,15 +1,36 @@
#include
#include
+#include
static
-PyObject* small_vector_from_types(PyObject* self, PyObject* args) {
+PyObject* make_raw_ostream_for_printing(PyObject* self, PyObject* args) {
+ using llvm::raw_svector_ostream_helper;
+ using llvm::raw_svector_ostream;
+
+ if (!PyArg_ParseTuple(args, "")) {
+ return NULL;
+ }
+ raw_svector_ostream* RSOH = raw_svector_ostream_helper::create();
+ return pycapsule_new(RSOH, "llvm::raw_ostream",
+ "llvm::raw_svector_ostream");
+}
+
+static
+PyObject* make_small_vector_from_types(PyObject* self, PyObject* args) {
using llvm::Type;
using llvm::SmallVector_Type;
+
SmallVector_Type* SV = new SmallVector_Type;
Py_ssize_t size = PyTuple_Size(args);
for (Py_ssize_t i = 0; i < size; ++i) {
PyObject* cap = PyTuple_GetItem(args, i);
+ if (!cap) {
+ return NULL;
+ }
Type* type = (Type*)PyCapsule_GetPointer(cap, "llvm::Type");
+ if (!type) {
+ return NULL;
+ }
SV->push_back(type);
}
return pycapsule_new(SV, "llvm::SmallVector_Type");
@@ -17,7 +38,8 @@ PyObject* small_vector_from_types(PyObject* self, PyObject* args) {
static PyMethodDef extra_methodtable[] = {
#define method(func) { #func, (PyCFunction)func, METH_VARARGS, NULL }
-method( small_vector_from_types ),
+method( make_raw_ostream_for_printing ),
+method( make_small_vector_from_types ),
{ NULL }
#undef method
};
diff --git a/newbinding/src/Module.py b/newbinding/src/Module.py
index 5923859..67ac8b0 100644
--- a/newbinding/src/Module.py
+++ b/newbinding/src/Module.py
@@ -2,7 +2,9 @@ from binding import *
from namespace import llvm
from LLVMContext import LLVMContext
from StringRef import StringRef
-from raw_ostream import raw_svector_ostream_helper
+from Constant import Constant
+from DerivedTypes import FunctionType
+from raw_ostream import raw_ostream
from AssemblyAnnotationWriter import AssemblyAnnotationWriter
# class Module
@@ -34,13 +36,10 @@ setModuleInlineAsm = Module.method(Void, StringRef.From(str))
appendModuleInlineAsm = Module.method(Void, StringRef.From(str))
# Function Accessors
-#getOrInsertFunction = Module.method(Constant, StringRef.From(str), FunctionType.Pointer)
-
-
+getOrInsertFunction = Module.method(Constant.Pointer, StringRef.From(str), FunctionType.Pointer)
# Utilities
dump = Module.method(Void)
-print_ = Module.method(Void, raw_svector_ostream_helper.Ref,
- AssemblyAnnotationWriter.Pointer)
+print_ = Module.method(Void, raw_ostream.Ref, AssemblyAnnotationWriter.Pointer)
print_.realname = 'print'
dropAllReferences = Module.method(Void)
diff --git a/newbinding/src/Type.py b/newbinding/src/Type.py
index 19f6d61..3703200 100644
--- a/newbinding/src/Type.py
+++ b/newbinding/src/Type.py
@@ -1,7 +1,7 @@
from binding import *
from namespace import llvm
from LLVMContext import LLVMContext
-from raw_ostream import raw_svector_ostream_helper
+from raw_ostream import raw_ostream
Type = llvm.Class()
Type.include.add('llvm/Type.h')
@@ -13,7 +13,7 @@ PointerType = SequentialType.Subclass()
getContext = Type.method(LLVMContext.Ref)
dump = Type.method(Void)
-print_ = Type.method(Void, raw_svector_ostream_helper.Ref)
+print_ = Type.method(Void, raw_ostream.Ref)
print_.realname = 'print'
def type_checker():
diff --git a/newbinding/src/raw_ostream.py b/newbinding/src/raw_ostream.py
index 0275db4..64e8046 100644
--- a/newbinding/src/raw_ostream.py
+++ b/newbinding/src/raw_ostream.py
@@ -5,13 +5,8 @@ from StringRef import StringRef
raw_ostream = llvm.Class()
raw_ostream.include.add("llvm/Support/raw_ostream.h")
+delete = raw_ostream.delete()
raw_svector_ostream = raw_ostream.Subclass()
raw_svector_ostream.include.add("llvm/Support/raw_os_ostream.h")
-
-# extra class to help binding
-raw_svector_ostream_helper = raw_svector_ostream.Subclass()
-create = raw_svector_ostream_helper.staticmethod(
- raw_svector_ostream_helper.Pointer)
-delete = raw_svector_ostream_helper.delete()
-str = raw_svector_ostream_helper.method(StringRef.To(str))
+str = raw_svector_ostream.method(StringRef.To(str))
diff --git a/newbinding/test2.py b/newbinding/test2.py
index 6f087c2..b866f59 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -15,7 +15,7 @@ assert m.getPointerSize() == api.Module.PointerSize.AnyPointerSize
m.dump()
-os = api.raw_svector_ostream_helper.create()
+os = api.make_raw_ostream_for_printing()
m.print_(os, None)
print os.str()
@@ -29,10 +29,14 @@ fnty = api.FunctionType.get(int1ty, False)
fnty.dump()
types = [int1ty, api.Type.getIntNTy(context, 21)]
-svt = api.small_vector_from_types(*types)
+svt = api.make_small_vector_from_types(*types)
fnty = api.FunctionType.get(int1ty, svt, False)
-os2 = api.raw_svector_ostream_helper.create()
-fnty.print_(os2)
-print os2.str()
+os = api.make_raw_ostream_for_printing()
+fnty.print_(os)
+print os.str()
+fn = m.getOrInsertFunction("foo", fnty)
+os = api.make_raw_ostream_for_printing()
+fn.print_(os, None)
+print os.str()
From e9e1f5703dd43b850735397bd005173a8ae9831d Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Wed, 23 Jan 2013 15:25:04 -0600
Subject: [PATCH 117/414] Add Value, User, Constant
---
newbinding/Makefile | 2 ++
newbinding/src/Constant.py | 5 +++++
newbinding/src/User.py | 5 +++++
newbinding/src/Value.py | 8 ++++++++
4 files changed, 20 insertions(+)
create mode 100644 newbinding/src/Constant.py
create mode 100644 newbinding/src/User.py
create mode 100644 newbinding/src/Value.py
diff --git a/newbinding/Makefile b/newbinding/Makefile
index 6ae50be..d07bc8f 100644
--- a/newbinding/Makefile
+++ b/newbinding/Makefile
@@ -1,8 +1,10 @@
PYTHON = python
PYMODS = raw_ostream SmallVector Type DerivedTypes StringRef
+PYMODS += Value User Constant
PYMODS += LLVMContext AssemblyAnnotationWriter Module
+
all: _api.so _capsule.so
_api.so _capsule.so: api.cpp capsule.cpp
diff --git a/newbinding/src/Constant.py b/newbinding/src/Constant.py
new file mode 100644
index 0000000..24045bb
--- /dev/null
+++ b/newbinding/src/Constant.py
@@ -0,0 +1,5 @@
+from binding import *
+from namespace import llvm
+from User import User
+
+Constant = User.Subclass()
diff --git a/newbinding/src/User.py b/newbinding/src/User.py
new file mode 100644
index 0000000..8753983
--- /dev/null
+++ b/newbinding/src/User.py
@@ -0,0 +1,5 @@
+from binding import *
+from namespace import llvm
+from Value import Value
+
+User = Value.Subclass()
diff --git a/newbinding/src/Value.py b/newbinding/src/Value.py
new file mode 100644
index 0000000..ec7aa9a
--- /dev/null
+++ b/newbinding/src/Value.py
@@ -0,0 +1,8 @@
+from binding import *
+from namespace import llvm
+from raw_ostream import raw_ostream
+from AssemblyAnnotationWriter import AssemblyAnnotationWriter
+
+Value = llvm.Class()
+print_ = Value.method(Void, raw_ostream.Ref, AssemblyAnnotationWriter.Pointer)
+print_.realname = 'print'
From c247cf95271de8ca29d89ffcce3b94920e0599d0 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Wed, 23 Jan 2013 15:28:46 -0600
Subject: [PATCH 118/414] Update generator script so that order of modules does
not matter.
---
newbinding/Makefile | 4 ++--
newbinding/gen.py | 11 ++++++++---
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/newbinding/Makefile b/newbinding/Makefile
index d07bc8f..61227e5 100644
--- a/newbinding/Makefile
+++ b/newbinding/Makefile
@@ -1,9 +1,9 @@
PYTHON = python
PYMODS = raw_ostream SmallVector Type DerivedTypes StringRef
-PYMODS += Value User Constant
-PYMODS += LLVMContext AssemblyAnnotationWriter Module
+PYMODS += LLVMContext AssemblyAnnotationWriter Module
+PYMODS += Value User Constant
all: _api.so _capsule.so
diff --git a/newbinding/gen.py b/newbinding/gen.py
index d73b29a..cee71f1 100644
--- a/newbinding/gen.py
+++ b/newbinding/gen.py
@@ -56,6 +56,7 @@ class Context(object):
self.functions = {}
self.classes = {}
self.definitions = []
+ self._pending_symbols = []
def generate_cpp(self, println):
for i in self.includes:
@@ -168,12 +169,15 @@ _init_extra_wrapper()
def add_module(self, module):
allsyms = [(k, v) for k, v in vars(module).items()
if isinstance(v, Binding)]
- symtab = sorted(allsyms, key=lambda x: x[1].rank)
-
# generate includes
- for k, v in symtab:
+ for k, v in allsyms:
self.includes |= v.include
+ self._pending_symbols.extend(allsyms)
+
+ def materialize(self):
+ symtab = sorted(self._pending_symbols, key=lambda x: x[1].rank)
+
# compile everything
for k, v in symtab:
buf = StringIO()
@@ -237,6 +241,7 @@ if __name__ == '__main__':
for mod in modules:
context.add_module(mod)
+ context.materialize()
with open('%s.cpp' % outputfilename, 'w') as outfile:
println = wrap_println(outfile)
From a3da74c416579ebdc6bc1f1b72dd68c7811b53e0 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Wed, 23 Jan 2013 15:44:19 -0600
Subject: [PATCH 119/414] Expand Value class
---
newbinding/src/Value.py | 18 +++++++++++++++++-
newbinding/test2.py | 4 ++++
2 files changed, 21 insertions(+), 1 deletion(-)
diff --git a/newbinding/src/Value.py b/newbinding/src/Value.py
index ec7aa9a..062ad43 100644
--- a/newbinding/src/Value.py
+++ b/newbinding/src/Value.py
@@ -2,7 +2,23 @@ from binding import *
from namespace import llvm
from raw_ostream import raw_ostream
from AssemblyAnnotationWriter import AssemblyAnnotationWriter
-
+from Type import Type
+from LLVMContext import LLVMContext
+from StringRef import StringRef
+#
Value = llvm.Class()
+
+dump = Value.method(Void)
+
print_ = Value.method(Void, raw_ostream.Ref, AssemblyAnnotationWriter.Pointer)
print_.realname = 'print'
+
+getType = Value.method(Type.Pointer)
+getContext = Value.method(LLVMContext.Ref)
+
+hasName = Value.method(Bool.To(bool))
+# skip getValueName, setValueName
+getName = Value.method(StringRef.To(str))
+setName = Value.method(Void, StringRef.From(str))
+
+replaceAllUsesWith = Value.method(Void, Value.Pointer)
\ No newline at end of file
diff --git a/newbinding/test2.py b/newbinding/test2.py
index b866f59..ac74594 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -40,3 +40,7 @@ fn = m.getOrInsertFunction("foo", fnty)
os = api.make_raw_ostream_for_printing()
fn.print_(os, None)
print os.str()
+assert fn.hasName()
+assert 'foo' == fn.getName()
+fn.setName('bar')
+assert 'bar' == fn.getName()
From eba88b32ba5fb5597e664f8662fd6dcce00f2dc9 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Fri, 25 Jan 2013 12:29:31 -0600
Subject: [PATCH 120/414] Major refactoring
---
newbinding/Makefile | 9 +-
newbinding/binding.py | 924 +++++++-----------
newbinding/codegen.py | 279 ++++++
newbinding/extra.py | 20 +
newbinding/gen.py | 305 ++----
.../include/llvm_binding/auto_pyobject.h | 38 +
newbinding/include/llvm_binding/conversion.h | 5 +
newbinding/src/AssemblyAnnotationWriter.py | 5 +-
newbinding/src/Constant.py | 4 +-
newbinding/src/DerivedTypes.py | 22 +-
newbinding/src/LLVMContext.py | 8 +-
newbinding/src/Module.py | 60 +-
newbinding/src/SmallVector.py | 5 +-
newbinding/src/StringRef.py | 5 +-
newbinding/src/Type.py | 169 ++--
newbinding/src/User.py | 5 +-
newbinding/src/Value.py | 25 +-
newbinding/src/__init__.py | 2 +
newbinding/src/namespace.py | 1 -
newbinding/src/raw_ostream.py | 17 +-
newbinding/test2.py | 9 +-
newbinding/utils.py | 6 -
22 files changed, 999 insertions(+), 924 deletions(-)
create mode 100644 newbinding/codegen.py
create mode 100644 newbinding/extra.py
create mode 100644 newbinding/include/llvm_binding/auto_pyobject.h
delete mode 100644 newbinding/utils.py
diff --git a/newbinding/Makefile b/newbinding/Makefile
index 61227e5..735d4ff 100644
--- a/newbinding/Makefile
+++ b/newbinding/Makefile
@@ -1,17 +1,12 @@
PYTHON = python
-PYMODS = raw_ostream SmallVector Type DerivedTypes StringRef
-
-PYMODS += LLVMContext AssemblyAnnotationWriter Module
-PYMODS += Value User Constant
-
all: _api.so _capsule.so
_api.so _capsule.so: api.cpp capsule.cpp
$(PYTHON) setup.py build_ext --inplace
-api.cpp api.py: src/*.py include/llvm_binding/*.h
- $(PYTHON) gen.py api src $(PYMODS)
+api.cpp api.py: src/*.py include/llvm_binding/*.h gen.py binding.py
+ $(PYTHON) gen.py api src
clean: cleantemp
rm -f _api.so _capsule.so
diff --git a/newbinding/binding.py b/newbinding/binding.py
index c9de593..fc26d92 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -1,108 +1,352 @@
-import logging
-import re
-from utils import *
+import functools
+import codegen as cg
-logger = logging.getLogger(__name__)
+_rank = 0
+namespaces = {}
-_py2capi_fmtmap = {
- str: 's#',
-}
+class Namespace(object):
+ def __init__(self, name):
+ self.name = name
+ self.classes = []
+ self.functions = []
+ namespaces[name] = self
-NULL = 'NULL'
+ def Class(self, *bases):
+ cls = Class(self, *bases)
+ self.classes.append(cls)
+ return cls
-_symbols = set()
+ def Function(self, *args):
+ fn = Function(self, *args)
+ self.functions.append(fn)
+ return fn
-def new_symbol(name):
- if name in _symbols:
- ct = 1
- orig = name
- while name in _symbols:
- name = '%s%d' % (orig, ct)
- ct += 1
- _symbols.add(name)
- return name
+ @property
+ def fullname(self):
+ return self.name
-def parse_arguments(println, var, *args):
- typecodes = []
- holders = []
- argvals = []
- for arg in args:
- typecodes.append(arg.format)
- val = declare(println, 'PyObject*')
- argvals.append(val)
- holders.append('&' + val)
+ def __str__(self):
+ return self.name
- items = [var, '"%s"' % (''.join(typecodes))] + holders
- println('if(!PyArg_ParseTuple(%s)) return NULL;' % ', '.join(items))
+class Type(object):
+ pass
- # unwrap
- unwrapped = []
- for arg, val in zip(args, argvals):
- unwrapped.append(arg.unwrap(println, val))
+class BuiltinTypes(Type):
+ def __init__(self, name):
+ self.name = name
- return unwrapped
+ @property
+ def fullname(self):
+ return self.name
-_re_mangle_pattern = re.compile(r'[ _<>\*&]')
+ def wrap(self, writer, var):
+ return var
-def mangle(name):
- def repl(m):
- s = m.group(0)
- if s in '<>*&':
- return ''
- elif s in ' ':
- return '_'
- elif s in '_':
- return '__'
+Void = BuiltinTypes('void')
+Unsigned = BuiltinTypes('unsigned')
+Bool = BuiltinTypes('bool')
+ConstStdString = BuiltinTypes('const std::string')
+
+class Class(Type):
+ format = 'O'
+
+ def __init__(self, ns, *bases):
+ self.ns = ns
+ self.bases = bases
+ self._is_defined = False
+ self.methods = []
+ self.enums = []
+ self.includes = set()
+
+ def __call__(self, defn):
+ assert not self._is_defined
+ self.name = defn.__name__
+ for k, v in defn.__dict__.items():
+ if isinstance(v, Method):
+ self.methods.append(v)
+ if isinstance(v, Constructor):
+ for sig in v.signatures:
+ sig[0] = ptr(self)
+ v.name = k
+ v.parent = self
+ elif isinstance(v, Enum):
+ self.enums.append(v)
+ v.name = k
+ v.parent = self
+ elif k == '_include_':
+ if isinstance(v, str):
+ self.includes.add(v)
+ else:
+ for i in v:
+ self.includes.add(i)
+ return self
+
+ def compile_cpp(self, writer):
+ # generate methods
+ for meth in self.methods:
+ meth.compile_cpp(writer)
+
+ # generate method table
+ writer.println('static')
+ writer.println('PyMethodDef %s[] = {' % cg.mangle(self.fullname))
+ with writer.indent():
+ fmt = '{ "%(name)s", (PyCFunction)%(func)s, METH_VARARGS, NULL },'
+ for meth in self.methods:
+ name = meth.name
+ func = cg.mangle(meth.fullname)
+ writer.println(fmt % locals())
+ writer.println('{ NULL },')
+ writer.println('};')
+ writer.println()
+
+ def compile_py(self, writer):
+ clsname = self.name
+ bases = 'capsule.Wrapper'
+ if self.bases:
+ bases = ', '.join(x.name for x in self.bases)
+ writer.println('@capsule.register_class')
+ with writer.block('class %(clsname)s(%(bases)s):' % locals()):
+ for enum in self.enums:
+ enum.compile_py(writer)
+ for meth in self.methods:
+ meth.compile_py(writer)
+ if not self.enums and not self.methods:
+ writer.println('pass')
+ writer.println()
+
+ @property
+ def capsule_name(self):
+ if self.bases:
+ return self.bases[-1].capsule_name
else:
- assert False
- name = _re_mangle_pattern.sub(repl, name)
- return name.replace('::', '_')
+ return self.fullname
-def pycapsule_new(println, ptr, name, clsname):
- # build capsule
- name_soften = mangle(name)
- var = new_symbol('pycap_%s' % name_soften)
- fmt = 'PyObject* %(var)s = pycapsule_new(%(ptr)s, "%(name)s", "%(clsname)s");'
- println(fmt % locals())
- println('if (!%(var)s) return NULL;' % locals())
- return var
+ @property
+ def fullname(self):
+ try:
+ name = self.realname
+ except AttributeError:
+ name = self.name
+ return '::'.join([self.ns.fullname, name])
+
+ def __str__(self):
+ return self.fullname
+
+ def unwrap(self, writer, val):
+ fmt = 'PyCapsule_GetPointer(%(val)s, "%(name)s")'
+ name = self.capsule_name
+ raw = writer.declare('void*', fmt % locals())
+ writer.die_if_false(raw)
+ ptrty = ptr(self).fullname
+ ty = self.fullname
+ fmt = 'typecast<%(ty)s>::from(%(raw)s)'
+ casted = writer.declare(ptrty, fmt % locals())
+ writer.die_if_false(casted)
+ return casted
-def declare(println, typ, init=None):
- typ_soften = mangle(typ)
- var = new_symbol('var_%s' % typ_soften)
- if init is None:
- println('%(typ)s %(var)s;' % locals())
- else:
- println('%(typ)s %(var)s = %(init)s;' % locals())
- return var
+class Enum(object):
+ def __init__(self, *value_names):
+ self.parent = None
+ self.value_names = value_names
+
+ @property
+ def fullname(self):
+ try:
+ name = self.realname
+ except AttributeError:
+ name = self.name
+ return '::'.join([self.parent.fullname, name])
+
+ def __str__(self):
+ return self.fullname
+
+ def wrap(self, writer, val):
+ ret = writer.declare('PyObject*', 'NULL')
+ with writer.block('switch(%s) ' % val):
+ for v in self.value_names:
+ writer.println('case %s::%s:' % (self.parent, v))
+ with writer.indent():
+ fmt = '%(ret)s = PyString_FromString("%(v)s");'
+ writer.println(fmt % locals())
+ writer.println('break;')
+ else:
+ writer.println('default:')
+ with writer.indent():
+ writer.raises(ValueError, 'Invalid enum %s' % v)
+ return ret
+
+ def compile_py(self, writer):
+ with writer.block('class %s:' % self.name):
+ for v in self.value_names:
+ writer.println('%(v)s = "%(v)s"' % locals())
+ writer.println()
+
+class Method(object):
+ _kind_ = 'meth'
+
+ def __init__(self, return_type=Void, *args):
+ self.parent = None
+ self.signatures = []
+ self.includes = set()
+ self._add_signature(return_type, *args)
+
+ def _add_signature(self, return_type, *args):
+ prev_lens = set(map(len, self.signatures))
+ cur_len = len(args) + 1
+ if cur_len in prev_lens:
+ raise Exception('Only support overloading with different number'
+ ' of arguments')
+ self.signatures.append([return_type] + list(args))
+
+ def __ior__(self, method):
+ assert type(self) is type(method)
+ for sig in method.signatures:
+ self._add_signature(sig[0], *sig[1:])
+ return self
+
+ @property
+ def fullname(self):
+ return '::'.join([self.parent.fullname, self.realname])
+
+ @property
+ def realname(self):
+ try:
+ return self.__realname
+ except AttributeError:
+ return self.name
+
+ @realname.setter
+ def realname(self, v):
+ self.__realname = v
+
+ def __str__(self):
+ return self.fullname
+
+ def compile_cpp(self, writer):
+ with writer.py_function(self.fullname):
+ if len(self.signatures) == 1:
+ sig = self.signatures[0]
+ retty = sig[0]
+ argtys = sig[1:]
+ self.compile_cpp_body(writer, retty, argtys)
+ else:
+ nargs = writer.declare('Py_ssize_t', 'PyTuple_Size(args)')
+ for sig in self.signatures:
+ retty = sig[0]
+ argtys = sig[1:]
+ expect = len(argtys)
+ if (not isinstance(self, StaticMethod) and
+ isinstance(self.parent, Class)):
+ # Is a instance method, add 1 for "this".
+ expect += 1
+ with writer.block('if (%(expect)d == %(nargs)s)' % locals()):
+ self.compile_cpp_body(writer, retty, argtys)
+ writer.raises(TypeError, 'Invalid number of args')
+
+ def compile_cpp_body(self, writer, retty, argtys):
+ if isinstance(self.parent, Class):
+ args = writer.parse_arguments('args', ptr(self.parent), *argtys)
+ ret = writer.method_call(self.realname, retty.fullname, *args)
+ else:
+ args = writer.parse_arguments('args', *argtys)
+ ret = writer.call(self.fullname, retty.fullname, *args)
+ writer.return_value(retty.wrap(writer, ret))
+
+ def compile_py(self, writer):
+ decl = writer.function(self.name, args=('self',), varargs='args')
+ with decl as (this, varargs):
+ unwrap_this = writer.unwrap(this)
+ unwrapped = writer.unwrap_many(varargs)
+ func = '.'.join([self.parent.name, self.name])
+ ret = writer.call('_api.%s' % func,
+ args=(unwrap_this,), varargs=unwrapped)
+ wrapped = writer.wrap(ret)
+ writer.return_value(wrapped)
+ writer.println()
-def return_value(println, var):
- println('return %(var)s;' % locals())
+class StaticMethod(Method):
+
+ def compile_cpp_body(self, writer, retty, argtys):
+ assert isinstance(self.parent, Class)
+ args = writer.parse_arguments('args', *argtys)
+ ret = self.compile_cpp_call(writer, retty, args)
+ writer.return_value(retty.wrap(writer, ret))
+
+ def compile_cpp_call(self, writer, retty, args):
+ ret = writer.call(self.fullname, retty.fullname, *args)
+ return ret
+
+ def compile_py(self, writer):
+ writer.println('@staticmethod')
+ decl = writer.function(self.name, varargs='args')
+ with decl as varargs:
+ unwrapped = writer.unwrap_many(varargs)
+ func = '.'.join([self.parent.name, self.name])
+ ret = writer.call('_api.%s' % func, varargs=unwrapped)
+ wrapped = writer.wrap(ret)
+ writer.return_value(wrapped)
+ writer.println()
-def return_none(println):
- println('Py_RETURN_NONE;')
+class Function(Method):
+ _kind_ = 'func'
+
+ def __init__(self, parent, name, return_type=Void, *args):
+ super(Function, self).__init__(return_type, *args)
+ self.parent = parent
+ self.name = name
+
+ def compile_py(self, writer):
+ with writer.function(self.name, varargs='args') as varargs:
+ unwrapped = writer.unwrap_many(varargs)
+ func = self.fullname.split('::', 1)[1].replace('::', '.')
+ ret = writer.call('_api.%s' % func,
+ varargs=unwrapped)
+ wrapped = writer.wrap(ret)
+ writer.return_value(wrapped)
+ writer.println()
-def die_if_null(println, var):
- println('if (!%(var)s) return NULL;' % locals())
+class Destructor(Method):
+ _kind_ = 'dtor'
-
-class Binding(object):
- __rank_global = 0
def __init__(self):
- self.rank = Binding.__rank_global
- Binding.__rank_global += 1
- self.include = set()
+ super(Destructor, self).__init__()
- def compile(self, name, println):
- raise NotImplementedError(type(self))
+ def compile_cpp_body(self, writer, retty, argtys):
+ assert isinstance(self.parent, Class)
+ assert not argtys
+ args = writer.parse_arguments('args', ptr(self.parent), *argtys)
+ writer.println('delete %s;' % args[0])
+ writer.return_value(None)
-class Ref(object):
- def __init__(self, elem):
- self.element = elem
+ def compile_py(self, writer):
+ func = '.'.join([self.parent.name, self.name])
+ writer.println('_delete_ = _api.%s' % func)
+
+
+class Constructor(StaticMethod):
+ _kind_ = 'ctor'
+
+ def __init__(self, *args):
+ super(Constructor, self).__init__(Void, *args)
+
+ def compile_cpp_call(self, writer, retty, args):
+ alloctype = retty.fullname.rstrip(' *')
+ arglist = ', '.join(args)
+ stmt = 'new %(alloctype)s(%(arglist)s)' % locals()
+ ret = writer.declare(retty.fullname, stmt)
+ return ret
+
+class ref(Type):
+ def __init__(self, element):
+ assert isinstance(element, Class), type(element)
+ self.element = element
+
+ def __str__(self):
+ return self.fullname
@property
def fullname(self):
@@ -112,503 +356,79 @@ class Ref(object):
def capsule_name(self):
return self.element.capsule_name
- @property
- def pointer(self):
- return self.element.pointer
-
- def as_pointer(self, println, var):
- init = '&%s' % (var)
- casted = declare(println, self.pointer, init)
- return casted
-
@property
def format(self):
- return 'O'
+ return self.element.format
- def unwrap(self, println, var):
- ptr = self.element.unwrap(println, var)
- return declare(println, self.fullname, '*%s' % ptr)
+ def wrap(self, writer, val):
+ p = writer.declare(ptr(self.element).fullname, '&%s' % val)
+ return writer.pycapsule_new(p, self.capsule_name, self.element.fullname)
- def wrap(self, println, var):
- return self.element.wrap(println, self.as_pointer(println, var))
+ def unwrap(self, writer, val):
+ p = self.element.unwrap(writer, val)
+ return writer.declare(self.fullname, '*%s' % p)
-class Pointer(object):
- def __init__(self, elem):
- self.element = elem
+class ptr(Type):
+ def __init__(self, element):
+ assert isinstance(element, Class)
+ self.element = element
@property
def fullname(self):
- return '%s*' % self.element.fullname
-
- @property
- def capsule_name(self):
- return self.element.capsule_name
-
- @property
- def pointer(self):
- return self.element.pointer
+ return '%s*' % self.element
@property
def format(self):
- return 'O'
+ return self.element.format
- def unwrap(self, println, var):
- ret = declare(println, self.fullname)
- println2 = indent_println(println)
- println('if (%(var)s == Py_None) {' % locals())
- println2('%(ret)s = NULL;' % locals())
- println('} else {')
- ptr = self.element.unwrap(println2, var)
- println2('%(ret)s = %(ptr)s;' % locals())
- println('}')
+ def unwrap(self, writer, val):
+ ret = writer.declare(self.fullname, 'NULL')
+ with writer.block('if (%(val)s != Py_None)' % locals()):
+ val = self.element.unwrap(writer, val)
+ writer.println('%(ret)s = %(val)s;' % locals())
return ret
- def wrap(self, println, var):
- return self.element.wrap(println, var)
+ def wrap(self, writer, val):
+ return writer.pycapsule_new(val, self.element.capsule_name,
+ self.element.fullname)
-
-class BuiltinType(object):
- def __init__(self, name):
- self.name = name
- self.Ref = Ref(self)
- self.Pointer = Pointer(self)
-
- @property
- def fullname(self):
- return self.name
-
- @property
- def capsule_name(self):
- return self.fullname
-
- def To(self, pytype):
- return Wrapper(self, pytype)
-
- def From(self, pytype):
- return Unwrapper(self, pytype)
-
-Void = BuiltinType('void')
-Bool = BuiltinType('bool')
-Unsigned = BuiltinType('unsigned')
-ConstStdString = BuiltinType('const std::string')
-
-class PyObjectImpl(object):
- name = 'PyObject*'
- fullname = name
+class cast(Type):
format = 'O'
- def unwrap(self, println, var):
- return var
-
-PyObject = PyObjectImpl()
-
-class Unwrapper(object):
- def __init__(self, cls, pytype):
- self.cls = cls
- self.pytype = pytype
+ def __init__(self, original, target):
+ self.original = original
+ self.target = target
@property
def fullname(self):
- return str(self.pytype)
+ return self.binding_type.fullname
@property
- def format(self):
- return 'O'
-
- def unwrap(self, println, var):
- out = declare(println, self.cls.fullname)
- conv = 'py_%s_to' % (self.pytype.__name__)
- status = '%(conv)s(%(var)s, %(out)s)' % locals()
- println('if (!%(status)s) return NULL;' % locals())
- return out
-
-
-class Wrapper(object):
- def __init__(self, cls, pytype):
- self.cls = cls
- self.pytype = pytype
-
- @property
- def fullname(self):
- return self.cls.fullname
-
- def wrap(self, println, var):
- conv = 'py_%s_from' % (self.pytype.__name__)
- func = '%(conv)s(%(var)s)' % locals()
- out = declare(println, 'PyObject*', func)
- println('if (!%(out)s) return NULL;' % locals())
- return out
-
-class Enum(Binding):
- def __init__(self, ns, *values):
- super(Enum, self).__init__()
- self.values = values
- self.ns = ns
- self.name = None
-
- def compile(self, name, println):
- self.name = self.name or name
-
- @property
- def fullname(self):
- return '::'.join([self.ns, self.name])
-
-class ClassEnum(Enum):
- def __init__(self, cls, *values):
- super(ClassEnum, self).__init__(None, *values)
- self.cls = cls
- self.cls.enums.append(self)
-
- def compile(self, name, println):
- self.ns = self.cls.fullname
- super(ClassEnum, self).compile(name, println)
-
- def wrap(self, println, var):
- println2 = indent_println(println)
- ret = declare(println, 'PyObject*', NULL)
- println('switch(%s) { ' % var)
- for v in self.values:
- println('case %s::%s:' % (self.ns, v))
- println2('%(ret)s = PyString_FromString("%(v)s");' % locals())
- println2('break;')
+ def python_type(self):
+ if not isinstance(self.target, Type):
+ return self.target
else:
- println('default:')
- println2('PyErr_SetString(PyExc_TypeError, "Invalid enum: %s");' %
- v)
- println2('return NULL;')
- println('}')
+ return self.original
+
+ @property
+ def binding_type(self):
+ if isinstance(self.target, Type):
+ return self.target
+ else:
+ return self.original
+
+ def wrap(self, writer, val):
+ dst = self.python_type.__name__
+ return writer.call('py_%(dst)s_from' % locals(), 'PyObject*', val)
+
+ def unwrap(self, writer, val):
+ src = self.python_type.__name__
+ dst = self.binding_type.fullname
+ ret = writer.declare(dst)
+ status = writer.call('py_%(src)s_to' % locals(), 'int', val, ret)
+ writer.die_if_false(status)
return ret
- def unwrap(self, println, var):
- pass
-class Class(Binding):
- def __init__(self, ns):
- super(Class, self).__init__()
- self.ctor = None
- self.Ref = Ref(self)
- self.Pointer = Pointer(self)
- self.Subclass = lambda: Subclass(self)
- self.Enum = lambda *v: ClassEnum(self, *v)
- self.enums = []
- self.ns = ns
- self.methods = []
- self.name = None
-
- def To(self, pytype):
- return Wrapper(self, pytype)
-
- def From(self, pytype):
- return Unwrapper(self, pytype)
-
- def new(self, *args):
- method = Constructor(self, self.Pointer, *args)
- self.methods.append(method)
- return method
-
- def delete(self):
- method = Destructor(self, Void, self.Pointer)
- self.methods.append(method)
- return method
-
- def method(self, return_type, *args):
- method = Method(self, return_type, self.Pointer, *args)
- self.methods.append(method)
- return method
-
- def staticmethod(self, return_type, *args):
- sm = StaticMethod(self, return_type, *args)
- self.methods.append(sm)
- return sm
-
- def multimethod(self, *signatures):
- mm = MultiMethod(self, signatures)
- self.methods.append(mm)
- return mm
-
- def staticmultimethod(self, *signatures):
- smm = StaticMultiMethod(self, signatures)
- self.methods.append(smm)
- return smm
-
- def compile(self, name, println):
- # set name
- self.name = self.name or name
-
- @property
- def capsule_name(self):
- return self.fullname
-
- @property
- def pointer(self):
- return '%s*' % self.fullname
-
- @property
- def fullname(self):
- return '::'.join([self.ns, self.name])
-
- @property
- def mangled_name(self):
- return mangle(self.fullname)
-
- @property
- def format(self):
- return 'O'
-
- def unwrap(self, println, var):
- typ = self.pointer
- elty = self.fullname
- cap = self.capsule_name
- capptr = 'PyCapsule_GetPointer(%(var)s, "%(cap)s")' % locals()
- ptr = declare(println, 'void*', capptr)
- unwrapped = 'typecast<%(elty)s>::from(%(ptr)s)' % locals()
- var = declare(println, typ, unwrapped)
- println('if (!%(var)s) {' % locals())
- println2 = indent_println(println)
- println2('PyErr_SetString(PyExc_TypeError, "Invalid cast");')
- println2('return NULL;')
- println('}')
- die_if_null(println, var)
- return var
-
- def wrap(self, println, var):
- return pycapsule_new(println, var, self.capsule_name, self.fullname)
-
-class Subclass(Class):
- def __init__(self, parent):
- super(Subclass, self).__init__(parent.ns)
- self.parent = parent
- self.ns = self.parent.ns
-
- @property
- def capsule_name(self):
- return self.parent.capsule_name
-
-class Function(Binding):
- def __init__(self, ns, return_type, *args):
- super(Function, self).__init__()
- self.return_type = return_type
- self.args = args
- self.ns = ns
- self.name = None
-
- def compile(self, name, println):
- # set name
- self.name = self.name or name
- # generate wrapper
- println('static')
- println('PyObject*')
- println('%(name)s(PyObject* self, PyObject* args)' % locals())
- println('{')
- self.compile_body(indent_println(println))
- println('}')
-
- def compile_body(self, println):
- args = parse_arguments(println, 'args', *self.args)
- call = '%s(%s)' % (self.fullname, ', '.join(args))
- if self.return_type is not Void:
- callres = declare(println, self.return_type.fullname, call)
- pycap = self.return_type.wrap(println, callres)
- return_value(println, pycap)
- else:
- println('%s;' % call)
- return_none(println)
-
-
- @property
- def fullname(self):
- return '::'.join([self.ns, self.name])
-
-class Method(Binding):
- def __init__(self, cls, return_type, *args):
- super(Method, self).__init__()
- self.cls = cls
- self.return_type = return_type
- self.args = args
- self.name = None
- self._realname = None
-
- def compile(self, name, println):
- # set name
- self.name = self.name or name
- # generate wrapper
- println('static')
- println('PyObject*')
- mangled = self.mangled_name
- println('%(mangled)s(PyObject* self, PyObject* args)' % locals())
- println('{')
- self.compile_body(indent_println(println))
- println('}')
-
- def compile_body(self, println):
- args = parse_arguments(println, 'args', *self.args)
- this = args[0]
- args = ', '.join(args[1:])
- name = self.realname
- call = '%(this)s->%(name)s(%(args)s)' % locals()
- if self.return_type is not Void:
- obj = declare(println, self.return_type.fullname, call)
- ret = self.return_type.wrap(println, obj)
- return_value(println, ret)
- else:
- println('%s;' % call)
- return_none(println)
-
- @property
- def fullname(self):
- return '::'.join([self.cls.fullname, self.name])
-
- @property
- def realname(self):
- if not self._realname:
- return self.name
- else:
- return self._realname
-
- @realname.setter
- def realname(self, v):
- self._realname = v
-
-
- @property
- def mangled_name(self):
- return mangle(self.fullname)
-
-class MultiMethod(Binding):
- '''Can only differs by the number of arguments.
- '''
- def __init__(self, cls, signatures):
- super(MultiMethod, self).__init__()
- nargs = set()
- for sig in signatures:
- n = len(sig)
- if n in nargs:
- raise TypeError("MultiMethod only supports overloaded version"
- "with different number of arguments")
- nargs.add(n)
- self.cls = cls
- self.signatures = signatures
- self.name = None
-
- def compile(self, name, println):
- # set name
- self.name = self.name or name
- # generate wrapper
- println('static')
- println('PyObject*')
- mangled = self.mangled_name
- println('%(mangled)s(PyObject* self, PyObject* args)' % locals())
- println('{')
- println2 = indent_println(println)
- nargs = declare(println2, 'Py_ssize_t', 'PyTuple_Size(args)')
- for sig in self.signatures:
- expect = len(sig)
- println2('if (%(nargs)s == %(expect)d) {' % locals())
- method = Method(self.cls, sig[0], self.cls.Pointer, *sig[1:])
- method.name = self.name
- method.compile_body(indent_println(println2))
- println2('}')
- println2('PyErr_SetString(PyExc_TypeError, "Wrong # of args");')
- println2('return NULL;')
- println('}')
-
- @property
- def fullname(self):
- return '::'.join([self.cls.fullname, self.name])
-
- @property
- def mangled_name(self):
- return mangle(self.fullname)
-
-class StaticMethod(Method):
- def compile_body(self, println):
- args = parse_arguments(println, 'args', *self.args)
- args = ', '.join(args)
- fullname = self.fullname
- call = '%(fullname)s(%(args)s)' % locals()
- if self.return_type is not Void:
- obj = declare(println, self.return_type.fullname, call)
- ret = self.return_type.wrap(println, obj)
- return_value(println, ret)
- else:
- println('%s;' % call)
- return_none(println)
-
-class StaticMultiMethod(Binding):
- '''Can only differs by the number of arguments.
- '''
- def __init__(self, cls, signatures):
- super(StaticMultiMethod, self).__init__()
- nargs = set()
- for sig in signatures:
- n = len(sig)
- if n in nargs:
- raise TypeError("StaticMultiMethod only supports overloaded "
- "version with different number of arguments")
- nargs.add(n)
- self.cls = cls
- self.signatures = signatures
- self.name = None
-
-
- def compile(self, name, println):
- # set name
- self.name = self.name or name
- # generate wrapper
- println('static')
- println('PyObject*')
- mangled = self.mangled_name
- println('%(mangled)s(PyObject* self, PyObject* args)' % locals())
- println('{')
- println2 = indent_println(println)
- nargs = declare(println2, 'Py_ssize_t', 'PyTuple_Size(args)')
- for sig in self.signatures:
- expect = len(sig) - 1
- println2('if (%(nargs)s == %(expect)d) {' % locals())
- method = StaticMethod(self.cls, sig[0], *sig[1:])
- method.name = self.name
- method.compile_body(indent_println(println2))
- println2('}')
- println2('PyErr_SetString(PyExc_TypeError, "Wrong # of args");')
- println2('return NULL;')
- println('}')
-
- @property
- def fullname(self):
- return '::'.join([self.cls.fullname, self.name])
-
- @property
- def mangled_name(self):
- return mangle(self.fullname)
-
-class Constructor(StaticMethod):
- def compile_body(self, println):
- args = parse_arguments(println, 'args', *self.args)
- args = ', '.join(args)
- name = self.cls.fullname
- ctor = 'new %(name)s(%(args)s)' % locals()
- obj = declare(println, self.cls.pointer, ctor)
- ret = self.return_type.wrap(println, obj)
- return_value(println, ret)
-
-class Destructor(Method):
- def compile_body(self, println):
- args = parse_arguments(println, 'args', *self.args)
- assert len(args) == 1
- dtor = 'delete %s;' % args[0]
- println(dtor)
- return_none(println)
-
-
-class Namespace(object):
- def __init__(self, name):
- self.name = name
-
- def Class(self, *args, **kwargs):
- return Class(self.name, *args, **kwargs)
-
- def Function(self, *args, **kwargs):
- return Function(self.name, *args, **kwargs)
-
diff --git a/newbinding/codegen.py b/newbinding/codegen.py
new file mode 100644
index 0000000..9398b14
--- /dev/null
+++ b/newbinding/codegen.py
@@ -0,0 +1,279 @@
+import re, contextlib
+
+NULL = 'NULL'
+
+_symbols = set()
+
+def indent(println):
+ def _println(s=''):
+ println("%s%s" % (' '* 4, s))
+ return _println
+
+def quote(txt):
+ return '"%s"' % txt
+
+def new_symbol(name):
+ if name in _symbols:
+ ct = 1
+ orig = name
+ while name in _symbols:
+ name = '%s%d' % (orig, ct)
+ ct += 1
+ _symbols.add(name)
+ return name
+
+def parse_arguments(println, var, *args):
+ typecodes = []
+ holders = []
+ argvals = []
+ for arg in args:
+ typecodes.append(arg.format)
+ val = declare(println, 'PyObject*')
+ argvals.append(val)
+ holders.append('&' + val)
+
+ items = [var, '"%s"' % (''.join(typecodes))] + holders
+ println('if(!PyArg_ParseTuple(%s)) return NULL;' % ', '.join(items))
+
+ # unwrap
+ unwrapped = []
+ for arg, val in zip(args, argvals):
+ unwrapped.append(arg.unwrap(println, val))
+
+ return unwrapped
+
+_re_mangle_pattern = re.compile(r'[ _<>\*&]')
+
+def mangle(name):
+ def repl(m):
+ s = m.group(0)
+ if s in '<>*&':
+ return ''
+ elif s in ' ':
+ return '_'
+ elif s in '_':
+ return '__'
+ else:
+ assert False
+ name = _re_mangle_pattern.sub(repl, name)
+ return name.replace('::', '_')
+
+def pycapsule_new(println, ptr, name, clsname):
+ # build capsule
+ name_soften = mangle(name)
+ var = new_symbol('pycap_%s' % name_soften)
+ fmt = 'PyObject* %(var)s = pycapsule_new(%(ptr)s, "%(name)s", "%(clsname)s");'
+ println(fmt % locals())
+ println('if (!%(var)s) return NULL;' % locals())
+ return var
+
+
+def declare(println, typ, init=None):
+ typ_soften = mangle(typ)
+ var = new_symbol('var_%s' % typ_soften)
+ if init is None:
+ println('%(typ)s %(var)s;' % locals())
+ else:
+ println('%(typ)s %(var)s = %(init)s;' % locals())
+ return var
+
+
+def return_value(println, var):
+ println('return %(var)s;' % locals())
+
+
+def return_none(println):
+ println('Py_RETURN_NONE;')
+
+
+def die_if_null(println, var):
+ println('if (!%(var)s) return NULL;' % locals())
+
+
+class CodeWriterBase(object):
+ def __init__(self, println):
+ self.println = println
+ self.used_symbols = set()
+
+ @contextlib.contextmanager
+ def indent(self):
+ old = self.println
+ self.println = indent(self.println)
+ yield
+ self.println = old
+
+ @contextlib.contextmanager
+ def py_function(self, name):
+ mangled = mangle(name)
+ self.println('static')
+ self.println('PyObject*')
+ with self.block('%(mangled)s(PyObject* self, PyObject* args)' % locals()):
+ self.used_symbols.add('self')
+ self.used_symbols.add('args')
+ yield
+ self.println()
+
+ def new_symbol(self, name):
+ if name in self.used_symbols:
+ ct = 1
+ orig = name
+ while name in self.used_symbols:
+ name = '%s%d' % (orig, ct)
+ ct += 1
+ self.used_symbols.add(name)
+ return name
+
+class CppCodeWriter(CodeWriterBase):
+ @contextlib.contextmanager
+ def block(self, lead):
+ self.println(lead)
+ self.println('{')
+ with self.indent():
+ yield
+ self.println('}')
+
+ def declare(self, typ, init=None):
+ typ_soften = mangle(typ)
+ var = self.new_symbol('var_%s' % typ_soften)
+ if init is None:
+ self.println('%(typ)s %(var)s;' % locals())
+ else:
+ self.println('%(typ)s %(var)s = %(init)s;' % locals())
+ return var
+
+ def return_value(self, val):
+ if val is None:
+ self.println('Py_RETURN_NONE;')
+ else:
+ self.println('return %s;' % val)
+
+ def return_null(self):
+ self.return_value(NULL)
+
+ def parse_arguments(self, var, *args):
+ typecodes = []
+ holders = []
+ argvals = []
+ for arg in args:
+ typecodes.append(arg.format)
+ val = self.declare('PyObject*')
+ argvals.append(val)
+ holders.append('&' + val)
+
+ items = [var, '"%s"' % (''.join(typecodes))] + holders
+ with self.block('if(!PyArg_ParseTuple(%s))' % ', '.join(items)):
+ self.return_null()
+
+ # unwrap
+ unwrapped = []
+ for arg, val in zip(args, argvals):
+ unwrapped.append(arg.unwrap(self, val))
+
+ return unwrapped
+
+ def call(self, func, retty, *args):
+ arglist = ', '.join(args)
+ stmt = '%(func)s(%(arglist)s)' % locals()
+ if retty == 'void':
+ self.println(stmt)
+ else:
+ return self.declare(retty, stmt)
+
+ def method_call(self, func, retty, *args):
+ this = args[0]
+ arglist = ', '.join(args[1:])
+ if func == 'delete':
+ assert not arglist
+ stmt = 'delete %(this)s;' % locals()
+ elif func == 'new':
+ alloctype = retty.rstrip(' *')
+ stmt = 'new %(alloctype)s(%(arglist)s);' % locals()
+ else:
+ stmt = '%(this)s->%(func)s(%(arglist)s);' % locals()
+ if retty == 'void':
+ self.println(stmt)
+ else:
+ return self.declare(retty, stmt)
+
+ def pycapsule_new(self, ptr, name, clsname):
+ name_soften = mangle(name)
+ ret = self.call('pycapsule_new', 'PyObject*', ptr, quote(name),
+ quote(clsname))
+ with self.block('if (!%(ret)s)' % locals()):
+ self.return_null()
+ return ret
+
+ def die_if_false(self, val):
+ with self.block('if(!%(val)s)' % locals()):
+ self.return_null()
+
+ def raises(self, exccls, msg):
+ exc = 'PyExc_%s' % exccls.__name__
+ self.println('PyErr_SetString(%s, "%s");' % (exc, msg))
+ self.return_null()
+
+
+class PyCodeWriter(CodeWriterBase):
+ @contextlib.contextmanager
+ def block(self, lead):
+ self.println(lead)
+ with self.indent():
+ yield
+
+ @contextlib.contextmanager
+ def function(self, func, args=(), varargs=None):
+ with self.scope():
+ arguments = []
+ for arg in args:
+ arguments.append(self.new_symbol(arg))
+ if varargs:
+ varargs = self.new_symbol(varargs)
+ arguments.append('*%s' % varargs)
+ arglist = ', '.join(arguments)
+ with self.block('def %(func)s(%(arglist)s):' % locals()):
+ if arguments:
+ arguments[-1] = arguments[-1].lstrip('*')
+ if len(arguments) > 1:
+ yield arguments
+ else:
+ yield arguments[0]
+ else:
+ yield
+
+ @contextlib.contextmanager
+ def scope(self):
+ self.old = self.used_symbols
+ self.used_symbols = set()
+ yield
+ self.used_symbols = self.old
+
+ def unwrap_many(self, args):
+ unwrapped = self.new_symbol('unwrapped')
+ self.println('%(unwrapped)s = map(capsule.unwrap, %(args)s)' % locals())
+ return unwrapped
+
+ def unwrap(self, val):
+ return self.call('capsule.unwrap', args=(val,), ret='unwrapped')
+
+ def wrap(self, val):
+ wrapped = self.new_symbol('wrapped')
+ self.println('%(wrapped)s = capsule.wrap(%(val)s)' % locals())
+ return wrapped
+
+ def call(self, func, args=(), varargs=None, ret='ret'):
+ arguments = []
+ for arg in args:
+ arguments.append(arg)
+ if varargs:
+ arguments.append('*%s' % varargs)
+ arglist = ', '.join(arguments)
+ ret = self.new_symbol(ret)
+ self.println('%(ret)s = %(func)s(%(arglist)s)' % locals())
+ return ret
+
+ def return_value(self, val=None):
+ if val is None:
+ val = ''
+ self.println('return %s' % val)
+
+
diff --git a/newbinding/extra.py b/newbinding/extra.py
new file mode 100644
index 0000000..1af4e5f
--- /dev/null
+++ b/newbinding/extra.py
@@ -0,0 +1,20 @@
+'''
+Wrapped the extra functions in _api.so
+'''
+
+import capsule
+
+def _wrapper(func):
+ def _core(*args):
+ unwrapped = map(capsule.unwrap, args)
+ ret = func(*unwrapped)
+ return capsule.wrap(ret)
+ return _core
+
+def _init(glob):
+ from _api import extra
+ for k, v in extra.__dict__.items():
+ glob[k] = _wrapper(v)
+
+_init(globals())
+
diff --git a/newbinding/gen.py b/newbinding/gen.py
index cee71f1..4d8709e 100644
--- a/newbinding/gen.py
+++ b/newbinding/gen.py
@@ -1,26 +1,23 @@
-import sys, logging
+import sys
from binding import *
-from utils import *
-from cStringIO import StringIO
+import codegen
-logging.basicConfig(level=logging.INFO)
-logger = logging.getLogger(__name__)
extension_entry = '''
-
+
extern "C" {
#if (PY_MAJOR_VERSION >= 3)
-
+
PyObject *
PyInit_%(module)s(void)
{
- PyObject *module = create_python_module("%(module)s", %(methtable)s);
- if (module) {
- if (populate_submodules(module, submodules))
- return module;
- }
- return NULL;
+PyObject *module = create_python_module("%(module)s", %(methtable)s);
+if (module) {
+if (populate_submodules(module, submodules))
+return module;
+}
+return NULL;
}
#else
@@ -28,10 +25,10 @@ PyInit_%(module)s(void)
PyMODINIT_FUNC
init%(module)s(void)
{
- PyObject *module = create_python_module("%(module)s", %(methtable)s);
- if (module) {
- populate_submodules(module, submodules);
- }
+PyObject *module = create_python_module("%(module)s", %(methtable)s);
+if (module) {
+populate_submodules(module, submodules);
+}
}
#endif
@@ -39,172 +36,6 @@ init%(module)s(void)
'''
-def build_methoddef(name, defns, println):
- println('static PyMethodDef %s[] = {' % name)
- for name, func in defns:
- println('{ "%(name)s", (PyCFunction)%(func)s, METH_VARARGS, NULL },' %
- locals())
- else:
- println('{ NULL }')
- println('};')
- println('')
-
-
-class Context(object):
- def __init__(self):
- self.includes = set()
- self.functions = {}
- self.classes = {}
- self.definitions = []
- self._pending_symbols = []
-
- def generate_cpp(self, println):
- for i in self.includes:
- println('#include "%s"' % i)
-
- println('\n'.join(self.definitions))
-
- # global function
- defns = []
- for name, func in self.functions.items():
- defns.append((name, func.name))
- build_methoddef('global_functions', defns, println)
-
- # classes
- for name, cls in self.classes.items():
- defns = []
- for meth in cls.methods:
- defns.append((meth.name, meth.mangled_name))
- println("// %s" % cls.fullname)
- build_methoddef(cls.mangled_name, defns, println)
-
- println('static SubModuleEntry submodules[] = {')
- for name, cls in self.classes.items():
- table = cls.mangled_name
- println('{ "%(name)s", %(table)s },' % locals())
- println('{ "extra", extra_methodtable },')
- println('{ NULL }')
- println('};')
- println('')
-
- # generate entry
- println(extension_entry % {'module': '_api',
- 'methtable': 'global_functions',})
-
- def generate_py(self, println):
- println('import _api, capsule')
- println('')
- # wraps all extras
- extra_wrapper = '''
-def _init_extra_wrapper():
- def wrap(callee):
- def _wrapped(*args):
- args = map(capsule.unwrap, args)
- ret = callee(*args)
- return capsule.wrap(ret)
- return _wrapped
- for k in dir(_api.extra):
- v = getattr(_api.extra, k)
- if not k.startswith('__') and callable(v):
- globals()[k] = wrap(v)
-_init_extra_wrapper()
- '''
- println(extra_wrapper)
- println('')
- # global function
- for name in self.functions:
- println('def %(name)s(*args):' % locals())
- println2 = indent_println(println)
- println2('args = map(capsule.unwrap, args)')
- println2('ptr = _api.%(name)s(*args)' % locals())
- println2('return capsule.wrap(ptr)')
- println('')
- # classes
- classes = sorted(self.classes.items(), key=lambda x: x[1].rank)
-
- for name, cls in classes:
- if isinstance(cls, Subclass):
- parent = cls.parent.name
- else:
- parent = 'capsule.Wrapper'
- println('@capsule.register_class')
- println('class %(name)s(%(parent)s):' % locals())
- self.generate_py_class(indent_println(println), cls)
- println('')
-
- def generate_py_class(self, println, cls):
- if len(cls.methods) == 0:
- println('pass')
- else:
- mod = cls.name
- # generate class enums
- for enum in cls.enums:
- println('class %s:' % enum.name)
- println2 = indent_println(println)
- for v in enum.values:
- println2('%(v)s = "%(v)s"' % locals())
- println('')
- # generate class methods
- for method in cls.methods:
- name = method.name
- if(isinstance(method, StaticMethod) or
- isinstance(method, StaticMultiMethod)):
- println('@staticmethod')
- println('def %(name)s(*args):' % locals())
- println2 = indent_println(println)
- println2('args = map(capsule.unwrap, args)')
- println2('ret = _api.%(mod)s.%(name)s(*args)' % locals())
- println2('return capsule.wrap(ret)')
- elif isinstance(method, Destructor):
- println('_delete_ = _api.%(mod)s.%(name)s' % locals())
- else:
- println('def %(name)s(self, *args):' % locals())
- println2 = indent_println(println)
- println2('args = map(capsule.unwrap, args)')
- println2('ret = _api.%(mod)s.%(name)s(self._ptr, *args)' %
- locals())
- println2('return capsule.wrap(ret)')
- println('')
-
- def add_module(self, module):
- allsyms = [(k, v) for k, v in vars(module).items()
- if isinstance(v, Binding)]
- # generate includes
- for k, v in allsyms:
- self.includes |= v.include
-
- self._pending_symbols.extend(allsyms)
-
- def materialize(self):
- symtab = sorted(self._pending_symbols, key=lambda x: x[1].rank)
-
- # compile everything
- for k, v in symtab:
- buf = StringIO()
- def println_to_def(s):
- buf.write(s)
- buf.write('\n')
- logger.info('compiling %s', k)
- v.compile(k, println_to_def)
- self.definitions.append(buf.getvalue())
- buf.close()
-
- # generate py defintion table for global functions
- for k, v in symtab:
- if isinstance(v, Function):
- if v.name in self.functions:
- raise NameError("Duplicated function name: %s" % v.name)
- self.functions[v.name] = v
-
- # generate sub module tables for classes
- submodules = []
- for k, v in symtab:
- if isinstance(v, Class):
- if v.name in self.classes:
- if v is not self.classes[v.name]:
- raise NameError("Duplicated class: %s" % v.name)
- self.classes[v.name] = v
-
def populate_headers(println):
includes = [
@@ -216,38 +47,96 @@ def populate_headers(println):
]
for inc in includes:
println('#include "%s"' % inc)
+ println()
-def wrap_println(f):
- def println(s):
- f.write(s)
- f.write('\n')
+
+def wrap_println_from_file(file):
+ def println(s=''):
+ file.write(s)
+ file.write('\n')
return println
-if __name__ == '__main__':
+def main():
outputfilename = sys.argv[1]
- srcdir = sys.argv[2]
- modnames = sys.argv[3:]
+ entry_modname = sys.argv[2]
- modules = []
- for m in modnames:
- path = '%s.%s' % (srcdir, m)
- logger.info("import module %s", path)
- module = __import__(path)
- for token in path.split('.')[1:]:
- module = getattr(module, token)
- modules.append(module)
+ entry_module = __import__(entry_modname)
- context = Context()
+ units = []
+ for ns in namespaces.values():
+ print 'namespace', ns
+ for fn in ns.functions:
+ print fn
+ units.append(fn)
+ for cls in ns.classes:
+ print cls
+ units.append(cls)
- for mod in modules:
- context.add_module(mod)
- context.materialize()
+ with open('%s.cpp' % outputfilename, 'w') as cppfile:
+ println = wrap_println_from_file(cppfile)
- with open('%s.cpp' % outputfilename, 'w') as outfile:
- println = wrap_println(outfile)
+ # extra headers
populate_headers(println)
- context.generate_cpp(println)
- with open('%s.py' % outputfilename, 'w') as outfile:
- println = wrap_println(outfile)
- context.generate_py(println)
+ # required headers
+ includes = set()
+ for u in units:
+ includes |= u.includes
+
+ for inc in includes:
+ println('#include "%s"' % inc)
+ println()
+
+ # write methods and method tables
+ for u in units:
+ writer = codegen.CppCodeWriter(println)
+ u.compile_cpp(writer)
+ else:
+ del writer
+
+ # write function table
+ writer = codegen.CppCodeWriter(println)
+ writer.println('static')
+ writer.println('PyMethodDef methtable[] = {')
+ with writer.indent():
+ fmt = '{ "%(name)s", (PyCFunction)%(func)s, METH_VARARGS, NULL },'
+ for u in units:
+ if isinstance(u, Function):
+ name = u.name
+ func = codegen.mangle(u.fullname)
+ writer.println(fmt % locals())
+ writer.println('{ NULL },')
+ writer.println('};')
+ writer.println()
+ del writer
+
+
+ # write submodule table
+ writer = codegen.CppCodeWriter(println)
+ writer.println('static')
+ writer.println('SubModuleEntry submodules[] = {')
+ with writer.indent():
+ for cls in units:
+ if isinstance(cls, Class):
+ name = cls.name
+ table = codegen.mangle(cls.fullname)
+ writer.println('{ "%(name)s", %(table)s },' % locals())
+ writer.println('{ "extra", extra_methodtable },')
+ writer.println('{ NULL }')
+ writer.println('};')
+ writer.println('')
+ del writer
+
+ println(extension_entry % {'module': '_api', 'methtable': 'methtable'})
+
+ with open('%s.py' % outputfilename, 'w') as pyfile:
+ println = wrap_println_from_file(pyfile)
+ println('import _api, capsule')
+ println()
+ for u in units:
+ writer = codegen.PyCodeWriter(println)
+ u.compile_py(writer)
+
+
+if __name__ == '__main__':
+ main()
diff --git a/newbinding/include/llvm_binding/auto_pyobject.h b/newbinding/include/llvm_binding/auto_pyobject.h
new file mode 100644
index 0000000..451f2d9
--- /dev/null
+++ b/newbinding/include/llvm_binding/auto_pyobject.h
@@ -0,0 +1,38 @@
+#ifndef AUTO_PYOBJECT_H_
+#define AUTO_PYOBJECT_H_
+
+#include
+
+class auto_pyobject{
+ mutable PyObject* PO;
+public:
+ auto_pyobject(): PO(NULL) { }
+
+ auto_pyobject(PyObject* po) : PO(po) { }
+
+ auto_pyobject(const auto_pyobject& other) : PO(*other){
+ other.PO = NULL;
+ }
+
+ ~auto_pyobject() {
+ Py_XDECREF(PO);
+ }
+
+ bool operator ! () const {
+ return !PO;
+ }
+
+ PyObject* operator * () const {
+ return PO;
+ }
+
+ PyObject* get() const {
+ return PO;
+ }
+private:
+ // disable assign
+ void operator = (const auto_pyobject&);
+};
+
+#endif AUTO_PYOBJECT_H_
+
diff --git a/newbinding/include/llvm_binding/conversion.h b/newbinding/include/llvm_binding/conversion.h
index c3d6e36..0e30c60 100644
--- a/newbinding/include/llvm_binding/conversion.h
+++ b/newbinding/include/llvm_binding/conversion.h
@@ -62,6 +62,11 @@ static
PyObject* py_str_from(const std::string &str){
return PyString_FromStringAndSize(str.c_str(), str.size());
}
+//
+//static
+//PyObject* py_str_from(const llvm::StringRef *str){
+// return py_str_from(str->str());
+//}
static
PyObject* py_bool_from(bool val){
diff --git a/newbinding/src/AssemblyAnnotationWriter.py b/newbinding/src/AssemblyAnnotationWriter.py
index 5641232..d2b5a5d 100644
--- a/newbinding/src/AssemblyAnnotationWriter.py
+++ b/newbinding/src/AssemblyAnnotationWriter.py
@@ -1,6 +1,7 @@
from binding import *
from namespace import llvm
-AssemblyAnnotationWriter = llvm.Class()
-AssemblyAnnotationWriter.include.add("llvm/Assembly/AssemblyAnnotationWriter.h")
+@llvm.Class()
+class AssemblyAnnotationWriter:
+ _include_ = "llvm/Assembly/AssemblyAnnotationWriter.h"
diff --git a/newbinding/src/Constant.py b/newbinding/src/Constant.py
index 24045bb..14ff6bb 100644
--- a/newbinding/src/Constant.py
+++ b/newbinding/src/Constant.py
@@ -2,4 +2,6 @@ from binding import *
from namespace import llvm
from User import User
-Constant = User.Subclass()
+@llvm.Class(User)
+class Constant:
+ pass
diff --git a/newbinding/src/DerivedTypes.py b/newbinding/src/DerivedTypes.py
index d9dbb53..c57e01b 100644
--- a/newbinding/src/DerivedTypes.py
+++ b/newbinding/src/DerivedTypes.py
@@ -4,17 +4,15 @@ from LLVMContext import LLVMContext
from Type import Type
from SmallVector import SmallVector_Type
-FunctionType = Type.Subclass()
-FunctionType.include.add('llvm/DerivedTypes.h')
+FunctionType = llvm.Class(Type)
-_get_signatures = [(FunctionType.Pointer,
- Type.Pointer, Bool.From(bool)),
- (FunctionType.Pointer,
- Type.Pointer, SmallVector_Type.Ref, Bool.From(bool))]
+@FunctionType
+class FunctionType:
+ _include_ = 'llvm/DerivedTypes.h'
+ get = StaticMethod(ptr(FunctionType), ptr(Type), cast(bool, Bool))
+ get |= StaticMethod(ptr(FunctionType), ptr(Type), ref(SmallVector_Type), cast(bool, Bool))
+ isVarArg = Method(cast(Bool, bool))
+ getReturnType = Method(ptr(Type))
+ getParamType = Method(ptr(Type), cast(int, Unsigned))
+ getNumParams = Method(cast(Unsigned, int))
-get = FunctionType.staticmultimethod(*_get_signatures)
-
-isVarArg = FunctionType.method(Bool.To(bool))
-getReturnType = FunctionType.method(Type.Pointer)
-getParamType = FunctionType.method(Type.Pointer, Unsigned.From(int))
-getNumParams = FunctionType.method(Unsigned.To(int))
diff --git a/newbinding/src/LLVMContext.py b/newbinding/src/LLVMContext.py
index 0965748..f2526db 100644
--- a/newbinding/src/LLVMContext.py
+++ b/newbinding/src/LLVMContext.py
@@ -1,8 +1,8 @@
from binding import *
from namespace import llvm
-LLVMContext = llvm.Class()
-LLVMContext.include.add("llvm/LLVMContext.h")
-
-getGlobalContext = llvm.Function(LLVMContext.Ref)
+@llvm.Class()
+class LLVMContext:
+ _include_ = "llvm/LLVMContext.h"
+llvm.Function('getGlobalContext', ref(LLVMContext))
diff --git a/newbinding/src/Module.py b/newbinding/src/Module.py
index 67ac8b0..6a6a806 100644
--- a/newbinding/src/Module.py
+++ b/newbinding/src/Module.py
@@ -7,39 +7,39 @@ from DerivedTypes import FunctionType
from raw_ostream import raw_ostream
from AssemblyAnnotationWriter import AssemblyAnnotationWriter
-# class Module
-Module = llvm.Class()
-Module.include.add("llvm/Module.h")
+@llvm.Class()
+class Module:
+ _include_ = "llvm/Module.h"
+ # Enumerators
+ Endianness = Enum('AnyEndianness', 'LittleEndian', 'BigEndian')
+ PointerSize = Enum('AnyPointerSize', 'Pointer32', 'Pointer64')
-# Enumerators
-Endianness = Module.Enum('AnyEndianness', 'LittleEndian', 'BigEndian')
-PointerSize = Module.Enum('AnyPointerSize', 'Pointer32', 'Pointer64')
+ # Constructors & Destructors
+ new = Constructor(cast(str, StringRef), ref(LLVMContext))
+ delete = Destructor()
-# Constructors & Destructors
-new = Module.new(StringRef.From(str), LLVMContext.Ref)
-delete = Module.delete()
+ # Module Level Accessor
+ getModuleIdentifier = Method(cast(ConstStdString, str))
+ getDataLayout = Method(cast(ConstStdString, str))
+ getTargetTriple = Method(cast(ConstStdString, str))
+ getEndianness = Method(Endianness)
+ getPointerSize = Method(PointerSize)
+ getContext = Method(ref(LLVMContext))
+ getModuleInlineAsm = Method(cast(ConstStdString, str))
-# Module Level Accessor
-getModuleIdentifier = Module.method(ConstStdString.To(str))
-getDataLayout = Module.method(ConstStdString.To(str))
-getTargetTriple = Module.method(ConstStdString.To(str))
-getEndianness = Module.method(Endianness)
-getPointerSize = Module.method(PointerSize)
-getContext = Module.method(LLVMContext.Ref)
-getModuleInlineAsm = Module.method(ConstStdString.To(str))
+ # Module Level Mutators
+ setModuleIdentifier = Method(Void, cast(str, StringRef))
+ setDataLayout = Method(Void, cast(str, StringRef))
+ setTargetTriple = Method(Void, cast(str, StringRef))
+ setModuleInlineAsm = Method(Void, cast(str, StringRef))
+ appendModuleInlineAsm = Method(Void, cast(str, StringRef))
-# Module Level Mutators
-setModuleIdentifier = Module.method(Void, StringRef.From(str))
-setDataLayout = Module.method(Void, StringRef.From(str))
-setTargetTriple = Module.method(Void, StringRef.From(str))
-setModuleInlineAsm = Module.method(Void, StringRef.From(str))
-appendModuleInlineAsm = Module.method(Void, StringRef.From(str))
+ # Function Accessors
+ getOrInsertFunction = Method(ptr(Constant), cast(str, StringRef), ptr(FunctionType))
-# Function Accessors
-getOrInsertFunction = Module.method(Constant.Pointer, StringRef.From(str), FunctionType.Pointer)
+ # Utilities
+ dump = Method(Void)
+ print_ = Method(Void, ref(raw_ostream), ptr(AssemblyAnnotationWriter))
+ print_.realname = 'print'
-# Utilities
-dump = Module.method(Void)
-print_ = Module.method(Void, raw_ostream.Ref, AssemblyAnnotationWriter.Pointer)
-print_.realname = 'print'
-dropAllReferences = Module.method(Void)
+ dropAllReferences = Method()
diff --git a/newbinding/src/SmallVector.py b/newbinding/src/SmallVector.py
index 225c720..d00b294 100644
--- a/newbinding/src/SmallVector.py
+++ b/newbinding/src/SmallVector.py
@@ -1,5 +1,6 @@
from binding import *
from namespace import llvm
-SmallVector_Type = llvm.Class()
-delete = SmallVector_Type.delete()
+@llvm.Class()
+class SmallVector_Type:
+ delete = Destructor()
diff --git a/newbinding/src/StringRef.py b/newbinding/src/StringRef.py
index 554629b..fb3b896 100644
--- a/newbinding/src/StringRef.py
+++ b/newbinding/src/StringRef.py
@@ -1,6 +1,7 @@
from binding import *
from namespace import llvm
-StringRef = llvm.Class()
-StringRef.include.add("llvm/ADT/StringRef.h")
+@llvm.Class()
+class StringRef:
+ _include_ = "llvm/ADT/StringRef.h"
diff --git a/newbinding/src/Type.py b/newbinding/src/Type.py
index 3703200..45f9444 100644
--- a/newbinding/src/Type.py
+++ b/newbinding/src/Type.py
@@ -4,93 +4,112 @@ from LLVMContext import LLVMContext
from raw_ostream import raw_ostream
Type = llvm.Class()
-Type.include.add('llvm/Type.h')
+IntegerType = llvm.Class(Type)
+CompositeType = llvm.Class(Type)
+SequentialType = llvm.Class(CompositeType)
+PointerType = llvm.Class(SequentialType)
-IntegerType = Type.Subclass()
-CompositeType = Type.Subclass()
-SequentialType = CompositeType.Subclass()
-PointerType = SequentialType.Subclass()
+@Type
+class Type:
+ _include_ = 'llvm/Type.h'
-getContext = Type.method(LLVMContext.Ref)
-dump = Type.method(Void)
-print_ = Type.method(Void, raw_ostream.Ref)
-print_.realname = 'print'
+ getContext = Method(ref(LLVMContext))
+ dump = Method()
+ print_ = Method(Void, ref(raw_ostream))
+ print_.realname = 'print'
-def type_checker():
- return Type.method(Bool.To(bool))
+ def type_checker():
+ return Method(cast(Bool, bool))
-isVoidTy = type_checker()
-isHalfTy = type_checker()
-isFloatTy = type_checker()
-isDoubleTy = type_checker()
-isX86_FP80Ty = type_checker()
-isFP128Ty = type_checker()
-isPPC_FP128Ty = type_checker()
-isFloatingPointTy = type_checker()
-isX86_MMXTy = type_checker()
-isFPOrFPVectorTy = type_checker()
-isLabelTy = type_checker()
-isMetadataTy = type_checker()
-isIntOrIntVectorTy = type_checker()
-isFunctionTy = type_checker()
-isStructTy = type_checker()
-isArrayTy = type_checker()
-isPointerTy = type_checker()
-isPtrOrPtrVectorTy = type_checker()
-isVectorTy = type_checker()
-isEmptyTy = type_checker()
-isPrimitiveType = type_checker()
-isDerivedType = type_checker()
-isFirstClassType = type_checker()
-isSingleValueType = type_checker()
-isAggregateType = type_checker()
-isSized = type_checker()
+ isVoidTy = type_checker()
+ isHalfTy = type_checker()
+ isFloatTy = type_checker()
+ isDoubleTy = type_checker()
+ isX86_FP80Ty = type_checker()
+ isFP128Ty = type_checker()
+ isPPC_FP128Ty = type_checker()
+ isFloatingPointTy = type_checker()
+ isX86_MMXTy = type_checker()
+ isFPOrFPVectorTy = type_checker()
+ isLabelTy = type_checker()
+ isMetadataTy = type_checker()
+ isIntOrIntVectorTy = type_checker()
+ isFunctionTy = type_checker()
+ isStructTy = type_checker()
+ isArrayTy = type_checker()
+ isPointerTy = type_checker()
+ isPtrOrPtrVectorTy = type_checker()
+ isVectorTy = type_checker()
+ isEmptyTy = type_checker()
+ isPrimitiveType = type_checker()
+ isDerivedType = type_checker()
+ isFirstClassType = type_checker()
+ isSingleValueType = type_checker()
+ isAggregateType = type_checker()
+ isSized = type_checker()
-isIntegerTy = Type.multimethod([Bool.To(bool)],
- [Bool.To(bool), Unsigned.From(int)])
+ isIntegerTy = Method(cast(Bool, bool))
+ isIntegerTy |= Method(cast(Bool, bool), cast(int, Unsigned))
-def type_factory():
- return Type.staticmethod(Type.Pointer, LLVMContext.Ref)
+ def type_factory():
+ return StaticMethod(ptr(Type), ref(LLVMContext))
-getVoidTy = type_factory()
-getLabelTy = type_factory()
-getHalfTy = type_factory()
-getFloatTy = type_factory()
-getDoubleTy = type_factory()
-getMetadataTy = type_factory()
-getX86_FP80Ty = type_factory()
-getFP128Ty = type_factory()
-getPPC_FP128Ty = type_factory()
-getX86_MMXTy = type_factory()
+ getVoidTy = type_factory()
+ getLabelTy = type_factory()
+ getHalfTy = type_factory()
+ getFloatTy = type_factory()
+ getDoubleTy = type_factory()
+ getMetadataTy = type_factory()
+ getX86_FP80Ty = type_factory()
+ getFP128Ty = type_factory()
+ getPPC_FP128Ty = type_factory()
+ getX86_MMXTy = type_factory()
-getIntNTy = Type.staticmethod(IntegerType.Pointer, LLVMContext.Ref, Unsigned.From(int))
+ getIntNTy = StaticMethod(ptr(IntegerType), ref(LLVMContext), cast(Unsigned, int))
-def integer_factory():
- return Type.staticmethod(IntegerType.Pointer, LLVMContext.Ref)
+ def integer_factory():
+ return StaticMethod(ptr(IntegerType), ref(LLVMContext))
-getInt1Ty = integer_factory()
-getInt8Ty = integer_factory()
-getInt16Ty = integer_factory()
-getInt32Ty = integer_factory()
-getInt64Ty = integer_factory()
+ getInt1Ty = integer_factory()
+ getInt8Ty = integer_factory()
+ getInt16Ty = integer_factory()
+ getInt32Ty = integer_factory()
+ getInt64Ty = integer_factory()
-def pointer_factory():
- return Type.staticmethod(PointerType.Pointer, LLVMContext.Ref)
+ def pointer_factory():
+ return StaticMethod(ptr(PointerType), ref(LLVMContext))
-getHalfPtrTy = pointer_factory()
-getFloatPtrTy = pointer_factory()
-getDoublePtrTy = pointer_factory()
-getX86_FP80PtrTy = pointer_factory()
-getFP128PtrTy = pointer_factory()
-getPPC_FP128PtrTy = pointer_factory()
-getX86_MMXPtrTy = pointer_factory()
-getInt1PtrTy = pointer_factory()
-getInt8PtrTy = pointer_factory()
-getInt16PtrTy = pointer_factory()
-getInt32PtrTy = pointer_factory()
-getInt64PtrTy = pointer_factory()
-getIntNPtrTy = Type.staticmethod(PointerType.Pointer,
- LLVMContext.Ref, Unsigned.From(int))
+ getHalfPtrTy = pointer_factory()
+ getFloatPtrTy = pointer_factory()
+ getDoublePtrTy = pointer_factory()
+ getX86_FP80PtrTy = pointer_factory()
+ getFP128PtrTy = pointer_factory()
+ getPPC_FP128PtrTy = pointer_factory()
+ getX86_MMXPtrTy = pointer_factory()
+ getInt1PtrTy = pointer_factory()
+ getInt8PtrTy = pointer_factory()
+ getInt16PtrTy = pointer_factory()
+ getInt32PtrTy = pointer_factory()
+ getInt64PtrTy = pointer_factory()
+ getIntNPtrTy = StaticMethod(ptr(PointerType),
+ ref(LLVMContext), cast(int, Unsigned))
+@IntegerType
+class IntegerType:
+ pass
+
+
+@CompositeType
+class CompositeType:
+ pass
+
+@SequentialType
+class SequentialType:
+ pass
+
+@PointerType
+class PointerType:
+ pass
+
diff --git a/newbinding/src/User.py b/newbinding/src/User.py
index 8753983..dbc290d 100644
--- a/newbinding/src/User.py
+++ b/newbinding/src/User.py
@@ -2,4 +2,7 @@ from binding import *
from namespace import llvm
from Value import Value
-User = Value.Subclass()
+@llvm.Class(Value)
+class User:
+ pass
+
diff --git a/newbinding/src/Value.py b/newbinding/src/Value.py
index 062ad43..9d1a2dd 100644
--- a/newbinding/src/Value.py
+++ b/newbinding/src/Value.py
@@ -5,20 +5,23 @@ from AssemblyAnnotationWriter import AssemblyAnnotationWriter
from Type import Type
from LLVMContext import LLVMContext
from StringRef import StringRef
-#
+
Value = llvm.Class()
-dump = Value.method(Void)
+@Value
+class Value:
-print_ = Value.method(Void, raw_ostream.Ref, AssemblyAnnotationWriter.Pointer)
-print_.realname = 'print'
+ dump = Method()
-getType = Value.method(Type.Pointer)
-getContext = Value.method(LLVMContext.Ref)
+ print_ = Method(Void, ref(raw_ostream), ptr(AssemblyAnnotationWriter))
+ print_.realname = 'print'
-hasName = Value.method(Bool.To(bool))
-# skip getValueName, setValueName
-getName = Value.method(StringRef.To(str))
-setName = Value.method(Void, StringRef.From(str))
+ getType = Method(ptr(Type))
+ getContext = Method(ref(LLVMContext))
-replaceAllUsesWith = Value.method(Void, Value.Pointer)
\ No newline at end of file
+ hasName = Method(cast(Bool, bool))
+ # skip getValueName, setValueName
+ getName = Method(cast(StringRef, str))
+ setName = Method(Void, cast(str, StringRef))
+
+ replaceAllUsesWith = Method(Void, ptr(Value))
\ No newline at end of file
diff --git a/newbinding/src/__init__.py b/newbinding/src/__init__.py
index e69de29..6e24918 100644
--- a/newbinding/src/__init__.py
+++ b/newbinding/src/__init__.py
@@ -0,0 +1,2 @@
+from . import Module
+
diff --git a/newbinding/src/namespace.py b/newbinding/src/namespace.py
index 02af8c9..c50256d 100644
--- a/newbinding/src/namespace.py
+++ b/newbinding/src/namespace.py
@@ -1,4 +1,3 @@
from binding import *
-extra = Namespace('llvm_extra')
llvm = Namespace('llvm')
diff --git a/newbinding/src/raw_ostream.py b/newbinding/src/raw_ostream.py
index 64e8046..2f5a6f5 100644
--- a/newbinding/src/raw_ostream.py
+++ b/newbinding/src/raw_ostream.py
@@ -3,10 +3,15 @@ from namespace import llvm
from LLVMContext import LLVMContext
from StringRef import StringRef
-raw_ostream = llvm.Class()
-raw_ostream.include.add("llvm/Support/raw_ostream.h")
-delete = raw_ostream.delete()
+@llvm.Class()
+class raw_ostream:
+ _include_ = "llvm/Support/raw_ostream.h"
+ delete = Destructor()
+
+@llvm.Class(raw_ostream)
+class raw_svector_ostream:
+ _include_ = "llvm/Support/raw_os_ostream.h"
+ _base_ = raw_ostream
+
+ str = Method(cast(str, StringRef))
-raw_svector_ostream = raw_ostream.Subclass()
-raw_svector_ostream.include.add("llvm/Support/raw_os_ostream.h")
-str = raw_svector_ostream.method(StringRef.To(str))
diff --git a/newbinding/test2.py b/newbinding/test2.py
index ac74594..afb3608 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -1,4 +1,5 @@
import api
+import extra
import _capsule
api.capsule.set_debug(True)
context = api.getGlobalContext()
@@ -15,7 +16,7 @@ assert m.getPointerSize() == api.Module.PointerSize.AnyPointerSize
m.dump()
-os = api.make_raw_ostream_for_printing()
+os = extra.make_raw_ostream_for_printing()
m.print_(os, None)
print os.str()
@@ -29,15 +30,15 @@ fnty = api.FunctionType.get(int1ty, False)
fnty.dump()
types = [int1ty, api.Type.getIntNTy(context, 21)]
-svt = api.make_small_vector_from_types(*types)
+svt = extra.make_small_vector_from_types(*types)
fnty = api.FunctionType.get(int1ty, svt, False)
-os = api.make_raw_ostream_for_printing()
+os = extra.make_raw_ostream_for_printing()
fnty.print_(os)
print os.str()
fn = m.getOrInsertFunction("foo", fnty)
-os = api.make_raw_ostream_for_printing()
+os = extra.make_raw_ostream_for_printing()
fn.print_(os, None)
print os.str()
assert fn.hasName()
diff --git a/newbinding/utils.py b/newbinding/utils.py
deleted file mode 100644
index 6c39990..0000000
--- a/newbinding/utils.py
+++ /dev/null
@@ -1,6 +0,0 @@
-
-def indent_println(println):
- def _println(s):
- println("%s%s" % (' '* 4, s))
- return _println
-
From 3c81157ede77dae545dea76988df117441b8bb16 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Fri, 25 Jan 2013 15:35:23 -0600
Subject: [PATCH 121/414] Add downcasting
---
newbinding/binding.py | 28 +++++++++------
newbinding/capsule.py | 46 +++++++++++++++++--------
newbinding/extra.py | 27 +++++++++++++--
newbinding/gen.py | 26 ++++++++++++++
newbinding/include/llvm_binding/extra.h | 10 +++---
newbinding/src/namespace.py | 1 +
6 files changed, 106 insertions(+), 32 deletions(-)
diff --git a/newbinding/binding.py b/newbinding/binding.py
index fc26d92..8c58aa9 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -28,10 +28,10 @@ class Namespace(object):
def __str__(self):
return self.name
-class Type(object):
+class _Type(object):
pass
-class BuiltinTypes(Type):
+class BuiltinTypes(_Type):
def __init__(self, name):
self.name = name
@@ -47,7 +47,7 @@ Unsigned = BuiltinTypes('unsigned')
Bool = BuiltinTypes('bool')
ConstStdString = BuiltinTypes('const std::string')
-class Class(Type):
+class Class(_Type):
format = 'O'
def __init__(self, ns, *bases):
@@ -57,9 +57,11 @@ class Class(Type):
self.methods = []
self.enums = []
self.includes = set()
+ self.downcastables = set()
def __call__(self, defn):
assert not self._is_defined
+ # process the definition in "defn"
self.name = defn.__name__
for k, v in defn.__dict__.items():
if isinstance(v, Method):
@@ -79,6 +81,12 @@ class Class(Type):
else:
for i in v:
self.includes.add(i)
+ elif k == '_downcast_':
+ if isinstance(v, Class):
+ self.downcastables.add(v)
+ else:
+ for i in v:
+ self.downcastables.add(i)
return self
def compile_cpp(self, writer):
@@ -106,12 +114,11 @@ class Class(Type):
bases = ', '.join(x.name for x in self.bases)
writer.println('@capsule.register_class')
with writer.block('class %(clsname)s(%(bases)s):' % locals()):
+ writer.println('_llvm_type_ = "%s"' % self.fullname)
for enum in self.enums:
enum.compile_py(writer)
for meth in self.methods:
meth.compile_py(writer)
- if not self.enums and not self.methods:
- writer.println('pass')
writer.println()
@property
@@ -178,6 +185,7 @@ class Enum(object):
def compile_py(self, writer):
with writer.block('class %s:' % self.name):
+ writer.println('_llvm_type_ = "%s"' % self.fullname)
for v in self.value_names:
writer.println('%(v)s = "%(v)s"' % locals())
writer.println()
@@ -340,7 +348,7 @@ class Constructor(StaticMethod):
ret = writer.declare(retty.fullname, stmt)
return ret
-class ref(Type):
+class ref(_Type):
def __init__(self, element):
assert isinstance(element, Class), type(element)
self.element = element
@@ -369,7 +377,7 @@ class ref(Type):
return writer.declare(self.fullname, '*%s' % p)
-class ptr(Type):
+class ptr(_Type):
def __init__(self, element):
assert isinstance(element, Class)
self.element = element
@@ -393,7 +401,7 @@ class ptr(Type):
return writer.pycapsule_new(val, self.element.capsule_name,
self.element.fullname)
-class cast(Type):
+class cast(_Type):
format = 'O'
def __init__(self, original, target):
@@ -406,14 +414,14 @@ class cast(Type):
@property
def python_type(self):
- if not isinstance(self.target, Type):
+ if not isinstance(self.target, _Type):
return self.target
else:
return self.original
@property
def binding_type(self):
- if isinstance(self.target, Type):
+ if isinstance(self.target, _Type):
return self.target
else:
return self.original
diff --git a/newbinding/capsule.py b/newbinding/capsule.py
index e4cd4fa..d999e30 100644
--- a/newbinding/capsule.py
+++ b/newbinding/capsule.py
@@ -19,7 +19,7 @@ def set_debug(enabled):
class WeakRef(ref):
- __slots__ = 'capsule', 'dtor'
+ __slots__ = 'capsule', 'dtor', 'owning'
_pyclasses = {}
_addr2obj = WeakValueDictionary()
@@ -33,12 +33,20 @@ def classof(cap):
return _pyclasses[cls]
def _capsule_destructor(weak):
- cap = weak.capsule
- addr = _capsule.getPointer(cap)
- cls = _capsule.getClassName(cap)
- logger.debug("destroy pointer 0x%08X to %s", addr, cls)
- weak.dtor(cap)
- del _owners[addr]
+ if weak.owning:
+ cap = weak.capsule
+ addr = _capsule.getPointer(cap)
+ cls = _capsule.getClassName(cap)
+ logger.debug("destroy pointer 0x%08X to %s", addr, cls)
+ weak.dtor(cap)
+ del _owners[addr]
+
+def release_ownership(old):
+ addr = _capsule.getPointer(old)
+ if hasattr(old, '_delete_'):
+ oldweak = _owners[addr]
+ oldweak.owning = False # dis-own
+ del _owners[addr]
def wrap(cap):
'''Wrap a PyCapsule with the corresponding Wrapper class.
@@ -60,13 +68,26 @@ def wrap(cap):
weak = WeakRef(obj, _capsule_destructor)
_owners[addr] = weak
weak.capsule = cap
+ weak.owning = True
weak.dtor = cls._delete_
else:
- assert classof(obj._ptr) is classof(cap)
- # Unset destructor for capsules that are repeated
- _capsule.setDestructor(cap, None)
+ oldcls = classof(obj._ptr)
+ newcls = classof(cap)
+ if issubclass(oldcls, newcls):
+ # do auto downcast
+ pass
+ else:
+ assert oldcls is newcls
return obj
+def downcast(old, new):
+ assert old is not new
+ oldcls = classof(old)
+ newcls = classof(new)
+ assert issubclass(newcls, oldcls)
+ release_ownership(old)
+ del _addr2obj[_capsule.getPointer(old)] # clear cache
+ return wrap(new)
def unwrap(obj):
'''Unwrap a Wrapper instance into the underlying PyCapsule.
@@ -96,8 +117,3 @@ class Wrapper(object):
def _ptr(self):
return self.__ptr
- def _release_ownership(self):
- _capsule.setDestructor(self._ptr, None)
-
-
-
diff --git a/newbinding/extra.py b/newbinding/extra.py
index 1af4e5f..a613296 100644
--- a/newbinding/extra.py
+++ b/newbinding/extra.py
@@ -3,8 +3,13 @@ Wrapped the extra functions in _api.so
'''
import capsule
+import _api
+#
+# Re-export the native API from the _api.extra and wrap the functions
+#
def _wrapper(func):
+ "Wrap the re-exported functions"
def _core(*args):
unwrapped = map(capsule.unwrap, args)
ret = func(*unwrapped)
@@ -12,9 +17,27 @@ def _wrapper(func):
return _core
def _init(glob):
- from _api import extra
- for k, v in extra.__dict__.items():
+ for k, v in _api.extra.__dict__.items():
glob[k] = _wrapper(v)
_init(globals())
+#
+# Downcasts
+#
+
+def downcast(obj, cls):
+ if type(obj) is cls:
+ return obj
+ fromty = obj._llvm_type_
+ toty = cls._llvm_type_
+ fname = 'downcast_%s_to_%s' % (fromty, toty)
+ fname = fname.replace('::', '_')
+ try:
+ caster = getattr(_api, fname)
+ except AttributeError:
+ fmt = "Downcast from %s to %s is not supported"
+ raise TypeError(fmt % (fromty, toty))
+ old = capsule.unwrap(obj)
+ new = caster(old)
+ return capsule.downcast(old, new)
\ No newline at end of file
diff --git a/newbinding/gen.py b/newbinding/gen.py
index 4d8709e..f1af18e 100644
--- a/newbinding/gen.py
+++ b/newbinding/gen.py
@@ -72,6 +72,20 @@ def main():
print cls
units.append(cls)
+ # add extra stuffs
+ downcastlist = []
+ ## add downcast
+ for cls in units:
+ if isinstance(cls, Class):
+ for bcls in cls.downcastables:
+ from_to = bcls.fullname, cls.fullname
+ name = 'downcast_%s_to_%s' % tuple(map(codegen.mangle, from_to))
+ fn = Function(namespaces[''], name, ptr(cls), ptr(bcls))
+ downcastlist.append((from_to, fn))
+ units.append(fn)
+
+
+ # generate cpp source
with open('%s.cpp' % outputfilename, 'w') as cppfile:
println = wrap_println_from_file(cppfile)
@@ -87,6 +101,18 @@ def main():
println('#include "%s"' % inc)
println()
+ # generate downcast
+ for ((fromty, toty), fn) in downcastlist:
+ name = fn.name
+ fmt = '''
+static
+%(toty)s* %(name)s(%(fromty)s* arg)
+{
+ return typecast<%(toty)s>::from(arg);
+}
+'''
+ println(fmt % locals())
+
# write methods and method tables
for u in units:
writer = codegen.CppCodeWriter(println)
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h
index 417c0f8..94887b3 100644
--- a/newbinding/include/llvm_binding/extra.h
+++ b/newbinding/include/llvm_binding/extra.h
@@ -37,9 +37,9 @@ PyObject* make_small_vector_from_types(PyObject* self, PyObject* args) {
}
static PyMethodDef extra_methodtable[] = {
-#define method(func) { #func, (PyCFunction)func, METH_VARARGS, NULL }
-method( make_raw_ostream_for_printing ),
-method( make_small_vector_from_types ),
-{ NULL }
-#undef method
+ #define method(func) { #func, (PyCFunction)func, METH_VARARGS, NULL }
+ method( make_raw_ostream_for_printing ),
+ method( make_small_vector_from_types ),
+ #undef method
+ { NULL }
};
diff --git a/newbinding/src/namespace.py b/newbinding/src/namespace.py
index c50256d..3a081af 100644
--- a/newbinding/src/namespace.py
+++ b/newbinding/src/namespace.py
@@ -1,3 +1,4 @@
from binding import *
llvm = Namespace('llvm')
+default = Namespace('')
From c76096bbcb01953d43b9a829f28d5e52b7fad9d7 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Fri, 25 Jan 2013 15:41:38 -0600
Subject: [PATCH 122/414] Add Function and some Function methods
---
newbinding/src/Function.py | 19 +++++++++++++++++++
newbinding/src/GlobalValue.py | 8 ++++++++
newbinding/src/Module.py | 1 +
newbinding/src/Value.py | 2 +-
newbinding/test2.py | 12 +++++++++++-
5 files changed, 40 insertions(+), 2 deletions(-)
create mode 100644 newbinding/src/Function.py
create mode 100644 newbinding/src/GlobalValue.py
diff --git a/newbinding/src/Function.py b/newbinding/src/Function.py
new file mode 100644
index 0000000..7077d3a
--- /dev/null
+++ b/newbinding/src/Function.py
@@ -0,0 +1,19 @@
+from binding import *
+from namespace import llvm
+from GlobalValue import GlobalValue
+from Constant import Constant
+from Type import Type
+from DerivedTypes import FunctionType
+from LLVMContext import LLVMContext
+
+@llvm.Class(GlobalValue)
+class Function:
+ _include_ = 'llvm/Function.h'
+ _downcast_ = GlobalValue, Constant
+
+ getReturnType = Method(ptr(Type))
+ getFunctionType = Method(ptr(FunctionType))
+ getContext = Method(ref(LLVMContext))
+ isVarArg = Method(cast(Bool, bool))
+ getIntrinsicID = Method(cast(Unsigned, int))
+ isIntrinsic = Method(cast(Bool, bool))
\ No newline at end of file
diff --git a/newbinding/src/GlobalValue.py b/newbinding/src/GlobalValue.py
new file mode 100644
index 0000000..f1a6827
--- /dev/null
+++ b/newbinding/src/GlobalValue.py
@@ -0,0 +1,8 @@
+from binding import *
+from namespace import llvm
+from Constant import Constant
+
+@llvm.Class(Constant)
+class GlobalValue:
+ _include_ = 'llvm/GlobalValue.h'
+
diff --git a/newbinding/src/Module.py b/newbinding/src/Module.py
index 6a6a806..730b757 100644
--- a/newbinding/src/Module.py
+++ b/newbinding/src/Module.py
@@ -3,6 +3,7 @@ from namespace import llvm
from LLVMContext import LLVMContext
from StringRef import StringRef
from Constant import Constant
+from Function import Function
from DerivedTypes import FunctionType
from raw_ostream import raw_ostream
from AssemblyAnnotationWriter import AssemblyAnnotationWriter
diff --git a/newbinding/src/Value.py b/newbinding/src/Value.py
index 9d1a2dd..30b3f37 100644
--- a/newbinding/src/Value.py
+++ b/newbinding/src/Value.py
@@ -24,4 +24,4 @@ class Value:
getName = Method(cast(StringRef, str))
setName = Method(Void, cast(str, StringRef))
- replaceAllUsesWith = Method(Void, ptr(Value))
\ No newline at end of file
+ replaceAllUsesWith = Method(Void, ptr(Value))
diff --git a/newbinding/test2.py b/newbinding/test2.py
index afb3608..3429f10 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -37,7 +37,8 @@ os = extra.make_raw_ostream_for_printing()
fnty.print_(os)
print os.str()
-fn = m.getOrInsertFunction("foo", fnty)
+const = m.getOrInsertFunction("foo", fnty)
+fn = extra.downcast(const, api.Function)
os = extra.make_raw_ostream_for_printing()
fn.print_(os, None)
print os.str()
@@ -45,3 +46,12 @@ assert fn.hasName()
assert 'foo' == fn.getName()
fn.setName('bar')
assert 'bar' == fn.getName()
+
+os = extra.make_raw_ostream_for_printing()
+assert fn.getReturnType() is int1ty
+
+assert fnty is fn.getFunctionType()
+
+assert fn.isVarArg() == False
+assert fn.getIntrinsicID() == 0
+assert not fn.isIntrinsic()
From 4b5cb100f71c5b9624a35e78c97324f48d0dde4f Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Mon, 28 Jan 2013 15:18:24 -0600
Subject: [PATCH 123/414] Auto discover binding modules
---
newbinding/src/__init__.py | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/newbinding/src/__init__.py b/newbinding/src/__init__.py
index 6e24918..1042826 100644
--- a/newbinding/src/__init__.py
+++ b/newbinding/src/__init__.py
@@ -1,2 +1,11 @@
-from . import Module
+import os.path, importlib
+def _init():
+ for fname in os.listdir(os.path.dirname(__file__)):
+ if ((fname.endswith('.py') or fname.endswith('.pyc')) and
+ not fname.startswith('__init__')):
+ modname = os.path.basename(fname).rsplit('.', 1)[0]
+ topname = __name__.rsplit('.', 1)[0]
+ importlib.import_module('.' + modname, topname)
+
+_init()
From 01683150760f3f0778937590eac769847f7d8b64 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Mon, 28 Jan 2013 15:19:16 -0600
Subject: [PATCH 124/414] Explicitly declare class name when registering
classes
---
newbinding/binding.py | 3 +--
newbinding/capsule.py | 9 +++++----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/newbinding/binding.py b/newbinding/binding.py
index 8c58aa9..85b74e9 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -112,7 +112,7 @@ class Class(_Type):
bases = 'capsule.Wrapper'
if self.bases:
bases = ', '.join(x.name for x in self.bases)
- writer.println('@capsule.register_class')
+ writer.println('@capsule.register_class("%s")' % self.fullname)
with writer.block('class %(clsname)s(%(bases)s):' % locals()):
writer.println('_llvm_type_ = "%s"' % self.fullname)
for enum in self.enums:
@@ -151,7 +151,6 @@ class Class(_Type):
writer.die_if_false(casted)
return casted
-
class Enum(object):
def __init__(self, *value_names):
self.parent = None
diff --git a/newbinding/capsule.py b/newbinding/capsule.py
index d999e30..47c32fb 100644
--- a/newbinding/capsule.py
+++ b/newbinding/capsule.py
@@ -99,10 +99,11 @@ def unwrap(obj):
return obj
-def register_class(cls):
- clsname = cls.__name__
- _pyclasses['llvm::%s' % clsname] = cls
- return cls
+def register_class(clsname):
+ def _wrapped(cls):
+ _pyclasses[clsname] = cls
+ return cls
+ return _wrapped
class Wrapper(object):
From d1931cc4994c2ee6adf8d611c9a59d5dbc9c0362 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Mon, 28 Jan 2013 15:20:07 -0600
Subject: [PATCH 125/414] Fix duplicated semicolon
---
newbinding/codegen.py | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/newbinding/codegen.py b/newbinding/codegen.py
index 9398b14..2a85abc 100644
--- a/newbinding/codegen.py
+++ b/newbinding/codegen.py
@@ -184,14 +184,14 @@ class CppCodeWriter(CodeWriterBase):
arglist = ', '.join(args[1:])
if func == 'delete':
assert not arglist
- stmt = 'delete %(this)s;' % locals()
+ stmt = 'delete %(this)s' % locals()
elif func == 'new':
alloctype = retty.rstrip(' *')
- stmt = 'new %(alloctype)s(%(arglist)s);' % locals()
+ stmt = 'new %(alloctype)s(%(arglist)s)' % locals()
else:
- stmt = '%(this)s->%(func)s(%(arglist)s);' % locals()
+ stmt = '%(this)s->%(func)s(%(arglist)s)' % locals()
if retty == 'void':
- self.println(stmt)
+ self.println('%s;' % stmt)
else:
return self.declare(retty, stmt)
From 821e93783729ff74268e63c329d8a839c47fded9 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Mon, 28 Jan 2013 15:20:36 -0600
Subject: [PATCH 126/414] Add binding util for iterator to list
---
newbinding/binding.py | 43 ++++++++++++++++++++++++++++++++++---------
1 file changed, 34 insertions(+), 9 deletions(-)
diff --git a/newbinding/binding.py b/newbinding/binding.py
index 85b74e9..1764559 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -46,6 +46,7 @@ Void = BuiltinTypes('void')
Unsigned = BuiltinTypes('unsigned')
Bool = BuiltinTypes('bool')
ConstStdString = BuiltinTypes('const std::string')
+PyObjectPtr = BuiltinTypes('PyObject*')
class Class(_Type):
format = 'O'
@@ -81,6 +82,8 @@ class Class(_Type):
else:
for i in v:
self.includes.add(i)
+ elif k == '_realname_':
+ self.realname = v
elif k == '_downcast_':
if isinstance(v, Class):
self.downcastables.add(v)
@@ -146,7 +149,7 @@ class Class(_Type):
writer.die_if_false(raw)
ptrty = ptr(self).fullname
ty = self.fullname
- fmt = 'typecast<%(ty)s>::from(%(raw)s)'
+ fmt = 'typecast<%(ty)s >::from(%(raw)s)'
casted = writer.declare(ptrty, fmt % locals())
writer.die_if_false(casted)
return casted
@@ -252,12 +255,8 @@ class Method(object):
writer.raises(TypeError, 'Invalid number of args')
def compile_cpp_body(self, writer, retty, argtys):
- if isinstance(self.parent, Class):
- args = writer.parse_arguments('args', ptr(self.parent), *argtys)
- ret = writer.method_call(self.realname, retty.fullname, *args)
- else:
- args = writer.parse_arguments('args', *argtys)
- ret = writer.call(self.fullname, retty.fullname, *args)
+ args = writer.parse_arguments('args', ptr(self.parent), *argtys)
+ ret = writer.method_call(self.realname, retty.fullname, *args)
writer.return_value(retty.wrap(writer, ret))
def compile_py(self, writer):
@@ -273,6 +272,29 @@ class Method(object):
writer.println()
+class IterToList(Method):
+ def __init__(self, elemty, argtys, iterty, begin, end):
+ super(IterToList, self).__init__(PyObjectPtr, *argtys)
+ self.elemty = elemty
+ self.iterty = iterty
+ self.begin = begin
+ self.end = end
+
+ def compile_cpp_body(self, writer, retty, argtys):
+ args = writer.parse_arguments('args', ptr(self.parent), *argtys)
+ it = writer.method_call(self.begin, self.iterty, *args)
+ end = writer.method_call(self.end, self.iterty, *args)
+ con = writer.call('PyList_New', 'PyObject*', '0')
+ writer.die_if_false(con)
+ with writer.block('for (; %(it)s != %(end)s; ++%(it)s)' % locals()):
+ elem = writer.declare(self.elemty.fullname, '*%(it)s;' % locals())
+ wrapped = self.elemty.wrap(writer, elem)
+ ok = writer.call('PyList_Append', 'int', con, wrapped)
+ with writer.block('if (%(ok)s == -1)' % locals()):
+ writer.return_value(None)
+ writer.return_value(con)
+
+
class StaticMethod(Method):
def compile_cpp_body(self, writer, retty, argtys):
@@ -296,7 +318,6 @@ class StaticMethod(Method):
writer.return_value(wrapped)
writer.println()
-
class Function(Method):
_kind_ = 'func'
@@ -305,6 +326,11 @@ class Function(Method):
self.parent = parent
self.name = name
+ def compile_cpp_body(self, writer, retty, argtys):
+ args = writer.parse_arguments('args', *argtys)
+ ret = writer.call(self.fullname, retty.fullname, *args)
+ writer.return_value(retty.wrap(writer, ret))
+
def compile_py(self, writer):
with writer.function(self.name, varargs='args') as varargs:
unwrapped = writer.unwrap_many(varargs)
@@ -315,7 +341,6 @@ class Function(Method):
writer.return_value(wrapped)
writer.println()
-
class Destructor(Method):
_kind_ = 'dtor'
From fa4927e1fb6cb195206fbbf4d13d311148921690 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Mon, 28 Jan 2013 15:20:50 -0600
Subject: [PATCH 127/414] Start to work on IRBuilder
---
newbinding/src/Constant.py | 5 +++--
newbinding/src/Function.py | 8 ++++----
newbinding/src/GlobalValue.py | 4 ++--
newbinding/src/User.py | 5 ++---
newbinding/src/Value.py | 13 +++++++++++++
newbinding/test2.py | 12 ++++++++++++
6 files changed, 36 insertions(+), 11 deletions(-)
diff --git a/newbinding/src/Constant.py b/newbinding/src/Constant.py
index 14ff6bb..c59fef4 100644
--- a/newbinding/src/Constant.py
+++ b/newbinding/src/Constant.py
@@ -1,7 +1,8 @@
from binding import *
from namespace import llvm
-from User import User
+from Value import Constant
-@llvm.Class(User)
+@Constant
class Constant:
pass
+
diff --git a/newbinding/src/Function.py b/newbinding/src/Function.py
index 7077d3a..f069e30 100644
--- a/newbinding/src/Function.py
+++ b/newbinding/src/Function.py
@@ -1,12 +1,11 @@
from binding import *
from namespace import llvm
-from GlobalValue import GlobalValue
-from Constant import Constant
+from Value import GlobalValue, Constant, Function
from Type import Type
from DerivedTypes import FunctionType
from LLVMContext import LLVMContext
-@llvm.Class(GlobalValue)
+@Function
class Function:
_include_ = 'llvm/Function.h'
_downcast_ = GlobalValue, Constant
@@ -16,4 +15,5 @@ class Function:
getContext = Method(ref(LLVMContext))
isVarArg = Method(cast(Bool, bool))
getIntrinsicID = Method(cast(Unsigned, int))
- isIntrinsic = Method(cast(Bool, bool))
\ No newline at end of file
+ isIntrinsic = Method(cast(Bool, bool))
+
diff --git a/newbinding/src/GlobalValue.py b/newbinding/src/GlobalValue.py
index f1a6827..40825a8 100644
--- a/newbinding/src/GlobalValue.py
+++ b/newbinding/src/GlobalValue.py
@@ -1,8 +1,8 @@
from binding import *
from namespace import llvm
-from Constant import Constant
+from Value import GlobalValue
-@llvm.Class(Constant)
+@GlobalValue
class GlobalValue:
_include_ = 'llvm/GlobalValue.h'
diff --git a/newbinding/src/User.py b/newbinding/src/User.py
index dbc290d..57d58bc 100644
--- a/newbinding/src/User.py
+++ b/newbinding/src/User.py
@@ -1,8 +1,7 @@
from binding import *
from namespace import llvm
-from Value import Value
+from Value import User
-@llvm.Class(Value)
+@User
class User:
pass
-
diff --git a/newbinding/src/Value.py b/newbinding/src/Value.py
index 30b3f37..a901946 100644
--- a/newbinding/src/Value.py
+++ b/newbinding/src/Value.py
@@ -7,6 +7,12 @@ from LLVMContext import LLVMContext
from StringRef import StringRef
Value = llvm.Class()
+# forward declarations
+User = llvm.Class(Value)
+BasicBlock = llvm.Class(Value)
+Constant = llvm.Class(User)
+GlobalValue = llvm.Class(Constant)
+Function = llvm.Class(GlobalValue)
@Value
class Value:
@@ -25,3 +31,10 @@ class Value:
setName = Method(Void, cast(str, StringRef))
replaceAllUsesWith = Method(Void, ptr(Value))
+
+ list_use = IterToList(ptr(User), (), 'llvm::Value::use_iterator',
+ 'use_begin', 'use_end')
+
+ hasOneUse = Method(cast(Bool, bool))
+ hasNUses = Method(cast(Bool, bool), cast(int, Unsigned))
+ isUsedInBasicBlock = Method(cast(Bool, bool), BasicBlock)
diff --git a/newbinding/test2.py b/newbinding/test2.py
index 3429f10..810a7ba 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -55,3 +55,15 @@ assert fnty is fn.getFunctionType()
assert fn.isVarArg() == False
assert fn.getIntrinsicID() == 0
assert not fn.isIntrinsic()
+
+print fn.list_use()
+
+builder = api.IRBuilder.new(context)
+print builder
+
+bb = api.BasicBlock.Create(context, "entry", fn, None)
+builder.SetInsertPoint(bb)
+
+builder.CreateRetVoid()
+
+fn.dump()
From d9397289383cb0f17ba088cf3946ad6deb46ab0c Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Mon, 28 Jan 2013 15:21:30 -0600
Subject: [PATCH 128/414] Forgot to push files for previous commit.
---
newbinding/src/BasicBlock.py | 19 +++
newbinding/src/IRBuilder.py | 21 ++++
newbinding/src/Instruction.py | 230 ++++++++++++++++++++++++++++++++++
3 files changed, 270 insertions(+)
create mode 100644 newbinding/src/BasicBlock.py
create mode 100644 newbinding/src/IRBuilder.py
create mode 100644 newbinding/src/Instruction.py
diff --git a/newbinding/src/BasicBlock.py b/newbinding/src/BasicBlock.py
new file mode 100644
index 0000000..c7221a5
--- /dev/null
+++ b/newbinding/src/BasicBlock.py
@@ -0,0 +1,19 @@
+from binding import *
+from namespace import llvm
+from Value import Function, BasicBlock
+from LLVMContext import LLVMContext
+from StringRef import StringRef
+
+@BasicBlock
+class BasicBlock:
+ Create = StaticMethod(ptr(BasicBlock), ref(LLVMContext),
+ cast(str, StringRef),
+ ptr(Function),
+ ptr(BasicBlock))
+
+ getParent = Method(ptr(Function))
+ empty = Method(cast(Bool, bool))
+ dropAllReferences = Method()
+ isLandingPad = Method(cast(Bool, bool))
+ removePredecessor = Method(Void, ptr(BasicBlock), cast(bool, Bool))
+ removePredecessor |= Method(Void, ptr(BasicBlock))
diff --git a/newbinding/src/IRBuilder.py b/newbinding/src/IRBuilder.py
new file mode 100644
index 0000000..0919a67
--- /dev/null
+++ b/newbinding/src/IRBuilder.py
@@ -0,0 +1,21 @@
+from binding import *
+from namespace import llvm
+from LLVMContext import LLVMContext
+from BasicBlock import BasicBlock
+from Instruction import ReturnInst
+
+IRBuilder = llvm.Class()
+
+@IRBuilder
+class IRBuilder:
+ _include_ = 'llvm/IRBuilder.h'
+ _realname_ = 'IRBuilder<>'
+
+ new = Constructor(ref(LLVMContext))
+ delete = Destructor()
+
+ SetInsertPoint = Method(Void, ptr(BasicBlock))
+
+ isNamePreserving = Method(cast(Bool, bool))
+
+ CreateRetVoid = Method(ptr(ReturnInst))
diff --git a/newbinding/src/Instruction.py b/newbinding/src/Instruction.py
new file mode 100644
index 0000000..310e19d
--- /dev/null
+++ b/newbinding/src/Instruction.py
@@ -0,0 +1,230 @@
+from binding import *
+from namespace import llvm
+from Value import User
+
+Instruction = llvm.Class(User)
+AtomicCmpXchgInst = llvm.Class(Instruction)
+AtomicRMWInst = llvm.Class(Instruction)
+BinaryOperator = llvm.Class(Instruction)
+CallInst = llvm.Class(Instruction)
+CmpInst = llvm.Class(Instruction)
+ExtractElementInst = llvm.Class(Instruction)
+FenceInst = llvm.Class(Instruction)
+GetElementPtrInst = llvm.Class(Instruction)
+InsertElementInst = llvm.Class(Instruction)
+InsertValueInst = llvm.Class(Instruction)
+LandingPadInst = llvm.Class(Instruction)
+PHINode = llvm.Class(Instruction)
+SelectInst = llvm.Class(Instruction)
+ShuffleVectorInst = llvm.Class(Instruction)
+StoreInst = llvm.Class(Instruction)
+TerminatorInst = llvm.Class(Instruction)
+UnaryInstruction = llvm.Class(Instruction)
+
+IntrinsicInst = llvm.Class(CallInst)
+
+FCmpInst = llvm.Class(CmpInst)
+ICmpInst = llvm.Class(CmpInst)
+
+
+BranchInst = llvm.Class(TerminatorInst)
+IndirectBrInst = llvm.Class(TerminatorInst)
+ResumeInst = llvm.Class(TerminatorInst)
+ReturnInst = llvm.Class(TerminatorInst)
+SwitchInst = llvm.Class(TerminatorInst)
+UnreachableInst = llvm.Class(TerminatorInst)
+
+AllocaInst = llvm.Class(UnaryInstruction)
+CastInst = llvm.Class(UnaryInstruction)
+ExtractValueInst = llvm.Class(UnaryInstruction)
+LoadInst = llvm.Class(UnaryInstruction)
+VAArgInst = llvm.Class(UnaryInstruction)
+
+DbgInfoIntrinsic = llvm.Class(IntrinsicInst)
+MemIntrinsic = llvm.Class(IntrinsicInst)
+VACopyInst = llvm.Class(IntrinsicInst)
+VAEndInst = llvm.Class(IntrinsicInst)
+VAStartInst = llvm.Class(IntrinsicInst)
+
+BitCastInst = llvm.Class(CastInst)
+FPExtInst = llvm.Class(CastInst)
+FPToSIInst = llvm.Class(CastInst)
+FPToUIInst = llvm.Class(CastInst)
+FPTruncInst = llvm.Class(CastInst)
+
+@Instruction
+class Instruction:
+ pass
+
+
+@AtomicCmpXchgInst
+class AtomicCmpXchgInst:
+ pass
+
+@AtomicRMWInst
+class AtomicRMWInst:
+ pass
+
+@BinaryOperator
+class BinaryOperator:
+ pass
+
+@CallInst
+class CallInst:
+ pass
+
+@CmpInst
+class CmpInst:
+ pass
+
+@ExtractElementInst
+class ExtractElementInst:
+ pass
+
+@FenceInst
+class FenceInst:
+ pass
+
+@GetElementPtrInst
+class GetElementPtrInst:
+ pass
+
+@InsertElementInst
+class InsertElementInst:
+ pass
+
+@InsertValueInst
+class InsertValueInst:
+ pass
+
+@LandingPadInst
+class LandingPadInst:
+ pass
+
+@PHINode
+class PHINode:
+ pass
+
+@SelectInst
+class SelectInst:
+ pass
+
+@ShuffleVectorInst
+class ShuffleVectorInst:
+ pass
+
+@StoreInst
+class StoreInst:
+ pass
+
+@TerminatorInst
+class TerminatorInst:
+ pass
+
+@UnaryInstruction
+class UnaryInstruction:
+ pass
+
+#call
+
+@IntrinsicInst
+class IntrinsicInst:
+ pass
+
+#compare
+
+@FCmpInst
+class FCmpInst:
+ pass
+
+@ICmpInst
+class ICmpInst:
+ pass
+
+# terminator
+@BranchInst
+class BranchInst:
+ pass
+
+
+@IndirectBrInst
+class IndirectBrInst:
+ pass
+
+@ResumeInst
+class ResumeInst:
+ pass
+
+@ReturnInst
+class ReturnInst:
+ pass
+
+@SwitchInst
+class SwitchInst:
+ pass
+
+@UnreachableInst
+class UnreachableInst:
+ pass
+
+# unary
+@AllocaInst
+class AllocaInst:
+ pass
+
+@CastInst
+class CastInst:
+ pass
+
+@ExtractValueInst
+class ExtractValueInst:
+ pass
+
+@LoadInst
+class LoadInst:
+ pass
+
+@VAArgInst
+class VAArgInst:
+ pass
+
+# intrinsic
+@DbgInfoIntrinsic
+class DbgInfoIntrinsic:
+ pass
+
+@MemIntrinsic
+class MemIntrinsic:
+ pass
+
+@VACopyInst
+class VACopyInst:
+ pass
+
+@VAEndInst
+class VAEndInst:
+ pass
+
+@VAStartInst
+class VAStartInst:
+ pass
+
+@BitCastInst
+class BitCastInst:
+ pass
+
+@FPExtInst
+class FPExtInst:
+ pass
+
+@FPToSIInst
+class FPToSIInst:
+ pass
+
+@FPToUIInst
+class FPToUIInst:
+ pass
+
+@FPTruncInst
+class FPTruncInst:
+ pass
From af7962a2ca835a62074c7b0c881e982ac1655c1c Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Mon, 28 Jan 2013 15:53:01 -0600
Subject: [PATCH 129/414] Remove IterToList, llvm_extra.h. Add CustomMethod.
---
newbinding/binding.py | 25 +++------
newbinding/codegen.py | 4 +-
newbinding/gen.py | 1 -
newbinding/include/llvm_binding/extra.h | 53 ++++++++++++++++++--
newbinding/include/llvm_binding/llvm_extra.h | 38 --------------
newbinding/src/SmallVector.py | 1 +
newbinding/src/Value.py | 3 +-
7 files changed, 61 insertions(+), 64 deletions(-)
delete mode 100644 newbinding/include/llvm_binding/llvm_extra.h
diff --git a/newbinding/binding.py b/newbinding/binding.py
index 1764559..3538c9a 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -272,28 +272,17 @@ class Method(object):
writer.println()
-class IterToList(Method):
- def __init__(self, elemty, argtys, iterty, begin, end):
- super(IterToList, self).__init__(PyObjectPtr, *argtys)
- self.elemty = elemty
- self.iterty = iterty
- self.begin = begin
- self.end = end
+class CustomMethod(Method):
+ def __init__(self, methodname, retty, *argtys):
+ super(CustomMethod, self).__init__(retty, *argtys)
+ self.methodname = methodname
def compile_cpp_body(self, writer, retty, argtys):
args = writer.parse_arguments('args', ptr(self.parent), *argtys)
- it = writer.method_call(self.begin, self.iterty, *args)
- end = writer.method_call(self.end, self.iterty, *args)
- con = writer.call('PyList_New', 'PyObject*', '0')
- writer.die_if_false(con)
- with writer.block('for (; %(it)s != %(end)s; ++%(it)s)' % locals()):
- elem = writer.declare(self.elemty.fullname, '*%(it)s;' % locals())
- wrapped = self.elemty.wrap(writer, elem)
- ok = writer.call('PyList_Append', 'int', con, wrapped)
- with writer.block('if (%(ok)s == -1)' % locals()):
- writer.return_value(None)
- writer.return_value(con)
+ ret = writer.call(self.methodname, retty.fullname, *args)
+ writer.return_value(retty.wrap(writer, ret))
+
class StaticMethod(Method):
diff --git a/newbinding/codegen.py b/newbinding/codegen.py
index 2a85abc..7652447 100644
--- a/newbinding/codegen.py
+++ b/newbinding/codegen.py
@@ -42,14 +42,14 @@ def parse_arguments(println, var, *args):
return unwrapped
-_re_mangle_pattern = re.compile(r'[ _<>\*&]')
+_re_mangle_pattern = re.compile(r'[ _<>\*&,]')
def mangle(name):
def repl(m):
s = m.group(0)
if s in '<>*&':
return ''
- elif s in ' ':
+ elif s in ' ,':
return '_'
elif s in '_':
return '__'
diff --git a/newbinding/gen.py b/newbinding/gen.py
index f1af18e..d9fc14f 100644
--- a/newbinding/gen.py
+++ b/newbinding/gen.py
@@ -41,7 +41,6 @@ def populate_headers(println):
includes = [
'llvm_binding/conversion.h',
'llvm_binding/binding.h',
- 'llvm_binding/llvm_extra.h',
'llvm_binding/capsule_context.h',
'llvm_binding/extra.h', # extra submodule to add
]
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h
index 94887b3..639a87c 100644
--- a/newbinding/include/llvm_binding/extra.h
+++ b/newbinding/include/llvm_binding/extra.h
@@ -1,10 +1,43 @@
#include
#include
+#include
#include
+
+namespace extra{
+ using namespace llvm;
+
+ class raw_svector_ostream_helper: public raw_svector_ostream {
+ SmallVectorImpl *SV;
+ public:
+ static
+ raw_svector_ostream_helper* create(){
+ SmallVectorImpl* sv = new SmallVector();
+ return new raw_svector_ostream_helper(sv);
+ }
+
+ ~raw_svector_ostream_helper(){
+ delete SV;
+ }
+
+ protected:
+
+ explicit
+ raw_svector_ostream_helper(SmallVectorImpl* sv)
+ : raw_svector_ostream(*sv), SV(sv) {}
+
+ private:
+ // no copy
+ raw_svector_ostream_helper(const raw_svector_ostream_helper&);
+ // no assign
+ void operator = (const raw_svector_ostream_helper&);
+ };
+
+}
+
static
PyObject* make_raw_ostream_for_printing(PyObject* self, PyObject* args) {
- using llvm::raw_svector_ostream_helper;
+ using extra::raw_svector_ostream_helper;
using llvm::raw_svector_ostream;
if (!PyArg_ParseTuple(args, "")) {
@@ -18,7 +51,7 @@ PyObject* make_raw_ostream_for_printing(PyObject* self, PyObject* args) {
static
PyObject* make_small_vector_from_types(PyObject* self, PyObject* args) {
using llvm::Type;
- using llvm::SmallVector_Type;
+ typedef llvm::SmallVector SmallVector_Type;
SmallVector_Type* SV = new SmallVector_Type;
Py_ssize_t size = PyTuple_Size(args);
@@ -33,7 +66,7 @@ PyObject* make_small_vector_from_types(PyObject* self, PyObject* args) {
}
SV->push_back(type);
}
- return pycapsule_new(SV, "llvm::SmallVector_Type");
+ return pycapsule_new(SV, "llvm::SmallVector");
}
static PyMethodDef extra_methodtable[] = {
@@ -43,3 +76,17 @@ static PyMethodDef extra_methodtable[] = {
#undef method
{ NULL }
};
+
+
+////////////
+
+PyObject* Value_use_iterator_to_list(llvm::Value* val){
+ typedef llvm::Value::use_iterator iterator;
+ PyObject* list = PyList_New(0);
+ for (iterator it = val->use_begin(), end = val->use_end(); it != end; ++it) {
+ PyObject* cap = pycapsule_new(*it, "llvm::Value", "llvm::User");
+ PyList_Append(list, cap);
+ }
+ return list;
+}
+
diff --git a/newbinding/include/llvm_binding/llvm_extra.h b/newbinding/include/llvm_binding/llvm_extra.h
deleted file mode 100644
index f920a47..0000000
--- a/newbinding/include/llvm_binding/llvm_extra.h
+++ /dev/null
@@ -1,38 +0,0 @@
-#include
-#include
-#include
-
-namespace llvm{
-
-class Type; //forward declaration
-
-class raw_svector_ostream_helper: public raw_svector_ostream {
- SmallVectorImpl *SV;
-public:
- static
- raw_svector_ostream_helper* create(){
- SmallVectorImpl* sv = new SmallVector();
- return new raw_svector_ostream_helper(sv);
- }
-
- ~raw_svector_ostream_helper(){
- delete SV;
- }
-
-protected:
-
- explicit
- raw_svector_ostream_helper(SmallVectorImpl* sv)
- : raw_svector_ostream(*sv), SV(sv) {}
-
-private:
- // no copy
- raw_svector_ostream_helper(const raw_svector_ostream_helper&);
- // no assign
- void operator = (const raw_svector_ostream_helper&);
-};
-
-typedef SmallVector SmallVector_Type;
-
-} // end namespace llvm
-
diff --git a/newbinding/src/SmallVector.py b/newbinding/src/SmallVector.py
index d00b294..55dadb1 100644
--- a/newbinding/src/SmallVector.py
+++ b/newbinding/src/SmallVector.py
@@ -3,4 +3,5 @@ from namespace import llvm
@llvm.Class()
class SmallVector_Type:
+ _realname_ = 'SmallVector'
delete = Destructor()
diff --git a/newbinding/src/Value.py b/newbinding/src/Value.py
index a901946..3dd5644 100644
--- a/newbinding/src/Value.py
+++ b/newbinding/src/Value.py
@@ -32,8 +32,7 @@ class Value:
replaceAllUsesWith = Method(Void, ptr(Value))
- list_use = IterToList(ptr(User), (), 'llvm::Value::use_iterator',
- 'use_begin', 'use_end')
+ list_use = CustomMethod('Value_use_iterator_to_list', PyObjectPtr)
hasOneUse = Method(cast(Bool, bool))
hasNUses = Method(cast(Bool, bool), cast(int, Unsigned))
From 7aa9487f2f66e7003f14fe7835de2293de4b9d60 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Mon, 28 Jan 2013 16:00:25 -0600
Subject: [PATCH 130/414] pycapsule_new should return a None object if ptr is
NULL.
---
newbinding/include/llvm_binding/capsule_context.h | 3 +++
1 file changed, 3 insertions(+)
diff --git a/newbinding/include/llvm_binding/capsule_context.h b/newbinding/include/llvm_binding/capsule_context.h
index a4070dc..ed63e43 100644
--- a/newbinding/include/llvm_binding/capsule_context.h
+++ b/newbinding/include/llvm_binding/capsule_context.h
@@ -23,6 +23,9 @@ PyObject* pycapsule_new(void* ptr,
if (!classname) {
classname = basename;
}
+ if (!ptr) {
+ Py_RETURN_NONE;
+ }
PyObject* cap = PyCapsule_New(ptr, basename, NULL);
if (!cap) {
PyErr_SetString(PyExc_TypeError, "Error creating new PyCapsule");
From 895d1147300d13608763aa61b8ab2b9f56bd7662 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Mon, 28 Jan 2013 16:36:46 -0600
Subject: [PATCH 131/414] Add CustonPythonMethod and CustonPythonStaticMethod.
---
newbinding/binding.py | 24 ++++++++++++++++++++++++
newbinding/src/BasicBlock.py | 3 +++
newbinding/src/DerivedTypes.py | 19 +++++++++++++++++--
newbinding/src/Value.py | 7 +++++++
newbinding/test2.py | 26 +++++++++++++++-----------
5 files changed, 66 insertions(+), 13 deletions(-)
diff --git a/newbinding/binding.py b/newbinding/binding.py
index 3538c9a..6668452 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -1,3 +1,4 @@
+import inspect, textwrap
import functools
import codegen as cg
@@ -56,6 +57,7 @@ class Class(_Type):
self.bases = bases
self._is_defined = False
self.methods = []
+ self.pymethods = []
self.enums = []
self.includes = set()
self.downcastables = set()
@@ -76,6 +78,8 @@ class Class(_Type):
self.enums.append(v)
v.name = k
v.parent = self
+ elif isinstance(v, CustomPythonMethod):
+ self.pymethods.append(v)
elif k == '_include_':
if isinstance(v, str):
self.includes.add(v)
@@ -122,6 +126,8 @@ class Class(_Type):
enum.compile_py(writer)
for meth in self.methods:
meth.compile_py(writer)
+ for meth in self.pymethods:
+ meth.compile_py(writer)
writer.println()
@property
@@ -453,3 +459,21 @@ class cast(_Type):
+class CustomPythonMethod(object):
+ def __init__(self, fn):
+ src = inspect.getsource(fn)
+ lines = textwrap.dedent(src).splitlines()
+ for i, line in enumerate(lines):
+ if not line.startswith('@'):
+ break
+ self.sourcelines = lines[i:]
+
+ def compile_py(self, writer):
+ for line in self.sourcelines:
+ writer.println(line)
+
+class CustomPythonStaticMethod(CustomPythonMethod):
+ def compile_py(self, writer):
+ writer.println('@staticmethod')
+ super(CustomPythonStaticMethod, self).compile_py(writer)
+
diff --git a/newbinding/src/BasicBlock.py b/newbinding/src/BasicBlock.py
index c7221a5..b0716cd 100644
--- a/newbinding/src/BasicBlock.py
+++ b/newbinding/src/BasicBlock.py
@@ -1,6 +1,7 @@
from binding import *
from namespace import llvm
from Value import Function, BasicBlock
+from Instruction import Instruction, TerminatorInst
from LLVMContext import LLVMContext
from StringRef import StringRef
@@ -12,6 +13,8 @@ class BasicBlock:
ptr(BasicBlock))
getParent = Method(ptr(Function))
+ getTerminator = Method(ptr(TerminatorInst))
+
empty = Method(cast(Bool, bool))
dropAllReferences = Method()
isLandingPad = Method(cast(Bool, bool))
diff --git a/newbinding/src/DerivedTypes.py b/newbinding/src/DerivedTypes.py
index c57e01b..efce8b8 100644
--- a/newbinding/src/DerivedTypes.py
+++ b/newbinding/src/DerivedTypes.py
@@ -9,8 +9,23 @@ FunctionType = llvm.Class(Type)
@FunctionType
class FunctionType:
_include_ = 'llvm/DerivedTypes.h'
- get = StaticMethod(ptr(FunctionType), ptr(Type), cast(bool, Bool))
- get |= StaticMethod(ptr(FunctionType), ptr(Type), ref(SmallVector_Type), cast(bool, Bool))
+
+ _get = StaticMethod(ptr(FunctionType), ptr(Type), cast(bool, Bool))
+ _get |= StaticMethod(ptr(FunctionType), ptr(Type), ref(SmallVector_Type),
+ cast(bool, Bool))
+ _get.realname = 'get'
+
+ @CustomPythonStaticMethod
+ def get(*args):
+ import extra
+ if len(args) == 3:
+ typelist = args[1]
+ sv = extra.make_small_vector_from_types(*typelist)
+ return FunctionType._get(args[0], sv, args[2])
+ else:
+ return FunctionType._get(*args)
+
+
isVarArg = Method(cast(Bool, bool))
getReturnType = Method(ptr(Type))
getParamType = Method(ptr(Type), cast(int, Unsigned))
diff --git a/newbinding/src/Value.py b/newbinding/src/Value.py
index 3dd5644..5345337 100644
--- a/newbinding/src/Value.py
+++ b/newbinding/src/Value.py
@@ -37,3 +37,10 @@ class Value:
hasOneUse = Method(cast(Bool, bool))
hasNUses = Method(cast(Bool, bool), cast(int, Unsigned))
isUsedInBasicBlock = Method(cast(Bool, bool), BasicBlock)
+
+ @CustomPythonMethod
+ def __str__(self):
+ import extra
+ os = extra.make_raw_ostream_for_printing()
+ self.print_(os, None)
+ return os.str()
diff --git a/newbinding/test2.py b/newbinding/test2.py
index 810a7ba..3e54aee 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -30,24 +30,18 @@ fnty = api.FunctionType.get(int1ty, False)
fnty.dump()
types = [int1ty, api.Type.getIntNTy(context, 21)]
-svt = extra.make_small_vector_from_types(*types)
-fnty = api.FunctionType.get(int1ty, svt, False)
+fnty = api.FunctionType.get(int1ty, types, False)
-os = extra.make_raw_ostream_for_printing()
-fnty.print_(os)
-print os.str()
+print fnty
const = m.getOrInsertFunction("foo", fnty)
fn = extra.downcast(const, api.Function)
-os = extra.make_raw_ostream_for_printing()
-fn.print_(os, None)
-print os.str()
+print fn
assert fn.hasName()
assert 'foo' == fn.getName()
fn.setName('bar')
assert 'bar' == fn.getName()
-os = extra.make_raw_ostream_for_printing()
assert fn.getReturnType() is int1ty
assert fnty is fn.getFunctionType()
@@ -56,14 +50,24 @@ assert fn.isVarArg() == False
assert fn.getIntrinsicID() == 0
assert not fn.isIntrinsic()
-print fn.list_use()
+fn_uselist = fn.list_use()
+assert isinstance(fn_uselist, list)
+assert len(fn_uselist) == 0
builder = api.IRBuilder.new(context)
print builder
bb = api.BasicBlock.Create(context, "entry", fn, None)
+assert bb.empty()
builder.SetInsertPoint(bb)
+assert bb.getTerminator() is None
+
builder.CreateRetVoid()
-fn.dump()
+assert not bb.empty()
+assert bb.getTerminator() is not None
+
+print bb
+
+
From 59d0dfddc733f44252c244bd0a5d496337f82000 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Mon, 28 Jan 2013 17:55:52 -0600
Subject: [PATCH 132/414] Continue to implement IRBuilder
---
newbinding/capsule.py | 8 ++-
newbinding/include/llvm_binding/extra.h | 87 ++++++++++++++++++++++---
newbinding/src/Argument.py | 9 +++
newbinding/src/Function.py | 4 +-
newbinding/src/IRBuilder.py | 19 +++++-
newbinding/src/SmallVector.py | 6 ++
newbinding/src/Value.py | 1 +
newbinding/test2.py | 10 +--
8 files changed, 125 insertions(+), 19 deletions(-)
create mode 100644 newbinding/src/Argument.py
diff --git a/newbinding/capsule.py b/newbinding/capsule.py
index 47c32fb..eaef7da 100644
--- a/newbinding/capsule.py
+++ b/newbinding/capsule.py
@@ -52,8 +52,10 @@ def wrap(cap):
'''Wrap a PyCapsule with the corresponding Wrapper class.
If `cap` is not a PyCapsule, returns `cap`
'''
- if not _capsule.check(cap): # bypass if cap is not a PyCapsule
- return cap
+ if not _capsule.check(cap):
+ if isinstance(cap, list):
+ return map(wrap, cap)
+ return cap # bypass if cap is not a PyCapsule and not a list
addr = _capsule.getPointer(cap)
try:
# find cached object by pointer address
@@ -77,7 +79,7 @@ def wrap(cap):
# do auto downcast
pass
else:
- assert oldcls is newcls
+ assert oldcls is newcls, (cap, obj, oldcls, newcls)
return obj
def downcast(old, new):
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h
index 639a87c..9f2bd70 100644
--- a/newbinding/include/llvm_binding/extra.h
+++ b/newbinding/include/llvm_binding/extra.h
@@ -1,6 +1,7 @@
#include
#include
#include
+#include
#include
@@ -11,12 +12,14 @@ namespace extra{
SmallVectorImpl *SV;
public:
static
- raw_svector_ostream_helper* create(){
+ raw_svector_ostream_helper* create()
+ {
SmallVectorImpl* sv = new SmallVector();
return new raw_svector_ostream_helper(sv);
}
- ~raw_svector_ostream_helper(){
+ ~raw_svector_ostream_helper()
+ {
delete SV;
}
@@ -36,7 +39,8 @@ namespace extra{
}
static
-PyObject* make_raw_ostream_for_printing(PyObject* self, PyObject* args) {
+PyObject* make_raw_ostream_for_printing(PyObject* self, PyObject* args)
+{
using extra::raw_svector_ostream_helper;
using llvm::raw_svector_ostream;
@@ -49,7 +53,8 @@ PyObject* make_raw_ostream_for_printing(PyObject* self, PyObject* args) {
}
static
-PyObject* make_small_vector_from_types(PyObject* self, PyObject* args) {
+PyObject* make_small_vector_from_types(PyObject* self, PyObject* args)
+{
using llvm::Type;
typedef llvm::SmallVector SmallVector_Type;
@@ -69,24 +74,88 @@ PyObject* make_small_vector_from_types(PyObject* self, PyObject* args) {
return pycapsule_new(SV, "llvm::SmallVector");
}
+static
+PyObject* make_small_vector_from_values(PyObject* self, PyObject* args)
+{
+ using llvm::Value;
+ typedef llvm::SmallVector SmallVector_Value;
+
+ SmallVector_Value* SV = new SmallVector_Value;
+ Py_ssize_t size = PyTuple_Size(args);
+ for (Py_ssize_t i = 0; i < size; ++i) {
+ PyObject* cap = PyTuple_GetItem(args, i);
+ if (!cap) {
+ return NULL;
+ }
+ Value* value = (Value*)PyCapsule_GetPointer(cap, "llvm::Value");
+ if (!value) {
+ return NULL;
+ }
+ SV->push_back(value);
+ }
+ return pycapsule_new(SV, "llvm::SmallVector");
+}
+
+
static PyMethodDef extra_methodtable[] = {
#define method(func) { #func, (PyCFunction)func, METH_VARARGS, NULL }
method( make_raw_ostream_for_printing ),
method( make_small_vector_from_types ),
+ method( make_small_vector_from_values ),
#undef method
{ NULL }
};
////////////
-
-PyObject* Value_use_iterator_to_list(llvm::Value* val){
- typedef llvm::Value::use_iterator iterator;
+template
+PyObject* iterator_to_pylist_deref(iterator begin, iterator end,
+ const char *capsuleName, const char *className)
+{
PyObject* list = PyList_New(0);
- for (iterator it = val->use_begin(), end = val->use_end(); it != end; ++it) {
- PyObject* cap = pycapsule_new(*it, "llvm::Value", "llvm::User");
+ for(; begin != end; ++begin) {
+ PyObject* cap = pycapsule_new(&*begin, capsuleName, className);
PyList_Append(list, cap);
}
return list;
}
+template
+PyObject* iterator_to_pylist(iterator begin, iterator end,
+ const char *capsuleName, const char *className)
+{
+ PyObject* list = PyList_New(0);
+ for(; begin != end; ++begin) {
+ PyObject* cap = pycapsule_new(*begin, capsuleName, className);
+ PyList_Append(list, cap);
+ }
+ return list;
+}
+
+template
+PyObject* iplist_to_pylist(iplist &IPL, const char * capsuleName,
+ const char* className){
+ return iterator_to_pylist_deref(IPL.begin(), IPL.end(), capsuleName,
+ className);
+}
+
+static
+PyObject* Value_use_iterator_to_list(llvm::Value* val)
+{
+ return iterator_to_pylist(val->use_begin(), val->use_end(),
+ "llvm::Value", "llvm::User");
+}
+
+static
+PyObject* Function_getArgumentList(llvm::Function* fn)
+{
+ return iplist_to_pylist(fn->getArgumentList(), "llvm::Value",
+ "llvm::Argument");
+}
+
+static
+PyObject* Function_getBasicBlockList(llvm::Function* fn)
+{
+ return iplist_to_pylist(fn->getBasicBlockList(), "llvm::Value",
+ "llvm::BasicBlock");
+}
\ No newline at end of file
diff --git a/newbinding/src/Argument.py b/newbinding/src/Argument.py
new file mode 100644
index 0000000..08b35be
--- /dev/null
+++ b/newbinding/src/Argument.py
@@ -0,0 +1,9 @@
+from binding import *
+from namespace import llvm
+from Value import Argument
+
+@Argument
+class Argument:
+ _include_ = 'llvm/Argument.h'
+
+
diff --git a/newbinding/src/Function.py b/newbinding/src/Function.py
index f069e30..5cebf84 100644
--- a/newbinding/src/Function.py
+++ b/newbinding/src/Function.py
@@ -1,6 +1,6 @@
from binding import *
from namespace import llvm
-from Value import GlobalValue, Constant, Function
+from Value import GlobalValue, Constant, Function, Argument
from Type import Type
from DerivedTypes import FunctionType
from LLVMContext import LLVMContext
@@ -17,3 +17,5 @@ class Function:
getIntrinsicID = Method(cast(Unsigned, int))
isIntrinsic = Method(cast(Bool, bool))
+ getArgumentList = CustomMethod('Function_getArgumentList', PyObjectPtr)
+ getBasicBlockList = CustomMethod('Function_getBasicBlockList', PyObjectPtr)
diff --git a/newbinding/src/IRBuilder.py b/newbinding/src/IRBuilder.py
index 0919a67..41e6681 100644
--- a/newbinding/src/IRBuilder.py
+++ b/newbinding/src/IRBuilder.py
@@ -2,7 +2,10 @@ from binding import *
from namespace import llvm
from LLVMContext import LLVMContext
from BasicBlock import BasicBlock
-from Instruction import ReturnInst
+from Instruction import ReturnInst, CallInst
+from SmallVector import SmallVector_Value
+from StringRef import StringRef
+from Value import Value
IRBuilder = llvm.Class()
@@ -19,3 +22,17 @@ class IRBuilder:
isNamePreserving = Method(cast(Bool, bool))
CreateRetVoid = Method(ptr(ReturnInst))
+ CreateRet = Method(ptr(ReturnInst), ptr(Value))
+
+ _CreateCall = Method(ptr(CallInst), ptr(Value), ref(SmallVector_Value),
+ cast(str, StringRef))
+ _CreateCall |= Method(ptr(CallInst), ptr(Value), ref(SmallVector_Value))
+ _CreateCall.realname = 'CreateCall'
+
+ @CustomPythonMethod
+ def CreateCall(self, *args):
+ import extra
+ args = list(args)
+ valuelist = args[1]
+ args[1] = extra.make_small_vector_from_values(*valuelist)
+ return IRBuilder._CreateCall(self, *args)
diff --git a/newbinding/src/SmallVector.py b/newbinding/src/SmallVector.py
index 55dadb1..594faf8 100644
--- a/newbinding/src/SmallVector.py
+++ b/newbinding/src/SmallVector.py
@@ -5,3 +5,9 @@ from namespace import llvm
class SmallVector_Type:
_realname_ = 'SmallVector'
delete = Destructor()
+
+@llvm.Class()
+class SmallVector_Value:
+ _realname_ = 'SmallVector'
+ delete = Destructor()
+
diff --git a/newbinding/src/Value.py b/newbinding/src/Value.py
index 5345337..5b907bd 100644
--- a/newbinding/src/Value.py
+++ b/newbinding/src/Value.py
@@ -8,6 +8,7 @@ from StringRef import StringRef
Value = llvm.Class()
# forward declarations
+Argument = llvm.Class(Value)
User = llvm.Class(Value)
BasicBlock = llvm.Class(Value)
Constant = llvm.Class(User)
diff --git a/newbinding/test2.py b/newbinding/test2.py
index 3e54aee..a7a4ddd 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -63,11 +63,11 @@ builder.SetInsertPoint(bb)
assert bb.getTerminator() is None
-builder.CreateRetVoid()
+arg0, arg1 = fn.getArgumentList()
+print arg0, arg1
-assert not bb.empty()
-assert bb.getTerminator() is not None
-
-print bb
+ret = builder.CreateCall(fn, [arg0, arg1], '')
+builder.CreateRet(ret)
+print fn
From 437b1e949012595882f8fbb3065c0c7e4c9b0835 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 29 Jan 2013 17:47:15 -0600
Subject: [PATCH 133/414] All of DataLayout, IRBuilder and started on
ExecutionEngine.
---
newbinding/binding.py | 114 ++++++++-
newbinding/capsule.py | 22 +-
newbinding/codegen.py | 12 +-
newbinding/gen.py | 11 +-
.../include/llvm_binding/capsule_context.h | 10 +
newbinding/include/llvm_binding/extra.h | 81 +++++-
newbinding/src/CodeGen.py | 19 ++
newbinding/src/DataLayout.py | 97 +++++++
newbinding/src/ExecutionEngine.py | 34 +++
newbinding/src/GlobalVariable.py | 8 +
newbinding/src/IRBuilder.py | 241 +++++++++++++++++-
newbinding/src/Instruction.py | 32 ++-
newbinding/src/JITMemoryManager.py | 7 +
newbinding/src/Metadata.py | 7 +
newbinding/src/Module.py | 3 +-
newbinding/src/SmallVector.py | 4 +
newbinding/src/TargetSelect.py | 8 +
newbinding/src/Type.py | 4 +
newbinding/src/Value.py | 1 +
newbinding/test2.py | 14 +
20 files changed, 688 insertions(+), 41 deletions(-)
create mode 100644 newbinding/src/CodeGen.py
create mode 100644 newbinding/src/DataLayout.py
create mode 100644 newbinding/src/ExecutionEngine.py
create mode 100644 newbinding/src/GlobalVariable.py
create mode 100644 newbinding/src/JITMemoryManager.py
create mode 100644 newbinding/src/Metadata.py
create mode 100644 newbinding/src/TargetSelect.py
diff --git a/newbinding/binding.py b/newbinding/binding.py
index 6668452..f7d5ac4 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -5,11 +5,15 @@ import codegen as cg
_rank = 0
namespaces = {}
+RESERVED = frozenset(['None'])
+
class Namespace(object):
def __init__(self, name):
self.name = name
+ self.enums = []
self.classes = []
self.functions = []
+ self.includes = set()
namespaces[name] = self
def Class(self, *bases):
@@ -22,6 +26,13 @@ class Namespace(object):
self.functions.append(fn)
return fn
+ def Enum(self, name, *value_names):
+ enum = Enum(*value_names)
+ enum.parent = self
+ enum.name = name
+ self.enums.append(enum)
+ return enum
+
@property
def fullname(self):
return self.name
@@ -43,11 +54,16 @@ class BuiltinTypes(_Type):
def wrap(self, writer, var):
return var
+ def unwrap(self, writer, var):
+ return var
+
Void = BuiltinTypes('void')
Unsigned = BuiltinTypes('unsigned')
+Uint64 = BuiltinTypes('uint64_t')
Bool = BuiltinTypes('bool')
ConstStdString = BuiltinTypes('const std::string')
PyObjectPtr = BuiltinTypes('PyObject*')
+PyObjectPtr.format='O'
class Class(_Type):
format = 'O'
@@ -78,6 +94,7 @@ class Class(_Type):
self.enums.append(v)
v.name = k
v.parent = self
+ setattr(self, k, v)
elif isinstance(v, CustomPythonMethod):
self.pymethods.append(v)
elif k == '_include_':
@@ -108,7 +125,7 @@ class Class(_Type):
fmt = '{ "%(name)s", (PyCFunction)%(func)s, METH_VARARGS, NULL },'
for meth in self.methods:
name = meth.name
- func = cg.mangle(meth.fullname)
+ func = meth.c_name
writer.println(fmt % locals())
writer.println('{ NULL },')
writer.println('};')
@@ -161,9 +178,12 @@ class Class(_Type):
return casted
class Enum(object):
+ format = 'O'
+
def __init__(self, *value_names):
self.parent = None
self.value_names = value_names
+ self.includes = set()
@property
def fullname(self):
@@ -191,11 +211,34 @@ class Enum(object):
writer.raises(ValueError, 'Invalid enum %s' % v)
return ret
+ def unwrap(self, writer, val):
+ tostring = 'PyString_AsString(%(val)s)' % locals()
+ string = writer.declare('const char*', tostring)
+ ret = writer.declare('%s::%s' % (self.parent, self.name))
+ parent = self.parent
+ iffmt = 'if (string_equal(%(string)s, "%(v)s"))'
+ for i, v in enumerate(self.value_names):
+ with writer.block(iffmt % locals()):
+ fmt = '%(ret)s = %(parent)s::%(v)s;'
+ writer.println(fmt % locals())
+ if i == 0:
+ iffmt = 'else ' + iffmt
+ with writer.block('else'):
+ writer.raises(ValueError, 'Invalid enum.')
+ return ret
+
+ def compile_cpp(self, writer):
+ pass
+
def compile_py(self, writer):
with writer.block('class %s:' % self.name):
writer.println('_llvm_type_ = "%s"' % self.fullname)
for v in self.value_names:
- writer.println('%(v)s = "%(v)s"' % locals())
+ if v in RESERVED:
+ k = '%s_' % v
+ else:
+ k = v
+ writer.println('%(k)s = "%(v)s"' % locals())
writer.println()
class Method(object):
@@ -236,11 +279,15 @@ class Method(object):
def realname(self, v):
self.__realname = v
+ @property
+ def c_name(self):
+ return cg.mangle("%s_%s" % (self.parent, self.name))
+
def __str__(self):
return self.fullname
def compile_cpp(self, writer):
- with writer.py_function(self.fullname):
+ with writer.py_function(self.c_name):
if len(self.signatures) == 1:
sig = self.signatures[0]
retty = sig[0]
@@ -270,13 +317,40 @@ class Method(object):
with decl as (this, varargs):
unwrap_this = writer.unwrap(this)
unwrapped = writer.unwrap_many(varargs)
+ self.process_ownedptr_args(writer, unwrapped)
+
func = '.'.join([self.parent.name, self.name])
ret = writer.call('_api.%s' % func,
args=(unwrap_this,), varargs=unwrapped)
- wrapped = writer.wrap(ret)
+
+ wrapped = writer.wrap(ret, self.is_return_ownedptr())
+
writer.return_value(wrapped)
writer.println()
+ def require_only(self, num):
+ '''Require only "num" of argument.
+ '''
+ assert len(self.signatures) == 1
+ sig = self.signatures[0]
+ ret = sig[0]
+ args = sig[1:]
+ arg_ct = len(args)
+
+ for i in range(num, arg_ct):
+ self._add_signature(ret, *args[:i])
+
+ return self
+
+ def is_return_ownedptr(self):
+ retty = self.signatures[0][0]
+ return isinstance(retty, ownedptr)
+
+ def process_ownedptr_args(self, writer, unwrapped):
+ argtys = self.signatures[0][1:]
+ for i, ty in enumerate(argtys):
+ if isinstance(ty, ownedptr):
+ writer.release_ownership('%s[%d]' % (unwrapped, i))
class CustomMethod(Method):
def __init__(self, methodname, retty, *argtys):
@@ -289,7 +363,6 @@ class CustomMethod(Method):
writer.return_value(retty.wrap(writer, ret))
-
class StaticMethod(Method):
def compile_cpp_body(self, writer, retty, argtys):
@@ -307,12 +380,24 @@ class StaticMethod(Method):
decl = writer.function(self.name, varargs='args')
with decl as varargs:
unwrapped = writer.unwrap_many(varargs)
+ self.process_ownedptr_args(writer, unwrapped)
+
func = '.'.join([self.parent.name, self.name])
ret = writer.call('_api.%s' % func, varargs=unwrapped)
- wrapped = writer.wrap(ret)
+ wrapped = writer.wrap(ret, self.is_return_ownedptr())
writer.return_value(wrapped)
writer.println()
+class CustomStaticMethod(StaticMethod):
+ def __init__(self, methodname, retty, *argtys):
+ super(CustomStaticMethod, self).__init__(retty, *argtys)
+ self.methodname = methodname
+
+ def compile_cpp_body(self, writer, retty, argtys):
+ args = writer.parse_arguments('args', *argtys)
+ ret = writer.call(self.methodname, retty.fullname, *args)
+ writer.return_value(retty.wrap(writer, ret))
+
class Function(Method):
_kind_ = 'func'
@@ -329,10 +414,11 @@ class Function(Method):
def compile_py(self, writer):
with writer.function(self.name, varargs='args') as varargs:
unwrapped = writer.unwrap_many(varargs)
+ self.process_ownedptr_args(writer, unwrapped)
func = self.fullname.split('::', 1)[1].replace('::', '.')
ret = writer.call('_api.%s' % func,
varargs=unwrapped)
- wrapped = writer.wrap(ret)
+ wrapped = writer.wrap(ret, self.is_return_ownedptr())
writer.return_value(wrapped)
writer.println()
@@ -400,10 +486,14 @@ class ptr(_Type):
def __init__(self, element):
assert isinstance(element, Class)
self.element = element
+ self.const = False
@property
def fullname(self):
- return '%s*' % self.element
+ if self.const:
+ return 'const %s*' % self.element
+ else:
+ return '%s*' % self.element
@property
def format(self):
@@ -420,6 +510,13 @@ class ptr(_Type):
return writer.pycapsule_new(val, self.element.capsule_name,
self.element.fullname)
+class ownedptr(ptr):
+ pass
+
+def const(ptr):
+ ptr.const = True
+ return ptr
+
class cast(_Type):
format = 'O'
@@ -458,7 +555,6 @@ class cast(_Type):
return ret
-
class CustomPythonMethod(object):
def __init__(self, fn):
src = inspect.getsource(fn)
diff --git a/newbinding/capsule.py b/newbinding/capsule.py
index eaef7da..f489c7f 100644
--- a/newbinding/capsule.py
+++ b/newbinding/capsule.py
@@ -23,10 +23,11 @@ class WeakRef(ref):
_pyclasses = {}
_addr2obj = WeakValueDictionary()
-_owners = {}
+_owners = {} # address to weak reference
def _sentry(ptr):
- assert _capsule.check(ptr)
+ if not _capsule.check(ptr):
+ raise ValueError('Must provide a PyCapsule object.')
def classof(cap):
cls = _capsule.getClassName(cap)
@@ -38,17 +39,16 @@ def _capsule_destructor(weak):
addr = _capsule.getPointer(cap)
cls = _capsule.getClassName(cap)
logger.debug("destroy pointer 0x%08X to %s", addr, cls)
- weak.dtor(cap)
+# weak.dtor(cap)
del _owners[addr]
def release_ownership(old):
addr = _capsule.getPointer(old)
- if hasattr(old, '_delete_'):
- oldweak = _owners[addr]
- oldweak.owning = False # dis-own
- del _owners[addr]
+ oldweak = _owners[addr]
+ oldweak.owning = False # dis-own
+ del _owners[addr]
-def wrap(cap):
+def wrap(cap, owned=False):
'''Wrap a PyCapsule with the corresponding Wrapper class.
If `cap` is not a PyCapsule, returns `cap`
'''
@@ -66,7 +66,8 @@ def wrap(cap):
obj = cls(cap)
_addr2obj[addr] = obj # cache object by address
# set ownership if *cls* defines *_delete_*
- if hasattr(cls, '_delete_'):
+ if not owned and hasattr(cls, '_delete_'):
+ assert addr not in _owners, "has existing owner"
weak = WeakRef(obj, _capsule_destructor)
_owners[addr] = weak
weak.capsule = cap
@@ -84,10 +85,11 @@ def wrap(cap):
def downcast(old, new):
assert old is not new
+ assert _capsule.getPointer(old) not in _owners
oldcls = classof(old)
newcls = classof(new)
assert issubclass(newcls, oldcls)
- release_ownership(old)
+ # release_ownership(old)
del _addr2obj[_capsule.getPointer(old)] # clear cache
return wrap(new)
diff --git a/newbinding/codegen.py b/newbinding/codegen.py
index 7652447..5a31e38 100644
--- a/newbinding/codegen.py
+++ b/newbinding/codegen.py
@@ -104,10 +104,9 @@ class CodeWriterBase(object):
@contextlib.contextmanager
def py_function(self, name):
- mangled = mangle(name)
self.println('static')
self.println('PyObject*')
- with self.block('%(mangled)s(PyObject* self, PyObject* args)' % locals()):
+ with self.block('%(name)s(PyObject* self, PyObject* args)' % locals()):
self.used_symbols.add('self')
self.used_symbols.add('args')
yield
@@ -175,7 +174,7 @@ class CppCodeWriter(CodeWriterBase):
arglist = ', '.join(args)
stmt = '%(func)s(%(arglist)s)' % locals()
if retty == 'void':
- self.println(stmt)
+ self.println(stmt + ';')
else:
return self.declare(retty, stmt)
@@ -247,6 +246,9 @@ class PyCodeWriter(CodeWriterBase):
yield
self.used_symbols = self.old
+ def release_ownership(self, val):
+ self.println('capsule.release_ownership(%(val)s)' % locals())
+
def unwrap_many(self, args):
unwrapped = self.new_symbol('unwrapped')
self.println('%(unwrapped)s = map(capsule.unwrap, %(args)s)' % locals())
@@ -255,9 +257,9 @@ class PyCodeWriter(CodeWriterBase):
def unwrap(self, val):
return self.call('capsule.unwrap', args=(val,), ret='unwrapped')
- def wrap(self, val):
+ def wrap(self, val, owned):
wrapped = self.new_symbol('wrapped')
- self.println('%(wrapped)s = capsule.wrap(%(val)s)' % locals())
+ self.println('%(wrapped)s = capsule.wrap(%(val)s, %(owned)s)' % locals())
return wrapped
def call(self, func, args=(), varargs=None, ret='ret'):
diff --git a/newbinding/gen.py b/newbinding/gen.py
index d9fc14f..47f5655 100644
--- a/newbinding/gen.py
+++ b/newbinding/gen.py
@@ -39,6 +39,7 @@ populate_submodules(module, submodules);
def populate_headers(println):
includes = [
+ 'cstring',
'llvm_binding/conversion.h',
'llvm_binding/binding.h',
'llvm_binding/capsule_context.h',
@@ -70,6 +71,9 @@ def main():
for cls in ns.classes:
print cls
units.append(cls)
+ for enum in ns.enums:
+ print enum
+ units.append(enum)
# add extra stuffs
downcastlist = []
@@ -84,7 +88,7 @@ def main():
units.append(fn)
- # generate cpp source
+ # Generate C++ source
with open('%s.cpp' % outputfilename, 'w') as cppfile:
println = wrap_println_from_file(cppfile)
@@ -93,6 +97,8 @@ def main():
# required headers
includes = set()
+ for ns in namespaces.values():
+ includes |= ns.includes
for u in units:
includes |= u.includes
@@ -128,7 +134,7 @@ static
for u in units:
if isinstance(u, Function):
name = u.name
- func = codegen.mangle(u.fullname)
+ func = u.c_name
writer.println(fmt % locals())
writer.println('{ NULL },')
writer.println('};')
@@ -154,6 +160,7 @@ static
println(extension_entry % {'module': '_api', 'methtable': 'methtable'})
+ # Generate Python source
with open('%s.py' % outputfilename, 'w') as pyfile:
println = wrap_println_from_file(pyfile)
println('import _api, capsule')
diff --git a/newbinding/include/llvm_binding/capsule_context.h b/newbinding/include/llvm_binding/capsule_context.h
index ed63e43..6ed1381 100644
--- a/newbinding/include/llvm_binding/capsule_context.h
+++ b/newbinding/include/llvm_binding/capsule_context.h
@@ -39,6 +39,16 @@ PyObject* pycapsule_new(void* ptr,
}
+static
+PyObject* pycapsule_new(const void* ptr,
+ const char* basename,
+ const char* classname=NULL)
+{
+ // Use const_cast to strip the constantness.
+ // Let the user take the responsibility.
+ return pycapsule_new(const_cast(ptr), basename, classname);
+}
+
#endif //LLVMPY_CAPSULE_CONTEXT_H_
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h
index 9f2bd70..b5edd2c 100644
--- a/newbinding/include/llvm_binding/extra.h
+++ b/newbinding/include/llvm_binding/extra.h
@@ -3,7 +3,7 @@
#include
#include
#include
-
+#include
namespace extra{
using namespace llvm;
@@ -97,11 +97,34 @@ PyObject* make_small_vector_from_values(PyObject* self, PyObject* args)
}
+static
+PyObject* make_small_vector_from_unsigned(PyObject* self, PyObject* args)
+{
+ using llvm::Value;
+ typedef llvm::SmallVector SmallVector_Unsigned;
+
+ SmallVector_Unsigned* SV = new SmallVector_Unsigned;
+ Py_ssize_t size = PyTuple_Size(args);
+ for (Py_ssize_t i = 0; i < size; ++i) {
+ PyObject* item = PyTuple_GetItem(args, i);
+ if (!item) {
+ return NULL;
+ }
+ unsigned value = PyLong_AsUnsignedLong(item);
+ if (PyErr_Occurred()){
+ return NULL;
+ }
+ SV->push_back(value);
+ }
+ return pycapsule_new(SV, "llvm::SmallVector");
+}
+
static PyMethodDef extra_methodtable[] = {
#define method(func) { #func, (PyCFunction)func, METH_VARARGS, NULL }
method( make_raw_ostream_for_printing ),
method( make_small_vector_from_types ),
method( make_small_vector_from_values ),
+ method( make_small_vector_from_unsigned ),
#undef method
{ NULL }
};
@@ -139,11 +162,20 @@ PyObject* iplist_to_pylist(iplist &IPL, const char * capsuleName,
className);
}
+static
+bool string_equal(const char *A, const char *B){
+ for (; *A and *B; ++A, ++B) {
+ if (*A != *B) return false;
+ }
+ return true;
+}
+
+////////////
static
PyObject* Value_use_iterator_to_list(llvm::Value* val)
{
return iterator_to_pylist(val->use_begin(), val->use_end(),
- "llvm::Value", "llvm::User");
+ "llvm::Value", "llvm::User");
}
static
@@ -158,4 +190,47 @@ PyObject* Function_getBasicBlockList(llvm::Function* fn)
{
return iplist_to_pylist(fn->getBasicBlockList(), "llvm::Value",
"llvm::BasicBlock");
-}
\ No newline at end of file
+}
+
+/*
+ * errout --- can be any file object
+ *
+ */
+static
+llvm::ExecutionEngine* ExecutionEngine_create(
+ llvm::Module* M,
+ bool ForceInterpreter = false,
+ PyObject* errout = 0,
+ llvm::CodeGenOpt::Level OptLevel = llvm::CodeGenOpt::Default,
+ bool GVsWithCode = true)
+{
+ using namespace llvm;
+ std::string ErrorStr;
+ ExecutionEngine *ee = ExecutionEngine::create(M, ForceInterpreter,
+ &ErrorStr, OptLevel,
+ GVsWithCode);
+ PyFile_WriteString(ErrorStr.c_str(), errout);
+ return ee;
+}
+
+/*
+ * errout --- can be any file object
+ *
+ */
+static
+llvm::ExecutionEngine* ExecutionEngine_createJIT(
+ llvm::Module* M,
+ PyObject* errout = 0,
+ llvm::JITMemoryManager* JMM = 0,
+ llvm::CodeGenOpt::Level OL = llvm::CodeGenOpt::Default,
+ bool GCsWithCode = true,
+ llvm::Reloc::Model RM = llvm::Reloc::Default,
+ llvm::CodeModel::Model CMM = llvm::CodeModel::JITDefault)
+{
+ using namespace llvm;
+ std::string ErrorStr;
+ ExecutionEngine *ee = ExecutionEngine::createJIT(M, &ErrorStr, JMM, OL,
+ GCsWithCode, RM, CMM);
+ PyFile_WriteString(ErrorStr.c_str(), errout);
+ return ee;
+}
diff --git a/newbinding/src/CodeGen.py b/newbinding/src/CodeGen.py
new file mode 100644
index 0000000..06821aa
--- /dev/null
+++ b/newbinding/src/CodeGen.py
@@ -0,0 +1,19 @@
+from binding import *
+from namespace import llvm
+
+@llvm.Class()
+class Reloc:
+ Model = Enum('Default', 'Static', 'PIC_', 'DynamicNoPIC')
+
+@llvm.Class()
+class CodeModel:
+ Model = Enum('Default', 'JITDefault', 'Small', 'Kernel', 'Medium', 'Large')
+
+@llvm.Class()
+class TLSModel:
+ Model = Enum('GeneralDynamic', 'LocalDynamic', 'InitialExec', 'LocalExec')
+
+@llvm.Class()
+class CodeGenOpt:
+ 'Actually a namespace'
+ Level = Enum('None', 'Less', 'Default', 'Aggressive')
diff --git a/newbinding/src/DataLayout.py b/newbinding/src/DataLayout.py
new file mode 100644
index 0000000..a1ef8bc
--- /dev/null
+++ b/newbinding/src/DataLayout.py
@@ -0,0 +1,97 @@
+from binding import *
+from namespace import llvm
+from LLVMContext import LLVMContext
+from StringRef import StringRef
+from Module import Module
+from Type import Type, IntegerType, StructType
+from SmallVector import SmallVector_Value
+from GlobalVariable import GlobalVariable
+
+DataLayout = llvm.Class()
+StructLayout = llvm.Class()
+
+@DataLayout
+class DataLayout:
+ _include_ = 'llvm/DataLayout.h'
+
+ _new_string = Constructor(cast(str, StringRef))
+ _new_module = Constructor(ptr(Module))
+
+ @CustomPythonStaticMethod
+ def new(arg):
+ if isinstance(arg, Module):
+ return DataLayout._new_module(arg)
+ else:
+ return DataLayout._new_string(arg)
+
+ delete = Destructor()
+
+ isLittleEndian = Method(cast(Bool, bool))
+ isBigEndian = Method(cast(Bool, bool))
+
+ getStringRepresentation = Method(cast(StringRef, str))
+
+ @CustomPythonMethod
+ def __str__(self):
+ return self.getStringRepresentation()
+
+ isLegalInteger = Method(cast(Bool, bool), cast(int, Unsigned))
+ isIllegalInteger = Method(cast(Bool, bool), cast(int, Unsigned))
+ exceedsNaturalStackAlignment = Method(cast(Bool, bool), cast(int, Unsigned))
+ fitsInLegalInteger = Method(cast(Bool, bool), cast(int, Unsigned))
+
+ getPointerABIAlignment = Method(cast(Unsigned, int),
+ cast(int, Unsigned)).require_only(0)
+ getPointerPrefAlignment = Method(cast(Unsigned, int),
+ cast(int, Unsigned)).require_only(0)
+ getPointerSize = Method(cast(Unsigned, int),
+ cast(int, Unsigned)).require_only(0)
+ getPointerSizeInBits = Method(cast(Unsigned, int),
+ cast(int, Unsigned)).require_only(0)
+
+ getTypeSizeInBits = Method(cast(Uint64, int), ptr(Type))
+ getTypeStoreSize = Method(cast(Uint64, int), ptr(Type))
+ getTypeStoreSizeInBits = Method(cast(Uint64, int), ptr(Type))
+ getTypeAllocSize = Method(cast(Uint64, int), ptr(Type))
+ getTypeAllocSizeInBits = Method(cast(Uint64, int), ptr(Type))
+
+ getABITypeAlignment = Method(cast(Unsigned, int), ptr(Type))
+ getABIIntegerTypeAlignment = Method(cast(Unsigned, int), cast(int, Unsigned))
+ getCallFrameTypeAlignment = Method(cast(Unsigned, int), ptr(Type))
+ getPrefTypeAlignment = Method(cast(Unsigned, int), ptr(Type))
+ getPreferredTypeAlignmentShift = Method(cast(Unsigned, int), ptr(Type))
+
+ _getIntPtrType = Method(ptr(IntegerType),
+ ref(LLVMContext), cast(int, Unsigned))
+ _getIntPtrType.require_only(1)
+ _getIntPtrType.realname = 'getIntPtrType'
+
+ _getIntPtrType2 = Method(ptr(Type), ptr(Type))
+ _getIntPtrType2.realname = 'getIntPtrType'
+
+ @CustomPythonMethod
+ def getIntPtrType(self, *args):
+ if isinstance(args[0], LLVMContext):
+ return self._getIntPtrType(*args)
+ else:
+ return self._getIntPtrType(*args)
+
+ _getIndexedOffset = Method(cast(Uint64, int), ptr(Type),
+ ref(SmallVector_Value))
+ _getIndexedOffset.realname = 'getIndexedOffset'
+
+ @CustomPythonMethod
+ def getIndexedOffset(self, *args):
+ import extra
+ args = list(args)
+ args[1] = extra.make_small_vector_from_values(args[1])
+ return self.getIndexedOffset(*args)
+
+ getStructLayout = Method(const(ptr(StructLayout)), ptr(StructType))
+
+ getPreferredAlignment = Method(cast(Unsigned, int), ptr(GlobalVariable))
+ getPreferredAlignmentLog = Method(cast(Unsigned, int), ptr(GlobalVariable))
+
+@StructLayout
+class StructLayout:
+ pass
diff --git a/newbinding/src/ExecutionEngine.py b/newbinding/src/ExecutionEngine.py
new file mode 100644
index 0000000..0fbe387
--- /dev/null
+++ b/newbinding/src/ExecutionEngine.py
@@ -0,0 +1,34 @@
+from binding import *
+from namespace import llvm
+from Module import Module
+from JITMemoryManager import JITMemoryManager
+from CodeGen import CodeGenOpt, Reloc, CodeModel
+from DataLayout import DataLayout
+
+ExecutionEngine = llvm.Class()
+
+@ExecutionEngine
+class ExecutionEngine:
+ _include_ = ('llvm/ExecutionEngine/ExecutionEngine.h',
+ 'llvm/ExecutionEngine/JIT.h') # force linking of jit
+
+ delete = Destructor()
+
+ create = CustomStaticMethod('ExecutionEngine_create',
+ ptr(ExecutionEngine),
+ ownedptr(Module), cast(bool, Bool),
+ PyObjectPtr, CodeGenOpt.Level,
+ cast(bool, Bool)).require_only(1)
+
+ createJIT = CustomStaticMethod('ExecutionEngine_createJIT',
+ ptr(ExecutionEngine),
+ ownedptr(Module), PyObjectPtr,
+ ptr(JITMemoryManager),
+ CodeGenOpt.Level,
+ cast(bool, Bool),
+ Reloc.Model,
+ CodeModel.Model).require_only(1)
+
+ addModule = Method(Void, ptr(Module))
+ getDataLayout = Method(const(ownedptr(DataLayout)))
+ removeModule = Method(cast(Bool, bool), ptr(Module))
diff --git a/newbinding/src/GlobalVariable.py b/newbinding/src/GlobalVariable.py
new file mode 100644
index 0000000..548a8d1
--- /dev/null
+++ b/newbinding/src/GlobalVariable.py
@@ -0,0 +1,8 @@
+from binding import *
+from namespace import llvm
+from GlobalValue import GlobalValue
+
+@llvm.Class(GlobalValue)
+class GlobalVariable:
+ pass
+
diff --git a/newbinding/src/IRBuilder.py b/newbinding/src/IRBuilder.py
index 41e6681..cea94ce 100644
--- a/newbinding/src/IRBuilder.py
+++ b/newbinding/src/IRBuilder.py
@@ -2,10 +2,16 @@ from binding import *
from namespace import llvm
from LLVMContext import LLVMContext
from BasicBlock import BasicBlock
-from Instruction import ReturnInst, CallInst
-from SmallVector import SmallVector_Value
+from Instruction import ReturnInst, CallInst, BranchInst, SwitchInst
+from Instruction import IndirectBrInst, InvokeInst, ResumeInst, PHINode
+from Instruction import UnreachableInst, AllocaInst, LoadInst, StoreInst
+from Instruction import FenceInst, AtomicCmpXchgInst, AtomicRMWInst, CmpInst
+from Instruction import LandingPadInst, VAArgInst
+from Instruction import AtomicOrdering, SynchronizationScope
+from SmallVector import SmallVector_Value, SmallVector_Unsigned
from StringRef import StringRef
-from Value import Value
+from Value import Value, MDNode
+from Type import Type, IntegerType
IRBuilder = llvm.Class()
@@ -24,15 +30,238 @@ class IRBuilder:
CreateRetVoid = Method(ptr(ReturnInst))
CreateRet = Method(ptr(ReturnInst), ptr(Value))
- _CreateCall = Method(ptr(CallInst), ptr(Value), ref(SmallVector_Value),
+ CreateBr = Method(ptr(BranchInst), ptr(BasicBlock))
+
+
+ CreateCondBr = Method(ptr(BranchInst), ptr(Value), ptr(BasicBlock),
+ ptr(BasicBlock), ptr(MDNode)).require_only(3)
+
+ CreateSwitch = Method(ptr(SwitchInst), ptr(Value), ptr(BasicBlock),
+ cast(int, Unsigned), ptr(MDNode)).require_only(2)
+
+ CreateIndirectBr = Method(ptr(IndirectBrInst), ptr(Value),
+ cast(int, Unsigned)).require_only(1)
+
+ CreateInvoke = Method(ptr(InvokeInst), ptr(Value), ptr(BasicBlock),
+ ptr(BasicBlock), ref(SmallVector_Value),
+ cast(str, StringRef)).require_only(4)
+
+ CreateResume = Method(ptr(ResumeInst), ptr(Value))
+
+ CreateUnreachable = Method(ptr(UnreachableInst))
+
+ def _binop_has_nsw_nuw():
+ sig = [ptr(Value), ptr(Value), ptr(Value), cast(str, StringRef),
+ cast(bool, Bool), cast(bool, Bool)]
+ op = Method(*sig).require_only(2)
+ return op
+
+ CreateAdd = _binop_has_nsw_nuw()
+ CreateSub = _binop_has_nsw_nuw()
+ CreateMul = _binop_has_nsw_nuw()
+ CreateShl = _binop_has_nsw_nuw()
+
+ def _binop_is_exact():
+ sig = [ptr(Value), ptr(Value), ptr(Value), cast(str, StringRef),
+ cast(bool, Bool)]
+ op = Method(*sig).require_only(2)
+ return op
+
+ CreateUDiv = _binop_is_exact()
+ CreateSDiv = _binop_is_exact()
+ CreateLShr = _binop_is_exact()
+ CreateAShr = _binop_is_exact()
+
+ def _binop_basic():
+ sig = [ptr(Value), ptr(Value), ptr(Value), cast(str, StringRef)]
+ op = Method(*sig).require_only(2)
+ return op
+
+ CreateURem = _binop_basic()
+ CreateSRem = _binop_basic()
+ CreateAnd = _binop_basic()
+ CreateOr = _binop_basic()
+ CreateXor = _binop_basic()
+
+ def _float_binop():
+ sig = [ptr(Value), ptr(Value), ptr(Value), cast(str, StringRef),
+ ptr(MDNode)]
+ op = Method(*sig).require_only(2)
+ return op
+
+ CreateFAdd = _float_binop()
+ CreateFSub = _float_binop()
+ CreateFMul = _float_binop()
+ CreateFDiv = _float_binop()
+ CreateFRem = _float_binop()
+
+ def _unop_has_nsw_nuw():
+ sig = [ptr(Value), ptr(Value), cast(str, StringRef),
+ cast(bool, Bool), cast(bool, Bool)]
+ op = Method(*sig).require_only(1)
+ return op
+
+ CreateNeg = _unop_has_nsw_nuw()
+
+ def _float_unop():
+ sig = [ptr(Value), ptr(Value), cast(str, StringRef), ptr(MDNode)]
+ op = Method(*sig).require_only(1)
+ return op
+
+ CreateFNeg = _float_unop()
+
+ CreateNot = Method(ptr(Value),
+ ptr(Value), cast(str, StringRef)).require_only(1)
+
+
+ CreateAlloca = Method(ptr(AllocaInst), ptr(Type), ptr(Value),
+ cast(str, StringRef)).require_only(2)
+
+ CreateLoad = Method(ptr(LoadInst),
+ ptr(Value), cast(str, StringRef)).require_only(1)
+
+ CreateStore = Method(ptr(StoreInst), ptr(Value), ptr(Value),
+ cast(bool, Bool)).require_only(2)
+
+ CreateAlignedLoad = Method(ptr(LoadInst), ptr(Value), cast(int, Unsigned),
+ cast(bool, Bool), cast(str, StringRef))
+ CreateAlignedLoad.require_only(2)
+
+ CreateAlignedStore = Method(ptr(StoreInst), ptr(Value), ptr(Value),
+ cast(int, Unsigned), cast(bool, Bool))
+ CreateAlignedStore.require_only(3)
+
+ CreateFence = Method(ptr(FenceInst),
+ AtomicOrdering, SynchronizationScope).require_only(1)
+
+ CreateAtomicCmpXchg = Method(ptr(AtomicCmpXchgInst), ptr(Value), ptr(Value),
+ ptr(Value), AtomicOrdering, SynchronizationScope)
+ CreateAtomicCmpXchg.require_only(4)
+
+ CreateAtomicRMW = Method(ptr(AtomicRMWInst), AtomicRMWInst.BinOp,
+ ptr(Value), ptr(Value), AtomicOrdering,
+ SynchronizationScope)
+ CreateAtomicRMW.require_only(4)
+
+ _CreateGEP = Method(ptr(Value), ptr(Value), ref(SmallVector_Value),
+ cast(str, StringRef))
+ _CreateGEP.require_only(2)
+ _CreateGEP.realname = 'CreateGEP'
+
+ @CustomPythonMethod
+ def CreateGEP(self, *args):
+ import extra
+ args = list(args)
+ valuelist = args[1]
+ args[1] = extra.make_small_vector_from_values(*valuelist)
+ return self._CreateGEP(*args)
+
+ _CreateInBoundsGEP = Method(ptr(Value), ptr(Value), ref(SmallVector_Value),
cast(str, StringRef))
- _CreateCall |= Method(ptr(CallInst), ptr(Value), ref(SmallVector_Value))
+ _CreateInBoundsGEP.require_only(2)
+ _CreateInBoundsGEP.realname = 'CreateInBoundsGEP'
+
+ @CustomPythonMethod
+ def CreateInBoundsGEP(self, *args):
+ import extra
+ args = list(args)
+ valuelist = args[1]
+ args[1] = extra.make_small_vector_from_values(*valuelist)
+ return self._CreateInBoundsGEP(*args)
+
+ CreateStructGEP = Method(ptr(Value), ptr(Value), cast(int, Unsigned),
+ cast(str, StringRef)).require_only(2)
+
+ CreateGlobalStringPtr = Method(ptr(Value), cast(str, StringRef),
+ cast(str, StringRef)).require_only(1)
+
+ def _value_type():
+ sig = [ptr(Value), ptr(Value), ptr(Type), cast(str, StringRef)]
+ op = Method(*sig).require_only(2)
+ return op
+
+ CreateTrunc = _value_type()
+ CreateZExt = _value_type()
+ CreateSExt = _value_type()
+ CreateZExtOrTrunc = Method(ptr(Value), ptr(Value), ptr(IntegerType),
+ cast(str, StringRef)).require_only(2)
+ CreateSExtOrTrunc = Method(ptr(Value), ptr(Value), ptr(IntegerType),
+ cast(str, StringRef)).require_only(2)
+ CreateFPToUI = _value_type()
+ CreateFPToSI = _value_type()
+ CreateUIToFP = _value_type()
+ CreateSIToFP = _value_type()
+ CreateFPTrunc = _value_type()
+ CreateFPExt = _value_type()
+ CreatePtrToInt = _value_type()
+ CreateIntToPtr = _value_type()
+ CreateBitCast = _value_type()
+ CreateZExtOrBitCast = _value_type()
+ CreateSExtOrBitCast = _value_type()
+ # Skip CreateCast
+ CreateTruncOrBitCast = _value_type()
+ CreateIntCast = Method(ptr(Value), ptr(Value), ptr(Type), cast(bool, Bool),
+ cast(str, StringRef)).require_only(3)
+ CreateFPCast = _value_type()
+
+ _CreateCall = Method(ptr(CallInst), ptr(Value), ref(SmallVector_Value),
+ cast(str, StringRef)).require_only(2)
_CreateCall.realname = 'CreateCall'
+ # Skip specialized CreateICmp* and CreateFCmp*
+
+ CreateICmp = Method(ptr(Value), CmpInst.Predicate, ptr(Value), ptr(Value),
+ cast(str, StringRef)).require_only(3)
+
+ CreateFCmp = Method(ptr(Value), CmpInst.Predicate, ptr(Value), ptr(Value),
+ cast(str, StringRef)).require_only(3)
+
+ CreatePHI = Method(ptr(PHINode), ptr(Type), cast(int, Unsigned),
+ cast(str, StringRef)).require_only(2)
+
@CustomPythonMethod
def CreateCall(self, *args):
import extra
args = list(args)
valuelist = args[1]
args[1] = extra.make_small_vector_from_values(*valuelist)
- return IRBuilder._CreateCall(self, *args)
+ return self._CreateCall(*args)
+
+ CreateSelect = Method(ptr(Value), ptr(Value), ptr(Value), ptr(Value),
+ cast(str, StringRef)).require_only(3)
+
+ CreateVAArg = Method(ptr(VAArgInst), ptr(Value), ptr(Type),
+ cast(str, StringRef)).require_only(2)
+
+ CreateExtractElement = _binop_basic()
+
+ CreateInsertElement = Method(ptr(Value), ptr(Value), ptr(Value), ptr(Value),
+ cast(str, StringRef)).require_only(3)
+
+ CreateShuffleVector = Method(ptr(Value), ptr(Value), ptr(Value),
+ ptr(Value), cast(str, StringRef))
+ CreateShuffleVector.require_only(3)
+
+ CreateExtractValue = Method(ptr(Value), ptr(Value), ref(SmallVector_Unsigned),
+ cast(str, StringRef))
+ CreateExtractValue.require_only(2)
+
+ CreateInsertValue = Method(ptr(Value), ptr(Value), ptr(Value),
+ ref(SmallVector_Unsigned), cast(str, StringRef))
+ CreateInsertValue.require_only(3)
+
+ CreateLandingPad = Method(ptr(LandingPadInst), ptr(Type), ptr(Value),
+ cast(int, Unsigned), cast(str, StringRef))
+ CreateLandingPad.require_only(3)
+
+ CreateIsNull = Method(ptr(Value), ptr(Value), cast(str, StringRef))
+ CreateIsNull.require_only(1)
+
+ CreateIsNotNull = Method(ptr(Value), ptr(Value), cast(str, StringRef))
+ CreateIsNotNull.require_only(1)
+
+ CreatePtrDiff = _binop_basic()
+
+ # New in llvm 3.3
+ #CreateVectorSplat = Method(ptr(Value), cast(int, Unsigned), ptr(Value),
+ # cast(str, StringRef))
diff --git a/newbinding/src/Instruction.py b/newbinding/src/Instruction.py
index 310e19d..dda6b48 100644
--- a/newbinding/src/Instruction.py
+++ b/newbinding/src/Instruction.py
@@ -26,9 +26,9 @@ IntrinsicInst = llvm.Class(CallInst)
FCmpInst = llvm.Class(CmpInst)
ICmpInst = llvm.Class(CmpInst)
-
BranchInst = llvm.Class(TerminatorInst)
IndirectBrInst = llvm.Class(TerminatorInst)
+InvokeInst = llvm.Class(TerminatorInst)
ResumeInst = llvm.Class(TerminatorInst)
ReturnInst = llvm.Class(TerminatorInst)
SwitchInst = llvm.Class(TerminatorInst)
@@ -56,14 +56,14 @@ FPTruncInst = llvm.Class(CastInst)
class Instruction:
pass
-
@AtomicCmpXchgInst
class AtomicCmpXchgInst:
pass
@AtomicRMWInst
class AtomicRMWInst:
- pass
+ BinOp = Enum('Xchg', 'Add', 'Sub', 'And', 'Nand', 'Or', 'Xor', 'Max', 'Min',
+ 'UMax', 'UMin', 'FIRST_BINOP', 'LAST_BINOP', 'BAD_BINOP')
@BinaryOperator
class BinaryOperator:
@@ -75,7 +75,17 @@ class CallInst:
@CmpInst
class CmpInst:
- pass
+ Predicate = Enum('FCMP_FALSE', 'FCMP_OEQ', 'FCMP_OGT', 'FCMP_OGE',
+ 'FCMP_OLT', 'FCMP_OLE', 'FCMP_ONE', 'FCMP_ORD', 'FCMP_UNO',
+ 'FCMP_UEQ', 'FCMP_UGT', 'FCMP_UGE', 'FCMP_ULT', 'FCMP_ULE',
+ 'FCMP_UNE', 'FCMP_TRUE', 'FIRST_FCMP_PREDICATE',
+ 'LAST_FCMP_PREDICATE',
+ 'BAD_FCMP_PREDICATE',
+ 'ICMP_EQ', 'ICMP_NE', 'ICMP_UGT', 'ICMP_UGE', 'ICMP_ULT',
+ 'ICMP_ULE', 'ICMP_SGT', 'ICMP_SGE', 'ICMP_SLT', 'ICMP_SLE',
+ 'FIRST_ICMP_PREDICATE',
+ 'LAST_ICMP_PREDICATE',
+ 'BAD_ICMP_PREDICATE',)
@ExtractElementInst
class ExtractElementInst:
@@ -146,11 +156,14 @@ class ICmpInst:
class BranchInst:
pass
-
@IndirectBrInst
class IndirectBrInst:
pass
+@InvokeInst
+class InvokeInst:
+ pass
+
@ResumeInst
class ResumeInst:
pass
@@ -228,3 +241,12 @@ class FPToUIInst:
@FPTruncInst
class FPTruncInst:
pass
+
+AtomicOrdering = llvm.Enum('AtomicOrdering',
+ 'NotAtomic', 'Unordered', 'Monotonic', 'Acquire',
+ 'Release', 'AcquireRelease',
+ 'SequentiallyConsistent')
+
+SynchronizationScope = llvm.Enum('SynchronizationScope',
+ 'SingleThread', 'CrossThread')
+
diff --git a/newbinding/src/JITMemoryManager.py b/newbinding/src/JITMemoryManager.py
new file mode 100644
index 0000000..f134735
--- /dev/null
+++ b/newbinding/src/JITMemoryManager.py
@@ -0,0 +1,7 @@
+from binding import *
+from namespace import llvm
+
+@llvm.Class()
+class JITMemoryManager:
+ pass
+
diff --git a/newbinding/src/Metadata.py b/newbinding/src/Metadata.py
new file mode 100644
index 0000000..78dbe15
--- /dev/null
+++ b/newbinding/src/Metadata.py
@@ -0,0 +1,7 @@
+from binding import *
+from namespace import llvm
+from Value import MDNode
+
+@MDNode
+class MDNode:
+ pass
diff --git a/newbinding/src/Module.py b/newbinding/src/Module.py
index 730b757..6cd6e2e 100644
--- a/newbinding/src/Module.py
+++ b/newbinding/src/Module.py
@@ -36,7 +36,8 @@ class Module:
appendModuleInlineAsm = Method(Void, cast(str, StringRef))
# Function Accessors
- getOrInsertFunction = Method(ptr(Constant), cast(str, StringRef), ptr(FunctionType))
+ getOrInsertFunction = Method(ptr(Constant), cast(str, StringRef),
+ ptr(FunctionType))
# Utilities
dump = Method(Void)
diff --git a/newbinding/src/SmallVector.py b/newbinding/src/SmallVector.py
index 594faf8..5b48aba 100644
--- a/newbinding/src/SmallVector.py
+++ b/newbinding/src/SmallVector.py
@@ -11,3 +11,7 @@ class SmallVector_Value:
_realname_ = 'SmallVector'
delete = Destructor()
+@llvm.Class()
+class SmallVector_Unsigned:
+ _realname_ = 'SmallVector'
+ delete = Destructor()
diff --git a/newbinding/src/TargetSelect.py b/newbinding/src/TargetSelect.py
new file mode 100644
index 0000000..cb2eb96
--- /dev/null
+++ b/newbinding/src/TargetSelect.py
@@ -0,0 +1,8 @@
+from binding import *
+from namespace import llvm
+
+llvm.includes.add('llvm/Support/TargetSelect.h')
+
+llvm.Function('InitializeNativeTarget')
+#llvm.Function('InitializeAllTargets')
+
diff --git a/newbinding/src/Type.py b/newbinding/src/Type.py
index 45f9444..15b5e31 100644
--- a/newbinding/src/Type.py
+++ b/newbinding/src/Type.py
@@ -6,6 +6,7 @@ from raw_ostream import raw_ostream
Type = llvm.Class()
IntegerType = llvm.Class(Type)
CompositeType = llvm.Class(Type)
+StructType = llvm.Class(CompositeType)
SequentialType = llvm.Class(CompositeType)
PointerType = llvm.Class(SequentialType)
@@ -113,3 +114,6 @@ class SequentialType:
class PointerType:
pass
+@StructType
+class StructType:
+ pass
diff --git a/newbinding/src/Value.py b/newbinding/src/Value.py
index 5b907bd..7460c90 100644
--- a/newbinding/src/Value.py
+++ b/newbinding/src/Value.py
@@ -9,6 +9,7 @@ from StringRef import StringRef
Value = llvm.Class()
# forward declarations
Argument = llvm.Class(Value)
+MDNode = llvm.Class(Value)
User = llvm.Class(Value)
BasicBlock = llvm.Class(Value)
Constant = llvm.Class(User)
diff --git a/newbinding/test2.py b/newbinding/test2.py
index a7a4ddd..9492bb6 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -1,7 +1,11 @@
import api
import extra
import _capsule
+from StringIO import StringIO
api.capsule.set_debug(True)
+
+
+api.InitializeNativeTarget()
context = api.getGlobalContext()
@@ -71,3 +75,13 @@ builder.CreateRet(ret)
print fn
+errio = StringIO()
+ee = api.ExecutionEngine.createJIT(m)
+print ee, errio.getvalue()
+print ee.getDataLayout().getStringRepresentation()
+
+datalayout_str = 'e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64'
+
+assert datalayout_str == str(api.DataLayout.new(datalayout_str))
+assert datalayout_str == str(api.DataLayout.new(str(api.DataLayout.new(datalayout_str))))
+
From 25b498c8fae73fa621179b76398c733b13200871 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Wed, 30 Jan 2013 14:44:17 -0600
Subject: [PATCH 134/414] Improve refct and management of capsules
---
newbinding/capsule.py | 187 +++++++++++++++++++++++++++---------------
newbinding/extra.py | 18 ----
2 files changed, 121 insertions(+), 84 deletions(-)
diff --git a/newbinding/capsule.py b/newbinding/capsule.py
index f489c7f..907fa15 100644
--- a/newbinding/capsule.py
+++ b/newbinding/capsule.py
@@ -1,5 +1,5 @@
-import _capsule
-from weakref import WeakValueDictionary, ref
+from weakref import WeakKeyDictionary, WeakValueDictionary, ref
+from collections import defaultdict
import logging
logger = logging.getLogger(__name__)
@@ -17,81 +17,106 @@ def set_debug(enabled):
else:
logger.setLevel(logging.WARNING)
+def _capsule_weakref_dtor(item):
+ addr = item.pointer
+ _addr2refct[addr] -= 1
+ refct = _addr2refct[addr]
+ assert refct >= 0, "RefCt drop below 0"
+ if refct == 0:
+ dtor = _addr2dtor.pop(addr, None)
+ if dtor is not None:
+ logger.debug('Destroy %s %s', item.name, hex(item.pointer))
+ dtor(item.capsule)
+
+class Capsule(object):
+ "Wraps PyCapsule so that we can build weakref of it."
+
+ from _capsule import check, getClassName, getName, getPointer
+
+ def __init__(self, capsule):
+ assert Capsule.valid(capsule)
+ self.capsule = capsule
+
+ weak = WeakRef(self, _capsule_weakref_dtor)
+ weak.pointer = self.pointer
+ weak.capsule = capsule
+ weak.name = self.name
+ _capsule2weak[self] = weak
+ _addr2refct[self.pointer] += 1
+
+ @property
+ def classname(self):
+ return Capsule.getClassName(self.capsule)
+
+ @property
+ def name(self):
+ return Capsule.getName(self.capsule)
+
+ @property
+ def pointer(self):
+ return Capsule.getPointer(self.capsule)
+
+ @staticmethod
+ def valid(capsule):
+ return Capsule.check(capsule)
+
+ def get_class(self):
+ return _pyclasses[self.classname]
+
+ def instantiate(self):
+ cls = self.get_class()
+ return cls(self)
+
+ def __eq__(self, other):
+ if self.pointer == other.pointer:
+ assert self.name == other.name
+ return True
+ else:
+ return False
+
+ def __ne__(self, other):
+ return not (self == other)
class WeakRef(ref):
- __slots__ = 'capsule', 'dtor', 'owning'
+ pass
+_addr2refct = defaultdict(lambda: 0)
+_capsule2weak = WeakKeyDictionary()
+_addr2dtor = {}
_pyclasses = {}
-_addr2obj = WeakValueDictionary()
-_owners = {} # address to weak reference
-def _sentry(ptr):
- if not _capsule.check(ptr):
- raise ValueError('Must provide a PyCapsule object.')
-
-def classof(cap):
- cls = _capsule.getClassName(cap)
- return _pyclasses[cls]
-
-def _capsule_destructor(weak):
- if weak.owning:
- cap = weak.capsule
- addr = _capsule.getPointer(cap)
- cls = _capsule.getClassName(cap)
- logger.debug("destroy pointer 0x%08X to %s", addr, cls)
-# weak.dtor(cap)
- del _owners[addr]
+# Cache {cls: {addr: obj}}
+# NOTE: The same 'addr' may appear in multiple class bins.
+_cache = defaultdict(WeakValueDictionary)
def release_ownership(old):
- addr = _capsule.getPointer(old)
- oldweak = _owners[addr]
- oldweak.owning = False # dis-own
- del _owners[addr]
+ logger.debug('Release %s', old)
+ _addr2dtor[Capsule.getPointer(old)] = None
+
+def has_ownership(cap):
+ addr = Capsule.getPointer(cap)
+ return _addr2dtor.get(addr) is not None
def wrap(cap, owned=False):
'''Wrap a PyCapsule with the corresponding Wrapper class.
If `cap` is not a PyCapsule, returns `cap`
'''
- if not _capsule.check(cap):
+ if not Capsule.valid(cap):
if isinstance(cap, list):
return map(wrap, cap)
return cap # bypass if cap is not a PyCapsule and not a list
- addr = _capsule.getPointer(cap)
- try:
- # find cached object by pointer address
- obj = _addr2obj[addr]
- except KeyError:
- # create new object and cache it
- cls = classof(cap)
- obj = cls(cap)
- _addr2obj[addr] = obj # cache object by address
- # set ownership if *cls* defines *_delete_*
- if not owned and hasattr(cls, '_delete_'):
- assert addr not in _owners, "has existing owner"
- weak = WeakRef(obj, _capsule_destructor)
- _owners[addr] = weak
- weak.capsule = cap
- weak.owning = True
- weak.dtor = cls._delete_
- else:
- oldcls = classof(obj._ptr)
- newcls = classof(cap)
- if issubclass(oldcls, newcls):
- # do auto downcast
- pass
- else:
- assert oldcls is newcls, (cap, obj, oldcls, newcls)
- return obj
-def downcast(old, new):
- assert old is not new
- assert _capsule.getPointer(old) not in _owners
- oldcls = classof(old)
- newcls = classof(new)
- assert issubclass(newcls, oldcls)
- # release_ownership(old)
- del _addr2obj[_capsule.getPointer(old)] # clear cache
- return wrap(new)
+ cap = Capsule(cap)
+ cls = cap.get_class()
+ addr = cap.pointer
+ try: # lookup cached object
+ return _cache[cls][addr]
+ except KeyError:
+ if not owned and hasattr(cls, '_delete_'):
+ _addr2dtor[addr] = cls._delete_
+ obj = cap.instantiate()
+ _cache[cls][addr] = obj # cache it
+ return obj
def unwrap(obj):
'''Unwrap a Wrapper instance into the underlying PyCapsule.
@@ -112,13 +137,43 @@ def register_class(clsname):
class Wrapper(object):
- __slots__ = '__ptr'
+ __slots__ = '__capsule'
- def __init__(self, ptr):
- _sentry(ptr)
- self.__ptr = ptr
+ def __init__(self, capsule):
+ self.__capsule = capsule
+
+ @property
+ def _capsule(self):
+ return self.__capsule
@property
def _ptr(self):
- return self.__ptr
+ return self._capsule.capsule
+ def __eq__(self, other):
+ return self._capsule == other._capsule
+
+ def __ne__(self, other):
+ return self._capsule != other._capsule
+
+ def _downcast(self, newcls):
+ return downcast(self, newcls)
+
+def downcast(obj, cls):
+ import _api
+ if type(obj) is cls:
+ return obj
+ fromty = obj._llvm_type_
+ toty = cls._llvm_type_
+ logger.debug("Downcast %s to %s" , fromty, toty)
+ fname = 'downcast_%s_to_%s' % (fromty, toty)
+ fname = fname.replace('::', '_')
+ try:
+ caster = getattr(_api, fname)
+ except AttributeError:
+ fmt = "Downcast from %s to %s is not supported"
+ raise TypeError(fmt % (fromty, toty))
+ old = unwrap(obj)
+ new = caster(old)
+ used_to_own = has_ownership(old)
+ return wrap(new, owned=not used_to_own)
diff --git a/newbinding/extra.py b/newbinding/extra.py
index a613296..d65f84c 100644
--- a/newbinding/extra.py
+++ b/newbinding/extra.py
@@ -22,22 +22,4 @@ def _init(glob):
_init(globals())
-#
-# Downcasts
-#
-def downcast(obj, cls):
- if type(obj) is cls:
- return obj
- fromty = obj._llvm_type_
- toty = cls._llvm_type_
- fname = 'downcast_%s_to_%s' % (fromty, toty)
- fname = fname.replace('::', '_')
- try:
- caster = getattr(_api, fname)
- except AttributeError:
- fmt = "Downcast from %s to %s is not supported"
- raise TypeError(fmt % (fromty, toty))
- old = capsule.unwrap(obj)
- new = caster(old)
- return capsule.downcast(old, new)
\ No newline at end of file
From 78f9c9a61087f73e805d32b0a9bbb48ec5026827 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Wed, 30 Jan 2013 18:09:22 -0600
Subject: [PATCH 135/414] Completed binding for most of ExecutionEngine
---
newbinding/binding.py | 8 ++
newbinding/include/llvm_binding/conversion.h | 117 ++++++++++++++++++-
newbinding/include/llvm_binding/extra.h | 106 +++++++++++++++++
newbinding/src/ExecutionEngine.py | 60 ++++++++++
newbinding/src/GenericValue.py | 34 ++++++
newbinding/src/MachineCodeInfo.py | 13 +++
newbinding/src/Module.py | 7 ++
newbinding/src/Type.py | 14 +++
newbinding/test2.py | 41 +++++--
9 files changed, 391 insertions(+), 9 deletions(-)
create mode 100644 newbinding/src/GenericValue.py
create mode 100644 newbinding/src/MachineCodeInfo.py
diff --git a/newbinding/binding.py b/newbinding/binding.py
index f7d5ac4..9ddedf3 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -59,9 +59,17 @@ class BuiltinTypes(_Type):
Void = BuiltinTypes('void')
Unsigned = BuiltinTypes('unsigned')
+UnsignedLongLong = BuiltinTypes('unsigned long long') # used in llvm-3.2
+LongLong = BuiltinTypes('long long')
+Float = BuiltinTypes('float')
+Double = BuiltinTypes('double')
Uint64 = BuiltinTypes('uint64_t')
+Size_t = BuiltinTypes('size_t')
+VoidPtr = BuiltinTypes('void*')
Bool = BuiltinTypes('bool')
+StdString = BuiltinTypes('std::string')
ConstStdString = BuiltinTypes('const std::string')
+ConstCharPtr = BuiltinTypes('const char*')
PyObjectPtr = BuiltinTypes('PyObject*')
PyObjectPtr.format='O'
diff --git a/newbinding/include/llvm_binding/conversion.h b/newbinding/include/llvm_binding/conversion.h
index 0e30c60..a1fc87c 100644
--- a/newbinding/include/llvm_binding/conversion.h
+++ b/newbinding/include/llvm_binding/conversion.h
@@ -25,6 +25,45 @@ int py_str_to(PyObject *strobj, llvm::StringRef &strref){
return 1;
}
+static
+int py_str_to(PyObject *strobj, std::string &strref){
+ // type check
+ if (!PyString_Check(strobj)) {
+ // raises TypeError
+ PyErr_SetString(PyExc_TypeError, "Expecting a str");
+ return 0;
+ }
+ // get len and buffer
+ const char * buf = PyString_AsString(strobj);
+ if (!buf) {
+ // raises TypeError
+ return 0;
+ }
+ // set output
+ strref = std::string(buf);
+ // success
+ return 1;
+}
+
+
+static
+int py_str_to(PyObject *strobj, const char* &strref){
+ // type check
+ if (!PyString_Check(strobj)) {
+ // raises TypeError
+ PyErr_SetString(PyExc_TypeError, "Expecting a str");
+ return 0;
+ }
+ // get buffer
+ strref = PyString_AsString(strobj);
+ if (!strref) {
+ // raises TypeError
+ return 0;
+ }
+ // success
+ return 1;
+}
+
static
int py_int_to(PyObject *intobj, unsigned & val){
if (!PyInt_Check(intobj)) {
@@ -37,6 +76,70 @@ int py_int_to(PyObject *intobj, unsigned & val){
return 1;
}
+static
+int py_int_to(PyObject *intobj, unsigned long long & val){
+ if (!PyInt_Check(intobj)) {
+ // raise TypeError
+ puts(PyString_AsString(PyObject_Str(PyObject_Type(intobj))));
+ PyErr_SetString(PyExc_TypeError, "Expecting an int 2");
+ return 0;
+ }
+ val = PyInt_AsUnsignedLongLongMask(intobj);
+ // success
+ return 1;
+
+}
+
+static
+int py_int_to(PyObject *intobj, size_t & val){
+ unsigned long long ull;
+ if (py_int_to(intobj, ull)) {
+ val = (size_t)ull;
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+
+static
+int py_int_to(PyObject *intobj, void* & val){
+ if (!PyLong_Check(intobj)) {
+ // raise TypeError
+ PyErr_SetString(PyExc_TypeError, "Expecting an int");
+ return 0;
+ }
+ val = PyLong_FromVoidPtr(intobj);
+ // success
+ return 1;
+}
+
+static
+int py_float_to(PyObject *floatobj, double & val){
+ if (!PyFloat_Check(floatobj)) {
+ // raise TypeError
+ PyErr_SetString(PyExc_TypeError, "Expecting a float");
+ return 0;
+ }
+ val = PyFloat_AsDouble(floatobj);
+ if (PyErr_Occurred()){
+ return 0;
+ }
+ // success
+ return 1;
+}
+
+
+static
+int py_float_to(PyObject *floatobj, float & val){
+ double db;
+ int status = py_float_to(floatobj, db);
+ if (status)
+ val = db;
+ return status;
+}
+
+
static
int py_bool_to(PyObject *boolobj, bool & val){
if (!PyBool_Check(boolobj)) {
@@ -78,8 +181,18 @@ PyObject* py_bool_from(bool val){
}
static
-PyObject* py_int_from(int val){
- return PyInt_FromLong(val);
+PyObject* py_int_from(const long long & val){
+ return PyLong_FromLongLong(val);
+}
+
+static
+PyObject* py_int_from(void * addr){
+ return PyLong_FromVoidPtr(addr);
+}
+
+static
+PyObject* py_float_from(const double& val) {
+ return PyFloat_FromDouble(val);
}
// casting
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h
index b5edd2c..7aacfde 100644
--- a/newbinding/include/llvm_binding/extra.h
+++ b/newbinding/include/llvm_binding/extra.h
@@ -4,6 +4,7 @@
#include
#include
#include
+#include
namespace extra{
using namespace llvm;
@@ -234,3 +235,108 @@ llvm::ExecutionEngine* ExecutionEngine_createJIT(
PyFile_WriteString(ErrorStr.c_str(), errout);
return ee;
}
+
+static
+llvm::GenericValue* GenericValue_CreateInt(llvm::Type* Ty, unsigned long long N,
+ bool IsSigned)
+{
+ // Shamelessly copied from LLVM
+ llvm::GenericValue *GenVal = new llvm::GenericValue();
+ GenVal->IntVal = llvm::APInt(Ty->getIntegerBitWidth(), N, IsSigned);
+ return GenVal;
+}
+
+static
+llvm::GenericValue* GenericValue_CreateFloat(float Val)
+{
+ llvm::GenericValue *GenVal = new llvm::GenericValue();
+ GenVal->FloatVal = Val;
+ return GenVal;
+}
+
+static
+llvm::GenericValue* GenericValue_CreateDouble(double Val)
+{
+ llvm::GenericValue *GenVal = new llvm::GenericValue();
+ GenVal->DoubleVal = Val;
+ return GenVal;
+}
+
+static
+llvm::GenericValue* GenericValue_CreatePointer(void * Ptr)
+{
+ llvm::GenericValue *GenVal = new llvm::GenericValue();
+ GenVal->PointerVal = Ptr;
+ return GenVal;
+}
+
+static
+unsigned GenericValue_ValueIntWidth(llvm::GenericValue *GenValRef)
+{
+ return GenValRef->IntVal.getBitWidth();
+}
+
+static
+unsigned long long GenericValue_ToUnsignedInt(llvm::GenericValue* GenVal)
+{
+ return GenVal->IntVal.getZExtValue();
+}
+
+
+static
+long long GenericValue_ToSignedInt(llvm::GenericValue* GenVal)
+{
+ return GenVal->IntVal.getSExtValue();
+}
+
+static
+void* GenericValue_ToPointer(llvm::GenericValue* GenVal)
+{
+ return GenVal->PointerVal;
+}
+
+static
+double GenericValue_ToFloat(llvm::GenericValue* GenVal, llvm::Type* Ty)
+{
+ switch (Ty->getTypeID()) {
+ case llvm::Type::FloatTyID:
+ return GenVal->FloatVal;
+ default:
+ // Behavior undefined if type is not a float or a double
+ return GenVal->DoubleVal;
+ }
+}
+
+static
+PyObject* ExecutionEngine_RunFunction(llvm::ExecutionEngine* EE,
+ llvm::Function* Fn, PyObject* Args)
+{
+ using namespace llvm;
+ const char * GVN = "llvm::GenericValue";
+ if (!PyTuple_Check(Args)) {
+ PyErr_SetString(PyExc_TypeError, "Expect a tuple of args.");
+ return NULL;
+ }
+ std::vector vec_args;
+ Py_ssize_t nargs = PyTuple_Size(Args);
+ vec_args.reserve(nargs);
+ for (Py_ssize_t i = 0; i < nargs; ++i) {
+ PyObject* obj = PyTuple_GetItem(Args, i);
+ if (!obj) {
+ PyErr_SetString(PyExc_RuntimeError, "Failed to index into args?");
+ return NULL;
+ }
+
+ GenericValue* gv = static_cast(
+ PyCapsule_GetPointer(obj, GVN));
+
+ if (!gv) {
+ return NULL;
+ }
+ vec_args.push_back(*gv);
+ }
+
+ GenericValue ret = EE->runFunction(Fn, vec_args);
+ return pycapsule_new(new GenericValue(ret), GVN);
+}
+
diff --git a/newbinding/src/ExecutionEngine.py b/newbinding/src/ExecutionEngine.py
index 0fbe387..5a95a16 100644
--- a/newbinding/src/ExecutionEngine.py
+++ b/newbinding/src/ExecutionEngine.py
@@ -4,6 +4,11 @@ from Module import Module
from JITMemoryManager import JITMemoryManager
from CodeGen import CodeGenOpt, Reloc, CodeModel
from DataLayout import DataLayout
+from Value import Function, GlobalValue, BasicBlock, Constant
+from GlobalVariable import GlobalVariable
+from MachineCodeInfo import MachineCodeInfo
+from GenericValue import GenericValue
+from Type import Type
ExecutionEngine = llvm.Class()
@@ -32,3 +37,58 @@ class ExecutionEngine:
addModule = Method(Void, ptr(Module))
getDataLayout = Method(const(ownedptr(DataLayout)))
removeModule = Method(cast(Bool, bool), ptr(Module))
+
+ FindFunctionNamed = Method(ptr(Function), cast(str, ConstCharPtr))
+ getPointerToNamedFunction = Method(cast(VoidPtr, int),
+ cast(str, StdString),
+ cast(bool, Bool)).require_only(1)
+
+ runStaticConstructorsDestructors = Method(Void, cast(Bool, bool))
+ runStaticConstructorsDestructors |= Method(Void, ptr(Module),
+ cast(Bool, bool))
+
+ addGlobalMapping = Method(Void, ptr(GlobalValue), cast(int, VoidPtr))
+ clearAllGlobalMappings = Method()
+ clearGlobalMappingsFromModule = Method(Void, ptr(Module))
+ updateGlobalMapping = Method(cast(VoidPtr, int),
+ ptr(GlobalValue), cast(int, VoidPtr))
+
+ getPointerToGlobalIfAvailable = Method(cast(VoidPtr, int), ptr(GlobalValue))
+ getPointerToGlobal = Method(cast(VoidPtr, int), ptr(GlobalValue))
+ getPointerToFunction = Method(cast(VoidPtr, int), ptr(Function))
+ getPointerToBasicBlock = Method(cast(VoidPtr, int), ptr(BasicBlock))
+ getPointerToFunctionOrStub = Method(cast(VoidPtr, int), ptr(Function))
+
+ runJITOnFunction = Method(Void, ptr(Function), ptr(MachineCodeInfo))
+ runJITOnFunction.require_only(1)
+
+ getGlobalValueAtAddress = Method(const(ptr(GlobalValue)), cast(int, VoidPtr))
+
+ StoreValueToMemory = Method(Void, ref(GenericValue), ptr(GenericValue),
+ ptr(Type))
+
+ InitializeMemory = Method(Void, ptr(Constant), cast(int, VoidPtr))
+
+ recompileAndRelinkFunction = Method(cast(int, VoidPtr), ptr(Function))
+
+ freeMachineCodeForFunction = Method(Void, ptr(Function))
+ getOrEmitGlobalVariable = Method(cast(int, VoidPtr), ptr(GlobalVariable))
+
+ DisableLazyCompilation = Method(Void, cast(bool, Bool))
+ isCompilingLazily = Method(cast(Bool, bool))
+ isLazyCompilationDisabled = Method(cast(Bool, bool))
+ DisableGVCompilation = Method(Void, cast(bool, Bool))
+ isSymbolSearchingDisabled = Method(cast(Bool, bool))
+ RegisterTable = Method(Void, ptr(Function), cast(int, VoidPtr))
+ DeregisterTable = Method(Void, ptr(Function))
+ DeregisterAllTables = Method()
+
+ _runFunction = CustomMethod('ExecutionEngine_RunFunction',
+ PyObjectPtr, ptr(Function), PyObjectPtr)
+
+ @CustomPythonMethod
+ def runFunction(self, fn, args):
+ import capsule
+ unwrapped = map(capsule.unwrap, args)
+ return self._runFunction(fn, tuple(unwrapped))
+
diff --git a/newbinding/src/GenericValue.py b/newbinding/src/GenericValue.py
new file mode 100644
index 0000000..74587ba
--- /dev/null
+++ b/newbinding/src/GenericValue.py
@@ -0,0 +1,34 @@
+from binding import *
+from namespace import llvm
+from Type import Type
+
+GenericValue = llvm.Class()
+
+@GenericValue
+class GenericValue:
+ delete = Destructor()
+
+ def _factory(name, *argtys):
+ return CustomStaticMethod('GenericValue_' + name,
+ ptr(GenericValue), *argtys)
+
+ CreateFloat = _factory('CreateFloat', cast(float, Float))
+
+ CreateDouble = _factory('CreateDouble', cast(float, Float))
+
+ CreateInt = _factory('CreateInt', ptr(Type),
+ cast(int, UnsignedLongLong), cast(bool, Bool))
+
+ CreatePointer = _factory('CreatePointer', cast(int, VoidPtr))
+
+ def _accessor(name, *argtys):
+ return CustomMethod('GenericValue_' + name, *argtys)
+
+ valueIntWidth = _accessor('ValueIntWidth', cast(Unsigned, int))
+
+ toSignedInt = _accessor('ToSignedInt', cast(UnsignedLongLong, int))
+ toUnsignedInt = _accessor('ToUnsignedInt', cast(LongLong, int))
+
+ toFloat = _accessor('ToFloat', cast(Double, float), ptr(Type))
+
+ toPointer = _accessor('ToPointer', cast(VoidPtr, int))
\ No newline at end of file
diff --git a/newbinding/src/MachineCodeInfo.py b/newbinding/src/MachineCodeInfo.py
new file mode 100644
index 0000000..5d91e3a
--- /dev/null
+++ b/newbinding/src/MachineCodeInfo.py
@@ -0,0 +1,13 @@
+from binding import *
+from namespace import llvm
+
+MachineCodeInfo = llvm.Class()
+
+@MachineCodeInfo
+class MachineCodeInfo:
+ _include_ = 'llvm/CodeGen/MachineCodeInfo.h'
+ setSize = Method(Void, cast(int, Size_t))
+ setAddress = Method(Void, cast(int, VoidPtr))
+ size = Method(cast(Size_t, int))
+ address = Method(cast(VoidPtr, int))
+
diff --git a/newbinding/src/Module.py b/newbinding/src/Module.py
index 6cd6e2e..9b392ca 100644
--- a/newbinding/src/Module.py
+++ b/newbinding/src/Module.py
@@ -44,4 +44,11 @@ class Module:
print_ = Method(Void, ref(raw_ostream), ptr(AssemblyAnnotationWriter))
print_.realname = 'print'
+ @CustomPythonMethod
+ def __str__(self):
+ import extra
+ os = extra.make_raw_ostream_for_printing()
+ self.print_(os, None)
+ return os.str()
+
dropAllReferences = Method()
diff --git a/newbinding/src/Type.py b/newbinding/src/Type.py
index 15b5e31..bf51b9d 100644
--- a/newbinding/src/Type.py
+++ b/newbinding/src/Type.py
@@ -2,6 +2,7 @@ from binding import *
from namespace import llvm
from LLVMContext import LLVMContext
from raw_ostream import raw_ostream
+from StringRef import StringRef
Type = llvm.Class()
IntegerType = llvm.Class(Type)
@@ -52,6 +53,19 @@ class Type:
isIntegerTy = Method(cast(Bool, bool))
isIntegerTy |= Method(cast(Bool, bool), cast(int, Unsigned))
+ getIntegerBitWidth = Method(cast(Unsigned, int))
+ getFunctionParamType = Method(ptr(Type), cast(int, Unsigned))
+ getFunctionNumParams = Method(cast(int, Unsigned))
+
+ isFunctionVarArg = type_checker()
+
+ getStructName = Method(cast(StringRef, str))
+ getStructNumElements = Method(cast(Unsigned, int))
+ getStructElementType = Method(ptr(Type), cast(int, Unsigned))
+ getSequentialElementType = Method(ptr(Type))
+
+ # Factories
+
def type_factory():
return StaticMethod(ptr(Type), ref(LLVMContext))
diff --git a/newbinding/test2.py b/newbinding/test2.py
index 9492bb6..7902df4 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -28,25 +28,25 @@ print os.str()
int1ty = api.Type.getInt1Ty(context)
int1ty.dump()
-print int1ty.isIntegerTy(1)
+assert int1ty.isIntegerTy(1)
fnty = api.FunctionType.get(int1ty, False)
fnty.dump()
-types = [int1ty, api.Type.getIntNTy(context, 21)]
-fnty = api.FunctionType.get(int1ty, types, False)
+types = [api.Type.getIntNTy(context, 8), api.Type.getIntNTy(context, 32)]
+fnty = api.FunctionType.get(api.Type.getIntNTy(context, 8), types, False)
print fnty
const = m.getOrInsertFunction("foo", fnty)
-fn = extra.downcast(const, api.Function)
+fn = const._downcast(api.Function)
print fn
assert fn.hasName()
assert 'foo' == fn.getName()
fn.setName('bar')
assert 'bar' == fn.getName()
-assert fn.getReturnType() is int1ty
+assert fn.getReturnType().isIntegerTy(8)
assert fnty is fn.getFunctionType()
@@ -70,13 +70,19 @@ assert bb.getTerminator() is None
arg0, arg1 = fn.getArgumentList()
print arg0, arg1
-ret = builder.CreateCall(fn, [arg0, arg1], '')
+extended = builder.CreateZExt(arg0, arg1.getType())
+result = builder.CreateAdd(extended, arg1)
+ret = builder.CreateTrunc(result, fn.getReturnType())
builder.CreateRet(ret)
+print arg0.list_use()
+
print fn
errio = StringIO()
-ee = api.ExecutionEngine.createJIT(m)
+print m
+
+ee = api.ExecutionEngine.createJIT(m, errio)
print ee, errio.getvalue()
print ee.getDataLayout().getStringRepresentation()
@@ -85,3 +91,24 @@ datalayout_str = 'e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-
assert datalayout_str == str(api.DataLayout.new(datalayout_str))
assert datalayout_str == str(api.DataLayout.new(str(api.DataLayout.new(datalayout_str))))
+fn2 = ee.FindFunctionNamed(fn.getName())
+assert fn2 is fn
+
+assert ee.getPointerToFunction(fn)
+assert ee.getPointerToNamedFunction('printf')
+
+gv0 = api.GenericValue.CreateInt(arg0.getType(), 12, False)
+gv1 = api.GenericValue.CreateInt(arg1.getType(), -32, True)
+
+assert gv0.valueIntWidth() == arg0.getType().getIntegerBitWidth()
+assert gv1.valueIntWidth() == arg1.getType().getIntegerBitWidth()
+
+assert gv0.toUnsignedInt() == 12
+assert gv1.toSignedInt() == -32
+
+gv1 = api.GenericValue.CreateInt(arg1.getType(), 32, False)
+
+gvR = ee.runFunction(fn, (gv0, gv1))
+
+assert 44 == gvR.toUnsignedInt()
+
From ca0a2b9fddd9e8224b5a919de6fbccc80492a04c Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Fri, 1 Feb 2013 11:45:19 -0600
Subject: [PATCH 136/414] binding for EngineBuilder
---
newbinding/binding.py | 3 +-
newbinding/capsule.py | 7 +-
newbinding/include/llvm_binding/extra.h | 41 ++++++
newbinding/src/EngineBuilder.py | 49 +++++++
newbinding/src/TargetMachine.py | 11 ++
newbinding/test2.py | 170 ++++++++++++++----------
6 files changed, 206 insertions(+), 75 deletions(-)
create mode 100644 newbinding/src/EngineBuilder.py
create mode 100644 newbinding/src/TargetMachine.py
diff --git a/newbinding/binding.py b/newbinding/binding.py
index 9ddedf3..1f980d1 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -358,7 +358,8 @@ class Method(object):
argtys = self.signatures[0][1:]
for i, ty in enumerate(argtys):
if isinstance(ty, ownedptr):
- writer.release_ownership('%s[%d]' % (unwrapped, i))
+ with writer.block('if len(%s) > %d:' % (unwrapped, i)):
+ writer.release_ownership('%s[%d]' % (unwrapped, i))
class CustomMethod(Method):
def __init__(self, methodname, retty, *argtys):
diff --git a/newbinding/capsule.py b/newbinding/capsule.py
index 907fa15..8c2f10e 100644
--- a/newbinding/capsule.py
+++ b/newbinding/capsule.py
@@ -91,7 +91,12 @@ _cache = defaultdict(WeakValueDictionary)
def release_ownership(old):
logger.debug('Release %s', old)
- _addr2dtor[Capsule.getPointer(old)] = None
+ addr = Capsule.getPointer(old)
+ if _addr2dtor[addr] is None:
+ # Guard deduplicated release
+ raise Exception("Already released")
+ _addr2dtor[addr] = None
+
def has_ownership(cap):
addr = Capsule.getPointer(cap)
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h
index 7aacfde..10a4361 100644
--- a/newbinding/include/llvm_binding/extra.h
+++ b/newbinding/include/llvm_binding/extra.h
@@ -340,3 +340,44 @@ PyObject* ExecutionEngine_RunFunction(llvm::ExecutionEngine* EE,
return pycapsule_new(new GenericValue(ret), GVN);
}
+static
+PyObject* EngineBuilder_setErrorStr(llvm::EngineBuilder* eb, PyObject* fileobj)
+{
+
+ if (!PyFile_Check(fileobj)) {
+ PyErr_SetString(PyExc_TypeError, "Expecting a file object.");
+ return NULL;
+ }
+
+ std::string buffer;
+ eb->setErrorStr(&buffer);
+
+ if (-1 == PyFile_WriteString(buffer.c_str(), fileobj)) {
+ return NULL;
+ }
+
+ return pycapsule_new(eb, "llvm::EngineBuilder");
+}
+
+static
+PyObject* EngineBuilder_setMAttrs(llvm::EngineBuilder* eb,
+ PyObject* strlist)
+{
+ if (!PyList_Check(strlist)) {
+ PyErr_SetString(PyExc_TypeError, "Expecting a list of string.");
+ return NULL;
+ }
+ std::vector tmp;
+ const int N = PyList_Size(strlist);
+ tmp.reserve(N);
+ for (int i = 0; i < N; ++i) {
+ const char * elem = PyString_AsString(PyList_GetItem(strlist, i));
+ if (!elem) {
+ return NULL;
+ }
+ tmp.push_back(elem);
+ }
+ eb->setMAttrs(tmp);
+ return pycapsule_new(eb, "llvm::EngineBuilder");
+}
+
diff --git a/newbinding/src/EngineBuilder.py b/newbinding/src/EngineBuilder.py
new file mode 100644
index 0000000..0e8388e
--- /dev/null
+++ b/newbinding/src/EngineBuilder.py
@@ -0,0 +1,49 @@
+from binding import *
+from namespace import llvm
+from Module import Module
+from JITMemoryManager import JITMemoryManager
+from CodeGen import CodeGenOpt, Reloc, CodeModel
+from StringRef import StringRef
+from ExecutionEngine import ExecutionEngine
+from TargetMachine import TargetMachine
+
+EngineBuilder = llvm.Class()
+
+@llvm.Class() # a fake class (actually a namespace)
+class EngineKind:
+ Kind = Enum('JIT', 'Interpreter')
+
+@EngineBuilder
+class EngineBuilder:
+ new = Constructor(ownedptr(Module))
+ delete = Destructor()
+
+ def _setter(*args):
+ return Method(ref(EngineBuilder), *args)
+
+ setEngineKind = _setter(EngineKind.Kind)
+ setJITMemoryManager = _setter(ptr(JITMemoryManager))
+
+ setErrorStr = CustomMethod('EngineBuilder_setErrorStr',
+ PyObjectPtr, PyObjectPtr)
+
+ setOptLevel = _setter(CodeGenOpt.Level)
+ #setTargetOptions =
+ setRelocationModel = _setter(Reloc.Model)
+ setCodeModel = _setter(CodeModel.Model)
+ setAllocateGVsWithCode = _setter(cast(bool, Bool))
+ setMArch = _setter(cast(str, StringRef))
+ setMCPU = _setter(cast(str, StringRef))
+ setUseMCJIT = _setter(cast(bool, Bool))
+ _setMAttrs = CustomMethod('EngineBuilder_setMAttrs',
+ PyObjectPtr, PyObjectPtr)
+ @CustomPythonMethod
+ def setMAttrs(self, attrs):
+ attrlist = list(str(a) for a in attrs)
+ return self._setMAttrs(attrlist)
+
+ create = Method(ptr(ExecutionEngine),
+ ownedptr(TargetMachine)).require_only(0)
+
+ selectTarget = Method(ptr(TargetMachine))
+
diff --git a/newbinding/src/TargetMachine.py b/newbinding/src/TargetMachine.py
new file mode 100644
index 0000000..e53cd33
--- /dev/null
+++ b/newbinding/src/TargetMachine.py
@@ -0,0 +1,11 @@
+from binding import *
+from namespace import llvm
+
+TargetMachine = llvm.Class()
+
+@TargetMachine
+class TargetMachine:
+ _include_ = 'llvm/Target/TargetMachine.h'
+ delete = Destructor()
+
+
diff --git a/newbinding/test2.py b/newbinding/test2.py
index 7902df4..a304426 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -4,111 +4,135 @@ import _capsule
from StringIO import StringIO
api.capsule.set_debug(True)
-
-api.InitializeNativeTarget()
-context = api.getGlobalContext()
+def test_basic_jit_use():
+ api.InitializeNativeTarget()
+ context = api.getGlobalContext()
-m = api.Module.new("modname", context)
-print m.getModuleIdentifier()
-m.setModuleIdentifier('modname2')
-print m.getModuleIdentifier()
-print 'endianness', m.getEndianness()
-assert m.getEndianness() == api.Module.Endianness.AnyEndianness
-print 'pointer-size', m.getPointerSize()
-assert m.getPointerSize() == api.Module.PointerSize.AnyPointerSize
-m.dump()
+ m = api.Module.new("modname", context)
+ print m.getModuleIdentifier()
+ m.setModuleIdentifier('modname2')
+ print m.getModuleIdentifier()
+ print 'endianness', m.getEndianness()
+ assert m.getEndianness() == api.Module.Endianness.AnyEndianness
+ print 'pointer-size', m.getPointerSize()
+ assert m.getPointerSize() == api.Module.PointerSize.AnyPointerSize
+ m.dump()
-os = extra.make_raw_ostream_for_printing()
-m.print_(os, None)
-print os.str()
+ os = extra.make_raw_ostream_for_printing()
+ m.print_(os, None)
+ print os.str()
-int1ty = api.Type.getInt1Ty(context)
-int1ty.dump()
+ int1ty = api.Type.getInt1Ty(context)
+ int1ty.dump()
-assert int1ty.isIntegerTy(1)
+ assert int1ty.isIntegerTy(1)
-fnty = api.FunctionType.get(int1ty, False)
-fnty.dump()
+ fnty = api.FunctionType.get(int1ty, False)
+ fnty.dump()
-types = [api.Type.getIntNTy(context, 8), api.Type.getIntNTy(context, 32)]
-fnty = api.FunctionType.get(api.Type.getIntNTy(context, 8), types, False)
+ types = [api.Type.getIntNTy(context, 8), api.Type.getIntNTy(context, 32)]
+ fnty = api.FunctionType.get(api.Type.getIntNTy(context, 8), types, False)
-print fnty
+ print fnty
-const = m.getOrInsertFunction("foo", fnty)
-fn = const._downcast(api.Function)
-print fn
-assert fn.hasName()
-assert 'foo' == fn.getName()
-fn.setName('bar')
-assert 'bar' == fn.getName()
+ const = m.getOrInsertFunction("foo", fnty)
+ fn = const._downcast(api.Function)
+ print fn
+ assert fn.hasName()
+ assert 'foo' == fn.getName()
+ fn.setName('bar')
+ assert 'bar' == fn.getName()
-assert fn.getReturnType().isIntegerTy(8)
+ assert fn.getReturnType().isIntegerTy(8)
-assert fnty is fn.getFunctionType()
+ assert fnty is fn.getFunctionType()
-assert fn.isVarArg() == False
-assert fn.getIntrinsicID() == 0
-assert not fn.isIntrinsic()
+ assert fn.isVarArg() == False
+ assert fn.getIntrinsicID() == 0
+ assert not fn.isIntrinsic()
-fn_uselist = fn.list_use()
-assert isinstance(fn_uselist, list)
-assert len(fn_uselist) == 0
+ fn_uselist = fn.list_use()
+ assert isinstance(fn_uselist, list)
+ assert len(fn_uselist) == 0
-builder = api.IRBuilder.new(context)
-print builder
+ builder = api.IRBuilder.new(context)
+ print builder
-bb = api.BasicBlock.Create(context, "entry", fn, None)
-assert bb.empty()
-builder.SetInsertPoint(bb)
+ bb = api.BasicBlock.Create(context, "entry", fn, None)
+ assert bb.empty()
+ builder.SetInsertPoint(bb)
-assert bb.getTerminator() is None
+ assert bb.getTerminator() is None
-arg0, arg1 = fn.getArgumentList()
-print arg0, arg1
+ arg0, arg1 = fn.getArgumentList()
+ print arg0, arg1
-extended = builder.CreateZExt(arg0, arg1.getType())
-result = builder.CreateAdd(extended, arg1)
-ret = builder.CreateTrunc(result, fn.getReturnType())
-builder.CreateRet(ret)
+ extended = builder.CreateZExt(arg0, arg1.getType())
+ result = builder.CreateAdd(extended, arg1)
+ ret = builder.CreateTrunc(result, fn.getReturnType())
+ builder.CreateRet(ret)
-print arg0.list_use()
+ print arg0.list_use()
-print fn
+ print fn
-errio = StringIO()
-print m
+ errio = StringIO()
+ print m
-ee = api.ExecutionEngine.createJIT(m, errio)
-print ee, errio.getvalue()
-print ee.getDataLayout().getStringRepresentation()
+ ee = api.ExecutionEngine.createJIT(m, errio)
+ print ee, errio.getvalue()
+ print ee.getDataLayout().getStringRepresentation()
-datalayout_str = 'e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64'
+ datalayout_str = 'e-p:64:64:64-S128-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f16:16:16-f32:32:32-f64:64:64-f128:128:128-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64'
-assert datalayout_str == str(api.DataLayout.new(datalayout_str))
-assert datalayout_str == str(api.DataLayout.new(str(api.DataLayout.new(datalayout_str))))
+ assert datalayout_str == str(api.DataLayout.new(datalayout_str))
+ assert datalayout_str == str(api.DataLayout.new(str(api.DataLayout.new(datalayout_str))))
-fn2 = ee.FindFunctionNamed(fn.getName())
-assert fn2 is fn
+ fn2 = ee.FindFunctionNamed(fn.getName())
+ assert fn2 is fn
-assert ee.getPointerToFunction(fn)
-assert ee.getPointerToNamedFunction('printf')
+ assert ee.getPointerToFunction(fn)
+ assert ee.getPointerToNamedFunction('printf')
-gv0 = api.GenericValue.CreateInt(arg0.getType(), 12, False)
-gv1 = api.GenericValue.CreateInt(arg1.getType(), -32, True)
+ gv0 = api.GenericValue.CreateInt(arg0.getType(), 12, False)
+ gv1 = api.GenericValue.CreateInt(arg1.getType(), -32, True)
-assert gv0.valueIntWidth() == arg0.getType().getIntegerBitWidth()
-assert gv1.valueIntWidth() == arg1.getType().getIntegerBitWidth()
+ assert gv0.valueIntWidth() == arg0.getType().getIntegerBitWidth()
+ assert gv1.valueIntWidth() == arg1.getType().getIntegerBitWidth()
-assert gv0.toUnsignedInt() == 12
-assert gv1.toSignedInt() == -32
+ assert gv0.toUnsignedInt() == 12
+ assert gv1.toSignedInt() == -32
-gv1 = api.GenericValue.CreateInt(arg1.getType(), 32, False)
+ gv1 = api.GenericValue.CreateInt(arg1.getType(), 32, False)
-gvR = ee.runFunction(fn, (gv0, gv1))
+ gvR = ee.runFunction(fn, (gv0, gv1))
-assert 44 == gvR.toUnsignedInt()
+ assert 44 == gvR.toUnsignedInt()
+
+def test_engine_builder():
+ api.InitializeNativeTarget()
+ context = api.getGlobalContext()
+
+ m = api.Module.new("modname", context)
+
+ eb = api.EngineBuilder.new(m)
+ eb2 = eb.setEngineKind(api.EngineKind.Kind.JIT)
+ assert eb is eb2
+ eb.setOptLevel(api.CodeGenOpt.Level.Aggressive).setUseMCJIT(False)
+
+ tm = eb.selectTarget()
+ ee = eb.create(tm)
+
+
+def main():
+ for name, value in globals().items():
+ if name.startswith('test_') and callable(value):
+ print name.center(80, '-')
+ value()
+
+if __name__ == '__main__':
+ main()
From 9485d03e18a226303b36bae577da37f994f61776 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Fri, 1 Feb 2013 14:19:22 -0600
Subject: [PATCH 137/414] binding for Target, Triple, TargetMachine
---
newbinding/binding.py | 19 ++++++---
newbinding/include/llvm_binding/extra.h | 28 ++++++++++++-
newbinding/src/CodeGen.py | 1 +
newbinding/src/EngineBuilder.py | 15 ++++++-
newbinding/src/Target.py | 27 ++++++++++++
newbinding/src/TargetMachine.py | 25 +++++++++++
newbinding/src/TargetTransformInfo.py | 14 +++++++
newbinding/src/Triple.py | 55 +++++++++++++++++++++++++
newbinding/test2.py | 23 +++++++++++
9 files changed, 199 insertions(+), 8 deletions(-)
create mode 100644 newbinding/src/Target.py
create mode 100644 newbinding/src/TargetTransformInfo.py
create mode 100644 newbinding/src/Triple.py
diff --git a/newbinding/binding.py b/newbinding/binding.py
index 1f980d1..69267dc 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -185,6 +185,11 @@ class Class(_Type):
writer.die_if_false(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):
format = 'O'
@@ -466,13 +471,17 @@ class ref(_Type):
def __init__(self, element):
assert isinstance(element, Class), type(element)
self.element = element
+ self.const = False
def __str__(self):
return self.fullname
@property
def fullname(self):
- return '%s&' % self.element.fullname
+ if self.const:
+ return 'const %s&' % self.element.fullname
+ else:
+ return '%s&' % self.element.fullname
@property
def capsule_name(self):
@@ -483,7 +492,7 @@ class ref(_Type):
return self.element.format
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)
def unwrap(self, writer, val):
@@ -522,9 +531,9 @@ class ptr(_Type):
class ownedptr(ptr):
pass
-def const(ptr):
- ptr.const = True
- return ptr
+def const(ptr_or_ref):
+ ptr_or_ref.const = True
+ return ptr_or_ref
class cast(_Type):
format = 'O'
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h
index 10a4361..46dd42a 100644
--- a/newbinding/include/llvm_binding/extra.h
+++ b/newbinding/include/llvm_binding/extra.h
@@ -368,9 +368,9 @@ PyObject* EngineBuilder_setMAttrs(llvm::EngineBuilder* eb,
return NULL;
}
std::vector tmp;
- const int N = PyList_Size(strlist);
+ const Py_ssize_t N = PyList_Size(strlist);
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));
if (!elem) {
return NULL;
@@ -381,3 +381,27 @@ PyObject* EngineBuilder_setMAttrs(llvm::EngineBuilder* eb,
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 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");
+}
+
diff --git a/newbinding/src/CodeGen.py b/newbinding/src/CodeGen.py
index 06821aa..7afcd49 100644
--- a/newbinding/src/CodeGen.py
+++ b/newbinding/src/CodeGen.py
@@ -17,3 +17,4 @@ class TLSModel:
class CodeGenOpt:
'Actually a namespace'
Level = Enum('None', 'Less', 'Default', 'Aggressive')
+
diff --git a/newbinding/src/EngineBuilder.py b/newbinding/src/EngineBuilder.py
index 0e8388e..07ffcc0 100644
--- a/newbinding/src/EngineBuilder.py
+++ b/newbinding/src/EngineBuilder.py
@@ -6,6 +6,7 @@ from CodeGen import CodeGenOpt, Reloc, CodeModel
from StringRef import StringRef
from ExecutionEngine import ExecutionEngine
from TargetMachine import TargetMachine
+from Triple import Triple
EngineBuilder = llvm.Class()
@@ -45,5 +46,17 @@ class EngineBuilder:
create = Method(ptr(ExecutionEngine),
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)
diff --git a/newbinding/src/Target.py b/newbinding/src/Target.py
new file mode 100644
index 0000000..3c2a0e1
--- /dev/null
+++ b/newbinding/src/Target.py
@@ -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()
diff --git a/newbinding/src/TargetMachine.py b/newbinding/src/TargetMachine.py
index e53cd33..5910585 100644
--- a/newbinding/src/TargetMachine.py
+++ b/newbinding/src/TargetMachine.py
@@ -1,5 +1,12 @@
from binding import *
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()
@@ -8,4 +15,22 @@ class TargetMachine:
_include_ = 'llvm/Target/TargetMachine.h'
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)))
diff --git a/newbinding/src/TargetTransformInfo.py b/newbinding/src/TargetTransformInfo.py
new file mode 100644
index 0000000..8e3c17e
--- /dev/null
+++ b/newbinding/src/TargetTransformInfo.py
@@ -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()
+
diff --git a/newbinding/src/Triple.py b/newbinding/src/Triple.py
new file mode 100644
index 0000000..0fd894e
--- /dev/null
+++ b/newbinding/src/Triple.py
@@ -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)
+
diff --git a/newbinding/test2.py b/newbinding/test2.py
index a304426..93fccb8 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -124,8 +124,31 @@ def test_engine_builder():
eb.setOptLevel(api.CodeGenOpt.Level.Aggressive).setUseMCJIT(False)
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)
+ 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():
for name, value in globals().items():
From 372d6804e4ba2b38cd10172323413b2d48417133 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Fri, 1 Feb 2013 17:02:09 -0600
Subject: [PATCH 138/414] Add bindings for Pass, PassManagers,
PassManagerBuilder and TargetLibraryInfo.
---
newbinding/binding.py | 2 +
newbinding/src/DataLayout.py | 5 +-
newbinding/src/Pass.py | 35 +++++++++++++
newbinding/src/PassManager.py | 34 +++++++++++++
newbinding/src/PassManagerBuilder.py | 19 +++++++
newbinding/src/TargetLibraryInfo.py | 76 ++++++++++++++++++++++++++++
newbinding/test2.py | 25 ++++++++-
7 files changed, 192 insertions(+), 4 deletions(-)
create mode 100644 newbinding/src/Pass.py
create mode 100644 newbinding/src/PassManager.py
create mode 100644 newbinding/src/PassManagerBuilder.py
create mode 100644 newbinding/src/TargetLibraryInfo.py
diff --git a/newbinding/binding.py b/newbinding/binding.py
index 69267dc..cb40d1e 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -195,6 +195,8 @@ class Enum(object):
def __init__(self, *value_names):
self.parent = None
+ if len(value_names) == 1:
+ value_names = filter(bool, value_names[0].replace(',', ' ').split())
self.value_names = value_names
self.includes = set()
diff --git a/newbinding/src/DataLayout.py b/newbinding/src/DataLayout.py
index a1ef8bc..74d1ad0 100644
--- a/newbinding/src/DataLayout.py
+++ b/newbinding/src/DataLayout.py
@@ -6,8 +6,9 @@ from Module import Module
from Type import Type, IntegerType, StructType
from SmallVector import SmallVector_Value
from GlobalVariable import GlobalVariable
+from Pass import ImmutablePass
-DataLayout = llvm.Class()
+DataLayout = llvm.Class(ImmutablePass)
StructLayout = llvm.Class()
@DataLayout
@@ -24,8 +25,6 @@ class DataLayout:
else:
return DataLayout._new_string(arg)
- delete = Destructor()
-
isLittleEndian = Method(cast(Bool, bool))
isBigEndian = Method(cast(Bool, bool))
diff --git a/newbinding/src/Pass.py b/newbinding/src/Pass.py
new file mode 100644
index 0000000..5842232
--- /dev/null
+++ b/newbinding/src/Pass.py
@@ -0,0 +1,35 @@
+from binding import *
+from namespace import llvm
+from StringRef import StringRef
+from Module import Module
+from Function import Function
+
+Pass = llvm.Class()
+ModulePass = llvm.Class(Pass)
+FunctionPass = llvm.Class(Pass)
+ImmutablePass = llvm.Class(ModulePass)
+
+
+@Pass
+class Pass:
+ _include_ = 'llvm/Pass.h'
+
+ delete = Destructor()
+ getPassName = Method(cast(StringRef, str))
+
+
+@ModulePass
+class ModulePass:
+ runOnModule = Method(cast(Bool, bool), ref(Module))
+
+
+@FunctionPass
+class FunctionPass:
+ doInitialization = Method(cast(Bool, bool), ref(Module))
+ doFinalization = Method(cast(Bool, bool), ref(Module))
+
+
+@ImmutablePass
+class ImmutablePass:
+ pass
+
diff --git a/newbinding/src/PassManager.py b/newbinding/src/PassManager.py
new file mode 100644
index 0000000..f969192
--- /dev/null
+++ b/newbinding/src/PassManager.py
@@ -0,0 +1,34 @@
+from binding import *
+from namespace import llvm
+from Pass import Pass
+from Module import Module
+from Function import Function
+
+PassManagerBase = llvm.Class()
+PassManager = llvm.Class(PassManagerBase)
+FunctionPassManager = llvm.Class(PassManagerBase)
+
+@PassManagerBase
+class PassManagerBase:
+ _include_ = 'llvm/PassManager.h'
+
+ delete = Destructor()
+
+ add = Method(Void, ownedptr(Pass))
+
+@PassManager
+class PassManager:
+ new = Constructor()
+
+ run = Method(cast(Bool, bool), ref(Module))
+
+
+@FunctionPassManager
+class FunctionPassManager:
+ new = Constructor(ptr(Module))
+
+ run = Method(cast(Bool, bool), ref(Function))
+
+ doInitialization = Method(cast(Bool, bool))
+ doFinalization = Method(cast(Bool, bool))
+
diff --git a/newbinding/src/PassManagerBuilder.py b/newbinding/src/PassManagerBuilder.py
new file mode 100644
index 0000000..2e2ea5e
--- /dev/null
+++ b/newbinding/src/PassManagerBuilder.py
@@ -0,0 +1,19 @@
+from binding import *
+from namespace import llvm
+from PassManager import PassManagerBase, FunctionPassManager
+
+@llvm.Class()
+class PassManagerBuilder:
+ _include_ = 'llvm/Transforms/IPO/PassManagerBuilder.h'
+
+ new = Constructor()
+ delete = Destructor()
+
+ populateFunctionPassManager = Method(Void, ref(FunctionPassManager))
+ populateModulePassManager = Method(Void, ref(PassManagerBase))
+ populateLTOPassManager = Method(Void,
+ ref(PassManagerBase),
+ cast(bool, Bool),
+ cast(bool, Bool),
+ cast(bool, Bool)).require_only(3)
+
diff --git a/newbinding/src/TargetLibraryInfo.py b/newbinding/src/TargetLibraryInfo.py
new file mode 100644
index 0000000..a5ba28d
--- /dev/null
+++ b/newbinding/src/TargetLibraryInfo.py
@@ -0,0 +1,76 @@
+from binding import *
+from namespace import llvm
+from Triple import Triple
+from Pass import ImmutablePass
+from StringRef import StringRef
+
+TargetLibraryInfo = llvm.Class(ImmutablePass)
+
+@llvm.Class()
+class LibFunc:
+ Func = Enum('''
+ ZdaPv, ZdlPv, Znaj, ZnajRKSt9nothrow_t,
+ Znam, ZnamRKSt9nothrow_t, Znwj, ZnwjRKSt9nothrow_t,
+ Znwm, ZnwmRKSt9nothrow_t, cxa_atexit, cxa_guard_abort,
+ cxa_guard_acquire, cxa_guard_release, memcpy_chk,
+ acos, acosf, acosh, acoshf,
+ acoshl, acosl, asin, asinf,
+ asinh, asinhf, asinhl, asinl,
+ atan, atan2, atan2f, atan2l,
+ atanf, atanh, atanhf, atanhl,
+ atanl, calloc, cbrt, cbrtf,
+ cbrtl, ceil, ceilf, ceill,
+ copysign, copysignf, copysignl, cos,
+ cosf, cosh, coshf, coshl,
+ cosl, exp, exp10, exp10f,
+ exp10l, exp2, exp2f, exp2l,
+ expf, expl, expm1, expm1f,
+ expm1l, fabs, fabsf, fabsl,
+ fiprintf,
+ floor, floorf, floorl, fmod,
+ fmodf, fmodl, fputc,
+ fputs, free, fwrite, iprintf,
+ log, log10, log10f, log10l,
+ log1p, log1pf, log1pl, log2,
+ log2f, log2l, logb, logbf,
+ logbl, logf, logl, malloc,
+ memchr, memcmp, memcpy, memmove,
+ memset, memset_pattern16, nearbyint, nearbyintf,
+ nearbyintl, posix_memalign, pow, powf,
+ powl, putchar, puts,
+ realloc, reallocf, rint, rintf,
+ rintl, round, roundf, roundl,
+ sin, sinf, sinh, sinhf,
+ sinhl, sinl, siprintf,
+ sqrt, sqrtf, sqrtl, stpcpy,
+ strcat, strchr, strcmp, strcpy,
+ strcspn, strdup, strlen, strncat,
+ strncmp, strncpy, strndup, strnlen,
+ strpbrk, strrchr, strspn, strstr,
+ strtod, strtof, strtol, strtold,
+ strtoll, strtoul, strtoull, tan,
+ tanf, tanh, tanhf, tanhl,
+ tanl, trunc, truncf,
+ truncl, valloc, NumLibFuncs''')
+ # not in llvm-3.2 abs, ffs, ffsl, ffsll, fprintf, isascii,
+ # isdigit, labs, llabs, printf, sprintf, toascii
+
+@TargetLibraryInfo
+class TargetLibraryInfo:
+ _include_ = 'llvm/Target/TargetLibraryInfo.h'
+
+ new = Constructor()
+ new |= Constructor(ref(Triple))
+
+ delete = Destructor()
+
+ has = Method(cast(bool, Bool), LibFunc.Func)
+ hasOptimizedCodeGen = Method(cast(bool, Bool), LibFunc.Func)
+
+ getName = Method(cast(str, StringRef), LibFunc.Func)
+
+ setUnavailable = Method(Void, LibFunc.Func)
+ setAvailable = Method(Void, LibFunc.Func)
+ setAvailableWithName = Method(Void, LibFunc.Func, cast(str, StringRef))
+ disableAllFunctions = Method()
+
diff --git a/newbinding/test2.py b/newbinding/test2.py
index 93fccb8..e2f8dd2 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -8,7 +8,6 @@ def test_basic_jit_use():
api.InitializeNativeTarget()
context = api.getGlobalContext()
-
m = api.Module.new("modname", context)
print m.getModuleIdentifier()
m.setModuleIdentifier('modname2')
@@ -82,6 +81,26 @@ def test_basic_jit_use():
errio = StringIO()
print m
+ # build pass manager
+
+ pmb = api.PassManagerBuilder.new()
+
+ fpm = api.FunctionPassManager.new(m)
+ pm = api.PassManager.new()
+
+ pmb.populateFunctionPassManager(fpm)
+ pmb.populateModulePassManager(pm)
+
+ fpm.doInitialization()
+ fpm.run(fn)
+ fpm.doFinalization()
+
+ pm.run(m)
+
+ print m
+
+ # build engine
+
ee = api.ExecutionEngine.createJIT(m, errio)
print ee, errio.getvalue()
print ee.getDataLayout().getStringRepresentation()
@@ -149,6 +168,10 @@ def test_engine_builder():
print tm.getDataLayout()
+ pm = api.PassManager.new()
+ pm.add(api.DataLayout.new(str(tm.getDataLayout())))
+ pm.add(api.TargetLibraryInfo.new())
+
def main():
for name, value in globals().items():
From 7788346152a461142f5256f832d66d2d9347981e Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Fri, 1 Feb 2013 17:32:30 -0600
Subject: [PATCH 139/414] Improve enum implementation
---
newbinding/binding.py | 48 +++++++++++++++++++------------------------
newbinding/gen.py | 7 +++++++
2 files changed, 28 insertions(+), 27 deletions(-)
diff --git a/newbinding/binding.py b/newbinding/binding.py
index cb40d1e..4205c64 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -125,6 +125,8 @@ class Class(_Type):
# generate methods
for meth in self.methods:
meth.compile_cpp(writer)
+ for enum in self.enums:
+ enum.compile_cpp(writer)
# generate method table
writer.println('static')
@@ -135,6 +137,11 @@ class Class(_Type):
name = meth.name
func = meth.c_name
writer.println(fmt % locals())
+ for enumkind in self.enums:
+ for enum in enumkind.value_names:
+ name = enum
+ func = enumkind.c_name(enum)
+ writer.println(fmt % locals())
writer.println('{ NULL },')
writer.println('};')
writer.println()
@@ -212,38 +219,22 @@ class Enum(object):
return self.fullname
def wrap(self, writer, val):
- ret = writer.declare('PyObject*', 'NULL')
- with writer.block('switch(%s) ' % val):
- for v in self.value_names:
- writer.println('case %s::%s:' % (self.parent, v))
- with writer.indent():
- fmt = '%(ret)s = PyString_FromString("%(v)s");'
- writer.println(fmt % locals())
- writer.println('break;')
- else:
- writer.println('default:')
- with writer.indent():
- writer.raises(ValueError, 'Invalid enum %s' % v)
+ ret = writer.declare('PyObject*', 'PyInt_FromLong(%s)' % val)
return ret
def unwrap(self, writer, val):
- tostring = 'PyString_AsString(%(val)s)' % locals()
- string = writer.declare('const char*', tostring)
- ret = writer.declare('%s::%s' % (self.parent, self.name))
- parent = self.parent
- iffmt = 'if (string_equal(%(string)s, "%(v)s"))'
- for i, v in enumerate(self.value_names):
- with writer.block(iffmt % locals()):
- fmt = '%(ret)s = %(parent)s::%(v)s;'
- writer.println(fmt % locals())
- if i == 0:
- iffmt = 'else ' + iffmt
- with writer.block('else'):
- writer.raises(ValueError, 'Invalid enum.')
+ convert_long_to_enum = '(%s)PyInt_AsLong(%s)' % (self.fullname, val)
+ ret = writer.declare(self.fullname, convert_long_to_enum)
return ret
+ def c_name(self, enum):
+ return cg.mangle("%s_%s_%s" % (self.parent, self.name, enum))
+
def compile_cpp(self, writer):
- pass
+ for enum in self.value_names:
+ with writer.py_function(self.c_name(enum)):
+ ret = self.wrap(writer, '::'.join([self.parent.fullname, enum]))
+ writer.return_value(ret)
def compile_py(self, writer):
with writer.block('class %s:' % self.name):
@@ -251,9 +242,12 @@ class Enum(object):
for v in self.value_names:
if v in RESERVED:
k = '%s_' % v
+ fmt = '%(k)s = getattr(%(p)s, "%(v)s")()'
else:
k = v
- writer.println('%(k)s = "%(v)s"' % locals())
+ fmt = '%(k)s = %(p)s.%(v)s()'
+ p = '.'.join(['_api'] + self.parent.fullname.split('::')[1:])
+ writer.println(fmt % locals())
writer.println()
class Method(object):
diff --git a/newbinding/gen.py b/newbinding/gen.py
index 47f5655..7c56452 100644
--- a/newbinding/gen.py
+++ b/newbinding/gen.py
@@ -136,6 +136,13 @@ static
name = u.name
func = u.c_name
writer.println(fmt % locals())
+ for u in units:
+ if isinstance(u, Enum):
+ for enum in u.value_names:
+ name = enum
+ func = u.c_name(enum)
+ writer.println(fmt % locals())
+
writer.println('{ NULL },')
writer.println('};')
writer.println()
From 1f49bb6d7c7e1fcfeb0ab47c3770ec35e65917dc Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Sun, 3 Feb 2013 12:57:13 -0600
Subject: [PATCH 140/414] Binding for PassManagerBuilder
---
newbinding/binding.py | 92 +++++++++++++++++++++++++
newbinding/include/llvm_binding/extra.h | 14 ++--
newbinding/{src => }/namespace.py | 0
newbinding/src/EngineBuilder.py | 3 +-
newbinding/src/PassManagerBuilder.py | 24 +++++++
newbinding/src/Transforms/IPO.py | 9 +++
newbinding/src/Transforms/__init__.py | 10 +++
newbinding/src/__init__.py | 5 +-
newbinding/test2.py | 4 ++
9 files changed, 151 insertions(+), 10 deletions(-)
rename newbinding/{src => }/namespace.py (100%)
create mode 100644 newbinding/src/Transforms/IPO.py
create mode 100644 newbinding/src/Transforms/__init__.py
diff --git a/newbinding/binding.py b/newbinding/binding.py
index 4205c64..142c8ef 100644
--- a/newbinding/binding.py
+++ b/newbinding/binding.py
@@ -83,6 +83,7 @@ class Class(_Type):
self.methods = []
self.pymethods = []
self.enums = []
+ self.attrs = []
self.includes = set()
self.downcastables = set()
@@ -103,6 +104,10 @@ class Class(_Type):
v.name = k
v.parent = self
setattr(self, k, v)
+ elif isinstance(v, Attr):
+ self.attrs.append(v)
+ v.name = k
+ v.parent = self
elif isinstance(v, CustomPythonMethod):
self.pymethods.append(v)
elif k == '_include_':
@@ -127,6 +132,8 @@ class Class(_Type):
meth.compile_cpp(writer)
for enum in self.enums:
enum.compile_cpp(writer)
+ for attr in self.attrs:
+ attr.compile_cpp(writer)
# generate method table
writer.println('static')
@@ -142,6 +149,16 @@ class Class(_Type):
name = enum
func = enumkind.c_name(enum)
writer.println(fmt % locals())
+ for attr in self.attrs:
+ # getter
+ name = attr.getter_name
+ func = attr.getter_c_name
+ writer.println(fmt % locals())
+ # setter
+ name = attr.setter_name
+ func = attr.setter_c_name
+ writer.println(fmt % locals())
+
writer.println('{ NULL },')
writer.println('};')
writer.println()
@@ -160,6 +177,8 @@ class Class(_Type):
meth.compile_py(writer)
for meth in self.pymethods:
meth.compile_py(writer)
+ for attr in self.attrs:
+ attr.compile_py(writer)
writer.println()
@property
@@ -587,3 +606,76 @@ class CustomPythonStaticMethod(CustomPythonMethod):
writer.println('@staticmethod')
super(CustomPythonStaticMethod, self).compile_py(writer)
+
+class Attr(object):
+ def __init__(self, getter, setter):
+ self.getter = getter
+ self.setter = setter
+
+ @property
+ def fullname(self):
+ try:
+ name = self.realname
+ except AttributeError:
+ name = self.name
+ return '::'.join([self.parent.fullname, name])
+
+ def __str__(self):
+ return self.fullname
+
+ @property
+ def getter_name(self):
+ return '%s_get' % self.name
+
+ @property
+ def setter_name(self):
+ return '%s_set' % self.name
+
+ @property
+ def getter_c_name(self):
+ return cg.mangle('%s_get' % self.fullname)
+
+ @property
+ def setter_c_name(self):
+ return cg.mangle('%s_set' % self.fullname)
+
+ def compile_cpp(self, writer):
+ # getter
+ with writer.py_function(self.getter_c_name):
+ (this,) = writer.parse_arguments('args', ptr(self.parent))
+ attr = self.name
+ ret = writer.declare(self.getter.fullname,
+ '%(this)s->%(attr)s' % locals())
+ writer.return_value(self.getter.wrap(writer, ret))
+ # setter
+ with writer.py_function(self.setter_c_name):
+ (this, value) = writer.parse_arguments('args', ptr(self.parent),
+ self.setter)
+ attr = self.name
+ writer.println('%(this)s->%(attr)s = %(value)s;' % locals())
+ writer.return_value(None)
+
+ def compile_py(self, writer):
+ name = self.name
+ parent = '.'.join(self.parent.fullname.split('::')[1:])
+ getter = '.'.join([parent, self.getter_name])
+ setter = '.'.join([parent, self.setter_name])
+ writer.println('@property')
+ with writer.block('def %(name)s(self):' % locals()):
+ unself = writer.unwrap('self')
+ ret = writer.new_symbol('ret')
+ writer.println('%(ret)s = _api.%(getter)s(%(unself)s)' % locals())
+ is_ownedptr = isinstance(self.getter, ownedptr)
+ writer.return_value(writer.wrap(ret, is_ownedptr))
+ writer.println()
+ writer.println('@%(name)s.setter' % locals())
+ with writer.block('def %(name)s(self, value):' % locals()):
+ unself = writer.unwrap('self')
+ unvalue = writer.unwrap('value')
+ if isinstance(self.setter, ownedptr):
+ writer.release_ownership(unvalue)
+ writer.println('return _api.%(setter)s(%(unself)s, %(unvalue)s)' %
+ locals())
+ writer.println()
+
+
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h
index 46dd42a..c69f177 100644
--- a/newbinding/include/llvm_binding/extra.h
+++ b/newbinding/include/llvm_binding/extra.h
@@ -163,13 +163,13 @@ PyObject* iplist_to_pylist(iplist &IPL, const char * capsuleName,
className);
}
-static
-bool string_equal(const char *A, const char *B){
- for (; *A and *B; ++A, ++B) {
- if (*A != *B) return false;
- }
- return true;
-}
+//static
+//bool string_equal(const char *A, const char *B){
+// for (; *A and *B; ++A, ++B) {
+// if (*A != *B) return false;
+// }
+// return true;
+//}
////////////
static
diff --git a/newbinding/src/namespace.py b/newbinding/namespace.py
similarity index 100%
rename from newbinding/src/namespace.py
rename to newbinding/namespace.py
diff --git a/newbinding/src/EngineBuilder.py b/newbinding/src/EngineBuilder.py
index 07ffcc0..d9594f0 100644
--- a/newbinding/src/EngineBuilder.py
+++ b/newbinding/src/EngineBuilder.py
@@ -50,8 +50,9 @@ class EngineBuilder:
_selectTarget0.realname = 'selectTarget'
_selectTarget1 = CustomMethod('EngineBuilder_selectTarget',
+ PyObjectPtr,
const(ref(Triple)), cast(str, StringRef),
- cast(str, StringRef), PyObjectPtr),
+ cast(str, StringRef), PyObjectPtr)
@CustomPythonMethod
def selectTarget(self, *args):
diff --git a/newbinding/src/PassManagerBuilder.py b/newbinding/src/PassManagerBuilder.py
index 2e2ea5e..11fedfb 100644
--- a/newbinding/src/PassManagerBuilder.py
+++ b/newbinding/src/PassManagerBuilder.py
@@ -1,6 +1,8 @@
from binding import *
from namespace import llvm
from PassManager import PassManagerBase, FunctionPassManager
+from TargetLibraryInfo import TargetLibraryInfo
+from Pass import Pass
@llvm.Class()
class PassManagerBuilder:
@@ -17,3 +19,25 @@ class PassManagerBuilder:
cast(bool, Bool),
cast(bool, Bool)).require_only(3)
+ def _attr_int():
+ return Attr(getter=cast(Unsigned, int),
+ setter=cast(int, Unsigned))
+
+ OptLevel = _attr_int()
+ SizeLevel = _attr_int()
+
+ def _attr_bool():
+ return Attr(getter=cast(Bool, bool),
+ setter=cast(bool, Bool))
+
+ DisableSimplifyLibCalls = _attr_bool()
+ DisableUnitAtATime = _attr_bool()
+ DisableUnrollLoops = _attr_bool()
+ Vectorize = _attr_bool()
+ LoopVectorize = _attr_bool()
+
+ LibraryInfo = Attr(getter=ownedptr(TargetLibraryInfo),
+ setter=ownedptr(TargetLibraryInfo))
+
+ Inliner = Attr(getter=ownedptr(Pass),
+ setter=ownedptr(Pass))
diff --git a/newbinding/src/Transforms/IPO.py b/newbinding/src/Transforms/IPO.py
new file mode 100644
index 0000000..6c2fc26
--- /dev/null
+++ b/newbinding/src/Transforms/IPO.py
@@ -0,0 +1,9 @@
+from binding import *
+from namespace import llvm
+from ..Pass import Pass
+
+llvm.includes.add('llvm/Transforms/IPO.h')
+
+createFunctionInliningPass = llvm.Function('createFunctionInliningPass',
+ ptr(Pass),
+ cast(int, Unsigned)).require_only(0)
diff --git a/newbinding/src/Transforms/__init__.py b/newbinding/src/Transforms/__init__.py
new file mode 100644
index 0000000..da0beed
--- /dev/null
+++ b/newbinding/src/Transforms/__init__.py
@@ -0,0 +1,10 @@
+import os.path, importlib
+
+def _init():
+ for fname in os.listdir(os.path.dirname(__file__)):
+ if ((fname.endswith('.py') or fname.endswith('.pyc')) and
+ not fname.startswith('__init__')):
+ modname = os.path.basename(fname).rsplit('.', 1)[0]
+ importlib.import_module('.' + modname, __name__)
+
+_init()
diff --git a/newbinding/src/__init__.py b/newbinding/src/__init__.py
index 1042826..f67a3c4 100644
--- a/newbinding/src/__init__.py
+++ b/newbinding/src/__init__.py
@@ -5,7 +5,8 @@ def _init():
if ((fname.endswith('.py') or fname.endswith('.pyc')) and
not fname.startswith('__init__')):
modname = os.path.basename(fname).rsplit('.', 1)[0]
- topname = __name__.rsplit('.', 1)[0]
- importlib.import_module('.' + modname, topname)
+ importlib.import_module('.' + modname, __name__)
_init()
+
+import Transforms
\ No newline at end of file
diff --git a/newbinding/test2.py b/newbinding/test2.py
index e2f8dd2..248e32a 100644
--- a/newbinding/test2.py
+++ b/newbinding/test2.py
@@ -84,6 +84,10 @@ def test_basic_jit_use():
# build pass manager
pmb = api.PassManagerBuilder.new()
+ pmb.OptLevel = 3
+ assert pmb.OptLevel == 3
+ pmb.LibraryInfo = api.TargetLibraryInfo.new()
+ pmb.Inliner = api.createFunctionInliningPass()
fpm = api.FunctionPassManager.new(m)
pm = api.PassManager.new()
From c085bef46e4bd03ca60abff0ba46928ce7f81ad7 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Sun, 3 Feb 2013 15:01:57 -0600
Subject: [PATCH 141/414] Rename the tests
---
newbinding/Makefile | 4 +--
newbinding/test.py | 32 ------------------------
newbinding/{test2.py => test_binding.py} | 0
3 files changed, 2 insertions(+), 34 deletions(-)
delete mode 100644 newbinding/test.py
rename newbinding/{test2.py => test_binding.py} (100%)
diff --git a/newbinding/Makefile b/newbinding/Makefile
index 735d4ff..8573235 100644
--- a/newbinding/Makefile
+++ b/newbinding/Makefile
@@ -13,10 +13,10 @@ clean: cleantemp
cleantemp:
rm -f api.cpp api.py
- rm -f src/*.pyc
+ rm -f src/*.pyc src/Transforms/*.pyc
check: _api.so api.py
- $(PYTHON) test2.py
+ $(PYTHON) test_binding.py
@PHONY: all clean check
diff --git a/newbinding/test.py b/newbinding/test.py
deleted file mode 100644
index bed9e1a..0000000
--- a/newbinding/test.py
+++ /dev/null
@@ -1,32 +0,0 @@
-import _api
-
-context = _api.getGlobalContext()
-modname = "modname"
-module = _api.Module.new(modname, context)
-assert modname == _api.Module.getModuleIdentifier(module)
-modname2 = "newmodname"
-_api.Module.setModuleIdentifier(module, modname2)
-assert modname2 == _api.Module.getModuleIdentifier(module)
-
-_api.Module.dump(module)
-
-_api.Module.delete(module)
-
-voidty = _api.Type.getVoidTy(context)
-assert _api.Type.isVoidTy(voidty)
-assert not _api.Type.isLabelTy(voidty)
-
-int21ty = _api.Type.getIntNTy(context, 21)
-assert _api.Type.isIntegerTy(int21ty)
-assert _api.Type.isIntegerTy(int21ty, 21)
-_api.Type.dump(int21ty)
-
-halfty = _api.Type.getHalfTy(context)
-assert _api.Type.isHalfTy(halfty)
-_api.Type.dump(halfty)
-
-fnty = _api.FunctionType.get(halfty, False)
-_api.Type.dump(fnty)
-
-
-
diff --git a/newbinding/test2.py b/newbinding/test_binding.py
similarity index 100%
rename from newbinding/test2.py
rename to newbinding/test_binding.py
From 961c5e99e1191f44fb192d226119877f695a84ce Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Sun, 3 Feb 2013 15:09:07 -0600
Subject: [PATCH 142/414] Re-organize
---
newbinding/Makefile | 6 +++---
newbinding/{ => gen}/binding.py | 0
newbinding/{ => gen}/codegen.py | 0
newbinding/{ => gen}/gen.py | 4 ++--
newbinding/src/{ => ADT}/SmallVector.py | 2 +-
newbinding/src/{ => ADT}/StringRef.py | 2 +-
newbinding/src/{ => ADT}/Triple.py | 2 +-
newbinding/src/ADT/__init__.py | 10 ++++++++++
.../AssemblyAnnotationWriter.py | 2 +-
newbinding/src/Assembly/__init__.py | 10 ++++++++++
newbinding/src/BasicBlock.py | 2 +-
.../src/{ => CodeGen}/MachineCodeInfo.py | 2 +-
newbinding/src/CodeGen/__init__.py | 10 ++++++++++
newbinding/src/DataLayout.py | 4 ++--
newbinding/src/DerivedTypes.py | 2 +-
newbinding/src/EngineBuilder.py | 10 +++++-----
.../{ => ExecutionEngine}/ExecutionEngine.py | 20 +++++++++----------
newbinding/src/ExecutionEngine/__init__.py | 10 ++++++++++
newbinding/src/IRBuilder.py | 4 ++--
newbinding/src/Module.py | 6 +++---
newbinding/src/Pass.py | 2 +-
newbinding/src/{ => Support}/CodeGen.py | 2 +-
newbinding/src/Support/MemoryBuffer.py | 9 +++++++++
newbinding/src/{ => Support}/Target.py | 4 ++--
newbinding/src/{ => Support}/TargetSelect.py | 4 ++--
newbinding/src/Support/__init__.py | 10 ++++++++++
newbinding/src/{ => Support}/raw_ostream.py | 6 +++---
.../src/{ => Target}/TargetLibraryInfo.py | 8 ++++----
newbinding/src/{ => Target}/TargetMachine.py | 16 +++++++--------
newbinding/src/Target/__init__.py | 10 ++++++++++
newbinding/src/TargetTransformInfo.py | 2 ++
newbinding/src/Transforms/IPO.py | 2 +-
.../{ => Transforms}/PassManagerBuilder.py | 8 ++++----
newbinding/src/Type.py | 4 ++--
newbinding/src/Value.py | 6 +++---
newbinding/src/__init__.py | 2 +-
newbinding/{ => src}/namespace.py | 0
37 files changed, 137 insertions(+), 66 deletions(-)
rename newbinding/{ => gen}/binding.py (100%)
rename newbinding/{ => gen}/codegen.py (100%)
rename newbinding/{ => gen}/gen.py (98%)
rename newbinding/src/{ => ADT}/SmallVector.py (92%)
rename newbinding/src/{ => ADT}/StringRef.py (76%)
rename newbinding/src/{ => ADT}/Triple.py (98%)
create mode 100644 newbinding/src/ADT/__init__.py
rename newbinding/src/{ => Assembly}/AssemblyAnnotationWriter.py (81%)
create mode 100644 newbinding/src/Assembly/__init__.py
rename newbinding/src/{ => CodeGen}/MachineCodeInfo.py (91%)
create mode 100644 newbinding/src/CodeGen/__init__.py
rename newbinding/src/{ => ExecutionEngine}/ExecutionEngine.py (89%)
create mode 100644 newbinding/src/ExecutionEngine/__init__.py
rename newbinding/src/{ => Support}/CodeGen.py (93%)
create mode 100644 newbinding/src/Support/MemoryBuffer.py
rename newbinding/src/{ => Support}/Target.py (89%)
rename newbinding/src/{ => Support}/TargetSelect.py (54%)
create mode 100644 newbinding/src/Support/__init__.py
rename newbinding/src/{ => Support}/raw_ostream.py (73%)
rename newbinding/src/{ => Target}/TargetLibraryInfo.py (95%)
rename newbinding/src/{ => Target}/TargetMachine.py (72%)
create mode 100644 newbinding/src/Target/__init__.py
rename newbinding/src/{ => Transforms}/PassManagerBuilder.py (88%)
rename newbinding/{ => src}/namespace.py (100%)
diff --git a/newbinding/Makefile b/newbinding/Makefile
index 8573235..0e7924f 100644
--- a/newbinding/Makefile
+++ b/newbinding/Makefile
@@ -5,15 +5,15 @@ all: _api.so _capsule.so
_api.so _capsule.so: api.cpp capsule.cpp
$(PYTHON) setup.py build_ext --inplace
-api.cpp api.py: src/*.py include/llvm_binding/*.h gen.py binding.py
- $(PYTHON) gen.py api src
+api.cpp api.py: src/*.py include/llvm_binding/*.h gen/gen.py gen/binding.py
+ $(PYTHON) gen/gen.py api src
clean: cleantemp
rm -f _api.so _capsule.so
cleantemp:
rm -f api.cpp api.py
- rm -f src/*.pyc src/Transforms/*.pyc
+ rm -f src/*.pyc src/Transforms/*.pyc src/ADT/*.pyc src/Assembly/*.pyc src/CodeGen/*.pyc src/ExecutionEngine/*.pyc src/Target/*.pyc src/Transforms/*.pyc
check: _api.so api.py
diff --git a/newbinding/binding.py b/newbinding/gen/binding.py
similarity index 100%
rename from newbinding/binding.py
rename to newbinding/gen/binding.py
diff --git a/newbinding/codegen.py b/newbinding/gen/codegen.py
similarity index 100%
rename from newbinding/codegen.py
rename to newbinding/gen/codegen.py
diff --git a/newbinding/gen.py b/newbinding/gen/gen.py
similarity index 98%
rename from newbinding/gen.py
rename to newbinding/gen/gen.py
index 7c56452..89399f3 100644
--- a/newbinding/gen.py
+++ b/newbinding/gen/gen.py
@@ -1,4 +1,4 @@
-import sys
+import sys, os
from binding import *
import codegen
@@ -59,7 +59,7 @@ def wrap_println_from_file(file):
def main():
outputfilename = sys.argv[1]
entry_modname = sys.argv[2]
-
+ sys.path += [os.path.dirname(os.curdir)]
entry_module = __import__(entry_modname)
units = []
diff --git a/newbinding/src/SmallVector.py b/newbinding/src/ADT/SmallVector.py
similarity index 92%
rename from newbinding/src/SmallVector.py
rename to newbinding/src/ADT/SmallVector.py
index 5b48aba..f52ff60 100644
--- a/newbinding/src/SmallVector.py
+++ b/newbinding/src/ADT/SmallVector.py
@@ -1,5 +1,5 @@
from binding import *
-from namespace import llvm
+from ..namespace import llvm
@llvm.Class()
class SmallVector_Type:
diff --git a/newbinding/src/StringRef.py b/newbinding/src/ADT/StringRef.py
similarity index 76%
rename from newbinding/src/StringRef.py
rename to newbinding/src/ADT/StringRef.py
index fb3b896..e6fc8f2 100644
--- a/newbinding/src/StringRef.py
+++ b/newbinding/src/ADT/StringRef.py
@@ -1,5 +1,5 @@
from binding import *
-from namespace import llvm
+from ..namespace import llvm
@llvm.Class()
class StringRef:
diff --git a/newbinding/src/Triple.py b/newbinding/src/ADT/Triple.py
similarity index 98%
rename from newbinding/src/Triple.py
rename to newbinding/src/ADT/Triple.py
index 0fd894e..82de57e 100644
--- a/newbinding/src/Triple.py
+++ b/newbinding/src/ADT/Triple.py
@@ -1,5 +1,5 @@
from binding import *
-from namespace import llvm
+from ..namespace import llvm
from StringRef import StringRef
Triple = llvm.Class()
diff --git a/newbinding/src/ADT/__init__.py b/newbinding/src/ADT/__init__.py
new file mode 100644
index 0000000..da0beed
--- /dev/null
+++ b/newbinding/src/ADT/__init__.py
@@ -0,0 +1,10 @@
+import os.path, importlib
+
+def _init():
+ for fname in os.listdir(os.path.dirname(__file__)):
+ if ((fname.endswith('.py') or fname.endswith('.pyc')) and
+ not fname.startswith('__init__')):
+ modname = os.path.basename(fname).rsplit('.', 1)[0]
+ importlib.import_module('.' + modname, __name__)
+
+_init()
diff --git a/newbinding/src/AssemblyAnnotationWriter.py b/newbinding/src/Assembly/AssemblyAnnotationWriter.py
similarity index 81%
rename from newbinding/src/AssemblyAnnotationWriter.py
rename to newbinding/src/Assembly/AssemblyAnnotationWriter.py
index d2b5a5d..6b4d694 100644
--- a/newbinding/src/AssemblyAnnotationWriter.py
+++ b/newbinding/src/Assembly/AssemblyAnnotationWriter.py
@@ -1,5 +1,5 @@
from binding import *
-from namespace import llvm
+from ..namespace import llvm
@llvm.Class()
class AssemblyAnnotationWriter:
diff --git a/newbinding/src/Assembly/__init__.py b/newbinding/src/Assembly/__init__.py
new file mode 100644
index 0000000..da0beed
--- /dev/null
+++ b/newbinding/src/Assembly/__init__.py
@@ -0,0 +1,10 @@
+import os.path, importlib
+
+def _init():
+ for fname in os.listdir(os.path.dirname(__file__)):
+ if ((fname.endswith('.py') or fname.endswith('.pyc')) and
+ not fname.startswith('__init__')):
+ modname = os.path.basename(fname).rsplit('.', 1)[0]
+ importlib.import_module('.' + modname, __name__)
+
+_init()
diff --git a/newbinding/src/BasicBlock.py b/newbinding/src/BasicBlock.py
index b0716cd..61a09d7 100644
--- a/newbinding/src/BasicBlock.py
+++ b/newbinding/src/BasicBlock.py
@@ -3,7 +3,7 @@ from namespace import llvm
from Value import Function, BasicBlock
from Instruction import Instruction, TerminatorInst
from LLVMContext import LLVMContext
-from StringRef import StringRef
+from ADT.StringRef import StringRef
@BasicBlock
class BasicBlock:
diff --git a/newbinding/src/MachineCodeInfo.py b/newbinding/src/CodeGen/MachineCodeInfo.py
similarity index 91%
rename from newbinding/src/MachineCodeInfo.py
rename to newbinding/src/CodeGen/MachineCodeInfo.py
index 5d91e3a..fc3a1b6 100644
--- a/newbinding/src/MachineCodeInfo.py
+++ b/newbinding/src/CodeGen/MachineCodeInfo.py
@@ -1,5 +1,5 @@
from binding import *
-from namespace import llvm
+from ..namespace import llvm
MachineCodeInfo = llvm.Class()
diff --git a/newbinding/src/CodeGen/__init__.py b/newbinding/src/CodeGen/__init__.py
new file mode 100644
index 0000000..da0beed
--- /dev/null
+++ b/newbinding/src/CodeGen/__init__.py
@@ -0,0 +1,10 @@
+import os.path, importlib
+
+def _init():
+ for fname in os.listdir(os.path.dirname(__file__)):
+ if ((fname.endswith('.py') or fname.endswith('.pyc')) and
+ not fname.startswith('__init__')):
+ modname = os.path.basename(fname).rsplit('.', 1)[0]
+ importlib.import_module('.' + modname, __name__)
+
+_init()
diff --git a/newbinding/src/DataLayout.py b/newbinding/src/DataLayout.py
index 74d1ad0..704c4b1 100644
--- a/newbinding/src/DataLayout.py
+++ b/newbinding/src/DataLayout.py
@@ -1,10 +1,10 @@
from binding import *
from namespace import llvm
from LLVMContext import LLVMContext
-from StringRef import StringRef
+from ADT.StringRef import StringRef
from Module import Module
from Type import Type, IntegerType, StructType
-from SmallVector import SmallVector_Value
+from ADT.SmallVector import SmallVector_Value
from GlobalVariable import GlobalVariable
from Pass import ImmutablePass
diff --git a/newbinding/src/DerivedTypes.py b/newbinding/src/DerivedTypes.py
index efce8b8..af9e757 100644
--- a/newbinding/src/DerivedTypes.py
+++ b/newbinding/src/DerivedTypes.py
@@ -2,7 +2,7 @@ from binding import *
from namespace import llvm
from LLVMContext import LLVMContext
from Type import Type
-from SmallVector import SmallVector_Type
+from ADT.SmallVector import SmallVector_Type
FunctionType = llvm.Class(Type)
diff --git a/newbinding/src/EngineBuilder.py b/newbinding/src/EngineBuilder.py
index d9594f0..4b68a25 100644
--- a/newbinding/src/EngineBuilder.py
+++ b/newbinding/src/EngineBuilder.py
@@ -2,11 +2,11 @@ from binding import *
from namespace import llvm
from Module import Module
from JITMemoryManager import JITMemoryManager
-from CodeGen import CodeGenOpt, Reloc, CodeModel
-from StringRef import StringRef
-from ExecutionEngine import ExecutionEngine
-from TargetMachine import TargetMachine
-from Triple import Triple
+from Support.CodeGen import CodeGenOpt, Reloc, CodeModel
+from ADT.StringRef import StringRef
+from ExecutionEngine.ExecutionEngine import ExecutionEngine
+from Target.TargetMachine import TargetMachine
+from ADT.Triple import Triple
EngineBuilder = llvm.Class()
diff --git a/newbinding/src/ExecutionEngine.py b/newbinding/src/ExecutionEngine/ExecutionEngine.py
similarity index 89%
rename from newbinding/src/ExecutionEngine.py
rename to newbinding/src/ExecutionEngine/ExecutionEngine.py
index 5a95a16..f4bdb14 100644
--- a/newbinding/src/ExecutionEngine.py
+++ b/newbinding/src/ExecutionEngine/ExecutionEngine.py
@@ -1,14 +1,14 @@
from binding import *
-from namespace import llvm
-from Module import Module
-from JITMemoryManager import JITMemoryManager
-from CodeGen import CodeGenOpt, Reloc, CodeModel
-from DataLayout import DataLayout
-from Value import Function, GlobalValue, BasicBlock, Constant
-from GlobalVariable import GlobalVariable
-from MachineCodeInfo import MachineCodeInfo
-from GenericValue import GenericValue
-from Type import Type
+from ..namespace import llvm
+from ..Module import Module
+from ..JITMemoryManager import JITMemoryManager
+from ..Support.CodeGen import CodeGenOpt, Reloc, CodeModel
+from ..DataLayout import DataLayout
+from ..Value import Function, GlobalValue, BasicBlock, Constant
+from ..GlobalVariable import GlobalVariable
+from ..CodeGen.MachineCodeInfo import MachineCodeInfo
+from ..GenericValue import GenericValue
+from ..Type import Type
ExecutionEngine = llvm.Class()
diff --git a/newbinding/src/ExecutionEngine/__init__.py b/newbinding/src/ExecutionEngine/__init__.py
new file mode 100644
index 0000000..da0beed
--- /dev/null
+++ b/newbinding/src/ExecutionEngine/__init__.py
@@ -0,0 +1,10 @@
+import os.path, importlib
+
+def _init():
+ for fname in os.listdir(os.path.dirname(__file__)):
+ if ((fname.endswith('.py') or fname.endswith('.pyc')) and
+ not fname.startswith('__init__')):
+ modname = os.path.basename(fname).rsplit('.', 1)[0]
+ importlib.import_module('.' + modname, __name__)
+
+_init()
diff --git a/newbinding/src/IRBuilder.py b/newbinding/src/IRBuilder.py
index cea94ce..61dd99b 100644
--- a/newbinding/src/IRBuilder.py
+++ b/newbinding/src/IRBuilder.py
@@ -8,8 +8,8 @@ from Instruction import UnreachableInst, AllocaInst, LoadInst, StoreInst
from Instruction import FenceInst, AtomicCmpXchgInst, AtomicRMWInst, CmpInst
from Instruction import LandingPadInst, VAArgInst
from Instruction import AtomicOrdering, SynchronizationScope
-from SmallVector import SmallVector_Value, SmallVector_Unsigned
-from StringRef import StringRef
+from ADT.SmallVector import SmallVector_Value, SmallVector_Unsigned
+from ADT.StringRef import StringRef
from Value import Value, MDNode
from Type import Type, IntegerType
diff --git a/newbinding/src/Module.py b/newbinding/src/Module.py
index 9b392ca..539c486 100644
--- a/newbinding/src/Module.py
+++ b/newbinding/src/Module.py
@@ -1,12 +1,12 @@
from binding import *
from namespace import llvm
from LLVMContext import LLVMContext
-from StringRef import StringRef
+from ADT.StringRef import StringRef
from Constant import Constant
from Function import Function
from DerivedTypes import FunctionType
-from raw_ostream import raw_ostream
-from AssemblyAnnotationWriter import AssemblyAnnotationWriter
+from Support.raw_ostream import raw_ostream
+from Assembly.AssemblyAnnotationWriter import AssemblyAnnotationWriter
@llvm.Class()
class Module:
diff --git a/newbinding/src/Pass.py b/newbinding/src/Pass.py
index 5842232..39e894b 100644
--- a/newbinding/src/Pass.py
+++ b/newbinding/src/Pass.py
@@ -1,6 +1,6 @@
from binding import *
from namespace import llvm
-from StringRef import StringRef
+from ADT.StringRef import StringRef
from Module import Module
from Function import Function
diff --git a/newbinding/src/CodeGen.py b/newbinding/src/Support/CodeGen.py
similarity index 93%
rename from newbinding/src/CodeGen.py
rename to newbinding/src/Support/CodeGen.py
index 7afcd49..013caa1 100644
--- a/newbinding/src/CodeGen.py
+++ b/newbinding/src/Support/CodeGen.py
@@ -1,5 +1,5 @@
from binding import *
-from namespace import llvm
+from ..namespace import llvm
@llvm.Class()
class Reloc:
diff --git a/newbinding/src/Support/MemoryBuffer.py b/newbinding/src/Support/MemoryBuffer.py
new file mode 100644
index 0000000..b960fe6
--- /dev/null
+++ b/newbinding/src/Support/MemoryBuffer.py
@@ -0,0 +1,9 @@
+from binding import *
+from ..namespace import llvm
+
+MemoryBuffer = llvm.Class()
+
+@MemoryBuffer
+class MemoryBuffer:
+ _include_ = 'llvm/Support/MemoryBuffer.h'
+
diff --git a/newbinding/src/Target.py b/newbinding/src/Support/Target.py
similarity index 89%
rename from newbinding/src/Target.py
rename to newbinding/src/Support/Target.py
index 3c2a0e1..bdaeff5 100644
--- a/newbinding/src/Target.py
+++ b/newbinding/src/Support/Target.py
@@ -1,6 +1,6 @@
from binding import *
-from namespace import llvm
-from StringRef import StringRef
+from ..namespace import llvm
+from ..ADT.StringRef import StringRef
Target = llvm.Class()
@Target
diff --git a/newbinding/src/TargetSelect.py b/newbinding/src/Support/TargetSelect.py
similarity index 54%
rename from newbinding/src/TargetSelect.py
rename to newbinding/src/Support/TargetSelect.py
index cb2eb96..4a2b171 100644
--- a/newbinding/src/TargetSelect.py
+++ b/newbinding/src/Support/TargetSelect.py
@@ -1,8 +1,8 @@
from binding import *
-from namespace import llvm
+from ..namespace import llvm
llvm.includes.add('llvm/Support/TargetSelect.h')
-llvm.Function('InitializeNativeTarget')
+InitializeNativeTarget = llvm.Function('InitializeNativeTarget')
#llvm.Function('InitializeAllTargets')
diff --git a/newbinding/src/Support/__init__.py b/newbinding/src/Support/__init__.py
new file mode 100644
index 0000000..da0beed
--- /dev/null
+++ b/newbinding/src/Support/__init__.py
@@ -0,0 +1,10 @@
+import os.path, importlib
+
+def _init():
+ for fname in os.listdir(os.path.dirname(__file__)):
+ if ((fname.endswith('.py') or fname.endswith('.pyc')) and
+ not fname.startswith('__init__')):
+ modname = os.path.basename(fname).rsplit('.', 1)[0]
+ importlib.import_module('.' + modname, __name__)
+
+_init()
diff --git a/newbinding/src/raw_ostream.py b/newbinding/src/Support/raw_ostream.py
similarity index 73%
rename from newbinding/src/raw_ostream.py
rename to newbinding/src/Support/raw_ostream.py
index 2f5a6f5..ecf3614 100644
--- a/newbinding/src/raw_ostream.py
+++ b/newbinding/src/Support/raw_ostream.py
@@ -1,7 +1,7 @@
from binding import *
-from namespace import llvm
-from LLVMContext import LLVMContext
-from StringRef import StringRef
+from ..namespace import llvm
+from ..LLVMContext import LLVMContext
+from ..ADT.StringRef import StringRef
@llvm.Class()
class raw_ostream:
diff --git a/newbinding/src/TargetLibraryInfo.py b/newbinding/src/Target/TargetLibraryInfo.py
similarity index 95%
rename from newbinding/src/TargetLibraryInfo.py
rename to newbinding/src/Target/TargetLibraryInfo.py
index a5ba28d..b90c619 100644
--- a/newbinding/src/TargetLibraryInfo.py
+++ b/newbinding/src/Target/TargetLibraryInfo.py
@@ -1,8 +1,8 @@
from binding import *
-from namespace import llvm
-from Triple import Triple
-from Pass import ImmutablePass
-from StringRef import StringRef
+from ..namespace import llvm
+from ..ADT.Triple import Triple
+from ..Pass import ImmutablePass
+from ..ADT.StringRef import StringRef
TargetLibraryInfo = llvm.Class(ImmutablePass)
diff --git a/newbinding/src/TargetMachine.py b/newbinding/src/Target/TargetMachine.py
similarity index 72%
rename from newbinding/src/TargetMachine.py
rename to newbinding/src/Target/TargetMachine.py
index 5910585..3fc16e2 100644
--- a/newbinding/src/TargetMachine.py
+++ b/newbinding/src/Target/TargetMachine.py
@@ -1,12 +1,12 @@
from binding import *
-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)
+from ..namespace import llvm
+from ..ADT.StringRef import StringRef
+from ..Support.CodeGen import CodeModel, TLSModel, CodeGenOpt, Reloc
+from ..GlobalValue import GlobalValue
+from ..Support.Target import Target
+from ..DataLayout import DataLayout
+from ..TargetTransformInfo import (ScalarTargetTransformInfo,
+ VectorTargetTransformInfo)
TargetMachine = llvm.Class()
diff --git a/newbinding/src/Target/__init__.py b/newbinding/src/Target/__init__.py
new file mode 100644
index 0000000..da0beed
--- /dev/null
+++ b/newbinding/src/Target/__init__.py
@@ -0,0 +1,10 @@
+import os.path, importlib
+
+def _init():
+ for fname in os.listdir(os.path.dirname(__file__)):
+ if ((fname.endswith('.py') or fname.endswith('.pyc')) and
+ not fname.startswith('__init__')):
+ modname = os.path.basename(fname).rsplit('.', 1)[0]
+ importlib.import_module('.' + modname, __name__)
+
+_init()
diff --git a/newbinding/src/TargetTransformInfo.py b/newbinding/src/TargetTransformInfo.py
index 8e3c17e..5761281 100644
--- a/newbinding/src/TargetTransformInfo.py
+++ b/newbinding/src/TargetTransformInfo.py
@@ -1,6 +1,8 @@
from binding import *
from namespace import llvm
+llvm.includes.add('llvm/TargetTransformInfo.h')
+
ScalarTargetTransformInfo = llvm.Class()
VectorTargetTransformInfo = llvm.Class()
diff --git a/newbinding/src/Transforms/IPO.py b/newbinding/src/Transforms/IPO.py
index 6c2fc26..48b34f9 100644
--- a/newbinding/src/Transforms/IPO.py
+++ b/newbinding/src/Transforms/IPO.py
@@ -1,5 +1,5 @@
from binding import *
-from namespace import llvm
+from ..namespace import llvm
from ..Pass import Pass
llvm.includes.add('llvm/Transforms/IPO.h')
diff --git a/newbinding/src/PassManagerBuilder.py b/newbinding/src/Transforms/PassManagerBuilder.py
similarity index 88%
rename from newbinding/src/PassManagerBuilder.py
rename to newbinding/src/Transforms/PassManagerBuilder.py
index 11fedfb..a95b6df 100644
--- a/newbinding/src/PassManagerBuilder.py
+++ b/newbinding/src/Transforms/PassManagerBuilder.py
@@ -1,8 +1,8 @@
from binding import *
-from namespace import llvm
-from PassManager import PassManagerBase, FunctionPassManager
-from TargetLibraryInfo import TargetLibraryInfo
-from Pass import Pass
+from ..namespace import llvm
+from ..PassManager import PassManagerBase, FunctionPassManager
+from ..Target.TargetLibraryInfo import TargetLibraryInfo
+from ..Pass import Pass
@llvm.Class()
class PassManagerBuilder:
diff --git a/newbinding/src/Type.py b/newbinding/src/Type.py
index bf51b9d..8e6b381 100644
--- a/newbinding/src/Type.py
+++ b/newbinding/src/Type.py
@@ -1,8 +1,8 @@
from binding import *
from namespace import llvm
from LLVMContext import LLVMContext
-from raw_ostream import raw_ostream
-from StringRef import StringRef
+from Support.raw_ostream import raw_ostream
+from ADT.StringRef import StringRef
Type = llvm.Class()
IntegerType = llvm.Class(Type)
diff --git a/newbinding/src/Value.py b/newbinding/src/Value.py
index 7460c90..5841746 100644
--- a/newbinding/src/Value.py
+++ b/newbinding/src/Value.py
@@ -1,10 +1,10 @@
from binding import *
from namespace import llvm
-from raw_ostream import raw_ostream
-from AssemblyAnnotationWriter import AssemblyAnnotationWriter
+from Support.raw_ostream import raw_ostream
+from Assembly.AssemblyAnnotationWriter import AssemblyAnnotationWriter
from Type import Type
from LLVMContext import LLVMContext
-from StringRef import StringRef
+from ADT.StringRef import StringRef
Value = llvm.Class()
# forward declarations
diff --git a/newbinding/src/__init__.py b/newbinding/src/__init__.py
index f67a3c4..8a1b356 100644
--- a/newbinding/src/__init__.py
+++ b/newbinding/src/__init__.py
@@ -9,4 +9,4 @@ def _init():
_init()
-import Transforms
\ No newline at end of file
+import Transforms, ADT, Support, Assembly, ExecutionEngine, CodeGen, Target
diff --git a/newbinding/namespace.py b/newbinding/src/namespace.py
similarity index 100%
rename from newbinding/namespace.py
rename to newbinding/src/namespace.py
From 168510222fc4d0975635d6b76befaff2ed14dd55 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Mon, 4 Feb 2013 16:45:49 -0600
Subject: [PATCH 143/414] Add Module bitcode writer/parser
---
newbinding/gen/binding.py | 16 ++++++-
newbinding/include/llvm_binding/extra.h | 60 +++++++++++++++++++++++++
newbinding/src/Bitcode/ReaderWriter.py | 30 +++++++++++++
newbinding/src/Bitcode/__init__.py | 10 +++++
newbinding/src/Support/MemoryBuffer.py | 9 ----
newbinding/src/__init__.py | 11 +++--
newbinding/test_binding.py | 16 +++++++
7 files changed, 138 insertions(+), 14 deletions(-)
create mode 100644 newbinding/src/Bitcode/ReaderWriter.py
create mode 100644 newbinding/src/Bitcode/__init__.py
delete mode 100644 newbinding/src/Support/MemoryBuffer.py
diff --git a/newbinding/gen/binding.py b/newbinding/gen/binding.py
index 142c8ef..d9b44af 100644
--- a/newbinding/gen/binding.py
+++ b/newbinding/gen/binding.py
@@ -26,6 +26,11 @@ class Namespace(object):
self.functions.append(fn)
return fn
+ def CustomFunction(self, *args):
+ fn = CustomFunction(self, *args)
+ self.functions.append(fn)
+ return fn
+
def Enum(self, name, *value_names):
enum = Enum(*value_names)
enum.parent = self
@@ -444,13 +449,22 @@ class Function(Method):
with writer.function(self.name, varargs='args') as varargs:
unwrapped = writer.unwrap_many(varargs)
self.process_ownedptr_args(writer, unwrapped)
- func = self.fullname.split('::', 1)[1].replace('::', '.')
+ func = self.name
ret = writer.call('_api.%s' % func,
varargs=unwrapped)
wrapped = writer.wrap(ret, self.is_return_ownedptr())
writer.return_value(wrapped)
writer.println()
+class CustomFunction(Function):
+ def __init__(self, parent, name, realname, return_type=Void, *args):
+ super(CustomFunction, self).__init__(parent, name, return_type, *args)
+ self.realname = realname
+
+ @property
+ def fullname(self):
+ return self.realname
+
class Destructor(Method):
_kind_ = 'dtor'
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h
index c69f177..e8f39cb 100644
--- a/newbinding/include/llvm_binding/extra.h
+++ b/newbinding/include/llvm_binding/extra.h
@@ -3,6 +3,8 @@
#include
#include
#include
+#include
+#include
#include
#include
@@ -405,3 +407,61 @@ PyObject* EngineBuilder_selectTarget(llvm::EngineBuilder* eb,
return pycapsule_new(eb, "llvm::EngineBuilder");
}
+
+static
+PyObject* llvm_ParseBitCodeFile(llvm::StringRef Buf, llvm::LLVMContext& Ctx,
+ PyObject* FObj=NULL)
+{
+ using namespace llvm;
+ MemoryBuffer* MB = MemoryBuffer::getMemBuffer(Buf);
+ Module* M;
+ if (FObj) {
+ std::string ErrStr;
+ M = ParseBitcodeFile(MB, Ctx, &ErrStr);
+ if (-1 == PyFile_WriteString(ErrStr.c_str(), FObj)) {
+ return NULL;
+ }
+ } else {
+ M = ParseBitcodeFile(MB, Ctx);
+ }
+ delete MB;
+ return pycapsule_new(M, "llvm::Module");
+}
+
+
+static
+PyObject* llvm_WriteBitcodeToFile(const llvm::Module *M, PyObject* FObj)
+{
+ using namespace llvm;
+ llvm::SmallVector sv;
+ llvm::raw_svector_ostream rso(sv);
+ llvm::WriteBitcodeToFile(M, rso);
+ rso.flush();
+ StringRef ref = rso.str();
+ PyObject* buf = PyString_FromStringAndSize(ref.data(), ref.size());
+ if (-1 == PyFile_WriteObject(buf, FObj, Py_PRINT_RAW)){
+ return NULL;
+ }
+ Py_RETURN_NONE;
+}
+
+static
+PyObject* llvm_getBitcodeTargetTriple(llvm::StringRef Buf,
+ llvm::LLVMContext& Ctx,
+ PyObject* FObj = NULL)
+{
+ using namespace llvm;
+ MemoryBuffer* MB = MemoryBuffer::getMemBuffer(Buf);
+ std::string Triple;
+ if (FObj) {
+ std::string ErrStr;
+ Triple = getBitcodeTargetTriple(MB, Ctx, &ErrStr);
+ if (-1 == PyFile_WriteString(ErrStr.c_str(), FObj)) {
+ return NULL;
+ }
+ } else {
+ Triple = getBitcodeTargetTriple(MB, Ctx);
+ }
+ delete MB;
+ return PyString_FromString(Triple.c_str());
+}
diff --git a/newbinding/src/Bitcode/ReaderWriter.py b/newbinding/src/Bitcode/ReaderWriter.py
new file mode 100644
index 0000000..a8e8c43
--- /dev/null
+++ b/newbinding/src/Bitcode/ReaderWriter.py
@@ -0,0 +1,30 @@
+from binding import *
+from ..namespace import llvm
+from ..ADT.StringRef import StringRef
+from ..Module import Module
+from ..LLVMContext import LLVMContext
+
+llvm.includes.add('llvm/Bitcode/ReaderWriter.h')
+
+ParseBitCodeFile = llvm.CustomFunction('ParseBitCodeFile',
+ 'llvm_ParseBitCodeFile',
+ PyObjectPtr, # returns Module*
+ cast(str, StringRef),
+ ref(LLVMContext),
+ PyObjectPtr, # file-like object
+ ).require_only(2)
+
+WriteBitcodeToFile = llvm.CustomFunction('WriteBitcodeToFile',
+ 'llvm_WriteBitcodeToFile',
+ PyObjectPtr, # return None
+ ptr(Module),
+ PyObjectPtr, # file-like object
+ )
+
+getBitcodeTargetTriple = llvm.CustomFunction('getBitcodeTargetTriple',
+ 'llvm_getBitcodeTargetTriple',
+ PyObjectPtr, # return str
+ cast(str, StringRef),
+ ref(LLVMContext),
+ PyObjectPtr, # file-like object
+ ).require_only(2)
diff --git a/newbinding/src/Bitcode/__init__.py b/newbinding/src/Bitcode/__init__.py
new file mode 100644
index 0000000..da0beed
--- /dev/null
+++ b/newbinding/src/Bitcode/__init__.py
@@ -0,0 +1,10 @@
+import os.path, importlib
+
+def _init():
+ for fname in os.listdir(os.path.dirname(__file__)):
+ if ((fname.endswith('.py') or fname.endswith('.pyc')) and
+ not fname.startswith('__init__')):
+ modname = os.path.basename(fname).rsplit('.', 1)[0]
+ importlib.import_module('.' + modname, __name__)
+
+_init()
diff --git a/newbinding/src/Support/MemoryBuffer.py b/newbinding/src/Support/MemoryBuffer.py
deleted file mode 100644
index b960fe6..0000000
--- a/newbinding/src/Support/MemoryBuffer.py
+++ /dev/null
@@ -1,9 +0,0 @@
-from binding import *
-from ..namespace import llvm
-
-MemoryBuffer = llvm.Class()
-
-@MemoryBuffer
-class MemoryBuffer:
- _include_ = 'llvm/Support/MemoryBuffer.h'
-
diff --git a/newbinding/src/__init__.py b/newbinding/src/__init__.py
index 8a1b356..98c06fc 100644
--- a/newbinding/src/__init__.py
+++ b/newbinding/src/__init__.py
@@ -1,12 +1,15 @@
import os.path, importlib
def _init():
- for fname in os.listdir(os.path.dirname(__file__)):
- if ((fname.endswith('.py') or fname.endswith('.pyc')) and
- not fname.startswith('__init__')):
+ base = os.path.dirname(__file__)
+ for fname in os.listdir(base):
+ print fname
+ is_python_script = fname.endswith('.py') or fname.endswith('.pyc')
+ is_init_script = fname.startswith('__init__')
+ is_directory = os.path.isdir(os.path.join(base, fname))
+ if (is_directory or is_python_script) and not is_init_script :
modname = os.path.basename(fname).rsplit('.', 1)[0]
importlib.import_module('.' + modname, __name__)
_init()
-import Transforms, ADT, Support, Assembly, ExecutionEngine, CodeGen, Target
diff --git a/newbinding/test_binding.py b/newbinding/test_binding.py
index 248e32a..8a72aef 100644
--- a/newbinding/test_binding.py
+++ b/newbinding/test_binding.py
@@ -135,6 +135,22 @@ def test_basic_jit_use():
assert 44 == gvR.toUnsignedInt()
+ # write bitcode
+ bc_buffer = StringIO()
+ api.WriteBitcodeToFile(m, bc_buffer)
+ bc = bc_buffer.getvalue()
+ bc_buffer.close()
+
+ # read bitcode
+ errbuf = StringIO()
+ m2 = api.ParseBitCodeFile(bc, context, errbuf)
+ if not m2:
+ raise Exception(errbuf.getvalue())
+ else:
+ m2.setModuleIdentifier(m.getModuleIdentifier())
+ assert str(m2) == str(m)
+
+
def test_engine_builder():
api.InitializeNativeTarget()
context = api.getGlobalContext()
From da85049eb9efbb6174dc73e07914e2060fc50f15 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 5 Feb 2013 13:44:59 -0600
Subject: [PATCH 144/414] Add support to emit assembly.
---
newbinding/include/llvm_binding/extra.h | 31 ++++++++++++++++++++
newbinding/src/Support/FormattedStream.py | 9 ++++++
newbinding/src/Support/TargetSelect.py | 9 ++++++
newbinding/src/Support/raw_ostream.py | 1 +
newbinding/src/Target/TargetMachine.py | 17 +++++++++++
newbinding/test_binding.py | 35 +++++++++++++++++++++++
6 files changed, 102 insertions(+)
create mode 100644 newbinding/src/Support/FormattedStream.py
diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h
index e8f39cb..77b399d 100644
--- a/newbinding/include/llvm_binding/extra.h
+++ b/newbinding/include/llvm_binding/extra.h
@@ -3,6 +3,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -465,3 +466,33 @@ PyObject* llvm_getBitcodeTargetTriple(llvm::StringRef Buf,
delete MB;
return PyString_FromString(Triple.c_str());
}
+
+static
+PyObject* TargetMachine_addPassesToEmitFile(
+ llvm::TargetMachine *TM,
+ llvm::PassManagerBase & PM,
+ PyObject* Out,
+ llvm::TargetMachine::CodeGenFileType FTy,
+ bool disableVerify=true)
+{
+ using namespace llvm;
+ llvm::SmallVector sv;
+ raw_svector_ostream rso(sv);
+ formatted_raw_ostream fso(rso);
+ fso.flush();
+ bool status = TM->addPassesToEmitFile(PM, fso, FTy, disableVerify);
+ if (status) {
+ StringRef sr = rso.str();
+ PyObject* buf = PyString_FromStringAndSize(sr.data(), sr.size());
+ if (!buf) {
+ return NULL;
+ }
+ if ( -1 == PyFile_WriteObject(buf, Out, Py_PRINT_RAW) ){
+ return NULL;
+ }
+ Py_RETURN_TRUE;
+ } else {
+ Py_RETURN_FALSE;
+ }
+}
+
diff --git a/newbinding/src/Support/FormattedStream.py b/newbinding/src/Support/FormattedStream.py
new file mode 100644
index 0000000..17c259b
--- /dev/null
+++ b/newbinding/src/Support/FormattedStream.py
@@ -0,0 +1,9 @@
+from binding import *
+from ..namespace import llvm
+from raw_ostream import raw_ostream
+
+@llvm.Class(raw_ostream)
+class formatted_raw_ostream:
+ _include_ = 'llvm/Support/FormattedStream.h'
+ new = Constructor(ref(raw_ostream), cast(bool, Bool))
+
diff --git a/newbinding/src/Support/TargetSelect.py b/newbinding/src/Support/TargetSelect.py
index 4a2b171..208ef4b 100644
--- a/newbinding/src/Support/TargetSelect.py
+++ b/newbinding/src/Support/TargetSelect.py
@@ -6,3 +6,12 @@ llvm.includes.add('llvm/Support/TargetSelect.h')
InitializeNativeTarget = llvm.Function('InitializeNativeTarget')
#llvm.Function('InitializeAllTargets')
+InitializeNativeTargetAsmPrinter = llvm.Function(
+ 'InitializeNativeTargetAsmPrinter', cast(Bool, bool))
+
+InitializeNativeTargetAsmParser = llvm.Function(
+ 'InitializeNativeTargetAsmParser', cast(Bool, bool))
+
+InitializeNativeTargetDisassembler = llvm.Function(
+ 'InitializeNativeTargetDisassembler', cast(Bool, bool))
+
diff --git a/newbinding/src/Support/raw_ostream.py b/newbinding/src/Support/raw_ostream.py
index ecf3614..dcce73f 100644
--- a/newbinding/src/Support/raw_ostream.py
+++ b/newbinding/src/Support/raw_ostream.py
@@ -7,6 +7,7 @@ from ..ADT.StringRef import StringRef
class raw_ostream:
_include_ = "llvm/Support/raw_ostream.h"
delete = Destructor()
+ flush = Method()
@llvm.Class(raw_ostream)
class raw_svector_ostream:
diff --git a/newbinding/src/Target/TargetMachine.py b/newbinding/src/Target/TargetMachine.py
index 3fc16e2..e60ed5c 100644
--- a/newbinding/src/Target/TargetMachine.py
+++ b/newbinding/src/Target/TargetMachine.py
@@ -7,12 +7,20 @@ from ..Support.Target import Target
from ..DataLayout import DataLayout
from ..TargetTransformInfo import (ScalarTargetTransformInfo,
VectorTargetTransformInfo)
+from ..PassManager import PassManagerBase
+from ..Support.FormattedStream import formatted_raw_ostream
TargetMachine = llvm.Class()
@TargetMachine
class TargetMachine:
_include_ = 'llvm/Target/TargetMachine.h'
+
+ CodeGenFileType = Enum('''
+ CGFT_AssemblyFile
+ CGFT_ObjectFile
+ CGFT_Null''')
+
delete = Destructor()
getTarget = Method(const(ref(Target)))
@@ -34,3 +42,12 @@ class TargetMachine:
ownedptr(ScalarTargetTransformInfo)))
getVectorTargetTransformInfo = Method(const(
ownedptr(VectorTargetTransformInfo)))
+
+ addPassesToEmitFile = Method(cast(bool, Bool),
+ ref(PassManagerBase),
+ ref(formatted_raw_ostream),
+ CodeGenFileType,
+ cast(bool, Bool)
+ ).require_only(3)
+
+
diff --git a/newbinding/test_binding.py b/newbinding/test_binding.py
index 8a72aef..1321eb6 100644
--- a/newbinding/test_binding.py
+++ b/newbinding/test_binding.py
@@ -6,6 +6,7 @@ api.capsule.set_debug(True)
def test_basic_jit_use():
api.InitializeNativeTarget()
+ api.InitializeNativeTargetAsmPrinter()
context = api.getGlobalContext()
m = api.Module.new("modname", context)
@@ -157,6 +158,16 @@ def test_engine_builder():
m = api.Module.new("modname", context)
+ int32ty = api.Type.getIntNTy(context, 32)
+ fnty = api.FunctionType.get(int32ty, [int32ty], False)
+ fn = m.getOrInsertFunction("foo", fnty)._downcast(api.Function)
+ bb = api.BasicBlock.Create(context, "entry", fn, None)
+ builder = api.IRBuilder.new(context)
+ builder.SetInsertPoint(bb)
+ builder.CreateRet(fn.getArgumentList()[0])
+
+ print fn
+
eb = api.EngineBuilder.new(m)
eb2 = eb.setEngineKind(api.EngineKind.Kind.JIT)
assert eb is eb2
@@ -192,6 +203,30 @@ def test_engine_builder():
pm.add(api.DataLayout.new(str(tm.getDataLayout())))
pm.add(api.TargetLibraryInfo.new())
+ # write assembly
+ pm = api.PassManager.new()
+ pm.add(api.DataLayout.new(str(tm.getDataLayout())))
+
+ raw = extra.make_raw_ostream_for_printing()
+ formatted = api.formatted_raw_ostream.new(raw, False)
+
+ cgft = api.TargetMachine.CodeGenFileType.CGFT_AssemblyFile
+ failed = tm.addPassesToEmitFile(pm, formatted, cgft, False)
+ assert not failed
+
+ pm.run(m)
+
+ formatted.flush()
+ raw.flush()
+ asm = raw.str()
+ print asm
+ assert 'foo' in asm
+
+
+
+
+
+
def main():
for name, value in globals().items():
From 450c29e0523fbae1b0772147d2490de33affa754 Mon Sep 17 00:00:00 2001
From: Siu Kwan Lam
Date: Tue, 5 Feb 2013 15:30:43 -0600
Subject: [PATCH 145/414] Swap out old llvm code
---
llvm/2.9_update.diff | 2117 -------------------------------------
llvm/__init__.py | 154 ---
llvm/_core.cpp | 2212 ---------------------------------------
llvm/_dwarf.cpp | 86 --
llvm/_dwarf.h | 101 --
llvm/_util.py | 108 --
llvm/_version.py | 193 ----
llvm/capsulethunk.h | 134 ---
llvm/core.py | 2158 +-------------------------------------
llvm/debuginfo.py | 398 -------
llvm/ee.py | 392 -------
llvm/extra.cpp | 1361 ------------------------
llvm/extra.h | 676 ------------
llvm/llvm_c_extra.h | 31 -
llvm/passes.py | 417 --------
llvm/py3k_update.diff | 973 -----------------
llvm/py3k_update.output | 62 --
llvm/tbaa.py | 51 -
llvm/test_llvmpy.py | 1249 ----------------------
llvm/wrap.cpp | 70 --
llvm/wrap.h | 1277 ----------------------
21 files changed, 20 insertions(+), 14200 deletions(-)
delete mode 100644 llvm/2.9_update.diff
delete mode 100644 llvm/_core.cpp
delete mode 100644 llvm/_dwarf.cpp
delete mode 100644 llvm/_dwarf.h
delete mode 100644 llvm/_util.py
delete mode 100644 llvm/_version.py
delete mode 100644 llvm/capsulethunk.h
delete mode 100644 llvm/debuginfo.py
delete mode 100644 llvm/extra.cpp
delete mode 100644 llvm/extra.h
delete mode 100644 llvm/llvm_c_extra.h
delete mode 100644 llvm/py3k_update.diff
delete mode 100644 llvm/py3k_update.output
delete mode 100644 llvm/tbaa.py
delete mode 100644 llvm/test_llvmpy.py
delete mode 100644 llvm/wrap.cpp
delete mode 100644 llvm/wrap.h
diff --git a/llvm/2.9_update.diff b/llvm/2.9_update.diff
deleted file mode 100644
index 5572286..0000000
--- a/llvm/2.9_update.diff
+++ /dev/null
@@ -1,2117 +0,0 @@
-Index: core.py
-===================================================================
---- core.py (revision 105)
-+++ core.py (working copy)
-@@ -51,14 +51,15 @@
- TYPE_FP128 = 4
- TYPE_PPC_FP128 = 5
- TYPE_LABEL = 6
--TYPE_INTEGER = 7
--TYPE_FUNCTION = 8
--TYPE_STRUCT = 9
--TYPE_ARRAY = 10
--TYPE_POINTER = 11
--TYPE_OPAQUE = 12
--TYPE_VECTOR = 13
--TYPE_METADATA = 14
-+TYPE_METADATA = 7
-+TYPE_X86_MMX = 8
-+TYPE_INTEGER = 9
-+TYPE_FUNCTION = 10
-+TYPE_STRUCT = 11
-+TYPE_ARRAY = 12
-+TYPE_POINTER = 13
-+TYPE_OPAQUE = 14
-+TYPE_VECTOR = 15
-
- # value IDs (llvm::Value::ValueTy enum)
- VALUE_ARGUMENT = 0
-@@ -140,11 +141,21 @@
- OPCODE_INSERTVALUE = 54
-
- # calling conventions
--CC_C = 0
--CC_FASTCALL = 8
--CC_COLDCALL = 9
--CC_X86_STDCALL = 64
--CC_X86_FASTCALL = 65
-+CC_C = 0
-+CC_FASTCALL = 8
-+CC_COLDCALL = 9
-+CC_GHC = 10
-+CC_X86_STDCALL = 64
-+CC_X86_FASTCALL = 65
-+CC_ARM_APCS = 66
-+CC_ARM_AAPCS = 67
-+CC_ARM_AAPCS_VFP = 68
-+CC_MSP430_INTR = 69
-+CC_X86_THISCALL = 70
-+CC_PTX_KERNEL = 71
-+CC_PTX_DEVICE = 72
-+CC_MBLAZE_INTR = 73
-+CC_MBLAZE_SVOL = 74
-
- # int predicates
- ICMP_EQ = 32
-@@ -248,11 +259,14 @@
- ATTR_OPTIMIZE_FOR_SIZE = 1<<13
- ATTR_STACK_PROTECT = 1<<14
- ATTR_STACK_PROTECT_REQ = 1<<15
-+ATTR_ALIGNMENT = 1<<16
- ATTR_NO_CAPTURE = 1<<21
- ATTR_NO_REDZONE = 1<<22
- ATTR_NO_IMPLICIT_FLOAT = 1<<23
- ATTR_NAKED = 1<<24
- ATTR_INLINE_HINT = 1<<25
-+ATTR_STACK_ALIGNMENT = 7<<26
-+ATTR_HOTPATCH = 1<<29
-
- # intrinsic IDs
- from llvm._intrinsic_ids import *
-Index: extra.cpp
-===================================================================
---- extra.cpp (revision 105)
-+++ extra.cpp (working copy)
-@@ -54,7 +54,7 @@
- #include "llvm/IntrinsicInst.h"
- #include "llvm/Analysis/Verifier.h"
- #include "llvm/Assembly/Parser.h"
--#include "llvm/System/DynamicLibrary.h"
-+#include "llvm/Support/DynamicLibrary.h"
- #include "llvm/PassManager.h"
- #include "llvm/ExecutionEngine/ExecutionEngine.h"
- #include "llvm/Analysis/LoopPass.h"
-@@ -452,12 +452,19 @@
- return eep->getPointerToFunction(fnp);
- }
-
-+
- int LLVMInlineFunction(LLVMValueRef call)
- {
- llvm::Value *callp = llvm::unwrap(call);
- assert(callp);
-
-- llvm::CallSite cs = llvm::CallSite::get(callp);
-+// llvm::CallSite cs = llvm::CallSite::get(callp);
-+ llvm::CallSite cs;
-+ llvm::Instruction *II = llvm::dyn_cast(callp);
-+ if (II->getOpcode() == llvm::Instruction::Call)
-+ cs = llvm::CallSite(static_cast(II));
-+ else if (II->getOpcode() == llvm::Instruction::Invoke)
-+ cs = llvm::CallSite(static_cast(II));
-
- llvm::InlineFunctionInfo unused;
- return llvm::InlineFunction(cs, unused);
-@@ -501,13 +508,13 @@
- define_pass( DomPrinter )
- define_pass( DomViewer )
- define_pass( EdgeProfiler )
--define_pass( GEPSplitter )
-+//define_pass( GEPSplitter )
- define_pass( GlobalsModRef )
- define_pass( InstCount )
- define_pass( InstructionNamer )
- define_pass( LazyValueInfo )
- define_pass( LCSSA )
--define_pass( LiveValues )
-+//define_pass( LiveValues )
- define_pass( LoopDependenceAnalysis )
- define_pass( LoopExtractor )
- define_pass( LoopSimplify )
-@@ -519,7 +526,7 @@
- define_pass( NoProfileInfo )
- define_pass( OptimalEdgeProfiler )
- define_pass( PartialInlining )
--define_pass( PartialSpecialization )
-+//define_pass( PartialSpecialization )
- define_pass( PostDomOnlyPrinter )
- define_pass( PostDomOnlyViewer )
- define_pass( PostDomPrinter )
-@@ -528,7 +535,7 @@
- define_pass( ProfileLoader )
- define_pass( ProfileVerifier )
- define_pass( ScalarEvolutionAliasAnalysis )
--define_pass( SimplifyHalfPowrLibCalls )
-+//define_pass( SimplifyHalfPowrLibCalls )
- define_pass( SingleLoopExtractor )
- define_pass( StripNonDebugSymbols )
- define_pass( StructRetPromotion )
-Index: passes.py
-===================================================================
---- passes.py (revision 105)
-+++ passes.py (working copy)
-@@ -68,7 +68,7 @@
- PASS_EDGE_PROFILER = 25
- PASS_FUNCTION_ATTRS = 26
- PASS_FUNCTION_INLINING = 27
--PASS_GEP_SPLITTER = 28
-+#PASS_GEP_SPLITTER = 28
- PASS_GLOBAL_DCE = 29
- PASS_GLOBAL_OPTIMIZER = 30
- PASS_GLOBALS_MOD_REF = 31
-@@ -83,11 +83,11 @@
- PASS_LAZY_VALUE_INFO = 40
- PASS_LCSSA = 41
- PASS_LICM = 42
--PASS_LIVE_VALUES = 43
-+#PASS_LIVE_VALUES = 43
- PASS_LOOP_DELETION = 44
- PASS_LOOP_DEPENDENCE_ANALYSIS = 45
- PASS_LOOP_EXTRACTOR = 46
--PASS_LOOP_INDEX_SPLIT = 47
-+#PASS_LOOP_INDEX_SPLIT = 47
- PASS_LOOP_ROTATE = 48
- PASS_LOOP_SIMPLIFY = 49
- PASS_LOOP_STRENGTH_REDUCE = 50
-@@ -102,11 +102,11 @@
- PASS_NO_PROFILE_INFO = 59
- PASS_OPTIMAL_EDGE_PROFILER = 60
- PASS_PARTIAL_INLINING = 61
--PASS_PARTIAL_SPECIALIZATION = 62
--PASS_POST_DOM_ONLY_PRINTER = 63
--PASS_POST_DOM_ONLY_VIEWER = 64
--PASS_POST_DOM_PRINTER = 65
--PASS_POST_DOM_VIEWER = 66
-+#PASS_PARTIAL_SPECIALIZATION = 62
-+#PASS_POST_DOM_ONLY_PRINTER = 63
-+#PASS_POST_DOM_ONLY_VIEWER = 64
-+#PASS_POST_DOM_PRINTER = 65
-+#PASS_POST_DOM_VIEWER = 66
- PASS_PROFILE_ESTIMATOR = 67
- PASS_PROFILE_LOADER = 68
- PASS_PROFILE_VERIFIER = 69
-@@ -116,7 +116,7 @@
- PASS_SCALAR_EVOLUTION_ALIAS_ANALYSIS = 73
- PASS_SCALAR_REPL_AGGREGATES = 74
- PASS_SCCP = 76
--PASS_SIMPLIFY_HALF_POWR_LIB_CALLS = 77
-+#PASS_SIMPLIFY_HALF_POWR_LIB_CALLS = 77
- PASS_SIMPLIFY_LIB_CALLS = 78
- PASS_SINGLE_LOOP_EXTRACTOR = 79
- PASS_STRIP_DEAD_PROTOTYPES = 82
-@@ -161,7 +161,7 @@
- PASS_EDGE_PROFILER : _core.LLVMAddEdgeProfilerPass,
- PASS_FUNCTION_ATTRS : _core.LLVMAddFunctionAttrsPass,
- PASS_FUNCTION_INLINING : _core.LLVMAddFunctionInliningPass,
-- PASS_GEP_SPLITTER : _core.LLVMAddGEPSplitterPass,
-+ #PASS_GEP_SPLITTER : _core.LLVMAddGEPSplitterPass,
- PASS_GLOBAL_DCE : _core.LLVMAddGlobalDCEPass,
- PASS_GLOBAL_OPTIMIZER : _core.LLVMAddGlobalOptimizerPass,
- PASS_GLOBALS_MOD_REF : _core.LLVMAddGlobalsModRefPass,
-@@ -176,11 +176,11 @@
- PASS_LAZY_VALUE_INFO : _core.LLVMAddLazyValueInfoPass,
- PASS_LCSSA : _core.LLVMAddLCSSAPass,
- PASS_LICM : _core.LLVMAddLICMPass,
-- PASS_LIVE_VALUES : _core.LLVMAddLiveValuesPass,
-+ #PASS_LIVE_VALUES : _core.LLVMAddLiveValuesPass,
- PASS_LOOP_DELETION : _core.LLVMAddLoopDeletionPass,
- PASS_LOOP_DEPENDENCE_ANALYSIS : _core.LLVMAddLoopDependenceAnalysisPass,
- PASS_LOOP_EXTRACTOR : _core.LLVMAddLoopExtractorPass,
-- PASS_LOOP_INDEX_SPLIT : _core.LLVMAddLoopIndexSplitPass,
-+ #PASS_LOOP_INDEX_SPLIT : _core.LLVMAddLoopIndexSplitPass,
- PASS_LOOP_ROTATE : _core.LLVMAddLoopRotatePass,
- PASS_LOOP_SIMPLIFY : _core.LLVMAddLoopSimplifyPass,
- PASS_LOOP_STRENGTH_REDUCE : _core.LLVMAddLoopStrengthReducePass,
-@@ -195,11 +195,11 @@
- PASS_NO_PROFILE_INFO : _core.LLVMAddNoProfileInfoPass,
- PASS_OPTIMAL_EDGE_PROFILER : _core.LLVMAddOptimalEdgeProfilerPass,
- PASS_PARTIAL_INLINING : _core.LLVMAddPartialInliningPass,
-- PASS_PARTIAL_SPECIALIZATION : _core.LLVMAddPartialSpecializationPass,
-- PASS_POST_DOM_ONLY_PRINTER : _core.LLVMAddPostDomOnlyPrinterPass,
-- PASS_POST_DOM_ONLY_VIEWER : _core.LLVMAddPostDomOnlyViewerPass,
-- PASS_POST_DOM_PRINTER : _core.LLVMAddPostDomPrinterPass,
-- PASS_POST_DOM_VIEWER : _core.LLVMAddPostDomViewerPass,
-+ #PASS_PARTIAL_SPECIALIZATION : _core.LLVMAddPartialSpecializationPass,
-+ #PASS_POST_DOM_ONLY_PRINTER : _core.LLVMAddPostDomOnlyPrinterPass,
-+ #PASS_POST_DOM_ONLY_VIEWER : _core.LLVMAddPostDomOnlyViewerPass,
-+ #PASS_POST_DOM_PRINTER : _core.LLVMAddPostDomPrinterPass,
-+ #PASS_POST_DOM_VIEWER : _core.LLVMAddPostDomViewerPass,
- PASS_PROFILE_ESTIMATOR : _core.LLVMAddProfileEstimatorPass,
- PASS_PROFILE_LOADER : _core.LLVMAddProfileLoaderPass,
- PASS_PROFILE_VERIFIER : _core.LLVMAddProfileVerifierPass,
-@@ -209,7 +209,7 @@
- PASS_SCALAR_EVOLUTION_ALIAS_ANALYSIS : _core.LLVMAddScalarEvolutionAliasAnalysisPass,
- PASS_SCALAR_REPL_AGGREGATES : _core.LLVMAddScalarReplAggregatesPass,
- PASS_SCCP : _core.LLVMAddSCCPPass,
-- PASS_SIMPLIFY_HALF_POWR_LIB_CALLS : _core.LLVMAddSimplifyHalfPowrLibCallsPass,
-+ #PASS_SIMPLIFY_HALF_POWR_LIB_CALLS : _core.LLVMAddSimplifyHalfPowrLibCallsPass,
- PASS_SIMPLIFY_LIB_CALLS : _core.LLVMAddSimplifyLibCallsPass,
- PASS_SINGLE_LOOP_EXTRACTOR : _core.LLVMAddSingleLoopExtractorPass,
- PASS_STRIP_DEAD_PROTOTYPES : _core.LLVMAddStripDeadPrototypesPass,
-Index: _intrinsic_ids.py
-===================================================================
---- _intrinsic_ids.py (revision 105)
-+++ _intrinsic_ids.py (working copy)
-@@ -49,854 +49,879 @@
- INTR_ARM_NEON_VCNT = 14
- INTR_ARM_NEON_VCVTFP2FXS = 15
- INTR_ARM_NEON_VCVTFP2FXU = 16
--INTR_ARM_NEON_VCVTFXS2FP = 17
--INTR_ARM_NEON_VCVTFXU2FP = 18
--INTR_ARM_NEON_VHADDS = 19
--INTR_ARM_NEON_VHADDU = 20
--INTR_ARM_NEON_VHSUBS = 21
--INTR_ARM_NEON_VHSUBU = 22
--INTR_ARM_NEON_VLD1 = 23
--INTR_ARM_NEON_VLD2 = 24
--INTR_ARM_NEON_VLD2LANE = 25
--INTR_ARM_NEON_VLD3 = 26
--INTR_ARM_NEON_VLD3LANE = 27
--INTR_ARM_NEON_VLD4 = 28
--INTR_ARM_NEON_VLD4LANE = 29
--INTR_ARM_NEON_VMAXS = 30
--INTR_ARM_NEON_VMAXU = 31
--INTR_ARM_NEON_VMINS = 32
--INTR_ARM_NEON_VMINU = 33
--INTR_ARM_NEON_VMULLP = 34
--INTR_ARM_NEON_VMULP = 35
--INTR_ARM_NEON_VPADALS = 36
--INTR_ARM_NEON_VPADALU = 37
--INTR_ARM_NEON_VPADD = 38
--INTR_ARM_NEON_VPADDLS = 39
--INTR_ARM_NEON_VPADDLU = 40
--INTR_ARM_NEON_VPMAXS = 41
--INTR_ARM_NEON_VPMAXU = 42
--INTR_ARM_NEON_VPMINS = 43
--INTR_ARM_NEON_VPMINU = 44
--INTR_ARM_NEON_VQABS = 45
--INTR_ARM_NEON_VQADDS = 46
--INTR_ARM_NEON_VQADDU = 47
--INTR_ARM_NEON_VQDMLAL = 48
--INTR_ARM_NEON_VQDMLSL = 49
--INTR_ARM_NEON_VQDMULH = 50
--INTR_ARM_NEON_VQDMULL = 51
--INTR_ARM_NEON_VQMOVNS = 52
--INTR_ARM_NEON_VQMOVNSU = 53
--INTR_ARM_NEON_VQMOVNU = 54
--INTR_ARM_NEON_VQNEG = 55
--INTR_ARM_NEON_VQRDMULH = 56
--INTR_ARM_NEON_VQRSHIFTNS = 57
--INTR_ARM_NEON_VQRSHIFTNSU = 58
--INTR_ARM_NEON_VQRSHIFTNU = 59
--INTR_ARM_NEON_VQRSHIFTS = 60
--INTR_ARM_NEON_VQRSHIFTU = 61
--INTR_ARM_NEON_VQSHIFTNS = 62
--INTR_ARM_NEON_VQSHIFTNSU = 63
--INTR_ARM_NEON_VQSHIFTNU = 64
--INTR_ARM_NEON_VQSHIFTS = 65
--INTR_ARM_NEON_VQSHIFTSU = 66
--INTR_ARM_NEON_VQSHIFTU = 67
--INTR_ARM_NEON_VQSUBS = 68
--INTR_ARM_NEON_VQSUBU = 69
--INTR_ARM_NEON_VRADDHN = 70
--INTR_ARM_NEON_VRECPE = 71
--INTR_ARM_NEON_VRECPS = 72
--INTR_ARM_NEON_VRHADDS = 73
--INTR_ARM_NEON_VRHADDU = 74
--INTR_ARM_NEON_VRSHIFTN = 75
--INTR_ARM_NEON_VRSHIFTS = 76
--INTR_ARM_NEON_VRSHIFTU = 77
--INTR_ARM_NEON_VRSQRTE = 78
--INTR_ARM_NEON_VRSQRTS = 79
--INTR_ARM_NEON_VRSUBHN = 80
--INTR_ARM_NEON_VSHIFTINS = 81
--INTR_ARM_NEON_VSHIFTLS = 82
--INTR_ARM_NEON_VSHIFTLU = 83
--INTR_ARM_NEON_VSHIFTN = 84
--INTR_ARM_NEON_VSHIFTS = 85
--INTR_ARM_NEON_VSHIFTU = 86
--INTR_ARM_NEON_VST1 = 87
--INTR_ARM_NEON_VST2 = 88
--INTR_ARM_NEON_VST2LANE = 89
--INTR_ARM_NEON_VST3 = 90
--INTR_ARM_NEON_VST3LANE = 91
--INTR_ARM_NEON_VST4 = 92
--INTR_ARM_NEON_VST4LANE = 93
--INTR_ARM_NEON_VSUBHN = 94
--INTR_ARM_NEON_VTBL1 = 95
--INTR_ARM_NEON_VTBL2 = 96
--INTR_ARM_NEON_VTBL3 = 97
--INTR_ARM_NEON_VTBL4 = 98
--INTR_ARM_NEON_VTBX1 = 99
--INTR_ARM_NEON_VTBX2 = 100
--INTR_ARM_NEON_VTBX3 = 101
--INTR_ARM_NEON_VTBX4 = 102
--INTR_ARM_QADD = 103
--INTR_ARM_QSUB = 104
--INTR_ARM_SET_FPSCR = 105
--INTR_ARM_SSAT = 106
--INTR_ARM_THREAD_POINTER = 107
--INTR_ARM_USAT = 108
--INTR_ARM_VCVTR = 109
--INTR_ARM_VCVTRU = 110
--INTR_ATOMIC_CMP_SWAP = 111
--INTR_ATOMIC_LOAD_ADD = 112
--INTR_ATOMIC_LOAD_AND = 113
--INTR_ATOMIC_LOAD_MAX = 114
--INTR_ATOMIC_LOAD_MIN = 115
--INTR_ATOMIC_LOAD_NAND = 116
--INTR_ATOMIC_LOAD_OR = 117
--INTR_ATOMIC_LOAD_SUB = 118
--INTR_ATOMIC_LOAD_UMAX = 119
--INTR_ATOMIC_LOAD_UMIN = 120
--INTR_ATOMIC_LOAD_XOR = 121
--INTR_ATOMIC_SWAP = 122
--INTR_BSWAP = 123
--INTR_CONVERT_FROM_FP16 = 124
--INTR_CONVERT_TO_FP16 = 125
--INTR_CONVERTFF = 126
--INTR_CONVERTFSI = 127
--INTR_CONVERTFUI = 128
--INTR_CONVERTSIF = 129
--INTR_CONVERTSS = 130
--INTR_CONVERTSU = 131
--INTR_CONVERTUIF = 132
--INTR_CONVERTUS = 133
--INTR_CONVERTUU = 134
--INTR_COS = 135
--INTR_CTLZ = 136
--INTR_CTPOP = 137
--INTR_CTTZ = 138
--INTR_DBG_DECLARE = 139
--INTR_DBG_VALUE = 140
--INTR_EH_DWARF_CFA = 141
--INTR_EH_EXCEPTION = 142
--INTR_EH_RETURN_I32 = 143
--INTR_EH_RETURN_I64 = 144
--INTR_EH_SELECTOR = 145
--INTR_EH_SJLJ_CALLSITE = 146
--INTR_EH_SJLJ_LONGJMP = 147
--INTR_EH_SJLJ_LSDA = 148
--INTR_EH_SJLJ_SETJMP = 149
--INTR_EH_TYPEID_FOR = 150
--INTR_EH_UNWIND_INIT = 151
--INTR_EXP = 152
--INTR_EXP2 = 153
--INTR_FLT_ROUNDS = 154
--INTR_FRAMEADDRESS = 155
--INTR_GCREAD = 156
--INTR_GCROOT = 157
--INTR_GCWRITE = 158
--INTR_INIT_TRAMPOLINE = 159
--INTR_INVARIANT_END = 160
--INTR_INVARIANT_START = 161
--INTR_LIFETIME_END = 162
--INTR_LIFETIME_START = 163
--INTR_LOG = 164
--INTR_LOG10 = 165
--INTR_LOG2 = 166
--INTR_LONGJMP = 167
--INTR_MEMCPY = 168
--INTR_MEMMOVE = 169
--INTR_MEMORY_BARRIER = 170
--INTR_MEMSET = 171
--INTR_OBJECTSIZE = 172
--INTR_PCMARKER = 173
--INTR_POW = 174
--INTR_POWI = 175
--INTR_PPC_ALTIVEC_DSS = 176
--INTR_PPC_ALTIVEC_DSSALL = 177
--INTR_PPC_ALTIVEC_DST = 178
--INTR_PPC_ALTIVEC_DSTST = 179
--INTR_PPC_ALTIVEC_DSTSTT = 180
--INTR_PPC_ALTIVEC_DSTT = 181
--INTR_PPC_ALTIVEC_LVEBX = 182
--INTR_PPC_ALTIVEC_LVEHX = 183
--INTR_PPC_ALTIVEC_LVEWX = 184
--INTR_PPC_ALTIVEC_LVSL = 185
--INTR_PPC_ALTIVEC_LVSR = 186
--INTR_PPC_ALTIVEC_LVX = 187
--INTR_PPC_ALTIVEC_LVXL = 188
--INTR_PPC_ALTIVEC_MFVSCR = 189
--INTR_PPC_ALTIVEC_MTVSCR = 190
--INTR_PPC_ALTIVEC_STVEBX = 191
--INTR_PPC_ALTIVEC_STVEHX = 192
--INTR_PPC_ALTIVEC_STVEWX = 193
--INTR_PPC_ALTIVEC_STVX = 194
--INTR_PPC_ALTIVEC_STVXL = 195
--INTR_PPC_ALTIVEC_VADDCUW = 196
--INTR_PPC_ALTIVEC_VADDSBS = 197
--INTR_PPC_ALTIVEC_VADDSHS = 198
--INTR_PPC_ALTIVEC_VADDSWS = 199
--INTR_PPC_ALTIVEC_VADDUBS = 200
--INTR_PPC_ALTIVEC_VADDUHS = 201
--INTR_PPC_ALTIVEC_VADDUWS = 202
--INTR_PPC_ALTIVEC_VAVGSB = 203
--INTR_PPC_ALTIVEC_VAVGSH = 204
--INTR_PPC_ALTIVEC_VAVGSW = 205
--INTR_PPC_ALTIVEC_VAVGUB = 206
--INTR_PPC_ALTIVEC_VAVGUH = 207
--INTR_PPC_ALTIVEC_VAVGUW = 208
--INTR_PPC_ALTIVEC_VCFSX = 209
--INTR_PPC_ALTIVEC_VCFUX = 210
--INTR_PPC_ALTIVEC_VCMPBFP = 211
--INTR_PPC_ALTIVEC_VCMPBFP_P = 212
--INTR_PPC_ALTIVEC_VCMPEQFP = 213
--INTR_PPC_ALTIVEC_VCMPEQFP_P = 214
--INTR_PPC_ALTIVEC_VCMPEQUB = 215
--INTR_PPC_ALTIVEC_VCMPEQUB_P = 216
--INTR_PPC_ALTIVEC_VCMPEQUH = 217
--INTR_PPC_ALTIVEC_VCMPEQUH_P = 218
--INTR_PPC_ALTIVEC_VCMPEQUW = 219
--INTR_PPC_ALTIVEC_VCMPEQUW_P = 220
--INTR_PPC_ALTIVEC_VCMPGEFP = 221
--INTR_PPC_ALTIVEC_VCMPGEFP_P = 222
--INTR_PPC_ALTIVEC_VCMPGTFP = 223
--INTR_PPC_ALTIVEC_VCMPGTFP_P = 224
--INTR_PPC_ALTIVEC_VCMPGTSB = 225
--INTR_PPC_ALTIVEC_VCMPGTSB_P = 226
--INTR_PPC_ALTIVEC_VCMPGTSH = 227
--INTR_PPC_ALTIVEC_VCMPGTSH_P = 228
--INTR_PPC_ALTIVEC_VCMPGTSW = 229
--INTR_PPC_ALTIVEC_VCMPGTSW_P = 230
--INTR_PPC_ALTIVEC_VCMPGTUB = 231
--INTR_PPC_ALTIVEC_VCMPGTUB_P = 232
--INTR_PPC_ALTIVEC_VCMPGTUH = 233
--INTR_PPC_ALTIVEC_VCMPGTUH_P = 234
--INTR_PPC_ALTIVEC_VCMPGTUW = 235
--INTR_PPC_ALTIVEC_VCMPGTUW_P = 236
--INTR_PPC_ALTIVEC_VCTSXS = 237
--INTR_PPC_ALTIVEC_VCTUXS = 238
--INTR_PPC_ALTIVEC_VEXPTEFP = 239
--INTR_PPC_ALTIVEC_VLOGEFP = 240
--INTR_PPC_ALTIVEC_VMADDFP = 241
--INTR_PPC_ALTIVEC_VMAXFP = 242
--INTR_PPC_ALTIVEC_VMAXSB = 243
--INTR_PPC_ALTIVEC_VMAXSH = 244
--INTR_PPC_ALTIVEC_VMAXSW = 245
--INTR_PPC_ALTIVEC_VMAXUB = 246
--INTR_PPC_ALTIVEC_VMAXUH = 247
--INTR_PPC_ALTIVEC_VMAXUW = 248
--INTR_PPC_ALTIVEC_VMHADDSHS = 249
--INTR_PPC_ALTIVEC_VMHRADDSHS = 250
--INTR_PPC_ALTIVEC_VMINFP = 251
--INTR_PPC_ALTIVEC_VMINSB = 252
--INTR_PPC_ALTIVEC_VMINSH = 253
--INTR_PPC_ALTIVEC_VMINSW = 254
--INTR_PPC_ALTIVEC_VMINUB = 255
--INTR_PPC_ALTIVEC_VMINUH = 256
--INTR_PPC_ALTIVEC_VMINUW = 257
--INTR_PPC_ALTIVEC_VMLADDUHM = 258
--INTR_PPC_ALTIVEC_VMSUMMBM = 259
--INTR_PPC_ALTIVEC_VMSUMSHM = 260
--INTR_PPC_ALTIVEC_VMSUMSHS = 261
--INTR_PPC_ALTIVEC_VMSUMUBM = 262
--INTR_PPC_ALTIVEC_VMSUMUHM = 263
--INTR_PPC_ALTIVEC_VMSUMUHS = 264
--INTR_PPC_ALTIVEC_VMULESB = 265
--INTR_PPC_ALTIVEC_VMULESH = 266
--INTR_PPC_ALTIVEC_VMULEUB = 267
--INTR_PPC_ALTIVEC_VMULEUH = 268
--INTR_PPC_ALTIVEC_VMULOSB = 269
--INTR_PPC_ALTIVEC_VMULOSH = 270
--INTR_PPC_ALTIVEC_VMULOUB = 271
--INTR_PPC_ALTIVEC_VMULOUH = 272
--INTR_PPC_ALTIVEC_VNMSUBFP = 273
--INTR_PPC_ALTIVEC_VPERM = 274
--INTR_PPC_ALTIVEC_VPKPX = 275
--INTR_PPC_ALTIVEC_VPKSHSS = 276
--INTR_PPC_ALTIVEC_VPKSHUS = 277
--INTR_PPC_ALTIVEC_VPKSWSS = 278
--INTR_PPC_ALTIVEC_VPKSWUS = 279
--INTR_PPC_ALTIVEC_VPKUHUS = 280
--INTR_PPC_ALTIVEC_VPKUWUS = 281
--INTR_PPC_ALTIVEC_VREFP = 282
--INTR_PPC_ALTIVEC_VRFIM = 283
--INTR_PPC_ALTIVEC_VRFIN = 284
--INTR_PPC_ALTIVEC_VRFIP = 285
--INTR_PPC_ALTIVEC_VRFIZ = 286
--INTR_PPC_ALTIVEC_VRLB = 287
--INTR_PPC_ALTIVEC_VRLH = 288
--INTR_PPC_ALTIVEC_VRLW = 289
--INTR_PPC_ALTIVEC_VRSQRTEFP = 290
--INTR_PPC_ALTIVEC_VSEL = 291
--INTR_PPC_ALTIVEC_VSL = 292
--INTR_PPC_ALTIVEC_VSLB = 293
--INTR_PPC_ALTIVEC_VSLH = 294
--INTR_PPC_ALTIVEC_VSLO = 295
--INTR_PPC_ALTIVEC_VSLW = 296
--INTR_PPC_ALTIVEC_VSR = 297
--INTR_PPC_ALTIVEC_VSRAB = 298
--INTR_PPC_ALTIVEC_VSRAH = 299
--INTR_PPC_ALTIVEC_VSRAW = 300
--INTR_PPC_ALTIVEC_VSRB = 301
--INTR_PPC_ALTIVEC_VSRH = 302
--INTR_PPC_ALTIVEC_VSRO = 303
--INTR_PPC_ALTIVEC_VSRW = 304
--INTR_PPC_ALTIVEC_VSUBCUW = 305
--INTR_PPC_ALTIVEC_VSUBSBS = 306
--INTR_PPC_ALTIVEC_VSUBSHS = 307
--INTR_PPC_ALTIVEC_VSUBSWS = 308
--INTR_PPC_ALTIVEC_VSUBUBS = 309
--INTR_PPC_ALTIVEC_VSUBUHS = 310
--INTR_PPC_ALTIVEC_VSUBUWS = 311
--INTR_PPC_ALTIVEC_VSUM2SWS = 312
--INTR_PPC_ALTIVEC_VSUM4SBS = 313
--INTR_PPC_ALTIVEC_VSUM4SHS = 314
--INTR_PPC_ALTIVEC_VSUM4UBS = 315
--INTR_PPC_ALTIVEC_VSUMSWS = 316
--INTR_PPC_ALTIVEC_VUPKHPX = 317
--INTR_PPC_ALTIVEC_VUPKHSB = 318
--INTR_PPC_ALTIVEC_VUPKHSH = 319
--INTR_PPC_ALTIVEC_VUPKLPX = 320
--INTR_PPC_ALTIVEC_VUPKLSB = 321
--INTR_PPC_ALTIVEC_VUPKLSH = 322
--INTR_PPC_DCBA = 323
--INTR_PPC_DCBF = 324
--INTR_PPC_DCBI = 325
--INTR_PPC_DCBST = 326
--INTR_PPC_DCBT = 327
--INTR_PPC_DCBTST = 328
--INTR_PPC_DCBZ = 329
--INTR_PPC_DCBZL = 330
--INTR_PPC_SYNC = 331
--INTR_PREFETCH = 332
--INTR_PTR_ANNOTATION = 333
--INTR_READCYCLECOUNTER = 334
--INTR_RETURNADDRESS = 335
--INTR_SADD_WITH_OVERFLOW = 336
--INTR_SETJMP = 337
--INTR_SIGLONGJMP = 338
--INTR_SIGSETJMP = 339
--INTR_SIN = 340
--INTR_SMUL_WITH_OVERFLOW = 341
--INTR_SPU_SI_A = 342
--INTR_SPU_SI_ADDX = 343
--INTR_SPU_SI_AH = 344
--INTR_SPU_SI_AHI = 345
--INTR_SPU_SI_AI = 346
--INTR_SPU_SI_AND = 347
--INTR_SPU_SI_ANDBI = 348
--INTR_SPU_SI_ANDC = 349
--INTR_SPU_SI_ANDHI = 350
--INTR_SPU_SI_ANDI = 351
--INTR_SPU_SI_BG = 352
--INTR_SPU_SI_BGX = 353
--INTR_SPU_SI_CEQ = 354
--INTR_SPU_SI_CEQB = 355
--INTR_SPU_SI_CEQBI = 356
--INTR_SPU_SI_CEQH = 357
--INTR_SPU_SI_CEQHI = 358
--INTR_SPU_SI_CEQI = 359
--INTR_SPU_SI_CG = 360
--INTR_SPU_SI_CGT = 361
--INTR_SPU_SI_CGTB = 362
--INTR_SPU_SI_CGTBI = 363
--INTR_SPU_SI_CGTH = 364
--INTR_SPU_SI_CGTHI = 365
--INTR_SPU_SI_CGTI = 366
--INTR_SPU_SI_CGX = 367
--INTR_SPU_SI_CLGT = 368
--INTR_SPU_SI_CLGTB = 369
--INTR_SPU_SI_CLGTBI = 370
--INTR_SPU_SI_CLGTH = 371
--INTR_SPU_SI_CLGTHI = 372
--INTR_SPU_SI_CLGTI = 373
--INTR_SPU_SI_DFA = 374
--INTR_SPU_SI_DFM = 375
--INTR_SPU_SI_DFMA = 376
--INTR_SPU_SI_DFMS = 377
--INTR_SPU_SI_DFNMA = 378
--INTR_SPU_SI_DFNMS = 379
--INTR_SPU_SI_DFS = 380
--INTR_SPU_SI_FA = 381
--INTR_SPU_SI_FCEQ = 382
--INTR_SPU_SI_FCGT = 383
--INTR_SPU_SI_FCMEQ = 384
--INTR_SPU_SI_FCMGT = 385
--INTR_SPU_SI_FM = 386
--INTR_SPU_SI_FMA = 387
--INTR_SPU_SI_FMS = 388
--INTR_SPU_SI_FNMS = 389
--INTR_SPU_SI_FS = 390
--INTR_SPU_SI_FSMBI = 391
--INTR_SPU_SI_MPY = 392
--INTR_SPU_SI_MPYA = 393
--INTR_SPU_SI_MPYH = 394
--INTR_SPU_SI_MPYHH = 395
--INTR_SPU_SI_MPYHHA = 396
--INTR_SPU_SI_MPYHHAU = 397
--INTR_SPU_SI_MPYHHU = 398
--INTR_SPU_SI_MPYI = 399
--INTR_SPU_SI_MPYS = 400
--INTR_SPU_SI_MPYU = 401
--INTR_SPU_SI_MPYUI = 402
--INTR_SPU_SI_NAND = 403
--INTR_SPU_SI_NOR = 404
--INTR_SPU_SI_OR = 405
--INTR_SPU_SI_ORBI = 406
--INTR_SPU_SI_ORC = 407
--INTR_SPU_SI_ORHI = 408
--INTR_SPU_SI_ORI = 409
--INTR_SPU_SI_SF = 410
--INTR_SPU_SI_SFH = 411
--INTR_SPU_SI_SFHI = 412
--INTR_SPU_SI_SFI = 413
--INTR_SPU_SI_SFX = 414
--INTR_SPU_SI_SHLI = 415
--INTR_SPU_SI_SHLQBI = 416
--INTR_SPU_SI_SHLQBII = 417
--INTR_SPU_SI_SHLQBY = 418
--INTR_SPU_SI_SHLQBYI = 419
--INTR_SPU_SI_XOR = 420
--INTR_SPU_SI_XORBI = 421
--INTR_SPU_SI_XORHI = 422
--INTR_SPU_SI_XORI = 423
--INTR_SQRT = 424
--INTR_SSUB_WITH_OVERFLOW = 425
--INTR_STACKPROTECTOR = 426
--INTR_STACKRESTORE = 427
--INTR_STACKSAVE = 428
--INTR_TRAP = 429
--INTR_UADD_WITH_OVERFLOW = 430
--INTR_UMUL_WITH_OVERFLOW = 431
--INTR_USUB_WITH_OVERFLOW = 432
--INTR_VACOPY = 433
--INTR_VAEND = 434
--INTR_VAR_ANNOTATION = 435
--INTR_VASTART = 436
--INTR_X86_AESNI_AESDEC = 437
--INTR_X86_AESNI_AESDECLAST = 438
--INTR_X86_AESNI_AESENC = 439
--INTR_X86_AESNI_AESENCLAST = 440
--INTR_X86_AESNI_AESIMC = 441
--INTR_X86_AESNI_AESKEYGENASSIST = 442
--INTR_X86_AVX_ADDSUB_PD_256 = 443
--INTR_X86_AVX_ADDSUB_PS_256 = 444
--INTR_X86_AVX_BLEND_PD_256 = 445
--INTR_X86_AVX_BLEND_PS_256 = 446
--INTR_X86_AVX_BLENDV_PD_256 = 447
--INTR_X86_AVX_BLENDV_PS_256 = 448
--INTR_X86_AVX_CMP_PD_256 = 449
--INTR_X86_AVX_CMP_PS_256 = 450
--INTR_X86_AVX_CVT_PD2_PS_256 = 451
--INTR_X86_AVX_CVT_PD2DQ_256 = 452
--INTR_X86_AVX_CVT_PS2_PD_256 = 453
--INTR_X86_AVX_CVT_PS2DQ_256 = 454
--INTR_X86_AVX_CVTDQ2_PD_256 = 455
--INTR_X86_AVX_CVTDQ2_PS_256 = 456
--INTR_X86_AVX_CVTT_PD2DQ_256 = 457
--INTR_X86_AVX_CVTT_PS2DQ_256 = 458
--INTR_X86_AVX_DP_PS_256 = 459
--INTR_X86_AVX_HADD_PD_256 = 460
--INTR_X86_AVX_HADD_PS_256 = 461
--INTR_X86_AVX_HSUB_PD_256 = 462
--INTR_X86_AVX_HSUB_PS_256 = 463
--INTR_X86_AVX_LDU_DQ_256 = 464
--INTR_X86_AVX_LOADU_DQ_256 = 465
--INTR_X86_AVX_LOADU_PD_256 = 466
--INTR_X86_AVX_LOADU_PS_256 = 467
--INTR_X86_AVX_MASKLOAD_PD = 468
--INTR_X86_AVX_MASKLOAD_PD_256 = 469
--INTR_X86_AVX_MASKLOAD_PS = 470
--INTR_X86_AVX_MASKLOAD_PS_256 = 471
--INTR_X86_AVX_MASKSTORE_PD = 472
--INTR_X86_AVX_MASKSTORE_PD_256 = 473
--INTR_X86_AVX_MASKSTORE_PS = 474
--INTR_X86_AVX_MASKSTORE_PS_256 = 475
--INTR_X86_AVX_MAX_PD_256 = 476
--INTR_X86_AVX_MAX_PS_256 = 477
--INTR_X86_AVX_MIN_PD_256 = 478
--INTR_X86_AVX_MIN_PS_256 = 479
--INTR_X86_AVX_MOVMSK_PD_256 = 480
--INTR_X86_AVX_MOVMSK_PS_256 = 481
--INTR_X86_AVX_MOVNT_DQ_256 = 482
--INTR_X86_AVX_MOVNT_PD_256 = 483
--INTR_X86_AVX_MOVNT_PS_256 = 484
--INTR_X86_AVX_PTESTC_256 = 485
--INTR_X86_AVX_PTESTNZC_256 = 486
--INTR_X86_AVX_PTESTZ_256 = 487
--INTR_X86_AVX_RCP_PS_256 = 488
--INTR_X86_AVX_ROUND_PD_256 = 489
--INTR_X86_AVX_ROUND_PS_256 = 490
--INTR_X86_AVX_RSQRT_PS_256 = 491
--INTR_X86_AVX_SQRT_PD_256 = 492
--INTR_X86_AVX_SQRT_PS_256 = 493
--INTR_X86_AVX_STOREU_DQ_256 = 494
--INTR_X86_AVX_STOREU_PD_256 = 495
--INTR_X86_AVX_STOREU_PS_256 = 496
--INTR_X86_AVX_VBROADCAST_SD_256 = 497
--INTR_X86_AVX_VBROADCASTF128_PD_256 = 498
--INTR_X86_AVX_VBROADCASTF128_PS_256 = 499
--INTR_X86_AVX_VBROADCASTSS = 500
--INTR_X86_AVX_VBROADCASTSS_256 = 501
--INTR_X86_AVX_VEXTRACTF128_PD_256 = 502
--INTR_X86_AVX_VEXTRACTF128_PS_256 = 503
--INTR_X86_AVX_VEXTRACTF128_SI_256 = 504
--INTR_X86_AVX_VINSERTF128_PD_256 = 505
--INTR_X86_AVX_VINSERTF128_PS_256 = 506
--INTR_X86_AVX_VINSERTF128_SI_256 = 507
--INTR_X86_AVX_VPERM2F128_PD_256 = 508
--INTR_X86_AVX_VPERM2F128_PS_256 = 509
--INTR_X86_AVX_VPERM2F128_SI_256 = 510
--INTR_X86_AVX_VPERMIL_PD = 511
--INTR_X86_AVX_VPERMIL_PD_256 = 512
--INTR_X86_AVX_VPERMIL_PS = 513
--INTR_X86_AVX_VPERMIL_PS_256 = 514
--INTR_X86_AVX_VPERMILVAR_PD = 515
--INTR_X86_AVX_VPERMILVAR_PD_256 = 516
--INTR_X86_AVX_VPERMILVAR_PS = 517
--INTR_X86_AVX_VPERMILVAR_PS_256 = 518
--INTR_X86_AVX_VTESTC_PD = 519
--INTR_X86_AVX_VTESTC_PD_256 = 520
--INTR_X86_AVX_VTESTC_PS = 521
--INTR_X86_AVX_VTESTC_PS_256 = 522
--INTR_X86_AVX_VTESTNZC_PD = 523
--INTR_X86_AVX_VTESTNZC_PD_256 = 524
--INTR_X86_AVX_VTESTNZC_PS = 525
--INTR_X86_AVX_VTESTNZC_PS_256 = 526
--INTR_X86_AVX_VTESTZ_PD = 527
--INTR_X86_AVX_VTESTZ_PD_256 = 528
--INTR_X86_AVX_VTESTZ_PS = 529
--INTR_X86_AVX_VTESTZ_PS_256 = 530
--INTR_X86_AVX_VZEROALL = 531
--INTR_X86_AVX_VZEROUPPER = 532
--INTR_X86_INT = 533
--INTR_X86_MMX_CVTSI32_SI64 = 534
--INTR_X86_MMX_CVTSI64_SI32 = 535
--INTR_X86_MMX_EMMS = 536
--INTR_X86_MMX_FEMMS = 537
--INTR_X86_MMX_MASKMOVQ = 538
--INTR_X86_MMX_MOVNT_DQ = 539
--INTR_X86_MMX_PACKSSDW = 540
--INTR_X86_MMX_PACKSSWB = 541
--INTR_X86_MMX_PACKUSWB = 542
--INTR_X86_MMX_PADD_B = 543
--INTR_X86_MMX_PADD_D = 544
--INTR_X86_MMX_PADD_Q = 545
--INTR_X86_MMX_PADD_W = 546
--INTR_X86_MMX_PADDS_B = 547
--INTR_X86_MMX_PADDS_W = 548
--INTR_X86_MMX_PADDUS_B = 549
--INTR_X86_MMX_PADDUS_W = 550
--INTR_X86_MMX_PAND = 551
--INTR_X86_MMX_PANDN = 552
--INTR_X86_MMX_PAVG_B = 553
--INTR_X86_MMX_PAVG_W = 554
--INTR_X86_MMX_PCMPEQ_B = 555
--INTR_X86_MMX_PCMPEQ_D = 556
--INTR_X86_MMX_PCMPEQ_W = 557
--INTR_X86_MMX_PCMPGT_B = 558
--INTR_X86_MMX_PCMPGT_D = 559
--INTR_X86_MMX_PCMPGT_W = 560
--INTR_X86_MMX_PEXTR_W = 561
--INTR_X86_MMX_PINSR_W = 562
--INTR_X86_MMX_PMADD_WD = 563
--INTR_X86_MMX_PMAXS_W = 564
--INTR_X86_MMX_PMAXU_B = 565
--INTR_X86_MMX_PMINS_W = 566
--INTR_X86_MMX_PMINU_B = 567
--INTR_X86_MMX_PMOVMSKB = 568
--INTR_X86_MMX_PMULH_W = 569
--INTR_X86_MMX_PMULHU_W = 570
--INTR_X86_MMX_PMULL_W = 571
--INTR_X86_MMX_PMULU_DQ = 572
--INTR_X86_MMX_POR = 573
--INTR_X86_MMX_PSAD_BW = 574
--INTR_X86_MMX_PSLL_D = 575
--INTR_X86_MMX_PSLL_Q = 576
--INTR_X86_MMX_PSLL_W = 577
--INTR_X86_MMX_PSLLI_D = 578
--INTR_X86_MMX_PSLLI_Q = 579
--INTR_X86_MMX_PSLLI_W = 580
--INTR_X86_MMX_PSRA_D = 581
--INTR_X86_MMX_PSRA_W = 582
--INTR_X86_MMX_PSRAI_D = 583
--INTR_X86_MMX_PSRAI_W = 584
--INTR_X86_MMX_PSRL_D = 585
--INTR_X86_MMX_PSRL_Q = 586
--INTR_X86_MMX_PSRL_W = 587
--INTR_X86_MMX_PSRLI_D = 588
--INTR_X86_MMX_PSRLI_Q = 589
--INTR_X86_MMX_PSRLI_W = 590
--INTR_X86_MMX_PSUB_B = 591
--INTR_X86_MMX_PSUB_D = 592
--INTR_X86_MMX_PSUB_Q = 593
--INTR_X86_MMX_PSUB_W = 594
--INTR_X86_MMX_PSUBS_B = 595
--INTR_X86_MMX_PSUBS_W = 596
--INTR_X86_MMX_PSUBUS_B = 597
--INTR_X86_MMX_PSUBUS_W = 598
--INTR_X86_MMX_PUNPCKHBW = 599
--INTR_X86_MMX_PUNPCKHDQ = 600
--INTR_X86_MMX_PUNPCKHWD = 601
--INTR_X86_MMX_PUNPCKLBW = 602
--INTR_X86_MMX_PUNPCKLDQ = 603
--INTR_X86_MMX_PUNPCKLWD = 604
--INTR_X86_MMX_PXOR = 605
--INTR_X86_MMX_VEC_EXT_D = 606
--INTR_X86_MMX_VEC_INIT_B = 607
--INTR_X86_MMX_VEC_INIT_D = 608
--INTR_X86_MMX_VEC_INIT_W = 609
--INTR_X86_SSE2_ADD_SD = 610
--INTR_X86_SSE2_CLFLUSH = 611
--INTR_X86_SSE2_CMP_PD = 612
--INTR_X86_SSE2_CMP_SD = 613
--INTR_X86_SSE2_COMIEQ_SD = 614
--INTR_X86_SSE2_COMIGE_SD = 615
--INTR_X86_SSE2_COMIGT_SD = 616
--INTR_X86_SSE2_COMILE_SD = 617
--INTR_X86_SSE2_COMILT_SD = 618
--INTR_X86_SSE2_COMINEQ_SD = 619
--INTR_X86_SSE2_CVTDQ2PD = 620
--INTR_X86_SSE2_CVTDQ2PS = 621
--INTR_X86_SSE2_CVTPD2DQ = 622
--INTR_X86_SSE2_CVTPD2PS = 623
--INTR_X86_SSE2_CVTPS2DQ = 624
--INTR_X86_SSE2_CVTPS2PD = 625
--INTR_X86_SSE2_CVTSD2SI = 626
--INTR_X86_SSE2_CVTSD2SI64 = 627
--INTR_X86_SSE2_CVTSD2SS = 628
--INTR_X86_SSE2_CVTSI2SD = 629
--INTR_X86_SSE2_CVTSI642SD = 630
--INTR_X86_SSE2_CVTSS2SD = 631
--INTR_X86_SSE2_CVTTPD2DQ = 632
--INTR_X86_SSE2_CVTTPS2DQ = 633
--INTR_X86_SSE2_CVTTSD2SI = 634
--INTR_X86_SSE2_CVTTSD2SI64 = 635
--INTR_X86_SSE2_DIV_SD = 636
--INTR_X86_SSE2_LFENCE = 637
--INTR_X86_SSE2_LOADU_DQ = 638
--INTR_X86_SSE2_LOADU_PD = 639
--INTR_X86_SSE2_MASKMOV_DQU = 640
--INTR_X86_SSE2_MAX_PD = 641
--INTR_X86_SSE2_MAX_SD = 642
--INTR_X86_SSE2_MFENCE = 643
--INTR_X86_SSE2_MIN_PD = 644
--INTR_X86_SSE2_MIN_SD = 645
--INTR_X86_SSE2_MOVMSK_PD = 646
--INTR_X86_SSE2_MOVNT_DQ = 647
--INTR_X86_SSE2_MOVNT_I = 648
--INTR_X86_SSE2_MOVNT_PD = 649
--INTR_X86_SSE2_MUL_SD = 650
--INTR_X86_SSE2_PACKSSDW_128 = 651
--INTR_X86_SSE2_PACKSSWB_128 = 652
--INTR_X86_SSE2_PACKUSWB_128 = 653
--INTR_X86_SSE2_PADDS_B = 654
--INTR_X86_SSE2_PADDS_W = 655
--INTR_X86_SSE2_PADDUS_B = 656
--INTR_X86_SSE2_PADDUS_W = 657
--INTR_X86_SSE2_PAVG_B = 658
--INTR_X86_SSE2_PAVG_W = 659
--INTR_X86_SSE2_PCMPEQ_B = 660
--INTR_X86_SSE2_PCMPEQ_D = 661
--INTR_X86_SSE2_PCMPEQ_W = 662
--INTR_X86_SSE2_PCMPGT_B = 663
--INTR_X86_SSE2_PCMPGT_D = 664
--INTR_X86_SSE2_PCMPGT_W = 665
--INTR_X86_SSE2_PMADD_WD = 666
--INTR_X86_SSE2_PMAXS_W = 667
--INTR_X86_SSE2_PMAXU_B = 668
--INTR_X86_SSE2_PMINS_W = 669
--INTR_X86_SSE2_PMINU_B = 670
--INTR_X86_SSE2_PMOVMSKB_128 = 671
--INTR_X86_SSE2_PMULH_W = 672
--INTR_X86_SSE2_PMULHU_W = 673
--INTR_X86_SSE2_PMULU_DQ = 674
--INTR_X86_SSE2_PSAD_BW = 675
--INTR_X86_SSE2_PSLL_D = 676
--INTR_X86_SSE2_PSLL_DQ = 677
--INTR_X86_SSE2_PSLL_DQ_BS = 678
--INTR_X86_SSE2_PSLL_Q = 679
--INTR_X86_SSE2_PSLL_W = 680
--INTR_X86_SSE2_PSLLI_D = 681
--INTR_X86_SSE2_PSLLI_Q = 682
--INTR_X86_SSE2_PSLLI_W = 683
--INTR_X86_SSE2_PSRA_D = 684
--INTR_X86_SSE2_PSRA_W = 685
--INTR_X86_SSE2_PSRAI_D = 686
--INTR_X86_SSE2_PSRAI_W = 687
--INTR_X86_SSE2_PSRL_D = 688
--INTR_X86_SSE2_PSRL_DQ = 689
--INTR_X86_SSE2_PSRL_DQ_BS = 690
--INTR_X86_SSE2_PSRL_Q = 691
--INTR_X86_SSE2_PSRL_W = 692
--INTR_X86_SSE2_PSRLI_D = 693
--INTR_X86_SSE2_PSRLI_Q = 694
--INTR_X86_SSE2_PSRLI_W = 695
--INTR_X86_SSE2_PSUBS_B = 696
--INTR_X86_SSE2_PSUBS_W = 697
--INTR_X86_SSE2_PSUBUS_B = 698
--INTR_X86_SSE2_PSUBUS_W = 699
--INTR_X86_SSE2_SQRT_PD = 700
--INTR_X86_SSE2_SQRT_SD = 701
--INTR_X86_SSE2_STOREL_DQ = 702
--INTR_X86_SSE2_STOREU_DQ = 703
--INTR_X86_SSE2_STOREU_PD = 704
--INTR_X86_SSE2_SUB_SD = 705
--INTR_X86_SSE2_UCOMIEQ_SD = 706
--INTR_X86_SSE2_UCOMIGE_SD = 707
--INTR_X86_SSE2_UCOMIGT_SD = 708
--INTR_X86_SSE2_UCOMILE_SD = 709
--INTR_X86_SSE2_UCOMILT_SD = 710
--INTR_X86_SSE2_UCOMINEQ_SD = 711
--INTR_X86_SSE3_ADDSUB_PD = 712
--INTR_X86_SSE3_ADDSUB_PS = 713
--INTR_X86_SSE3_HADD_PD = 714
--INTR_X86_SSE3_HADD_PS = 715
--INTR_X86_SSE3_HSUB_PD = 716
--INTR_X86_SSE3_HSUB_PS = 717
--INTR_X86_SSE3_LDU_DQ = 718
--INTR_X86_SSE3_MONITOR = 719
--INTR_X86_SSE3_MWAIT = 720
--INTR_X86_SSE41_BLENDPD = 721
--INTR_X86_SSE41_BLENDPS = 722
--INTR_X86_SSE41_BLENDVPD = 723
--INTR_X86_SSE41_BLENDVPS = 724
--INTR_X86_SSE41_DPPD = 725
--INTR_X86_SSE41_DPPS = 726
--INTR_X86_SSE41_EXTRACTPS = 727
--INTR_X86_SSE41_INSERTPS = 728
--INTR_X86_SSE41_MOVNTDQA = 729
--INTR_X86_SSE41_MPSADBW = 730
--INTR_X86_SSE41_PACKUSDW = 731
--INTR_X86_SSE41_PBLENDVB = 732
--INTR_X86_SSE41_PBLENDW = 733
--INTR_X86_SSE41_PCMPEQQ = 734
--INTR_X86_SSE41_PEXTRB = 735
--INTR_X86_SSE41_PEXTRD = 736
--INTR_X86_SSE41_PEXTRQ = 737
--INTR_X86_SSE41_PHMINPOSUW = 738
--INTR_X86_SSE41_PMAXSB = 739
--INTR_X86_SSE41_PMAXSD = 740
--INTR_X86_SSE41_PMAXUD = 741
--INTR_X86_SSE41_PMAXUW = 742
--INTR_X86_SSE41_PMINSB = 743
--INTR_X86_SSE41_PMINSD = 744
--INTR_X86_SSE41_PMINUD = 745
--INTR_X86_SSE41_PMINUW = 746
--INTR_X86_SSE41_PMOVSXBD = 747
--INTR_X86_SSE41_PMOVSXBQ = 748
--INTR_X86_SSE41_PMOVSXBW = 749
--INTR_X86_SSE41_PMOVSXDQ = 750
--INTR_X86_SSE41_PMOVSXWD = 751
--INTR_X86_SSE41_PMOVSXWQ = 752
--INTR_X86_SSE41_PMOVZXBD = 753
--INTR_X86_SSE41_PMOVZXBQ = 754
--INTR_X86_SSE41_PMOVZXBW = 755
--INTR_X86_SSE41_PMOVZXDQ = 756
--INTR_X86_SSE41_PMOVZXWD = 757
--INTR_X86_SSE41_PMOVZXWQ = 758
--INTR_X86_SSE41_PMULDQ = 759
--INTR_X86_SSE41_PTESTC = 760
--INTR_X86_SSE41_PTESTNZC = 761
--INTR_X86_SSE41_PTESTZ = 762
--INTR_X86_SSE41_ROUND_PD = 763
--INTR_X86_SSE41_ROUND_PS = 764
--INTR_X86_SSE41_ROUND_SD = 765
--INTR_X86_SSE41_ROUND_SS = 766
--INTR_X86_SSE42_CRC32_16 = 767
--INTR_X86_SSE42_CRC32_32 = 768
--INTR_X86_SSE42_CRC32_8 = 769
--INTR_X86_SSE42_CRC64_64 = 770
--INTR_X86_SSE42_CRC64_8 = 771
--INTR_X86_SSE42_PCMPESTRI128 = 772
--INTR_X86_SSE42_PCMPESTRIA128 = 773
--INTR_X86_SSE42_PCMPESTRIC128 = 774
--INTR_X86_SSE42_PCMPESTRIO128 = 775
--INTR_X86_SSE42_PCMPESTRIS128 = 776
--INTR_X86_SSE42_PCMPESTRIZ128 = 777
--INTR_X86_SSE42_PCMPESTRM128 = 778
--INTR_X86_SSE42_PCMPGTQ = 779
--INTR_X86_SSE42_PCMPISTRI128 = 780
--INTR_X86_SSE42_PCMPISTRIA128 = 781
--INTR_X86_SSE42_PCMPISTRIC128 = 782
--INTR_X86_SSE42_PCMPISTRIO128 = 783
--INTR_X86_SSE42_PCMPISTRIS128 = 784
--INTR_X86_SSE42_PCMPISTRIZ128 = 785
--INTR_X86_SSE42_PCMPISTRM128 = 786
--INTR_X86_SSE_ADD_SS = 787
--INTR_X86_SSE_CMP_PS = 788
--INTR_X86_SSE_CMP_SS = 789
--INTR_X86_SSE_COMIEQ_SS = 790
--INTR_X86_SSE_COMIGE_SS = 791
--INTR_X86_SSE_COMIGT_SS = 792
--INTR_X86_SSE_COMILE_SS = 793
--INTR_X86_SSE_COMILT_SS = 794
--INTR_X86_SSE_COMINEQ_SS = 795
--INTR_X86_SSE_CVTPD2PI = 796
--INTR_X86_SSE_CVTPI2PD = 797
--INTR_X86_SSE_CVTPI2PS = 798
--INTR_X86_SSE_CVTPS2PI = 799
--INTR_X86_SSE_CVTSI2SS = 800
--INTR_X86_SSE_CVTSI642SS = 801
--INTR_X86_SSE_CVTSS2SI = 802
--INTR_X86_SSE_CVTSS2SI64 = 803
--INTR_X86_SSE_CVTTPD2PI = 804
--INTR_X86_SSE_CVTTPS2PI = 805
--INTR_X86_SSE_CVTTSS2SI = 806
--INTR_X86_SSE_CVTTSS2SI64 = 807
--INTR_X86_SSE_DIV_SS = 808
--INTR_X86_SSE_LDMXCSR = 809
--INTR_X86_SSE_LOADU_PS = 810
--INTR_X86_SSE_MAX_PS = 811
--INTR_X86_SSE_MAX_SS = 812
--INTR_X86_SSE_MIN_PS = 813
--INTR_X86_SSE_MIN_SS = 814
--INTR_X86_SSE_MOVMSK_PS = 815
--INTR_X86_SSE_MOVNT_PS = 816
--INTR_X86_SSE_MUL_SS = 817
--INTR_X86_SSE_RCP_PS = 818
--INTR_X86_SSE_RCP_SS = 819
--INTR_X86_SSE_RSQRT_PS = 820
--INTR_X86_SSE_RSQRT_SS = 821
--INTR_X86_SSE_SFENCE = 822
--INTR_X86_SSE_SQRT_PS = 823
--INTR_X86_SSE_SQRT_SS = 824
--INTR_X86_SSE_STMXCSR = 825
--INTR_X86_SSE_STOREU_PS = 826
--INTR_X86_SSE_SUB_SS = 827
--INTR_X86_SSE_UCOMIEQ_SS = 828
--INTR_X86_SSE_UCOMIGE_SS = 829
--INTR_X86_SSE_UCOMIGT_SS = 830
--INTR_X86_SSE_UCOMILE_SS = 831
--INTR_X86_SSE_UCOMILT_SS = 832
--INTR_X86_SSE_UCOMINEQ_SS = 833
--INTR_X86_SSSE3_PABS_B = 834
--INTR_X86_SSSE3_PABS_B_128 = 835
--INTR_X86_SSSE3_PABS_D = 836
--INTR_X86_SSSE3_PABS_D_128 = 837
--INTR_X86_SSSE3_PABS_W = 838
--INTR_X86_SSSE3_PABS_W_128 = 839
--INTR_X86_SSSE3_PHADD_D = 840
--INTR_X86_SSSE3_PHADD_D_128 = 841
--INTR_X86_SSSE3_PHADD_SW = 842
--INTR_X86_SSSE3_PHADD_SW_128 = 843
--INTR_X86_SSSE3_PHADD_W = 844
--INTR_X86_SSSE3_PHADD_W_128 = 845
--INTR_X86_SSSE3_PHSUB_D = 846
--INTR_X86_SSSE3_PHSUB_D_128 = 847
--INTR_X86_SSSE3_PHSUB_SW = 848
--INTR_X86_SSSE3_PHSUB_SW_128 = 849
--INTR_X86_SSSE3_PHSUB_W = 850
--INTR_X86_SSSE3_PHSUB_W_128 = 851
--INTR_X86_SSSE3_PMADD_UB_SW = 852
--INTR_X86_SSSE3_PMADD_UB_SW_128 = 853
--INTR_X86_SSSE3_PMUL_HR_SW = 854
--INTR_X86_SSSE3_PMUL_HR_SW_128 = 855
--INTR_X86_SSSE3_PSHUF_B = 856
--INTR_X86_SSSE3_PSHUF_B_128 = 857
--INTR_X86_SSSE3_PSHUF_W = 858
--INTR_X86_SSSE3_PSIGN_B = 859
--INTR_X86_SSSE3_PSIGN_B_128 = 860
--INTR_X86_SSSE3_PSIGN_D = 861
--INTR_X86_SSSE3_PSIGN_D_128 = 862
--INTR_X86_SSSE3_PSIGN_W = 863
--INTR_X86_SSSE3_PSIGN_W_128 = 864
--INTR_XCORE_BITREV = 865
--INTR_XCORE_GETID = 866
--
-+INTR_ARM_NEON_VCVTFP2HF = 17
-+INTR_ARM_NEON_VCVTFXS2FP = 18
-+INTR_ARM_NEON_VCVTFXU2FP = 19
-+INTR_ARM_NEON_VCVTHF2FP = 20
-+INTR_ARM_NEON_VHADDS = 21
-+INTR_ARM_NEON_VHADDU = 22
-+INTR_ARM_NEON_VHSUBS = 23
-+INTR_ARM_NEON_VHSUBU = 24
-+INTR_ARM_NEON_VLD1 = 25
-+INTR_ARM_NEON_VLD2 = 26
-+INTR_ARM_NEON_VLD2LANE = 27
-+INTR_ARM_NEON_VLD3 = 28
-+INTR_ARM_NEON_VLD3LANE = 29
-+INTR_ARM_NEON_VLD4 = 30
-+INTR_ARM_NEON_VLD4LANE = 31
-+INTR_ARM_NEON_VMAXS = 32
-+INTR_ARM_NEON_VMAXU = 33
-+INTR_ARM_NEON_VMINS = 34
-+INTR_ARM_NEON_VMINU = 35
-+INTR_ARM_NEON_VMULLP = 36
-+INTR_ARM_NEON_VMULP = 37
-+INTR_ARM_NEON_VPADALS = 38
-+INTR_ARM_NEON_VPADALU = 39
-+INTR_ARM_NEON_VPADD = 40
-+INTR_ARM_NEON_VPADDLS = 41
-+INTR_ARM_NEON_VPADDLU = 42
-+INTR_ARM_NEON_VPMAXS = 43
-+INTR_ARM_NEON_VPMAXU = 44
-+INTR_ARM_NEON_VPMINS = 45
-+INTR_ARM_NEON_VPMINU = 46
-+INTR_ARM_NEON_VQABS = 47
-+INTR_ARM_NEON_VQADDS = 48
-+INTR_ARM_NEON_VQADDU = 49
-+INTR_ARM_NEON_VQDMLAL = 50
-+INTR_ARM_NEON_VQDMLSL = 51
-+INTR_ARM_NEON_VQDMULH = 52
-+INTR_ARM_NEON_VQDMULL = 53
-+INTR_ARM_NEON_VQMOVNS = 54
-+INTR_ARM_NEON_VQMOVNSU = 55
-+INTR_ARM_NEON_VQMOVNU = 56
-+INTR_ARM_NEON_VQNEG = 57
-+INTR_ARM_NEON_VQRDMULH = 58
-+INTR_ARM_NEON_VQRSHIFTNS = 59
-+INTR_ARM_NEON_VQRSHIFTNSU = 60
-+INTR_ARM_NEON_VQRSHIFTNU = 61
-+INTR_ARM_NEON_VQRSHIFTS = 62
-+INTR_ARM_NEON_VQRSHIFTU = 63
-+INTR_ARM_NEON_VQSHIFTNS = 64
-+INTR_ARM_NEON_VQSHIFTNSU = 65
-+INTR_ARM_NEON_VQSHIFTNU = 66
-+INTR_ARM_NEON_VQSHIFTS = 67
-+INTR_ARM_NEON_VQSHIFTSU = 68
-+INTR_ARM_NEON_VQSHIFTU = 69
-+INTR_ARM_NEON_VQSUBS = 70
-+INTR_ARM_NEON_VQSUBU = 71
-+INTR_ARM_NEON_VRADDHN = 72
-+INTR_ARM_NEON_VRECPE = 73
-+INTR_ARM_NEON_VRECPS = 74
-+INTR_ARM_NEON_VRHADDS = 75
-+INTR_ARM_NEON_VRHADDU = 76
-+INTR_ARM_NEON_VRSHIFTN = 77
-+INTR_ARM_NEON_VRSHIFTS = 78
-+INTR_ARM_NEON_VRSHIFTU = 79
-+INTR_ARM_NEON_VRSQRTE = 80
-+INTR_ARM_NEON_VRSQRTS = 81
-+INTR_ARM_NEON_VRSUBHN = 82
-+INTR_ARM_NEON_VSHIFTINS = 83
-+INTR_ARM_NEON_VSHIFTLS = 84
-+INTR_ARM_NEON_VSHIFTLU = 85
-+INTR_ARM_NEON_VSHIFTN = 86
-+INTR_ARM_NEON_VSHIFTS = 87
-+INTR_ARM_NEON_VSHIFTU = 88
-+INTR_ARM_NEON_VST1 = 89
-+INTR_ARM_NEON_VST2 = 90
-+INTR_ARM_NEON_VST2LANE = 91
-+INTR_ARM_NEON_VST3 = 92
-+INTR_ARM_NEON_VST3LANE = 93
-+INTR_ARM_NEON_VST4 = 94
-+INTR_ARM_NEON_VST4LANE = 95
-+INTR_ARM_NEON_VSUBHN = 96
-+INTR_ARM_NEON_VTBL1 = 97
-+INTR_ARM_NEON_VTBL2 = 98
-+INTR_ARM_NEON_VTBL3 = 99
-+INTR_ARM_NEON_VTBL4 = 100
-+INTR_ARM_NEON_VTBX1 = 101
-+INTR_ARM_NEON_VTBX2 = 102
-+INTR_ARM_NEON_VTBX3 = 103
-+INTR_ARM_NEON_VTBX4 = 104
-+INTR_ARM_QADD = 105
-+INTR_ARM_QSUB = 106
-+INTR_ARM_SET_FPSCR = 107
-+INTR_ARM_SSAT = 108
-+INTR_ARM_THREAD_POINTER = 109
-+INTR_ARM_USAT = 110
-+INTR_ARM_VCVTR = 111
-+INTR_ARM_VCVTRU = 112
-+INTR_ATOMIC_CMP_SWAP = 113
-+INTR_ATOMIC_LOAD_ADD = 114
-+INTR_ATOMIC_LOAD_AND = 115
-+INTR_ATOMIC_LOAD_MAX = 116
-+INTR_ATOMIC_LOAD_MIN = 117
-+INTR_ATOMIC_LOAD_NAND = 118
-+INTR_ATOMIC_LOAD_OR = 119
-+INTR_ATOMIC_LOAD_SUB = 120
-+INTR_ATOMIC_LOAD_UMAX = 121
-+INTR_ATOMIC_LOAD_UMIN = 122
-+INTR_ATOMIC_LOAD_XOR = 123
-+INTR_ATOMIC_SWAP = 124
-+INTR_BSWAP = 125
-+INTR_CONVERT_FROM_FP16 = 126
-+INTR_CONVERT_TO_FP16 = 127
-+INTR_CONVERTFF = 128
-+INTR_CONVERTFSI = 129
-+INTR_CONVERTFUI = 130
-+INTR_CONVERTSIF = 131
-+INTR_CONVERTSS = 132
-+INTR_CONVERTSU = 133
-+INTR_CONVERTUIF = 134
-+INTR_CONVERTUS = 135
-+INTR_CONVERTUU = 136
-+INTR_COS = 137
-+INTR_CTLZ = 138
-+INTR_CTPOP = 139
-+INTR_CTTZ = 140
-+INTR_DBG_DECLARE = 141
-+INTR_DBG_VALUE = 142
-+INTR_EH_DWARF_CFA = 143
-+INTR_EH_EXCEPTION = 144
-+INTR_EH_RETURN_I32 = 145
-+INTR_EH_RETURN_I64 = 146
-+INTR_EH_SELECTOR = 147
-+INTR_EH_SJLJ_CALLSITE = 148
-+INTR_EH_SJLJ_DISPATCH_SETUP = 149
-+INTR_EH_SJLJ_LONGJMP = 150
-+INTR_EH_SJLJ_LSDA = 151
-+INTR_EH_SJLJ_SETJMP = 152
-+INTR_EH_TYPEID_FOR = 153
-+INTR_EH_UNWIND_INIT = 154
-+INTR_EXP = 155
-+INTR_EXP2 = 156
-+INTR_FLT_ROUNDS = 157
-+INTR_FRAMEADDRESS = 158
-+INTR_GCREAD = 159
-+INTR_GCROOT = 160
-+INTR_GCWRITE = 161
-+INTR_INIT_TRAMPOLINE = 162
-+INTR_INVARIANT_END = 163
-+INTR_INVARIANT_START = 164
-+INTR_LIFETIME_END = 165
-+INTR_LIFETIME_START = 166
-+INTR_LOG = 167
-+INTR_LOG10 = 168
-+INTR_LOG2 = 169
-+INTR_LONGJMP = 170
-+INTR_MEMCPY = 171
-+INTR_MEMMOVE = 172
-+INTR_MEMORY_BARRIER = 173
-+INTR_MEMSET = 174
-+INTR_OBJECTSIZE = 175
-+INTR_PCMARKER = 176
-+INTR_POW = 177
-+INTR_POWI = 178
-+INTR_PPC_ALTIVEC_DSS = 179
-+INTR_PPC_ALTIVEC_DSSALL = 180
-+INTR_PPC_ALTIVEC_DST = 181
-+INTR_PPC_ALTIVEC_DSTST = 182
-+INTR_PPC_ALTIVEC_DSTSTT = 183
-+INTR_PPC_ALTIVEC_DSTT = 184
-+INTR_PPC_ALTIVEC_LVEBX = 185
-+INTR_PPC_ALTIVEC_LVEHX = 186
-+INTR_PPC_ALTIVEC_LVEWX = 187
-+INTR_PPC_ALTIVEC_LVSL = 188
-+INTR_PPC_ALTIVEC_LVSR = 189
-+INTR_PPC_ALTIVEC_LVX = 190
-+INTR_PPC_ALTIVEC_LVXL = 191
-+INTR_PPC_ALTIVEC_MFVSCR = 192
-+INTR_PPC_ALTIVEC_MTVSCR = 193
-+INTR_PPC_ALTIVEC_STVEBX = 194
-+INTR_PPC_ALTIVEC_STVEHX = 195
-+INTR_PPC_ALTIVEC_STVEWX = 196
-+INTR_PPC_ALTIVEC_STVX = 197
-+INTR_PPC_ALTIVEC_STVXL = 198
-+INTR_PPC_ALTIVEC_VADDCUW = 199
-+INTR_PPC_ALTIVEC_VADDSBS = 200
-+INTR_PPC_ALTIVEC_VADDSHS = 201
-+INTR_PPC_ALTIVEC_VADDSWS = 202
-+INTR_PPC_ALTIVEC_VADDUBS = 203
-+INTR_PPC_ALTIVEC_VADDUHS = 204
-+INTR_PPC_ALTIVEC_VADDUWS = 205
-+INTR_PPC_ALTIVEC_VAVGSB = 206
-+INTR_PPC_ALTIVEC_VAVGSH = 207
-+INTR_PPC_ALTIVEC_VAVGSW = 208
-+INTR_PPC_ALTIVEC_VAVGUB = 209
-+INTR_PPC_ALTIVEC_VAVGUH = 210
-+INTR_PPC_ALTIVEC_VAVGUW = 211
-+INTR_PPC_ALTIVEC_VCFSX = 212
-+INTR_PPC_ALTIVEC_VCFUX = 213
-+INTR_PPC_ALTIVEC_VCMPBFP = 214
-+INTR_PPC_ALTIVEC_VCMPBFP_P = 215
-+INTR_PPC_ALTIVEC_VCMPEQFP = 216
-+INTR_PPC_ALTIVEC_VCMPEQFP_P = 217
-+INTR_PPC_ALTIVEC_VCMPEQUB = 218
-+INTR_PPC_ALTIVEC_VCMPEQUB_P = 219
-+INTR_PPC_ALTIVEC_VCMPEQUH = 220
-+INTR_PPC_ALTIVEC_VCMPEQUH_P = 221
-+INTR_PPC_ALTIVEC_VCMPEQUW = 222
-+INTR_PPC_ALTIVEC_VCMPEQUW_P = 223
-+INTR_PPC_ALTIVEC_VCMPGEFP = 224
-+INTR_PPC_ALTIVEC_VCMPGEFP_P = 225
-+INTR_PPC_ALTIVEC_VCMPGTFP = 226
-+INTR_PPC_ALTIVEC_VCMPGTFP_P = 227
-+INTR_PPC_ALTIVEC_VCMPGTSB = 228
-+INTR_PPC_ALTIVEC_VCMPGTSB_P = 229
-+INTR_PPC_ALTIVEC_VCMPGTSH = 230
-+INTR_PPC_ALTIVEC_VCMPGTSH_P = 231
-+INTR_PPC_ALTIVEC_VCMPGTSW = 232
-+INTR_PPC_ALTIVEC_VCMPGTSW_P = 233
-+INTR_PPC_ALTIVEC_VCMPGTUB = 234
-+INTR_PPC_ALTIVEC_VCMPGTUB_P = 235
-+INTR_PPC_ALTIVEC_VCMPGTUH = 236
-+INTR_PPC_ALTIVEC_VCMPGTUH_P = 237
-+INTR_PPC_ALTIVEC_VCMPGTUW = 238
-+INTR_PPC_ALTIVEC_VCMPGTUW_P = 239
-+INTR_PPC_ALTIVEC_VCTSXS = 240
-+INTR_PPC_ALTIVEC_VCTUXS = 241
-+INTR_PPC_ALTIVEC_VEXPTEFP = 242
-+INTR_PPC_ALTIVEC_VLOGEFP = 243
-+INTR_PPC_ALTIVEC_VMADDFP = 244
-+INTR_PPC_ALTIVEC_VMAXFP = 245
-+INTR_PPC_ALTIVEC_VMAXSB = 246
-+INTR_PPC_ALTIVEC_VMAXSH = 247
-+INTR_PPC_ALTIVEC_VMAXSW = 248
-+INTR_PPC_ALTIVEC_VMAXUB = 249
-+INTR_PPC_ALTIVEC_VMAXUH = 250
-+INTR_PPC_ALTIVEC_VMAXUW = 251
-+INTR_PPC_ALTIVEC_VMHADDSHS = 252
-+INTR_PPC_ALTIVEC_VMHRADDSHS = 253
-+INTR_PPC_ALTIVEC_VMINFP = 254
-+INTR_PPC_ALTIVEC_VMINSB = 255
-+INTR_PPC_ALTIVEC_VMINSH = 256
-+INTR_PPC_ALTIVEC_VMINSW = 257
-+INTR_PPC_ALTIVEC_VMINUB = 258
-+INTR_PPC_ALTIVEC_VMINUH = 259
-+INTR_PPC_ALTIVEC_VMINUW = 260
-+INTR_PPC_ALTIVEC_VMLADDUHM = 261
-+INTR_PPC_ALTIVEC_VMSUMMBM = 262
-+INTR_PPC_ALTIVEC_VMSUMSHM = 263
-+INTR_PPC_ALTIVEC_VMSUMSHS = 264
-+INTR_PPC_ALTIVEC_VMSUMUBM = 265
-+INTR_PPC_ALTIVEC_VMSUMUHM = 266
-+INTR_PPC_ALTIVEC_VMSUMUHS = 267
-+INTR_PPC_ALTIVEC_VMULESB = 268
-+INTR_PPC_ALTIVEC_VMULESH = 269
-+INTR_PPC_ALTIVEC_VMULEUB = 270
-+INTR_PPC_ALTIVEC_VMULEUH = 271
-+INTR_PPC_ALTIVEC_VMULOSB = 272
-+INTR_PPC_ALTIVEC_VMULOSH = 273
-+INTR_PPC_ALTIVEC_VMULOUB = 274
-+INTR_PPC_ALTIVEC_VMULOUH = 275
-+INTR_PPC_ALTIVEC_VNMSUBFP = 276
-+INTR_PPC_ALTIVEC_VPERM = 277
-+INTR_PPC_ALTIVEC_VPKPX = 278
-+INTR_PPC_ALTIVEC_VPKSHSS = 279
-+INTR_PPC_ALTIVEC_VPKSHUS = 280
-+INTR_PPC_ALTIVEC_VPKSWSS = 281
-+INTR_PPC_ALTIVEC_VPKSWUS = 282
-+INTR_PPC_ALTIVEC_VPKUHUS = 283
-+INTR_PPC_ALTIVEC_VPKUWUS = 284
-+INTR_PPC_ALTIVEC_VREFP = 285
-+INTR_PPC_ALTIVEC_VRFIM = 286
-+INTR_PPC_ALTIVEC_VRFIN = 287
-+INTR_PPC_ALTIVEC_VRFIP = 288
-+INTR_PPC_ALTIVEC_VRFIZ = 289
-+INTR_PPC_ALTIVEC_VRLB = 290
-+INTR_PPC_ALTIVEC_VRLH = 291
-+INTR_PPC_ALTIVEC_VRLW = 292
-+INTR_PPC_ALTIVEC_VRSQRTEFP = 293
-+INTR_PPC_ALTIVEC_VSEL = 294
-+INTR_PPC_ALTIVEC_VSL = 295
-+INTR_PPC_ALTIVEC_VSLB = 296
-+INTR_PPC_ALTIVEC_VSLH = 297
-+INTR_PPC_ALTIVEC_VSLO = 298
-+INTR_PPC_ALTIVEC_VSLW = 299
-+INTR_PPC_ALTIVEC_VSR = 300
-+INTR_PPC_ALTIVEC_VSRAB = 301
-+INTR_PPC_ALTIVEC_VSRAH = 302
-+INTR_PPC_ALTIVEC_VSRAW = 303
-+INTR_PPC_ALTIVEC_VSRB = 304
-+INTR_PPC_ALTIVEC_VSRH = 305
-+INTR_PPC_ALTIVEC_VSRO = 306
-+INTR_PPC_ALTIVEC_VSRW = 307
-+INTR_PPC_ALTIVEC_VSUBCUW = 308
-+INTR_PPC_ALTIVEC_VSUBSBS = 309
-+INTR_PPC_ALTIVEC_VSUBSHS = 310
-+INTR_PPC_ALTIVEC_VSUBSWS = 311
-+INTR_PPC_ALTIVEC_VSUBUBS = 312
-+INTR_PPC_ALTIVEC_VSUBUHS = 313
-+INTR_PPC_ALTIVEC_VSUBUWS = 314
-+INTR_PPC_ALTIVEC_VSUM2SWS = 315
-+INTR_PPC_ALTIVEC_VSUM4SBS = 316
-+INTR_PPC_ALTIVEC_VSUM4SHS = 317
-+INTR_PPC_ALTIVEC_VSUM4UBS = 318
-+INTR_PPC_ALTIVEC_VSUMSWS = 319
-+INTR_PPC_ALTIVEC_VUPKHPX = 320
-+INTR_PPC_ALTIVEC_VUPKHSB = 321
-+INTR_PPC_ALTIVEC_VUPKHSH = 322
-+INTR_PPC_ALTIVEC_VUPKLPX = 323
-+INTR_PPC_ALTIVEC_VUPKLSB = 324
-+INTR_PPC_ALTIVEC_VUPKLSH = 325
-+INTR_PPC_DCBA = 326
-+INTR_PPC_DCBF = 327
-+INTR_PPC_DCBI = 328
-+INTR_PPC_DCBST = 329
-+INTR_PPC_DCBT = 330
-+INTR_PPC_DCBTST = 331
-+INTR_PPC_DCBZ = 332
-+INTR_PPC_DCBZL = 333
-+INTR_PPC_SYNC = 334
-+INTR_PREFETCH = 335
-+INTR_PTR_ANNOTATION = 336
-+INTR_PTX_BAR_SYNC = 337
-+INTR_PTX_READ_TID_R64 = 338
-+INTR_PTX_READ_TID_V4I16 = 339
-+INTR_PTX_READ_TID_W = 340
-+INTR_PTX_READ_TID_X = 341
-+INTR_PTX_READ_TID_Y = 342
-+INTR_PTX_READ_TID_Z = 343
-+INTR_READCYCLECOUNTER = 344
-+INTR_RETURNADDRESS = 345
-+INTR_SADD_WITH_OVERFLOW = 346
-+INTR_SETJMP = 347
-+INTR_SIGLONGJMP = 348
-+INTR_SIGSETJMP = 349
-+INTR_SIN = 350
-+INTR_SMUL_WITH_OVERFLOW = 351
-+INTR_SPU_SI_A = 352
-+INTR_SPU_SI_ADDX = 353
-+INTR_SPU_SI_AH = 354
-+INTR_SPU_SI_AHI = 355
-+INTR_SPU_SI_AI = 356
-+INTR_SPU_SI_AND = 357
-+INTR_SPU_SI_ANDBI = 358
-+INTR_SPU_SI_ANDC = 359
-+INTR_SPU_SI_ANDHI = 360
-+INTR_SPU_SI_ANDI = 361
-+INTR_SPU_SI_BG = 362
-+INTR_SPU_SI_BGX = 363
-+INTR_SPU_SI_CEQ = 364
-+INTR_SPU_SI_CEQB = 365
-+INTR_SPU_SI_CEQBI = 366
-+INTR_SPU_SI_CEQH = 367
-+INTR_SPU_SI_CEQHI = 368
-+INTR_SPU_SI_CEQI = 369
-+INTR_SPU_SI_CG = 370
-+INTR_SPU_SI_CGT = 371
-+INTR_SPU_SI_CGTB = 372
-+INTR_SPU_SI_CGTBI = 373
-+INTR_SPU_SI_CGTH = 374
-+INTR_SPU_SI_CGTHI = 375
-+INTR_SPU_SI_CGTI = 376
-+INTR_SPU_SI_CGX = 377
-+INTR_SPU_SI_CLGT = 378
-+INTR_SPU_SI_CLGTB = 379
-+INTR_SPU_SI_CLGTBI = 380
-+INTR_SPU_SI_CLGTH = 381
-+INTR_SPU_SI_CLGTHI = 382
-+INTR_SPU_SI_CLGTI = 383
-+INTR_SPU_SI_DFA = 384
-+INTR_SPU_SI_DFM = 385
-+INTR_SPU_SI_DFMA = 386
-+INTR_SPU_SI_DFMS = 387
-+INTR_SPU_SI_DFNMA = 388
-+INTR_SPU_SI_DFNMS = 389
-+INTR_SPU_SI_DFS = 390
-+INTR_SPU_SI_FA = 391
-+INTR_SPU_SI_FCEQ = 392
-+INTR_SPU_SI_FCGT = 393
-+INTR_SPU_SI_FCMEQ = 394
-+INTR_SPU_SI_FCMGT = 395
-+INTR_SPU_SI_FM = 396
-+INTR_SPU_SI_FMA = 397
-+INTR_SPU_SI_FMS = 398
-+INTR_SPU_SI_FNMS = 399
-+INTR_SPU_SI_FS = 400
-+INTR_SPU_SI_FSMBI = 401
-+INTR_SPU_SI_MPY = 402
-+INTR_SPU_SI_MPYA = 403
-+INTR_SPU_SI_MPYH = 404
-+INTR_SPU_SI_MPYHH = 405
-+INTR_SPU_SI_MPYHHA = 406
-+INTR_SPU_SI_MPYHHAU = 407
-+INTR_SPU_SI_MPYHHU = 408
-+INTR_SPU_SI_MPYI = 409
-+INTR_SPU_SI_MPYS = 410
-+INTR_SPU_SI_MPYU = 411
-+INTR_SPU_SI_MPYUI = 412
-+INTR_SPU_SI_NAND = 413
-+INTR_SPU_SI_NOR = 414
-+INTR_SPU_SI_OR = 415
-+INTR_SPU_SI_ORBI = 416
-+INTR_SPU_SI_ORC = 417
-+INTR_SPU_SI_ORHI = 418
-+INTR_SPU_SI_ORI = 419
-+INTR_SPU_SI_SF = 420
-+INTR_SPU_SI_SFH = 421
-+INTR_SPU_SI_SFHI = 422
-+INTR_SPU_SI_SFI = 423
-+INTR_SPU_SI_SFX = 424
-+INTR_SPU_SI_SHLI = 425
-+INTR_SPU_SI_SHLQBI = 426
-+INTR_SPU_SI_SHLQBII = 427
-+INTR_SPU_SI_SHLQBY = 428
-+INTR_SPU_SI_SHLQBYI = 429
-+INTR_SPU_SI_XOR = 430
-+INTR_SPU_SI_XORBI = 431
-+INTR_SPU_SI_XORHI = 432
-+INTR_SPU_SI_XORI = 433
-+INTR_SQRT = 434
-+INTR_SSUB_WITH_OVERFLOW = 435
-+INTR_STACKPROTECTOR = 436
-+INTR_STACKRESTORE = 437
-+INTR_STACKSAVE = 438
-+INTR_TRAP = 439
-+INTR_UADD_WITH_OVERFLOW = 440
-+INTR_UMUL_WITH_OVERFLOW = 441
-+INTR_USUB_WITH_OVERFLOW = 442
-+INTR_VACOPY = 443
-+INTR_VAEND = 444
-+INTR_VAR_ANNOTATION = 445
-+INTR_VASTART = 446
-+INTR_X86_AESNI_AESDEC = 447
-+INTR_X86_AESNI_AESDECLAST = 448
-+INTR_X86_AESNI_AESENC = 449
-+INTR_X86_AESNI_AESENCLAST = 450
-+INTR_X86_AESNI_AESIMC = 451
-+INTR_X86_AESNI_AESKEYGENASSIST = 452
-+INTR_X86_AVX_ADDSUB_PD_256 = 453
-+INTR_X86_AVX_ADDSUB_PS_256 = 454
-+INTR_X86_AVX_BLEND_PD_256 = 455
-+INTR_X86_AVX_BLEND_PS_256 = 456
-+INTR_X86_AVX_BLENDV_PD_256 = 457
-+INTR_X86_AVX_BLENDV_PS_256 = 458
-+INTR_X86_AVX_CMP_PD_256 = 459
-+INTR_X86_AVX_CMP_PS_256 = 460
-+INTR_X86_AVX_CVT_PD2_PS_256 = 461
-+INTR_X86_AVX_CVT_PD2DQ_256 = 462
-+INTR_X86_AVX_CVT_PS2_PD_256 = 463
-+INTR_X86_AVX_CVT_PS2DQ_256 = 464
-+INTR_X86_AVX_CVTDQ2_PD_256 = 465
-+INTR_X86_AVX_CVTDQ2_PS_256 = 466
-+INTR_X86_AVX_CVTT_PD2DQ_256 = 467
-+INTR_X86_AVX_CVTT_PS2DQ_256 = 468
-+INTR_X86_AVX_DP_PS_256 = 469
-+INTR_X86_AVX_HADD_PD_256 = 470
-+INTR_X86_AVX_HADD_PS_256 = 471
-+INTR_X86_AVX_HSUB_PD_256 = 472
-+INTR_X86_AVX_HSUB_PS_256 = 473
-+INTR_X86_AVX_LDU_DQ_256 = 474
-+INTR_X86_AVX_LOADU_DQ_256 = 475
-+INTR_X86_AVX_LOADU_PD_256 = 476
-+INTR_X86_AVX_LOADU_PS_256 = 477
-+INTR_X86_AVX_MASKLOAD_PD = 478
-+INTR_X86_AVX_MASKLOAD_PD_256 = 479
-+INTR_X86_AVX_MASKLOAD_PS = 480
-+INTR_X86_AVX_MASKLOAD_PS_256 = 481
-+INTR_X86_AVX_MASKSTORE_PD = 482
-+INTR_X86_AVX_MASKSTORE_PD_256 = 483
-+INTR_X86_AVX_MASKSTORE_PS = 484
-+INTR_X86_AVX_MASKSTORE_PS_256 = 485
-+INTR_X86_AVX_MAX_PD_256 = 486
-+INTR_X86_AVX_MAX_PS_256 = 487
-+INTR_X86_AVX_MIN_PD_256 = 488
-+INTR_X86_AVX_MIN_PS_256 = 489
-+INTR_X86_AVX_MOVMSK_PD_256 = 490
-+INTR_X86_AVX_MOVMSK_PS_256 = 491
-+INTR_X86_AVX_MOVNT_DQ_256 = 492
-+INTR_X86_AVX_MOVNT_PD_256 = 493
-+INTR_X86_AVX_MOVNT_PS_256 = 494
-+INTR_X86_AVX_PTESTC_256 = 495
-+INTR_X86_AVX_PTESTNZC_256 = 496
-+INTR_X86_AVX_PTESTZ_256 = 497
-+INTR_X86_AVX_RCP_PS_256 = 498
-+INTR_X86_AVX_ROUND_PD_256 = 499
-+INTR_X86_AVX_ROUND_PS_256 = 500
-+INTR_X86_AVX_RSQRT_PS_256 = 501
-+INTR_X86_AVX_SQRT_PD_256 = 502
-+INTR_X86_AVX_SQRT_PS_256 = 503
-+INTR_X86_AVX_STOREU_DQ_256 = 504
-+INTR_X86_AVX_STOREU_PD_256 = 505
-+INTR_X86_AVX_STOREU_PS_256 = 506
-+INTR_X86_AVX_VBROADCAST_SD_256 = 507
-+INTR_X86_AVX_VBROADCASTF128_PD_256 = 508
-+INTR_X86_AVX_VBROADCASTF128_PS_256 = 509
-+INTR_X86_AVX_VBROADCASTSS = 510
-+INTR_X86_AVX_VBROADCASTSS_256 = 511
-+INTR_X86_AVX_VEXTRACTF128_PD_256 = 512
-+INTR_X86_AVX_VEXTRACTF128_PS_256 = 513
-+INTR_X86_AVX_VEXTRACTF128_SI_256 = 514
-+INTR_X86_AVX_VINSERTF128_PD_256 = 515
-+INTR_X86_AVX_VINSERTF128_PS_256 = 516
-+INTR_X86_AVX_VINSERTF128_SI_256 = 517
-+INTR_X86_AVX_VPERM2F128_PD_256 = 518
-+INTR_X86_AVX_VPERM2F128_PS_256 = 519
-+INTR_X86_AVX_VPERM2F128_SI_256 = 520
-+INTR_X86_AVX_VPERMIL_PD = 521
-+INTR_X86_AVX_VPERMIL_PD_256 = 522
-+INTR_X86_AVX_VPERMIL_PS = 523
-+INTR_X86_AVX_VPERMIL_PS_256 = 524
-+INTR_X86_AVX_VPERMILVAR_PD = 525
-+INTR_X86_AVX_VPERMILVAR_PD_256 = 526
-+INTR_X86_AVX_VPERMILVAR_PS = 527
-+INTR_X86_AVX_VPERMILVAR_PS_256 = 528
-+INTR_X86_AVX_VTESTC_PD = 529
-+INTR_X86_AVX_VTESTC_PD_256 = 530
-+INTR_X86_AVX_VTESTC_PS = 531
-+INTR_X86_AVX_VTESTC_PS_256 = 532
-+INTR_X86_AVX_VTESTNZC_PD = 533
-+INTR_X86_AVX_VTESTNZC_PD_256 = 534
-+INTR_X86_AVX_VTESTNZC_PS = 535
-+INTR_X86_AVX_VTESTNZC_PS_256 = 536
-+INTR_X86_AVX_VTESTZ_PD = 537
-+INTR_X86_AVX_VTESTZ_PD_256 = 538
-+INTR_X86_AVX_VTESTZ_PS = 539
-+INTR_X86_AVX_VTESTZ_PS_256 = 540
-+INTR_X86_AVX_VZEROALL = 541
-+INTR_X86_AVX_VZEROUPPER = 542
-+INTR_X86_INT = 543
-+INTR_X86_MMX_EMMS = 544
-+INTR_X86_MMX_FEMMS = 545
-+INTR_X86_MMX_MASKMOVQ = 546
-+INTR_X86_MMX_MOVNT_DQ = 547
-+INTR_X86_MMX_PACKSSDW = 548
-+INTR_X86_MMX_PACKSSWB = 549
-+INTR_X86_MMX_PACKUSWB = 550
-+INTR_X86_MMX_PADD_B = 551
-+INTR_X86_MMX_PADD_D = 552
-+INTR_X86_MMX_PADD_Q = 553
-+INTR_X86_MMX_PADD_W = 554
-+INTR_X86_MMX_PADDS_B = 555
-+INTR_X86_MMX_PADDS_W = 556
-+INTR_X86_MMX_PADDUS_B = 557
-+INTR_X86_MMX_PADDUS_W = 558
-+INTR_X86_MMX_PALIGNR_B = 559
-+INTR_X86_MMX_PAND = 560
-+INTR_X86_MMX_PANDN = 561
-+INTR_X86_MMX_PAVG_B = 562
-+INTR_X86_MMX_PAVG_W = 563
-+INTR_X86_MMX_PCMPEQ_B = 564
-+INTR_X86_MMX_PCMPEQ_D = 565
-+INTR_X86_MMX_PCMPEQ_W = 566
-+INTR_X86_MMX_PCMPGT_B = 567
-+INTR_X86_MMX_PCMPGT_D = 568
-+INTR_X86_MMX_PCMPGT_W = 569
-+INTR_X86_MMX_PEXTR_W = 570
-+INTR_X86_MMX_PINSR_W = 571
-+INTR_X86_MMX_PMADD_WD = 572
-+INTR_X86_MMX_PMAXS_W = 573
-+INTR_X86_MMX_PMAXU_B = 574
-+INTR_X86_MMX_PMINS_W = 575
-+INTR_X86_MMX_PMINU_B = 576
-+INTR_X86_MMX_PMOVMSKB = 577
-+INTR_X86_MMX_PMULH_W = 578
-+INTR_X86_MMX_PMULHU_W = 579
-+INTR_X86_MMX_PMULL_W = 580
-+INTR_X86_MMX_PMULU_DQ = 581
-+INTR_X86_MMX_POR = 582
-+INTR_X86_MMX_PSAD_BW = 583
-+INTR_X86_MMX_PSLL_D = 584
-+INTR_X86_MMX_PSLL_Q = 585
-+INTR_X86_MMX_PSLL_W = 586
-+INTR_X86_MMX_PSLLI_D = 587
-+INTR_X86_MMX_PSLLI_Q = 588
-+INTR_X86_MMX_PSLLI_W = 589
-+INTR_X86_MMX_PSRA_D = 590
-+INTR_X86_MMX_PSRA_W = 591
-+INTR_X86_MMX_PSRAI_D = 592
-+INTR_X86_MMX_PSRAI_W = 593
-+INTR_X86_MMX_PSRL_D = 594
-+INTR_X86_MMX_PSRL_Q = 595
-+INTR_X86_MMX_PSRL_W = 596
-+INTR_X86_MMX_PSRLI_D = 597
-+INTR_X86_MMX_PSRLI_Q = 598
-+INTR_X86_MMX_PSRLI_W = 599
-+INTR_X86_MMX_PSUB_B = 600
-+INTR_X86_MMX_PSUB_D = 601
-+INTR_X86_MMX_PSUB_Q = 602
-+INTR_X86_MMX_PSUB_W = 603
-+INTR_X86_MMX_PSUBS_B = 604
-+INTR_X86_MMX_PSUBS_W = 605
-+INTR_X86_MMX_PSUBUS_B = 606
-+INTR_X86_MMX_PSUBUS_W = 607
-+INTR_X86_MMX_PUNPCKHBW = 608
-+INTR_X86_MMX_PUNPCKHDQ = 609
-+INTR_X86_MMX_PUNPCKHWD = 610
-+INTR_X86_MMX_PUNPCKLBW = 611
-+INTR_X86_MMX_PUNPCKLDQ = 612
-+INTR_X86_MMX_PUNPCKLWD = 613
-+INTR_X86_MMX_PXOR = 614
-+INTR_X86_SSE2_ADD_SD = 615
-+INTR_X86_SSE2_CLFLUSH = 616
-+INTR_X86_SSE2_CMP_PD = 617
-+INTR_X86_SSE2_CMP_SD = 618
-+INTR_X86_SSE2_COMIEQ_SD = 619
-+INTR_X86_SSE2_COMIGE_SD = 620
-+INTR_X86_SSE2_COMIGT_SD = 621
-+INTR_X86_SSE2_COMILE_SD = 622
-+INTR_X86_SSE2_COMILT_SD = 623
-+INTR_X86_SSE2_COMINEQ_SD = 624
-+INTR_X86_SSE2_CVTDQ2PD = 625
-+INTR_X86_SSE2_CVTDQ2PS = 626
-+INTR_X86_SSE2_CVTPD2DQ = 627
-+INTR_X86_SSE2_CVTPD2PS = 628
-+INTR_X86_SSE2_CVTPS2DQ = 629
-+INTR_X86_SSE2_CVTPS2PD = 630
-+INTR_X86_SSE2_CVTSD2SI = 631
-+INTR_X86_SSE2_CVTSD2SI64 = 632
-+INTR_X86_SSE2_CVTSD2SS = 633
-+INTR_X86_SSE2_CVTSI2SD = 634
-+INTR_X86_SSE2_CVTSI642SD = 635
-+INTR_X86_SSE2_CVTSS2SD = 636
-+INTR_X86_SSE2_CVTTPD2DQ = 637
-+INTR_X86_SSE2_CVTTPS2DQ = 638
-+INTR_X86_SSE2_CVTTSD2SI = 639
-+INTR_X86_SSE2_CVTTSD2SI64 = 640
-+INTR_X86_SSE2_DIV_SD = 641
-+INTR_X86_SSE2_LFENCE = 642
-+INTR_X86_SSE2_LOADU_DQ = 643
-+INTR_X86_SSE2_LOADU_PD = 644
-+INTR_X86_SSE2_MASKMOV_DQU = 645
-+INTR_X86_SSE2_MAX_PD = 646
-+INTR_X86_SSE2_MAX_SD = 647
-+INTR_X86_SSE2_MFENCE = 648
-+INTR_X86_SSE2_MIN_PD = 649
-+INTR_X86_SSE2_MIN_SD = 650
-+INTR_X86_SSE2_MOVMSK_PD = 651
-+INTR_X86_SSE2_MOVNT_DQ = 652
-+INTR_X86_SSE2_MOVNT_I = 653
-+INTR_X86_SSE2_MOVNT_PD = 654
-+INTR_X86_SSE2_MUL_SD = 655
-+INTR_X86_SSE2_PACKSSDW_128 = 656
-+INTR_X86_SSE2_PACKSSWB_128 = 657
-+INTR_X86_SSE2_PACKUSWB_128 = 658
-+INTR_X86_SSE2_PADDS_B = 659
-+INTR_X86_SSE2_PADDS_W = 660
-+INTR_X86_SSE2_PADDUS_B = 661
-+INTR_X86_SSE2_PADDUS_W = 662
-+INTR_X86_SSE2_PAVG_B = 663
-+INTR_X86_SSE2_PAVG_W = 664
-+INTR_X86_SSE2_PCMPEQ_B = 665
-+INTR_X86_SSE2_PCMPEQ_D = 666
-+INTR_X86_SSE2_PCMPEQ_W = 667
-+INTR_X86_SSE2_PCMPGT_B = 668
-+INTR_X86_SSE2_PCMPGT_D = 669
-+INTR_X86_SSE2_PCMPGT_W = 670
-+INTR_X86_SSE2_PMADD_WD = 671
-+INTR_X86_SSE2_PMAXS_W = 672
-+INTR_X86_SSE2_PMAXU_B = 673
-+INTR_X86_SSE2_PMINS_W = 674
-+INTR_X86_SSE2_PMINU_B = 675
-+INTR_X86_SSE2_PMOVMSKB_128 = 676
-+INTR_X86_SSE2_PMULH_W = 677
-+INTR_X86_SSE2_PMULHU_W = 678
-+INTR_X86_SSE2_PMULU_DQ = 679
-+INTR_X86_SSE2_PSAD_BW = 680
-+INTR_X86_SSE2_PSLL_D = 681
-+INTR_X86_SSE2_PSLL_DQ = 682
-+INTR_X86_SSE2_PSLL_DQ_BS = 683
-+INTR_X86_SSE2_PSLL_Q = 684
-+INTR_X86_SSE2_PSLL_W = 685
-+INTR_X86_SSE2_PSLLI_D = 686
-+INTR_X86_SSE2_PSLLI_Q = 687
-+INTR_X86_SSE2_PSLLI_W = 688
-+INTR_X86_SSE2_PSRA_D = 689
-+INTR_X86_SSE2_PSRA_W = 690
-+INTR_X86_SSE2_PSRAI_D = 691
-+INTR_X86_SSE2_PSRAI_W = 692
-+INTR_X86_SSE2_PSRL_D = 693
-+INTR_X86_SSE2_PSRL_DQ = 694
-+INTR_X86_SSE2_PSRL_DQ_BS = 695
-+INTR_X86_SSE2_PSRL_Q = 696
-+INTR_X86_SSE2_PSRL_W = 697
-+INTR_X86_SSE2_PSRLI_D = 698
-+INTR_X86_SSE2_PSRLI_Q = 699
-+INTR_X86_SSE2_PSRLI_W = 700
-+INTR_X86_SSE2_PSUBS_B = 701
-+INTR_X86_SSE2_PSUBS_W = 702
-+INTR_X86_SSE2_PSUBUS_B = 703
-+INTR_X86_SSE2_PSUBUS_W = 704
-+INTR_X86_SSE2_SQRT_PD = 705
-+INTR_X86_SSE2_SQRT_SD = 706
-+INTR_X86_SSE2_STOREL_DQ = 707
-+INTR_X86_SSE2_STOREU_DQ = 708
-+INTR_X86_SSE2_STOREU_PD = 709
-+INTR_X86_SSE2_SUB_SD = 710
-+INTR_X86_SSE2_UCOMIEQ_SD = 711
-+INTR_X86_SSE2_UCOMIGE_SD = 712
-+INTR_X86_SSE2_UCOMIGT_SD = 713
-+INTR_X86_SSE2_UCOMILE_SD = 714
-+INTR_X86_SSE2_UCOMILT_SD = 715
-+INTR_X86_SSE2_UCOMINEQ_SD = 716
-+INTR_X86_SSE3_ADDSUB_PD = 717
-+INTR_X86_SSE3_ADDSUB_PS = 718
-+INTR_X86_SSE3_HADD_PD = 719
-+INTR_X86_SSE3_HADD_PS = 720
-+INTR_X86_SSE3_HSUB_PD = 721
-+INTR_X86_SSE3_HSUB_PS = 722
-+INTR_X86_SSE3_LDU_DQ = 723
-+INTR_X86_SSE3_MONITOR = 724
-+INTR_X86_SSE3_MWAIT = 725
-+INTR_X86_SSE41_BLENDPD = 726
-+INTR_X86_SSE41_BLENDPS = 727
-+INTR_X86_SSE41_BLENDVPD = 728
-+INTR_X86_SSE41_BLENDVPS = 729
-+INTR_X86_SSE41_DPPD = 730
-+INTR_X86_SSE41_DPPS = 731
-+INTR_X86_SSE41_EXTRACTPS = 732
-+INTR_X86_SSE41_INSERTPS = 733
-+INTR_X86_SSE41_MOVNTDQA = 734
-+INTR_X86_SSE41_MPSADBW = 735
-+INTR_X86_SSE41_PACKUSDW = 736
-+INTR_X86_SSE41_PBLENDVB = 737
-+INTR_X86_SSE41_PBLENDW = 738
-+INTR_X86_SSE41_PCMPEQQ = 739
-+INTR_X86_SSE41_PEXTRB = 740
-+INTR_X86_SSE41_PEXTRD = 741
-+INTR_X86_SSE41_PEXTRQ = 742
-+INTR_X86_SSE41_PHMINPOSUW = 743
-+INTR_X86_SSE41_PMAXSB = 744
-+INTR_X86_SSE41_PMAXSD = 745
-+INTR_X86_SSE41_PMAXUD = 746
-+INTR_X86_SSE41_PMAXUW = 747
-+INTR_X86_SSE41_PMINSB = 748
-+INTR_X86_SSE41_PMINSD = 749
-+INTR_X86_SSE41_PMINUD = 750
-+INTR_X86_SSE41_PMINUW = 751
-+INTR_X86_SSE41_PMOVSXBD = 752
-+INTR_X86_SSE41_PMOVSXBQ = 753
-+INTR_X86_SSE41_PMOVSXBW = 754
-+INTR_X86_SSE41_PMOVSXDQ = 755
-+INTR_X86_SSE41_PMOVSXWD = 756
-+INTR_X86_SSE41_PMOVSXWQ = 757
-+INTR_X86_SSE41_PMOVZXBD = 758
-+INTR_X86_SSE41_PMOVZXBQ = 759
-+INTR_X86_SSE41_PMOVZXBW = 760
-+INTR_X86_SSE41_PMOVZXDQ = 761
-+INTR_X86_SSE41_PMOVZXWD = 762
-+INTR_X86_SSE41_PMOVZXWQ = 763
-+INTR_X86_SSE41_PMULDQ = 764
-+INTR_X86_SSE41_PTESTC = 765
-+INTR_X86_SSE41_PTESTNZC = 766
-+INTR_X86_SSE41_PTESTZ = 767
-+INTR_X86_SSE41_ROUND_PD = 768
-+INTR_X86_SSE41_ROUND_PS = 769
-+INTR_X86_SSE41_ROUND_SD = 770
-+INTR_X86_SSE41_ROUND_SS = 771
-+INTR_X86_SSE42_CRC32_16 = 772
-+INTR_X86_SSE42_CRC32_32 = 773
-+INTR_X86_SSE42_CRC32_8 = 774
-+INTR_X86_SSE42_CRC64_64 = 775
-+INTR_X86_SSE42_CRC64_8 = 776
-+INTR_X86_SSE42_PCMPESTRI128 = 777
-+INTR_X86_SSE42_PCMPESTRIA128 = 778
-+INTR_X86_SSE42_PCMPESTRIC128 = 779
-+INTR_X86_SSE42_PCMPESTRIO128 = 780
-+INTR_X86_SSE42_PCMPESTRIS128 = 781
-+INTR_X86_SSE42_PCMPESTRIZ128 = 782
-+INTR_X86_SSE42_PCMPESTRM128 = 783
-+INTR_X86_SSE42_PCMPGTQ = 784
-+INTR_X86_SSE42_PCMPISTRI128 = 785
-+INTR_X86_SSE42_PCMPISTRIA128 = 786
-+INTR_X86_SSE42_PCMPISTRIC128 = 787
-+INTR_X86_SSE42_PCMPISTRIO128 = 788
-+INTR_X86_SSE42_PCMPISTRIS128 = 789
-+INTR_X86_SSE42_PCMPISTRIZ128 = 790
-+INTR_X86_SSE42_PCMPISTRM128 = 791
-+INTR_X86_SSE_ADD_SS = 792
-+INTR_X86_SSE_CMP_PS = 793
-+INTR_X86_SSE_CMP_SS = 794
-+INTR_X86_SSE_COMIEQ_SS = 795
-+INTR_X86_SSE_COMIGE_SS = 796
-+INTR_X86_SSE_COMIGT_SS = 797
-+INTR_X86_SSE_COMILE_SS = 798
-+INTR_X86_SSE_COMILT_SS = 799
-+INTR_X86_SSE_COMINEQ_SS = 800
-+INTR_X86_SSE_CVTPD2PI = 801
-+INTR_X86_SSE_CVTPI2PD = 802
-+INTR_X86_SSE_CVTPI2PS = 803
-+INTR_X86_SSE_CVTPS2PI = 804
-+INTR_X86_SSE_CVTSI2SS = 805
-+INTR_X86_SSE_CVTSI642SS = 806
-+INTR_X86_SSE_CVTSS2SI = 807
-+INTR_X86_SSE_CVTSS2SI64 = 808
-+INTR_X86_SSE_CVTTPD2PI = 809
-+INTR_X86_SSE_CVTTPS2PI = 810
-+INTR_X86_SSE_CVTTSS2SI = 811
-+INTR_X86_SSE_CVTTSS2SI64 = 812
-+INTR_X86_SSE_DIV_SS = 813
-+INTR_X86_SSE_LDMXCSR = 814
-+INTR_X86_SSE_LOADU_PS = 815
-+INTR_X86_SSE_MAX_PS = 816
-+INTR_X86_SSE_MAX_SS = 817
-+INTR_X86_SSE_MIN_PS = 818
-+INTR_X86_SSE_MIN_SS = 819
-+INTR_X86_SSE_MOVMSK_PS = 820
-+INTR_X86_SSE_MOVNT_PS = 821
-+INTR_X86_SSE_MUL_SS = 822
-+INTR_X86_SSE_PSHUF_W = 823
-+INTR_X86_SSE_RCP_PS = 824
-+INTR_X86_SSE_RCP_SS = 825
-+INTR_X86_SSE_RSQRT_PS = 826
-+INTR_X86_SSE_RSQRT_SS = 827
-+INTR_X86_SSE_SFENCE = 828
-+INTR_X86_SSE_SQRT_PS = 829
-+INTR_X86_SSE_SQRT_SS = 830
-+INTR_X86_SSE_STMXCSR = 831
-+INTR_X86_SSE_STOREU_PS = 832
-+INTR_X86_SSE_SUB_SS = 833
-+INTR_X86_SSE_UCOMIEQ_SS = 834
-+INTR_X86_SSE_UCOMIGE_SS = 835
-+INTR_X86_SSE_UCOMIGT_SS = 836
-+INTR_X86_SSE_UCOMILE_SS = 837
-+INTR_X86_SSE_UCOMILT_SS = 838
-+INTR_X86_SSE_UCOMINEQ_SS = 839
-+INTR_X86_SSSE3_PABS_B = 840
-+INTR_X86_SSSE3_PABS_B_128 = 841
-+INTR_X86_SSSE3_PABS_D = 842
-+INTR_X86_SSSE3_PABS_D_128 = 843
-+INTR_X86_SSSE3_PABS_W = 844
-+INTR_X86_SSSE3_PABS_W_128 = 845
-+INTR_X86_SSSE3_PHADD_D = 846
-+INTR_X86_SSSE3_PHADD_D_128 = 847
-+INTR_X86_SSSE3_PHADD_SW = 848
-+INTR_X86_SSSE3_PHADD_SW_128 = 849
-+INTR_X86_SSSE3_PHADD_W = 850
-+INTR_X86_SSSE3_PHADD_W_128 = 851
-+INTR_X86_SSSE3_PHSUB_D = 852
-+INTR_X86_SSSE3_PHSUB_D_128 = 853
-+INTR_X86_SSSE3_PHSUB_SW = 854
-+INTR_X86_SSSE3_PHSUB_SW_128 = 855
-+INTR_X86_SSSE3_PHSUB_W = 856
-+INTR_X86_SSSE3_PHSUB_W_128 = 857
-+INTR_X86_SSSE3_PMADD_UB_SW = 858
-+INTR_X86_SSSE3_PMADD_UB_SW_128 = 859
-+INTR_X86_SSSE3_PMUL_HR_SW = 860
-+INTR_X86_SSSE3_PMUL_HR_SW_128 = 861
-+INTR_X86_SSSE3_PSHUF_B = 862
-+INTR_X86_SSSE3_PSHUF_B_128 = 863
-+INTR_X86_SSSE3_PSIGN_B = 864
-+INTR_X86_SSSE3_PSIGN_B_128 = 865
-+INTR_X86_SSSE3_PSIGN_D = 866
-+INTR_X86_SSSE3_PSIGN_D_128 = 867
-+INTR_X86_SSSE3_PSIGN_W = 868
-+INTR_X86_SSSE3_PSIGN_W_128 = 869
-+INTR_XCORE_BITREV = 870
-+INTR_XCORE_CHKCT = 871
-+INTR_XCORE_CLRE = 872
-+INTR_XCORE_EEU = 873
-+INTR_XCORE_FREER = 874
-+INTR_XCORE_GETID = 875
-+INTR_XCORE_GETR = 876
-+INTR_XCORE_GETTS = 877
-+INTR_XCORE_IN = 878
-+INTR_XCORE_INCT = 879
-+INTR_XCORE_INSHR = 880
-+INTR_XCORE_INT = 881
-+INTR_XCORE_OUT = 882
-+INTR_XCORE_OUTCT = 883
-+INTR_XCORE_OUTSHR = 884
-+INTR_XCORE_OUTT = 885
-+INTR_XCORE_SETC = 886
-+INTR_XCORE_SETD = 887
-+INTR_XCORE_SETPT = 888
-+INTR_XCORE_SETTW = 889
-+INTR_XCORE_SETV = 890
-+INTR_XCORE_SYNCR = 891
-+INTR_XCORE_WAITEVENT = 892
-Index: _core.c
-===================================================================
---- _core.c (revision 105)
-+++ _core.c (working copy)
-@@ -807,7 +807,7 @@
- _wrap_pass( EdgeProfiler )
- _wrap_pass( FunctionAttrs )
- _wrap_pass( FunctionInlining )
--_wrap_pass( GEPSplitter )
-+//_wrap_pass( GEPSplitter )
- _wrap_pass( GlobalDCE )
- _wrap_pass( GlobalOptimizer )
- _wrap_pass( GlobalsModRef )
-@@ -822,11 +822,11 @@
- _wrap_pass( LazyValueInfo )
- _wrap_pass( LCSSA )
- _wrap_pass( LICM )
--_wrap_pass( LiveValues )
-+//_wrap_pass( LiveValues )
- _wrap_pass( LoopDeletion )
- _wrap_pass( LoopDependenceAnalysis )
- _wrap_pass( LoopExtractor )
--_wrap_pass( LoopIndexSplit )
-+//_wrap_pass( LoopIndexSplit )
- _wrap_pass( LoopRotate )
- _wrap_pass( LoopSimplify )
- _wrap_pass( LoopStrengthReduce )
-@@ -841,7 +841,7 @@
- _wrap_pass( NoProfileInfo )
- _wrap_pass( OptimalEdgeProfiler )
- _wrap_pass( PartialInlining )
--_wrap_pass( PartialSpecialization )
-+//_wrap_pass( PartialSpecialization )
- _wrap_pass( PostDomOnlyPrinter )
- _wrap_pass( PostDomOnlyViewer )
- _wrap_pass( PostDomPrinter )
-@@ -855,7 +855,7 @@
- _wrap_pass( ScalarEvolutionAliasAnalysis )
- _wrap_pass( ScalarReplAggregates )
- _wrap_pass( SCCP )
--_wrap_pass( SimplifyHalfPowrLibCalls )
-+//_wrap_pass( SimplifyHalfPowrLibCalls )
- _wrap_pass( SimplifyLibCalls )
- _wrap_pass( SingleLoopExtractor )
- _wrap_pass( StripDeadPrototypes )
-@@ -1162,7 +1162,7 @@
- Py_RETURN_NONE;
- }
-
--_wrap_obj2obj(LLVMInlineFunction, LLVMValueRef, int)
-+//_wrap_obj2obj(LLVMInlineFunction, LLVMValueRef, int)
-
- /* Expose the void* inside a PyCObject as a PyLong. This allows us to
- * use it as a unique ID. */
-@@ -1569,7 +1569,7 @@
- _pass( EdgeProfiler )
- _pass( FunctionAttrs )
- _pass( FunctionInlining )
-- _pass( GEPSplitter )
-+ //_pass( GEPSplitter )
- _pass( GlobalDCE )
- _pass( GlobalOptimizer )
- _pass( GlobalsModRef )
-@@ -1584,11 +1584,11 @@
- _pass( LazyValueInfo )
- _pass( LCSSA )
- _pass( LICM )
-- _pass( LiveValues )
-+ //_pass( LiveValues )
- _pass( LoopDeletion )
- _pass( LoopDependenceAnalysis )
- _pass( LoopExtractor )
-- _pass( LoopIndexSplit )
-+ //_pass( LoopIndexSplit )
- _pass( LoopRotate )
- _pass( LoopSimplify )
- _pass( LoopStrengthReduce )
-@@ -1603,7 +1603,7 @@
- _pass( NoProfileInfo )
- _pass( OptimalEdgeProfiler )
- _pass( PartialInlining )
-- _pass( PartialSpecialization )
-+ //_pass( PartialSpecialization )
- _pass( PostDomOnlyPrinter )
- _pass( PostDomOnlyViewer )
- _pass( PostDomPrinter )
-@@ -1617,7 +1617,7 @@
- _pass( ScalarEvolutionAliasAnalysis )
- _pass( ScalarReplAggregates )
- _pass( SCCP )
-- _pass( SimplifyHalfPowrLibCalls )
-+ //_pass( SimplifyHalfPowrLibCalls )
- _pass( SimplifyLibCalls )
- _pass( SingleLoopExtractor )
- _pass( StripDeadPrototypes )
-@@ -1672,7 +1672,7 @@
- /* Misc */
- _method( LLVMGetIntrinsic )
- _method( LLVMLoadLibraryPermanently )
-- _method( LLVMInlineFunction )
-+ //_method( LLVMInlineFunction )
- _method( PyCObjectVoidPtrToPyLong )
-
- { NULL }
-Index: extra.h
-===================================================================
---- extra.h (revision 105)
-+++ extra.h (working copy)
-@@ -181,7 +181,7 @@
- /* Wraps llvm::InlineFunction(). Inlines a function. C is the call
- * instruction, created by LLVMBuildCall. Even if it fails, the Function
- * containing the call is still in a proper state (not changed). */
--int LLVMInlineFunction(LLVMValueRef call);
-+//int LLVMInlineFunction(LLVMValueRef call);
-
- /* Wraps llvm::getAlignmentFromAttrs from Attributes.h. Compliments the
- * already available LLVMSetParamAlignment(). */
-@@ -209,13 +209,13 @@
- declare_pass( DomPrinter )
- declare_pass( DomViewer )
- declare_pass( EdgeProfiler )
--declare_pass( GEPSplitter )
-+//declare_pass( GEPSplitter )
- declare_pass( GlobalsModRef )
- declare_pass( InstCount )
- declare_pass( InstructionNamer )
- declare_pass( LazyValueInfo )
- declare_pass( LCSSA )
--declare_pass( LiveValues )
-+//declare_pass( LiveValues )
- declare_pass( LoopDependenceAnalysis )
- declare_pass( LoopExtractor )
- declare_pass( LoopSimplify )
-@@ -227,7 +227,7 @@
- declare_pass( NoProfileInfo )
- declare_pass( OptimalEdgeProfiler )
- declare_pass( PartialInlining )
--declare_pass( PartialSpecialization )
-+//declare_pass( PartialSpecialization )
- declare_pass( PostDomOnlyPrinter )
- declare_pass( PostDomOnlyViewer )
- declare_pass( PostDomPrinter )
diff --git a/llvm/__init__.py b/llvm/__init__.py
index 8f61f35..e69de29 100644
--- a/llvm/__init__.py
+++ b/llvm/__init__.py
@@ -1,154 +0,0 @@
-"""
-Common classes related to LLVM.
-"""
-
-from ._version import get_versions
-__version__ = get_versions()['version']
-del get_versions
-
-
-from weakref import WeakValueDictionary
-from . import _core
-
-#===----------------------------------------------------------------------===
-# LLVM Version
-#===----------------------------------------------------------------------===
-
-version = _core.LLVMGetVersion()
-
-def require_version_at_least(major, minor):
- '''Sentry to guard version requirement
- '''
- if version < (major, minor):
- raise Exception(major, minor)
-
-#===----------------------------------------------------------------------===
-# Exceptions
-#===----------------------------------------------------------------------===
-
-class LLVMException(Exception):
- """Generic LLVM exception."""
-
- def __init__(self, msg=""):
- Exception.__init__(self, msg)
-
-
-#===----------------------------------------------------------------------===
-# Ownables
-#===----------------------------------------------------------------------===
-
-class Ownable(object):
- """Objects that can be owned.
-
- Modules and Module Providers can be owned, i.e., the responsibility of
- destruction of ownable objects can be handed over to other objects. The
- llvm.Ownable class represents objects that can be so owned. This class
- is NOT intended for public use.
- """
-
- def __init__(self, ptr, del_fn):
- self.ptr = ptr
- self.owner = None
- self.del_fn = del_fn
-
- def _own(self, owner):
- if self.owner:
- raise LLVMException("object already owned")
- self.owner = owner
-
- def _disown(self):
- if not self.owner:
- raise LLVMException("not owned")
- self.owner = None
-
- def __del__(self):
- if not self.owner:
- self.del_fn(self.ptr)
-
-
-#===----------------------------------------------------------------------===
-# Dummy owner, will not delete ownee. Be careful.
-#===----------------------------------------------------------------------===
-
-class DummyOwner(object):
- pass
-
-
-#===----------------------------------------------------------------------===
-# A metaclass to prevent aliasing. It stores a (weak) reference to objects
-# constructed based on a PyCObject. If an object is constructed based on a
-# PyCObject with the same underlying pointer as a previous object, a reference
-# to the previous object is returned rather than a new one.
-#===----------------------------------------------------------------------===
-
-class _ObjectCache(type):
- """A metaclass to prevent aliasing.
-
- Classes using 'ObjectCache' as a metaclass must have constructors
- that take a PyCObject as their first argument. When the class is
- called (to create a new instance of the class), the value of the
- pointer wrapped by the PyCObj is checked:
-
- If no previous object has been created based on the same
- underlying pointer (note that different PyCObject objects can
- wrap the same pointer), the object will be initialized as
- usual and returned.
-
- If a previous has been created based on the same pointer,
- then a reference to that object will be returned, and no
- object initialization is performed.
- """
-
- __instances = WeakValueDictionary()
-
- def __call__(cls, ptr, *args, **kwargs):
- objid = _core.PyCObjectVoidPtrToPyLong(ptr)
- key = "%s:%d" % (cls.__name__, objid)
- obj = _ObjectCache.__instances.get(key)
- if obj is None:
- obj = super(_ObjectCache, cls).__call__(ptr, *args, **kwargs)
- _ObjectCache.__instances[key] = obj
- return obj
-
- @staticmethod
- def forget(obj):
- objid = _core.PyCObjectVoidPtrToPyLong(obj.ptr)
- key = "%s:%d" % (type(obj).__name__, objid)
- if key in _ObjectCache.__instances:
- del _ObjectCache.__instances[key]
-
-
-#===----------------------------------------------------------------------===
-# Cacheables
-#===----------------------------------------------------------------------===
-
-# version 2/3 compatibility help
-# version 2 metaclass
-# class Cacheable(object):
-# __metaclass__ = _ObjectCache # Doing nothing for version 3
-#
-# version 3 metaclass
-# class Cacheable(metaclass=_ObjectCache):
-#
-# Reference: http://mikewatkins.ca/2008/11/29/python-2-and-3-metaclasses/#using-the-metaclass-in-python-3-x
-ObjectCache = _ObjectCache('ObjectCache', (object, ), {})
-
-class Cacheable(ObjectCache):
- """Objects that can be cached.
-
- Objects that wrap a PyCObject are cached to avoid "aliasing", i.e.,
- two Python objects each containing a PyCObject which internally points
- to the same C pointer."""
-
- def forget(self):
- ObjectCache.forget(self)
-
-
-def test(verbosity=1):
- """test(verbosity=1) -> TextTestResult
-
- Run self-test, and return unittest.runner.TextTestResult object.
- """
- from llvm.test_llvmpy import run
-
- return run(verbosity=verbosity)
diff --git a/llvm/_core.cpp b/llvm/_core.cpp
deleted file mode 100644
index db5287e..0000000
--- a/llvm/_core.cpp
+++ /dev/null
@@ -1,2212 +0,0 @@
-/*
- * Copyright (c) 2008-10, Mahadevan R All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * * Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * * Neither the name of this software, nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/* our includes */
-#include "wrap.h"
-#include "extra.h"
-
-
-
-// Python include
-#include "Python.h"
-
-/* LLVM includes */
-#include "llvm-c/Analysis.h"
-#include "llvm-c/Transforms/Scalar.h"
-#include "llvm-c/ExecutionEngine.h"
-#include "llvm-c/Target.h"
-#include "llvm-c/Transforms/IPO.h"
-
-#include "llvm/Support/CommandLine.h"
-#if LLVM_VERSION_MAJOR >= 3 && LLVM_VERSION_MINOR >= 2
- #include "llvm-c/Linker.h"
-#else
- typedef unsigned int LLVMLinkerMode;
-#endif
-
-/* Compatibility with Python 2.4: Py_ssize_t is not available. */
-#ifndef PY_SSIZE_T_MAX
-typedef int Py_ssize_t;
-#endif
-
-
-// explicit specializations
-template <> PyObject* pycap_new(int i)
-{
- return PyLong_FromLong(static_cast(i));
-}
-
-template <> PyObject* pycap_new(unsigned long i)
-{
- return PyLong_FromLong(static_cast(i));
-}
-
-template <> PyObject* pycap_new(LLVMTypeKind i)
-{
- return PyLong_FromLong(static_cast(i));
-}
-
-template <> PyObject* pycap_new(LLVMLinkage i)
-{
- return PyLong_FromLong(static_cast |