Add binding for Attributes, Argument, Constants, CallingConv, GlobalValue, GlobalVariable, etc.

This commit is contained in:
Siu Kwan Lam 2013-02-06 21:30:36 -06:00
commit cd1fa4c4d8
22 changed files with 692 additions and 35 deletions

View file

@ -69,6 +69,7 @@ LongLong = BuiltinTypes('long long')
Float = BuiltinTypes('float') Float = BuiltinTypes('float')
Double = BuiltinTypes('double') Double = BuiltinTypes('double')
Uint64 = BuiltinTypes('uint64_t') Uint64 = BuiltinTypes('uint64_t')
Int64 = BuiltinTypes('int64_t')
Size_t = BuiltinTypes('size_t') Size_t = BuiltinTypes('size_t')
VoidPtr = BuiltinTypes('void*') VoidPtr = BuiltinTypes('void*')
Bool = BuiltinTypes('bool') Bool = BuiltinTypes('bool')

View file

@ -64,6 +64,28 @@ int py_str_to(PyObject *strobj, const char* &strref){
return 1; return 1;
} }
static
int py_int_to(PyObject *intobj, int64_t & val){
if (!PyInt_Check(intobj)) {
// raise TypeError
PyErr_SetString(PyExc_TypeError, "Expecting an int");
return 0;
}
if (PyLong_Check(intobj)) {
val = PyLong_AsLongLong(intobj);
} else {
val = PyInt_AsLong(intobj);
}
if (PyErr_Occurred()){
return NULL;
}
// success
return 1;
}
static static
int py_int_to(PyObject *intobj, unsigned & val){ int py_int_to(PyObject *intobj, unsigned & val){
if (!PyInt_Check(intobj)) { if (!PyInt_Check(intobj)) {

View file

@ -11,6 +11,8 @@
#include <llvm/ExecutionEngine/GenericValue.h> #include <llvm/ExecutionEngine/GenericValue.h>
#include <llvm/Linker.h> #include <llvm/Linker.h>
#include <llvm/Module.h> #include <llvm/Module.h>
#include <llvm/Analysis/Verifier.h>
#include <llvm/Constants.h>
#include "auto_pyobject.h" #include "auto_pyobject.h"
@ -171,6 +173,33 @@ PyObject* iplist_to_pylist(iplist &IPL, const char * capsuleName,
className); className);
} }
template<class ElemTy>
struct extract {
template<class VecTy>
static
bool from_py_sequence(VecTy& vec, PyObject* seq, const char *capsuleName)
{
Py_ssize_t N = PySequence_Size(seq);
for (Py_ssize_t i = 0; i < N; ++i) {
auto_pyobject item = PySequence_GetItem(seq, i);
if (!item) {
return false;
}
auto_pyobject capsule = PyObject_GetAttrString(*item, "_ptr");
if (!capsule) {
return false;
}
void* ptr = PyCapsule_GetPointer(*capsule, capsuleName);
if (!ptr) {
return false;
}
vec.push_back(static_cast<ElemTy*>(ptr));
}
return true;
}
};
//static //static
//bool string_equal(const char *A, const char *B){ //bool string_equal(const char *A, const char *B){
// for (; *A and *B; ++A, ++B) { // for (; *A and *B; ++A, ++B) {
@ -492,7 +521,7 @@ PyObject* TargetMachine_addPassesToEmitFile(
if (!buf) { if (!buf) {
return NULL; return NULL;
} }
if ( -1 == PyFile_WriteObject(buf, Out, Py_PRINT_RAW) ){ if (-1 == PyFile_WriteObject(buf, Out, Py_PRINT_RAW)){
return NULL; return NULL;
} }
Py_RETURN_TRUE; Py_RETURN_TRUE;
@ -501,6 +530,30 @@ PyObject* TargetMachine_addPassesToEmitFile(
} }
} }
static
PyObject* Constant_getIntegerValue(llvm::Type* Ty, PyObject* pyint)
{
using namespace llvm;
if (!Ty->isIntegerTy()) {
PyErr_SetString(PyExc_ValueError, "Type should be of integer type.");
return NULL;
}
unsigned width = Ty->getIntegerBitWidth();
if (width > sizeof(unsigned long long)*8) {
PyErr_SetString(PyExc_ValueError, "Integer value is too large.");
}
Constant* K;
if (PyLong_Check(pyint)){
APInt apint(width, PyLong_AsLongLong(pyint), true);
K = Constant::getIntegerValue(Ty, apint);
} else {
APInt apint(width, PyInt_AsLong(pyint), true);
K = Constant::getIntegerValue(Ty, apint);
}
return pycapsule_new(K, "llvm::Value", "llvm::Constant");
}
static static
PyObject* Linker_LinkInModule(llvm::Linker* Linker, PyObject* Linker_LinkInModule(llvm::Linker* Linker,
llvm::Module* Mod, llvm::Module* Mod,
@ -543,24 +596,8 @@ PyObject* StructType_setBody(llvm::StructType* Self,
{ {
using namespace llvm; using namespace llvm;
std::vector<Type*> elements; std::vector<Type*> elements;
Py_ssize_t N = PySequence_Size(Elems); extract<Type>::from_py_sequence(elements, Elems, "llvm::Type");
elements.reserve(N);
for (Py_ssize_t i=0; i < N; ++i) {
auto_pyobject obj = PySequence_GetItem(Elems, i);
auto_pyobject capsule = PyObject_GetAttrString(*obj, "_ptr");
if (!capsule) {
return NULL;
}
void * ptr = PyCapsule_GetPointer(*capsule, "llvm::Type");
if (!ptr) {
return NULL;
}
Type* type = static_cast<Type*>(ptr);
elements.push_back(type);
}
Self->setBody(elements, isPacked); Self->setBody(elements, isPacked);
Py_RETURN_NONE; Py_RETURN_NONE;
} }
@ -578,3 +615,82 @@ PyObject* Module_list_functions(llvm::Module* Mod)
"llvm::Value", "llvm::Function"); "llvm::Value", "llvm::Function");
} }
static
PyObject* Module_list_named_metadata(llvm::Module* Mod)
{
return iplist_to_pylist(Mod->getFunctionList(),
"llvm::NamedMDNode", "llvm::NamedMDNode");
}
static
PyObject* llvm_verifyModule(const llvm::Module& Fn,
llvm::VerifierFailureAction Action,
PyObject* ErrMsg)
{
std::string errmsg;
bool failed = llvm::verifyModule(Fn, Action, &errmsg);
if (failed) {
if (-1 == PyFile_WriteString(errmsg.c_str(), ErrMsg)) {
return NULL;
}
Py_RETURN_TRUE;
} else {
Py_RETURN_FALSE;
}
}
static
PyObject* ConstantArray_get(llvm::ArrayType* Ty, PyObject* Consts)
{
using namespace llvm;
std::vector<Constant*> vec_consts;
bool ok = extract<Constant>::from_py_sequence(vec_consts, Consts,
"llvm::Value");
if (not ok) return NULL;
Constant* ary = ConstantArray::get(Ty, vec_consts);
return pycapsule_new(ary, "llvm::Value", "llvm::Constant");
}
static
PyObject* ConstantStruct_get(llvm::StructType* Ty, PyObject* Elems)
{
using namespace llvm;
std::vector<Constant*> vec_consts;
bool ok = extract<Constant>::from_py_sequence(vec_consts, Elems,
"llvm::Value");
if (not ok) return NULL;
Constant* ary = ConstantStruct::get(Ty, vec_consts);
return pycapsule_new(ary, "llvm::Value", "llvm::Constant");
}
static
PyObject* ConstantStruct_getAnon(PyObject* Elems,
bool isPacked=false)
{
using namespace llvm;
std::vector<Constant*> vec_consts;
bool ok = extract<Constant>::from_py_sequence(vec_consts, Elems,
"llvm::Value");
if (not ok) return NULL;
Constant* ary = ConstantStruct::getAnon(vec_consts, isPacked);
return pycapsule_new(ary, "llvm::Value", "llvm::Constant");
}
static
PyObject* ConstantVector_get(PyObject* Elems)
{
using namespace llvm;
std::vector<Constant*> vec_consts;
bool ok = extract<Constant>::from_py_sequence(vec_consts, Elems,
"llvm::Value");
if (not ok) return NULL;
Constant* ary = ConstantVector::get(vec_consts);
return pycapsule_new(ary, "llvm::Value", "llvm::Constant");
}

