From b46757f492c9e0ce6aa810263ab10652a1fcc6c6 Mon Sep 17 00:00:00 2001 From: Mark Florisson Date: Tue, 22 Jan 2013 11:21:17 -0600 Subject: [PATCH] Accept list of values and LLVM values as debug descriptors --- llvm/debuginfo.py | 55 +++++++++++++++++++++++++++--------------- test/test_debuginfo.py | 2 +- 2 files changed, 36 insertions(+), 21 deletions(-) diff --git a/llvm/debuginfo.py b/llvm/debuginfo.py index 8249aef..0f18b33 100644 --- a/llvm/debuginfo.py +++ b/llvm/debuginfo.py @@ -8,16 +8,28 @@ import llvm.core from llvm import _dwarf #---------------------------------------------------------------------------- -# Callbacks for debug type descriptors +# Some types and type checking functions #---------------------------------------------------------------------------- int32_t = llvm.core.Type.int(32) bool_t = llvm.core.Type.int(1) p_int32_t = llvm.core.Type.pointer(int32_t) +null = llvm.core.Constant.null(p_int32_t) i32 = functools.partial(llvm.core.Constant.int, int32_t) i1 = functools.partial(llvm.core.Constant.int, bool_t) +def is_md(value): + return isinstance(value, (llvm.core.MetaData, llvm.core.NamedMetaData, + llvm.core.Value)) + +def is_mdstr(value): + return isinstance(value, (llvm.core.MetaDataString, llvm.core.Value)) + +#---------------------------------------------------------------------------- +# Callbacks for debug type descriptors +#---------------------------------------------------------------------------- + def get_i32(llvm_module, value): return i32(value) @@ -25,11 +37,20 @@ def get_i1(llvm_module, value): return i1(value) def get_md(llvm_module, value): + if is_md(value): + return value return value.get_metadata(llvm_module) def get_mdstr(llvm_module, value): + if is_mdstr(value): + return value return llvm.core.MetaDataString.get(llvm_module, value) +def get_mdlist(llvm_module, value): + if isinstance(value, list): + value = MDList([value]) + return get_md(llvm_module, value) + def get_lfunc(llvm_module, lfunc): assert lfunc.module is llvm_module return lfunc @@ -171,14 +192,9 @@ class DebugInfoDescriptor(object): md = self.get_metadata(llvm_module) llvm.core.MetaData.add_named_operand(llvm_module, "dbg", md) - -class EmptyMetadata(DebugInfoDescriptor): - """ - Metadata without any fields. - """ - - type_descriptors = [] - +#---------------------------------------------------------------------------- +# Convenience descriptors +#---------------------------------------------------------------------------- class MDList(DebugInfoDescriptor): """ @@ -189,12 +205,11 @@ class MDList(DebugInfoDescriptor): self.type_descriptors = [desc("op", get_md)] * len(operands) super(MDList, self).__init__(*operands) -class NULLDescriptor(DebugInfoDescriptor): +empty = MDList([]) - type_descriptors = [] - - def build_metadata(self, llvm_module): - return llvm.core.Constant.null(p_int32_t) +#---------------------------------------------------------------------------- +# Dwarf Debug descriptors +#---------------------------------------------------------------------------- class CompileUnitDescriptor(DebugInfoDescriptor): """ @@ -231,10 +246,10 @@ class CompileUnitDescriptor(DebugInfoDescriptor): desc("is_optimized", get_i1, default=False), desc("compile_flags", get_mdstr, default=""), desc("runtime_version", get_i32, default=0), - desc("enum_types", get_md, default=EmptyMetadata()), - desc("retained_types", get_md, default=EmptyMetadata()), - desc("subprograms", get_md, default=EmptyMetadata()), - desc("global_vars", get_md, default=EmptyMetadata()), + desc("enum_types", get_mdlist, default=empty), + desc("retained_types", get_mdlist, default=empty), + desc("subprograms", get_mdlist, default=empty), + desc("global_vars", get_mdlist, default=empty), ] def __init__(self, *args, **kwargs): @@ -267,7 +282,7 @@ class FileDescriptor(DebugInfoDescriptor): # Positional argument list starts here: desc("source_filename", get_mdstr), desc("source_filedir", get_mdstr), - desc("compile_unit", get_md, default=NULLDescriptor()), + desc("compile_unit", get_md, default=null), ] def __init__(self, *args, **kwargs): @@ -379,5 +394,5 @@ class PositionInfoDescriptor(DebugInfoDescriptor): desc("context_descr", get_md), # Scope of instruction # (FileDescr etc) desc("original_context_descr", get_md, # The original scope if inlined - default=NULLDescriptor()), + default=null), ] diff --git a/test/test_debuginfo.py b/test/test_debuginfo.py index 528ae6f..68ab29c 100644 --- a/test/test_debuginfo.py +++ b/test/test_debuginfo.py @@ -45,7 +45,7 @@ class TestDebugInfo(unittest.TestCase): "some_function", filedesc, 1, # line number - debuginfo.EmptyMetadata(), # Type descriptor + debuginfo.empty, # Type descriptor llvm_func=square, ) subprograms = debuginfo.MDList([subprogram])