void CgBackFreeHandle( // FREE A BACK HANDLE FOR A SYMBOL SYMBOL sym ) // - the symbol { if( ( sym->flag2 & SF2_CG_HANDLE ) &&( ! SymIsAnonymous( sym ) ) &&( ! SymIsAutomatic( sym ) ) ) { // - only because of RO,RW-DTORS sym->flag2 &= ~SF2_CG_HANDLE; BEFreeBack( (back_handle)sym->locn->u.cg_handle ); } }
back_handle FEBack( // GET BACK HANDLE FOR A SYMBOL SYMBOL sym ) // - the symbol { SCOPE scope; // - scope for symbol SYMBOL check_sym; // - SYMBOL temp void* cg_handle; // - handle for symbol #ifndef NDEBUG SYMBOL orig // - original symbol = sym; #endif check_sym = SymIsAnonymous( sym ); if( check_sym != NULL ) { sym = check_sym; } if( sym->flag2 & SF2_CG_HANDLE ) { cg_handle = sym->locn->u.cg_handle; } else { cg_handle = BENewBack( (cg_sym_handle)sym ); if( NULL != cg_handle ) { SYM_TOKEN_LOCN* locn = SymbolLocnAlloc( &sym->locn ); locn->u.cg_handle = cg_handle; scope = SymScope( sym ); if( scope != NULL ) { switch( scope->id ) { case SCOPE_CLASS : cgBackStatHandleAdd( sym ); break; case SCOPE_FUNCTION : case SCOPE_BLOCK : if( SymIsStaticData( sym ) ) { cgBackStatHandleAdd( sym ); } break; } } sym->flag2 &= ~SF2_HDL_MASK; sym->flag2 |= SF2_CG_HANDLE; } } #ifndef NDEBUG if( PragDbgToggle.auxinfo ) { printf( "FEBack( %p ) -> bh[%p]\n", orig, cg_handle ); } #endif return cg_handle; }
static void formatScopedSym( SYMBOL sym, VBUF *pvbuf, FMT_CONTROL control ) /*************************************************************************/ { VBUF prefix; boolean ctordtor; VbufInit( &prefix ); if( sym->name == NULL ) { ctordtor = fmtSymName( sym, NULL, &prefix, pvbuf, control ); } else { ctordtor = fmtSymName( sym, sym->name->name, &prefix, pvbuf, control ); } if( !SymIsAnonymous( sym ) ) { fmtSymScope( SymScope( sym ), pvbuf, TRUE ); } if( !ctordtor ) { VbufConcVbuf( pvbuf, &prefix ); } VbufFree( &prefix ); }
static char *formatScopedSym( SYMBOL sym, VBUF *pvbuf, FMT_CONTROL control ) /**************************************************************************/ { VBUF prefix; bool ctordtor; VbufInit( &prefix ); if( sym->name == NULL ) { ctordtor = fmtSymName( sym, NULL, &prefix, pvbuf, control ); } else { ctordtor = fmtSymName( sym, sym->name->name, &prefix, pvbuf, control ); } if( !SymIsAnonymous( sym ) ) { fmtSymScope( SymScope( sym ), pvbuf, true ); } if( !ctordtor ) { VbufConcVbuf( pvbuf, &prefix ); } VbufFree( &prefix ); return( VbufString( pvbuf ) ); }
// 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; } }