gbdk-releases/sdcc/src/SDCCBBlock.h
2015-01-10 16:25:09 +01:00

102 lines
4 KiB
C

/*-------------------------------------------------------------------------
SDCCBBlock.h - header file for Basic Blocks
Written By - Sandeep Dutta . sandeep.dutta@usa.net (1998)
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
In other words, you are welcome to use, share and improve this program.
You are forbidden to forbid anyone else to use, share and improve
what you give them. Help stamp out software-hoarding!
-------------------------------------------------------------------------*/
#ifndef SDCCBBLOCK_H
#define SDCCBBLOCK_H 1
/* definition of a basic block */
typedef struct eBBlock
{
int dfnum; /* depth first number */
int bbnum; /* index into array of numbers */
int depth; /* loop depth of this block */
int fSeq; /* sequence number of first iCode */
int lSeq; /* sequence number of the last iCode */
unsigned int visited:1; /* visitied flag */
unsigned int hasFcall:1; /* has a function call */
unsigned int noPath:1; /* there is no path from _entry to this block */
unsigned int isLastInLoop:1; /* is the last block in a loop */
symbol *entryLabel; /* entry label */
iCode *sch; /* pointer to start of code chain */
iCode *ech; /* pointer to last of code chain */
struct eBBlock *preHeader; /* preheader if this is a loop entry */
struct region *partOfLoop; /* pointer to the loop region this block is part of */
/* control flow analysis */
set *succList; /* list eBBlocks which are successors */
bitVect *succVect; /* bitVector of successors */
set *predList; /* predecessors of this basic block */
bitVect *domVect; /* list of nodes this is dominated by */
/* data flow analysis */
set *inExprs; /* in coming common expressions */
set *outExprs; /* out going common expressions */
bitVect *inDefs; /* in coming defintions */
bitVect *outDefs; /* out going defintions */
bitVect *defSet; /* symbols defined in block */
bitVect *ldefs; /* local definitions only */
bitVect *usesDefs; /* which definitions are used in this block */
bitVect *ptrsSet; /* pointers assigned values in the block */
bitVect *inPtrsSet; /* in coming pointers assigned values */
bitVect *ndompset; /* pointers set by non-dominating basic blocks */
set *addrOf; /* symbols for which addres has been taken in the block */
bitVect *linds; /* if loop exit this contains defNumbers
for the inductions */
}
eBBlock;
typedef struct edge
{
eBBlock *from; /* from basic block */
eBBlock *to; /* to Basic Block */
}
edge;
extern int eBBNum;
extern set *graphEdges;
DEFSETFUNC (printEntryLabel);
eBBlock *neweBBlock ();
edge *newEdge (eBBlock *, eBBlock *);
eBBlock *eBBWithEntryLabel (eBBlock **, symbol *, int);
DEFSETFUNC (ifFromIs);
set *edgesTo (eBBlock *);
void remiCodeFromeBBlock (eBBlock *, iCode *);
void addiCodeToeBBlock (eBBlock *, iCode *, iCode *);
eBBlock **iCodeBreakDown (iCode *, int *);
void replaceSymBySym (set *, operand *, operand *);
iCode *iCodeFromeBBlock (eBBlock **, int);
int otherPathsPresent (eBBlock **, eBBlock *);
void replaceLabel (eBBlock *, symbol *, symbol *);
void dumpEbbsToFileExt (int, eBBlock **, int);
void dumpLiveRanges (int, hTab * liveRanges);
void closeDumpFiles();
#endif