diff --git a/llvm/_core.c b/llvm/_core.c index 933e0c7..f3b86e1 100644 --- a/llvm/_core.c +++ b/llvm/_core.c @@ -579,6 +579,10 @@ _wrap_obj2obj(LLVMCountIncoming, LLVMValueRef, int) _wrap_objint2obj(LLVMGetIncomingValue, LLVMValueRef, LLVMValueRef) _wrap_objint2obj(LLVMGetIncomingBlock, LLVMValueRef, LLVMBasicBlockRef) +/*===-- Compare Instructions ---------------------------------------------===*/ + +_wrap_obj2obj(LLVMCmpInstGetPredicate, LLVMValueRef, int) + /*===-- Instruction builders ----------------------------------------------===*/ _wrap_none2obj(LLVMCreateBuilder, LLVMBuilderRef) @@ -1373,6 +1377,9 @@ static PyMethodDef core_methods[] = { _method( LLVMGetIncomingValue ) _method( LLVMGetIncomingBlock ) + /* Comparison Instructions */ + _method( LLVMCmpInstGetPredicate ) + /* Instruction builders */ _method( LLVMCreateBuilder ) _method( LLVMPositionBuilderBefore ) diff --git a/llvm/core.py b/llvm/core.py index 2c32313..3f46c08 100644 --- a/llvm/core.py +++ b/llvm/core.py @@ -1420,6 +1420,13 @@ class SwitchInstruction(Instruction): _core.LLVMAddCase(self.ptr, const.ptr, bblk.ptr) +class CompareInstruction(Instruction): + + @property + def predicate(self): + return _core.LLVMCmpInstGetPredicate(self.ptr) + + #===----------------------------------------------------------------------=== # Basic block #===----------------------------------------------------------------------=== @@ -1469,6 +1476,8 @@ __class_for_valueid = { VALUE_INSTRUCTION + OPCODE_CALL : CallOrInvokeInstruction, VALUE_INSTRUCTION + OPCODE_INVOKE : CallOrInvokeInstruction, VALUE_INSTRUCTION + OPCODE_SWITCH : SwitchInstruction, + VALUE_INSTRUCTION + OPCODE_ICMP : CompareInstruction, + VALUE_INSTRUCTION + OPCODE_FCMP : CompareInstruction } def _make_value(ptr): diff --git a/llvm/extra.cpp b/llvm/extra.cpp index 12ddeb9..d2b1e12 100644 --- a/llvm/extra.cpp +++ b/llvm/extra.cpp @@ -240,6 +240,13 @@ unsigned LLVMInstGetOpcode(LLVMValueRef inst) return instp->getOpcode(); } +unsigned LLVMCmpInstGetPredicate(LLVMValueRef cmpinst) +{ + llvm::CmpInst *instp = llvm::unwrap(cmpinst); + assert(instp); + return instp->getPredicate(); +} + /* llvm::unwrap a set of `n' wrapped objects starting at `values', * into a vector of pointers to llvm::unwrapped objects `out'. */ template diff --git a/llvm/extra.h b/llvm/extra.h index 2dd293c..73890cb 100644 --- a/llvm/extra.h +++ b/llvm/extra.h @@ -139,6 +139,9 @@ const char *LLVMInstGetOpcodeName(LLVMValueRef inst); /* Wraps llvm::Instruction::getOpcode(). */ unsigned LLVMInstGetOpcode(LLVMValueRef inst); +/* Wraps llvm::CmpInst::getPredicate(). */ +unsigned LLVMCmpInstGetPredicate(LLVMValueRef cmpinst); + /* Wraps llvm::ParseAssemblyString(). Returns a module reference or NULL (with * `out' pointing to an error message). Dispose error message after use, via * LLVMDisposeMessage(). */