void ansi_c_convert_typet::write(typet &type) { type.clear(); // first, do "other" if(!other.empty()) { if( double_cnt || float_cnt || signed_cnt || unsigned_cnt || int_cnt || bool_cnt || short_cnt || char_cnt || int8_cnt || int16_cnt || int32_cnt || int64_cnt || ptr32_cnt || ptr64_cnt || long_cnt) { err_location(location); error("illegal type modifier for defined type"); throw 0; } if(other.size() != 1) { err_location(location); error("illegal combination of defined types"); throw 0; } type.swap(other.front()); } else if(double_cnt || float_cnt) { if( signed_cnt || unsigned_cnt || int_cnt || bool_cnt || int8_cnt || int16_cnt || int32_cnt || int64_cnt || ptr32_cnt || ptr64_cnt || short_cnt || char_cnt) { err_location(location); error("cannot conbine integer type with float"); throw 0; } if(double_cnt && float_cnt) { err_location(location); error("conflicting type modifiers"); throw 0; } if(long_cnt == 0) { if(double_cnt != 0) type = double_type(); else type = float_type(); } else if(long_cnt == 1 || long_cnt == 2) { if(double_cnt != 0) type = long_double_type(); else { err_location(location); error("conflicting type modifiers"); throw 0; } } else { err_location(location); error("illegal type modifier for float"); throw 0; } } else if(bool_cnt) { if( signed_cnt || unsigned_cnt || int_cnt || short_cnt || int8_cnt || int16_cnt || int32_cnt || int64_cnt || ptr32_cnt || ptr64_cnt || char_cnt || long_cnt) { err_location(location); error("illegal type modifier for boolean type"); throw 0; } type.id("bool"); } else if(ptr32_cnt || ptr64_cnt) { type.id("pointer"); type.subtype() = typet("empty"); } else { // it is integer -- signed or unsigned? if(signed_cnt && unsigned_cnt) { err_location(location); error("conflicting type modifiers"); throw 0; } if(unsigned_cnt) type.id("unsignedbv"); else if(signed_cnt) type.id("signedbv"); else { if(char_cnt) type.id(config.ansi_c.char_is_unsigned ? "unsignedbv" : "signedbv"); else type.id("signedbv"); } // get width unsigned width; if(int8_cnt || int16_cnt || int32_cnt || int64_cnt) { if(long_cnt || char_cnt || short_cnt) { err_location(location); error("conflicting type modifiers"); throw 0; } if(int8_cnt) width = 1 * 8; else if(int16_cnt) width = 2 * 8; else if(int32_cnt) width = 4 * 8; else if(int64_cnt) width = 8 * 8; else abort(); } else if(short_cnt) { if(long_cnt || char_cnt) { err_location(location); error("conflicting type modifiers"); throw 0; } width = config.ansi_c.short_int_width; } else if(char_cnt) { if(long_cnt) { err_location(location); error("illegal type modifier for char type"); throw 0; } width = config.ansi_c.char_width; } else if(long_cnt == 0) { width = config.ansi_c.int_width; } else if(long_cnt == 1) { width = config.ansi_c.long_int_width; } else if(long_cnt == 2) { width = config.ansi_c.long_long_int_width; } else { err_location(location); error("illegal type modifier for integer type"); throw 0; } type.width(width); } c_qualifiers.write(type); }
void ansi_c_convert_typet::write(typet &type) { type.clear(); // first, do "other" if(!other.empty()) { if(double_cnt || float_cnt || signed_cnt || unsigned_cnt || int_cnt || c_bool_cnt || proper_bool_cnt || short_cnt || char_cnt || complex_cnt || long_cnt || int8_cnt || int16_cnt || int32_cnt || int64_cnt || gcc_float128_cnt || gcc_int128_cnt || bv_cnt) { err_location(location); error("illegal type modifier for defined type"); throw 0; } if(other.size()!=1) { err_location(location); error("illegal combination of defined types"); throw 0; } type.swap(other.front()); } else if(gcc_float128_cnt) { if(signed_cnt || unsigned_cnt || int_cnt || c_bool_cnt || proper_bool_cnt || int8_cnt || int16_cnt || int32_cnt || int64_cnt || gcc_int128_cnt || bv_cnt || short_cnt || char_cnt) { err_location(location); error("cannot combine integer type with float"); throw 0; } if(long_cnt || double_cnt || float_cnt) { err_location(location); error("conflicting type modifiers"); throw 0; } type=long_double_type(); } else if(double_cnt || float_cnt) { if(signed_cnt || unsigned_cnt || int_cnt || c_bool_cnt || proper_bool_cnt || int8_cnt || int16_cnt || int32_cnt || int64_cnt || gcc_int128_cnt|| bv_cnt || short_cnt || char_cnt) { err_location(location); error("cannot combine integer type with float"); throw 0; } if(double_cnt && float_cnt) { err_location(location); error("conflicting type modifiers"); throw 0; } if(long_cnt==0) { if(double_cnt!=0) type=double_type(); else type=float_type(); } else if(long_cnt==1 || long_cnt==2) { if(double_cnt!=0) type=long_double_type(); else { err_location(location); error("conflicting type modifiers"); throw 0; } } else { err_location(location); error("illegal type modifier for float"); throw 0; } } else if(c_bool_cnt) { if(signed_cnt || unsigned_cnt || int_cnt || short_cnt || int8_cnt || int16_cnt || int32_cnt || int64_cnt || gcc_float128_cnt || bv_cnt || proper_bool_cnt || char_cnt || long_cnt) { err_location(location); error("illegal type modifier for C boolean type"); throw 0; } type.id(ID_unsignedbv); type.set(ID_width, config.ansi_c.bool_width); type.set(ID_C_c_type, ID_bool); } else if(proper_bool_cnt) { if(signed_cnt || unsigned_cnt || int_cnt || short_cnt || int8_cnt || int16_cnt || int32_cnt || int64_cnt || gcc_float128_cnt || bv_cnt || char_cnt || long_cnt) { err_location(location); error("illegal type modifier for proper boolean type"); throw 0; } type.id(ID_bool); } else if(complex_cnt && !char_cnt && !signed_cnt && !unsigned_cnt && !short_cnt && !gcc_int128_cnt) { // the "default" for complex is double type=double_type(); } else { // it is integer -- signed or unsigned? if(signed_cnt && unsigned_cnt) { err_location(location); error("conflicting type modifiers"); throw 0; } else if(unsigned_cnt) type.id(ID_unsignedbv); else if(signed_cnt) type.id(ID_signedbv); else { if(char_cnt) type.id(config.ansi_c.char_is_unsigned?ID_unsignedbv:ID_signedbv); else type.id(ID_signedbv); } // get width unsigned width; if(gcc_mode_QI || gcc_mode_HI || gcc_mode_SI || gcc_mode_DI) { if(gcc_mode_QI) width=1*8; else if(gcc_mode_HI) width=2*8; else if(gcc_mode_SI) width=4*8; else if(gcc_mode_DI) width=8*8; else assert(false); } else if(int8_cnt || int16_cnt || int32_cnt || int64_cnt || gcc_int128_cnt || bv_cnt) { if(long_cnt || char_cnt || short_cnt) { err_location(location); error("conflicting type modifiers"); throw 0; } if(int8_cnt) width=1*8; else if(int16_cnt) width=2*8; else if(int32_cnt) width=4*8; else if(int64_cnt) width=8*8; else if(bv_cnt) width=bv_width; else if(gcc_int128_cnt) width=128; else assert(false); } else if(short_cnt) { if(long_cnt || char_cnt) { err_location(location); error("conflicting type modifiers"); throw 0; } width=config.ansi_c.short_int_width; } else if(char_cnt) { if(long_cnt) { err_location(location); error("illegal type modifier for char type"); throw 0; } width=config.ansi_c.char_width; } else if(long_cnt==0) { width=config.ansi_c.int_width; } else if(long_cnt==1) { width=config.ansi_c.long_int_width; } else if(long_cnt==2) { width=config.ansi_c.long_long_int_width; } else { err_location(location); error("illegal type modifier for integer type"); throw 0; } type.set(ID_width, width); } if(vector_size.is_not_nil()) { vector_typet new_type; new_type.size()=vector_size; new_type.location()=vector_size.location(); new_type.subtype().swap(type); type=new_type; } if(complex_cnt) { // These take more or less arbitrary subtypes. complex_typet new_type; new_type.location()=location; new_type.subtype()=type; type.swap(new_type); } c_qualifiers.write(type); if(packed) type.set(ID_C_packed, true); if(aligned) type.set(ID_C_alignment, alignment); }