Adding target specific passes.
This commit is contained in:
parent
bcc467b2b5
commit
3b399f9d8b
5 changed files with 149 additions and 3 deletions
|
|
@ -1036,6 +1036,7 @@ _wrap_none2str(LLVMDumpPasses)
|
||||||
_wrap_objstr2obj(LLVMAddPassByName, LLVMPassManagerRef, int)
|
_wrap_objstr2obj(LLVMAddPassByName, LLVMPassManagerRef, int)
|
||||||
|
|
||||||
|
|
||||||
|
_wrap_objobj2none(LLVMAddPass, LLVMPassManagerRef, LLVMPassRef)
|
||||||
_wrap_none2none(LLVMInitializePasses)
|
_wrap_none2none(LLVMInitializePasses)
|
||||||
|
|
||||||
_wrap_none2obj(LLVMInitializeNativeTarget, int)
|
_wrap_none2obj(LLVMInitializeNativeTarget, int)
|
||||||
|
|
@ -1061,7 +1062,11 @@ _wrap_none2none(LLVMInitializePTXAsmPrinter)
|
||||||
_wrap_str2obj(LLVMCreatePassByName, LLVMPassRef)
|
_wrap_str2obj(LLVMCreatePassByName, LLVMPassRef)
|
||||||
_wrap_obj2none(LLVMDisposePass, LLVMPassRef)
|
_wrap_obj2none(LLVMDisposePass, LLVMPassRef)
|
||||||
_wrap_obj2str(LLVMGetPassName, LLVMPassRef)
|
_wrap_obj2str(LLVMGetPassName, LLVMPassRef)
|
||||||
_wrap_objobj2none(LLVMAddPass, LLVMPassManagerRef, LLVMPassRef)
|
_wrap_obj2none(LLVMPassDump, LLVMPassRef)
|
||||||
|
|
||||||
|
_wrap_str2obj(LLVMCreateTargetLibraryInfo, LLVMPassRef)
|
||||||
|
_wrap_obj2obj(LLVMCreateTargetTransformInfo, LLVMTargetMachineRef, LLVMPassRef)
|
||||||
|
|
||||||
|
|
||||||
/*===----------------------------------------------------------------------===*/
|
/*===----------------------------------------------------------------------===*/
|
||||||
/* Target Machine */
|
/* Target Machine */
|
||||||
|
|
@ -1096,6 +1101,30 @@ _wLLVMTargetMachineLookup(PyObject * self, PyObject * args)
|
||||||
LLVMPY_CATCH_ALL
|
LLVMPY_CATCH_ALL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static PyObject *
|
||||||
|
_wLLVMCreateTargetMachine(PyObject * self, PyObject * args)
|
||||||
|
{
|
||||||
|
LLVMPY_TRY
|
||||||
|
const char *triple;
|
||||||
|
const char *cpu;
|
||||||
|
const char *features;
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, "sssi", &triple, &cpu, &features, &opt))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
std::string error;
|
||||||
|
LLVMTargetMachineRef tm = LLVMCreateTargetMachine(triple, cpu, features, opt,
|
||||||
|
error);
|
||||||
|
if(!error.empty()){
|
||||||
|
PyErr_SetString(PyExc_RuntimeError, error.c_str());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return pycap_new<LLVMTargetMachineRef>(tm);
|
||||||
|
LLVMPY_CATCH_ALL
|
||||||
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
_wLLVMTargetMachineEmitFile(PyObject * self, PyObject * args)
|
_wLLVMTargetMachineEmitFile(PyObject * self, PyObject * args)
|
||||||
{
|
{
|
||||||
|
|
@ -1482,6 +1511,9 @@ _wLLVMParseEnvOpts(PyObject *self, PyObject *args)
|
||||||
|
|
||||||
_wrap_obj2obj(LLVMInlineFunction, LLVMValueRef, int)
|
_wrap_obj2obj(LLVMInlineFunction, LLVMValueRef, int)
|
||||||
|
|
||||||
|
_wrap_none2str(LLVMDefaultTargetTriple)
|
||||||
|
|
||||||
|
|
||||||
/* Expose the void* inside a PyCObject as a PyLong. This allows us to
|
/* Expose the void* inside a PyCObject as a PyLong. This allows us to
|
||||||
* use it as a unique ID. */
|
* use it as a unique ID. */
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
|
@ -1937,6 +1969,7 @@ static PyMethodDef core_methods[] = {
|
||||||
_method( LLVMDisposePassManager )
|
_method( LLVMDisposePassManager )
|
||||||
_method( LLVMDumpPasses )
|
_method( LLVMDumpPasses )
|
||||||
_method( LLVMAddPassByName )
|
_method( LLVMAddPassByName )
|
||||||
|
_method( LLVMAddPass )
|
||||||
_method( LLVMInitializePasses )
|
_method( LLVMInitializePasses )
|
||||||
|
|
||||||
_method( LLVMInitializeNativeTarget )
|
_method( LLVMInitializeNativeTarget )
|
||||||
|
|
@ -1958,6 +1991,7 @@ static PyMethodDef core_methods[] = {
|
||||||
/* Target Machine */
|
/* Target Machine */
|
||||||
_method( LLVMTargetMachineFromEngineBuilder )
|
_method( LLVMTargetMachineFromEngineBuilder )
|
||||||
_method( LLVMDisposeTargetMachine )
|
_method( LLVMDisposeTargetMachine )
|
||||||
|
_method( LLVMCreateTargetMachine )
|
||||||
_method( LLVMTargetMachineLookup )
|
_method( LLVMTargetMachineLookup )
|
||||||
_method( LLVMTargetMachineEmitFile )
|
_method( LLVMTargetMachineEmitFile )
|
||||||
_method( LLVMTargetMachineGetTargetData )
|
_method( LLVMTargetMachineGetTargetData )
|
||||||
|
|
@ -2024,13 +2058,16 @@ static PyMethodDef core_methods[] = {
|
||||||
_method( LLVMCreatePassByName )
|
_method( LLVMCreatePassByName )
|
||||||
_method( LLVMDisposePass )
|
_method( LLVMDisposePass )
|
||||||
_method( LLVMGetPassName )
|
_method( LLVMGetPassName )
|
||||||
_method( LLVMAddPass )
|
_method( LLVMPassDump )
|
||||||
|
|
||||||
|
_method( LLVMCreateTargetLibraryInfo )
|
||||||
|
_method( LLVMCreateTargetTransformInfo )
|
||||||
|
|
||||||
/* Misc */
|
/* Misc */
|
||||||
_method( LLVMGetIntrinsic )
|
_method( LLVMGetIntrinsic )
|
||||||
_method( LLVMLoadLibraryPermanently )
|
_method( LLVMLoadLibraryPermanently )
|
||||||
_method( LLVMParseEnvOpts )
|
_method( LLVMParseEnvOpts )
|
||||||
|
_method( LLVMDefaultTargetTriple )
|
||||||
_method( LLVMInlineFunction )
|
_method( LLVMInlineFunction )
|
||||||
_method( PyCObjectVoidPtrToPyLong )
|
_method( PyCObjectVoidPtrToPyLong )
|
||||||
{ NULL }
|
{ NULL }
|
||||||
|
|
|
||||||
13
llvm/ee.py
13
llvm/ee.py
|
|
@ -257,8 +257,21 @@ def get_host_cpu_name():
|
||||||
'''
|
'''
|
||||||
return _core.LLVMGetHostCPUName()
|
return _core.LLVMGetHostCPUName()
|
||||||
|
|
||||||
|
def get_default_triple():
|
||||||
|
'''return the target triple of the host in str-rep
|
||||||
|
'''
|
||||||
|
return _core.LLVMDefaultTargetTriple()
|
||||||
|
|
||||||
class TargetMachine(object):
|
class TargetMachine(object):
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def new(triple='', cpu='', features='', opt=2):
|
||||||
|
if not triple and not cpu:
|
||||||
|
triple = get_default_triple()
|
||||||
|
cpu = get_host_cpu_name()
|
||||||
|
ptr = _core.LLVMCreateTargetMachine(triple, cpu, features, opt)
|
||||||
|
return TargetMachine(ptr)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def lookup(arch, cpu='', features='', opt=2):
|
def lookup(arch, cpu='', features='', opt=2):
|
||||||
'''create a targetmachine given an architecture name
|
'''create a targetmachine given an architecture name
|
||||||
|
|
|
||||||
|
|
@ -75,6 +75,7 @@
|
||||||
#include "llvm/Support/SourceMgr.h"
|
#include "llvm/Support/SourceMgr.h"
|
||||||
#include <llvm/InlineAsm.h>
|
#include <llvm/InlineAsm.h>
|
||||||
#include <llvm/Support/PassNameParser.h>
|
#include <llvm/Support/PassNameParser.h>
|
||||||
|
#include <llvm/Target/TargetLibraryInfo.h>
|
||||||
|
|
||||||
|
|
||||||
#if LLVM_VERSION_MAJOR >= 3 && LLVM_VERSION_MINOR >= 2
|
#if LLVM_VERSION_MAJOR >= 3 && LLVM_VERSION_MINOR >= 2
|
||||||
|
|
@ -143,6 +144,23 @@ const CodeGenOpt::Level OptLevelMap[] = {
|
||||||
};
|
};
|
||||||
} // end anony namespace
|
} // end anony namespace
|
||||||
|
|
||||||
|
LLVMPassRef LLVMCreateTargetTransformInfo(LLVMTargetMachineRef tmref){
|
||||||
|
using namespace llvm;
|
||||||
|
TargetMachine * tm = unwrap(tmref);
|
||||||
|
Pass * tti = new TargetTransformInfo(tm->getScalarTargetTransformInfo(),
|
||||||
|
tm->getVectorTargetTransformInfo());
|
||||||
|
return wrap(tti);
|
||||||
|
}
|
||||||
|
|
||||||
|
LLVMPassRef LLVMCreateTargetLibraryInfo(const char * triple){
|
||||||
|
using namespace llvm;
|
||||||
|
Pass * tli = new TargetLibraryInfo(Triple(triple));
|
||||||
|
return wrap(tli);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char * LLVMDefaultTargetTriple(){
|
||||||
|
return strdup(llvm::sys::getDefaultTargetTriple().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
LLVMPassRef LLVMCreatePassByName(const char *name){
|
LLVMPassRef LLVMCreatePassByName(const char *name){
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
@ -164,6 +182,11 @@ const char * LLVMGetPassName(LLVMPassRef passref){
|
||||||
return unwrap(passref)->getPassName();
|
return unwrap(passref)->getPassName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void LLVMPassDump(LLVMPassRef passref){
|
||||||
|
using namespace llvm;
|
||||||
|
return unwrap(passref)->dump();
|
||||||
|
}
|
||||||
|
|
||||||
void LLVMAddPass(LLVMPassManagerRef pmref, LLVMPassRef passref){
|
void LLVMAddPass(LLVMPassManagerRef pmref, LLVMPassRef passref){
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
unwrap(pmref)->add(unwrap(passref));
|
unwrap(pmref)->add(unwrap(passref));
|
||||||
|
|
@ -354,6 +377,30 @@ LLVMTargetMachineRef LLVMTargetMachineLookup(const char *arch, const char *cpu,
|
||||||
return wrap(tm);
|
return wrap(tm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LLVMTargetMachineRef LLVMCreateTargetMachine(const char *triple,
|
||||||
|
const char *cpu,
|
||||||
|
const char *features,
|
||||||
|
int opt,
|
||||||
|
std::string &error)
|
||||||
|
{
|
||||||
|
using namespace llvm;
|
||||||
|
|
||||||
|
std::string TheTriple = triple;
|
||||||
|
const Target * TheTarget = TargetRegistry::lookupTarget(TheTriple, error);
|
||||||
|
if (!TheTarget) return NULL;
|
||||||
|
|
||||||
|
TargetOptions no_target_options;
|
||||||
|
TargetMachine * tm = TheTarget->createTargetMachine(TheTriple, cpu, features,
|
||||||
|
no_target_options,
|
||||||
|
Reloc::Default,
|
||||||
|
CodeModel::Default,
|
||||||
|
OptLevelMap[opt]);
|
||||||
|
if (!tm) {
|
||||||
|
error = "Cannot create target machine";
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return wrap(tm);
|
||||||
|
}
|
||||||
|
|
||||||
LLVMTargetMachineRef LLVMTargetMachineFromEngineBuilder(LLVMEngineBuilderRef eb)
|
LLVMTargetMachineRef LLVMTargetMachineFromEngineBuilder(LLVMEngineBuilderRef eb)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
26
llvm/extra.h
26
llvm/extra.h
|
|
@ -54,6 +54,23 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wraps new TargetTransformInfo(
|
||||||
|
* TargetMachine::getScalarTargetTransformInfo,
|
||||||
|
* TargetMachine::getVectorTargetTransformInfo)
|
||||||
|
*/
|
||||||
|
LLVMPassRef LLVMCreateTargetTransformInfo(LLVMTargetMachineRef tmref);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wraps new TargetLibraryInfo
|
||||||
|
*/
|
||||||
|
LLVMPassRef LLVMCreateTargetLibraryInfo(const char * triple);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wraps llvm::getDefaultTargetTriple
|
||||||
|
*/
|
||||||
|
const char * LLVMDefaultTargetTriple();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wraps Pass::lookupPassInfo and PassInfo::createPass
|
* Wraps Pass::lookupPassInfo and PassInfo::createPass
|
||||||
*/
|
*/
|
||||||
|
|
@ -74,6 +91,11 @@ const char * LLVMGetPassName(LLVMPassRef passref);
|
||||||
*/
|
*/
|
||||||
void LLVMAddPass(LLVMPassManagerRef pmref, LLVMPassRef passref);
|
void LLVMAddPass(LLVMPassManagerRef pmref, LLVMPassRef passref);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wraps Pass::dump
|
||||||
|
*/
|
||||||
|
void LLVMPassDump(LLVMPassRef passref);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wraps llvm:InlineAsm::get
|
* Wraps llvm:InlineAsm::get
|
||||||
*/
|
*/
|
||||||
|
|
@ -176,6 +198,10 @@ LLVMTargetMachineRef LLVMTargetMachineLookup(const char *arch, const char *cpu,
|
||||||
const char *features, int opt,
|
const char *features, int opt,
|
||||||
std::string &error);
|
std::string &error);
|
||||||
|
|
||||||
|
LLVMTargetMachineRef LLVMCreateTargetMachine(const char *arch, const char *cpu,
|
||||||
|
const char *features, int opt,
|
||||||
|
std::string &error);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Wraps EngineBuilder::selectTarget
|
* Wraps EngineBuilder::selectTarget
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -209,6 +209,7 @@ class Pass(llvm.Ownable):
|
||||||
'''
|
'''
|
||||||
def __init__(self, ptr):
|
def __init__(self, ptr):
|
||||||
llvm.Ownable.__init__(self, ptr, _core.LLVMDisposePass)
|
llvm.Ownable.__init__(self, ptr, _core.LLVMDisposePass)
|
||||||
|
self.__name = ''
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def new(name):
|
def new(name):
|
||||||
|
|
@ -225,6 +226,8 @@ class Pass(llvm.Ownable):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def name(self):
|
def name(self):
|
||||||
|
'''The name used in PassRegistry.
|
||||||
|
'''
|
||||||
return self.__name
|
return self.__name
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
@ -302,6 +305,26 @@ class TargetData(Pass):
|
||||||
return _core.LLVMOffsetOfElement(self.ptr, ty.ptr, el)
|
return _core.LLVMOffsetOfElement(self.ptr, ty.ptr, el)
|
||||||
|
|
||||||
|
|
||||||
|
#===----------------------------------------------------------------------===
|
||||||
|
# Target Library Info
|
||||||
|
#===----------------------------------------------------------------------===
|
||||||
|
|
||||||
|
class TargetLibraryInfo(Pass):
|
||||||
|
@staticmethod
|
||||||
|
def new(triple):
|
||||||
|
ptr = _core.LLVMCreateTargetLibraryInfo(triple)
|
||||||
|
return TargetLibraryInfo(ptr)
|
||||||
|
|
||||||
|
|
||||||
|
#===----------------------------------------------------------------------===
|
||||||
|
# Target Transform Info
|
||||||
|
#===----------------------------------------------------------------------===
|
||||||
|
|
||||||
|
class TargetTransformInfo(Pass):
|
||||||
|
@staticmethod
|
||||||
|
def new(targetmachine):
|
||||||
|
ptr = _core.LLVMCreateTargetTransformInfo(targetmachine.ptr)
|
||||||
|
return TargetTransformInfo(ptr)
|
||||||
|
|
||||||
#===----------------------------------------------------------------------===
|
#===----------------------------------------------------------------------===
|
||||||
# Misc.
|
# Misc.
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue