Add support for module named metadata

This is mainly useful to get access to top-level debug information through 'llvm.dbg.cu'.

Wraps LLVM C-API functions `LLVMGetNamedMetadataNumOperands`, `LLVMGetNamedMetadataOperands` and `LLVMAddNamedMetadataOperand`.

Also add testcase.
This commit is contained in:
Wladimir J. van der Laan 2012-09-12 20:00:25 +02:00
commit 6e6bd1ea71
3 changed files with 46 additions and 1 deletions

View file

@ -607,6 +607,27 @@ _wrap_obj2none(LLVMDeleteBasicBlock, LLVMBasicBlockRef)
/*===-- MetaData -----------------------------------------------------===*/ /*===-- MetaData -----------------------------------------------------===*/
_wrap_objlist2obj(LLVMMetaDataGet, LLVMModuleRef, LLVMValueRef, LLVMValueRef) _wrap_objlist2obj(LLVMMetaDataGet, LLVMModuleRef, LLVMValueRef, LLVMValueRef)
_wrap_objstrobj2none(LLVMAddNamedMetadataOperand, LLVMModuleRef, LLVMValueRef)
static PyObject *
_wLLVMGetNamedMetadataOperands(PyObject *self, PyObject *args)
{
PyObject *obj_module;
const char *name;
if (!PyArg_ParseTuple(args, "Os", &obj_module, &name))
return NULL;
LLVMModuleRef module = (LLVMModuleRef)PyCapsule_GetPointer(obj_module, NULL);
unsigned num_operands = LLVMGetNamedMetadataNumOperands(module, name);
LLVMValueRef *operands = (LLVMValueRef*)malloc(sizeof(LLVMValueRef)*num_operands);
LLVMGetNamedMetadataOperands(module, name, operands);
PyObject *list = make_list_from_LLVMValueRef_array(operands, num_operands);
free(operands);
return list;
}
/*===-- Instructions -----------------------------------------------------===*/ /*===-- Instructions -----------------------------------------------------===*/
@ -1660,6 +1681,8 @@ static PyMethodDef core_methods[] = {
/* MetaData */ /* MetaData */
_method( LLVMMetaDataGet ) _method( LLVMMetaDataGet )
_method( LLVMGetNamedMetadataOperands )
_method( LLVMAddNamedMetadataOperand )
/* Instructions */ /* Instructions */
_method( LLVMGetInstructionParent ) _method( LLVMGetInstructionParent )

View file

@ -1457,6 +1457,15 @@ class MetaData(Value):
ptr = _core.LLVMMetaDataGet(module.ptr, vs) ptr = _core.LLVMMetaDataGet(module.ptr, vs)
return MetaData(ptr) return MetaData(ptr)
@staticmethod
def get_named_operands(module, name):
lst = _core.LLVMGetNamedMetadataOperands(module.ptr, name)
return [MetaData(ptr) for ptr in lst]
@staticmethod
def add_named_operand(module, name, operand):
_core.LLVMAddNamedMetadataOperand(module.ptr, name, operand.ptr)
#===----------------------------------------------------------------------=== #===----------------------------------------------------------------------===
# Instruction # Instruction
#===----------------------------------------------------------------------=== #===----------------------------------------------------------------------===

View file

@ -16,7 +16,7 @@ else:
from llvm import __version__ from llvm import __version__
from llvm.core import (Module, Type, GlobalVariable, Function, Builder, from llvm.core import (Module, Type, GlobalVariable, Function, Builder,
Constant) Constant, MetaData)
import llvm.passes as lp import llvm.passes as lp
import llvm.ee as le import llvm.ee as le
@ -390,6 +390,19 @@ tests.append(TestUses)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
class TestMetaData(unittest.TestCase):
# test module metadata
def test_metadata(self):
m = Module.new('a')
metadata = MetaData.get(m, []) # empty metadata node
MetaData.add_named_operand(m, 'foo', metadata)
self.assertEqual(MetaData.get_named_operands(m, 'foo'), [metadata])
self.assertEqual(MetaData.get_named_operands(m, 'bar'), [])
tests.append(TestMetaData)
# ---------------------------------------------------------------------------
def run(verbosity=1): def run(verbosity=1):
print('llvmpy is installed in: ' + os.path.dirname(__file__)) print('llvmpy is installed in: ' + os.path.dirname(__file__))
print('llvmpy version: ' + __version__) print('llvmpy version: ' + __version__)