extern void DFObjFiniDbgInfo( offset codesize ) { /******************************/ segment_id old; offset here; back_handle bck; if( _IsModel( DBG_LOCALS | DBG_TYPES ) ) { bck = Comp_High; if( bck != NULL ){ old = SetOP( AskCodeSeg() ); OutLabel( bck->lbl ); SetOP( old ); BEFreeBack( bck ); Comp_High = NULL; } DWEndCompileUnit( Client ); DWFini( Client ); old = SetOP( UnitSize->segment ); here = AskLocation(); SetLocation( UnitSize->offset ); DataLong( codesize ); SetLocation( here ); SetOP( old ); FiniSegBck(); } }
extern void GenObject( void ) /*******************************/ { block *blk; block *next_blk; instruction *ins; source_line_number last_line; block_num targets; block_num i; segment_id old; label_handle lbl; unsigned align; fe_attr attr; old = SetOP( AskCodeSeg() ); InitZeroPage(); last_line = 0; attr = FEAttr( AskForLblSym( CurrProc->label ) ); for( blk = HeadBlock; blk != NULL; blk = next_blk ) { if( blk->label != CurrProc->label && blk->label != NULL ) { last_line = DumpLineNum( blk->ins.hd.line_num, last_line, TRUE ); if( ( blk->class & ITERATIONS_KNOWN ) && blk->iterations >= 10 ) { align = DepthAlign( DEEP_LOOP_ALIGN ); } else { align = DepthAlign( blk->depth ); } CodeLabel( blk->label, align ); if( ( blk->edge[ 0 ].flags & BLOCK_LABEL_DIES ) != 0 && BlocksUnTrimmed ) { TellCondemnedLabel( blk->label ); } }
static bool FlushSomeOpt( pointer_int size ) /**********************************************/ { seg_id old; bool freed; if( InOptimizer == 0 && HaveCodeSeg() ) { old = SetOP( AskCodeSeg() ); freed = ShrinkQueue( size ); SetOP( old ); if( _IsntModel( NO_OPTIMIZATION ) && IckyWicky == FALSE ) { IckyWicky = TRUE; FEMessage( MSG_PEEPHOLE_FLUSHED, NULL ); } } else { freed = FALSE; } return( freed ); }
extern void DFObjInitDbgInfo( void ) { /*****************************************************/ /* called by objinit to init segments and dwarf writing library */ static const dw_funcs cli_funcs = { CLIReloc, CLIWrite, CLISeek, CLITell, CLIAlloc, CLIFree }; dw_init_info info; cg_sym_handle abbrev_sym; cg_sym_handle debug_pch; fe_attr attr; if( _IsntModel( DBG_LOCALS | DBG_TYPES ) ){ return; } info.compiler_options = DW_CM_DEBUGGER; info.abbrev_sym = 0; info.producer_name = SetDwarfProducer(); info.language = SetLang(); if( setjmp( info.exception_handler ) == 0 ) { info.funcs = cli_funcs; InitSegBck(); // start each seg with a ref label if( _IsModel( DBG_PREDEF ) ) { abbrev_sym = FEAuxInfo( NULL, DBG_PREDEF_SYM ); info.abbrev_sym = (dw_sym_handle)abbrev_sym; attr = FEAttr( abbrev_sym ); if( (attr & FE_IMPORT) ) { info.compiler_options |= DW_CM_ABBREV_PRE; }else{ back_handle bck; segment_id old; info.compiler_options |= DW_CM_ABBREV_GEN; bck = FEBack( abbrev_sym ); // dump out export label bck->seg = DwarfSegs[DW_DEBUG_ABBREV].seg; old = SetOP( DwarfSegs[DW_DEBUG_ABBREV].seg ); DataLabel( bck->lbl ); SetOP( old ); } } debug_pch = FEAuxInfo( NULL, DBG_PCH_SYM ); if( debug_pch != NULL ){ attr = FEAttr( debug_pch ); if( !(attr & FE_IMPORT) ) { back_handle bck; segment_id old; bck = FEBack( debug_pch ); bck->seg = DwarfSegs[DW_DEBUG_INFO].seg; old = SetOP( DwarfSegs[DW_DEBUG_INFO].seg ); DataLabel( bck->lbl ); SetOP( old ); debug_pch = NULL; } } Client = DWInit( &info ); if( Client == NULL ) { Zoiks( ZOIKS_107 ); /* Bad */ } DFBegCCU( AskCodeSeg(), (dw_sym_handle)debug_pch ); } else { Zoiks( ZOIKS_107 ); /* Big Error */ } }