X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2FSDCCpeeph.c;h=37e349c6853d1ae6ec8b841d96818e1617507cc3;hb=9eef7e171f6502fbd097e8242347883290eed89c;hp=dfd7d84cd3372d46ed12da9582c7ee56fdc53d68;hpb=8fca63fbcde6e36936906190fa8e41f072a69e34;p=fw%2Fsdcc diff --git a/src/SDCCpeeph.c b/src/SDCCpeeph.c index dfd7d84c..37e349c6 100644 --- a/src/SDCCpeeph.c +++ b/src/SDCCpeeph.c @@ -66,7 +66,7 @@ pcDistance (lineNode * cpos, char *lbl, bool back) char buff[MAX_PATTERN_LEN]; int dist = 0; - sprintf (buff, "%s:", lbl); + SNPRINTF (buff, sizeof(buff), "%s:", lbl); while (pl) { @@ -175,6 +175,190 @@ FBYNAME (operandsNotSame) return TRUE; } +/*-----------------------------------------------------------------*/ +/* operandsNotSame3- check if any pair of %1,%2,%3 are the same */ +/*-----------------------------------------------------------------*/ +FBYNAME (operandsNotSame3) +{ + char *op1 = hTabItemWithKey (vars, 1); + char *op2 = hTabItemWithKey (vars, 2); + char *op3 = hTabItemWithKey (vars, 3); + + if ( (strcmp (op1, op2) == 0) || + (strcmp (op1, op3) == 0) || + (strcmp (op2, op3) == 0) ) + return FALSE; + else + return TRUE; +} + +/*-----------------------------------------------------------------*/ +/* operandsNotSame4- check if any pair of %1,%2,%3,.. are the same */ +/*-----------------------------------------------------------------*/ +FBYNAME (operandsNotSame4) +{ + char *op1 = hTabItemWithKey (vars, 1); + char *op2 = hTabItemWithKey (vars, 2); + char *op3 = hTabItemWithKey (vars, 3); + char *op4 = hTabItemWithKey (vars, 4); + + if ( (strcmp (op1, op2) == 0) || + (strcmp (op1, op3) == 0) || + (strcmp (op1, op4) == 0) || + (strcmp (op2, op3) == 0) || + (strcmp (op2, op4) == 0) || + (strcmp (op3, op4) == 0) ) + return FALSE; + else + return TRUE; +} + +/*-----------------------------------------------------------------*/ +/* operandsNotSame5- check if any pair of %1,%2,%3,.. are the same */ +/*-----------------------------------------------------------------*/ +FBYNAME (operandsNotSame5) +{ + char *op1 = hTabItemWithKey (vars, 1); + char *op2 = hTabItemWithKey (vars, 2); + char *op3 = hTabItemWithKey (vars, 3); + char *op4 = hTabItemWithKey (vars, 4); + char *op5 = hTabItemWithKey (vars, 5); + + if ( (strcmp (op1, op2) == 0) || + (strcmp (op1, op3) == 0) || + (strcmp (op1, op4) == 0) || + (strcmp (op1, op5) == 0) || + (strcmp (op2, op3) == 0) || + (strcmp (op2, op4) == 0) || + (strcmp (op2, op5) == 0) || + (strcmp (op3, op4) == 0) || + (strcmp (op3, op5) == 0) || + (strcmp (op4, op5) == 0) ) + return FALSE; + else + return TRUE; +} + +/*-----------------------------------------------------------------*/ +/* operandsNotSame6- check if any pair of %1,%2,%3,.. are the same */ +/*-----------------------------------------------------------------*/ +FBYNAME (operandsNotSame6) +{ + char *op1 = hTabItemWithKey (vars, 1); + char *op2 = hTabItemWithKey (vars, 2); + char *op3 = hTabItemWithKey (vars, 3); + char *op4 = hTabItemWithKey (vars, 4); + char *op5 = hTabItemWithKey (vars, 5); + char *op6 = hTabItemWithKey (vars, 6); + + if ( (strcmp (op1, op2) == 0) || + (strcmp (op1, op3) == 0) || + (strcmp (op1, op4) == 0) || + (strcmp (op1, op5) == 0) || + (strcmp (op1, op6) == 0) || + (strcmp (op2, op3) == 0) || + (strcmp (op2, op4) == 0) || + (strcmp (op2, op5) == 0) || + (strcmp (op2, op6) == 0) || + (strcmp (op3, op4) == 0) || + (strcmp (op3, op5) == 0) || + (strcmp (op3, op6) == 0) || + (strcmp (op4, op5) == 0) || + (strcmp (op4, op6) == 0) || + (strcmp (op5, op6) == 0) ) + return FALSE; + else + return TRUE; +} + + +/*-----------------------------------------------------------------*/ +/* operandsNotSame7- check if any pair of %1,%2,%3,.. are the same */ +/*-----------------------------------------------------------------*/ +FBYNAME (operandsNotSame7) +{ + char *op1 = hTabItemWithKey (vars, 1); + char *op2 = hTabItemWithKey (vars, 2); + char *op3 = hTabItemWithKey (vars, 3); + char *op4 = hTabItemWithKey (vars, 4); + char *op5 = hTabItemWithKey (vars, 5); + char *op6 = hTabItemWithKey (vars, 6); + char *op7 = hTabItemWithKey (vars, 7); + + if ( (strcmp (op1, op2) == 0) || + (strcmp (op1, op3) == 0) || + (strcmp (op1, op4) == 0) || + (strcmp (op1, op5) == 0) || + (strcmp (op1, op6) == 0) || + (strcmp (op1, op7) == 0) || + (strcmp (op2, op3) == 0) || + (strcmp (op2, op4) == 0) || + (strcmp (op2, op5) == 0) || + (strcmp (op2, op6) == 0) || + (strcmp (op2, op7) == 0) || + (strcmp (op3, op4) == 0) || + (strcmp (op3, op5) == 0) || + (strcmp (op3, op6) == 0) || + (strcmp (op3, op7) == 0) || + (strcmp (op4, op5) == 0) || + (strcmp (op4, op6) == 0) || + (strcmp (op4, op7) == 0) || + (strcmp (op5, op6) == 0) || + (strcmp (op5, op7) == 0) || + (strcmp (op6, op7) == 0) ) + return FALSE; + else + return TRUE; +} + +/*-----------------------------------------------------------------*/ +/* operandsNotSame8- check if any pair of %1,%2,%3,.. are the same */ +/*-----------------------------------------------------------------*/ +FBYNAME (operandsNotSame8) +{ + char *op1 = hTabItemWithKey (vars, 1); + char *op2 = hTabItemWithKey (vars, 2); + char *op3 = hTabItemWithKey (vars, 3); + char *op4 = hTabItemWithKey (vars, 4); + char *op5 = hTabItemWithKey (vars, 5); + char *op6 = hTabItemWithKey (vars, 6); + char *op7 = hTabItemWithKey (vars, 7); + char *op8 = hTabItemWithKey (vars, 8); + + if ( (strcmp (op1, op2) == 0) || + (strcmp (op1, op3) == 0) || + (strcmp (op1, op4) == 0) || + (strcmp (op1, op5) == 0) || + (strcmp (op1, op6) == 0) || + (strcmp (op1, op7) == 0) || + (strcmp (op1, op8) == 0) || + (strcmp (op2, op3) == 0) || + (strcmp (op2, op4) == 0) || + (strcmp (op2, op5) == 0) || + (strcmp (op2, op6) == 0) || + (strcmp (op2, op7) == 0) || + (strcmp (op2, op8) == 0) || + (strcmp (op3, op4) == 0) || + (strcmp (op3, op5) == 0) || + (strcmp (op3, op6) == 0) || + (strcmp (op3, op7) == 0) || + (strcmp (op3, op8) == 0) || + (strcmp (op4, op5) == 0) || + (strcmp (op4, op6) == 0) || + (strcmp (op4, op7) == 0) || + (strcmp (op4, op8) == 0) || + (strcmp (op5, op6) == 0) || + (strcmp (op5, op7) == 0) || + (strcmp (op5, op8) == 0) || + (strcmp (op6, op7) == 0) || + (strcmp (op6, op8) == 0) || + (strcmp (op7, op8) == 0) ) + return FALSE; + else + return TRUE; +} + + /* labelRefCount: * takes two parameters: a variable (bound to a label name) @@ -270,6 +454,30 @@ callFuncByName (char *fname, "operandsNotSame", operandsNotSame } , + { + "operandsNotSame3", operandsNotSame3 + } + , + { + "operandsNotSame4", operandsNotSame4 + } + , + { + "operandsNotSame5", operandsNotSame5 + } + , + { + "operandsNotSame6", operandsNotSame6 + } + , + { + "operandsNotSame7", operandsNotSame7 + } + , + { + "operandsNotSame8", operandsNotSame8 + } + , { "24bitMode", flat24bitMode } @@ -289,16 +497,40 @@ callFuncByName (char *fname, "24bitModeAndPortDS390", flat24bitModeAndPortDS390 } }; - int i; + int i; + char *cmdCopy, *funcName, *funcArgs; + int rc = -1; + + /* Isolate the function name part (we are passed the full condition + * string including arguments) + */ + cmdCopy = Safe_strdup(fname); + funcName = strtok(cmdCopy, " \t"); + funcArgs = strtok(NULL, ""); - for (i = 0; i < ((sizeof (ftab)) / (sizeof (struct ftab))); i++) - if (strncmp (ftab[i].fname, fname, strlen (ftab[i].fname)) == 0) - { - return (*ftab[i].func) (vars, currPl, head, - fname + strlen (ftab[i].fname)); - } - fprintf (stderr, "could not find named function in function table\n"); - return TRUE; + for (i = 0; i < ((sizeof (ftab)) / (sizeof (struct ftab))); i++) + { + if (strcmp (ftab[i].fname, funcName) == 0) + { + rc = (*ftab[i].func) (vars, currPl, head, + funcArgs); + } + } + + Safe_free(cmdCopy); + + if (rc == -1) + { + fprintf (stderr, + "could not find named function \"%s\" in " + "peephole function table\n", + funcName); + // If the function couldn't be found, let's assume it's + // a bad rule and refuse it. + rc = FALSE; + } + + return rc; } /*-----------------------------------------------------------------*/ @@ -346,8 +578,7 @@ newPeepRule (lineNode * match, if (cond && *cond) { - pr->cond = Safe_alloc ( strlen (cond) + 1); - strcpy (pr->cond, cond); + pr->cond = Safe_strdup (cond); } else pr->cond = NULL; @@ -372,8 +603,7 @@ newLineNode (char *line) lineNode *pl; pl = Safe_alloc ( sizeof (lineNode)); - pl->line = Safe_alloc ( strlen (line) + 1); - strcpy (pl->line, line); + pl->line = Safe_strdup (line); return pl; } @@ -600,6 +830,8 @@ bindVar (int key, char **s, hTab ** vtab) if (*vvx == ')') ubb--; } + // include the trailing ')' + *vv++ = *vvx++; } else *vv++ = *vvx++; @@ -607,8 +839,7 @@ bindVar (int key, char **s, hTab ** vtab) *s = vvx; *vv = '\0'; /* got value */ - vvx = traceAlloc (&_G.values, Safe_alloc(strlen (vval) + 1)); - strcpy (vvx, vval); + vvx = traceAlloc (&_G.values, Safe_strdup(vval)); hTabAddItem (vtab, key, vvx); } @@ -834,8 +1065,7 @@ replaceRule (lineNode ** shead, lineNode * stail, peepRule * pr) (*shead)->prev->next = lhead; lhead->prev = (*shead)->prev; } - else - *shead = lhead; + *shead = lhead; /* now for the tail */ if (stail && stail->next) { @@ -1009,6 +1239,12 @@ peepHole (lineNode ** pls) lineNode *mtail = NULL; bool restart; +#if !OPT_DISABLE_PIC + /* The PIC port uses a different peep hole optimizer based on "pCode" */ + if (TARGET_IS_PIC) + return; +#endif + assert(labelHash == NULL); do @@ -1097,12 +1333,11 @@ readFileIntoBuffer (char *fname) if (rs) { rs = Safe_realloc (rs, strlen (rs) + strlen (lb) + 1); - strcat (rs, lb); + strncatz (rs, lb, strlen (rs) + strlen (lb) + 1); } else { - rs = Safe_alloc ( strlen (lb) + 1); - strcpy (rs, lb); + rs = Safe_strdup (lb); } nch = 0; } @@ -1116,12 +1351,11 @@ readFileIntoBuffer (char *fname) if (rs) { rs = Safe_realloc (rs, strlen (rs) + strlen (lb) + 1); - strcat (rs, lb); + strncatz (rs, lb, strlen (rs) + strlen (lb) + 1); } else { - rs = Safe_alloc ( strlen (lb) + 1); - strcpy (rs, lb); + rs = Safe_strdup (lb); } } return rs;