docs: def _link_variables_on_expr(self, variable_manager, block, stmt_idx, stmt, expr):
          """
          Link atoms (AIL expressions) in the given expression to corresponding variables identified previously.
  
          :param variable_manager:    Variable manager of the function.
          :param ailment.Block block: AIL block.
          :param int stmt_idx:        ID of the statement.
          :param stmt:                The AIL statement that `expr` belongs to.
          :param expr:                The AIl expression to work on.
          :return:                    None
          """
  
          if type(expr) is ailment.Expr.Register:
              # find a register variable
              reg_vars = variable_manager.find_variables_by_atom(block.addr, stmt_idx, expr)
              # TODO: make sure it is the correct register we are looking for
              if len(reg_vars) == 1:
                  reg_var, offset = next(iter(reg_vars))
                  expr.variable = reg_var
                  expr.offset = offset
  
          elif type(expr) is ailment.Expr.Load:
              # import ipdb; ipdb.set_trace()
              variables = variable_manager.find_variables_by_atom(block.addr, stmt_idx, expr)
              if len(variables) == 0:
                  self._link_variables_on_expr(variable_manager, block, stmt_idx, stmt, expr.addr)
              else:
                  if len(variables) > 1:
                      l.error("More than one variable are available for atom %s. Consider fixing it using phi nodes.",
                              expr
                              )
                  var, offset = next(iter(variables))
                  expr.variable = var
                  expr.offset = offset
  
          elif type(expr) is ailment.Expr.BinaryOp:
              variables = variable_manager.find_variables_by_atom(block.addr, stmt_idx, expr)
              if len(variables) == 1:
                  var, offset = next(iter(variables))
                  expr.referenced_variable = var
                  expr.offset = offset
              else:
                  self._link_variables_on_expr(variable_manager, block, stmt_idx, stmt, expr.operands[0])
                  self._link_variables_on_expr(variable_manager, block, stmt_idx, stmt, expr.operands[1])
  
          elif type(expr) is ailment.Expr.UnaryOp:
              variables = variable_manager.find_variables_by_atom(block.addr, stmt_idx, expr)
              if len(variables) == 1:
                  var, offset = next(iter(variables))
                  expr.referenced_variable = var
                  expr.offset = offset
              else:
                  self._link_variables_on_expr(variable_manager, block, stmt_idx, stmt, expr.operands)
  
          elif type(expr) is ailment.Expr.Convert:
              self._link_variables_on_expr(variable_manager, block, stmt_idx, stmt, expr.operand)
  
          elif isinstance(expr, ailment.Expr.BasePointerOffset):
              variables = variable_manager.find_variables_by_atom(block.addr, stmt_idx, expr)
              if len(variables) == 1:
                  var, offset = next(iter(variables))
                  expr.referenced_variable = var
                  expr.offset = offset