From 507ff7306157331443f7176696b3711bee658bff Mon Sep 17 00:00:00 2001 From: Siu Kwan Lam Date: Wed, 31 Oct 2012 16:41:10 -0500 Subject: [PATCH] Add InlineAsm --- llvm/_core.cpp | 30 +++++++++++++++++++++++++++++- llvm/core.py | 16 ++++++++++++++++ llvm/extra.cpp | 17 +++++++++++++++++ llvm/extra.h | 9 +++++++++ 4 files changed, 71 insertions(+), 1 deletion(-) diff --git a/llvm/_core.cpp b/llvm/_core.cpp index 51b595c..1a64f88 100644 --- a/llvm/_core.cpp +++ b/llvm/_core.cpp @@ -642,7 +642,6 @@ _wrap_obj2none(LLVMViewFunctionCFGOnly, LLVMValueRef) _wrap_objenum2none(LLVMAddFunctionAttr, LLVMValueRef, LLVMAttribute) _wrap_objenum2none(LLVMRemoveFunctionAttr, LLVMValueRef, LLVMAttribute) - static PyObject * _wLLVMVerifyFunction(PyObject *self, PyObject *args) { @@ -654,6 +653,33 @@ _wLLVMVerifyFunction(PyObject *self, PyObject *args) LLVMPY_CATCH_ALL } +static PyObject * +_wLLVMGetFunctionFromInlineAsm(PyObject *self, PyObject *args) +{ + LLVMPY_TRY + PyObject *pycapFuncType; + const char *inlineAsm = NULL; + const char *constrains = NULL; + int hasSideEffect; + int isAlignStack; + int asmDialect; + + if (!PyArg_ParseTuple(args, "Ossiii", &pycapFuncType, &inlineAsm, + &constrains, &hasSideEffect, + &isAlignStack, &asmDialect)) + return NULL; + + + LLVMTypeRef funcType = pycap_get(pycapFuncType); + LLVMValueRef inlineAsmRef; + inlineAsmRef = LLVMGetFunctionFromInlineAsm(funcType, inlineAsm, constrains, + hasSideEffect, isAlignStack, + asmDialect); + + return pycap_new(inlineAsmRef); + LLVMPY_CATCH_ALL +} + /*===-- Arguments --------------------------------------------------------===*/ @@ -747,6 +773,7 @@ _wrap_obj2obj(LLVMIsTailCall, LLVMValueRef, int) _wrap_objint2none(LLVMSetTailCall, LLVMValueRef) _wrap_obj2obj(LLVMInstGetCalledFunction, LLVMValueRef, LLVMValueRef) + /*===-- PHI Nodes --------------------------------------------------------===*/ static void LLVMAddIncoming1(LLVMValueRef PhiNode, LLVMValueRef IncomingValue, LLVMBasicBlockRef IncomingBlock) @@ -1776,6 +1803,7 @@ static PyMethodDef core_methods[] = { _method( LLVMViewFunctionCFGOnly ) _method( LLVMAddFunctionAttr ) _method( LLVMRemoveFunctionAttr ) + _method( LLVMGetFunctionFromInlineAsm ) /* Arguments */ _method( LLVMCountParams ) diff --git a/llvm/core.py b/llvm/core.py index cc47662..7c9b1e1 100644 --- a/llvm/core.py +++ b/llvm/core.py @@ -1505,6 +1505,21 @@ class Function(GlobalValue): # failure, it appears to print result to stderr and abort. return _core.LLVMVerifyFunction(self.ptr) != 0 +#===----------------------------------------------------------------------=== +# InlineAsm +#===----------------------------------------------------------------------=== + +class InlineAsm(Value): + @staticmethod + def get(functype, asm, constrains, side_effect=False, + align_stack=False, dialect=0): + assert dialect == 0, "LLVM 3.1 does not implement dialect selection" + check_is_type(functype) + pycap = _core.LLVMGetFunctionFromInlineAsm(functype.ptr, asm, + constrains, int(side_effect), + int(align_stack), dialect) + return _make_value(pycap) + #===----------------------------------------------------------------------=== # MetaData #===----------------------------------------------------------------------=== @@ -1750,6 +1765,7 @@ __class_for_valueid = { VALUE_CONSTANT_POINTER_NULL : ConstantPointerNull, VALUE_MD_NODE : MetaData, VALUE_MD_STRING : MetaDataString, + VALUE_INLINE_ASM : InlineAsm, VALUE_INSTRUCTION + OPCODE_PHI : PHINode, VALUE_INSTRUCTION + OPCODE_CALL : CallOrInvokeInstruction, VALUE_INSTRUCTION + OPCODE_INVOKE : CallOrInvokeInstruction, diff --git a/llvm/extra.cpp b/llvm/extra.cpp index 3c636b6..b9f4ac2 100644 --- a/llvm/extra.cpp +++ b/llvm/extra.cpp @@ -74,6 +74,7 @@ #include "llvm/Transforms/Utils/Cloning.h" #include "llvm/Linker.h" #include "llvm/Support/SourceMgr.h" +#include // LLVM-C includes @@ -135,6 +136,22 @@ const CodeGenOpt::Level OptLevelMap[] = { }; } // end anony namespace + +LLVMValueRef LLVMGetFunctionFromInlineAsm(LLVMTypeRef funcType, + const char inlineAsm[], + const char constrains[], + bool hasSideEffect, + bool isAlignStack, + int asmDialect) +{ + using namespace llvm; + FunctionType *fnty = unwrap(funcType); + // asmDialect does not exist for LLVM 3.1 + InlineAsm *inlineasmobj = InlineAsm::get(fnty, inlineAsm, constrains, + hasSideEffect, isAlignStack); + return wrap(inlineasmobj); +} + LLVMModuleRef LLVMCloneModule(LLVMModuleRef mod) { using namespace llvm; diff --git a/llvm/extra.h b/llvm/extra.h index 007f6c0..dae90ec 100644 --- a/llvm/extra.h +++ b/llvm/extra.h @@ -54,6 +54,15 @@ extern "C" { #endif +/* + * Wraps llvm:InlineAsm::get + */ +LLVMValueRef LLVMGetFunctionFromInlineAsm(LLVMTypeRef funcType, + const char inlineAsm[], + const char constrains[], + bool hasSideEffect, + bool isAlignStack, + int asmDialect); /* * Wraps llvm::CloneModule