View file

@ -0,0 +1,25 @@
from binding import *
from ..namespace import llvm
from ..Module import Module
from ..Function import Function
llvm.includes.add('llvm/Analysis/Verifier.h')
VerifierFailureAction = llvm.Enum('VerifierFailureAction',
'''AbortProcessAction
PrintMessageAction
ReturnStatusAction''')
verifyModule = llvm.CustomFunction('verifyModule',
'llvm_verifyModule',
PyObjectPtr, # boolean -- failed?
ref(Module),
VerifierFailureAction,
PyObjectPtr, # errmsg
)
verifyFunction = llvm.Function('verifyFunction',
cast(Bool, bool), # failed?
ref(Function),
VerifierFailureAction)

View file

@ -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()

View file

@ -1,9 +1,13 @@
from binding import * from binding import *
from namespace import llvm from namespace import llvm
from Value import Argument from Value import Argument
from Attributes import Attributes
@Argument @Argument
class Argument: class Argument:
_include_ = 'llvm/Argument.h' _include_ = 'llvm/Argument.h'
addAttr = Method(Void, ref(Attributes))
removeAttr = Method(Void, ref(Attributes))
getParamAlignment = Method(cast(Unsigned, int))

View file

@ -0,0 +1,39 @@
from binding import *
from namespace import llvm
from LLVMContext import LLVMContext
llvm.includes.add('llvm/Attributes.h')
Attributes = llvm.Class()
AttrBuilder = llvm.Class()
@Attributes
class Attributes:
AttrVal = Enum('''None, AddressSafety, Alignment, AlwaysInline,
ByVal, InlineHint, InReg, MinSize,
Naked, Nest, NoAlias, NoCapture,
NoImplicitFloat, NoInline, NonLazyBind, NoRedZone,
NoReturn, NoUnwind, OptimizeForSize, ReadNone,
ReadOnly, ReturnsTwice, SExt, StackAlignment,
StackProtect, StackProtectReq, StructRet, UWTable, ZExt''')
delete = Destructor()
get = Method(Attributes, ref(LLVMContext), ref(AttrBuilder))
@AttrBuilder
class AttrBuilder:
new = Constructor()
delete = Destructor()
clear = Method()
addAttribute = Method(ref(AttrBuilder), Attributes.AttrVal)
removeAttribute = Method(ref(AttrBuilder), Attributes.AttrVal)
addAlignmentAttr = Method(ref(AttrBuilder), cast(int, Unsigned))

