Continue to implement IRBuilder
This commit is contained in:
parent
895d114730
commit
59d0dfddc7
8 changed files with 125 additions and 19 deletions
|
|
@ -1,6 +1,7 @@
|
|||
#include <Python.h>
|
||||
#include <llvm/ADT/SmallVector.h>
|
||||
#include <llvm/Value.h>
|
||||
#include <llvm/Function.h>
|
||||
#include <llvm/Support/raw_ostream.h>
|
||||
|
||||
|
||||
|
|
@ -11,12 +12,14 @@ namespace extra{
|
|||
SmallVectorImpl<char> *SV;
|
||||
public:
|
||||
static
|
||||
raw_svector_ostream_helper* create(){
|
||||
raw_svector_ostream_helper* create()
|
||||
{
|
||||
SmallVectorImpl<char>* sv = new SmallVector<char, 16>();
|
||||
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<llvm::Type*, 8> SmallVector_Type;
|
||||
|
||||
|
|
@ -69,24 +74,88 @@ PyObject* make_small_vector_from_types(PyObject* self, PyObject* args) {
|
|||
return pycapsule_new(SV, "llvm::SmallVector<llvm::Type*,8>");
|
||||
}
|
||||
|
||||
static
|
||||
PyObject* make_small_vector_from_values(PyObject* self, PyObject* args)
|
||||
{
|
||||
using llvm::Value;
|
||||
typedef llvm::SmallVector<llvm::Value*, 8> 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<llvm::Value*,8>");
|
||||
}
|
||||
|
||||
|
||||
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<class iterator>
|
||||
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<class iterator>
|
||||
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<class iplist>
|
||||
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");
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue