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); } }
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; }