Mercurial > projects > ddmd
diff dmd/backend/block.d @ 0:10317f0c89a5
Initial commit
author | korDen |
---|---|
date | Sat, 24 Oct 2009 08:42:06 +0400 |
parents | |
children | 63623152e82a |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dmd/backend/block.d Sat Oct 24 08:42:06 2009 +0400 @@ -0,0 +1,153 @@ +module dmd.backend.block; + +import dmd.backend.elem; +import dmd.backend.LIST; +import dmd.backend.regm_t; +import dmd.backend.Symbol; +import dmd.backend.Srcpos; +import dmd.backend.code; +import dmd.backend.SYMIDX; +import dmd.backend.vec_t; +import dmd.backend.targ_types; +import dmd.backend.con_t; + +struct block +{ + union + { + elem* Belem; // pointer to elem tree + list_t Blist; // list of expressions + }; + + block* Bnext; // pointer to next block in list + list_t Bsucc; // linked list of pointers to successors + // of this block + list_t Bpred; // and the predecessor list + + int Bindex; // into created object stack + int Bendindex; // index at end of block + block* Btry; // BCtry,BC_try: enclosing try block, if any + // BC???: if in try-block, points to BCtry or BC_try + // note that can't have a BCtry and BC_try in + // the same function. + union + { + targ_llong *Bswitch; // BCswitch: pointer to switch data + struct + { + regm_t usIasmregs; // Registers modified + ubyte bIasmrefparam; // References parameters? + } + + struct + { + Symbol* catchvar; // __throw() fills in this + } + + struct + { + Symbol* catchtype; // one type for each catch block + } + + struct + { + Symbol* jcatchvar; // __j_throw() fills in this + int Bscope_index; // index into scope table + int Blast_index; // enclosing index into scope table + } + } + + public alias catchtype Bcatchtype; + + Srcpos Bsrcpos; // line number (0 if not known) + ubyte BC; // exit condition (enum BC) +// NEW + ubyte Balign; // alignment + + ushort Bflags; // flags (BFLxxxx) + code* Bcode; // code generated for this block + + uint Bweight; // relative number of times this block + // is executed (optimizer and codegen) + + uint Bdfoidx; // index of this block in dfo[] + union + { + // CPP + struct + { + SYMIDX symstart; // (symstart <= symnum < symend) Symbols + SYMIDX symend; // are declared in this block + block* endscope; // block that forms the end of the + // scope for the declared Symbols + uint blknum; // position of block from startblock + Symbol* Binitvar; // !=NULL points to an auto variable with + // an explicit or implicit initializer + block* gotolist; // BCtry, BCcatch: backward list of try scopes + block* gotothread; // BCgoto: threaded list of goto's to + // unknown labels + } + + // OPTIMIZER + struct + { + vec_t Bdom; // mask of dominators for this block + vec_t Binrd; + vec_t Boutrd; // IN and OUT for reaching definitions + vec_t Binlv; + vec_t Boutlv; // IN and OUT for live variables + vec_t Bin; + vec_t Bout; // IN and OUT for other flow analyses + vec_t Bgen; + vec_t Bkill; // pointers to bit vectors used by data + // flow analysis + + // BCiftrue can have different vectors for the 2nd successor: + vec_t Bout2; + vec_t Bgen2; + vec_t Bkill2; + } + + // CODGEN + struct + { + targ_size_t Btablesize; // BCswitch, BCjmptab + targ_size_t Btableoffset; // BCswitch, BCjmptab + targ_size_t Boffset; // code offset of start of this block + targ_size_t Bsize; // code size of this block + con_t Bregcon; // register state at block exit + targ_size_t Btryoff; // BCtry: offset of try block data + } + } +} + +enum BFL +{ + BFLvisited = 1, // set if block is visited + BFLmark = 2, // set if block is visited + BFLjmpoptdone = 4, // set when no more jump optimizations + // are possible for this block + BFLnostackopt = 8, // set when stack elimination should not + // be done +///version (NTEXCEPTIONS) { + BFLehcode = 0x10, // set when we need to load exception code + BFLunwind = 0x1000, // do local_unwind following block +///} +///version (TARGET_POWERPC) { +/// BFLstructret = 0x10, /* Set if a struct return is changed to +/// block type BCret. This is done to avoid +/// error messages */ +///} + BFLnomerg = 0x20, // do not merge with other blocks +///version (TX86) { + BFLprolog = 0x80, // generate function prolog + BFLepilog = 0x100, // generate function epilog + BFLrefparam = 0x200, // referenced parameter + BFLreflocal = 0x400, // referenced local + BFLoutsideprolog = 0x800, // outside function prolog/epilog + BFLlabel = 0x2000, // block preceded by label +///} else { +/// BFLlooprt = 0x40, // set if looprotate() changes it's Bnext +///} + BFLvolatile = 0x4000, // block is volatile +} \ No newline at end of file