Esempio n. 1
0
static def_t *
get_value_def (ex_value_t *value, etype_t type)
{
	def_t      *def;

	if (type == ev_short) {
		def = new_def (0, &type_short, 0, sc_extern);
		def->offset = value->v.short_val;
		return def;
	}
	def = emit_value (value, 0);
	if (type != def->type->type)
		return alias_def (def, ev_types[type], 0);
	return def;
}
 br_status reduce_app(func_decl * f, unsigned num, expr * const * args, expr_ref & result, proof_ref & result_pr) {
     if (!m.is_term_ite(f))
         return BR_FAILED;
     expr_ref new_ite(m);
     new_ite = m.mk_app(f, num, args);
     
     expr_ref new_def(m);
     proof_ref new_def_pr(m);
     app_ref _result(m);
     if (m_defined_names.mk_name(new_ite, new_def, new_def_pr, _result, result_pr)) {
         m_set->assert_expr(new_def, new_def_pr);
         m_num_fresh++;
         if (m_produce_models) {
             if (!m_mc)
                 m_mc = alloc(filter_model_converter, m);
             m_mc->insert(_result->get_decl());
         }
     }
     result = _result.get();
     return BR_DONE;
 }
Esempio n. 3
0
symbol_t *
make_symbol (const char *name, type_t *type, defspace_t *space,
			 storage_class_t storage)
{
	symbol_t   *sym;
	struct reloc_s *relocs = 0;

	if (storage != sc_extern && storage != sc_global && storage != sc_static)
		internal_error (0, "invalid storage class for %s", __FUNCTION__);
	if (storage != sc_extern && !space)
		internal_error (0, "null space for non-external storage");
	sym = symtab_lookup (pr.symtab, name);
	if (!sym) {
		sym = new_symbol_type (name, type);
	}
	if (sym->type != type) {
		if (is_array (sym->type) && is_array (type)
			&& !sym->type->t.array.size) {
			sym->type = type;
		} else {
			error (0, "%s redefined", name);
			sym = new_symbol_type (name, type);
		}
	}
	if (sym->s.def && sym->s.def->external && storage != sc_extern) {
		//FIXME this really is not the right way
		relocs = sym->s.def->relocs;
		free_def (sym->s.def);
		sym->s.def = 0;
	}
	if (!sym->s.def) {
		sym->s.def = new_def (name, type, space, storage);
		reloc_attach_relocs (relocs, &sym->s.def->relocs);
	}
	return sym;
}