View file

@ -0,0 +1,11 @@
from binding import *
from namespace import llvm
@llvm.Class() # actually a namespace
class CallingConv:
ID = Enum('''
C, Fast, Cold, GHC, FirstTargetCC, X86_StdCall, X86_FastCall,
ARM_APCS, ARM_AAPCS, ARM_AAPCS_VFP, MSP430_INTR, X86_ThisCall,
PTX_Kernel, PTX_Device, MBLAZE_INTR, MBLAZE_SVOL, SPIR_FUNC,
SPIR_KERNEL, Intel_OCL_BI
''') # HiPE

View file

@ -1,8 +1,266 @@
from binding import * from binding import *
from namespace import llvm from namespace import llvm
from Value import Constant from LLVMContext import LLVMContext
from ADT.StringRef import StringRef
from ADT.SmallVector import SmallVector_Value, SmallVector_Unsigned
from Type import Type, IntegerType, ArrayType, StructType
from Value import Constant, Value
from Instruction import CmpInst
@Constant @Constant
class Constant: class Constant:
_downcast_ = Value
isNullValue = Method(cast(bool, Bool))
isAllOnesValue = Method(cast(bool, Bool))
isNegativeZeroValue = Method(cast(bool, Bool))
#isZeroValue = Method(cast(bool, Bool))
canTrap = Method(cast(bool, Bool))
isThreadDependent = Method(cast(bool, Bool))
isConstantUsed = Method(cast(bool, Bool))
_getAggregateElement_by_int = Method(ptr(Constant), cast(int, Unsigned))
_getAggregateElement_by_int.realname = 'getAggregateElement'
_getAggregateElement_by_const = Method(ptr(Constant), ptr(Constant))
_getAggregateElement_by_const.realname = 'getAggregateElement'
@CustomPythonMethod
def getAggregateElement(self, elt):
if isinstance(elt, Constant):
return self._getAggregateElement_by_const(elt)
else:
return self._getAggregateElement_by_int(elt)
removeDeadConstantUsers = Method()
getNullValue = StaticMethod(ptr(Constant), ptr(Type))
getAllOnesValue = StaticMethod(ptr(Constant), ptr(Type))
getIntegerValue = CustomStaticMethod('Constant_getIntegerValue',
PyObjectPtr, # ptr(Constant),
ptr(Type),
PyObjectPtr)
UndefValue = llvm.Class(Constant)
@UndefValue
class UndefValue:
getSequentialElement = Method(ptr(UndefValue))
getStructElement = Method(ptr(UndefValue), cast(int, Unsigned))
_getElementValue_by_const = Method(ptr(UndefValue), ptr(Constant))
_getElementValue_by_const.realname = 'getElementValue'
_getElementValue_by_int = Method(ptr(UndefValue), cast(int, Unsigned))
_getElementValue_by_int.realname = 'getElementValue'
@CustomPythonMethod
def getElementValue(self, idx):
if isinstance(idx, Constant):
return self._getElementValue_by_const(idx)
else:
return self._getElementValue_by_int(idx)
destroyConstant = Method()
get = StaticMethod(ptr(UndefValue), ptr(Type))
ConstantInt = llvm.Class(Constant)
@ConstantInt
class ConstantInt:
get = StaticMethod(ptr(ConstantInt),
ptr(IntegerType),
cast(int, Unsigned),
cast(bool, Bool),
).require_only(2)
isValueValidForType = StaticMethod(cast(Bool, bool),
ptr(Type),
cast(int, Int64))
getZExtValue = Method(cast(Uint64, int))
getSExtValue = Method(cast(Int64, int))
ConstantFP = llvm.Class(Constant)
@ConstantFP
class ConstantFP:
get = StaticMethod(ptr(Constant), ptr(Type), cast(float, Double))
getNegativeZero = StaticMethod(ptr(ConstantFP), ptr(Type))
getInfinity = StaticMethod(ptr(ConstantFP), ptr(Type), cast(bool, Bool))
isZero = Method(cast(Bool, bool))
isNegative = Method(cast(Bool, bool))
isNaN = Method(cast(Bool, bool))
ConstantArray = llvm.Class(Constant)
@ConstantArray
class ConstantArray:
get = CustomStaticMethod('ConstantArray_get',
PyObjectPtr, # ptr(Constant),
ptr(ArrayType),
PyObjectPtr, # Constants
)
ConstantStruct = llvm.Class(Constant)
@ConstantStruct
class ConstantStruct:
get = CustomStaticMethod('ConstantStruct_get',
PyObjectPtr, # ptr(Constant)
ptr(StructType),
PyObjectPtr, # Constants
)
getAnon = CustomStaticMethod('ConstantStruct_getAnon',
PyObjectPtr, # ptr(Constant)
PyObjectPtr, # constants
cast(bool, Bool), # packed
).require_only(1)
ConstantVector = llvm.Class(Constant)
@ConstantVector
class ConstantVector:
get = CustomStaticMethod('ConstantVector_get',
PyObjectPtr, # ptr(Constant)
PyObjectPtr, # constants
)
ConstantDataSequential = llvm.Class(Constant)
@ConstantDataSequential
class ConstantDataSequential:
pass pass
ConstantDataArray = llvm.Class(ConstantDataSequential)
@ConstantDataArray
class ConstantDataArray:
getString = StaticMethod(ptr(Constant),
ref(LLVMContext),
cast(str, StringRef),
cast(bool, Bool)
).require_only(2)
ConstantExpr = llvm.Class(Constant)
def _factory(*args):
return StaticMethod(ptr(Constant), *args)
def _factory_const(*args):
return _factory(ptr(Constant), *args)
def _factory_const2(*args):
return _factory(ptr(Constant), ptr(Constant), *args)
def _factory_const_nuw_nsw():
return _factory_const(cast(bool, Bool), cast(bool, Bool)).require_only(1)
def _factory_const2_nuw_nsw():
return _factory_const2(cast(bool, Bool), cast(bool, Bool)).require_only(2)
def _factory_const2_exact():
return _factory_const2(cast(bool, Bool)).require_only(2)
def _factory_const_type():
return _factory_const(ptr(Type))
@ConstantExpr
class ConstantExpr:
getAlignOf = _factory(ptr(Type))
getSizeOf = _factory(ptr(Type))
getOffsetOf = _factory(ptr(Type), ptr(Constant))
getNeg = _factory_const_nuw_nsw()
getFNeg = _factory_const()
getNot = _factory_const()
getAdd = _factory_const2_nuw_nsw()
getFAdd = _factory_const2()
getSub = _factory_const2_nuw_nsw()
getFSub = _factory_const2()
getMul = _factory_const2_nuw_nsw()
getFMul = _factory_const2()
getUDiv = _factory_const2_exact()
getSDiv = _factory_const2_exact()
getFDiv = _factory_const2()
getURem = _factory_const2()
getSRem = _factory_const2()
getFRem = _factory_const2()
getAnd = _factory_const2()
getOr = _factory_const2()
getXor = _factory_const2()
getShl = _factory_const2_nuw_nsw()
getLShr = _factory_const2_exact()
getAShr = _factory_const2_exact()
getTrunc = _factory_const_type()
getSExt = _factory_const_type()
getZExt = _factory_const_type()
getFPTrunc = _factory_const_type()
getFPExtend = _factory_const_type()
getUIToFP = _factory_const_type()
getSIToFP = _factory_const_type()
getFPToUI = _factory_const_type()
getFPToSI = _factory_const_type()
getPtrToInt = _factory_const_type()
getIntToPtr = _factory_const_type()
getBitCast = _factory_const_type()
getCompare = _factory(CmpInst.Predicate, ptr(Constant), ptr(Constant))
getICmp = _factory(CmpInst.Predicate, ptr(Constant), ptr(Constant))
getFCmp = _factory(CmpInst.Predicate, ptr(Constant), ptr(Constant))
getPointerCast = _factory_const_type()
getIntegerCast = _factory_const(ptr(Type), cast(bool, Bool))
getFPCast = _factory_const_type()
getSelect = _factory(ptr(Constant), ptr(Constant), ptr(Constant))
_getGEP = _factory(ptr(Constant), ref(SmallVector_Value), cast(bool, Bool))
_getGEP.require_only(2)
_getGEP.realname = 'getGetElementPtr'
@CustomPythonStaticMethod
def getGetElementPtr(*args):
import extra
args = list(args)
valuelist = args[1]
args[1] = extra.make_small_vector_from_values(*valuelist)
return ConstantExpr._getGEP(*args)
getExtractElement = _factory_const2()
getInsertElement = _factory_const2(ptr(Constant))
getShuffleVector = _factory_const2(ptr(Constant))
_getExtractValue = _factory(ptr(Constant), ref(SmallVector_Unsigned))
_getExtractValue.realname = 'getExtractValue'
@CustomPythonStaticMethod
def getExtractValue(*args):
import extra
args = list(args)
valuelist = args[1]
args[1] = extra.make_small_vector_from_unsigned(*valuelist)
return ConstantExpr._getExtractValue(*args)
_getInsertValue = _factory(ptr(Constant), ptr(Constant),
ref(SmallVector_Unsigned))
_getInsertValue.realname = 'getInsertValue'
@CustomPythonStaticMethod
def getInsertValue(*args):
import extra
args = list(args)
valuelist = args[2]
args[1] = extra.make_small_vector_from_unsigned(*valuelist)
return ConstantExpr._getInsertValue(*args)
getOpcode = Method(cast(Unsigned, int))
getOpcodeName = Method(cast(ConstCharPtr, str))
isCast = Method(cast(Bool, bool))
isCompare = Method(cast(Bool, bool))
hasIndices = Method(cast(Bool, bool))
isGEPWithNoNotionalOverIndexing = Method(cast(Bool, bool))

View file

@ -25,7 +25,6 @@ class FunctionType:
else: else:
return FunctionType._get(*args) return FunctionType._get(*args)
isVarArg = Method(cast(Bool, bool)) isVarArg = Method(cast(Bool, bool))
getReturnType = Method(ptr(Type)) getReturnType = Method(ptr(Type))
getParamType = Method(ptr(Type), cast(int, Unsigned)) getParamType = Method(ptr(Type), cast(int, Unsigned))

View file

@ -4,6 +4,7 @@ from Value import GlobalValue, Constant, Function, Argument
from Type import Type from Type import Type
from DerivedTypes import FunctionType from DerivedTypes import FunctionType
from LLVMContext import LLVMContext from LLVMContext import LLVMContext
from CallingConv import CallingConv
@Function @Function
class Function: class Function:
@ -17,5 +18,9 @@ class Function:
getIntrinsicID = Method(cast(Unsigned, int)) getIntrinsicID = Method(cast(Unsigned, int))
isIntrinsic = Method(cast(Bool, bool)) isIntrinsic = Method(cast(Bool, bool))
getCallingConv = Method(CallingConv.ID)
setCallingConv = Method(Void, CallingConv.ID)
getArgumentList = CustomMethod('Function_getArgumentList', PyObjectPtr) getArgumentList = CustomMethod('Function_getArgumentList', PyObjectPtr)
getBasicBlockList = CustomMethod('Function_getBasicBlockList', PyObjectPtr) getBasicBlockList = CustomMethod('Function_getBasicBlockList', PyObjectPtr)

