From 60336d1c5fe9fc897e1c5899131e663f7a3f1a6d Mon Sep 17 00:00:00 2001 From: Siu Kwan Lam Date: Fri, 8 Feb 2013 18:12:51 -0600 Subject: [PATCH] Add DynamicLibrary and InlineFunction --- newbinding/include/llvm_binding/extra.h | 26 ++++++++++++++++++++++ newbinding/src/Support/DynamicLibrary.py | 26 ++++++++++++++++++++-- newbinding/src/Transforms/Utils/Cloning.py | 15 ++++++++++++- 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/newbinding/include/llvm_binding/extra.h b/newbinding/include/llvm_binding/extra.h index 75739de..d045d5c 100644 --- a/newbinding/include/llvm_binding/extra.h +++ b/newbinding/include/llvm_binding/extra.h @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -747,3 +748,28 @@ PyObject* IRBuilder_CreateAggregateRet(llvm::IRBuilder<>* builder, return pycapsule_new(inst, "llvm::Value", "llvm:ReturnInst"); } +static +PyObject* DynamicLibrary_LoadLibraryPermanently(const char * Filename, + PyObject* ErrMsg = 0) +{ + using namespace llvm::sys; + bool failed; + if (ErrMsg) { + std::string errmsg; + failed = DynamicLibrary::LoadLibraryPermanently(Filename, &errmsg); + if (failed) { + if (-1 == PyFile_WriteString(errmsg.c_str(), ErrMsg)) { + return NULL; + } + } + } else { + failed = DynamicLibrary::LoadLibraryPermanently(Filename); + } + + if (failed) { + Py_RETURN_TRUE; + } else { + Py_RETURN_FALSE; + } +} + diff --git a/newbinding/src/Support/DynamicLibrary.py b/newbinding/src/Support/DynamicLibrary.py index 7f661d3..7dce97a 100644 --- a/newbinding/src/Support/DynamicLibrary.py +++ b/newbinding/src/Support/DynamicLibrary.py @@ -1,6 +1,28 @@ from binding import * from ..namespace import sys +from ..ADT.StringRef import StringRef -DynamicLibrary = sys.Namespace('DynamicLibrary') -#LoadLibraryPermanently +DynamicLibrary = sys.Class() + +@DynamicLibrary +class DynamicLibrary: + _include_ = 'llvm/Support/DynamicLibrary.h' + isValid = Method(cast(Bool, bool)) + getAddressOfSymbol = Method(cast(VoidPtr, int), cast(str, ConstCharPtr)) + + LoadPermanentLibrary = CustomStaticMethod( + 'DynamicLibrary_LoadLibraryPermanently', + PyObjectPtr, # bool --- failed? + cast(str, ConstCharPtr), # filename + PyObjectPtr, # std::string * errmsg = 0 + ).require_only(1) + + SearchForAddressOfSymbol = StaticMethod(cast(VoidPtr, int), # address + cast(str, ConstCharPtr), # symName + ) + + AddSymbol = StaticMethod(Void, + cast(str, StringRef), # symbolName + cast(int, VoidPtr), # address + ) diff --git a/newbinding/src/Transforms/Utils/Cloning.py b/newbinding/src/Transforms/Utils/Cloning.py index c7f7a86..1971177 100644 --- a/newbinding/src/Transforms/Utils/Cloning.py +++ b/newbinding/src/Transforms/Utils/Cloning.py @@ -1,8 +1,21 @@ from binding import * from src.namespace import llvm from src.Module import Module +from src.Instruction import CallInst llvm.includes.add('llvm/Transforms/Utils/Cloning.h') + +@llvm.Class() +class InlineFunctionInfo: + new = Constructor() + delete = Destructor() + + CloneModule = llvm.Function('CloneModule', ptr(Module), ptr(Module)) - +InlineFunction = llvm.Function('InlineFunction', + cast(Bool, bool), # bool --- failed + ptr(CallInst), + ref(InlineFunctionInfo), + cast(bool, Bool), # insert lifetime = true + ).require_only(2)