fe_seg_id SegmentFindBased( // FIND SEGMENT ID FOR TF1_BASED_STRING TYPE expr_type ) // - type being based { TYPE base_mod; // - __based modifier STRING_CONSTANT string; // - constant for segment name char *segname; // - segment name base_mod = BasedType( expr_type ); string = base_mod->u.m.base; segname = string->string; return SegmentFindNamed( segname ); }
boolean SegmentIfBasedOK( SYMBOL func ) { fe_seg_id segid; segid = func->segid; if( segid == SEG_NULL ) { if( NULL != BasedType( func->sym_type ) ) { segid = SegmentFindBased( func->sym_type ); return( segmentIsCode( segid ) ); } } return( TRUE ); }
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 ); }
fe_seg_id SegmentForDefinedFunc(// GET SEGMENT FOR A DEFINED FUNCTION SYMBOL func ) // - function { fe_seg_id segid; segid = func->segid; if( segid == SEG_NULL ) { if( NULL != BasedType( func->sym_type ) ) { segid = SegmentFindBased( func->sym_type ); } else if( CompFlags.zm_switch_used ) { #if _INTEL_CPU if( SymIsGennedComdatFun( func ) ) { segid = seg_code_comdat; if( SEG_NULL == segid ) { segid = nextZmSegment(); seg_code_comdat = segid; } } else { segid = nextZmSegment(); } #elif _CPU == _AXP || COMP_CFG_COFF == 1 segid = nextZmSegment(); if( SymIsGennedComdatFun( func ) ) { segid = markSegmentComdat( segid ); } #else #error Bad Machine Type #endif #if _CPU == _AXP || COMP_CFG_COFF == 1 } else if( SymIsGennedComdatFun( func ) ) { segid = nextZmSegment(); segid = markSegmentComdat( segid ); #endif } else { segid = code_def_seg.pcseg->seg_id; SegmentMarkUsed( segid ); code_def_seg.ds_used = TRUE; } } return segid; }