static void check_section_sym_xref (lang_input_statement_type *statement) { bfd *abfd; asection *sec; abfd = statement->the_bfd; if (abfd == NULL) return; for (sec = abfd->sections; sec != NULL; sec = sec->next) { asection *outsec; outsec = sec->output_section; if (outsec != NULL) { const char *outsecname; struct lang_nocrossrefs *ncrs; struct lang_nocrossref *ncr; outsecname = outsec->name; for (ncrs = nocrossref_list; ncrs != NULL; ncrs = ncrs->next) for (ncr = ncrs->list; ncr != NULL; ncr = ncr->next) if (strcmp (ncr->name, outsecname) == 0) check_refs (NULL, sec, abfd, ncrs); } } }
ref_t shadow_new_variable(shadow_mgr mgr) { ref_t r = REF_INVALID; DdNode *n = NULL; if (mgr->do_cudd) { n = Cudd_bddNewVar(mgr->bdd_manager); reference_dd(mgr, n); } if (mgr->do_local) { r = ref_new_variable(mgr->ref_mgr); } if (mgr->do_dist) { ref_t rdist = dist_var(mgr->ref_mgr); if (mgr->do_local) { if (!check_refs(mgr, r, rdist)) return REF_INVALID; } else r = rdist; } if (!mgr->do_cudd) n = ref2dd(mgr, r); if (!do_ref(mgr)) r = dd2ref(n, IS_BDD); add_ref(mgr, r, n); mgr->nvars++; return r; }
static void check_local_sym_xref (lang_input_statement_type *statement) { bfd *abfd; lang_input_statement_type *li; asymbol **asymbols, **syms; abfd = statement->the_bfd; if (abfd == NULL) return; li = abfd->usrdata; if (li != NULL && li->asymbols != NULL) asymbols = li->asymbols; else { long symsize; long symbol_count; symsize = bfd_get_symtab_upper_bound (abfd); if (symsize < 0) einfo (_("%B%F: could not read symbols; %E\n"), abfd); asymbols = xmalloc (symsize); symbol_count = bfd_canonicalize_symtab (abfd, asymbols); if (symbol_count < 0) einfo (_("%B%F: could not read symbols: %E\n"), abfd); if (li != NULL) { li->asymbols = asymbols; li->symbol_count = symbol_count; } } for (syms = asymbols; *syms; ++syms) { asymbol *sym = *syms; if (sym->flags & (BSF_GLOBAL | BSF_WARNING | BSF_INDIRECT | BSF_FILE)) continue; if ((sym->flags & (BSF_LOCAL | BSF_SECTION_SYM)) != 0 && sym->section->output_section != NULL) { const char *outsecname, *symname; struct lang_nocrossrefs *ncrs; struct lang_nocrossref *ncr; outsecname = sym->section->output_section->name; symname = NULL; if ((sym->flags & BSF_SECTION_SYM) == 0) symname = sym->name; for (ncrs = nocrossref_list; ncrs != NULL; ncrs = ncrs->next) for (ncr = ncrs->list; ncr != NULL; ncr = ncr->next) if (strcmp (ncr->name, outsecname) == 0) check_refs (symname, FALSE, sym->section, abfd, ncrs); } } if (li == NULL) free (asymbols); }
void save_data() { uint8_t *p = START_EEPROM; p = save_id(p); p = save_role(p); p = save_neighs(p); p = save_seeders(p); if(get_role() == SEEDER) p = save_refs(p); uint8_t *cp = START_EEPROM; cp = check_id(cp); cp = check_role(cp); cp = check_neighs(cp); cp = check_seeders(cp); if(get_role() == SEEDER) cp = check_refs(cp); }
enum ref_ecode check_tx_refs(struct state *state, const struct block *block, const union protocol_tx *tx, const struct protocol_input_ref *refs, unsigned int *bad_ref, struct block **block_referred_to) { unsigned int i, num = num_inputs(tx); bool all_known = true; assert(check_refs(state, block, refs, num) == PROTOCOL_ECODE_NONE); for (i = 0; i < num; i++) { struct block *b; struct protocol_txrefhash scratch; const struct protocol_txrefhash *txp; b = block_ancestor(block, le32_to_cpu(refs[i].blocks_ago)); txp = txrefhash_in_shard(b->shard[le16_to_cpu(refs[i].shard)], refs[i].txoff, &scratch); if (!txp) { *bad_ref = i; *block_referred_to = b; all_known = false; /* Keep looking in case there are worse issues. */ continue; } if (!structeq(&txp->txhash, &tx_input(tx, i)->input)) { *bad_ref = i; *block_referred_to = b; return ECODE_REF_BAD_HASH; } } if (!all_known) return ECODE_REF_UNKNOWN; return ECODE_REF_OK; }
ref_t shadow_ite(shadow_mgr mgr, ref_t iref, ref_t tref, ref_t eref) { DdNode *in = get_ddnode(mgr, iref); DdNode *tn = get_ddnode(mgr, tref); DdNode *en = get_ddnode(mgr, eref); DdNode *n = NULL; ref_t r = REF_INVALID; dd_type_t dtype = IS_BDD; if (mgr->do_local) { r = ref_ite(mgr->ref_mgr, iref, tref, eref); } if (mgr->do_dist) { ref_t rdist = dist_ite(mgr->ref_mgr, iref, tref, eref); if (mgr->do_local) { if (!check_refs(mgr, r, rdist)) { return REF_INVALID; } } else { r = rdist; } } if (mgr->do_cudd) { if (mgr->nzvars > 0) { bool zi = is_zdd(mgr, iref); bool zt = is_zdd(mgr, tref); bool ze = is_zdd(mgr, eref); if (zi || zt || ze) { dtype = IS_ZDD; if (is_add(mgr, iref) || is_add(mgr, tref) || is_add(mgr, eref)) { err(false, "Can't mix ADDs with ZDDs"); } if (!zi) { in = zconvert(mgr, in); } if (!zt) { tn = zconvert(mgr, tn); } if (!ze) { en = zconvert(mgr, en); } n = Cudd_zddIte(mgr->bdd_manager, in, tn, en); reference_dd(mgr, n); if (!zi) unreference_dd(mgr, in, IS_ZDD); if (!zt) unreference_dd(mgr, tn, IS_ZDD); if (!ze) unreference_dd(mgr, en, IS_ZDD); } } { bool ai = is_add(mgr, iref); bool at = is_add(mgr, tref); bool ae = is_add(mgr, eref); if (ai || at || ae) { dtype = IS_ADD; if (!ai) { in = aconvert(mgr, in); } if (!at) { tn = aconvert(mgr, tn); } if (!ae) { en = aconvert(mgr, en); } n = Cudd_addIte(mgr->bdd_manager, in, tn, en); reference_dd(mgr, n); if (!ai) unreference_dd(mgr, in, IS_ADD); if (!at) unreference_dd(mgr, tn, IS_ADD); if (!ae) unreference_dd(mgr, en, IS_ADD); } } if (dtype == IS_BDD) { n = Cudd_bddIte(mgr->bdd_manager, in, tn, en); reference_dd(mgr, n); } } else { n = ref2dd(mgr, r); } if (!do_ref(mgr)) r = dd2ref(n, dtype); add_ref(mgr, r, n); return r; }