static int bbAdd(Sdb *db, ut64 from, ut64 to, ut64 jump, ut64 fail) { ut64 block_start = getCrossingBlock (db, "bbs", from, to); int add = 1; if (block_start == UT64_MAX) { // add = 1; } else if (block_start == from) { // check if size is the same, add = 0; } else { /* from = start address of new basic block to = end address of new basic block jump = destination basic block fail = fallback jump of basic block addr = previous closer basic block start address addr_end = previous closer basic block start address */ // found a possible block if (from > block_start) { // from inside // RESIZE this sdb_num_set (db, Fbb(block_start), from, 0); sdb_num_set (db, FbbTo(block_start), from, 0); sdb_array_set_num (db, FbbTo(block_start), 0, from, 0); sdb_array_set_num (db, FbbTo(block_start), 1, UT64_MAX, 0); } else { // < the current runs into a known block to = block_start; jump = block_start; fail = UT64_MAX; } } if (add) { sdb_array_add_num (db, "bbs", from, 0); sdb_num_set (db, Fbb(from), to, 0); sdb_array_set_num (db, FbbTo(from), 0, jump, 0); sdb_array_set_num (db, FbbTo(from), 1, fail, 0); sdb_num_min (db, "min", from, 0); sdb_num_max (db, "max", to, 0); } return 0; }
static int bbAdd (Sdb *db, ut64 from, ut64 to, ut64 jump, ut64 fail) { ut64 addr_end, addr = sdb_array_get_closer_num (db, "bbs", from); int add = 1; if (addr == UT64_MAX) { // add = 1; } else if (addr == from) { // check if size is the same, eprintf ("basic block already analyzed\n"); add = 0; } else { /* from = start address of new basic block to = end address of new basic block jump = destination basic block fail = fallback jump of basic block addr = previous closer basic block start address addr_end = previous closer basic block start address */ addr_end = sdb_num_get (db, Fbb(addr), NULL); if (addr_end) { if (from >= addr && from < addr_end) { eprintf ("OVERLAPS MUST SPLIT\n"); /* reduce current basic block to from */ eprintf ("Shrink basic block 0x%08"PFMT64x" to %d\n", addr, (int)(from-addr)); sdb_num_set (db, Fbb(addr), addr + from-addr, 0); sdb_num_set (db, FbbTo(addr), from, 0); //to = addr_end; // ??? } } } if (add) { sdb_array_add_num (db, "bbs", from, 0); sdb_num_set (db, Fbb(from), to, 0); if (jump != UT64_MAX) sdb_array_set_num (db, FbbTo(from), 0, jump, 0); if (fail != UT64_MAX) sdb_array_set_num (db, FbbTo(from), 1, fail, 0); sdb_num_min (db, "min", from, 0); sdb_num_max (db, "max", to, 0); } return 0; }
SDB_API bool sdb_array_append_num(Sdb *s, const char *key, ut64 val, ut32 cas) { return sdb_array_set_num (s, key, -1, val, cas); }