X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCicode.c;h=1c8b65863ea075287f50252a06f1e778cfaee12d;hb=335e716901410667443532196789fb96107fd49b;hp=46119d3ed4a3e3a36030148db3ecb7535b2ac3e7;hpb=8b71ea9698b188b0616f8965a5c9e838d572f8a2;p=fw%2Fsdcc diff --git a/src/SDCCicode.c b/src/SDCCicode.c index 46119d3e..1c8b6586 100644 --- a/src/SDCCicode.c +++ b/src/SDCCicode.c @@ -648,13 +648,13 @@ link *operandType (operand *op) case TYPE : return op->operand.typeOperand ; + default: + werror (E_INTERNAL_ERROR,__FILE__,__LINE__, + " operand type not known "); + assert (0) ; /* should never come here */ + /* Just to keep the compiler happy */ + return (link *)0; } - - werror (E_INTERNAL_ERROR,__FILE__,__LINE__, - " operand type not known "); - assert (0) ; /* should never come here */ - /* Just to keep the compiler happy */ - return (link *)0; } /*-----------------------------------------------------------------*/ @@ -1060,7 +1060,7 @@ operand *operandFromSymbol (symbol *sym) { operand *op ; iCode *ic ; - + int ok =1 ; /* if the symbol's type is a literal */ /* then it is an enumerator type */ if (IS_LITERAL(sym->etype) && SPEC_ENUM(sym->etype)) @@ -1084,6 +1084,11 @@ operand *operandFromSymbol (symbol *sym) /* under the following conditions create a register equivalent for a local symbol */ + if (sym->level && sym->etype && SPEC_OCLS(sym->etype) && + IN_FARSPACE(SPEC_OCLS(sym->etype)) && + options.stackAuto == 0) + ok =0; + if (!IS_AGGREGATE(sym->type) && /* not an aggregate */ !IS_FUNC(sym->type) && /* not a function */ !sym->_isparm && /* not a parameter */ @@ -1093,7 +1098,7 @@ operand *operandFromSymbol (symbol *sym) !IS_VOLATILE(sym->etype) && /* not declared as volatile */ !IS_STATIC(sym->etype) && /* and not declared static */ !sym->islbl && /* not a label */ - !IN_FARSPACE(SPEC_OCLS(sym->etype)) && /* not in far space */ + ok && /* farspace check */ !IS_BITVAR(sym->etype) /* not a bit variable */ ) { @@ -1106,7 +1111,7 @@ operand *operandFromSymbol (symbol *sym) OP_SYMBOL(sym->reqv)->islocal = 1; SPIL_LOC(sym->reqv) = sym; } - + if (!IS_AGGREGATE(sym->type)) { op = newOperand(); op->type = SYMBOL; @@ -1328,7 +1333,7 @@ operand *geniCodeCast (link *type, operand *op, bool implicit) return op; /* if this is a literal then just change the type & return */ - if (IS_LITERAL(opetype) && !IS_PTR(type) && !IS_PTR(optype)) + if (IS_LITERAL(opetype) && op->type == VALUE && !IS_PTR(type) && !IS_PTR(optype)) return operandFromValue(valCastLiteral(type, operandLitValue(op))); @@ -1648,27 +1653,8 @@ link *aggrToPtr ( link *type, bool force) ptype->next = type; /* if the output class is generic */ if ((DCL_TYPE(ptype) = PTR_TYPE(SPEC_OCLS(etype))) == CPOINTER) - DCL_PTR_CONST(ptype) = 1; + DCL_PTR_CONST(ptype) = port->mem.code_ro; -/* if (SPEC_OCLS(etype) == generic) */ -/* DCL_TYPE(ptype) = GPOINTER; */ -/* else */ -/* if (SPEC_OCLS(etype)->codesp ) { */ -/* DCL_TYPE(ptype) = CPOINTER ; */ -/* DCL_PTR_CONST(ptype) = 1; */ -/* } */ -/* else */ -/* if (SPEC_OCLS(etype)->fmap && !SPEC_OCLS(etype)->paged) */ -/* DCL_TYPE(ptype) = FPOINTER ; */ -/* else */ -/* if (SPEC_OCLS(etype)->fmap && SPEC_OCLS(etype)->paged) */ -/* DCL_TYPE(ptype) = PPOINTER ; */ -/* else */ -/* if (SPEC_OCLS(etype) == idata) */ -/* DCL_TYPE(ptype) = IPOINTER; */ -/* else */ -/* DCL_TYPE(ptype) = POINTER ; */ - /* if the variable was declared a constant */ /* then the pointer points to a constant */ if (IS_CONSTANT(etype) ) @@ -1687,26 +1673,11 @@ operand *geniCodeArray2Ptr (operand *op) { link *optype = operandType(op); link *opetype = getSpec(optype); - + + /* set the pointer depending on the storage class */ if ((DCL_TYPE(optype) = PTR_TYPE(SPEC_OCLS(opetype))) == CPOINTER) - DCL_PTR_CONST(optype) = 1; + DCL_PTR_CONST(optype) = port->mem.code_ro; - /* set the pointer depending on the storage class */ -/* if (SPEC_OCLS(opetype)->codesp ) { */ -/* DCL_TYPE(optype) = CPOINTER ; */ -/* DCL_PTR_CONST(optype) = 1; */ -/* } */ -/* else */ -/* if (SPEC_OCLS(opetype)->fmap && !SPEC_OCLS(opetype)->paged) */ -/* DCL_TYPE(optype) = FPOINTER ; */ -/* else */ -/* if (SPEC_OCLS(opetype)->fmap && SPEC_OCLS(opetype)->paged) */ -/* DCL_TYPE(optype) = PPOINTER ; */ -/* else */ -/* if (SPEC_OCLS(opetype) == idata) */ -/* DCL_TYPE(optype) = IPOINTER; */ -/* else */ -/* DCL_TYPE(optype) = POINTER ; */ /* if the variable was declared a constant */ /* then the pointer points to a constant */ @@ -1729,10 +1700,12 @@ operand *geniCodeArray (operand *left,operand *right) link *ltype = operandType(left); if (IS_PTR(ltype)) { + if (IS_PTR(ltype->next) && left->isaddr) + left = geniCodeRValue(left,FALSE); return geniCodeDerefPtr(geniCodeAdd(left,right)); } - /* array access */ + /* array access */ right = geniCodeMultiply(right, operandFromLit(getSize(ltype->next))); @@ -1958,39 +1931,20 @@ operand *geniCodeAddressOf (operand *op) link *optype = operandType(op); link *opetype= getSpec(optype); + /* lvalue check already done in decorateType */ /* this must be a lvalue */ - if (!op->isaddr && !IS_AGGREGATE(optype)) { - werror (E_LVALUE_REQUIRED,"&"); - return op; - } +/* if (!op->isaddr && !IS_AGGREGATE(optype)) { */ +/* werror (E_LVALUE_REQUIRED,"&"); */ +/* return op; */ +/* } */ p = newLink(); p->class = DECLARATOR ; + /* set the pointer depending on the storage class */ if ((DCL_TYPE(p) = PTR_TYPE(SPEC_OCLS(opetype))) == CPOINTER) - DCL_PTR_CONST(p) = 1; + DCL_PTR_CONST(p) = port->mem.code_ro; - /* set the pointer depending on the storage class */ -/* if (SPEC_OCLS(opetype)->codesp ) { */ -/* DCL_TYPE(p) = CPOINTER ; */ -/* DCL_PTR_CONST(p) = 1; */ -/* } */ -/* else */ -/* if (SPEC_OCLS(opetype)->fmap && !SPEC_OCLS(opetype)->paged) */ -/* DCL_TYPE(p) = FPOINTER ; */ -/* else */ -/* if (SPEC_OCLS(opetype)->fmap && SPEC_OCLS(opetype)->paged) */ -/* DCL_TYPE(p) = PPOINTER ; */ -/* else */ -/* if (SPEC_OCLS(opetype) == idata) */ -/* DCL_TYPE(p) = IPOINTER; */ -/* else */ -/* if (SPEC_OCLS(opetype) == data || */ -/* SPEC_OCLS(opetype) == overlay) */ -/* DCL_TYPE(p) = POINTER ; */ -/* else */ -/* DCL_TYPE(p) = GPOINTER; */ - /* make sure we preserve the const & volatile */ if (IS_CONSTANT(opetype)) DCL_PTR_CONST(p) = 1; @@ -2043,6 +1997,14 @@ void setOClass (link *ptr, link *spec) case PPOINTER: SPEC_OCLS(spec) = xstack; break; + + case EEPPOINTER: + SPEC_OCLS(spec) = eeprom; + break; + + default: + break; + } } @@ -2065,25 +2027,19 @@ operand *geniCodeDerefPtr (operand *op) } /* now get rid of the pointer part */ - if (lvaluereq && IS_ITEMP(op)) + if (lvaluereq && IS_ITEMP(op) ) + { retype = getSpec(rtype = copyLinkChain(optype)) ; + } else + { retype = getSpec(rtype = copyLinkChain(optype->next)) ; + } /* if this is a pointer then outputclass needs 2b updated */ if (IS_PTR(optype)) setOClass(optype,retype); - #if 1 - /* This block moved here from its original location - * ten lines later by KV, 2/27/2000. - * - * This allows code of the form "&array[const]" to - * compile properly. - */ - if (!lvaluereq) - op = geniCodeRValue(op, TRUE); - #endif op->isGptr = IS_GENPTR(optype); /* if the pointer was declared as a constant */ @@ -2097,11 +2053,9 @@ operand *geniCodeDerefPtr (operand *op) IS_CHAR(rtype) || IS_FLOAT(rtype) ); - #if 0 - /* Moved upwards */ if (!lvaluereq) op = geniCodeRValue(op,TRUE); - #endif + setOperandType(op,rtype); return op; @@ -2263,13 +2217,14 @@ operand *geniCodeAssign (operand *left, operand *right, int nosupdate) /* left is integral type and right is literal then check if the literal value is within bounds */ - if (IS_INTEGRAL(ltype) && IS_LITERAL(rtype)) { + if (IS_INTEGRAL(ltype) && right->type == VALUE && IS_LITERAL(rtype)) { int nbits = bitsForType(ltype); long v = operandLitValue(right); if (v > ((LONG_LONG)1 << nbits) && v > 0) werror(W_CONST_RANGE," = operation"); } + /* if the left & right type don't exactly match */ /* if pointer set then make sure the check is done with the type & not the pointer */ @@ -2461,16 +2416,19 @@ static void geniCodeReceive (value *args) /* we will use it after all optimizations and before liveRange calculation */ - if (!sym->addrtaken && - !IS_VOLATILE(sym->etype) && - !IN_FARSPACE(SPEC_OCLS(sym->etype))) { - opl = newiTempOperand(args->type,0); - sym->reqv = opl ; - sym->reqv->key = sym->key ; - OP_SYMBOL(sym->reqv)->key = sym->key; - OP_SYMBOL(sym->reqv)->isreqv = 1; - OP_SYMBOL(sym->reqv)->islocal= 0; - SPIL_LOC(sym->reqv) = sym; + if (!sym->addrtaken && !IS_VOLATILE(sym->etype)) { + + if(IN_FARSPACE(SPEC_OCLS(sym->etype)) && + options.stackAuto == 0) { + } else { + opl = newiTempOperand(args->type,0); + sym->reqv = opl ; + sym->reqv->key = sym->key ; + OP_SYMBOL(sym->reqv)->key = sym->key; + OP_SYMBOL(sym->reqv)->isreqv = 1; + OP_SYMBOL(sym->reqv)->islocal= 0; + SPIL_LOC(sym->reqv) = sym; + } } ic = newiCode(RECEIVE,NULL,NULL); @@ -2793,6 +2751,7 @@ operand *ast2iCode (ast *tree) tree->opval.op != INLINEASM ) { if (IS_ASSIGN_OP(tree->opval.op) || IS_DEREF_OP(tree) || + (tree->opval.op == '&' && !tree->right) || tree->opval.op == PTR_OP) { lvaluereq++; left = operandFromAst(tree->left); @@ -2800,7 +2759,8 @@ operand *ast2iCode (ast *tree) } else { left = operandFromAst(tree->left); } - if (tree->opval.op == INC_OP || tree->opval.op == DEC_OP) { + if (tree->opval.op == INC_OP || + tree->opval.op == DEC_OP) { lvaluereq++; right= operandFromAst(tree->right); lvaluereq--; @@ -2814,8 +2774,11 @@ operand *ast2iCode (ast *tree) switch (tree->opval.op) { case '[' : /* array operation */ - left= geniCodeRValue (left,FALSE); - right=geniCodeRValue (right,TRUE); + { + link *ltype = operandType(left); + left= geniCodeRValue (left,IS_PTR(ltype->next) ? TRUE : FALSE); + right=geniCodeRValue (right,TRUE); + } return geniCodeArray (left,right);