code: def _addr_to_function(self, addr, blockaddr_to_function, known_functions):
          
  
          if addr in blockaddr_to_function:
              f = blockaddr_to_function[addr]
          else:
              is_syscall = self.project.simos.is_syscall_addr(addr)
  
              n = self.model.get_any_node(addr, is_syscall=is_syscall)
              if n is None: node = addr
              else: node = self._to_snippet(n)
  
              if isinstance(addr, SootAddressDescriptor):
                  addr = addr.method
  
              self.kb.functions._add_node(addr, node, syscall=is_syscall)
              f = self.kb.functions.function(addr=addr)
  
              blockaddr_to_function[addr] = f
  
              function_is_returning = False
              if addr in known_functions:
                  if known_functions.function(addr).returning:
                      f.returning = True
                      function_is_returning = True
  
              if not function_is_returning:
                  # We will rerun function feature analysis on this function later. Add it to
                  # self._updated_nonreturning_functions so it can be picked up by function feature analysis later.
                  if self._updated_nonreturning_functions is not None:
                      self._updated_nonreturning_functions.add(addr)
  
          return f
docs: Convert an address to a Function object, and store the mapping in a dict. If the block is known to be part of a
          function, just return that function.
  
          :param int addr: Address to convert
          :param dict blockaddr_to_function: A mapping between block addresses to Function instances.
          :param angr.knowledge_plugins.FunctionManager known_functions: Recovered functions.
          :return: a Function object
          :rtype: angr.knowledge.Function