diff --git a/CHANGELOG b/CHANGELOG index 1f816e9..fa50cd3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,11 @@ + +0.4, in progress: + + * Instruction.is_terminator added. + * Fix Builder.select (Paulo Silva). + * Added viewCFG methods to Function (Paulo Silva). + + 0.3, 8-Sep-2008: * Passes added. diff --git a/llvm/_core.c b/llvm/_core.c index 775e48d..9f42827 100644 --- a/llvm/_core.c +++ b/llvm/_core.c @@ -461,6 +461,7 @@ _wrap_obj2none(LLVMDeleteBasicBlock, LLVMBasicBlockRef) _wrap_obj2obj(LLVMGetInstructionParent, LLVMValueRef, LLVMBasicBlockRef) _wrap_obj2obj(LLVMGetFirstInstruction, LLVMBasicBlockRef, LLVMValueRef) _wrap_obj2obj(LLVMGetNextInstruction, LLVMValueRef, LLVMValueRef) +_wrap_obj2obj(LLVMInstIsTerminator, LLVMValueRef, int) /*===-- Call Sites (Call or Invoke) --------------------------------------===*/ @@ -1129,6 +1130,7 @@ static PyMethodDef core_methods[] = { _method( LLVMGetInstructionParent ) _method( LLVMGetFirstInstruction ) _method( LLVMGetNextInstruction ) + _method( LLVMInstIsTerminator ) /* Call Sites (Call or Invoke) */ _method( LLVMSetInstructionCallConv ) diff --git a/llvm/core.py b/llvm/core.py index 3e52e56..20ecdf7 100644 --- a/llvm/core.py +++ b/llvm/core.py @@ -1670,6 +1670,10 @@ class Instruction(Value): def basic_block(self): return BasicBlock(_core.LLVMGetInstructionParent(self.ptr)) + @property + def is_terminator(self): + return _core.LLVMInstIsTerminator(self.ptr) + class CallOrInvokeInstruction(Instruction): @@ -2058,11 +2062,11 @@ class Builder(object): arg_ptrs = unpack_values(args) return CallOrInvokeInstruction(_core.LLVMBuildCall(self.ptr, fn.ptr, arg_ptrs, name)) - def select(self, cond, then_blk, else_blk, name=""): + def select(self, cond, then_value, else_value, name=""): check_is_value(cond) - check_is_basic_block(then_blk) - check_is_basic_block(else_blk) - return Value(_core.LLVMBuildSelect(self.ptr, cond.ptr, then_blk.ptr, else_blk.ptr, name)) + check_is_value(then_value) + check_is_value(else_value) + return Value(_core.LLVMBuildSelect(self.ptr, cond.ptr, then_value.ptr, else_value.ptr, name)) def vaarg(self, list_val, ty, name=""): check_is_value(list_val) diff --git a/llvm/extra.cpp b/llvm/extra.cpp index b049385..d024a0c 100644 --- a/llvm/extra.cpp +++ b/llvm/extra.cpp @@ -84,6 +84,10 @@ LLVMValueRef LLVMBuildVFCmp(LLVMBuilderRef B, LLVMRealPredicate Op, } #endif +unsigned LLVMInstIsTerminator(LLVMValueRef I) { + return unwrap(I)->isTerminator() ? 1 : 0; +} + LLVMValueRef LLVMBuildRetMultiple(LLVMBuilderRef B, LLVMValueRef *Values, unsigned NumValues) { std::vector Vs; diff --git a/llvm/extra.h b/llvm/extra.h index 85dd42a..2a1bf18 100644 --- a/llvm/extra.h +++ b/llvm/extra.h @@ -51,6 +51,10 @@ LLVMValueRef LLVMBuildGetResult(LLVMBuilderRef, LLVMValueRef V, LLVMValueRef LLVMGetIntrinsic(LLVMModuleRef B, int ID, LLVMTypeRef *Types, unsigned Count); +/* instruction */ + +unsigned LLVMInstIsTerminator(LLVMValueRef I); + /* reading llvm "assembly" */ LLVMModuleRef LLVMGetModuleFromAssembly(const char *A, unsigned Len, diff --git a/setup.py b/setup.py index dea5c35..79baa76 100644 --- a/setup.py +++ b/setup.py @@ -72,7 +72,7 @@ def call_setup(llvm_config): setup( name='llvm-py', - version='0.3', + version='0.4', description='Python Bindings for LLVM', author='Mahadevan R', author_email='mdevan.foobar@gmail.com', diff --git a/test/testall.py b/test/testall.py index b52a2cf..9f1f703 100644 --- a/test/testall.py +++ b/test/testall.py @@ -409,6 +409,7 @@ def do_builder(): # destruction. i = b.phi(Type.int()) i.add_incoming(v, blk) + t = i.is_terminator == False def do_moduleprovider():