compiler: purge generated functions from backtraces.

This commit is contained in:
whitequark 2016-04-02 18:29:36 +00:00
parent 712e16b79e
commit a57aabb3ea
3 changed files with 9 additions and 4 deletions

View File

@ -425,6 +425,8 @@ class Function:
the module it is contained in the module it is contained in
:ivar is_cold: :ivar is_cold:
(bool) if True, the function should be considered rarely called (bool) if True, the function should be considered rarely called
:ivar is_generated:
(bool) if True, the function will not appear in backtraces
:ivar flags: (set of str) Code generation flags. :ivar flags: (set of str) Code generation flags.
Flag ``fast-math`` is the equivalent of gcc's ``-ffast-math``. Flag ``fast-math`` is the equivalent of gcc's ``-ffast-math``.
""" """
@ -436,6 +438,7 @@ class Function:
self.set_arguments(arguments) self.set_arguments(arguments)
self.is_internal = False self.is_internal = False
self.is_cold = False self.is_cold = False
self.is_generated = False
self.flags = {} self.flags = {}
def _remove_name(self, name): def _remove_name(self, name):

View File

@ -944,6 +944,7 @@ class ARTIQIRGenerator(algorithm.Visitor):
func = ir.Function(typ, ".".join(self.name + [name]), args, loc=loc) func = ir.Function(typ, ".".join(self.name + [name]), args, loc=loc)
func.is_internal = True func.is_internal = True
func.is_cold = True func.is_cold = True
func.is_generated = True
self.functions.append(func) self.functions.append(func)
old_func, self.current_function = self.current_function, func old_func, self.current_function = self.current_function, func

View File

@ -544,8 +544,9 @@ class LLVMIRGenerator:
self.llbuilder = ll.IRBuilder() self.llbuilder = ll.IRBuilder()
llblock_map = {} llblock_map = {}
disubprogram = self.debug_info_emitter.emit_subprogram(func, self.llfunction) if not func.is_generated:
self.llfunction.set_metadata('dbg', disubprogram) lldisubprogram = self.debug_info_emitter.emit_subprogram(func, self.llfunction)
self.llfunction.set_metadata('dbg', lldisubprogram)
# First, map arguments. # First, map arguments.
if self.has_sret(func.type): if self.has_sret(func.type):
@ -566,9 +567,9 @@ class LLVMIRGenerator:
for block in func.basic_blocks: for block in func.basic_blocks:
self.llbuilder.position_at_end(self.llmap[block]) self.llbuilder.position_at_end(self.llmap[block])
for insn in block.instructions: for insn in block.instructions:
if insn.loc is not None: if insn.loc is not None and not func.is_generated:
self.llbuilder.debug_metadata = \ self.llbuilder.debug_metadata = \
self.debug_info_emitter.emit_loc(insn.loc, disubprogram) self.debug_info_emitter.emit_loc(insn.loc, lldisubprogram)
llinsn = getattr(self, "process_" + type(insn).__name__)(insn) llinsn = getattr(self, "process_" + type(insn).__name__)(insn)
assert llinsn is not None assert llinsn is not None