Add InlineAsm

This commit is contained in:
Siu Kwan Lam 2012-10-31 16:41:10 -05:00
commit 507ff73061
4 changed files with 71 additions and 1 deletions

View file

@ -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<LLVMTypeRef>(pycapFuncType);
LLVMValueRef inlineAsmRef;
inlineAsmRef = LLVMGetFunctionFromInlineAsm(funcType, inlineAsm, constrains,
hasSideEffect, isAlignStack,
asmDialect);
return pycap_new<LLVMValueRef>(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 )

View file

@ -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,

View file

@ -74,6 +74,7 @@
#include "llvm/Transforms/Utils/Cloning.h"
#include "llvm/Linker.h"
#include "llvm/Support/SourceMgr.h"
#include <llvm/InlineAsm.h>
// 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<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)
{
using namespace llvm;

View file

@ -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