moved
This commit is contained in:
279
Sapfor/_src/SageAnalysisTool/constanteProp.cpp
Normal file
279
Sapfor/_src/SageAnalysisTool/constanteProp.cpp
Normal file
@@ -0,0 +1,279 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "sage++user.h"
|
||||
#include "definesValues.h"
|
||||
#include "set.h"
|
||||
#include "definitionSet.h"
|
||||
#include "constanteSet.h"
|
||||
|
||||
#ifdef __SPF
|
||||
extern "C" void addToCollection(const int line, const char *file, void *pointer, int type);
|
||||
#endif
|
||||
|
||||
//
|
||||
// Program part for constant propagation.
|
||||
//
|
||||
|
||||
//
|
||||
// Set Operation
|
||||
//
|
||||
int constPropEqual(void *e1, void *e2)
|
||||
{
|
||||
SgExpression *ex1, *ex2;
|
||||
SgSymbol *s1, *s2;
|
||||
PT_CONSTPROP el1, el2;
|
||||
if (!e1 && !e2)
|
||||
return 1;
|
||||
if (!e1 || !e2)
|
||||
return 0;
|
||||
|
||||
el1 = (PT_CONSTPROP)e1;
|
||||
el2 = (PT_CONSTPROP)e2;
|
||||
|
||||
ex1 = el1->var;
|
||||
ex2 = el2->var;
|
||||
|
||||
if ((s1 = ex1->symbol()) && (s2 = ex2->symbol()))
|
||||
{
|
||||
if ((s1 == s2) && (el1->flag == el2->flag) && (el1->value == el2->value))
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void constPropPrint(void *e1)
|
||||
{
|
||||
SgExpression *ex1;
|
||||
PT_CONSTPROP el1;
|
||||
if (!e1)
|
||||
return;
|
||||
el1 = (PT_CONSTPROP)e1;
|
||||
ex1 = el1->var;
|
||||
if (ex1->symbol())
|
||||
{
|
||||
printf("%s (from stmt %d):", ex1->symbol()->identifier(), el1->stmt->lineNumber());
|
||||
switch (el1->flag)
|
||||
{
|
||||
case UNDEFFLAG:
|
||||
printf("undefined\n");
|
||||
break;
|
||||
case NONCONSTFLAG:
|
||||
printf("non constant\n");
|
||||
break;
|
||||
case CONSTFLAG:
|
||||
printf("%d\n", el1->value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
printf("Bizarre\n");
|
||||
}
|
||||
|
||||
//
|
||||
// Here we need th combine operation, combine two elements
|
||||
// return NULL if combine possible
|
||||
//
|
||||
void *
|
||||
constPropCombine(void *e1, void *e2)
|
||||
{
|
||||
SgExpression *ex1, *ex2;
|
||||
SgSymbol *s1, *s2;
|
||||
PT_CONSTPROP el1, el2;
|
||||
|
||||
if (!e1)
|
||||
return e2;
|
||||
if (!e2)
|
||||
return e1;
|
||||
|
||||
el1 = (PT_CONSTPROP)e1;
|
||||
el2 = (PT_CONSTPROP)e2;
|
||||
|
||||
ex1 = el1->var;
|
||||
ex2 = el2->var;
|
||||
|
||||
if ((s1 = ex1->symbol()) && (s2 = ex2->symbol()))
|
||||
{
|
||||
if (s1 == s2)
|
||||
{
|
||||
if (el1->flag == UNDEFFLAG)
|
||||
return e1;
|
||||
if (el2->flag == UNDEFFLAG)
|
||||
return e2;
|
||||
if (el1->flag == NONCONSTFLAG)
|
||||
return e1;
|
||||
if (el2->flag == NONCONSTFLAG)
|
||||
return e2;
|
||||
|
||||
if (el1->value == el2->value)
|
||||
return e1;
|
||||
else
|
||||
{
|
||||
el1->flag = NONCONSTFLAG;
|
||||
return e1;
|
||||
}
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
return NULL;
|
||||
}
|
||||
|
||||
//
|
||||
// this function evaluate the value of the
|
||||
//
|
||||
// some functions from the low_level are used for that function so that Evaluate Expression can use
|
||||
// the value of some variables
|
||||
//
|
||||
|
||||
// extern "C" void resetPresetEvaluate();
|
||||
// extern "C" void addElementEvaluate(...);
|
||||
|
||||
Set *transConstante(SgStatement *func, SgStatement *stmt, Set *setin)
|
||||
{
|
||||
Set *outset;
|
||||
SgExpression *def, *defvar, *expr;
|
||||
SgSymbol *symb;
|
||||
int val;
|
||||
int i;
|
||||
PT_CONSTPROP el = NULL;
|
||||
PT_CONSTPROP el1 = NULL;
|
||||
if (!func || !stmt)
|
||||
{
|
||||
Message("transConstante some parameters are null", 0);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (isSgCallStmt(stmt) || isSgInputOutputStmt(stmt))
|
||||
{
|
||||
if (!setin)
|
||||
return NULL;
|
||||
else
|
||||
{
|
||||
outset = new Set(constPropEqual, constPropCombine, constPropPrint);
|
||||
#ifdef __SPF
|
||||
addToCollection(__LINE__, __FILE__, outset, 1);
|
||||
#endif
|
||||
for (i = 0; i < setin->size(); i++)
|
||||
{
|
||||
el = (PT_CONSTPROP)setin->getElement(i);
|
||||
if (el)
|
||||
{ // create new one otherwise side effect can appear;
|
||||
el1 = new struct constprop;
|
||||
#ifdef __SPF
|
||||
addToCollection(__LINE__, __FILE__, el1, 1);
|
||||
#endif
|
||||
el1->flag = UNDEFFLAG;
|
||||
el1->var = el->var;
|
||||
el1->value = 0;
|
||||
el1->stmt = el->stmt;
|
||||
el1->expr = el->expr;
|
||||
outset->addElement((void *)el1);
|
||||
}
|
||||
}
|
||||
// should add the parameter list with undefined;
|
||||
|
||||
// this has been completly copied so allow to deallocate element too;
|
||||
// setin->setDealllocateElem(); other element need also to be copied
|
||||
return outset;
|
||||
}
|
||||
}
|
||||
if (!isSgAssignStmt(stmt))
|
||||
{
|
||||
if (!setin)
|
||||
return NULL;
|
||||
else
|
||||
return setin->copy();
|
||||
}
|
||||
if (setin)
|
||||
outset = setin->copy();
|
||||
else
|
||||
{
|
||||
outset = new Set(constPropEqual, constPropCombine, constPropPrint);
|
||||
#ifdef __SPF
|
||||
addToCollection(__LINE__, __FILE__, outset, 1);
|
||||
#endif
|
||||
}
|
||||
// before evaluating the expression set the Value set ;
|
||||
if (setin)
|
||||
{
|
||||
for (i = 0; i < setin->size(); i++)
|
||||
{
|
||||
el = (PT_CONSTPROP)setin->getElement(i);
|
||||
if (el)
|
||||
{
|
||||
if ((el->flag == CONSTFLAG) &&
|
||||
el->var &&
|
||||
el->var->symbol())
|
||||
{
|
||||
addElementEvaluate(el->var->symbol()->thesymb, el->value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// just call Evaluate Expression ;
|
||||
def = (SgExpression *)stmt->attributeValue(0, DEFINEDLIST_ATTRIBUTE);
|
||||
//Defined[stmt->id()];
|
||||
if (def)
|
||||
{
|
||||
defvar = def->lhs();
|
||||
if (isSgVarRefExp(defvar))
|
||||
{
|
||||
symb = defvar->symbol();
|
||||
if (symb && symb->type() && (symb->type()->variant() == T_INT))
|
||||
{
|
||||
if (setin)
|
||||
{
|
||||
// remove all definition to the symbol;
|
||||
for (i = 0; i < outset->size(); i++)
|
||||
{
|
||||
el = (PT_CONSTPROP)outset->getElement(i);
|
||||
if (el)
|
||||
{
|
||||
if (el->var->symbol() == symb)
|
||||
outset->rmElement(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
expr = stmt->expr(1);
|
||||
el = new struct constprop;
|
||||
#ifdef __SPF
|
||||
addToCollection(__LINE__, __FILE__, el, 1);
|
||||
#endif
|
||||
if (!el)
|
||||
{
|
||||
Message("No more Memory", 0);
|
||||
exit(1);
|
||||
}
|
||||
if (expr && expr->isInteger())
|
||||
{
|
||||
val = expr->valueInteger();
|
||||
el->flag = CONSTFLAG;
|
||||
el->var = defvar;
|
||||
el->value = val;
|
||||
el->stmt = stmt;
|
||||
el->expr = expr;
|
||||
outset->addElement((void *)el);
|
||||
}
|
||||
else
|
||||
{
|
||||
el->flag = UNDEFFLAG;
|
||||
el->var = defvar;
|
||||
el->value = 0;
|
||||
el->stmt = stmt;
|
||||
el->expr = expr;
|
||||
outset->addElement((void *)el);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
resetPresetEvaluate();
|
||||
// printf("intermediate print line %d\n", stmt->lineNumber());
|
||||
// outset->printSet();
|
||||
return outset;
|
||||
}
|
||||
Reference in New Issue
Block a user