예제 #1
0
void CgFrontModInitFini(        // PROCESS MODULE-INIT. AFTER FRONT-END
    void )
{
    SYMBOL mod;                 // - symbol for module-initialization func.
    CGFILE *fp;                 // - file for module initialization

    mod = ModuleInitFuncSym();
    if( SymIsReferenced( mod ) && ErrCount == 0 ) {
        ModuleInitConnect();
    } else {
        mod->flag |= SF_REFERENCED;
        fp = CgioLocateFile( mod );
        CgioFreeFile( fp );
    }
}
예제 #2
0
bool CgDeclSkippableConstObj(   // DETERMINE IF SKIPPABLE CONST OBJ
    SYMBOL sym )                // - symbol
{
    if( SymAddrTaken( sym ) ) {
        return( false );
    }
    if( SymIsAutomatic( sym ) && ( GenSwitches & DBG_LOCALS ) ) {
        // if we are debugging locals; don't skip initialization
        return( false );
    }
    if( SymIsConstantInt( sym ) ) {
        return( true );
    }
    if( SymIsConstantNoCode( sym ) && ! SymIsReferenced( sym ) ) {
        if( SymIsStaticData( sym ) ) {
            return( true );
        }
    }
    return( false );
}
예제 #3
0
// 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;
    }
}