Accept list of values and LLVM values as debug descriptors
This commit is contained in:
parent
3b75974731
commit
b46757f492
2 changed files with 36 additions and 21 deletions
|
|
@ -8,16 +8,28 @@ import llvm.core
|
||||||
from llvm import _dwarf
|
from llvm import _dwarf
|
||||||
|
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
# Callbacks for debug type descriptors
|
# Some types and type checking functions
|
||||||
#----------------------------------------------------------------------------
|
#----------------------------------------------------------------------------
|
||||||
|
|
||||||
int32_t = llvm.core.Type.int(32)
|
int32_t = llvm.core.Type.int(32)
|
||||||
bool_t = llvm.core.Type.int(1)
|
bool_t = llvm.core.Type.int(1)
|
||||||
p_int32_t = llvm.core.Type.pointer(int32_t)
|
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)
|
i32 = functools.partial(llvm.core.Constant.int, int32_t)
|
||||||
i1 = functools.partial(llvm.core.Constant.int, bool_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):
|
def get_i32(llvm_module, value):
|
||||||
return i32(value)
|
return i32(value)
|
||||||
|
|
||||||
|
|
@ -25,11 +37,20 @@ def get_i1(llvm_module, value):
|
||||||
return i1(value)
|
return i1(value)
|
||||||
|
|
||||||
def get_md(llvm_module, value):
|
def get_md(llvm_module, value):
|
||||||
|
if is_md(value):
|
||||||
|
return value
|
||||||
return value.get_metadata(llvm_module)
|
return value.get_metadata(llvm_module)
|
||||||
|
|
||||||
def get_mdstr(llvm_module, value):
|
def get_mdstr(llvm_module, value):
|
||||||
|
if is_mdstr(value):
|
||||||
|
return value
|
||||||
return llvm.core.MetaDataString.get(llvm_module, 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):
|
def get_lfunc(llvm_module, lfunc):
|
||||||
assert lfunc.module is llvm_module
|
assert lfunc.module is llvm_module
|
||||||
return lfunc
|
return lfunc
|
||||||
|
|
@ -171,14 +192,9 @@ class DebugInfoDescriptor(object):
|
||||||
md = self.get_metadata(llvm_module)
|
md = self.get_metadata(llvm_module)
|
||||||
llvm.core.MetaData.add_named_operand(llvm_module, "dbg", md)
|
llvm.core.MetaData.add_named_operand(llvm_module, "dbg", md)
|
||||||
|
|
||||||
|
#----------------------------------------------------------------------------
|
||||||
class EmptyMetadata(DebugInfoDescriptor):
|
# Convenience descriptors
|
||||||
"""
|
#----------------------------------------------------------------------------
|
||||||
Metadata without any fields.
|
|
||||||
"""
|
|
||||||
|
|
||||||
type_descriptors = []
|
|
||||||
|
|
||||||
|
|
||||||
class MDList(DebugInfoDescriptor):
|
class MDList(DebugInfoDescriptor):
|
||||||
"""
|
"""
|
||||||
|
|
@ -189,12 +205,11 @@ class MDList(DebugInfoDescriptor):
|
||||||
self.type_descriptors = [desc("op", get_md)] * len(operands)
|
self.type_descriptors = [desc("op", get_md)] * len(operands)
|
||||||
super(MDList, self).__init__(*operands)
|
super(MDList, self).__init__(*operands)
|
||||||
|
|
||||||
class NULLDescriptor(DebugInfoDescriptor):
|
empty = MDList([])
|
||||||
|
|
||||||
type_descriptors = []
|
#----------------------------------------------------------------------------
|
||||||
|
# Dwarf Debug descriptors
|
||||||
def build_metadata(self, llvm_module):
|
#----------------------------------------------------------------------------
|
||||||
return llvm.core.Constant.null(p_int32_t)
|
|
||||||
|
|
||||||
class CompileUnitDescriptor(DebugInfoDescriptor):
|
class CompileUnitDescriptor(DebugInfoDescriptor):
|
||||||
"""
|
"""
|
||||||
|
|
@ -231,10 +246,10 @@ class CompileUnitDescriptor(DebugInfoDescriptor):
|
||||||
desc("is_optimized", get_i1, default=False),
|
desc("is_optimized", get_i1, default=False),
|
||||||
desc("compile_flags", get_mdstr, default=""),
|
desc("compile_flags", get_mdstr, default=""),
|
||||||
desc("runtime_version", get_i32, default=0),
|
desc("runtime_version", get_i32, default=0),
|
||||||
desc("enum_types", get_md, default=EmptyMetadata()),
|
desc("enum_types", get_mdlist, default=empty),
|
||||||
desc("retained_types", get_md, default=EmptyMetadata()),
|
desc("retained_types", get_mdlist, default=empty),
|
||||||
desc("subprograms", get_md, default=EmptyMetadata()),
|
desc("subprograms", get_mdlist, default=empty),
|
||||||
desc("global_vars", get_md, default=EmptyMetadata()),
|
desc("global_vars", get_mdlist, default=empty),
|
||||||
]
|
]
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
|
|
@ -267,7 +282,7 @@ class FileDescriptor(DebugInfoDescriptor):
|
||||||
# Positional argument list starts here:
|
# Positional argument list starts here:
|
||||||
desc("source_filename", get_mdstr),
|
desc("source_filename", get_mdstr),
|
||||||
desc("source_filedir", 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):
|
def __init__(self, *args, **kwargs):
|
||||||
|
|
@ -379,5 +394,5 @@ class PositionInfoDescriptor(DebugInfoDescriptor):
|
||||||
desc("context_descr", get_md), # Scope of instruction
|
desc("context_descr", get_md), # Scope of instruction
|
||||||
# (FileDescr etc)
|
# (FileDescr etc)
|
||||||
desc("original_context_descr", get_md, # The original scope if inlined
|
desc("original_context_descr", get_md, # The original scope if inlined
|
||||||
default=NULLDescriptor()),
|
default=null),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -45,7 +45,7 @@ class TestDebugInfo(unittest.TestCase):
|
||||||
"some_function",
|
"some_function",
|
||||||
filedesc,
|
filedesc,
|
||||||
1, # line number
|
1, # line number
|
||||||
debuginfo.EmptyMetadata(), # Type descriptor
|
debuginfo.empty, # Type descriptor
|
||||||
llvm_func=square,
|
llvm_func=square,
|
||||||
)
|
)
|
||||||
subprograms = debuginfo.MDList([subprogram])
|
subprograms = debuginfo.MDList([subprogram])
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue