-------------------------------------------------------------------------*/
#include "common.h"
-#include "newalloc.h"
int currLineno = 0;
set *astList = NULL;
#define ALLOCATE 1
#define DEALLOCATE 2
-char buffer[1024];
int noLineno = 0;
int noAlloc = 0;
symbol *currFunc;
ast *optimizeRRCRLC (ast *);
ast *optimizeGetHbit (ast *);
ast *backPatchLabels (ast *, symbol *, symbol *);
+void PA(ast *t);
int inInitMode = 0;
memmap *GcurMemmap=NULL; /* points to the memmap that's currently active */
FILE *codeOutFile;
ast *ex;
static int oldLineno = 0;
- Safe_calloc (1, ex, sizeof (ast));
+ ex = Safe_alloc ( sizeof (ast));
ex->type = type;
ex->lineno = (noLineno ? oldLineno : yylineno);
ast *ex;
static int oldLineno = 0;
- ex = Safe_calloc (1, sizeof (ast));
+ ex = Safe_alloc ( sizeof (ast));
ex->type = type;
ex->lineno = (noLineno ? oldLineno : yylineno);
break;
case INLINEASM:
- dest->values.inlineasm = Safe_calloc (1, strlen (src->values.inlineasm) + 1);
+ dest->values.inlineasm = Safe_alloc (strlen (src->values.inlineasm) + 1);
strcpy (dest->values.inlineasm, src->values.inlineasm);
break;
if (!src)
return NULL;
- dest = Safe_calloc (1, sizeof (ast));
+ dest = Safe_alloc ( sizeof (ast));
dest->type = src->type;
dest->lineno = src->lineno;
dest->level = src->level;
dest->funcName = src->funcName;
- dest->argSym = src->argSym;
+
+ if (src->ftype)
+ dest->etype = getSpec (dest->ftype = copyLinkChain (src->ftype));
/* if this is a leaf */
/* if value */
/* if this is a node that has special values */
copyAstValues (dest, src);
- if (src->ftype)
- dest->etype = getSpec (dest->ftype = copyLinkChain (src->ftype));
-
dest->trueLabel = copySymbol (src->trueLabel);
dest->falseLabel = copySymbol (src->falseLabel);
dest->left = copyAst (src->left);
tree->opval.val->etype = tree->opval.val->etype;
tree->opval.val->type = tree->opval.val->sym->type;
werror (W_IMPLICIT_FUNC, tree->opval.val->sym->name);
+ allocVariables (tree->opval.val->sym);
}
else
{
/* create the symbol */
sym = newSymbol (name, 0);
+ /* setup return value */
+ sym->type = newLink ();
+ DCL_TYPE (sym->type) = FUNCTION;
+ sym->type->next = copyLinkChain (type);
+ sym->etype = getSpec (sym->type);
+ FUNC_ISREENT(sym->type) = rent;
+
/* if arguments required */
if (nArgs)
{
-
value *args;
- args = sym->args = newValue ();
+ args = FUNC_ARGS(sym->type) = newValue ();
while (nArgs--)
{
}
}
- /* setup return value */
- sym->type = newLink ();
- DCL_TYPE (sym->type) = FUNCTION;
- sym->type->next = copyLinkChain (type);
- sym->etype = getSpec (sym->type);
- SPEC_RENT (sym->etype) = rent;
-
/* save it */
addSymChain (sym);
sym->cdef = 1;
/*-----------------------------------------------------------------*/
int
processParms (ast * func,
- value * defParm,
+ value *defParm,
ast * actParm,
- int *parmNumber,
+ int *parmNumber, // unused, although updated
bool rightmost)
{
- sym_link *fetype = func->etype;
-
/* if none of them exist */
if (!defParm && !actParm)
return 0;
if (defParm) {
if (getenv("DEBUG_SANITY")) {
- fprintf (stderr, "addSym: %s ", defParm->name);
+ fprintf (stderr, "processParms: %s ", defParm->name);
}
/* make sure the type is complete and sane */
checkTypeSanity(defParm->etype, defParm->name);
/* if the function is being called via a pointer & */
/* it has not been defined a reentrant then we cannot */
/* have parameters */
- if (func->type != EX_VALUE && !IS_RENT (fetype) && !options.stackAuto)
+ if (func->type != EX_VALUE && !IFFUNC_ISREENT (func->ftype) && !options.stackAuto)
{
- werror (E_NONRENT_ARGS);
+ werror (W_NONRENT_ARGS);
return 1;
}
/* if defined parameters ended but actual parameters */
/* exist and this is not defined as a variable arg */
- /* also check if statckAuto option is specified */
- if ((!defParm) && actParm && (!func->hasVargs) &&
- !options.stackAuto && !IS_RENT (fetype))
+ if (!defParm && actParm && !IFFUNC_HASVARARGS(func->ftype))
{
werror (E_TOO_MANY_PARMS);
return 1;
return 1;
}
+ if (IS_VOID(actParm->ftype)) {
+ werror (E_VOID_VALUE_USED);
+ return 1;
+ }
+
/* If this is a varargs function... */
- if (!defParm && actParm && func->hasVargs)
+ if (!defParm && actParm && IFFUNC_HASVARARGS(func->ftype))
{
ast *newType = NULL;
sym_link *ftype;
if (newType)
{
/* cast required; change this op to a cast. */
- ast *parmCopy = resolveSymbols (copyAst (actParm));
+ ast *parmCopy = decorateType(resolveSymbols (copyAst (actParm)));
actParm->type = EX_OP;
actParm->opval.op = CAST;
}
/* if defined parameters ended but actual has not & */
- /* stackAuto */
+ /* reentrant */
if (!defParm && actParm &&
- (options.stackAuto || IS_RENT (fetype)))
+ (options.stackAuto || IFFUNC_ISREENT (func->ftype)))
return 0;
resolveSymbols (actParm);
}
/* the parameter type must be at least castable */
- if (compareType (defParm->type, actParm->ftype) == 0)
- {
- werror (E_TYPE_MISMATCH_PARM, *parmNumber);
- werror (E_CONTINUE, "defined type ");
- printTypeChain (defParm->type, stderr);
- fprintf (stderr, "\n");
- werror (E_CONTINUE, "actual type ");
- printTypeChain (actParm->ftype, stderr);
- fprintf (stderr, "\n");
- }
+ if (compareType (defParm->type, actParm->ftype) == 0) {
+ werror (E_INCOMPAT_TYPES);
+ printFromToType (actParm->ftype, defParm->type);
+ return 1;
+ }
/* if the parameter is castable then add the cast */
if (compareType (defParm->type, actParm->ftype) < 0)
{
- ast *pTree = resolveSymbols (copyAst (actParm));
+ ast *pTree = decorateType(resolveSymbols (copyAst (actParm)));
/* now change the current one to a cast */
actParm->type = EX_OP;
actParm->right = pTree;
actParm->etype = defParm->etype;
actParm->ftype = defParm->type;
+ actParm->decorated=0; /* force typechecking */
+ decorateType (actParm);
}
-/* actParm->argSym = resolveFromTable(defParm)->sym ; */
-
- actParm->argSym = defParm->sym;
/* make a copy and change the regparm type to the defined parm */
actParm->etype = getSpec (actParm->ftype = copyLinkChain (actParm->ftype));
SPEC_REGPARM (actParm->etype) = SPEC_REGPARM (defParm->etype);
createIvalStruct (ast * sym, sym_link * type, initList * ilist)
{
ast *rast = NULL;
+ ast *lAst;
symbol *sflds;
initList *iloop;
for (; sflds; sflds = sflds->next, iloop = (iloop ? iloop->next : NULL))
{
- ast *lAst;
-
/* if we have come to end */
if (!iloop)
break;
/* if type is SPECIFIER */
if (IS_SPEC (type))
rast = createIvalType (sym, type, ilist);
+
if (wid)
return decorateType (resolveSymbols (newNode (NULLOP, wid, rast)));
else
/*-----------------------------------------------------------------*/
/* initAggregates - initialises aggregate variables with initv */
/*-----------------------------------------------------------------*/
-ast *
-initAggregates (symbol * sym, initList * ival, ast * wid)
-{
+
+/* this has to go */ void printIval (symbol *, sym_link *, initList *, FILE *);
+
+ast * initAggregates (symbol * sym, initList * ival, ast * wid) {
+ ast *ast;
+ symbol *newSym;
+
+ if (getenv("TRY_THE_NEW_INITIALIZER")) {
+
+ if (!TARGET_IS_MCS51 || !(options.model==MODEL_LARGE)) {
+ fprintf (stderr, "Can't \"TRY_THE_NEW_INITIALIZER\" unless "
+ "with -mmcs51 and --model-large\n");
+ exit(404);
+ }
+
+ if (SPEC_OCLS(sym->etype)==xdata &&
+ getSize(sym->type) > 16) { // else it isn't worth it: do it the old way
+
+ // copy this symbol
+ newSym=copySymbol (sym);
+ SPEC_OCLS(newSym->etype)=code;
+ sprintf (newSym->name, "%s_init__", sym->name);
+ sprintf (newSym->rname,"%s_init__", sym->rname);
+ addSym (SymbolTab, newSym, newSym->name, 0, 0, 1);
+
+ // emit it in the static segment
+ addSet(&statsg->syms, newSym);
+
+ // now memcpy() the entire array from cseg
+ ast=newNode (ARRAYINIT, // ASSIGN_AGGREGATE
+ newAst_VALUE (symbolVal (sym)),
+ newAst_VALUE (symbolVal (newSym)));
+ return decorateType(resolveSymbols(ast));
+ }
+ }
+
return createIval (newAst_VALUE (symbolVal (sym)), sym->type, ival, wid);
}
/* insert the symbol into the symbol table */
/* with level = 0 & name = rname */
newSym = copySymbol (sym);
- addSym (SymbolTab, newSym, newSym->name, 0, 0, 1);
+ addSym (SymbolTab, newSym, newSym->rname, 0, 0, 1);
/* now lift the code to main */
if (IS_AGGREGATE (sym->type))
if (action == ALLOCATE)
{
- autoInit = gatherAutoInit (tree->values.sym);
*stack += allocVariables (tree->values.sym);
+ autoInit = gatherAutoInit (tree->values.sym);
/* if there are auto inits then do them */
if (autoInit)
/*-----------------------------------------------------------------*/
/* constExprValue - returns the value of a constant expression */
+/* or NULL if it is not a constant expression */
/*-----------------------------------------------------------------*/
value *
constExprValue (ast * cexpr, int check)
else
return FALSE;
}
-
+
return astHasSymbol (tree->left, sym) ||
astHasSymbol (tree->right, sym);
}
+/*-----------------------------------------------------------------*/
+/* astHasDeref - return true if the ast has an indirect access */
+/*-----------------------------------------------------------------*/
+static bool
+astHasDeref (ast * tree)
+{
+ if (!tree || IS_AST_LINK (tree) || IS_AST_VALUE(tree))
+ return FALSE;
+
+ if (tree->opval.op == '*' && tree->right == NULL) return TRUE;
+
+ return astHasDeref (tree->left) || astHasDeref (tree->right);
+}
+
/*-----------------------------------------------------------------*/
/* isConformingBody - the loop body has to conform to a set of rules */
/* for the loop to be considered reversible read on for rules */
if (astHasVolatile (pbody->left))
return FALSE;
+
+ if (astHasDeref(pbody->right)) return FALSE;
return isConformingBody (pbody->left, sym, body) &&
isConformingBody (pbody->right, sym, body);
#endif
-/*-----------------------------------------------------------------*/
-/* Given an assignment operation in a tree, determine if the LHS */
-/* (the result) has a different (integer) type than the RHS. */
-/* If so, walk the RHS and add a typecast to the type of the LHS */
-/* to all leaf nodes. */
-/*-----------------------------------------------------------------*/
-void
-propAsgType (ast * tree)
-{
-#ifdef DEMAND_INTEGER_PROMOTION
- if (!IS_INTEGRAL (LTYPE (tree)) || !IS_INTEGRAL (RTYPE (tree)))
- {
- /* Nothing to do here... */
- return;
- }
-
- if (getSize (LTYPE (tree)) > getSize (RTYPE (tree)))
- {
- pushTypeCastToLeaves (LTYPE (tree), tree->right, &(tree->right));
- }
-#else
- (void) tree;
-#endif
-}
-
/*-----------------------------------------------------------------*/
/* decorateType - compute type for this tree also does type cheking */
/* this is done bottom up, since type have to flow upwards */
/* otherwise just copy the type information */
COPYTYPE (TTYPE (tree), TETYPE (tree), tree->opval.val->type);
- if (funcInChain (tree->opval.val->type))
- {
- tree->hasVargs = tree->opval.val->sym->hasVargs;
- tree->args = copyValueChain (tree->opval.val->sym->args);
- }
return tree;
}
/* and mark it as referenced */
tree->opval.val->sym->isref = 1;
- /* if this is of type function or function pointer */
- if (funcInChain (tree->opval.val->type))
- {
- tree->hasVargs = tree->opval.val->sym->hasVargs;
- tree->args = copyValueChain (tree->opval.val->sym->args);
-
- }
}
}
}
switch (tree->opval.op)
{
-/*------------------------------------------------------------------*/
-/*----------------------------*/
- /* array node */
-/*----------------------------*/
+ /*------------------------------------------------------------------*/
+ /*----------------------------*/
+ /* array node */
+ /*----------------------------*/
case '[':
/* determine which is the array & which the index */
}
return tree;
-/*------------------------------------------------------------------*/
-/*----------------------------*/
+ /*------------------------------------------------------------------*/
+ /*----------------------------*/
/* struct/union */
-/*----------------------------*/
+ /*----------------------------*/
case '.':
/* if this is not a structure */
if (!IS_STRUCT (LTYPE (tree)))
}
TTYPE (tree) = structElemType (LTYPE (tree),
(tree->right->type == EX_VALUE ?
- tree->right->opval.val : NULL), &tree->args);
+ tree->right->opval.val : NULL));
TETYPE (tree) = getSpec (TTYPE (tree));
return tree;
-/*------------------------------------------------------------------*/
-/*----------------------------*/
+ /*------------------------------------------------------------------*/
+ /*----------------------------*/
/* struct/union pointer */
-/*----------------------------*/
+ /*----------------------------*/
case PTR_OP:
/* if not pointer to a structure */
if (!IS_PTR (LTYPE (tree)))
TTYPE (tree) = structElemType (LTYPE (tree)->next,
(tree->right->type == EX_VALUE ?
- tree->right->opval.val : NULL), &tree->args);
+ tree->right->opval.val : NULL));
TETYPE (tree) = getSpec (TTYPE (tree));
return tree;
{
sym_link *ltc = (tree->right ? RTYPE (tree) : LTYPE (tree));
COPYTYPE (TTYPE (tree), TETYPE (tree), ltc);
- if (!tree->initMode && IS_CONSTANT (TETYPE (tree)))
+ if (!tree->initMode && IS_CONSTANT(TETYPE(tree)))
werror (E_CODE_WRITE, "++/--");
if (tree->right)
if (!IS_INTEGRAL (LTYPE (tree)) || !IS_INTEGRAL (RTYPE (tree)))
{
werror (E_BITWISE_OP);
- werror (E_CONTINUE, "left & right types are ");
+ werror (W_CONTINUE, "left & right types are ");
printTypeChain (LTYPE (tree), stderr);
fprintf (stderr, ",");
printTypeChain (RTYPE (tree), stderr);
/* if bit field then error */
if (IS_BITVAR (tree->left->etype))
{
- werror (E_ILLEGAL_ADDR, "addrress of bit variable");
+ werror (E_ILLEGAL_ADDR, "address of bit variable");
goto errorTreeReturn;
}
goto errorTreeReturn;
}
- if (LRVAL (tree))
+ if (IS_LITERAL(LTYPE(tree)))
+ {
+ werror (E_ILLEGAL_ADDR, "address of literal");
+ goto errorTreeReturn;
+ }
+
+ if (LRVAL (tree))
{
werror (E_LVALUE_REQUIRED, "address of");
goto errorTreeReturn;
if (!IS_INTEGRAL (LTYPE (tree)) || !IS_INTEGRAL (RTYPE (tree)))
{
werror (E_BITWISE_OP);
- werror (E_CONTINUE, "left & right types are ");
+ werror (W_CONTINUE, "left & right types are ");
printTypeChain (LTYPE (tree), stderr);
fprintf (stderr, ",");
printTypeChain (RTYPE (tree), stderr);
if (!IS_INTEGRAL (LTYPE (tree)) || !IS_INTEGRAL (RTYPE (tree)))
{
werror (E_BITWISE_OP);
- werror (E_CONTINUE, "left & right types are ");
+ werror (W_CONTINUE, "left & right types are ");
printTypeChain (LTYPE (tree), stderr);
fprintf (stderr, ",");
printTypeChain (RTYPE (tree), stderr);
}
TTYPE (tree) = copyLinkChain ((IS_PTR (LTYPE (tree)) || IS_ARRAY (LTYPE (tree))) ?
LTYPE (tree)->next : NULL);
- TETYPE (tree) = getSpec (TTYPE (tree));
- tree->args = tree->left->args;
- tree->hasVargs = tree->left->hasVargs;
+ TETYPE (tree) = getSpec (TTYPE (tree));
SPEC_CONST (TETYPE (tree)) = DCL_PTR_CONST (LTYPE(tree));
return tree;
}
if (!IS_INTEGRAL (LTYPE (tree)) || !IS_INTEGRAL (tree->left->etype))
{
werror (E_SHIFT_OP_INVALID);
- werror (E_CONTINUE, "left & right types are ");
+ werror (W_CONTINUE, "left & right types are ");
printTypeChain (LTYPE (tree), stderr);
fprintf (stderr, ",");
printTypeChain (RTYPE (tree), stderr);
}
return tree;
-/*------------------------------------------------------------------*/
-/*----------------------------*/
+ /*------------------------------------------------------------------*/
+ /*----------------------------*/
/* casting */
-/*----------------------------*/
+ /*----------------------------*/
case CAST: /* change the type */
/* cannot cast to an aggregate type */
if (IS_AGGREGATE (LTYPE (tree)))
/* make sure the type is complete and sane */
checkTypeSanity(LETYPE(tree), "(cast)");
+#if 0
/* if the right is a literal replace the tree */
- if (IS_LITERAL (RETYPE (tree)) && !IS_PTR (LTYPE (tree)))
- {
- tree->type = EX_VALUE;
- tree->opval.val =
- valCastLiteral (LTYPE (tree),
- floatFromVal (valFromType (RETYPE (tree))));
- tree->left = NULL;
- tree->right = NULL;
- TTYPE (tree) = tree->opval.val->type;
- tree->values.literalFromCast = 1;
- }
- else
- {
- TTYPE (tree) = LTYPE (tree);
- LRVAL (tree) = 1;
- }
-
+ if (IS_LITERAL (RETYPE (tree))) {
+ if (!IS_PTR (LTYPE (tree))) {
+ tree->type = EX_VALUE;
+ tree->opval.val =
+ valCastLiteral (LTYPE (tree),
+ floatFromVal (valFromType (RETYPE (tree))));
+ tree->left = NULL;
+ tree->right = NULL;
+ TTYPE (tree) = tree->opval.val->type;
+ tree->values.literalFromCast = 1;
+ } else if (IS_GENPTR(LTYPE(tree)) && !IS_PTR(RTYPE(tree)) &&
+ ((int)floatFromVal(valFromType(RETYPE(tree)))) !=0 ) /* special case of NULL */ {
+ sym_link *rest = LTYPE(tree)->next;
+ werror(W_LITERAL_GENERIC);
+ TTYPE(tree) = newLink();
+ DCL_TYPE(TTYPE(tree)) = FPOINTER;
+ TTYPE(tree)->next = rest;
+ tree->left->opval.lnk = TTYPE(tree);
+ LRVAL (tree) = 1;
+ } else {
+ TTYPE (tree) = LTYPE (tree);
+ LRVAL (tree) = 1;
+ }
+ } else {
+ TTYPE (tree) = LTYPE (tree);
+ LRVAL (tree) = 1;
+ }
+#else
+ /* if pointer to struct then check names */
+ if (IS_PTR(LTYPE(tree)) && IS_STRUCT(LTYPE(tree)->next) &&
+ IS_PTR(RTYPE(tree)) && IS_STRUCT(RTYPE(tree)->next) &&
+ strcmp(SPEC_STRUCT(LETYPE(tree))->tag,SPEC_STRUCT(RETYPE(tree))->tag)) {
+ werror(W_CAST_STRUCT_PTR,SPEC_STRUCT(RETYPE(tree))->tag,SPEC_STRUCT(LETYPE(tree))->tag);
+ }
+ /* if the right is a literal replace the tree */
+ if (IS_LITERAL (RETYPE (tree)) && !IS_PTR (LTYPE (tree))) {
+ tree->type = EX_VALUE;
+ tree->opval.val =
+ valCastLiteral (LTYPE (tree),
+ floatFromVal (valFromType (RETYPE (tree))));
+ tree->left = NULL;
+ tree->right = NULL;
+ TTYPE (tree) = tree->opval.val->type;
+ tree->values.literalFromCast = 1;
+ } else {
+ TTYPE (tree) = LTYPE (tree);
+ LRVAL (tree) = 1;
+ }
+#endif
TETYPE (tree) = getSpec (TTYPE (tree));
return tree;
tree->opval.val->type);
return tree;
-/*------------------------------------------------------------------*/
-/*----------------------------*/
+ /*------------------------------------------------------------------*/
+ /*----------------------------*/
/* conditional operator '?' */
-/*----------------------------*/
+ /*----------------------------*/
case '?':
/* the type is value of the colon operator (on the right) */
assert(IS_COLON_OP(tree->right));
- TTYPE (tree) = RTYPE(tree); // #HACK LTYPE(tree).
- TETYPE (tree) = getSpec (TTYPE (tree));
+ /* if already known then replace the tree : optimizer will do it
+ but faster to do it here */
+ if (IS_LITERAL (LTYPE(tree))) {
+ if ( ((int) floatFromVal (valFromType (LETYPE (tree)))) != 0) {
+ return tree->right->left ;
+ } else {
+ return tree->right->right ;
+ }
+ } else {
+ TTYPE (tree) = RTYPE(tree); // #HACK LTYPE(tree).
+ TETYPE (tree) = getSpec (TTYPE (tree));
+ }
return tree;
case ':':
}
LLVAL (tree) = 1;
- propAsgType (tree);
-
return tree;
case AND_ASSIGN:
}
LLVAL (tree) = 1;
- propAsgType (tree);
-
return tree;
/*------------------------------------------------------------------*/
}
LLVAL (tree) = 1;
- propAsgType (tree);
-
return tree;
/*------------------------------------------------------------------*/
tree->right = decorateType (newNode ('+', copyAst (tree->left), tree->right));
tree->opval.op = '=';
- propAsgType (tree);
-
return tree;
/*------------------------------------------------------------------*/
if (IS_VOID (LTYPE (tree)))
{
werror (E_CAST_ZERO);
- fprintf (stderr, "type --> '");
- printTypeChain (RTYPE (tree), stderr);
- fprintf (stderr, "' ");
- fprintf (stderr, "assigned to type --> '");
- printTypeChain (LTYPE (tree), stderr);
- fprintf (stderr, "'\n");
- }
-
- /* extra checks for pointer types */
- if (IS_PTR (LTYPE (tree)) && IS_PTR (RTYPE (tree)) &&
- !IS_GENPTR (LTYPE (tree)))
- {
- if (DCL_TYPE (LTYPE (tree)) != DCL_TYPE (RTYPE (tree)))
- werror (W_PTR_ASSIGN);
+ printFromToType(RTYPE(tree), LTYPE(tree));
}
TETYPE (tree) = getSpec (TTYPE (tree) =
RRVAL (tree) = 1;
LLVAL (tree) = 1;
if (!tree->initMode ) {
- if (IS_CONSTANT (LETYPE (tree))) {
- werror (E_CODE_WRITE, " ");
- }
+ if ((IS_SPEC(LETYPE(tree)) && IS_CONSTANT (LETYPE (tree))))
+ werror (E_CODE_WRITE, " ");
}
if (LRVAL (tree))
{
goto errorTreeReturn;
}
- propAsgType (tree);
-
return tree;
/*------------------------------------------------------------------*/
parmNumber = 1;
if (processParms (tree->left,
- tree->left->args,
- tree->right, &parmNumber, TRUE))
+ FUNC_ARGS(tree->left->ftype),
+ tree->right, &parmNumber, TRUE)) {
goto errorTreeReturn;
+ }
- if (options.stackAuto || IS_RENT (LETYPE (tree)))
+ if (options.stackAuto || IFFUNC_ISREENT (LTYPE (tree)))
{
- tree->left->args = reverseVal (tree->left->args);
+ //FUNC_ARGS(tree->left->ftype) =
+ //reverseVal (FUNC_ARGS(tree->left->ftype));
reverseParms (tree->right);
}
- tree->args = tree->left->args;
TETYPE (tree) = getSpec (TTYPE (tree) = LTYPE (tree)->next);
return tree;
if (compareType (currFunc->type->next, RTYPE (tree)) == 0)
{
- werror (E_RETURN_MISMATCH);
+ werror (W_RETURN_MISMATCH);
+ printFromToType (RTYPE(tree), currFunc->type->next);
goto errorTreeReturn;
}
/* if there is going to be a casing required then add it */
if (compareType (currFunc->type->next, RTYPE (tree)) < 0)
{
-#if 0 && defined DEMAND_INTEGER_PROMOTION
- if (IS_INTEGRAL (currFunc->type->next))
- {
- pushTypeCastToLeaves (currFunc->type->next, tree->right, &(tree->right));
- }
- else
-#endif
- {
- tree->right =
- decorateType (newNode (CAST,
- newAst_LINK (copyLinkChain (currFunc->type->next)),
- tree->right));
- }
+ tree->right =
+ decorateType (newNode (CAST,
+ newAst_LINK (copyLinkChain (currFunc->type->next)),
+ tree->right));
}
RRVAL (tree) = 1;
symbol *ifTrue, *ifFalse, *ifEnd;
/* if neither exists */
- if (!elseBody && !ifBody)
- return condAst;
+ if (!elseBody && !ifBody) {
+ // if there are no side effects (i++, j() etc)
+ if (!hasSEFcalls(condAst)) {
+ return condAst;
+ }
+ }
/* create the labels */
sprintf (buffer, "_iffalse_%d", Lblnum);
sym_link *fetype;
iCode *piCode = NULL;
+ if (getenv("SDCC_DEBUG_FUNCTION_POINTERS"))
+ fprintf (stderr, "SDCCast.c:createFunction(%s)\n", name->name);
+
/* if check function return 0 then some problem */
- if (checkFunction (name) == 0)
+ if (checkFunction (name, NULL) == 0)
return NULL;
/* create a dummy block if none exists */
}
name->lastLine = yylineno;
currFunc = name;
- processFuncArgs (currFunc, 0);
+
+#if 0 // jwk: this is now done in addDecl()
+ processFuncArgs (currFunc);
+#endif
/* set the stack pointer */
/* PENDING: check this for the mcs51 */
stackPtr = -port->stack.direction * port->stack.call_overhead;
- if (IS_ISR (name->etype))
+ if (IFFUNC_ISISR (name->type))
stackPtr -= port->stack.direction * port->stack.isr_overhead;
- if (IS_RENT (name->etype) || options.stackAuto)
+ if (IFFUNC_ISREENT (name->type) || options.stackAuto)
stackPtr -= port->stack.direction * port->stack.reent_overhead;
xstackPtr = -port->stack.direction * port->stack.call_overhead;
fetype = getSpec (name->type); /* get the specifier for the function */
/* if this is a reentrant function then */
- if (IS_RENT (fetype))
+ if (IFFUNC_ISREENT (name->type))
reentrant++;
- allocParms (name->args); /* allocate the parameters */
+ allocParms (FUNC_ARGS(name->type)); /* allocate the parameters */
/* do processing for parameters that are passed in registers */
- processRegParms (name->args, body);
+ processRegParms (FUNC_ARGS(name->type), body);
/* set the stack pointer */
stackPtr = 0;
body = resolveSymbols (body); /* resolve the symbols */
body = decorateType (body); /* propagateType & do semantic checks */
- ex = newAst_VALUE (symbolVal (name)); /* create name */
+ ex = newAst_VALUE (symbolVal (name)); /* create name */
ex = newNode (FUNCTION, ex, body);
- ex->values.args = name->args;
-
+ ex->values.args = FUNC_ARGS(name->type);
+ ex->decorated=1;
+ if (options.dump_tree) PA(ex);
if (fatalError)
{
werror (E_FUNC_NO_CODE, name->name);
/* dealloc the block variables */
processBlockVars (body, &stack, DEALLOCATE);
/* deallocate paramaters */
- deallocParms (name->args);
+ deallocParms (FUNC_ARGS(name->type));
- if (IS_RENT (fetype))
+ if (IFFUNC_ISREENT (name->type))
reentrant--;
/* we are done freeup memory & cleanup */
noLineno--;
labelKey = 1;
name->key = 0;
- name->fbody = 1;
+ FUNC_HASBODY(name->type) = 1;
addSet (&operKeyReset, name);
applyToSet (operKeyReset, resetParmKey);
}
if (tree->opval.op == FUNCTION) {
- fprintf(outfile,"FUNCTION (%p) type (",tree);
+ int arg=0;
+ value *args=FUNC_ARGS(tree->left->opval.val->type);
+ fprintf(outfile,"FUNCTION (%s=%p) type (",
+ tree->left->opval.val->name, tree);
printTypeChain (tree->ftype,outfile);
+ fprintf(outfile,") args (");
+ do {
+ if (arg) {
+ fprintf (outfile, ", ");
+ }
+ printTypeChain (args ? args->type : NULL, outfile);
+ arg++;
+ args= args ? args->next : NULL;
+ } while (args);
fprintf(outfile,")\n");
- ast_print(tree->left,outfile,indent+4);
- ast_print(tree->right,outfile,indent+4);
+ ast_print(tree->left,outfile,indent);
+ ast_print(tree->right,outfile,indent);
return ;
}
if (tree->opval.op == BLOCK) {
symbol *decls = tree->values.sym;
+ INDENT(indent,outfile);
fprintf(outfile,"{\n");
while (decls) {
INDENT(indent+4,outfile);
- fprintf(outfile,"DECLARE SYMBOL %s, type(",decls->name);
+ fprintf(outfile,"DECLARE SYMBOL (%s=%p) type (",
+ decls->name, decls);
printTypeChain(decls->type,outfile);
fprintf(outfile,")\n");
decls = decls->next;
}
ast_print(tree->right,outfile,indent+4);
+ INDENT(indent,outfile);
fprintf(outfile,"}\n");
return;
}
} else {
fprintf(outfile,"SYMBOL ");
}
- fprintf(outfile,"(%p) name= %s ",tree,tree->opval.val->sym->name);
+ fprintf(outfile,"(%s=%p)",
+ tree->opval.val->sym->name,tree);
}
if (tree->ftype) {
fprintf(outfile," type (");
/* casting */
/*----------------------------*/
case CAST: /* change the type */
- fprintf(outfile,"CAST (%p) type (",tree);
+ fprintf(outfile,"CAST (%p) from type (",tree);
+ printTypeChain(tree->right->ftype,outfile);
+ fprintf(outfile,") to type (");
printTypeChain(tree->ftype,outfile);
fprintf(outfile,")\n");
ast_print(tree->right,outfile,indent+4);
fprintf(outfile,")\n");
ast_print(tree->left,outfile,indent+4);
ast_print(tree->right,outfile,indent+4);
+ return;
case ':':
fprintf(outfile,"COLON(:) (%p) type (",tree);
ast_print(tree->right,outfile,indent+4);
return;
case PARAM:
- fprintf(outfile,"PARM ");
+ fprintf(outfile,"PARMS\n");
ast_print(tree->left,outfile,indent+4);
if (tree->right && !IS_AST_PARAM(tree->right)) {
- fprintf(outfile,"PARM ");
ast_print(tree->right,outfile,indent+4);
}
return ;
/* ifx Statement */
/*----------------------------*/
case IFX:
- ast_print(tree->left,outfile,indent);
- INDENT(indent,outfile);
fprintf(outfile,"IF (%p) \n",tree);
+ ast_print(tree->left,outfile,indent+4);
if (tree->trueLabel) {
INDENT(indent,outfile);
- fprintf(outfile,"NE(==) 0 goto %s\n",tree->trueLabel->name);
+ fprintf(outfile,"NE(!=) 0 goto %s\n",tree->trueLabel->name);
}
if (tree->falseLabel) {
INDENT(indent,outfile);
fprintf(outfile,"EQ(==) 0 goto %s\n",tree->falseLabel->name);
}
- ast_print(tree->right,outfile,indent);
+ ast_print(tree->right,outfile,indent+4);
return ;
/*------------------------------------------------------------------*/
/*----------------------------*/
void PA(ast *t)
{
- ast_print(t,stdout,1);
+ ast_print(t,stdout,0);
}