From d5328ef255ea2fbef2b18a87d5324a73e62f530a Mon Sep 17 00:00:00 2001 From: "mdevan.foobar" Date: Wed, 25 Feb 2009 17:41:37 +0000 Subject: [PATCH] Value.uses API git-svn-id: http://llvm-py.googlecode.com/svn/trunk@70 8d1e9007-1d4e-0410-b67e-1979fd6579aa --- llvm/_core.c | 21 +++++++++++++++++++++ llvm/core.py | 8 ++++++++ llvm/extra.cpp | 41 +++++++++++++++++++++++++++++++++++++++++ llvm/extra.h | 12 ++++++++++++ llvm/wrap.c | 31 +++++++++++++++++-------------- llvm/wrap.h | 9 ++++++--- test/testall.py | 2 ++ test/uses.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 152 insertions(+), 17 deletions(-) create mode 100755 test/uses.py diff --git a/llvm/_core.c b/llvm/_core.c index 80466b3..89d3566 100644 --- a/llvm/_core.c +++ b/llvm/_core.c @@ -322,6 +322,25 @@ _wrap_objstr2none(LLVMSetValueName, LLVMValueRef) _wrap_obj2none(LLVMDumpValue, LLVMValueRef) _wrap_dumper(LLVMDumpValueToString, LLVMValueRef) _wrap_obj2obj(LLVMValueGetID, LLVMValueRef, int) +_wrap_obj2obj(LLVMValueGetNumUses, LLVMValueRef, int) + +static PyObject * +_wLLVMValueGetUses(PyObject *self, PyObject *args) +{ + LLVMValueRef value; + + if (!(value = (LLVMValueRef)get_object_arg(args))) + return NULL; + + LLVMValueRef *uses = 0; + unsigned n = LLVMValueGetUses(value, &uses); + + PyObject *list = make_list_from_LLVMValueRef_array(uses, n); + if (n > 0) + LLVMDisposeValueRefArray(uses); + + return list; +} /*===-- Users ------------------------------------------------------------===*/ @@ -1117,6 +1136,8 @@ static PyMethodDef core_methods[] = { _method( LLVMDumpValue ) _method( LLVMDumpValueToString ) _method( LLVMValueGetID ) + _method( LLVMValueGetNumUses ) + _method( LLVMValueGetUses ) /* Users */ diff --git a/llvm/core.py b/llvm/core.py index aa75a21..fc21112 100644 --- a/llvm/core.py +++ b/llvm/core.py @@ -852,6 +852,14 @@ class Value(llvm.Cacheable): kind = _core.LLVMGetTypeKind(ptr) return _make_type(ptr, kind) + @property + def use_count(self): + return _core.LLVMValueGetNumUses(self.ptr) + + @property + def uses(self): + return [ _make_value(v) for v in _core.LLVMValueGetUses(self.ptr) ] + class User(Value): diff --git a/llvm/extra.cpp b/llvm/extra.cpp index 0c8af47..72074e7 100644 --- a/llvm/extra.cpp +++ b/llvm/extra.cpp @@ -299,6 +299,47 @@ unsigned LLVMValueGetID(LLVMValueRef value) return valuep->getValueID(); } + +unsigned LLVMValueGetNumUses(LLVMValueRef value) +{ + llvm::Value *valuep = llvm::unwrap(value); + assert(valuep); + + return valuep->getNumUses(); +} + + +unsigned LLVMValueGetUses(LLVMValueRef value, LLVMValueRef **refs) +{ + llvm::Value *valuep = llvm::unwrap(value); + assert(valuep); + + unsigned n = valuep->getNumUses(); + if (n == 0) + return 0; + + assert(refs); + LLVMValueRef *out = (LLVMValueRef *)malloc(sizeof(LLVMValueRef) * n); + if (!out) + return 0; + *refs = out; + + memset(out, 0, sizeof(LLVMValueRef) * n); + llvm::Value::use_iterator it = valuep->use_begin(); + while (it != valuep->use_end()) { + *out++ = llvm::wrap(*it); + ++it; + } + + return n; +} + +void LLVMDisposeValueRefArray(LLVMValueRef *refs) +{ + assert(refs); + free(refs); +} + unsigned LLVMUserGetNumOperands(LLVMValueRef user) { llvm::User *userp = llvm::unwrap(user); diff --git a/llvm/extra.h b/llvm/extra.h index d09e586..fb88ef7 100644 --- a/llvm/extra.h +++ b/llvm/extra.h @@ -69,6 +69,18 @@ LLVMValueRef LLVMBuildGetResult(LLVMBuilderRef builder, LLVMValueRef value, /* Wraps llvm::Value::getValueID(). */ unsigned LLVMValueGetID(LLVMValueRef value); +/* Wraps llvm::Value::getNumUses(). */ +unsigned LLVMValueGetNumUses(LLVMValueRef value); + +/* Wraps llvm::Value::use_{begin,end}. Allocates LLVMValueRef's as + * required. Number of objects are returned as return value. If that is + * greater than zero, the pointer given out must be freed by a + * subsequent call to LLVMDisposeValueRefArray(). */ +unsigned LLVMValueGetUses(LLVMValueRef value, LLVMValueRef **refs); + +/* See above. */ +void LLVMDisposeValueRefArray(LLVMValueRef *refs); + /* Wraps llvm:User::getNumOperands(). */ unsigned LLVMUserGetNumOperands(LLVMValueRef user); diff --git a/llvm/wrap.c b/llvm/wrap.c index 533c206..fe7db3a 100644 --- a/llvm/wrap.c +++ b/llvm/wrap.c @@ -98,19 +98,22 @@ void **make_array_from_list(PyObject *list, int n) return arr; } -PyObject *make_list_from_LLVMTypeRef_array(LLVMTypeRef *p, unsigned n) -{ - size_t i; - PyObject *list = PyList_New(n); - - if (!list) - return NULL; - - for (i=0; i