View file

@ -1,6 +1,8 @@
from binding import * from binding import *
from namespace import llvm from namespace import llvm
from Value import GlobalValue from Value import GlobalValue
from Module import Module
from ADT.StringRef import StringRef
@GlobalValue @GlobalValue
class GlobalValue: class GlobalValue:
@ -24,3 +26,22 @@ class GlobalValue:
setVisibility = Method(Void, VisibilityTypes) setVisibility = Method(Void, VisibilityTypes)
getVisibility = Method(VisibilityTypes) getVisibility = Method(VisibilityTypes)
setLinkage = Method(Void, LinkageTypes)
getLinkage = Method(LinkageTypes)
getAlignment = Method(cast(Unsigned, int))
setAlignment = Method(Void, cast(int, Unsigned))
hasSection = Method(cast(Bool, bool))
getSection = Method(cast(ConstStdString, str))
setSection = Method(Void, cast(str, StringRef))
isDiscardableIfUnused = Method(cast(Bool, bool))
mayBeOverridden = Method(cast(Bool, bool))
isWeakForLinker = Method(cast(Bool, bool))
copyAttributesFrom = Method(Void, ptr(GlobalValue))
destroyConstant = Method()
isDeclaration = Method(cast(Bool, bool))
removeFromParent = Method()
eraseFromParent = Method()
getParent = Method(ptr(Module))

