fe_seg_id CgSegIdFunction( SYMBOL sym ) /*************************************/ { fe_seg_id id; type_flag flags; id = sym->segid; if( id == SEG_NULL ) { if( SymIsInitialized( sym ) ) { // defined in this compilation unit id = SegmentForDefinedFunc( sym ); } else { TypeGetActualFlags( sym->sym_type, &flags ); if( flags & TF1_FAR ) { id = SegmentImport(); } else if( IsBigCode() ) { id = SegmentImport(); } else { id = SegmentDefaultCode(); } } sym->segid = id; } return( id ); }
fe_seg_id SegmentAddSym( // SEGMENT: ADD SYMBOL TO SPECIFIED SEGMENT SYMBOL sym, // - sym to add fe_seg_id id, // - id of segment to use target_size_t size, // - size of sym target_offset_t align ) // - alignment for sym { PC_SEGMENT *curr; // - new segment target_size_t aligned_offset; target_size_t calc_offset; target_size_t total_size; if( id == SEG_DATA || ( id == SEG_BSS && flags.use_def_seg ) ) { curr = data_def_seg.pcseg; id = curr->seg_id; } else if( id == SEG_CODE ) { curr = code_def_seg.pcseg; id = curr->seg_id; } else { curr = segIdLookup( id ); } if( curr == NULL ) { CFatal( "segment: cannot find default segment" ); } else { accumAlignment( curr, align ); if( ( ! SymIsInitialized( sym ) ) && SymIsExtern( sym ) ) { id = curr->seg_id; _markUsed( curr, TRUE ); curr->has_data = TRUE; data_def_seg.ds_used = TRUE; } else { aligned_offset = SegmentAdjust( curr->seg_id, curr->offset, align ); calc_offset = curr->offset + aligned_offset + size; _CHECK_ADJUST( calc_offset, calc_offset, curr->offset ); if( calc_offset == 0 ) { if( size != 0 ) { CErr( ERR_MAX_SEGMENT_EXCEEDED, curr->name, sym ); } id = SEG_NULL; } else if( curr->dgroup ) { total_size = dgroup_size + size + aligned_offset; _CHECK_ADJUST( calc_offset, total_size, dgroup_size ); if( calc_offset == 0 ) { if( size != 0 ) { CErr( ERR_MAX_DGROUP_EXCEEDED, sym, curr->name ); } id = SEG_NULL; } else { dgroup_size += size + aligned_offset; curr->offset = calc_offset; _markUsed( curr, TRUE ); curr->has_data = TRUE; id = curr->seg_id; data_def_seg.ds_used = TRUE; } } else { curr->offset = calc_offset; _markUsed( curr, TRUE ); curr->has_data = TRUE; id = curr->seg_id; data_def_seg.ds_used = TRUE; } } } return id; }
// Scope has dtor_reqd set off initially. // Turn it on if symbol requiring temp is found // void CgDeclSym( // PROCESS SYMBOL IN BLOCK-OPEN SCOPE SYMBOL sym ) // - current symbol { FN_CTL* fctl; // - function information SYMBOL orig; // - original symbol orig = sym; sym = inlineSymbol( sym ); fctl = FnCtlTop(); if( CgRetnOptIsOptVar( fctl, orig ) ) { sym->flag |= SF_RETN_OPT; return; } switch( sym->id ) { case SC_AUTO: case SC_REGISTER: if( SymIsCatchAlias( sym ) ) { if( fctl->debug_info && ( GenSwitches & DBG_LOCALS ) ) { SYMBOL base = SymDeAlias( sym ); switch( base->id ) { case SC_AUTO: case SC_REGISTER: if( ! SymIsAnonymous( sym ) ) { if( !SymIsTemporary( sym ) ) { if( GenSwitches & DBG_DF ){ DwarfSymDebugGenSymbol( sym, true, false ); }else{ SymbolicDebugGenSymbol( sym, true, false ); } } } break; } } } else { if( ! SymIsAnonymous( sym ) ) { if( SymIsTemporary( sym ) ) { if( SymIsReferenced( sym ) || SymIsInitialized( sym ) ) { declareAuto( sym ); } } else { declareAuto( sym ); if( fctl->debug_info && ( GenSwitches & DBG_LOCALS ) ) { if( GenSwitches & DBG_DF ){ DwarfDebugGenSymbol( sym, true ); }else{ SymbolicDebugGenSymbol( sym, true, false ); } } } } } break; case SC_STATIC: if( fctl->debug_info && ( GenSwitches & DBG_LOCALS ) ) { if( ! SymIsAnonymous( sym ) ) { if( SymIsReferenced( sym ) || SymIsInitialized( sym ) ) { if( ! CgDeclSkippableConstObj( sym ) ) { if( GenSwitches & DBG_DF ){ DwarfDebugGenSymbol( sym, true ); }else{ SymbolicDebugGenSymbol( sym, true, false ); } } } } } break; case SC_TYPEDEF: if( fctl->debug_info && ( GenSwitches & DBG_LOCALS ) ) { if( GenSwitches & (DBG_CV | DBG_DF ) ){ DBLocalType( (cg_sym_handle)sym, false ); } } break; } }