From e0d1b94053517bccb30f88b53d541cd4b986dfbb Mon Sep 17 00:00:00 2001 From: Siu Kwan Lam Date: Tue, 16 Oct 2012 16:35:20 -0500 Subject: [PATCH] Add NamedMetaData --- llvm/_core.cpp | 19 +++++++++++++++++++ llvm/core.py | 33 +++++++++++++++++++++++++++++++++ llvm/extra.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ llvm/extra.h | 31 +++++++++++++++++++++++++++++++ llvm/llvm_c_extra.h | 1 + llvm/test_llvmpy.py | 14 ++++++++++++++ 6 files changed, 138 insertions(+) diff --git a/llvm/_core.cpp b/llvm/_core.cpp index 1ec86aa..19dadec 100644 --- a/llvm/_core.cpp +++ b/llvm/_core.cpp @@ -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 ) diff --git a/llvm/core.py b/llvm/core.py index 2de3615..8b9a7ae 100644 --- a/llvm/core.py +++ b/llvm/core.py @@ -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 #===----------------------------------------------------------------------=== diff --git a/llvm/extra.cpp b/llvm/extra.cpp index 537eae2..198fbb9 100644 --- a/llvm/extra.cpp +++ b/llvm/extra.cpp @@ -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 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(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) diff --git a/llvm/extra.h b/llvm/extra.h index 1772878..32ca193 100644 --- a/llvm/extra.h +++ b/llvm/extra.h @@ -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() */ diff --git a/llvm/llvm_c_extra.h b/llvm/llvm_c_extra.h index 53fe71c..9eb77dc 100644 --- a/llvm/llvm_c_extra.h +++ b/llvm/llvm_c_extra.h @@ -20,6 +20,7 @@ inline ref wrap(const ty *P) { \ typedef struct LLVMOpaqueEngineBuilder *LLVMEngineBuilderRef; typedef struct LLVMOpaqueTargetMachine *LLVMTargetMachineRef; +typedef struct LLVMOpaqueNamedMD *LLVMNamedMDRef; #ifdef __cplusplus diff --git a/llvm/test_llvmpy.py b/llvm/test_llvmpy.py index 985df2b..7757cd1 100644 --- a/llvm/test_llvmpy.py +++ b/llvm/test_llvmpy.py @@ -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__)