X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCicode.c;h=460fc5d47d3cb28967308acb9d8a576c0b3a3fba;hb=57781964418caea528f9018cace1acb4a789d71c;hp=fc950632316409ac51307900989e6cdaff7aa0fd;hpb=23146c457114044fbfb409cca0f1a379e12ce9d1;p=fw%2Fsdcc diff --git a/src/SDCCicode.c b/src/SDCCicode.c index fc950632..460fc5d4 100644 --- a/src/SDCCicode.c +++ b/src/SDCCicode.c @@ -222,12 +222,13 @@ printOperand (operand * op, FILE * file) case SYMBOL: #define REGA 1 #ifdef REGA - fprintf (file, "%s [k%d lr%d:%d so:%d]{ ia%d re%d rm%d nos%d}", /*{ar%d rm%d ru%d p%d a%d u%d i%d au%d k%d ks%d}" , */ + fprintf (file, "%s [k%d lr%d:%d so:%d]{ ia%d re%d rm%d nos%d ru%d}", /*{ar%d rm%d ru%d p%d a%d u%d i%d au%d k%d ks%d}" , */ (OP_SYMBOL (op)->rname[0] ? OP_SYMBOL (op)->rname : OP_SYMBOL (op)->name), op->key, OP_LIVEFROM (op), OP_LIVETO (op), OP_SYMBOL (op)->stack, - op->isaddr, OP_SYMBOL (op)->isreqv, OP_SYMBOL (op)->remat,OP_SYMBOL(op)->noSpilLoc + op->isaddr, OP_SYMBOL (op)->isreqv, OP_SYMBOL (op)->remat,OP_SYMBOL(op)->noSpilLoc, + OP_SYMBOL(op)->ruonly ); { fprintf (file, "{"); @@ -683,7 +684,6 @@ copyiCode (iCode * ic) case PCALL: IC_RESULT (nic) = operandFromOperand (IC_RESULT (ic)); IC_LEFT (nic) = operandFromOperand (IC_LEFT (ic)); - IC_ARGS (nic) = IC_ARGS (ic); break; case INLINEASM: @@ -858,6 +858,7 @@ isOperandLiteral (operand * op) return 0; } + /*-----------------------------------------------------------------*/ /* isOperandInFarSpace - will return true if operand is in farSpace */ /*-----------------------------------------------------------------*/ @@ -886,6 +887,34 @@ isOperandInFarSpace (operand * op) return (IN_FARSPACE (SPEC_OCLS (etype)) ? TRUE : FALSE); } +/*------------------------------------------------------------------*/ +/* isOperandInDirSpace - will return true if operand is in dirSpace */ +/*------------------------------------------------------------------*/ +bool +isOperandInDirSpace (operand * op) +{ + sym_link *etype; + + if (!op) + return FALSE; + + if (!IS_SYMOP (op)) + return FALSE; + + if (!IS_TRUE_SYMOP (op)) + { + if (SPIL_LOC (op)) + etype = SPIL_LOC (op)->etype; + else + return FALSE; + } + else + { + etype = getSpec (operandType (op)); + } + return (IN_DIRSPACE (SPEC_OCLS (etype)) ? TRUE : FALSE); +} + /*-----------------------------------------------------------------*/ /* isOperandOnStack - will return true if operand is on stack */ /*-----------------------------------------------------------------*/ @@ -916,6 +945,31 @@ operandLitValue (operand * op) return floatFromVal (op->operand.valOperand); } +/*-----------------------------------------------------------------*/ +/* getBuiltInParms - returns parameters to a builtin functions */ +/*-----------------------------------------------------------------*/ +iCode *getBuiltinParms (iCode *ic, int *pcount, operand **parms) +{ + sym_link *ftype; + + *pcount = 0; + /* builtin functions uses only SEND for parameters */ + while (ic->op != CALL) { + assert(ic->op == SEND && ic->builtinSEND); + ic->generated = 1; /* mark the icode as generated */ + parms[*pcount] = IC_LEFT(ic); + ic = ic->next; + (*pcount)++; + } + + ic->generated = 1; + /* make sure this is a builtin function call */ + assert(IS_SYMOP(IC_LEFT(ic))); + ftype = operandType(IC_LEFT(ic)); + assert(IFFUNC_ISBUILTIN(ftype)); + return ic; +} + /*-----------------------------------------------------------------*/ /* operandOperation - perforoms operations on operands */ /*-----------------------------------------------------------------*/ @@ -1658,13 +1712,7 @@ geniCodeCast (sym_link * type, operand * op, bool implicit) } } if (errors) { - /* fprintf (stderr, "%s%s %d: ", op->operand.symOperand->name, - implicit?"(implicit)":"", errors); */ - fprintf (stderr, "from type '"); - printTypeChain (optype, stderr); - fprintf (stderr, "' to type '"); - printTypeChain (type, stderr); - fprintf (stderr, "'\n"); + printFromToType (optype, type); } /* if they are the same size create an assignment */ @@ -2571,7 +2619,7 @@ geniCodeConditional (ast * tree,int lvl) true = ast2iCode (tree->right->left,lvl+1); /* move the value to a new Operand */ - result = newiTempOperand (operandType (true), 0); + result = newiTempOperand (tree->right->ftype, 0); geniCodeAssign (result, geniCodeRValue (true, FALSE), 0); /* generate an unconditional goto */ @@ -2710,11 +2758,6 @@ geniCodeParms (ast * parms, value *argVals, int *stack, argVals=FUNC_ARGS(func->type); } - if (parms->argSym || - (parms->type!=EX_OP && parms->type!=EX_OPERAND)) { - fprintf (stderr, "What the fuck??\n"); - } - /* if this is a param node then do the left & right */ if (parms->type == EX_OP && parms->opval.op == PARAM) { @@ -2743,10 +2786,11 @@ geniCodeParms (ast * parms, value *argVals, int *stack, } /* if register parm then make it a send */ - if ((parms->argSym && IS_REGPARM(parms->argSym->etype)) || - (IS_REGPARM (parms->etype) && !IFFUNC_HASVARARGS(func->type))) + if ((IS_REGPARM (parms->etype) && !IFFUNC_HASVARARGS(func->type)) || + IFFUNC_ISBUILTIN(func->type)) { ic = newiCode (SEND, pval, NULL); + ic->builtinSEND = FUNC_ISBUILTIN(func->type); ADDTOCHAIN (ic); } else @@ -2757,6 +2801,8 @@ geniCodeParms (ast * parms, value *argVals, int *stack, /* assign */ operand *top = operandFromSymbol (argVals->sym); + /* clear useDef and other bitVectors */ + OP_USES (top) = OP_DEFS (top) = OP_SYMBOL(top)->clashes = NULL; geniCodeAssign (top, pval, 1); } else @@ -2806,7 +2852,6 @@ geniCodeCall (operand * left, ast * parms,int lvl) else ic = newiCode (CALL, left, NULL); - IC_ARGS (ic) = FUNC_ARGS(left->operand.symOperand->type); type = copyLinkChain (operandType (left)->next); etype = getSpec (type); SPEC_EXTR (etype) = 0; @@ -2898,9 +2943,6 @@ geniCodeFunctionBody (ast * tree,int lvl) /* create a proc icode */ ic = newiCode (FUNCTION, func, NULL); - /* if the function has parmas then */ - /* save the parameters information */ - ic->argLabel.args = tree->values.args; ic->lineno = OP_SYMBOL (func)->lineDef; ADDTOCHAIN (ic); @@ -2962,14 +3004,14 @@ geniCodeIfx (ast * tree,int lvl) if (tree->trueLabel) geniCodeGoto (tree->trueLabel); else - assert (1); + assert (0); } else { if (tree->falseLabel) geniCodeGoto (tree->falseLabel); else - assert (1); + assert (0); } goto exit; }