X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCicode.c;h=cc65ac066028318a58201eaa772154e872c304c3;hb=96ff919c3470720e4bf26c7d278c753a97eeef09;hp=62f2ceadfde566e87d1fb8cbff4a5bf56e26a99f;hpb=817beb07e406ae505fb0b1354d42025a1bfd14ce;p=fw%2Fsdcc diff --git a/src/SDCCicode.c b/src/SDCCicode.c index 62f2cead..cc65ac06 100644 --- a/src/SDCCicode.c +++ b/src/SDCCicode.c @@ -115,26 +115,6 @@ iCodeTable codeTable[] = {ARRAYINIT, "arrayInit", picGenericOne, NULL}, }; -// this makes it more easy to catch bugs -struct bitVect *OP_DEFS(struct operand *op) { - wassert (IS_SYMOP(op)); - return OP_SYMBOL(op)->defs; -} -struct bitVect *OP_DEFS_SET(struct operand *op, struct bitVect *bv) { - wassert (IS_SYMOP(op)); - OP_SYMBOL(op)->defs=bv; - return bv; -} -struct bitVect *OP_USES(struct operand *op) { - wassert (IS_SYMOP(op)); - return OP_SYMBOL(op)->uses; -} -struct bitVect *OP_USES_SET(struct operand *op, struct bitVect *bv) { - wassert (IS_SYMOP(op)); - OP_SYMBOL(op)->uses=bv; - return bv; -} - /*-----------------------------------------------------------------*/ /* checkConstantRange: check a constant against the type */ /*-----------------------------------------------------------------*/ @@ -520,7 +500,7 @@ printiCChain (iCode * icChain, FILE * of) { if ((icTab = getTableEntry (loop->op))) { - fprintf (of, "%s(%d:%d:%d:%d:%d)\t", + fprintf (of, "%s(l%d:s%d:k%d:d%d:s%d)\t", loop->filename, loop->lineno, loop->seq, loop->key, loop->depth, loop->supportRtn); @@ -597,7 +577,7 @@ newiCodeLabelGoto (int op, symbol * label) ic = newiCode (op, NULL, NULL); ic->op = op; - ic->argLabel.label = label; + ic->label = label; IC_LEFT (ic) = NULL; IC_RIGHT (ic) = NULL; IC_RESULT (ic) = NULL; @@ -819,6 +799,8 @@ isParameterToCall (value * args, operand * op) { value *tval = args; + wassert (IS_SYMOP(op)); + while (tval) { if (tval->sym && @@ -841,7 +823,7 @@ isOperandGlobal (operand * op) if (IS_ITEMP (op)) return 0; - if (op->type == SYMBOL && + if (IS_SYMOP(op) && (op->operand.symOperand->level == 0 || IS_STATIC (op->operand.symOperand->etype) || IS_EXTERN (op->operand.symOperand->etype)) @@ -864,13 +846,13 @@ isOperandVolatile (operand * op, bool chkTemp) return 0; opetype = getSpec (optype = operandType (op)); - - if (IS_PTR (optype) && DCL_PTR_VOLATILE (optype)) - return 1; - - if (IS_VOLATILE (opetype)) - return 1; - return 0; + + if (IS_PTR (optype) && DCL_PTR_VOLATILE (optype)) + return 1; + + if (IS_VOLATILE (opetype)) + return 1; + return 0; } /*-----------------------------------------------------------------*/ @@ -1539,10 +1521,13 @@ operandFromAst (ast * tree,int lvl) case EX_LINK: return operandFromLink (tree->opval.lnk); - } + break; - assert (0); - /* Just to keep the comiler happy */ + default: + assert (0); + } + + /* Just to keep the compiler happy */ return (operand *) 0; } @@ -2076,12 +2061,6 @@ geniCodeAdd (operand * left, operand * right, int lvl) int isarray = 0; LRTYPE; -#if 0 - /* if left is an array then array access */ - if (IS_ARRAY (ltype)) - return geniCodeArray (left, right,lvl); -#endif - /* if the right side is LITERAL zero */ /* return the left side */ if (IS_LITERAL (retype) && right->isLiteral && !floatFromVal (valFromType (retype))) @@ -2143,10 +2122,11 @@ aggrToPtr (sym_link * type, bool force) return type; etype = getSpec (type); - ptype = newLink (); + ptype = newLink (DECLARATOR); ptype->next = type; - /* if the output class is generic */ + + /* if the output class is code */ if ((DCL_TYPE (ptype) = PTR_TYPE (SPEC_OCLS (etype))) == CPOINTER) DCL_PTR_CONST (ptype) = port->mem.code_ro; @@ -2158,6 +2138,7 @@ aggrToPtr (sym_link * type, bool force) /* the variable was volatile then pointer to volatile */ if (IS_VOLATILE (etype)) DCL_PTR_VOLATILE (ptype) = 1; + return ptype; } @@ -2174,7 +2155,6 @@ geniCodeArray2Ptr (operand * op) if ((DCL_TYPE (optype) = PTR_TYPE (SPEC_OCLS (opetype))) == CPOINTER) DCL_PTR_CONST (optype) = port->mem.code_ro; - /* if the variable was declared a constant */ /* then the pointer points to a constant */ if (IS_CONSTANT (opetype)) @@ -2183,6 +2163,7 @@ geniCodeArray2Ptr (operand * op) /* the variable was volatile then pointer to volatile */ if (IS_VOLATILE (opetype)) DCL_PTR_VOLATILE (optype) = 1; + op->isaddr = 0; return op; } @@ -2244,6 +2225,8 @@ geniCodeStruct (operand * left, operand * right, bool islval) symbol *element = getStructElement (SPEC_STRUCT (etype), right->operand.symOperand); + wassert(IS_SYMOP(right)); + /* add the offset */ ic = newiCode ('+', left, operandFromLit (element->offset)); @@ -2464,8 +2447,7 @@ geniCodeAddressOf (operand * op) /* return op; */ /* } */ - p = newLink (); - p->class = DECLARATOR; + p = newLink (DECLARATOR); /* set the pointer depending on the storage class */ if ((DCL_TYPE (p) = PTR_TYPE (SPEC_OCLS (opetype))) == CPOINTER) @@ -2546,16 +2528,19 @@ geniCodeDerefPtr (operand * op,int lvl) sym_link *rtype, *retype; sym_link *optype = operandType (op); - /* if this is a pointer then generate the rvalue */ - if (IS_PTR (optype)) + // if this is an array then array access + if (IS_ARRAY (optype)) { + // don't worry, this will be optimized out later + return geniCodeArray (op, operandFromLit (0), lvl); + } + + // just in case someone screws up + wassert (IS_PTR (optype)); + + if (IS_TRUE_SYMOP (op)) { - if (IS_TRUE_SYMOP (op)) - { - op->isaddr = 1; - op = geniCodeRValue (op, TRUE); - } - else - op = geniCodeRValue (op, TRUE); + op->isaddr = 1; + op = geniCodeRValue (op, TRUE); } /* now get rid of the pointer part */ @@ -2568,9 +2553,8 @@ geniCodeDerefPtr (operand * op,int lvl) retype = getSpec (rtype = copyLinkChain (optype->next)); } - /* if this is a pointer then outputclass needs 2b updated */ - if (IS_PTR (optype)) - setOClass (optype, retype); + /* outputclass needs 2b updated */ + setOClass (optype, retype); op->isGptr = IS_GENPTR (optype); @@ -2895,7 +2879,7 @@ geniCodeParms (ast * parms, value *argVals, int *stack, /* assign */ operand *top = operandFromSymbol (argVals->sym); /* clear useDef and other bitVectors */ - OP_USES_SET ((top), OP_DEFS_SET ((top), OP_SYMBOL(top)->clashes = NULL)); + OP_USES(top)=OP_DEFS(top)=OP_SYMBOL(top)->clashes = NULL; geniCodeAssign (top, pval, 1); } else @@ -3770,3 +3754,35 @@ iCodeFromAst (ast * tree) ast2iCode (tree,0); return reverseiCChain (); } + +static const char *opTypeToStr(OPTYPE op) +{ + switch(op) + { + case SYMBOL: return "symbol"; + case VALUE: return "value"; + case TYPE: return "type"; + } + return "undefined type"; +} + + +operand *validateOpType(operand *op, + const char *macro, + const char *args, + OPTYPE type, + const char *file, + unsigned line) +{ + if (op && op->type == type) + { + return op; + } + fprintf(stderr, + "Internal error: validateOpType failed in %s(%s) @ %s:%u:" + " expected %s, got %s\n", + macro, args, file, line, + opTypeToStr(type), op ? opTypeToStr(op->type) : "null op"); + exit(-1); + return op; // never reached, makes compiler happy. +}