code: def _get_constrs_load_memory(self, gadget):
          
          dst = self.analyzer.get_register_expr(gadget.destination[0].name, mode="post")
          size = gadget.destination[0].size
  
          if isinstance(gadget.sources[0], ReilRegisterOperand):
              base_addr = self.analyzer.get_register_expr(gadget.sources[0].name, mode="pre")
              offset = gadget.sources[1].immediate
  
              addr = base_addr + offset
          else:
              addr = gadget.sources[1].immediate
  
          constrs = []
  
          for i in reversed(range(0, size, 8)):
              bytes_exprs_1 = self.analyzer.get_memory_expr(addr + i // 8, 8 // 8)
              bytes_exprs_2 = smtfunction.extract(dst, i, 8)
  
              constrs += [bytes_exprs_1 != bytes_exprs_2]
  
          # Check all non-modified registers don't change.
          constrs_mod = []
  
          for name in self._arch_info.registers_gp_base:
              if name not in [r.name for r in gadget.modified_registers]:
                  var_initial = self.analyzer.get_register_expr(name, mode="pre")
                  var_final = self.analyzer.get_register_expr(name, mode="post")
  
                  constrs_mod += [var_initial != var_final]
  
          if constrs_mod:
              constrs_mod = [reduce(lambda c, acc: acc | c, constrs_mod[1:], constrs_mod[0])]
  
          return constrs + constrs_mod
docs: Generate constraints for the LoadMemory gadgets: dst_reg <- mem[src_reg + offset]