{
/* first one */
- if (IS_REGPARM (func->args->etype))
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
{
newic = newiCode (SEND, IC_LEFT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
}
else
{
newic = newiCode ('=', NULL, IC_LEFT (ic));
- IC_RESULT (newic) = operandFromValue (func->args);
+ IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type));
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
/* second one */
- if (IS_REGPARM (func->args->next->etype))
+ if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
{
- newic = newiCode (SEND, IC_LEFT (ic), NULL);
+ newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
}
else
{
newic = newiCode ('=', NULL, IC_RIGHT (ic));
- IC_RESULT (newic) = operandFromValue (func->args->next);
+ IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)->next);
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
{
/* push right */
- if (IS_REGPARM (func->args->next->etype))
+ if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
{
newic = newiCode (SEND, right, NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
}
else
{
newic->lineno = lineno;
/* insert push left */
- if (IS_REGPARM (func->args->etype))
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
{
newic = newiCode (SEND, left, NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
}
else
{
cnvToFloatCast (iCode * ic, eBBlock * ebp)
{
iCode *ip, *newic;
- symbol *func;
+ symbol *func = NULL;
sym_link *type = operandType (IC_RIGHT (ic));
int linenno = ic->lineno;
int bwd, su;
if (!options.float_rent)
{
/* first one */
- if (IS_REGPARM (func->args->etype))
- newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
+ {
+ newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+ }
else
{
newic = newiCode ('=', NULL, IC_RIGHT (ic));
- IC_RESULT (newic) = operandFromValue (func->args);
+ IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type));
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = linenno;
else
{
/* push the left */
- if (IS_REGPARM (func->args->etype))
- newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+ newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+ }
else
{
newic = newiCode (IPUSH, IC_RIGHT (ic), NULL);
cnvFromFloatCast (iCode * ic, eBBlock * ebp)
{
iCode *ip, *newic;
- symbol *func;
+ symbol *func = NULL;
sym_link *type = operandType (IC_LEFT (ic));
int lineno = ic->lineno;
int bwd, su;
if (!options.float_rent)
{
/* first one */
- if (IS_REGPARM (func->args->etype))
- newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+ newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+ }
else
{
newic = newiCode ('=', NULL, IC_RIGHT (ic));
- IC_RESULT (newic) = operandFromValue (func->args);
+ IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type));
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
{
/* push the left */
- if (IS_REGPARM (func->args->etype))
- newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+ newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+ }
else
{
newic = newiCode (IPUSH, IC_RIGHT (ic), NULL);
if (!options.intlong_rent)
{
/* first one */
- if (IS_REGPARM (func->args->etype))
- newic = newiCode (SEND, IC_LEFT (ic), NULL);
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype)) {
+ newic = newiCode (SEND, IC_LEFT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
+ }
else
{
newic = newiCode ('=', NULL, IC_LEFT (ic));
- IC_RESULT (newic) = operandFromValue (func->args);
+ IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type));
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
/* second one */
- if (IS_REGPARM (func->args->next->etype))
- newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype)) {
+ newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
+ }
else
{
newic = newiCode ('=', NULL, IC_RIGHT (ic));
- IC_RESULT (newic) = operandFromValue (func->args->next);
+ IC_RESULT (newic) = operandFromValue (FUNC_ARGS(func->type)->next);
}
addiCodeToeBBlock (ebp, newic, ip);
newic->lineno = lineno;
{
/* compiled as reentrant then push */
/* push right */
- if (IS_REGPARM (func->args->next->etype))
+ if (IS_REGPARM (FUNC_ARGS(func->type)->next->etype))
{
newic = newiCode (SEND, IC_RIGHT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->next->etype);
}
else
{
newic->lineno = lineno;
/* insert push left */
- if (IS_REGPARM (func->args->etype))
+ if (IS_REGPARM (FUNC_ARGS(func->type)->etype))
{
newic = newiCode (SEND, IC_LEFT (ic), NULL);
+ newic->argreg = SPEC_ARGREG(FUNC_ARGS(func->type)->etype);
}
else
{
/* sort it back by block number */
qsort (ebbs, saveCount, sizeof (eBBlock *), bbNumCompare);
+ if (!options.lessPedantic) {
+ // this is a good place to check missing return values
+ if (currFunc) {
+ if (!IS_VOID(currFunc->etype)) {
+ eBBlock *bp;
+ // make sure all predecessors of the last block end in a return
+ for (bp=setFirstItem(ebbs[saveCount-1]->predList);
+ bp;
+ bp=setNextItem(ebbs[saveCount-1]->predList)) {
+ if (bp->ech->op != RETURN) {
+ werror (W_VOID_FUNC, currFunc->name);
+ }
+ }
+ }
+ }
+ }
+
/* if cyclomatic info requested then print it */
if (options.cyclomatic)
printCyclomatic (ebbs, saveCount);
/* throw away blocks */
setToNull ((void **) &graphEdges);
ebbs = NULL;
+
+ currFunc=NULL;
return NULL;
}