bool replace_symbolt::replace(typet &dest) { if(dest.has_subtype()) replace(dest.subtype()); Forall_subtypes(it, dest) replace(*it); if(dest.id()=="struct" || dest.id()=="union") { struct_typet &struct_type = to_struct_type(dest); struct_typet::componentst &components = struct_type.components(); for (struct_typet::componentst::iterator it = components.begin(); it!=components.end(); it++) replace(*it); } else if(dest.is_code()) { code_typet &code_type=to_code_type(dest); code_typet::argumentst &arguments=code_type.arguments(); for (code_typet::argumentst::iterator it = arguments.begin(); it!=arguments.end(); it++) replace(*it); } if(dest.id()=="symbol") { type_mapt::const_iterator it= type_map.find(dest.identifier()); if(it!=type_map.end()) { dest=it->second; return false; } } return true; }
void ansi_c_convert_typet::read_rec(const typet &type) { if(type.id()==ID_merged_type) { forall_subtypes(it, type) read_rec(*it); } else if(type.id()==ID_signed) signed_cnt++; else if(type.id()==ID_unsigned) unsigned_cnt++; else if(type.id()==ID_ptr32) c_qualifiers.is_ptr32=true; else if(type.id()==ID_ptr64) c_qualifiers.is_ptr64=true; else if(type.id()==ID_volatile) c_qualifiers.is_volatile=true; else if(type.id()==ID_asm) { if(type.has_subtype() && type.subtype().id()==ID_string_constant) c_storage_spec.asm_label=type.subtype().get(ID_value); } else if(type.id()==ID_section && type.has_subtype() && type.subtype().id()==ID_string_constant) { c_storage_spec.section=type.subtype().get(ID_value); } else if(type.id()==ID_const) c_qualifiers.is_constant=true; else if(type.id()==ID_restrict) c_qualifiers.is_restricted=true; else if(type.id()==ID_atomic) c_qualifiers.is_atomic=true; else if(type.id()==ID_atomic_type_specifier) { // this gets turned into the qualifier, uh c_qualifiers.is_atomic=true; read_rec(type.subtype()); } else if(type.id()==ID_char) char_cnt++; else if(type.id()==ID_int) int_cnt++; else if(type.id()==ID_int8) int8_cnt++; else if(type.id()==ID_int16) int16_cnt++; else if(type.id()==ID_int32) int32_cnt++; else if(type.id()==ID_int64) int64_cnt++; else if(type.id()==ID_gcc_float128) gcc_float128_cnt++; else if(type.id()==ID_gcc_int128) gcc_int128_cnt++; else if(type.id()==ID_gcc_attribute_mode) { gcc_attribute_mode=type; } else if(type.id()==ID_msc_based) { const exprt &as_expr= static_cast<const exprt &>(static_cast<const irept &>(type)); assert(as_expr.operands().size()==1); msc_based=as_expr.op0(); } else if(type.id()==ID_custom_bv) { bv_cnt++; const exprt &size_expr= static_cast<const exprt &>(type.find(ID_size)); bv_width=size_expr; } else if(type.id()==ID_custom_floatbv) { floatbv_cnt++; const exprt &size_expr= static_cast<const exprt &>(type.find(ID_size)); const exprt &fsize_expr= static_cast<const exprt &>(type.find(ID_f)); bv_width=size_expr; fraction_width=fsize_expr; } else if(type.id()==ID_custom_fixedbv) { fixedbv_cnt++; const exprt &size_expr= static_cast<const exprt &>(type.find(ID_size)); const exprt &fsize_expr= static_cast<const exprt &>(type.find(ID_f)); bv_width=size_expr; fraction_width=fsize_expr; } else if(type.id()==ID_short) short_cnt++; else if(type.id()==ID_long) long_cnt++; else if(type.id()==ID_double) double_cnt++; else if(type.id()==ID_float) float_cnt++; else if(type.id()==ID_c_bool) c_bool_cnt++; else if(type.id()==ID_proper_bool) proper_bool_cnt++; else if(type.id()==ID_complex) complex_cnt++; else if(type.id()==ID_static) c_storage_spec.is_static=true; else if(type.id()==ID_thread_local) c_storage_spec.is_thread_local=true; else if(type.id()==ID_inline) c_storage_spec.is_inline=true; else if(type.id()==ID_extern) c_storage_spec.is_extern=true; else if(type.id()==ID_typedef) c_storage_spec.is_typedef=true; else if(type.id()==ID_register) c_storage_spec.is_register=true; else if(type.id()==ID_weak) c_storage_spec.is_weak=true; else if(type.id()==ID_auto) { // ignore } else if(type.id()==ID_packed) packed=true; else if(type.id()==ID_aligned) { aligned=true; // may come with size or not if(type.find(ID_size).is_nil()) alignment=exprt(ID_default); else alignment=static_cast<const exprt &>(type.find(ID_size)); } else if(type.id()==ID_transparent_union) { c_qualifiers.is_transparent_union=true; } else if(type.id()==ID_vector) vector_size=to_vector_type(type).size(); else if(type.id()==ID_void) { // we store 'void' as 'empty' typet tmp=type; tmp.id(ID_empty); other.push_back(tmp); } else if(type.id()==ID_msc_declspec) { const exprt &as_expr= static_cast<const exprt &>(static_cast<const irept &>(type)); forall_operands(it, as_expr) { // these are symbols const irep_idt &id=it->get(ID_identifier); if(id==ID_thread) c_storage_spec.is_thread_local=true; else if(id=="align") { assert(it->operands().size()==1); aligned=true; alignment=it->op0(); } } } else if(type.id()==ID_noreturn)
std::string type2name(const typet &type) { std::string result; // qualifiers first if(type.get_bool(ID_C_constant)) result+="c"; if(type.get_bool(ID_C_restricted)) result+="r"; if(type.get_bool(ID_C_volatile)) result+="v"; if(type.id()==irep_idt()) throw "Empty type encountered."; else if(type.id()==ID_empty) result+="V"; else if(type.id()==ID_signedbv) result+="S" + type.get_string(ID_width); else if(type.id()==ID_unsignedbv) result+="U" + type.get_string(ID_width); else if(type.id()==ID_bool) result+="B"; else if(type.id()==ID_integer) result+="I"; else if(type.id()==ID_real) result+="R"; else if(type.id()==ID_complex) result+="C"; else if(type.id()==ID_floatbv) result+="F" + type.get_string(ID_width); else if(type.id()==ID_fixedbv) result+="X" + type.get_string(ID_width); else if(type.id()==ID_natural) result+="N"; else if(type.id()==ID_pointer) result+="*"; else if(type.id()==ID_reference) result+="&"; else if(type.id()==ID_code) { const code_typet &t=to_code_type(type); const code_typet::argumentst arguments=t.arguments(); result+="P("; for(code_typet::argumentst::const_iterator it=arguments.begin(); it!=arguments.end(); it++) { result+=type2name(it->type()); result+="'" + id2string(it->get_identifier()) + "'|"; } result.resize(result.size()-1); result+=")"; } else if(type.id()==ID_array) { const array_typet &t=to_array_type(type); if(t.size().is_nil()) result+="ARR?"; else result+="ARR"+t.size().get_string(ID_value); } else if(type.id()==ID_symbol) { result+="SYM#"+type.get_string(ID_identifier)+"#"; } else if(type.id()==ID_struct || type.id()==ID_union) { if(type.id()==ID_struct) result+="ST"; if(type.id()==ID_union) result+="UN"; const struct_union_typet &t=to_struct_union_type(type); const struct_union_typet::componentst &components = t.components(); result+="["; for(struct_union_typet::componentst::const_iterator it=components.begin(); it!=components.end(); it++) { if(it!=components.begin()) result+="|"; result+=type2name(it->type()); result+="'"+it->get_string(ID_name)+"'|"; } result+="]"; } else if(type.id()==ID_incomplete_struct) result +="ST?"; else if(type.id()==ID_incomplete_union) result +="UN?"; else if(type.id()==ID_c_enum) result +="EN"+type.get_string(ID_width); else if(type.id()==ID_incomplete_c_enum) result +="EN?"; else if(type.id()==ID_c_bitfield) result+="BF"+type.get_string(ID_size); else if(type.id()==ID_vector) result+="VEC"+type.get_string(ID_size); else throw (std::string("Unknown type '") + type.id_string() + "' encountered."); if(type.has_subtype()) { result+="{"; result+=type2name(type.subtype()); result+="}"; } if(type.has_subtypes()) { result+="$"; forall_subtypes(it, type) { result+=type2name(*it); result+="|"; }