docs: def _analyze_function(self):
          """
          Go over the variable information in variable manager for this function, and return all uninitialized
          register/stack variables.
  
          :return:
          """
  
          if not self._function.is_simprocedure \
                  and not self._function.is_plt \
                  and not self._variable_manager.has_function_manager(self._function.addr):
              l.warning("Please run variable recovery on %s before analyzing its calling conventions.",
                        repr(self._function))
              return None
  
          vm = self._variable_manager[self._function.addr]
  
          input_variables = vm.input_variables()
  
          input_args = self._args_from_vars(input_variables)
  
          # TODO: properly decide sp_delta
          sp_delta = self.project.arch.bytes if self.project.arch.call_pushes_ret else 0
  
          cc = SimCC.find_cc(self.project.arch, list(input_args), sp_delta)
  
          if cc is None:
              l.warning('_analyze_function(): Cannot find a calling convention that fits the given arguments.')
  
          return cc