ccplt *ccplt_read(const char *fname) {
  FILE *fd = fopen(fname, "rb");
  assert(fd);

  ccplt *lt = malloc(sizeof(ccplt));
  assert(lt);
  lt->num_nodes = uint64_read(fd);
  lt->capacity  = lt->num_nodes;
  lt->nodes     = malloc(lt->capacity * sizeof(ccpnode *));
  assert(lt->nodes);
  lt->ht        = hashtable_alloc(2*lt->capacity, clone_hash, (int (*)(const void *, const void *))clone_eq);
  lt->pred_num  = predicate_numerator_read(fd);

  /* Alloc memory for ccpnodes. We need the pointers to ccpnodes be ready before
   * calling `ccpnode_read`. */
  for(ccpnode **ccpnodep = lt->nodes; ccpnodep < lt->nodes + lt->num_nodes; ++ccpnodep) {
    *ccpnodep = ccpnode_alloc();
  }
  
  /* read ccpnodes from file and connect them together */
  class_idx idx = 0;
  for(ccpnode **ccpnodep = lt->nodes; ccpnodep < lt->nodes + lt->num_nodes; ++ccpnodep) {
    ccpnode *c = *ccpnodep;
    c->lt = lt;
    ccpnode_read(fd, lt, c);
    assert(c->cidx == idx);
    ++idx;
  }

  fclose(fd);
  return lt;
}
predicate_numerator *predicate_numerator_read(FILE *fd) {
  predicate_numerator *pred_num = malloc(sizeof(struct predicate_numerator));
  assert(pred_num);
  
  size_t sz = uint64_read(fd);
  pred *preds = malloc(sz * sizeof(struct pred));
  assert(preds);
  for(pred *p = preds; p < preds + sz; ++p) {
    pred_read(fd, p);
  }

  return predicate_numerator_alloc(preds, sz);
}
void read_classes_with_one_subclass_discr_fun(FILE *fd, const majlattice *lattice, majclass ***classes, size_t *num_classes, fun **funs) {
  *num_classes = uint64_read(fd);
  *classes = malloc(*num_classes * sizeof(majclass *));
  assert(*classes != NULL);
  *funs = malloc(*num_classes * sizeof(fun));
  assert(*funs != NULL);
  for(size_t i = 0; i < *num_classes; ++i) {
    majclass_id class_id, subclass_id;
    majclass_id_read(fd, &class_id);
    majclass_id_read(fd, &subclass_id);
    fun_read(fd, *funs + i);
    (*classes)[i] = majlattice_get_class(lattice, class_id);
  }  
}
예제 #4
0
uint64
elf_get_value(void* elf, void* ptr, unsigned off32, unsigned size32, unsigned off64, unsigned size64) {
  uint8* base = elf;
  uint8* p = ptr;
  unsigned off, size;
  uint64 ret = 0;
  if(ELF_32(base)) {
    off = off32;
    size = size32;
  } else {
    off = off64;
    size = size64;
  }
  switch(size) {
    case 8: ret = uint64_read((const char*)&p[off]); break;
    case 4: ret = uint32_read((const char*)&p[off]); break;
    case 2: ret = uint16_read((const char*)&p[off]); break;
    case 1: ret = p[off]; break;
  }
  return ret;
}