View file

@ -33,7 +33,7 @@ class GlobalVariable:
isThreadLocal = Method(cast(Bool, bool)) isThreadLocal = Method(cast(Bool, bool))
isConstant = Method(cast(Bool, bool)) isConstant = Method(cast(Bool, bool))
setConstant = Method(Void, ptr(Constant)) setConstant = Method(Void, cast(bool, Bool))
setInitializer = Method(Void, ptr(Constant)) setInitializer = Method(Void, ptr(Constant))
getInitializer = Method(ptr(Constant)) getInitializer = Method(ptr(Constant))
@ -45,4 +45,5 @@ class GlobalVariable:
# isExternallyInitialized = Method(cast(Bool, bool)) # isExternallyInitialized = Method(cast(Bool, bool))
# setExternallyinitialized = Method(Void, cast(bool, Bool)) # setExternallyinitialized = Method(Void, cast(bool, Bool))
eraseFromParent = Method()

View file

@ -242,13 +242,32 @@ class IRBuilder:
ptr(Value), cast(str, StringRef)) ptr(Value), cast(str, StringRef))
CreateShuffleVector.require_only(3) CreateShuffleVector.require_only(3)
CreateExtractValue = Method(ptr(Value), ptr(Value), ref(SmallVector_Unsigned), _CreateExtractValue = Method(ptr(Value), ptr(Value),
cast(str, StringRef)) ref(SmallVector_Unsigned),
CreateExtractValue.require_only(2) cast(str, StringRef))
_CreateExtractValue.require_only(2)
_CreateExtractValue.realname = 'CreateExtractValue'
CreateInsertValue = Method(ptr(Value), ptr(Value), ptr(Value), @CustomPythonMethod
def CreateExtractValue(self, args):
import extra
args = list(args)
valuelist = args[1]
args[1] = extra.make_small_vector_from_unsigned(*valuelist)
return self._CreateExtractValue(*args)
_CreateInsertValue = Method(ptr(Value), ptr(Value), ptr(Value),
ref(SmallVector_Unsigned), cast(str, StringRef)) ref(SmallVector_Unsigned), cast(str, StringRef))
CreateInsertValue.require_only(3) _CreateInsertValue.require_only(3)
_CreateInsertValue.realname = 'CreateInsertValue'
@CustomPythonMethod
def CreateInsertValue(self, args):
import extra
args = list(args)
valuelist = args[2]
args[1] = extra.make_small_vector_from_unsigned(*valuelist)
return self._CreateInsertValue(*args)
CreateLandingPad = Method(ptr(LandingPadInst), ptr(Type), ptr(Value), CreateLandingPad = Method(ptr(LandingPadInst), ptr(Type), ptr(Value),
cast(int, Unsigned), cast(str, StringRef)) cast(int, Unsigned), cast(str, StringRef))

View file

@ -1,7 +1,24 @@
from binding import * from binding import *
from namespace import llvm from namespace import llvm
from Value import MDNode from Value import MDNode
from ADT.StringRef import StringRef
from Module import Module
from Support.raw_ostream import raw_ostream
from Assembly.AssemblyAnnotationWriter import AssemblyAnnotationWriter
@MDNode @MDNode
class MDNode: class MDNode:
pass pass
@llvm.Class()
class NamedMDNode:
eraseFromParent = Method()
dropAllReferences = Method()
getParent = Method(ptr(Module))
getOperand = Method(ptr(MDNode), cast(int, Unsigned))
getNumOperands = Method(cast(Unsigned, int))
getName = Method(cast(StringRef, str))
print_ = Method(Void, ref(raw_ostream), ptr(AssemblyAnnotationWriter))
print_.realname = "print"
dump = Method()

View file

