Accept list of values and LLVM values as debug descriptors

This commit is contained in:
Mark Florisson 2013-01-22 11:21:17 -06:00
commit b46757f492
2 changed files with 36 additions and 21 deletions

View file

@ -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),
]

View file

@ -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])