Add InlineAsm
This commit is contained in:
parent
6133b643d8
commit
507ff73061
4 changed files with 71 additions and 1 deletions
|
|
@ -642,7 +642,6 @@ _wrap_obj2none(LLVMViewFunctionCFGOnly, LLVMValueRef)
|
||||||
_wrap_objenum2none(LLVMAddFunctionAttr, LLVMValueRef, LLVMAttribute)
|
_wrap_objenum2none(LLVMAddFunctionAttr, LLVMValueRef, LLVMAttribute)
|
||||||
_wrap_objenum2none(LLVMRemoveFunctionAttr, LLVMValueRef, LLVMAttribute)
|
_wrap_objenum2none(LLVMRemoveFunctionAttr, LLVMValueRef, LLVMAttribute)
|
||||||
|
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_wLLVMVerifyFunction(PyObject *self, PyObject *args)
|
_wLLVMVerifyFunction(PyObject *self, PyObject *args)
|
||||||
{
|
{
|
||||||
|
|
@ -654,6 +653,33 @@ _wLLVMVerifyFunction(PyObject *self, PyObject *args)
|
||||||
LLVMPY_CATCH_ALL
|
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<LLVMTypeRef>(pycapFuncType);
|
||||||
|
LLVMValueRef inlineAsmRef;
|
||||||
|
inlineAsmRef = LLVMGetFunctionFromInlineAsm(funcType, inlineAsm, constrains,
|
||||||
|
hasSideEffect, isAlignStack,
|
||||||
|
asmDialect);
|
||||||
|
|
||||||
|
return pycap_new<LLVMValueRef>(inlineAsmRef);
|
||||||
|
LLVMPY_CATCH_ALL
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*===-- Arguments --------------------------------------------------------===*/
|
/*===-- Arguments --------------------------------------------------------===*/
|
||||||
|
|
||||||
|
|
@ -747,6 +773,7 @@ _wrap_obj2obj(LLVMIsTailCall, LLVMValueRef, int)
|
||||||
_wrap_objint2none(LLVMSetTailCall, LLVMValueRef)
|
_wrap_objint2none(LLVMSetTailCall, LLVMValueRef)
|
||||||
_wrap_obj2obj(LLVMInstGetCalledFunction, LLVMValueRef, LLVMValueRef)
|
_wrap_obj2obj(LLVMInstGetCalledFunction, LLVMValueRef, LLVMValueRef)
|
||||||
|
|
||||||
|
|
||||||
/*===-- PHI Nodes --------------------------------------------------------===*/
|
/*===-- PHI Nodes --------------------------------------------------------===*/
|
||||||
|
|
||||||
static void LLVMAddIncoming1(LLVMValueRef PhiNode, LLVMValueRef IncomingValue, LLVMBasicBlockRef IncomingBlock)
|
static void LLVMAddIncoming1(LLVMValueRef PhiNode, LLVMValueRef IncomingValue, LLVMBasicBlockRef IncomingBlock)
|
||||||
|
|
@ -1776,6 +1803,7 @@ static PyMethodDef core_methods[] = {
|
||||||
_method( LLVMViewFunctionCFGOnly )
|
_method( LLVMViewFunctionCFGOnly )
|
||||||
_method( LLVMAddFunctionAttr )
|
_method( LLVMAddFunctionAttr )
|
||||||
_method( LLVMRemoveFunctionAttr )
|
_method( LLVMRemoveFunctionAttr )
|
||||||
|
_method( LLVMGetFunctionFromInlineAsm )
|
||||||
|
|
||||||
/* Arguments */
|
/* Arguments */
|
||||||
_method( LLVMCountParams )
|
_method( LLVMCountParams )
|
||||||
|
|
|
||||||
16
llvm/core.py
16
llvm/core.py
|
|
@ -1505,6 +1505,21 @@ class Function(GlobalValue):
|
||||||
# failure, it appears to print result to stderr and abort.
|
# failure, it appears to print result to stderr and abort.
|
||||||
return _core.LLVMVerifyFunction(self.ptr) != 0
|
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
|
# MetaData
|
||||||
#===----------------------------------------------------------------------===
|
#===----------------------------------------------------------------------===
|
||||||
|
|
@ -1750,6 +1765,7 @@ __class_for_valueid = {
|
||||||
VALUE_CONSTANT_POINTER_NULL : ConstantPointerNull,
|
VALUE_CONSTANT_POINTER_NULL : ConstantPointerNull,
|
||||||
VALUE_MD_NODE : MetaData,
|
VALUE_MD_NODE : MetaData,
|
||||||
VALUE_MD_STRING : MetaDataString,
|
VALUE_MD_STRING : MetaDataString,
|
||||||
|
VALUE_INLINE_ASM : InlineAsm,
|
||||||
VALUE_INSTRUCTION + OPCODE_PHI : PHINode,
|
VALUE_INSTRUCTION + OPCODE_PHI : PHINode,
|
||||||
VALUE_INSTRUCTION + OPCODE_CALL : CallOrInvokeInstruction,
|
VALUE_INSTRUCTION + OPCODE_CALL : CallOrInvokeInstruction,
|
||||||
VALUE_INSTRUCTION + OPCODE_INVOKE : CallOrInvokeInstruction,
|
VALUE_INSTRUCTION + OPCODE_INVOKE : CallOrInvokeInstruction,
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,7 @@
|
||||||
#include "llvm/Transforms/Utils/Cloning.h"
|
#include "llvm/Transforms/Utils/Cloning.h"
|
||||||
#include "llvm/Linker.h"
|
#include "llvm/Linker.h"
|
||||||
#include "llvm/Support/SourceMgr.h"
|
#include "llvm/Support/SourceMgr.h"
|
||||||
|
#include <llvm/InlineAsm.h>
|
||||||
|
|
||||||
|
|
||||||
// LLVM-C includes
|
// LLVM-C includes
|
||||||
|
|
@ -135,6 +136,22 @@ const CodeGenOpt::Level OptLevelMap[] = {
|
||||||
};
|
};
|
||||||
} // end anony namespace
|
} // 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<FunctionType>(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)
|
LLVMModuleRef LLVMCloneModule(LLVMModuleRef mod)
|
||||||
{
|
{
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,15 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wraps llvm:InlineAsm::get
|
||||||
|
*/
|
||||||
|
LLVMValueRef LLVMGetFunctionFromInlineAsm(LLVMTypeRef funcType,
|
||||||
|
const char inlineAsm[],
|
||||||
|
const char constrains[],
|
||||||
|
bool hasSideEffect,
|
||||||
|
bool isAlignStack,
|
||||||
|
int asmDialect);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wraps llvm::CloneModule
|
* Wraps llvm::CloneModule
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue