}
/*-----------------------------------------------------------------*/
-/* appendDumpFile - if not already created, create the dump file */
+/* createDumpFile - create the dump file */
/*-----------------------------------------------------------------*/
-FILE *appendDumpFile (int id) {
+FILE *createDumpFile (int id) {
struct _dumpFiles *dumpFilesPtr=dumpFiles;
-
+ static int dumpIndex=0;
+ static char dumpIndexStr[32];
+
while (dumpFilesPtr->id) {
if (dumpFilesPtr->id==id)
break;
}
if (!dumpFilesPtr->id) {
- fprintf (stdout, "internal error: appendDumpFile: unknown dump file.\n");
+ fprintf (stdout, "internal error: createDumpFile: unknown dump file.\n");
exit (1);
}
+ sprintf(dumpIndexStr, ".%d", dumpIndex);
+ dumpIndex++;
+
if (!dumpFilesPtr->filePtr) {
// not used before, create it
strncpyz (scratchFileName, dstFileName, PATH_MAX);
+#if 0
+ strncatz (scratchFileName, dumpIndexStr, PATH_MAX);
+#endif
strncatz (scratchFileName, dumpFilesPtr->ext, PATH_MAX);
if (!(dumpFilesPtr->filePtr = fopen (scratchFileName, "w"))) {
werror (E_FILE_OPEN_ERR, scratchFileName);
exit (1);
}
}
+
+#if 0
+ fprintf(dumpFilesPtr->filePtr, "Dump file index: %d\n", dumpIndex);
+#endif
+
return dumpFilesPtr->filePtr;
}
for (dumpFilesPtr=dumpFiles; dumpFilesPtr->id; dumpFilesPtr++) {
if (dumpFilesPtr->filePtr) {
fclose (dumpFilesPtr->filePtr);
- //dprintf ("closed %s\n", dumpFilesPtr->ext);
}
}
}
int k;
if (id) {
- file=appendDumpFile(id);
+ file=createDumpFile(id);
} else {
file = stdout;
}
{
FILE *of;
int i;
+ eBBlock *bb;
+ set *cseSet;
if (id) {
- of=appendDumpFile(id);
+ of=createDumpFile(id);
} else {
of = stdout;
}
for (i = 0; i < count; i++)
{
fprintf (of, "\n----------------------------------------------------------------\n");
- fprintf (of, "Basic Block %s : loop Depth = %d noPath = %d , lastinLoop = %d\n",
+ fprintf (of, "Basic Block %s (df:%d bb:%d lvl:%d): loopDepth=%d%s%s%s\n",
ebbs[i]->entryLabel->name,
+ ebbs[i]->dfnum, ebbs[i]->bbnum, ebbs[i]->entryLabel->level,
ebbs[i]->depth,
- ebbs[i]->noPath,
- ebbs[i]->isLastInLoop);
+ ebbs[i]->noPath ? " noPath" : "",
+ ebbs[i]->partOfLoop ? " partOfLoop" : "",
+ ebbs[i]->isLastInLoop ? " isLastInLoop" : "");
+
+ // a --nolabelopt makes this more readable
+ fprintf (of, "\nsuccessors: ");
+ for (bb=setFirstItem(ebbs[i]->succList);
+ bb;
+ bb=setNextItem(ebbs[i]->succList)) {
+ fprintf (of, "%s ", bb->entryLabel->name);
+ }
+ fprintf (of, "\npredecessors: ");
+ for (bb=setFirstItem(ebbs[i]->predList);
+ bb;
+ bb=setNextItem(ebbs[i]->predList)) {
+ fprintf (of, "%s ", bb->entryLabel->name);
+ }
+ {
+ int d;
+ fprintf (of, "\ndominators: ");
+ for (d=0; d<ebbs[i]->domVect->size; d++) {
+ if (bitVectBitValue(ebbs[i]->domVect, d)) {
+ fprintf (of, "%s ", ebbs[d]->entryLabel->name);
+ }
+ }
+ }
+ fprintf (of, "\n");
+
fprintf (of, "\ndefines bitVector :");
bitVectDebugOn (ebbs[i]->defSet, of);
fprintf (of, "\nlocal defines bitVector :");
fprintf (of, "\nInductions Set bitvector :");
bitVectDebugOn (ebbs[i]->linds, of);
}
+
+ fprintf (of, "\ninExprs:");
+ for (cseSet = ebbs[i]->inExprs; cseSet; cseSet=cseSet->next) {
+ cseDef *item=cseSet->item;
+ fprintf (of, " %s(%d)",OP_SYMBOL(item->sym)->name,item->diCode->key);
+ if (item->fromGlobal)
+ fprintf (of, "g");
+ }
+ fprintf (of, "\noutExprs:");
+ for (cseSet = ebbs[i]->outExprs; cseSet; cseSet=cseSet->next) {
+ cseDef *item=cseSet->item;
+ fprintf (of, " %s(%d)",OP_SYMBOL(item->sym)->name,item->diCode->key);
+ if (item->fromGlobal)
+ fprintf (of, "g");
+ }
+ fprintf (of, "\nkilledExprs:");
+ for (cseSet = ebbs[i]->killedExprs; cseSet; cseSet=cseSet->next) {
+ cseDef *item=cseSet->item;
+ fprintf (of, " %s(%d)",OP_SYMBOL(item->sym)->name,item->diCode->key);
+ if (item->fromGlobal)
+ fprintf (of, "g");
+ }
+
fprintf (of, "\n----------------------------------------------------------------\n");
printiCChain (ebbs[i]->sch, of);
}
iCode2eBBlock (iCode * ic)
{
iCode *loop;
- eBBlock *ebb = neweBBlock (); /* a llocate an entry */
+ eBBlock *ebb = neweBBlock (); /* allocate an entry */
/* put the first one unconditionally */
ebb->sch = ic;
/* if this is a label then */
if (ic->op == LABEL)
- ebb->entryLabel = ic->argLabel.label;
+ ebb->entryLabel = ic->label;
else
{
- sprintf (buffer, "_eBBlock%d", eBBNum++);
+ SNPRINTF (buffer, sizeof(buffer), "_eBBlock%d", eBBNum++);
ebb->entryLabel = newSymbol (buffer, 1);
ebb->entryLabel->key = labelKey++;
}
ebb->ech = ebb->sch;
return ebb;
}
+
+ /* if this is a function call */
+ if (ic->op == CALL || ic->op == PCALL)
+ {
+ ebb->hasFcall = 1;
+ if (currFunc)
+ FUNC_HASFCALL(currFunc->type) = 1;
+ }
if ((ic->next && ic->next->op == LABEL) ||
!ic->next)
{
bitVectUnSetBit (OP_USES (IC_COND (ic)), ic->key);
IC_COND (ic) = operandFromOperand (dest);
- OP_USES_SET ((dest), bitVectSetBit (OP_USES (dest), ic->key));
+ OP_USES(dest)=bitVectSetBit (OP_USES (dest), ic->key);
continue;
}
bitVectUnSetBit (OP_USES (IC_RIGHT (ic)), ic->key);
IC_RIGHT (ic) = operandFromOperand (dest);
IC_RIGHT (ic)->isaddr = 0;
- OP_USES_SET ((dest), bitVectSetBit (OP_USES (dest), ic->key));
+ OP_USES(dest)=bitVectSetBit (OP_USES (dest), ic->key);
}
if (isOperandEqual (IC_LEFT (ic), src))
IC_LEFT (ic) = operandFromOperand (dest);
IC_LEFT (ic)->isaddr = 0;
}
- OP_USES_SET ((dest), bitVectSetBit (OP_USES (dest), ic->key));
+ OP_USES(dest)=bitVectSetBit (OP_USES (dest), ic->key);
}
/* special case for pointer sets */
bitVectUnSetBit (OP_USES (IC_RESULT (ic)), ic->key);
IC_RESULT (ic) = operandFromOperand (dest);
IC_RESULT (ic)->isaddr = 1;
- OP_USES_SET ((dest), bitVectSetBit (OP_USES (dest), ic->key));
+ OP_USES(dest)=bitVectSetBit (OP_USES (dest), ic->key);
}
}
}
(ebbs[i]->entryLabel != entryLabel &&
ebbs[i]->entryLabel != returnLabel))
{
- werror (W_CODE_UNREACH, ebbs[i]->sch->filename, ebbs[i]->sch->lineno);
- continue;
+ iCode *ic = NULL;
+ bool foundNonlabel = 0;
+ ic=ebbs[i]->sch;
+ do
+ {
+ if (ic->op != LABEL)
+ {
+ foundNonlabel = 1;
+ break;
+ }
+ if (ic==ebbs[i]->ech)
+ break;
+ ic = ic->next;
+ }
+ while (ic);
+ if (foundNonlabel && ic)
+ {
+ werrorfl (ic->filename, ic->lineno, W_CODE_UNREACH);
+ continue;
+ }
}
lic->next = ebbs[i]->sch;
lic->next->prev = lic;
lic = ebbs[i]->ech;
+
}
return ric;