623 lines
16 KiB
C++
623 lines
16 KiB
C++
|
|
/**************************************************************\
|
||
|
|
* Inline Expansion *
|
||
|
|
* *
|
||
|
|
* Miscellaneous help routines *
|
||
|
|
\**************************************************************/
|
||
|
|
|
||
|
|
#include "inline.h"
|
||
|
|
#include <ctype.h>
|
||
|
|
#include <stdlib.h>
|
||
|
|
#ifdef __SPF
|
||
|
|
#include <string>
|
||
|
|
#endif
|
||
|
|
|
||
|
|
//*************************************************************
|
||
|
|
/*
|
||
|
|
* Error - formats the error message then call "err" to print it
|
||
|
|
*
|
||
|
|
* input:
|
||
|
|
* s - string that specifies the conversion format
|
||
|
|
* t - string that to be formated according to s
|
||
|
|
* num - error message number
|
||
|
|
* stmt - pointer to the statement
|
||
|
|
*/
|
||
|
|
//*************************************************************
|
||
|
|
void Error(const char *s, const char *t, int num, SgStatement *stmt)
|
||
|
|
|
||
|
|
{
|
||
|
|
char *buff = new char[strlen(s) + strlen(t) + 32];
|
||
|
|
sprintf(buff, s, t);
|
||
|
|
err(buff, num, stmt);
|
||
|
|
delete[]buff;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Err_g - formats and prints the special kind error message (without statement reference)
|
||
|
|
*
|
||
|
|
* input:
|
||
|
|
* s - string that specifies the conversion format
|
||
|
|
* t - string that to be formated according to s
|
||
|
|
* num - error message number
|
||
|
|
*/
|
||
|
|
|
||
|
|
void Err_g(const char *s, const char *t, int num)
|
||
|
|
|
||
|
|
{
|
||
|
|
char *buff = new char[strlen(s) + strlen(t) + 32];
|
||
|
|
char num3s[16];
|
||
|
|
sprintf(buff, s, t);
|
||
|
|
format_num(num, num3s);
|
||
|
|
errcnt++;
|
||
|
|
(void)fprintf(stderr, "Error %s in %s of %s: %s\n", num3s, cur_func->symbol()->identifier(), cur_func->fileName(), buff);
|
||
|
|
delete[]buff;
|
||
|
|
}
|
||
|
|
/*
|
||
|
|
* err -- prints the error message
|
||
|
|
*
|
||
|
|
* input:
|
||
|
|
* s - string to be printed out
|
||
|
|
* num - error message number
|
||
|
|
* stmt - pointer to the statement
|
||
|
|
*/
|
||
|
|
void err(const char *s, int num, SgStatement *stmt)
|
||
|
|
|
||
|
|
{
|
||
|
|
char num3s[16];
|
||
|
|
format_num(num, num3s);
|
||
|
|
errcnt++;
|
||
|
|
// printf( "Error on line %d : %s\n", stmt->lineNumber(), s);
|
||
|
|
#ifdef __SPF
|
||
|
|
char message[256];
|
||
|
|
sprintf(message, "Error %d: %s", num, s);
|
||
|
|
|
||
|
|
std::string toPrint = "|";
|
||
|
|
toPrint += std::to_string(1) + " "; // ERROR
|
||
|
|
toPrint += std::string(stmt->fileName()) + " ";
|
||
|
|
toPrint += std::to_string(stmt->lineNumber()) + " ";
|
||
|
|
toPrint += std::to_string(0);
|
||
|
|
toPrint += "|" + std::string(message);
|
||
|
|
|
||
|
|
printf("@%s@\n", toPrint.c_str());
|
||
|
|
#else
|
||
|
|
(void)fprintf(stderr, "Error %s on line %d of %s: %s\n", num3s, stmt->lineNumber(), stmt->fileName(), s);
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
* Warning -- formats a warning message then call "warn" to print it out
|
||
|
|
*
|
||
|
|
* input:
|
||
|
|
* s - string that specifies the conversion format
|
||
|
|
* t - string that to be converted according to s
|
||
|
|
* num - warning message number
|
||
|
|
* stmt - pointer to the statement
|
||
|
|
*/
|
||
|
|
void Warning(const char *s, const char *t, int num, SgStatement *stmt)
|
||
|
|
{
|
||
|
|
char *buff = new char[strlen(s) + strlen(t) + 32];
|
||
|
|
sprintf(buff, s, t);
|
||
|
|
warn(buff, num, stmt);
|
||
|
|
delete[]buff;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
* warn -- print the warning message if specified
|
||
|
|
*
|
||
|
|
* input:
|
||
|
|
* s - string to be printed
|
||
|
|
* num - warning message number
|
||
|
|
* stmt - pointer to the statement
|
||
|
|
*/
|
||
|
|
void warn(const char *s, int num, SgStatement *stmt)
|
||
|
|
{
|
||
|
|
char num3s[16];
|
||
|
|
format_num(num, num3s);
|
||
|
|
// printf( "Warning on line %d: %s\n", stmt->lineNumber(), s);
|
||
|
|
(void)fprintf(stderr, "Warning %s on line %d of %s: %s\n", num3s, stmt->lineNumber(), stmt->fileName(), s);
|
||
|
|
}
|
||
|
|
|
||
|
|
void Warn_g(const char *s, const char *t, int num)
|
||
|
|
{
|
||
|
|
char *buff = new char[strlen(s) + strlen(t) + 32];
|
||
|
|
char num3s[16];
|
||
|
|
format_num(num, num3s);
|
||
|
|
sprintf(buff, s, t);
|
||
|
|
(void)fprintf(stderr, "Warning %s in %s of %s: %s\n", num3s, cur_func->symbol()->identifier(), cur_func->fileName(), buff);
|
||
|
|
delete[]buff;
|
||
|
|
}
|
||
|
|
//*********************************************************************
|
||
|
|
void printVariantName(int i) {
|
||
|
|
if ((i >= 0 && i < MAXTAGS) && tag[i]) printf("%s", tag[i]);
|
||
|
|
else printf("not a known node variant");
|
||
|
|
}
|
||
|
|
//***********************************
|
||
|
|
|
||
|
|
char *UnparseExpr(SgExpression *e)
|
||
|
|
{
|
||
|
|
char *buf;
|
||
|
|
int l;
|
||
|
|
Init_Unparser();
|
||
|
|
buf = Tool_Unparse2_LLnode(e->thellnd);
|
||
|
|
l = strlen(buf);
|
||
|
|
char *ustr = new char[l + 1];
|
||
|
|
strcpy(ustr, buf);
|
||
|
|
//ustr[l] = ' ';
|
||
|
|
//ustr[l+1] = '\0';
|
||
|
|
return(ustr);
|
||
|
|
}
|
||
|
|
//************************************
|
||
|
|
|
||
|
|
const char* header(int i) {
|
||
|
|
switch (i) {
|
||
|
|
case(PROG_HEDR):
|
||
|
|
return("program");
|
||
|
|
case(PROC_HEDR):
|
||
|
|
return("subroutine");
|
||
|
|
case(FUNC_HEDR):
|
||
|
|
return("function");
|
||
|
|
default:
|
||
|
|
return("error");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
SgLabel* firstLabel(SgFile *f)
|
||
|
|
{
|
||
|
|
SetCurrentFileTo(f->filept);
|
||
|
|
SwitchToFile(GetFileNumWithPt(f->filept));
|
||
|
|
return LabelMapping(PROJ_FIRST_LABEL());
|
||
|
|
}
|
||
|
|
|
||
|
|
int isLabel(int num) {
|
||
|
|
PTR_LABEL lab;
|
||
|
|
for (lab = PROJ_FIRST_LABEL(); lab; lab = LABEL_NEXT(lab))
|
||
|
|
if (num == LABEL_STMTNO(lab))
|
||
|
|
return 1;
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
SgLabel *isLabelWithScope(int num, SgStatement *stmt) {
|
||
|
|
PTR_LABEL lab;
|
||
|
|
for (lab = PROJ_FIRST_LABEL(); lab; lab = LABEL_NEXT(lab))
|
||
|
|
//if( num == LABEL_STMTNO(lab) && LABEL_BODY(lab)->scope == stmt->thebif)
|
||
|
|
if (num == LABEL_STMTNO(lab) && LABEL_SCOPE(lab) == stmt->thebif)
|
||
|
|
return LabelMapping(lab);
|
||
|
|
return NULL;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
SgLabel * GetLabel()
|
||
|
|
{
|
||
|
|
static int lnum = 90000;
|
||
|
|
if (lnum > max_lab)
|
||
|
|
return (new SgLabel(lnum--));
|
||
|
|
while (isLabel(lnum))
|
||
|
|
lnum--;
|
||
|
|
return (new SgLabel(lnum--));
|
||
|
|
}
|
||
|
|
|
||
|
|
SgLabel * GetNewLabel()
|
||
|
|
{
|
||
|
|
static int lnum = 99999;
|
||
|
|
if (lnum > max_lab) /* for current file must be set before first call GetNewLabel() :max_lab = getLastLabelId(); */
|
||
|
|
return (new SgLabel(lnum--));
|
||
|
|
while (isLabel(lnum))
|
||
|
|
lnum--;
|
||
|
|
return (new SgLabel(lnum--));
|
||
|
|
/*
|
||
|
|
int lnum;
|
||
|
|
if(max_lab <99999)
|
||
|
|
return(new SgLabel(++max_lab));
|
||
|
|
lnum = 1;
|
||
|
|
while(isLabel(lnum))
|
||
|
|
lnum++;
|
||
|
|
return(new SgLabel(lnum));
|
||
|
|
*/
|
||
|
|
}
|
||
|
|
|
||
|
|
SgLabel * NewLabel()
|
||
|
|
{
|
||
|
|
if (max_lab < 99999)
|
||
|
|
return(new SgLabel(++max_lab));
|
||
|
|
++num_lab;
|
||
|
|
while (isLabel(num_lab))
|
||
|
|
++num_lab;
|
||
|
|
return(new SgLabel(num_lab));
|
||
|
|
}
|
||
|
|
|
||
|
|
void SetScopeOfLabel(SgLabel *lab, SgStatement *scope)
|
||
|
|
{
|
||
|
|
LABEL_SCOPE(lab->thelabel) = scope->thebif;
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
SgLabel * NewLabel(int lnum)
|
||
|
|
{
|
||
|
|
if(max_lab <99999)
|
||
|
|
return(new SgLabel(++max_lab));
|
||
|
|
|
||
|
|
while(isLabel(lnum))
|
||
|
|
++lnum;
|
||
|
|
return(new SgLabel(lnum));
|
||
|
|
}
|
||
|
|
*/
|
||
|
|
|
||
|
|
int isSymbolName(char *name)
|
||
|
|
//
|
||
|
|
{
|
||
|
|
SgSymbol *s;
|
||
|
|
for (s = current_file->firstSymbol(); s; s = s->next())
|
||
|
|
if (!strcmp(name, s->identifier()))
|
||
|
|
return 1;
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
int isSymbolNameInScope(char *name, SgStatement *scope)
|
||
|
|
{
|
||
|
|
SgSymbol *s;
|
||
|
|
for (s = current_file->firstSymbol(); s; s = s->next())
|
||
|
|
if (scope == s->scope() && !strcmp(name, s->identifier()))
|
||
|
|
return 1;
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
/*
|
||
|
|
{
|
||
|
|
PTR_SYMB sym;
|
||
|
|
for(sym=PROJ_FIRST_SYMB(); sym; sym=SYMB_NEXT(sym))
|
||
|
|
if( SYMB_SCOPE(sym) == scope->thebif && (!strcmp(name,SYMB_IDENT(sym)) ) )
|
||
|
|
return 1;
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
*/
|
||
|
|
|
||
|
|
void format_num(int num, char num3s[])
|
||
|
|
{
|
||
|
|
if (num > 99)
|
||
|
|
num3s[sprintf(num3s, "%3d", num)] = 0;
|
||
|
|
else if (num > 9)
|
||
|
|
num3s[sprintf(num3s, "0%2d", num)] = 0;
|
||
|
|
else
|
||
|
|
num3s[sprintf(num3s, "00%1d", num)] = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
SgExpression *ConnectList(SgExpression *el1, SgExpression *el2)
|
||
|
|
{
|
||
|
|
SgExpression *el;
|
||
|
|
if (!el1)
|
||
|
|
return(el2);
|
||
|
|
if (!el2)
|
||
|
|
return(el1);
|
||
|
|
for (el = el1; el->rhs(); el = el->rhs())
|
||
|
|
;
|
||
|
|
el->setRhs(el2);
|
||
|
|
return(el1);
|
||
|
|
}
|
||
|
|
|
||
|
|
int is_integer_value(char *str)
|
||
|
|
{
|
||
|
|
char *p;
|
||
|
|
p = str;
|
||
|
|
for (; *str != '\0'; str++)
|
||
|
|
if (!isdigit(*str))
|
||
|
|
return 0;
|
||
|
|
return (atoi(p));
|
||
|
|
}
|
||
|
|
|
||
|
|
void PrintSymbolTable(SgFile *f)
|
||
|
|
{
|
||
|
|
SgSymbol *s;
|
||
|
|
printf("\nS Y M B O L T A B L E \n");
|
||
|
|
for (s = f->firstSymbol(); s; s = s->next())
|
||
|
|
//printf(" %s/%d/ ", s->identifier(), s->id() );
|
||
|
|
printSymb(s);
|
||
|
|
}
|
||
|
|
|
||
|
|
void printSymb(SgSymbol *s)
|
||
|
|
{
|
||
|
|
const char *head;
|
||
|
|
head = isHeaderStmtSymbol(s) ? "HEADER " : " ";
|
||
|
|
printf("SYMB[%3d] scope=STMT[%3d] : %s %s", s->id(), (s->scope()) ? (s->scope())->id() : -1, s->identifier(), head);
|
||
|
|
printType(s->type());
|
||
|
|
printf("\n");
|
||
|
|
}
|
||
|
|
|
||
|
|
void printType(SgType *t)
|
||
|
|
{
|
||
|
|
SgArrayType *arrayt;
|
||
|
|
/*SgExpression *e = new SgExpression(TYPE_RANGES(t->thetype));*/
|
||
|
|
int i, n;
|
||
|
|
if (!t) { printf("no type "); return; }
|
||
|
|
else printf("TYPE[%d]:", t->id());
|
||
|
|
if ((arrayt = isSgArrayType(t)) != 0)
|
||
|
|
{
|
||
|
|
printf("dimension(");
|
||
|
|
n = arrayt->dimension();
|
||
|
|
for (i = 0; i < n; i++)
|
||
|
|
{
|
||
|
|
(arrayt->sizeInDim(i))->unparsestdout();
|
||
|
|
if (i < n - 1) printf(", ");
|
||
|
|
}
|
||
|
|
printf(") ");
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
switch (t->variant())
|
||
|
|
{
|
||
|
|
case T_INT: printf("integer "); break;
|
||
|
|
case T_FLOAT: printf("real "); break;
|
||
|
|
case T_DOUBLE: printf("double precision "); break;
|
||
|
|
case T_CHAR: printf("character "); break;
|
||
|
|
case T_STRING: printf("Character ");
|
||
|
|
UnparseLLND(TYPE_RANGES(t->thetype));
|
||
|
|
/*if(t->length()) printf("[%d]",t->length()->variant());*/
|
||
|
|
/*((SgArrayType *) t)->getDimList()->unparsestdout();*/
|
||
|
|
break;
|
||
|
|
case T_BOOL: printf("logical "); break;
|
||
|
|
case T_COMPLEX: printf("complex "); break;
|
||
|
|
case T_DCOMPLEX: printf("double complex "); break;
|
||
|
|
|
||
|
|
default: break;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/* if(e) e->unparsestdout();*/
|
||
|
|
if (t->hasBaseType())
|
||
|
|
{
|
||
|
|
printf("of ");
|
||
|
|
printType(t->baseType());
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void PrintTypeTable(SgFile *f)
|
||
|
|
{
|
||
|
|
SgType *t;
|
||
|
|
printf("\nT Y P E T A B L E \n");
|
||
|
|
for (t = f->firstType(); t; t = t->next())
|
||
|
|
{
|
||
|
|
printType(t); printf("\n");
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
SgExpression *ReplaceParameter(SgExpression *e)
|
||
|
|
{
|
||
|
|
if (!e)
|
||
|
|
return(e);
|
||
|
|
if (e->variant() == CONST_REF) {
|
||
|
|
SgConstantSymb * sc = isSgConstantSymb(e->symbol());
|
||
|
|
return(ReplaceParameter(&(sc->constantValue()->copy())));
|
||
|
|
}
|
||
|
|
e->setLhs(ReplaceParameter(e->lhs()));
|
||
|
|
e->setRhs(ReplaceParameter(e->rhs()));
|
||
|
|
return(e);
|
||
|
|
}
|
||
|
|
|
||
|
|
SgExpression *ReplaceIntegerParameter(SgExpression *e)
|
||
|
|
{
|
||
|
|
if (!e)
|
||
|
|
return(e);
|
||
|
|
if (e->variant() == CONST_REF && e->type()->variant() == T_INT) {
|
||
|
|
SgConstantSymb * sc = isSgConstantSymb(e->symbol());
|
||
|
|
return(ReplaceIntegerParameter(&(sc->constantValue()->copy())));
|
||
|
|
}
|
||
|
|
e->setLhs(ReplaceIntegerParameter(e->lhs()));
|
||
|
|
e->setRhs(ReplaceIntegerParameter(e->rhs()));
|
||
|
|
return(e);
|
||
|
|
}
|
||
|
|
|
||
|
|
/*
|
||
|
|
SgExpression *ReplaceFuncCall(SgExpression *e)
|
||
|
|
{
|
||
|
|
if(!e)
|
||
|
|
return(e);
|
||
|
|
if(isSgFunctionCallExp(e) && e->symbol()) {//function call
|
||
|
|
if( !e->lhs() && (!strcmp(e->symbol()->identifier(),"number_of_processors") || !strcmp(e->symbol()->identifier(),"actual_num_procs"))) { //NUMBER_OF_PROCESSORS() or
|
||
|
|
// ACTUAL_NUM_PROCS()
|
||
|
|
SgExprListExp *el1,*el2;
|
||
|
|
if(!strcmp(e->symbol()->identifier(),"number_of_processors"))
|
||
|
|
el1 = new SgExprListExp(*ParentPS());
|
||
|
|
else
|
||
|
|
el1 = new SgExprListExp(*CurrentPS());
|
||
|
|
el2 = new SgExprListExp(*ConstRef(0));
|
||
|
|
e->setSymbol(fdvm[GETSIZ]);
|
||
|
|
fmask[GETSIZ] = 1;
|
||
|
|
el1->setRhs(el2);
|
||
|
|
e->setLhs(el1);
|
||
|
|
return(e);
|
||
|
|
}
|
||
|
|
|
||
|
|
if( !e->lhs() && (!strcmp(e->symbol()->identifier(),"processors_rank"))) {
|
||
|
|
//PROCESSORS_RANK()
|
||
|
|
SgExprListExp *el1;
|
||
|
|
el1 = new SgExprListExp(*ParentPS());
|
||
|
|
e->setSymbol(fdvm[GETRNK]);
|
||
|
|
fmask[GETRNK] = 1;
|
||
|
|
e->setLhs(el1);
|
||
|
|
return(e);
|
||
|
|
}
|
||
|
|
|
||
|
|
if(!strcmp(e->symbol()->identifier(),"processors_size")) {
|
||
|
|
//PROCESSORS_SIZE()
|
||
|
|
SgExprListExp *el1;
|
||
|
|
el1 = new SgExprListExp(*ParentPS());
|
||
|
|
e->setSymbol(fdvm[GETSIZ]);
|
||
|
|
fmask[GETSIZ] = 1;
|
||
|
|
el1->setRhs(*(e->lhs())+(*ConstRef(0))); //el1->setRhs(e->lhs());
|
||
|
|
e->setLhs(el1);
|
||
|
|
return(e);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
e->setLhs(ReplaceFuncCall(e->lhs()));
|
||
|
|
e->setRhs(ReplaceFuncCall(e->rhs()));
|
||
|
|
return(e);
|
||
|
|
}
|
||
|
|
*/
|
||
|
|
|
||
|
|
/* version from dvm.cpp
|
||
|
|
SgExpression *Calculate(SgExpression *e)
|
||
|
|
{ SgExpression *er;
|
||
|
|
er = ReplaceParameter( &(e->copy()));
|
||
|
|
if(er->isInteger())
|
||
|
|
return( new SgValueExp(er->valueInteger()));
|
||
|
|
else
|
||
|
|
return(e);
|
||
|
|
}
|
||
|
|
*/
|
||
|
|
|
||
|
|
/* new version */
|
||
|
|
SgExpression *Calculate(SgExpression *e)
|
||
|
|
{
|
||
|
|
if (e->isInteger())
|
||
|
|
return(new SgValueExp(e->valueInteger()));
|
||
|
|
else
|
||
|
|
return(e);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
SgExpression *Calculate_List(SgExpression *e)
|
||
|
|
{
|
||
|
|
SgExpression *el;
|
||
|
|
for (el = e; el; el = el->rhs())
|
||
|
|
el->setLhs(Calculate(el->lhs()));
|
||
|
|
return(e);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
int ExpCompare(SgExpression *e1, SgExpression *e2)
|
||
|
|
{//compares two expressions
|
||
|
|
// returns 1 if they are textually identical
|
||
|
|
if (!e1 && !e2) // both expressions are null
|
||
|
|
return(1);
|
||
|
|
if (!e1 || !e2) // one of them is null
|
||
|
|
return(0);
|
||
|
|
if (e1->variant() != e2->variant()) // variants are not equal
|
||
|
|
return(0);
|
||
|
|
switch (e1->variant()) {
|
||
|
|
case INT_VAL:
|
||
|
|
return(NODE_IV(e1->thellnd) == NODE_IV(e2->thellnd));
|
||
|
|
case FLOAT_VAL:
|
||
|
|
case DOUBLE_VAL:
|
||
|
|
case BOOL_VAL:
|
||
|
|
case CHAR_VAL:
|
||
|
|
case STRING_VAL:
|
||
|
|
return(!strcmp(NODE_STR(e1->thellnd), NODE_STR(e2->thellnd)));
|
||
|
|
case COMPLEX_VAL:
|
||
|
|
return(ExpCompare(e1->lhs(), e2->lhs()) && ExpCompare(e1->rhs(), e2->rhs()));
|
||
|
|
case CONST_REF:
|
||
|
|
case VAR_REF:
|
||
|
|
return(e1->symbol() == e2->symbol());
|
||
|
|
case ARRAY_REF:
|
||
|
|
case FUNC_CALL:
|
||
|
|
if (e1->symbol() == e2->symbol())
|
||
|
|
return(ExpCompare(e1->lhs(), e2->lhs())); // compares subscript/argument lists
|
||
|
|
else
|
||
|
|
return(0);
|
||
|
|
case EXPR_LIST:
|
||
|
|
{SgExpression *el1, *el2;
|
||
|
|
for (el1 = e1, el2 = e2; el1&&el2; el1 = el1->rhs(), el2 = el2->rhs())
|
||
|
|
if (!ExpCompare(el1->lhs(), el2->lhs())) // the corresponding elements of lists are not identical
|
||
|
|
return(0);
|
||
|
|
if (el1 || el2) //one list is shorter than other
|
||
|
|
return(0);
|
||
|
|
else
|
||
|
|
return(1);
|
||
|
|
}
|
||
|
|
case MINUS_OP: //unary operations
|
||
|
|
case NOT_OP:
|
||
|
|
return(ExpCompare(e1->lhs(), e2->lhs())); // compares operands
|
||
|
|
default:
|
||
|
|
return(ExpCompare(e1->lhs(), e2->lhs()) && ExpCompare(e1->rhs(), e2->rhs()));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
SgExpression *LowerBound(SgSymbol *ar, int i)
|
||
|
|
// lower bound of i-nd dimension of array ar (i= 0,...,Rank(ar)-1)
|
||
|
|
{
|
||
|
|
SgArrayType *artype;
|
||
|
|
SgExpression *e;
|
||
|
|
SgSubscriptExp *sbe;
|
||
|
|
//if(IS_POINTER(ar))
|
||
|
|
// return(new SgValueExp(1));
|
||
|
|
artype = isSgArrayType(ar->type());
|
||
|
|
if (!artype)
|
||
|
|
return(NULL);
|
||
|
|
e = artype->sizeInDim(i);
|
||
|
|
if (!e)
|
||
|
|
return(NULL);
|
||
|
|
if ((sbe = isSgSubscriptExp(e)) != NULL) {
|
||
|
|
if (sbe->lbound())
|
||
|
|
return(sbe->lbound());
|
||
|
|
|
||
|
|
//else if(IS_ALLOCATABLE_POINTER(ar)){
|
||
|
|
// if(HEADER(ar))
|
||
|
|
// return(header_ref(ar,Rank(ar)+3+i));
|
||
|
|
// else
|
||
|
|
// return(LBOUNDFunction(ar,i+1));
|
||
|
|
//}
|
||
|
|
|
||
|
|
else
|
||
|
|
return(new SgValueExp(1));
|
||
|
|
}
|
||
|
|
else
|
||
|
|
return(new SgValueExp(1)); // by default lower bound = 1
|
||
|
|
}
|
||
|
|
|
||
|
|
int Rank(SgSymbol *s)
|
||
|
|
{
|
||
|
|
SgArrayType *artype;
|
||
|
|
//if(IS_POINTER(s))
|
||
|
|
// return(PointerRank(s));
|
||
|
|
artype = isSgArrayType(s->type());
|
||
|
|
if (artype)
|
||
|
|
return (artype->dimension());
|
||
|
|
else
|
||
|
|
return (0);
|
||
|
|
}
|
||
|
|
|
||
|
|
SgExpression *UpperBound(SgSymbol *ar, int i)
|
||
|
|
// upper bound of i-nd dimension of array ar (i= 0,...,Rank(ar)-1)
|
||
|
|
{
|
||
|
|
SgArrayType *artype;
|
||
|
|
SgExpression *e;
|
||
|
|
SgSubscriptExp *sbe;
|
||
|
|
|
||
|
|
|
||
|
|
artype = isSgArrayType(ar->type());
|
||
|
|
if (!artype)
|
||
|
|
return(NULL);
|
||
|
|
e = artype->sizeInDim(i);
|
||
|
|
if (!e)
|
||
|
|
return(NULL);
|
||
|
|
if ((sbe = isSgSubscriptExp(e)) != NULL) {
|
||
|
|
if (sbe->ubound())
|
||
|
|
return(sbe->ubound());
|
||
|
|
|
||
|
|
//else if(HEADER(ar))
|
||
|
|
// return(&(*GetSize(HeaderRefInd(ar,1),i+1)-*HeaderRefInd(ar,Rank(ar)+3+i)+*new SgValueExp(1)));
|
||
|
|
//else
|
||
|
|
// return(UBOUNDFunction(ar,i+1));
|
||
|
|
|
||
|
|
}
|
||
|
|
else
|
||
|
|
return(e);
|
||
|
|
// !!!! test case "*"
|
||
|
|
return(e);
|
||
|
|
}
|
||
|
|
|
||
|
|
symb_list *AddToSymbList(symb_list *ls, SgSymbol *s)
|
||
|
|
{
|
||
|
|
symb_list *l;
|
||
|
|
//adding the symbol 's' to symb_list 'ls'
|
||
|
|
if (!ls) {
|
||
|
|
ls = new symb_list;
|
||
|
|
ls->symb = s;
|
||
|
|
ls->next = NULL;
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
l = new symb_list;
|
||
|
|
l->symb = s;
|
||
|
|
l->next = ls;
|
||
|
|
ls = l;
|
||
|
|
}
|
||
|
|
return(ls);
|
||
|
|
}
|