Files
SAPFOR/dvm/fdvm/trunk/InlineExpansion/hlp.cpp
2023-09-14 19:43:13 +03:00

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);
}