Add NamedMetaData

This commit is contained in:
Siu Kwan Lam 2012-10-16 16:35:20 -05:00
commit e0d1b94053
6 changed files with 138 additions and 0 deletions

View file

@ -295,6 +295,9 @@ _wLLVMLinkModules(PyObject *self, PyObject *args)
LLVMPY_CATCH_ALL
}
_wrap_objstr2obj(LLVMModuleGetOrInsertNamedMetaData, LLVMModuleRef, LLVMNamedMDRef)
_wrap_objstr2obj(LLVMModuleGetNamedMetaData, LLVMModuleRef, LLVMNamedMDRef)
/*===----------------------------------------------------------------------===*/
/* Types */
/*===----------------------------------------------------------------------===*/
@ -703,6 +706,14 @@ _wLLVMGetNamedMetadataOperands(PyObject *self, PyObject *args)
LLVMPY_CATCH_ALL
}
/*===-- NamedMetaData -----------------------------------------------------===*/
_wrap_obj2str( LLVMNamedMetaDataGetName, LLVMNamedMDRef )
_wrap_objobj2none( LLVMNamedMetaDataAddOperand, LLVMNamedMDRef, LLVMValueRef )
_wrap_obj2none( LLVMEraseNamedMetaData, LLVMNamedMDRef )
_wrap_dumper(LLVMDumpNamedMDToString, LLVMNamedMDRef)
/*===-- Instructions -----------------------------------------------------===*/
_wrap_obj2obj(LLVMGetInstructionParent, LLVMValueRef, LLVMBasicBlockRef)
@ -1564,6 +1575,8 @@ static PyMethodDef core_methods[] = {
_method( LLVMModuleGetPointerSize )
_method( LLVMModuleGetOrInsertFunction )
_method( LLVMLinkModules )
_method( LLVMModuleGetOrInsertNamedMetaData )
_method( LLVMModuleGetNamedMetaData )
/* Types */
@ -1788,6 +1801,12 @@ static PyMethodDef core_methods[] = {
_method( LLVMMetaDataGetNumOperands )
_method( LLVMMetaDataStringGet )
/* NamedMetaData */
_method( LLVMNamedMetaDataGetName )
_method( LLVMNamedMetaDataAddOperand )
_method( LLVMEraseNamedMetaData )
_method( LLVMDumpNamedMDToString )
/* Instructions */
_method( LLVMGetInstructionParent )
_method( LLVMGetFirstInstruction )

View file

@ -574,6 +574,14 @@ class Module(llvm.Ownable, llvm.Cacheable):
else:
return data
def get_or_insert_named_metadata(self, name):
ptr = _core.LLVMModuleGetOrInsertNamedMetaData(self.ptr, name)
return NamedMetaData(ptr)
def get_named_metadata(self, name):
ptr = _core.LLVMModuleGetNamedMetaData(self.ptr, name)
return NamedMetaData(ptr)
#===----------------------------------------------------------------------===
# Types
#===----------------------------------------------------------------------===
@ -1542,6 +1550,31 @@ class MetaDataString(Value):
'''Same as MDString::getString'''
return self.name
class NamedMetaData(llvm.Cacheable):
@staticmethod
def get_or_insert(mod, name):
return mod.get_or_insert_named_metadata(name)
@staticmethod
def get(mod, name):
return mod.get_named_metadata(name)
def __init__(self, ptr):
self.ptr = ptr
def delete(self):
_core.LLVMEraseNamedMetaData(self.ptr)
@property
def name(self):
return _core.LLVMNamedMetaDataGetName(self.ptr)
def __str__(self):
return _core.LLVMDumpNamedMDToString(self.ptr)
def add(self, operand):
_core.LLVMNamedMetaDataAddOperand(self.ptr, operand.ptr)
#===----------------------------------------------------------------------===
# Instruction
#===----------------------------------------------------------------------===

View file

@ -75,6 +75,7 @@
#include "llvm/Linker.h"
#include "llvm/Support/SourceMgr.h"
// LLVM-C includes
#include "llvm-c/Core.h"
#include "llvm-c/ExecutionEngine.h"
@ -86,6 +87,7 @@
namespace llvm{
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(EngineBuilder, LLVMEngineBuilderRef)
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(TargetMachine, LLVMTargetMachineRef)
DEFINE_SIMPLE_CONVERSION_FUNCTIONS(NamedMDNode, LLVMNamedMDRef)
template<typename T>
inline T **unwrap(LLVMTypeRef *Tys, unsigned Length) {
@ -133,6 +135,44 @@ const CodeGenOpt::Level OptLevelMap[] = {
};
} // end anony namespace
const char * LLVMDumpNamedMDToString(LLVMNamedMDRef nmd)
{
using namespace llvm;
std::string s;
llvm::raw_string_ostream buf(s);
unwrap(nmd)->print(buf, NULL);
return strdup(buf.str().c_str());
}
const char * LLVMNamedMetaDataGetName(LLVMNamedMDRef nmd)
{
using namespace llvm;
return unwrap(nmd)->getName().data();
}
void LLVMNamedMetaDataAddOperand(LLVMNamedMDRef nmd, LLVMValueRef md)
{
using namespace llvm;
unwrap(nmd)->addOperand(unwrap<MDNode>(md));
}
void LLVMEraseNamedMetaData(LLVMNamedMDRef nmd)
{
using namespace llvm;
unwrap(nmd)->eraseFromParent();
}
LLVMNamedMDRef LLVMModuleGetOrInsertNamedMetaData(LLVMModuleRef mod, const char *name)
{
using namespace llvm;
return wrap(unwrap(mod)->getOrInsertNamedMetadata(name));
}
LLVMNamedMDRef LLVMModuleGetNamedMetaData(LLVMModuleRef mod, const char *name)
{
using namespace llvm;
return wrap(unwrap(mod)->getNamedMetadata(name));
}
void LLVMInstSetMetaData(LLVMValueRef instref, const char* mdkind,
LLVMValueRef metaref)

View file

@ -47,12 +47,43 @@
#include "llvm-c/Transforms/PassManagerBuilder.h"
#include "llvm_c_extra.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
* Wraps NamedMDNode::print()
*/
const char * LLVMDumpNamedMDToString(LLVMNamedMDRef nmd);
/*
* Wraps NamedMDNode::getName()
*/
const char * LLVMNamedMetaDataGetName(LLVMNamedMDRef nmd);
/*
* Wraps NamedMDNode::addOperand()
*/
void LLVMNamedMetaDataAddOperand(LLVMNamedMDRef nmd, LLVMValueRef md);
/*
* Wraps NamedMDNode::eraseFromParent()
*/
void LLVMEraseNamedMetaData(LLVMNamedMDRef nmd);
/*
* Wraps Module::getOrInsertNamedMetadata
*/
LLVMNamedMDRef LLVMModuleGetOrInsertNamedMetaData(LLVMModuleRef mod, const char *name);
/*
* Wraps Module::getNamedMetadata
*/
LLVMNamedMDRef LLVMModuleGetNamedMetaData(LLVMModuleRef mod, const char *name);
/*
* Wraps Instruction::setMetadata()
*/

View file

@ -20,6 +20,7 @@ inline ref wrap(const ty *P) { \
typedef struct LLVMOpaqueEngineBuilder *LLVMEngineBuilderRef;
typedef struct LLVMOpaqueTargetMachine *LLVMTargetMachineRef;
typedef struct LLVMOpaqueNamedMD *LLVMNamedMDRef;
#ifdef __cplusplus

View file

@ -952,6 +952,20 @@ tests.append(TestVolatile)
# ---------------------------------------------------------------------------
class TestNamedMetaData(unittest.TestCase):
def test_named_md(self):
m = Module.new('test_named_md')
nmd = m.get_or_insert_named_metadata('something')
md = MetaData.get(m, [Constant.int(Type.int(), 0xbeef)])
nmd.add(md)
self.assertTrue(str(nmd).startswith('!something'))
ir = str(m)
self.assertTrue('!something' in ir)
tests.append(TestNamedMetaData)
# ---------------------------------------------------------------------------
def run(verbosity=1):
print('llvmpy is installed in: ' + os.path.dirname(__file__))
print('llvmpy version: ' + llvm.__version__)