@ -12,6 +12,7 @@ from DerivedTypes import FunctionType
from Support.raw_ostream import raw_ostream from Support.raw_ostream import raw_ostream
from Assembly.AssemblyAnnotationWriter import AssemblyAnnotationWriter from Assembly.AssemblyAnnotationWriter import AssemblyAnnotationWriter
from Type import Type, StructType from Type import Type, StructType
from Metadata import NamedMDNode
@Module @Module
class Module: class Module:
@ -59,6 +60,16 @@ class Module:
# GlobalVariable Iteration # GlobalVariable Iteration
list_globals = CustomMethod('Module_list_globals', PyObjectPtr) list_globals = CustomMethod('Module_list_globals', PyObjectPtr)
# Named MetaData Accessors
getNamedMetadata = Method(ptr(NamedMDNode), cast(str, StringRef))
getOrInsertNamedMetadata = Method(ptr(NamedMDNode), cast(str, StringRef))
eraseNamedMetadata = Method(Void, ptr(NamedMDNode))
# Named MetaData Iteration
list_named_metadata = CustomMethod('Module_list_named_metadata',
PyObjectPtr)
# Utilities # Utilities
dump = Method(Void) dump = Method(Void)
print_ = Method(Void, ref(raw_ostream), ptr(AssemblyAnnotationWriter)) print_ = Method(Void, ref(raw_ostream), ptr(AssemblyAnnotationWriter))
@ -74,5 +85,3 @@ class Module:
dropAllReferences = Method() dropAllReferences = Method()
getTypeByName = Method(ptr(StructType), cast(str, StringRef)) getTypeByName = Method(ptr(StructType), cast(str, StringRef))

View file

@ -0,0 +1,8 @@
from binding import *
from src.namespace import llvm
from src.Module import Module
llvm.includes.add('llvm/Transforms/Utils/Cloning.h')
CloneModule = llvm.Function('CloneModule', ptr(Module), ptr(Module))

View file

@ -0,0 +1,15 @@
import os.path, importlib
def _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()

View file

@ -1,10 +1,15 @@
import os.path, importlib import os.path, importlib
def _init(): def _init():
for fname in os.listdir(os.path.dirname(__file__)): base = os.path.dirname(__file__)
if ((fname.endswith('.py') or fname.endswith('.pyc')) and for fname in os.listdir(base):
not fname.startswith('__init__')): 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] modname = os.path.basename(fname).rsplit('.', 1)[0]
importlib.import_module('.' + modname, __name__) importlib.import_module('.' + modname, __name__)
_init() _init()

View file

@ -9,17 +9,29 @@ IntegerType = llvm.Class(Type)
CompositeType = llvm.Class(Type) CompositeType = llvm.Class(Type)
StructType = llvm.Class(CompositeType) StructType = llvm.Class(CompositeType)
SequentialType = llvm.Class(CompositeType) SequentialType = llvm.Class(CompositeType)
ArrayType = llvm.Class(SequentialType)
PointerType = llvm.Class(SequentialType) PointerType = llvm.Class(SequentialType)
VectorType = llvm.Class(SequentialType)
@Type @Type
class Type: class Type:
_include_ = 'llvm/Type.h' _include_ = 'llvm/Type.h'
TypeID = Enum('''
VoidTyID, HalfTyID, FloatTyID, DoubleTyID,
X86_FP80TyID, FP128TyID, PPC_FP128TyID, LabelTyID,
MetadataTyID, X86_MMXTyID, IntegerTyID, FunctionTyID,
StructTyID, ArrayTyID, PointerTyID, VectorTyID,
NumTypeIDs, LastPrimitiveTyID, FirstDerivedTyID
''')
getContext = Method(ref(LLVMContext)) getContext = Method(ref(LLVMContext))
dump = Method() dump = Method()
print_ = Method(Void, ref(raw_ostream)) print_ = Method(Void, ref(raw_ostream))
print_.realname = 'print' print_.realname = 'print'
getTypeID = Method(TypeID)
def type_checker(): def type_checker():
return Method(cast(Bool, bool)) return Method(cast(Bool, bool))
@ -81,7 +93,8 @@ class Type:
getPPC_FP128Ty = type_factory() getPPC_FP128Ty = type_factory()
getX86_MMXTy = type_factory() getX86_MMXTy = type_factory()
getIntNTy = StaticMethod(ptr(IntegerType), ref(LLVMContext), cast(Unsigned, int)) getIntNTy = StaticMethod(ptr(IntegerType),
ref(LLVMContext), cast(Unsigned, int))
def integer_factory(): def integer_factory():
return StaticMethod(ptr(IntegerType), ref(LLVMContext)) return StaticMethod(ptr(IntegerType), ref(LLVMContext))
@ -117,6 +130,20 @@ class Type:
self.print_(os) self.print_(os)
return os.str() return os.str()
getContainedType = Method(ptr(Type), cast(int, Unsigned))
getNumContainedTypes = Method(cast(int, Unsigned))
getArrayNumElements = Method(cast(Uint64, int))
getArrayElementType = Method(ptr(Type))
getVectorNumElements = Method(cast(Unsigned, int))
getVectorElementType = Method(ptr(Type))
getPointerElementType = Method(ptr(Type))
getPointerAddressSpace = Method(cast(Unsigned, int))
getPointerTo = Method(ptr(PointerType), cast(int, Unsigned))
@IntegerType @IntegerType
class IntegerType: class IntegerType:
pass pass
@ -130,9 +157,30 @@ class CompositeType:
class SequentialType: class SequentialType:
pass pass
@ArrayType
class ArrayType:
getNumElements = Method(cast(Uint64, int))
get = StaticMethod(ptr(ArrayType), ptr(Type), cast(int, Uint64))
isValidElementType = StaticMethod(cast(Bool, bool), ptr(Type))
@PointerType @PointerType
class PointerType: class PointerType:
pass getAddressSpace = Method(cast(Unsigned, int))
get = StaticMethod(ptr(PointerType), ptr(Type), cast(int, Unsigned))
getUnqual = StaticMethod(ptr(PointerType), ptr(Type))
isValidElementType = StaticMethod(cast(Bool, bool), ptr(Type))
@VectorType
class VectorType:
getNumElements = Method(cast(Unsigned, int))
getBitWidth = Method(cast(Unsigned, int))
get = StaticMethod(ptr(VectorType), ptr(Type), cast(int, Unsigned))
getInteger = StaticMethod(ptr(VectorType), ptr(VectorType))
getExtendedElementVectorType = StaticMethod(ptr(VectorType),
ptr(VectorType))
getTruncatedElementVectorType = StaticMethod(ptr(VectorType),
ptr(VectorType))
isValidElementType = StaticMethod(cast(Bool, bool), ptr(Type))
@StructType @StructType
class StructType: class StructType:
@ -154,5 +202,12 @@ class StructType:
ref(LLVMContext), ref(LLVMContext),
cast(str, StringRef), cast(str, StringRef),
).require_only(1) ).require_only(1)
get = StaticMethod(ptr(StructType),
ref(LLVMContext),
cast(bool, Bool), # is packed
).require_only(1)
isValidElementType = StaticMethod(cast(Bool, bool), ptr(Type)) isValidElementType = StaticMethod(cast(Bool, bool), ptr(Type))

View file

@ -1,7 +1,11 @@
from binding import * from binding import *
from namespace import llvm from namespace import llvm
from Value import User from Value import Value, User
@User @User
class User: class User:
pass _downcast_ = Value
getOperand = Method(ptr(Value), cast(int, Unsigned))
setOperand = Method(Void, cast(int, Unsigned), ptr(Value))
getNumOperands = Method(cast(Unsigned, int))

View file

@ -21,6 +21,16 @@ from ADT.StringRef import StringRef
@Value @Value
class Value: class Value:
ValueTy = Enum('''
ArgumentVal, BasicBlockVal, FunctionVal, GlobalAliasVal,
GlobalVariableVal, UndefValueVal, BlockAddressVal, ConstantExprVal,
ConstantAggregateZeroVal, ConstantDataArrayVal, ConstantDataVectorVal,
ConstantIntVal, ConstantFPVal, ConstantArrayVal, ConstantStructVal,
ConstantVectorVal, ConstantPointerNullVal, MDNodeVal, MDStringVal,
InlineAsmVal, PseudoSourceValueVal, FixedStackPseudoSourceValueVal,
InstructionVal, ConstantFirstVal, ConstantLastVal
''')
dump = Method() dump = Method()
print_ = Method(Void, ref(raw_ostream), ptr(AssemblyAnnotationWriter)) print_ = Method(Void, ref(raw_ostream), ptr(AssemblyAnnotationWriter))
@ -41,6 +51,7 @@ class Value:
hasOneUse = Method(cast(Bool, bool)) hasOneUse = Method(cast(Bool, bool))
hasNUses = Method(cast(Bool, bool), cast(int, Unsigned)) hasNUses = Method(cast(Bool, bool), cast(int, Unsigned))
isUsedInBasicBlock = Method(cast(Bool, bool), BasicBlock) isUsedInBasicBlock = Method(cast(Bool, bool), BasicBlock)
getNumUses = Method(cast(Unsigned, int))
@CustomPythonMethod @CustomPythonMethod
def __str__(self): def __str__(self):
@ -48,3 +59,5 @@ class Value:
os = extra.make_raw_ostream_for_printing() os = extra.make_raw_ostream_for_printing()
self.print_(os, None) self.print_(os, None)
return os.str() return os.str()
getValueID = Method(cast(Unsigned, int))