docs: def _def_lookup(self, live_defs, variable):
          """
          This is a backward lookup in the previous defs.
  
          :param addr_list: a list of normalized addresses.
                          Note that, as we are using VSA, it is possible that @a is affected by several definitions.
          :returns:        a dict {stmt:labels} where label is the number of individual addresses of addr_list (or the
                          actual set of addresses depending on the keep_addrs flag) that are definted by stmt.
          """
  
          prevdefs = { }
  
          if variable in live_defs:
              code_loc_set = live_defs[variable]
              for code_loc in code_loc_set:
                  # Label edges with cardinality or actual sets of addresses
                  if isinstance(variable, SimMemoryVariable):
                      type_ = 'mem'
                  elif isinstance(variable, SimRegisterVariable):
                      type_ = 'reg'
                  else:
                      raise AngrDDGError('Unknown variable type %s' % type(variable))
  
                  if self.keep_data is True:
                      data = variable
  
                      prevdefs[code_loc] = {
                          'type': type_,
                          'data': data
                      }
  
                  else:
                      if code_loc in prevdefs:
                          count = prevdefs[code_loc]['count'] + 1
                      else:
                          count = 0
                      prevdefs[code_loc] = {
                          'type': type_,
                          'count': count
                      }
          return prevdefs