void CgFrontFuncInitFlags( // GENERATE INIT FLAGS FOR FUNCTION SYMBOL var ) // - NULL OR FLAGS VARIABLE { if( var != NULL ) { ins_init_beg.value.pvalue = var; ins_init_done.value.pvalue = var; CgSegIdData( var, SI_ALL_ZERO ); cgWriteIC( codeCGFILE, &ins_init_beg ); emitDataCGFILE = &codeCGFILE; DgSymbol( var ); cgWriteIC( codeCGFILE, &ins_init_done ); emitDataCGFILE = &dataCGFILE; } }
static fe_seg_id cgSegIdBased( SYMBOL sym, type_flag flags ) { fe_seg_id id; // - segment id target_offset_t align; // - alignment for symbol target_size_t size; // - size of symbol TYPE base_mod; // - __based modifier size = CgMemorySize( sym->sym_type ); #ifdef _CHECK_SIZE // only defined if needed if( !(flags & TF1_HUGE) ) { if( _CHECK_SIZE( size ) ) { CErr2p( ERR_DATA_TOO_BIG, sym ); return( SEG_NULL ); } } #endif if( SymIsExtern( sym ) ) { // not defined in this compilation unit id = SegmentImport(); } else { switch( flags & TF1_BASED ) { case TF1_BASED_STRING: id = SegmentFindBased( sym->sym_type ); break; case TF1_BASED_SELF: case TF1_BASED_VOID: id = SEG_NULL; break; case TF1_BASED_FETCH: case TF1_BASED_ADD: base_mod = BasedType( sym->sym_type ); id = CgSegIdData( (SYMBOL)base_mod->u.m.base, SI_DEFAULT ); break; DbgDefault( "invalid based cgsegid call" ); } if( id != SEG_NULL ) { align = cgSegIdAlign( sym, flags ); id = SegmentAddSym( sym, id, size, align ); } } return( id ); }
static SYMBOL makeTemporary( // ALLOCATE A TEMPORARY TYPE type, // - type of temporary boolean storage ) // - allocate storage if needed { SYMBOL sym; // - symbol for temporary char *name; // - name for temporary symbol_class id; // - class for symbol #if 0 if( ( type->id == TYP_POINTER ) && ( type->flag & TF1_REFERENCE ) ) { type = type->of; } #endif sym = SymMakeDummy( type, &name ); switch( tempClass ) { case TEMP_TYPE_EXPR : case TEMP_TYPE_BLOCK : id = SC_AUTO; break; case TEMP_TYPE_STATIC : id = SC_STATIC; break; DbgDefault( "makeTemporary -- bad tempClass" ); } sym->id = id; if( id == SC_STATIC ) { ScopeInsert( GetFileScope(), sym, name ); if( storage ) { CgSegIdData( sym, SI_ALL_ZERO ); DgSymbol( sym ); } } else { ScopeInsert( ScopeForTemps(), sym, name ); } return sym; }
fe_seg_id CgSegId( SYMBOL sym ) /*****************************/ { return( CgSegIdData( sym, SI_DEFAULT ) ); }