static enum sym_type AsmType( TYPE type ) { type_flag mod_flags; type = TypeModFlags( type, &mod_flags ); switch( type->id ) { case TYP_POINTER : type = TypeModFlags( type->of, &mod_flags ); if( type->id == TYP_FUNCTION ) { return( CodePtrType( mod_flags ) ); } else { return( PtrType( mod_flags ) ); } break; case TYP_ARRAY : case TYP_BITFIELD : case TYP_ENUM : return( AsmType( type->of ) ); break; case TYP_CLASS : return( SYM_INT1 ); break; case TYP_FUNCTION : return( CodePtrType( mod_flags ) ); break; default: return( AsmDataType[type->id] ); break; } }
cg_type CgTypePtrSym( // COMPUTE OUTPUT TYPE OF POINTER TO SYMBOL SYMBOL sym ) // - symbol { type_flag mod_flags; // - modifier flags TYPE type; // - unmodified type cg_type codegen_type; // - code-gen type type = TypeModFlags( sym->sym_type, &mod_flags ); if( type->id == TYP_FUNCTION ) { if( mod_flags & TF1_NEAR ) { codegen_type = TY_NEAR_CODE_PTR; } else if( mod_flags & TF1_FAR ) { codegen_type = TY_LONG_CODE_PTR; } else { codegen_type = TY_CODE_PTR; } } else { if( mod_flags & TF1_NEAR ) { codegen_type = TY_NEAR_POINTER; } else if( mod_flags & TF1_FAR ) { codegen_type = TY_LONG_POINTER; } else if( mod_flags & TF1_HUGE ) { codegen_type = TY_HUGE_POINTER; } else { codegen_type = TY_POINTER; } } return codegen_type; }
fe_seg_id SegmentAddComdatData( // ADD SEGMENT FOR A COMDAT DATA SYMBOL SYMBOL sym, // - the symbol SEGID_CONTROL control ) // - segment control { unsigned attrs; // - attributes char const * name; // - segment name PC_SEGMENT* seg; // - allocated segment sym = sym; if( control & SI_ALL_ZERO ) { attrs = SGAT_DATA_COMMON_ZERO; name = TS_SEG_BSS; } else { type_flag flags; TypeModFlags( sym->sym_type, &flags ); if( flags & TF1_CONST ) { attrs = SGAT_DATA_COMMON_INIT_ROM; name = TS_SEG_DATA; } else { attrs = SGAT_DATA_COMMON_INIT; name = TS_SEG_CONST2; } } seg = segmentAlloc( name, NULL, SEG_NULL, attrs, SA_IN_DGROUP ); return seg->seg_id; }
TYPE TypePointerDiff( // GET TYPE FOR DIFFERENCE OF POINTERS TYPE type ) // - node for a type { type_flag flag; // - flags, when modifier type = TypeModFlags( type, &flag ); switch( type->id ) { case TYP_ARRAY : case TYP_POINTER : TypeModFlags( type->of, &flag ); type = *ptr_diff_type[ data_ptr_type( flag ) ]; break; case TYP_FUNCTION : type = *ptr_diff_type[ code_ptr_type( flag ) ]; break; default : type = NULL; break; } return( type ); }
static target_size_t cgPtrSize( // COMPUTE SIZE OF A POINTER TYPE type ) // - type { type_flag mod_flags; // - modifier flags unsigned size; // - size of the type type = TypeModFlags( type, &mod_flags ); switch( type->id ) { case TYP_ARRAY : case TYP_POINTER : TypeModFlags( type->of, &mod_flags ); size = data_ptr_size( mod_flags ); break; case TYP_FUNCTION : size = code_ptr_size( mod_flags ); break; default : size = 0; break; } return( size ); }
SYMBOL StaticInitSymbol( // CREATE STATIC INITIALIZATION SYMBOL SYMBOL sym ) // - symbol type { TYPE type; // - type for symbol type_flag flags; // - modifier flags type = sym->sym_type; TypeModFlags( type, &flags ); if(( flags & TF1_CONST ) == 0 ) { /* make it a constant symbol */ type = MakeModifiedType( type, TF1_CONST ); } return SymCreateTempScope( type , SC_STATIC , SF_REFERENCED , CppStaticInitName( sym ) ); }
static target_size_t cgSize( // COMPUTE SIZE OF A TYPE TYPE type, // - type bool ref_as_ptr ) // - true ==> treat reference as pointer { type_flag mod_flags; // - modifier flags target_size_t size; // - size of type type = TypeModFlags( type, &mod_flags ); switch( type->id ) { case TYP_BOOL : size = TARGET_BOOL; break; case TYP_ERROR : case TYP_UCHAR : case TYP_SCHAR : size = TARGET_CHAR; break; case TYP_WCHAR : case TYP_USHORT : case TYP_SSHORT : size = TARGET_SHORT; break; case TYP_SINT : size = TARGET_INT; break; case TYP_UINT : size = TARGET_UINT; break; case TYP_ULONG : size = TARGET_ULONG; break; case TYP_SLONG : size = TARGET_LONG; break; case TYP_ULONG64 : size = TARGET_ULONG64; break; case TYP_SLONG64 : size = TARGET_LONG64; break; case TYP_FLOAT : size = TARGET_FLOAT; break; case TYP_DOUBLE : size = TARGET_DOUBLE; break; case TYP_LONG_DOUBLE : size = TARGET_LONG_DOUBLE; break; case TYP_POINTER : if( ( ! ref_as_ptr ) && ( type->flag & TF1_REFERENCE ) ) { size = cgSize( type->of, false ); } else { type = TypeModFlags( type->of, &mod_flags ); if( type->id == TYP_FUNCTION ) { size = code_ptr_size( mod_flags ); } else { size = data_ptr_size( mod_flags ); } } break; case TYP_BITFIELD : size = cgSize( type->of, true ); break; case TYP_ARRAY : size = type->u.a.array_size; if( type->flag & TF1_ZERO_SIZE ) { DbgAssert( type->u.a.array_size == 1 ); size = 0; } else { size *= cgSize( type->of, false ); } break; case TYP_CLASS : if( TypeDefined( type ) ) { size = type->u.c.info->size; } else { size = 0; } break; case TYP_FUNCTION : size = code_ptr_size( mod_flags ); break; case TYP_MEMBER_POINTER : size = CgCodePtrSize() + 2 * TARGET_UINT; break; default : size = 0; break; } return( size ); }
cg_type CgTypeOutput( // COMPUTE TYPE FOR CODE GENERATOR TYPE type ) // - C++ type { cg_type retn; // - return type (code generator) type_flag mod_flags; // - modifier flags type = TypeModFlags( type, &mod_flags ); switch( type->id ) { case TYP_SCHAR : retn = TY_INT_1; break; case TYP_BOOL : retn = TY_BOOL; break; case TYP_UCHAR : retn = TY_UINT_1; break; case TYP_UINT : retn = TY_UNSIGNED; break; case TYP_USHORT : case TYP_WCHAR : retn = TY_UINT_2; break; case TYP_SINT : retn = TY_INTEGER; break; case TYP_SSHORT : retn = TY_INT_2; break; case TYP_ULONG : retn = TY_UINT_4; break; case TYP_SLONG : retn = TY_INT_4; break; case TYP_ULONG64 : retn = TY_UINT_8; break; case TYP_SLONG64 : retn = TY_INT_8; break; case TYP_FLOAT : retn = TY_SINGLE; break; case TYP_LONG_DOUBLE : retn = TY_DOUBLE; // change later when long-double support break; case TYP_DOUBLE : retn = TY_DOUBLE; break; case TYP_POINTER : type = TypeModFlags( type->of, &mod_flags ); if( type->id == TYP_FUNCTION ) { retn = ptr_cg_type[ code_ptr_type( mod_flags ) ]; } else { retn = ptr_dg_type[ data_ptr_type( mod_flags ) ]; } break; case TYP_ARRAY : retn = cg_defined_type( type, &type->u.a.refno ); break; case TYP_CLASS : retn = cg_defined_type( type, &type->u.c.info->refno ); break; case TYP_FUNCTION : retn = ptr_cg_type[ code_ptr_type( mod_flags ) ]; break; case TYP_MEMBER_POINTER : retn = cg_defined_type( type, &cg_member_ptr ); break; default: retn = TY_INTEGER; break; } return( retn ); }