Files
SAPFOR/projects/dvm/fdvm/trunk/parser/unparse_hpf.c

4896 lines
154 KiB
C
Raw Normal View History

2024-10-04 15:26:19 +03:00
/**************************************************************************
* *
* Unparser for toolbox *
* *
*************************************************************************/
#include <stdio.h>
#include "compatible.h" /* Make different system compatible... (PHB) */
#ifdef SYS5
#include <string.h>
#else
#include <strings.h>
#endif
#include <stdlib.h>
#include "dvm_tag.h"
#include "fdvm.h"
#include "macro.h"
#include "ext_lib.h"
#include "ext_low.h"
static int TabNumber =0;
static int Number_Of_Flag = 0;
#define TASK_PROC_GENERATE 0
#define MAXFLAG 64
#define MAXLFLAG 256
#define MAXLEVEL 256
#define IS_DISTRIBUTE_ARRAY(A) ((SYMB_ATTR((A)) & DISTRIBUTE_BIT) || (SYMB_ATTR((A)) & ALIGN_BIT) || (SYMB_ATTR((A)) & INHERIT_BIT))
char *copys(char *);
PTR_SYMB SymbolID[MAXFLAG];
int Number_Of_Symbol = 0;
int On_count = 0;
int TaskRegionUnparse = 0;
int HPF_VERSION=0;
int errnumber=0;
int NumberOfIndependent=0;
static char TabOfFlag[MAXFLAG][MAXLFLAG];
static int FlagLenght[MAXFLAG];
static int FlagLevel[MAXFLAG];
static int FlagOn[MAXLEVEL][MAXFLAG];
#define MAXLENGHTBUF 750000
static int Buf_pointer = 0;
static char UnpBuf[MAXLENGHTBUF];
static char *Buf_address;
#ifdef __SPF_BUILT_IN_PARSER
static int CommentOut = 0;
#else
int CommentOut = 0;
#endif
int Pointer = 0;
char *hpfname;
#define C_Initialized 1
#define Fortran_Initialized 2
static int Parser_Initiated = 0;
#ifdef __SPF
extern void removeFromCollection(void *pointer);
#endif
#ifdef __SPF_BUILT_IN_PARSER
static PTR_FILE current_file = NULL;
#define DealWith_Rid DealWith_Rid_temp
#define is_overloaded_type is_overloaded_type_temp
#define Find_Type_For_Bif Find_Type_For_Bif_temp
#define Find_Protection_For_Bif Find_Protection_For_Bif_temp
#define Find_BaseType Find_BaseType_temp
#define Find_BaseType2 Find_BaseType2_temp
#define create_unp_str create_unp_str_temp
#define alloc_str alloc_str_temp
#define Reset_Unparser Reset_Unparser_temp
#define BufPutChar BufPutChar_temp
#define BufPutString BufPutString_temp
#define BufPutInt BufPutInt_temp
#define Get_Flag_val Get_Flag_val_temp
#define Treat_Flag Treat_Flag_temp
#define PushPop_Flag PushPop_Flag_temp
#define Tool_Unparse_Symbol Tool_Unparse_Symbol_temp
#define Get_Type_Operand Get_Type_Operand_temp
#define Get_LL_Operand Get_LL_Operand_temp
#define Get_Bif_Operand Get_Bif_Operand_temp
#define GetComp GetComp_temp
#define Eval_Type_Condition Eval_Type_Condition_temp
#define Eval_LLND_Condition Eval_LLND_Condition_temp
#define Eval_Bif_Condition Eval_Bif_Condition_temp
#define SkipToEndif SkipToEndif_temp
#define Tool_Unparse_Type Tool_Unparse_Type_temp
#define Tool_Unparse2_LLnode Tool_Unparse2_LLnode_temp
#define Tool_Unparse_Bif Tool_Unparse_Bif_temp
#else
PTR_FILE current_file=NULL;
#endif
PTR_LLND On_Clause=NULL;
PTR_LLND ReductionList=NULL;
PTR_LLND NewSpecList=NULL;
extern void Message();
/* FORWARD DECLARATIONS */
int BufPutString();
PTR_LLND FindMapDir();
PTR_LLND ChangeRedistributeOntoTask();
PTR_LLND FindRealignDir();
PTR_LLND FindRedistributeDir();
PTR_LLND FindDynamicDir();
int UnparseEndofCircle();
PTR_BFND FindDistrAlignCombinedDir();
PTR_LLND FindPointerDescriptor();
void gen_hpf_name ();
void PointerDeclaration();
int ArrayOfPointerDeclaration();
void GenerateType();
void Init_HPFUnparser();
void ResetSymbolId();
int NumberOfForNode();
int FindPointerDir();
int FindPointerDeclaration();
int FindCommonHeapDeclaration();
int Puttab();
int Find_SaveSymbol();
int CheckNullDistribution();
char *Tool_Unparse_Bif();
char *Tool_Unparse2_LLnode ();
char * Tool_Unparse_Type();
char * Tool_Unparse_Symbol();
PTR_BFND FindBeginingOfBlock();
PTR_BFND FindEndOfBlock();
int CheckAcross();
int CheckReduction();
int IfReduction();
int FindRedInExpr();
PTR_LLND AddToReductionList();
int FindInNewList();
int isForNodeEndStmt();
int ForNodeStmt();
PTR_LLND FreeReductionList();
#include "f90.h"
typedef struct
{
char *str;
char *(* fct)();
} UNP_EXPR;
static UNP_EXPR Unparse_Def[LAST_CODE];
/************ Unparse Flags **************/
static int In_Write_Flag = 0;
static int Rec_Port_Decl = 0;
static int In_Param_Flag = 0;
static int In_Impli_Flag = 0;
static int In_Class_Flag = 0;
/*****************************************/
/*************** TYPE names in ASCII form ****************/
static char *ftype_name[] = {"integer",
"real",
"double precision",
"character",
"logical",
"character",
"gate",
"event",
"sequence",
"",
"",
"",
"",
"complex",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"double complex"
};static char *ctype_name[] = {"int",
"float",
"double",
"char",
"logical",
"char",
"gate",
"event",
"sequence",
"error1",
"error2",
"error3",
"error4",
"complex",
"void",
"error6",
"error7",
"error8",
"error9",
"error10",
"error11",
"error12",
"ElementType",
"error14",
"error15",
"error16",
"error17",
"error18",
"error19",
"error20",
"error21",
"error22",
"error23"
};
static
char *ridpointers[] = {
"-error1-", /* unused */
"-error2-", /* int */
"char", /* char */
"float", /* float */
"double", /* double */
"void", /* void */
"-error3-", /* unused1 */
"unsigned", /* unsigned */
"short", /* short */
"long", /* long */
"auto", /* auto */
"static", /* static */
"extern", /* extern */
"register", /* register */
"typedef", /* typedef */
"signed", /* signed */
"const", /* const */
"volatile", /* volatile */
"private", /* private */
"future", /* future */
"virtual", /* virtual */
"inline", /* inline */
"friend", /* friend */
"-error4-", /* public */
"-error5-", /* protected */
"Sync", /* CC++ sync */
"global", /* CC++ global */
"atomic", /* CC++ atomic */
"__private", /* for KSR */
"restrict"
};
/*********************************************************/
/******* Precedence table of operators for Fortran *******/
static char precedence[] = {5, /* .eq. */
5, /* .lt. */
5, /* .gt. */
5, /* .ne. */
5, /* .le. */
5, /* .ge. */
3, /* + */
3, /* - */
8, /* .or. */
2, /* * */
2, /* / */
0, /* none */
7, /* .and. */
1, /* ** */
0, /* none */
4, /* // */
8, /* .xor. */
9, /* .eqv. */
9, /* .neqv. */
1, /* Minus_op*/
1 /* not op */
};
#define type_index(X) (X-T_INT) /* gives the index of a type to access the Table "ftype_name" from a type code */
#define binop(n) (n >= EQ_OP && n <= NEQV_OP) /* gives the boolean value of the operation "n" being binary (not unary) */
/* In order to change ON-block procedure call */
typedef struct func_call *PTR_FCALL;
struct func_call
{
PTR_LLND func_ref;
PTR_BFND first;
PTR_BFND last;
PTR_FCALL next;
};
PTR_LLND parameter_list=NULL;
PTR_SYMB function_name=NULL;
int ON_BLOCK=0;
int ON_BEGIN=0;
PTR_FCALL TaskRegion=NULL;
extern char *chkalloc();
#define ALLOC(x) (struct x *) chkalloc(sizeof(struct x))
#define FUNC_REF(NODE) ((NODE)->func_ref)
#define FUNC_FIRST(NODE) ((NODE)->first)
#define FUNC_LAST(NODE) ((NODE)->last)
#define FUNC_NEXT(NODE) ((NODE)->next)
void UnparseTaskRegion(PTR_FCALL TaskRegion)
{
PTR_BFND bif;
PTR_FCALL temp=NULL;
TaskRegionUnparse=1;
for(;TaskRegion;temp=TaskRegion,TaskRegion=FUNC_NEXT(TaskRegion))
{
PTR_LLND llnd;
if (temp)
{
FUNC_NEXT(temp)=NULL;
FUNC_FIRST(temp)=NULL;
FUNC_LAST(temp)=NULL;
#ifdef __SPF
removeFromCollection(FUNC_REF(temp));
removeFromCollection(temp);
#endif
free(FUNC_REF(temp));
free(temp);
}
BufPutString("\n",0);
Puttab();
BufPutString("subroutine ",0);
Tool_Unparse2_LLnode(FUNC_REF(TaskRegion));
BufPutString("\n",0);
llnd=NODE_OPERAND0(FUNC_REF(TaskRegion));
for(;llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
{
if (NODE_CODE(NODE_OPERAND0(llnd))==ARRAY_REF)
{
if (NODE_SYMB(NODE_OPERAND0(llnd)))
{
PTR_SYMB sym=NODE_SYMB(NODE_OPERAND0(llnd));
if ((SYMB_ATTR(sym)&DISTRIBUTE_BIT)||
(SYMB_ATTR(sym)&ALIGN_BIT))
{
Puttab();
BufPutString("DIMENSION ",0);
Tool_Unparse2_LLnode(NODE_OPERAND0(llnd));
BufPutString("(",0);
Tool_Unparse2_LLnode(TYPE_DECL_RANGES(SYMB_TYPE(sym)));
BufPutString(")",0);
BufPutString("\n",0);
BufPutString("!HPF$",0);
Puttab();
Buf_pointer-=5;
BufPutString("INHERIT ",0);
Tool_Unparse2_LLnode(NODE_OPERAND0(llnd));
BufPutString("\n",0);
}
else
{
Puttab();
BufPutString("DIMENSION ",0);
Tool_Unparse2_LLnode(NODE_OPERAND0(llnd));
BufPutString("(",0);
Tool_Unparse2_LLnode(TYPE_DECL_RANGES(SYMB_TYPE(sym)));
BufPutString(")",0);
BufPutString("\n",0);
}
}
}
else
{
PTR_SYMB sym=NODE_SYMB(NODE_OPERAND0(llnd));
if ((NODE_CODE(NODE_OPERAND0(llnd))==CONST_REF)||
(NODE_CODE(NODE_OPERAND0(llnd))==VAR_REF))
{
Puttab();
Tool_Unparse_Type(SYMB_TYPE(sym));
BufPutString(" ",0);
Tool_Unparse2_LLnode(NODE_OPERAND0(llnd));
BufPutString("\n",0);
}
}
}
for(bif=BIF_NEXT(FUNC_FIRST(TaskRegion));bif&&(bif!=FUNC_LAST(TaskRegion));bif=BIF_NEXT(bif))
Tool_Unparse_Bif(bif);
Puttab();
BufPutString("end \n\n",0);
}
if (temp)
{
FUNC_NEXT(temp)=NULL;
FUNC_FIRST(temp)=NULL;
FUNC_LAST(temp)=NULL;
#ifdef __SPF
removeFromCollection(FUNC_REF(temp));
removeFromCollection(temp);
#endif
free(FUNC_REF(temp));
free(temp);
}
TaskRegionUnparse=0;
}
PTR_FCALL
FindLast ( ptr )
PTR_FCALL ptr;
{
PTR_FCALL ptr_func=ptr;
if (!ptr) return NULL;
while(ptr_func)
{
if (FUNC_NEXT(ptr_func) == NULL)
return ptr_func;
ptr_func = FUNC_NEXT(ptr_func);
}
return NULL;
}
PTR_LLND
make_llnode (node_type, ll1, ll2, symb_ptr)
int node_type;
PTR_LLND ll1, ll2;
PTR_SYMB symb_ptr;
{
PTR_LLND new_llnd;
new_llnd = ALLOC (llnd);
new_llnd->variant = node_type;
new_llnd->type = TYNULL;
new_llnd->entry.Template.ll_ptr1 = ll1;
new_llnd->entry.Template.ll_ptr2 = ll2;
switch (node_type) {
case INT_VAL:
/*new_llnd->entry.ival = (int) symb_ptr;*/
break;
case BOOL_VAL:
/*new_llnd->entry.bval = (int) symb_ptr;*/
break;
default:
new_llnd->entry.Template.symbol = symb_ptr;
break;
}
return (new_llnd);
}
PTR_SYMB
make_funcsymb (string)
char *string;
{
PTR_SYMB new_symb;
new_symb = ALLOC (symb);
new_symb->variant = ARRAY_REF;
new_symb->ident = copys (string);
return (new_symb);
}
void ResetSymbolDovar()
{
PTR_SYMB symb;
for (symb = current_file->head_symb; symb ; symb = SYMB_NEXT (symb))
if (SYMB_DOVAR (symb)) SYMB_DOVAR (symb) &=~2 ;
}
/* In order to change ON-block procedure call end*/
/* manage the unparse buffer */
void DealWith_Rid(typei, flg)
PTR_TYPE typei;
int flg; /* if 1 then do virtual */
{ int j;
int index;
PTR_TYPE type;
if (!typei)
return;
for (type = typei; type; )
{
switch(TYPE_CODE(type))
{
case T_POINTER :
case T_REFERENCE :
case T_FUNCTION :
case T_ARRAY :
type = TYPE_BASE(type);
break;
case T_MEMBER_POINTER:
type = TYPE_COLL_BASE(type);
case T_DESCRIPT :
index = TYPE_LONG_SHORT(type);
/* printf("index = %d\n", index); */
if( index & BIT_RESTRICT) {
BufPutString(ridpointers[(int)RID_RESTRICT],0);
BufPutString(" ", 0);
}
if( index & BIT_KSRPRIVATE) {
BufPutString(ridpointers[(int)RID_KSRPRIVATE],0);
BufPutString(" ", 0);
}
if( index & BIT_EXTERN) {
BufPutString(ridpointers[(int)RID_EXTERN],0);
BufPutString(" ", 0);
}
if( index & BIT_TYPEDEF) {
BufPutString(ridpointers[(int)RID_TYPEDEF],0);
BufPutString(" ", 0);
}
for (j=1; j< MAX_BIT; j= j*2)
{
switch (index & j)
{
case (int) BIT_PRIVATE: BufPutString(ridpointers[(int)RID_PRIVATE],0);
break;
case (int) BIT_FUTURE: BufPutString(ridpointers[(int)RID_FUTURE],0);
break;
case (int) BIT_VIRTUAL: if(flg) BufPutString(ridpointers[(int)RID_VIRTUAL],0);
break;
case (int) BIT_ATOMIC: if(flg) BufPutString(ridpointers[(int)RID_ATOMIC],0);
break;
case (int) BIT_INLINE: BufPutString(ridpointers[(int)RID_INLINE],0);
break;
case (int) BIT_UNSIGNED: BufPutString(ridpointers[(int)RID_UNSIGNED],0);
break;
case (int) BIT_SIGNED : BufPutString(ridpointers[(int)RID_SIGNED],0);
break;
case (int) BIT_SHORT : BufPutString(ridpointers[(int)RID_SHORT],0);
break;
case (int) BIT_LONG : BufPutString(ridpointers[(int)RID_LONG],0);
break;
case (int) BIT_VOLATILE: BufPutString(ridpointers[(int)RID_VOLATILE],0);
break;
case (int) BIT_CONST : BufPutString(ridpointers[(int)RID_CONST],0);
break;
case (int) BIT_GLOBL : BufPutString(ridpointers[(int)RID_GLOBL],0);
break;
case (int) BIT_SYNC : BufPutString(ridpointers[(int)RID_SYNC],0);
break;
case (int) BIT_TYPEDEF : /* BufPutString(ridpointers[(int)RID_TYPEDEF],0); */
break;
case (int) BIT_EXTERN : /* BufPutString(ridpointers[(int)RID_EXTERN],0); */
break;
case (int) BIT_AUTO : BufPutString(ridpointers[(int)RID_AUTO],0);
break;
case (int) BIT_STATIC : BufPutString(ridpointers[(int)RID_STATIC],0);
break;
case (int) BIT_REGISTER: BufPutString(ridpointers[(int)RID_REGISTER],0);
break;
case (int) BIT_FRIEND: BufPutString(ridpointers[(int)RID_FRIEND],0);
}
if ((index & j) != 0)
BufPutString(" ",0);
}
type = TYPE_DESCRIP_BASE_TYPE(type);
break;
default:
type = NULL;
}
}
}
int is_overloaded_type(bif)
PTR_BFND bif;
{
PTR_LLND ll;
if(!bif) return 0;
ll = BIF_LL1(bif);
while(ll && (NODE_SYMB(ll) == NULL)) ll = NODE_OPERAND0(ll);
if(ll == NULL) return 0;
if(SYMB_ATTR(NODE_SYMB(ll)) & OVOPERATOR) return 1;
else return 0;
}
PTR_TYPE Find_Type_For_Bif(bif)
PTR_BFND bif;
{
PTR_TYPE type = NULL;
if (BIF_LL1(bif) && (NODE_CODE(BIF_LL1(bif)) == EXPR_LIST))
{ PTR_LLND tp;
tp = BIF_LL1(bif);
for (tp = NODE_OPERAND0(tp); tp && (type == NULL); )
{
switch (NODE_CODE(tp)) {
case BIT_NUMBER:
case ASSGN_OP :
case ARRAY_OP:
case FUNCTION_OP :
case CLASSINIT_OP:
case ADDRESS_OP:
case DEREF_OP :
tp = NODE_OPERAND0(tp);
break ;
case SCOPE_OP:
tp = NODE_OPERAND1(tp);
break;
case FUNCTION_REF:
case ARRAY_REF:
case VAR_REF:
if (tp)
{ if(!NODE_SYMB(tp)){
printf("syntax error at line %d\n", bif->g_line);
exit(1);
}
else
type = SYMB_TYPE(NODE_SYMB(tp));
}
tp = NULL;
break ;
default:
type = NODE_TYPE(tp);
break;
}
}
}
return type;
}
int Find_Protection_For_Bif(bif)
PTR_BFND bif;
{
int protect = 0;
if (BIF_LL1(bif) && (BIF_CODE(BIF_LL1(bif)) == EXPR_LIST))
{ PTR_LLND tp;
tp = BIF_LL1(bif);
for (tp = NODE_OPERAND0(tp); tp && (protect == 0); ) /*(protect == NULL)*/
{
switch (NODE_CODE(tp)) {
case BIT_NUMBER:
case ASSGN_OP :
case ARRAY_OP:
case FUNCTION_OP :
case CLASSINIT_OP:
case ADDRESS_OP:
case DEREF_OP :
tp = NODE_OPERAND0(tp);
break ;
case SCOPE_OP:
tp = NODE_OPERAND1(tp);
break;
case FUNCTION_REF:
case ARRAY_REF:
case VAR_REF:
if (tp)
protect = SYMB_ATTR(NODE_SYMB(tp));
tp = NULL;
break ;
}
}
}
return protect;
}
PTR_TYPE Find_BaseType(ptype)
PTR_TYPE ptype;
{
PTR_TYPE pt;
if (!ptype)
return NULL;
pt = TYPE_BASE (ptype);
if (pt)
{ int j;
j = 0;
while ((j < 100) && pt)
{
if (TYPE_CODE(pt) == DEFAULT) break;
if (TYPE_CODE(pt) == T_INT) break;
if (TYPE_CODE(pt) == T_FLOAT) break;
if (TYPE_CODE(pt) == T_DOUBLE) break;
if (TYPE_CODE(pt) == T_CHAR) break;
if (TYPE_CODE(pt) == T_BOOL) break;
if (TYPE_CODE(pt) == T_STRING) break;
if (TYPE_CODE(pt) == T_COMPLEX) break;
if (TYPE_CODE(pt) == T_DCOMPLEX) break;
if (TYPE_CODE(pt) == T_VOID) break;
if (TYPE_CODE(pt) == T_UNKNOWN) break;
if (TYPE_CODE(pt) == T_DERIVED_TYPE) break;
if (TYPE_CODE(pt) == T_DERIVED_COLLECTION) break;
if (TYPE_CODE(pt) == T_DERIVED_TEMPLATE) break;
if (TYPE_CODE(pt) == T_DERIVED_CLASS) break;
if (TYPE_CODE(pt) == T_CLASS) break;
if (TYPE_CODE(pt) == T_COLLECTION) break;
if (TYPE_CODE(pt) == T_DESCRIPT) break; /* by dbg */
pt = TYPE_BASE (pt);
j++;
}
if (j == 100)
{
Message("Looping in getting the Basetype; sorry",0);
exit(1);
}
}
return pt;
}
PTR_TYPE Find_BaseType2(ptype) /* breaks out of the loop for pointers and references BW */
PTR_TYPE ptype;
{
PTR_TYPE pt;
if (!ptype)
return NULL;
pt = TYPE_BASE (ptype);
if (pt)
{ int j;
j = 0;
while ((j < 100) && pt)
{
if (TYPE_CODE(pt) == T_REFERENCE) break;
if (TYPE_CODE(pt) == T_POINTER) break;
if (TYPE_CODE(pt) == DEFAULT) break;
if (TYPE_CODE(pt) == T_INT) break;
if (TYPE_CODE(pt) == T_FLOAT) break;
if (TYPE_CODE(pt) == T_DOUBLE) break;
if (TYPE_CODE(pt) == T_CHAR) break;
if (TYPE_CODE(pt) == T_BOOL) break;
if (TYPE_CODE(pt) == T_STRING) break;
if (TYPE_CODE(pt) == T_COMPLEX) break;
if (TYPE_CODE(pt) == T_DCOMPLEX) break;
if (TYPE_CODE(pt) == T_VOID) break;
if (TYPE_CODE(pt) == T_UNKNOWN) break;
if (TYPE_CODE(pt) == T_DERIVED_TYPE) break;
if (TYPE_CODE(pt) == T_DERIVED_COLLECTION) break;
if (TYPE_CODE(pt) == T_DERIVED_CLASS) break;
if (TYPE_CODE(pt) == T_CLASS) break;
if (TYPE_CODE(pt) == T_COLLECTION) break;
if (TYPE_CODE(pt) == T_DESCRIPT) break; /* by dbg */
pt = TYPE_BASE (pt);
j++;
}
if (j == 100)
{
Message("Looping in getting the Basetype; sorry",0);
exit(1);
}
}
return pt;
}
char *create_unp_str(str)
char *str;
{
char *pt;
if (!str)
return NULL;
pt = (char *) xmalloc((int)(strlen(str)+1));
memset(pt, 0, strlen(str)+1);
strcpy(pt,str);
return pt;
}
char *alloc_str(size)
int size;
{
char *pt;
if (!(size++)) return NULL;
pt = (char *) xmalloc(size);
memset(pt, 0, size);
return pt;
}
int Reset_Unparser()
{
int i,j;
/* initialize the number of flag */
Number_Of_Flag = 0;
for (i=0; i < MAXFLAG ; i++)
{
TabOfFlag[i][0] = '\0';
FlagLenght[i] = 0;
for(j=0; j<MAXLEVEL; j++)
FlagOn[j][i] = 0;
FlagLevel[i] = 0;
}
/* setbuffer to 0 */
Buf_pointer = 0;
Buf_address = &(UnpBuf[0]); /* may be reallocated */
memset(UnpBuf, 0, MAXLENGHTBUF);
return 0;
}
/* function to manage the unparse buffer */
int BufPutChar(c)
char c;
{
if (Buf_pointer >= MAXLENGHTBUF)
{
Message("Unparse Buffer Full",0);
return 0;
}
Buf_address[Buf_pointer] = c;
Buf_pointer++;
return 1;
}
int BufPutString(s, len)
char *s;
int len;
{
int length;
if (!s)
{
Message("Null String in BufPutString",0);
return 0;
}
length = len;
if (length <= 0)
length = strlen(s);
if (Buf_pointer + length>= MAXLENGHTBUF)
{
Message("Unparse Buffer Full",0);
return 0;
}
strncpy(&(Buf_address[Buf_pointer]),s,length);
Buf_pointer += length;
return 1;
}
int BufPutInt(i)
int i;
{
int length;
char s[MAXLFLAG];
sprintf(s,"%d",i);
length = strlen(s);
if (Buf_pointer + length>= MAXLENGHTBUF)
{
Message("Unparse Buffer Full",0);
return 0;
}
strncpy(&(Buf_address[Buf_pointer]),s,length);
Buf_pointer += length;
return 1;
}
int Get_Flag_val(str, i)
char *str;
int *i;
{
int j, con;
char sflag[MAXLFLAG];
(*i)++; /* skip the paranthesis */
/* extract the flag name */
j = *i;
con = 0;
while ((str[j] != '\0') && (str[j] != ')'))
{
sflag[con] = str[j];
con ++;
j ++;
}
sflag[con] = '\0';
con ++;
/* look in table if flag is in */
for (j = 0 ; j < Number_Of_Flag; j++)
{
if (strncmp(TabOfFlag[j],sflag, con) == 0)
break;
}
*i += con;
if (j >= Number_Of_Flag)
{
/* not found */
return 0;
}
else
return FlagOn[FlagLevel[j]][j];
}
void Treat_Flag(str, i, val)
char *str;
int *i;
int val;
{
int j, con;
char sflag[MAXLFLAG];
(*i)++; /* skip the paranthesis */
/* extract the flag name */
j = *i;
con = 0;
while ((str[j] != '\0') && (str[j] != ')'))
{
sflag[con] = str[j];
con ++;
j ++;
}
sflag[con] = '\0';
con ++;
/* look in table if flag is in */
for (j = 0 ; j < Number_Of_Flag; j++)
{
if (strncmp(TabOfFlag[j],sflag, con) == 0)
break;
}
if (j >= Number_Of_Flag)
{
/* not found */
strcpy(TabOfFlag[Number_Of_Flag],sflag);
FlagOn[0][Number_Of_Flag] = val;
FlagLenght[Number_Of_Flag] = con-1;
Number_Of_Flag++;
} else
FlagOn[FlagLevel[j]][j] += val;
*i += con;
}
void PushPop_Flag(str, i, val)
char *str;
int *i;
int val;
{
int j, con;
char sflag[MAXLFLAG];
(*i)++; /* skip the paranthesis */
/* extract the flag name */
j = *i;
con = 0;
while ((str[j] != '\0') && (str[j] != ')'))
{
sflag[con] = str[j];
con ++;
j ++;
}
sflag[con] = '\0';
con ++;
/* look in table if flag is in */
for (j = 0 ; j < Number_Of_Flag; j++)
{
if (strncmp(TabOfFlag[j],sflag, con) == 0)
break;
}
if (j < Number_Of_Flag)
{
/* if a pop, clear old value befor poping */
if(val< 0) FlagOn[FlagLevel[j]][j] = 0; /* added by dbg to make sure initialized */
FlagLevel[j] += val;
if (FlagLevel[j] < 0)
FlagLevel[j] = 0;
if (FlagLevel[j] >= MAXLEVEL)
{
Message("Stack of flag overflow; abort()",0);
abort();
}
}
/* else printf("WARNING(unparser): unknow flag pushed or popped:%s\n",sflag); */
*i += con;
}
char * Tool_Unparse_Type();
char *Tool_Unparse_Symbol (symb)
PTR_SYMB symb;
{
PTR_TYPE ov_type;
if (!symb)
return NULL;
if (SYMB_IDENT(symb))
{
if((SYMB_ATTR(symb) & OVOPERATOR)){
ov_type = SYMB_TYPE(symb);
if(TYPE_CODE(ov_type) == T_DESCRIPT){
if(TYPE_LONG_SHORT(ov_type) == BIT_VIRTUAL && In_Class_Flag){
BufPutString ("virtual ",0);
if(TYPE_LONG_SHORT(ov_type) == BIT_ATOMIC) BufPutString ("atomic ",0);
ov_type = TYPE_DESCRIP_BASE_TYPE(ov_type);
}
if(TYPE_LONG_SHORT(ov_type) == BIT_INLINE){
BufPutString ("inline ",0);
ov_type = TYPE_DESCRIP_BASE_TYPE(ov_type);
}
}
} else ov_type = NULL;
if ((SYMB_ATTR(symb) & OVOPERATOR) ||
(strcmp(SYMB_IDENT(symb),"()")==0) ||
(strcmp(SYMB_IDENT(symb),"*")==0) ||
(strcmp(SYMB_IDENT(symb),"+")==0) ||
(strcmp(SYMB_IDENT(symb),"-")==0) ||
(strcmp(SYMB_IDENT(symb),"/")==0) ||
(strcmp(SYMB_IDENT(symb),"=")==0) ||
(strcmp(SYMB_IDENT(symb),"%")==0) ||
(strcmp(SYMB_IDENT(symb),"&")==0) ||
(strcmp(SYMB_IDENT(symb),"|")==0) ||
(strcmp(SYMB_IDENT(symb),"!")==0) ||
(strcmp(SYMB_IDENT(symb),"~")==0) ||
(strcmp(SYMB_IDENT(symb),"^")==0) ||
(strcmp(SYMB_IDENT(symb),"+=")==0) ||
(strcmp(SYMB_IDENT(symb),"-=")==0) ||
(strcmp(SYMB_IDENT(symb),"*=")==0) ||
(strcmp(SYMB_IDENT(symb),"/=")==0) ||
(strcmp(SYMB_IDENT(symb),"%=")==0) ||
(strcmp(SYMB_IDENT(symb),"^=")==0) ||
(strcmp(SYMB_IDENT(symb),"&=")==0) ||
(strcmp(SYMB_IDENT(symb),"|=")==0) ||
(strcmp(SYMB_IDENT(symb),"<<")==0) ||
(strcmp(SYMB_IDENT(symb),">>")==0) ||
(strcmp(SYMB_IDENT(symb),"<<=")==0) ||
(strcmp(SYMB_IDENT(symb),">>=")==0) ||
(strcmp(SYMB_IDENT(symb),"==")==0) ||
(strcmp(SYMB_IDENT(symb),"!=")==0) ||
(strcmp(SYMB_IDENT(symb),"<=")==0) ||
(strcmp(SYMB_IDENT(symb),">=")==0) ||
(strcmp(SYMB_IDENT(symb),"<")==0) ||
(strcmp(SYMB_IDENT(symb),">")==0) ||
(strcmp(SYMB_IDENT(symb),"&&")==0) ||
(strcmp(SYMB_IDENT(symb),"||")==0) ||
(strcmp(SYMB_IDENT(symb),"++")==0) ||
(strcmp(SYMB_IDENT(symb),"--")==0) ||
(strcmp(SYMB_IDENT(symb),"->")==0) ||
(strcmp(SYMB_IDENT(symb),"->*")==0) ||
(strcmp(SYMB_IDENT(symb),",")==0) ||
(strcmp(SYMB_IDENT(symb),"new")==0) ||
(strcmp(SYMB_IDENT(symb),"delete")==0) ||
(strcmp(SYMB_IDENT(symb),"[]")==0) )
BufPutString ("operator ",0);
}
/*
if(ov_type) Tool_Unparse_Type(ov_type, 0);
else */
BufPutString (SYMB_IDENT(symb),0);
return Buf_address;
}
typedef struct
{
int typ;
union {char *S;
long I;
} val;
} operand;
/* macro def. of operand type */
#define UNDEF_TYP 0
#define STRING_TYP 1
#define INTEGER_TYP 2
/* macro def. of comparison operators */
#define COMP_UNDEF -1 /* Bodin */
#define COMP_EQUAL 0
#define COMP_DIFF 1
void Get_Type_Operand (str, iptr, ptype,Op)
char *str;
int *iptr;
PTR_TYPE ptype;
operand *Op;
{
Op->typ = UNDEF_TYP;
if (strncmp(&(str[*iptr]),"%CHECKFLAG", strlen("%CHECKFLAG"))== 0)
{
Op->typ = INTEGER_TYP;
*iptr += strlen("%CHECKFLAG");
Op->val.I = Get_Flag_val(str, iptr);
} else
if (strncmp(&(str[*iptr]),"%STRCST", strlen("%STRCST"))== 0) /* %STRCST : String Constant */
{
int i_save;
*iptr += strlen("%STRCST");
while (str[*iptr] == ' ') {(*iptr)++;} /* skip spaces before string */
if (str[*iptr] != '\'')
{
Message (" *** Missing \"'\" after %STRCST *** ",0);
}
i_save = ++(*iptr);
while ((str[*iptr] != '\0') && (str[*iptr] != '\'')) (*iptr)++;
Op->val.S = alloc_str ((*iptr) - i_save);
strncpy (Op->val.S, &(str[i_save]), (*iptr) - i_save);
Op->typ = STRING_TYP;
} else
if (strncmp(&(str[*iptr]),"%NULL", strlen("%NULL"))== 0) /* %NULL : Integer Constant (or false boolean) */
{
Op->typ = INTEGER_TYP;
Op->val.I = 0;
*iptr += strlen("%NULL");
} else
if (strncmp(&(str[*iptr]),"%INIMPLI", strlen("%INIMPLI"))== 0) /* %INIMPLI : In_Impli_Statement (integer / boolean flag) */
{
Op->typ = INTEGER_TYP;
Op->val.I = In_Impli_Flag;
*iptr += strlen("%INIMPLI");
} else
{
Message (" *** Unknown operand in %IF (condition) for Type Node *** ",0);
}
}
void Get_LL_Operand (str, iptr, ll, Op)
char *str;
int *iptr;
PTR_LLND ll;
operand *Op;
{
Op->typ = UNDEF_TYP;
if (strncmp(&(str[*iptr]),"%CHECKFLAG", strlen("%CHECKFLAG"))== 0)
{
Op->typ = INTEGER_TYP;
*iptr += strlen("%CHECKFLAG");
Op->val.I = Get_Flag_val(str, iptr);
} else
if (strncmp(&(str[*iptr]),"%STRCST", strlen("%STRCST"))== 0) /* %STRCST : String Constant */
{
int i_save;
*iptr += strlen("%STRCST");
while (str[*iptr] == ' ') {(*iptr)++;} /* skip spaces before string */
if (str[*iptr] != '\'')
{
Message (" *** Missing \"'\" after %STRCST *** ",0);
}
i_save = ++(*iptr);
while ((str[*iptr] != '\0') && (str[*iptr] != '\'')) (*iptr)++;
Op->val.S = alloc_str ((*iptr) - i_save);
strncpy (Op->val.S, &(str[i_save]), (*iptr) - i_save);
Op->typ = STRING_TYP;
} else
if (strncmp(&(str[*iptr]),"%SYMBOL", strlen("%SYMBOL"))== 0) /* %SYMBOL : Symbol pointer (integer) */
{
Op->typ = INTEGER_TYP;
Op->val.I = (long) NODE_SYMB (ll);
*iptr += strlen("%SYMBOL");
} else
if (strncmp(&(str[*iptr]),"%SYMBID", strlen("%SYMBID"))== 0) /* %SYMBID : Symbol identifier (string) */
{
Op->typ = STRING_TYP;
if (NODE_SYMB (ll))
Op->val.S = SYMB_IDENT (NODE_SYMB (ll));
else
Op->val.S = NULL;
*iptr += strlen("%SYMBID");
} else
if (strncmp(&(str[*iptr]),"%NULL", strlen("%NULL"))== 0) /* %NULL : Integer Constant (or false boolean) */
{
Op->typ = INTEGER_TYP;
Op->val.I = 0;
*iptr += strlen("%NULL");
} else
if (strncmp(&(str[*iptr]),"%LL1", strlen("%LL1"))== 0) /* %LL1 : Low Level Node 1 (integer) */
{
Op->typ = INTEGER_TYP;
Op->val.I = (long) NODE_TEMPLATE_LL1 (ll);
*iptr += strlen("%LL1");
} else
if (strncmp(&(str[*iptr]),"%LL2", strlen("%LL2"))== 0) /* %LL2 : Low Level Node 2 (integer) */
{
Op->typ = INTEGER_TYP;
Op->val.I = (long) NODE_TEMPLATE_LL2 (ll);
*iptr += strlen("%LL2");
} else
if (strncmp(&(str[*iptr]),"%LABUSE", strlen("%LABUSE"))== 0) /* %LABUSE : label ptr (integer) */
{
Op->typ = INTEGER_TYP;
Op->val.I = (long) NODE_LABEL (ll);
*iptr += strlen("%LABUSE");
} else
if (strncmp(&(str[*iptr]),"%L1CODE", strlen("%L1CODE"))== 0) /* %L1CODE : Code (variant) of Low Level Node 1 (integer) */
{
Op->typ = INTEGER_TYP;
if (NODE_TEMPLATE_LL1 (ll))
Op->val.I = NODE_CODE (NODE_TEMPLATE_LL1 (ll));
else
Op->val.I = (long) NULL;
*iptr += strlen("%L1CODE");
} else
if (strncmp(&(str[*iptr]),"%L2CODE", strlen("%L2CODE"))== 0) /* %L2CODE : Code (variant) of Low Level Node 2 (integer) */
{
Op->typ = INTEGER_TYP;
if (NODE_TEMPLATE_LL2 (ll))
Op->val.I = NODE_CODE (NODE_TEMPLATE_LL2 (ll));
else
Op->val.I = (long) NULL;
*iptr += strlen("%L2CODE");
} else
if (strncmp(&(str[*iptr]),"%INWRITE", strlen("%INWRITE"))== 0) /* %INWRITE : In_Write_Statement (integer / boolean flag) */
{
Op->typ = INTEGER_TYP;
Op->val.I = In_Write_Flag;
*iptr += strlen("%INWRITE");
} else
if (strncmp(&(str[*iptr]),"%RECPORT", strlen("%RECPORT"))== 0) /* %RECPORT : reccursive_port_decl (integer / boolean flag) */
{
Op->typ = INTEGER_TYP;
Op->val.I = Rec_Port_Decl;
*iptr += strlen("%RECPORT");
} else
if (strncmp(&(str[*iptr]),"%INPARAM", strlen("%INPARAM"))== 0) /* %INPARAM : In_Param_Statement (integer / boolean flag) */
{
Op->typ = INTEGER_TYP;
Op->val.I = In_Param_Flag;
*iptr += strlen("%INPARAM");
} else
if (strncmp(&(str[*iptr]),"%INIMPLI", strlen("%INIMPLI"))== 0) /* %INIMPLI : In_Impli_Statement (integer / boolean flag) */
{
Op->typ = INTEGER_TYP;
Op->val.I = In_Impli_Flag;
*iptr += strlen("%INIMPLI");
} else
if (strncmp(&(str[*iptr]),"%L1L2*L1CODE", strlen("%L1L2*L1CODE"))== 0) /* %L1L2L1CODE : Code (variant) of Low Level Node 1 of Low Level Node 2 of Low Level Node 1 (integer) */
{
PTR_LLND temp;
Op->typ = INTEGER_TYP;
if (NODE_OPERAND0(ll))
{
temp = NODE_OPERAND0(ll);
while (temp && NODE_OPERAND1(temp)) temp = NODE_OPERAND1(temp);
if (temp && NODE_OPERAND0(temp))
Op->val.I = NODE_CODE (NODE_OPERAND0(temp));
else
Op->val.I = (long) NULL;
}
else
Op->val.I = (long) NULL;
*iptr += strlen("%L1L2*L1CODE");
} else
{
Message (" *** Unknown operand in %IF (condition) for LL Node *** ",0);
}
}
void Get_Bif_Operand (str, iptr, bif,Op)
char *str;
int *iptr;
PTR_BFND bif;
operand *Op;
{
Op->typ = UNDEF_TYP;
if (strncmp(&(str[*iptr]),"%ELSIFBLOB2", strlen("%ELSIFBLOB2"))== 0)
{
Op->typ = INTEGER_TYP;
*iptr += strlen("%ELSIFBLOB2");
if (BIF_BLOB2(bif) && (BIF_CODE(BLOB_VALUE(BIF_BLOB2(bif))) == ELSEIF_NODE))
Op->val.I = 1;
else
Op->val.I = 0;
} else
if (strncmp(&(str[*iptr]),"%LABEL", strlen("%LABEL"))== 0)
{
Op->typ = INTEGER_TYP;
*iptr += strlen("%LABEL");
Op->val.I = (long) BIF_LABEL(bif);
} else
if (strncmp(&(str[*iptr]),"%CHECKFLAG", strlen("%CHECKFLAG"))== 0)
{
Op->typ = INTEGER_TYP;
*iptr += strlen("%CHECKFLAG");
Op->val.I = Get_Flag_val(str, iptr);
} else
if (strncmp(&(str[*iptr]),"%BLOB1", strlen("%BLOB1"))== 0)
{
Op->typ = INTEGER_TYP;
Op->val.I = (long) BIF_BLOB1(bif);
*iptr += strlen("%BLOB1");
} else
if (strncmp(&(str[*iptr]),"%BLOB2", strlen("%BLOB2"))== 0)
{
Op->typ = INTEGER_TYP;
Op->val.I = (long) BIF_BLOB2(bif);
*iptr += strlen("%BLOB2");
} else
if (strncmp(&(str[*iptr]),"%BIFCP", strlen("%BIFCP"))== 0)
{
Op->typ = INTEGER_TYP;
if (BIF_CP(bif))
Op->val.I = BIF_CODE(BIF_CP(bif));
else
Op->val.I = 0;
*iptr += strlen("%BIFCP");
} else
if (strncmp(&(str[*iptr]),"%VALINT", strlen("%VALINT"))== 0)
{
Op->typ = INTEGER_TYP;
Op->val.I = atoi(&(str[*iptr + strlen("%VALINT")])); /* %VALINT-12232323 space is necessary after the number*/
/* skip to next statement */
while (str[*iptr] != ' ') (*iptr)++;
} else
if (strncmp(&(str[*iptr]),"%RECURSBIT", strlen("%RECURSBIT"))== 0) /* %RECURSBIT : Symbol Attribut (integer) */
{
Op->typ = INTEGER_TYP;
Op->val.I = RECURSIVE_BIT;
*iptr += strlen("%RECURSBIT");
} else
if (strncmp(&(str[*iptr]),"%EXPR_LIST", strlen("%EXPR_LIST"))== 0) /* %EXPR_LIST : int constant EXPR_LIST code for Low Level Node (integer) */
{
Op->typ = INTEGER_TYP;
Op->val.I = EXPR_LIST;
*iptr += strlen("%EXPR_LIST");
} else
if (strncmp(&(str[*iptr]),"%SPEC_PAIR", strlen("%SPEC_PAIR"))== 0) /* %SPEC_PAIR : int constant SPEC_PAIR code for Low Level Node (integer) */
{
Op->typ = INTEGER_TYP;
Op->val.I = SPEC_PAIR;
*iptr += strlen("%SPEC_PAIR");
} else
if (strncmp(&(str[*iptr]),"%IOACCESS", strlen("%IOACCESS"))== 0) /* %IOACCESS : int constant IOACCESS code for Low Level Node (integer) */
{
Op->typ = INTEGER_TYP;
Op->val.I = IOACCESS;
*iptr += strlen("%IOACCESS");
} else
if (strncmp(&(str[*iptr]),"%STRCST", strlen("%STRCST"))== 0) /* %STRCST : String Constant */
{
int i_save;
*iptr += strlen("%STRCST");
while (str[*iptr] == ' ') {(*iptr)++;} /* skip spaces before string */
if (str[*iptr] != '\'')
{
Message (" *** Missing \"'\" after %STRCST *** ",0);
}
i_save = ++(*iptr);
while ((str[*iptr] != '\0') && (str[*iptr] != '\'')) (*iptr)++;
Op->val.S = alloc_str ((*iptr) - i_save);
strncpy (Op->val.S, &(str[i_save]), (*iptr) - i_save);
Op->typ = STRING_TYP;
(*iptr)++; /* skip the ' */
} else
if (strncmp(&(str[*iptr]),"%SYMBOL", strlen("%SYMBOL"))== 0) /* %SYMBOL : Symbol pointer (integer) */
{
Op->typ = INTEGER_TYP;
Op->val.I = (long) BIF_SYMB (bif);
*iptr += strlen("%SYMBOL");
} else
if (strncmp(&(str[*iptr]),"%SATTR", strlen("%SATTR"))== 0) /* %SATTR : Symbol Attribut (integer) */
{
Op->typ = INTEGER_TYP;
Op->val.I = (BIF_SYMB (bif))->attr;
*iptr += strlen("%SATTR");
} else
if (strncmp(&(str[*iptr]),"%SYMBID", strlen("%SYMBID"))== 0) /* %SYMBID : Symbol identifier (string) */
{
Op->typ = STRING_TYP;
if (BIF_SYMB (bif))
Op->val.S = SYMB_IDENT (BIF_SYMB (bif));
else
Op->val.S = NULL;
*iptr += strlen("%SYMBID");
} else
if (strncmp(&(str[*iptr]),"%NULL", strlen("%NULL"))== 0) /* %NULL : Integer Constant (or false boolean) */
{
Op->typ = INTEGER_TYP;
Op->val.I = 0;
*iptr += strlen("%NULL");
} else
if (strncmp(&(str[*iptr]),"%LL1", strlen("%LL1"))== 0) /* %LL1 : Low Level Node 1 (integer) */
{
Op->typ = INTEGER_TYP;
Op->val.I = (long) BIF_LL1 (bif);
*iptr += strlen("%LL1");
} else
if (strncmp(&(str[*iptr]),"%LL2", strlen("%LL2"))== 0) /* %LL2 : Low Level Node 2 (integer) */
{
Op->typ = INTEGER_TYP;
Op->val.I = (long) BIF_LL2 (bif);
*iptr += strlen("%LL2");
} else
if (strncmp(&(str[*iptr]),"%LL3", strlen("%LL3"))== 0) /* %LL3 : Low Level Node 3 (integer) */
{
Op->typ = INTEGER_TYP;
Op->val.I = (long) BIF_LL3 (bif);
*iptr += strlen("%LL3");
} else
if (strncmp(&(str[*iptr]),"%LABUSE", strlen("%LABUSE"))== 0) /* %LABUSE : label ptr (used for do : doend) (integer) */
{
Op->typ = INTEGER_TYP;
Op->val.I = (long) BIF_LABEL_USE (bif);
*iptr += strlen("%LABUSE");
} else
if (strncmp(&(str[*iptr]),"%L1CODE", strlen("%L1CODE"))== 0) /* %L1CODE : Code (variant) of Low Level Node 1 (integer) */
{
Op->typ = INTEGER_TYP;
if (BIF_LL1 (bif))
Op->val.I = NODE_CODE (BIF_LL1 (bif));
else
Op->val.I = (long) NULL;
*iptr += strlen("%L1CODE");
} else
if (strncmp(&(str[*iptr]),"%L2CODE", strlen("%L2CODE"))== 0) /* %L2CODE : Code (variant) of Low Level Node 2 (integer) */
{
Op->typ = INTEGER_TYP;
if (BIF_LL2 (bif))
Op->val.I = NODE_CODE (BIF_LL2 (bif));
else
Op->val.I = (long) NULL;
*iptr += strlen("%L2CODE");
} else
if (strncmp(&(str[*iptr]),"%L1L2L1CODE", strlen("%L1L2L1CODE"))== 0) /* %L1L2L1CODE : Code (variant) of Low Level Node 1 of Low Level Node 2 of Low Level Node 1 (integer) */
{
Op->typ = INTEGER_TYP;
if (BIF_LL1 (bif) && NODE_TEMPLATE_LL2 (BIF_LL1 (bif)) && NODE_TEMPLATE_LL1 (NODE_TEMPLATE_LL2 (BIF_LL1 (bif))))
Op->val.I = NODE_CODE (NODE_TEMPLATE_LL1 (NODE_TEMPLATE_LL2 (BIF_LL1 (bif))));
else
Op->val.I = (long) NULL;
*iptr += strlen("%L1L2L1CODE");
} else
if (strncmp(&(str[*iptr]),"%L1L2*L1CODE", strlen("%L1L2*L1CODE"))== 0) /* %L1L2L1CODE : Code (variant) of Low Level Node 1 of Low Level Node 2 of Low Level Node 1 (integer) */
{
PTR_LLND temp;
Op->typ = INTEGER_TYP;
if (BIF_LL1 (bif) && NODE_TEMPLATE_LL2 (BIF_LL1 (bif)) && NODE_TEMPLATE_LL1 (NODE_TEMPLATE_LL2 (BIF_LL1 (bif))))
{
temp = BIF_LL1 (bif);
while (NODE_OPERAND1(temp)) temp = NODE_OPERAND1(temp);
if (NODE_TEMPLATE_LL1 (temp))
Op->val.I = NODE_CODE (NODE_TEMPLATE_LL1 (temp));
else
Op->val.I = (long) NULL;
}
else
Op->val.I = (long) NULL;
*iptr += strlen("%L1L2*L1CODE");
} else
if (strncmp(&(str[*iptr]),"%L2L1STR", strlen("%L2L1STR"))== 0) /* %L2L1STR : String (string_val) of Low Level Node 1 of Low Level Node 2 (string) */
{
Op->typ = STRING_TYP;
if (BIF_LL2 (bif) && NODE_TEMPLATE_LL1 (BIF_LL2 (bif)))
Op->val.S = NODE_STR (NODE_TEMPLATE_LL1 (BIF_LL2 (bif)));
else
Op->val.S = NULL;
*iptr += strlen("%L2L1STR");
} else
{
Message (" *** Unknown operand in %IF (condition) for Bif Node *** ",0);
}
}
int GetComp (str, iptr)
char *str;
int *iptr;
{
int Comp;
if (strncmp(&(str[*iptr]),"==", strlen("==")) == 0) /* == : Equal */
{
Comp = COMP_EQUAL;
*iptr += strlen("==");
} else
if (strncmp(&(str[*iptr]),"!=", strlen("!=")) == 0) /* != : Different */
{
Comp = COMP_DIFF;
*iptr += strlen("!=");
} else
{
Message (" *** Unknown comparison operator in %IF (condition) *** ",0);
Comp = COMP_UNDEF;
}
return Comp;
}
int Eval_Type_Condition(str, ptype)
char *str;
PTR_TYPE ptype;
{
int Result = 0;
int i = 0;
operand Op1, Op2;
int Comp;
while (str[i] == ' ') {i++;} /* skip spaces before '(condition)' */
if (str[i++] != '(')
{
Message (" *** Missing (condition) after %IF *** ",0);
return 0;
} else
while (str[i] == ' ') {i++;} /* skip spaces before first operand */
Get_Type_Operand(str, &i, ptype, &Op1);
while (str[i] == ' ') {i++;} /* skip spaces before the comparison operator */
Comp = GetComp(str, &i);
while (str[i] == ' ') {i++;} /* skip spaces before second operand */
Get_Type_Operand(str, &i, ptype, &Op2);
while (str[i] == ' ') {i++;} /* skip spaces before the closing round bracket */
if (str[i] != ')')
{
Message (" *** Missing ')' after %IF (condition *** ",0);
return i;
} else
i++;
if ((Op1.typ != UNDEF_TYP) && (Op1.typ == Op2.typ) && (Comp !=COMP_UNDEF))
{
switch (Op1.typ)
{
case STRING_TYP : Result = strcmp (Op1.val.S, Op2.val.S);
break;
case INTEGER_TYP : Result = Op1.val.I - Op2.val.I;
break;
}
if (Comp == COMP_EQUAL) Result = !Result;
if (Result) return i; /* continue from here to the corresponding %ELSE if exists */
else /* continue at the corresponding %ELSE */
{
int ifcount_local = 1;
while (str[i])
{
while (str[i] != '%') {
if (str[i]) i++;
else return i;
}
i++;
if (strncmp(&(str[i]),"IF", strlen("IF"))== 0) /* Counts %IF */
{
ifcount_local++;
i += strlen("IF");
} else
if (strncmp(&(str[i]),"ENDIF", strlen("ENDIF"))== 0) /* Counts %ENDIF ; stop skipping if corresponding */
{
ifcount_local--;
i += strlen("ENDIF");
if (ifcount_local == 0) return i;
} else
if (strncmp(&(str[i]),"ELSE", strlen("ELSE"))== 0) /* Counts %ELSE ; stop skipping if corresponding*/
{
i += strlen("ELSE");
if (ifcount_local == 1) return i;
}
}
return i;
}
} else
{
Message (" *** Error in condition for %IF command *** 1",0);
return i;
}
}
int Eval_LLND_Condition(str, ll)
char *str;
PTR_LLND ll;
{
int Result = 0;
int i = 0;
operand Op1, Op2;
int Comp = 0;
while (str[i] == ' ') {i++;} /* skip spaces before '(condition)' */
if (str[i++] != '(')
{
Message (" *** Missing (condition) after %IF *** ",0);
return 0;
} else
while (str[i] == ' ') {i++;} /* skip spaces before first operand */
Get_LL_Operand(str, &i, ll, &Op1);
while (str[i] == ' ') {i++;} /* skip spaces before the comparison operator */
Comp = GetComp(str, &i);
while (str[i] == ' ') {i++;} /* skip spaces before second operand */
Get_LL_Operand(str, &i, ll, &Op2);
while (str[i] == ' ') {i++;} /* skip spaces before the closing round bracket */
if (str[i] != ')')
{
Message (" *** Missing ')' after %IF (condition *** ",0);
i++;
return i;
} else
i++;
if ((Op1.typ != UNDEF_TYP) && (Op1.typ == Op2.typ) && (Comp != COMP_UNDEF))
{
switch (Op1.typ)
{
case STRING_TYP : Result = strcmp (Op1.val.S, Op2.val.S);
break;
case INTEGER_TYP : Result = Op1.val.I - Op2.val.I;
break;
}
if (Comp == COMP_EQUAL) Result = !Result;
if (Result) return i; /* continue from here to the corresponding %ELSE if exists */
else /* continue at the corresponding %ELSE */
{
int ifcount_local = 1;
while (str[i])
{
while (str[i] != '%') {
if (str[i]) i++;
else return i;
}
i++;
if (strncmp(&(str[i]),"IF", strlen("IF"))== 0) /* Counts %IF */
{
ifcount_local++;
i += strlen("IF");
} else
if (strncmp(&(str[i]),"ENDIF", strlen("ENDIF"))== 0) /* Counts %ENDIF ; stop skipping if corresponding */
{
ifcount_local--;
i += strlen("ENDIF");
if (ifcount_local == 0) return i;
} else
if (strncmp(&(str[i]),"ELSE", strlen("ELSE"))== 0) /* Counts %ELSE ; stop skipping if corresponding*/
{
i += strlen("ELSE");
if (ifcount_local == 1) return i;
}
}
return i;
}
} else
{
Message (" *** Error in condition for %IF command *** 2",0);
return i;
}
}
int Eval_Bif_Condition(str, bif)
char *str;
PTR_BFND bif;
{
int Result = 0;
int i = 0;
operand Op1, Op2;
int Comp;
while (str[i] == ' ') {i++;} /* skip spaces before '(condition)' */
if (str[i++] != '(')
{
Message (" *** Missing (condition) after %IF *** ",0);
return 0;
} else
while (str[i] == ' ') {i++;} /* skip spaces before first operand */
Get_Bif_Operand(str, &i, bif, &Op1);
while (str[i] == ' ') {i++;} /* skip spaces before the comparison operator */
Comp = GetComp(str, &i);
while (str[i] == ' ') {i++;} /* skip spaces before second operand */
Get_Bif_Operand(str, &i, bif, &Op2);
while (str[i] == ' ') {i++;} /* skip spaces before the closing round bracket */
if (str[i] != ')')
{
Message (" *** Missing ')' after %IF (condition *** ",0);
return i;
} else
i++;
if ((Op1.typ != UNDEF_TYP) && (Op1.typ == Op2.typ) && (Comp != COMP_UNDEF))
{
switch (Op1.typ)
{
case STRING_TYP : Result = strcmp (Op1.val.S, Op2.val.S);
break;
case INTEGER_TYP : Result = Op1.val.I - Op2.val.I;
break;
}
if (Comp == COMP_EQUAL) Result = !Result;
if (Result) return i; /* continue from here to the corresponding %ELSE if exists */
else /* continue at the corresponding %ELSE */
{
int ifcount_local = 1;
while (str[i])
{
while (str[i] != '%') {
if (str[i]) i++;
else return i;
}
i++;
if (strncmp(&(str[i]),"IF", strlen("IF"))== 0) /* Counts %IF */
{
ifcount_local++;
i += strlen("IF");
} else
if (strncmp(&(str[i]),"ENDIF", strlen("ENDIF"))== 0) /* Counts %ENDIF ; stop skipping if corresponding */
{
ifcount_local--;
i += strlen("ENDIF");
if (ifcount_local == 0) return i;
} else
if (strncmp(&(str[i]),"ELSE", strlen("ELSE"))== 0) /* Counts %ELSE ; stop skipping if corresponding*/
{
i += strlen("ELSE");
if (ifcount_local == 1) return i;
}
}
return i;
}
} else
{
Message (" *** Error in condition for %IF command *** 3",0);
return i;
}
}
int SkipToEndif (str)
char *str;
{
int ifcount_local = 1;
int i = 0;
while (str[i])
{
while (str[i] != '%') {
if (str[i]) i++;
else return i;
}
i++;
if (strncmp(&(str[i]),"IF", strlen("IF"))== 0) /* Counts %IF */
{
ifcount_local++;
i += strlen("IF");
} else
if (strncmp(&(str[i]),"ENDIF", strlen("ENDIF"))== 0) /* Counts %ENDIF ; stop skipping if corresponding */
{
ifcount_local--;
i += strlen("ENDIF");
if (ifcount_local == 0) return i;
}
}
return i;
}
char *Tool_Unparse2_LLnode ();
char *Tool_Unparse_Type (ptype)
PTR_TYPE ptype;
/*int def;*/ /* def = 1 : defined type */
/* def = 0 : named type */
{
int variant;
int kind;
char *str;
char c;
int i;
if (!ptype)
return NULL;
variant = TYPE_CODE (ptype);
kind = (int) node_code_kind [(int) variant];
if (kind != (int)TYPENODE)
Message ("Error in Unparse, not a type node", 0);
str = Unparse_Def [variant].str;
/* now we have to interpret the code to unparse it */
if (str == NULL)
return NULL;
if (strcmp ( str, "n") == 0)
{
Message("Node not define for unparse",0);
return NULL;
}
i = 0 ;
c = str[i];
while (c != '\0')
{
if (c == '%')
{
i++;
c = str[i];
/******** WE HAVE TO INTERPRET THE COMMAND *********/
if (c == '%') /* %% : Percent Sign */
{
BufPutString ("%",0);
i++;
} else
if (strncmp(&(str[i]),"ERROR", strlen("ERROR"))== 0) /* %ERROR : Generate error message */
{
Message("Error Node not defined",0);
BufPutInt(variant);
BufPutString ("-----TYPE ERROR--------",0);
i += strlen("ERROR");
} else
if (strncmp(&(str[i]),"NL", strlen("NL"))== 0) /* %NL : NewLine */
{
/*int j;*/
BufPutChar ('\n');
/* for (j = 0; j < TabNumber; j++)
if (j>1)
BufPutString (" ",0);
else
BufPutString (" ",0);*/
i += strlen("NL");
} else
if (strncmp(&(str[i]),"NOTABNL", strlen("NOTABNL"))== 0) /* %NL : NewLine */
{
BufPutChar ('\n');
i += strlen("NOTABNL");
} else
if (strncmp(&(str[i]),"RIDPT", strlen("RIDPT"))== 0)
{
DealWith_Rid(ptype,In_Class_Flag);
i += strlen("RIDPT");
} else
if (strncmp(&(str[i]),"TABNAME", strlen("TABNAME"))== 0) /* %TABNAME : Self Name from Table */
{
if (Check_Lang_Fortran(cur_proj))
BufPutString (ftype_name [type_index (TYPE_CODE (ptype))],0);
else
{
BufPutString (ctype_name [type_index (TYPE_CODE (ptype))],0);
}
i += strlen("TABNAME");
} else
if (strncmp(&(str[i]),"TAB", strlen("TAB"))== 0) /* %TAB : Tab */
{
BufPutString (" ",0); /* cychen */
i += strlen("TAB");
} else
if (strncmp(&(str[i]),"SETFLAG", strlen("SETFLAG"))== 0)
{
i = i + strlen("SETFLAG");
Treat_Flag(str, &i,1);
} else
if (strncmp(&(str[i]),"UNSETFLAG", strlen("UNSETFLAG"))== 0)
{
i = i + strlen("UNSETFLAG");
Treat_Flag(str, &i,-1);
} else
if (strncmp(&(str[i]),"PUSHFLAG", strlen("PUSHFLAG"))== 0)
{
i = i + strlen("PUSHFLAG");
PushPop_Flag(str, &i,1);
} else
if (strncmp(&(str[i]),"POPFLAG", strlen("POPFLAG"))== 0)
{
i = i + strlen("POPFLAG");
PushPop_Flag(str, &i,-1);
} else
if (strncmp(&(str[i]),"PUTTAB", strlen("PUTTAB"))== 0) /* %TAB : Tab */
{
int j;
for (j = 0; j < TabNumber; j++)
if (j>0)
BufPutString (" ",0);
else
BufPutString (" ",0); /* cychen */
i += strlen("PUTTAB");
} else
if (strncmp(&(str[i]),"IF", strlen("IF"))== 0) /* %IF : If ; syntax : %IF (condition) then_bloc [%ELSE else_bloc] %ENDIF */
{
i += strlen("IF");
i += Eval_Type_Condition(&(str[i]), ptype);
} else
if (strncmp(&(str[i]),"ELSE", strlen("ELSE"))== 0) /* %ELSE : Else */
{
i += strlen("ELSE");
i += SkipToEndif(&(str[i])); /* skip to the corresponding endif */
} else
if (strncmp(&(str[i]),"ENDIF", strlen("ENDIF"))== 0) /* %ENDIF : End of If */
{
i += strlen("ENDIF");
} else
if (strncmp(&(str[i]),"SUBTYPE", strlen("SUBTYPE"))== 0) /* %SUBTYPE : find the next type for (CAST) */
{
PTR_TYPE pt;
pt = TYPE_BASE(ptype);
if(pt) Tool_Unparse_Type(pt);
i += strlen("SUBTYPE");
} else
if (strncmp(&(str[i]),"BASETYPE", strlen("BASETYPE"))== 0) /* %BASETYPE : Base Type Name Identifier */
{
if (Check_Lang_Fortran(cur_proj))
BufPutString (ftype_name [type_index (TYPE_CODE (TYPE_BASE (ptype)))],0);
else
{
PTR_TYPE pt;
pt = Find_BaseType(ptype);
if (pt)
{
Tool_Unparse_Type(pt);
} else{
/* printf("offeding node type node: %d\n", ptype->id);
Message("basetype not found",0);
*/
}
}
i += strlen("BASETYPE");
} else
if (strncmp(&(str[i]),"FBASETYPE", strlen("FBASETYPE"))== 0) /* %FBASETYPE : Base Type Name Identifier */
{
PTR_TYPE pt;
pt = Find_BaseType2(ptype);
if (pt)
{
Tool_Unparse_Type(pt);
} else{
/* printf("offeding node type node: %d\n", ptype->id);
Message("basetype not found",0);
*/
}
i += strlen("FBASETYPE");
} else
if (strncmp(&(str[i]),"STAR", strlen("STAR"))== 0)
{
PTR_TYPE pt;
int flg;
pt = ptype;
/* while (pt) */
{
if (TYPE_CODE(pt) == T_POINTER){
BufPutString ("*",0);
flg = pt->entry.Template.dummy5;
if(flg & BIT_RESTRICT) BufPutString(" restrict ",0);
if(flg & BIT_CONST) BufPutString(" const ",0);
if(flg & BIT_GLOBL) BufPutString(" global ",0);
if(flg & BIT_SYNC) BufPutString(" Sync ",0);
if(flg & BIT_VOLATILE) BufPutString(" volatile ",0);
}
else
if (TYPE_CODE(pt) == T_REFERENCE){
BufPutString ("&",0);
flg = pt->entry.Template.dummy5;
if(flg & BIT_RESTRICT) BufPutString(" restrict ",0);
if(flg & BIT_CONST) BufPutString(" const ",0);
if(flg & BIT_GLOBL) BufPutString(" global ",0);
if(flg & BIT_SYNC) BufPutString(" Sync ",0);
if(flg & BIT_VOLATILE) BufPutString(" volatile ",0);
}
/* else
break;
if(TYPE_CODE(pt) == T_MEMBER_POINTER)
pt = TYPE_COLL_BASE(pt);
else pt = TYPE_BASE(pt); */
}
i += strlen("STAR");
} else
if (strncmp(&(str[i]),"RANGES", strlen("RANGES"))== 0) /* %RANGES : Ranges */
{
Tool_Unparse2_LLnode (TYPE_RANGES (ptype));
i += strlen("RANGES");
} else
if (strncmp(&(str[i]),"NAMEID", strlen("NAMEID"))== 0) /* %NAMEID : Name Identifier */
{
if (ptype->name)
BufPutString ( ptype->name->ident,0);
else
{
BufPutString ("-------TYPE ERROR (NAMEID)------",0);
}
i += strlen("NAMEID");
} else
if (strncmp(&(str[i]),"SYMBID", strlen("SYMBID"))== 0) /* %NAMEID : Name Identifier */
{
if (TYPE_SYMB_DERIVE(ptype)){
PTR_SYMB cname;
cname = TYPE_SYMB_DERIVE(ptype);
if(TYPE_CODE(ptype) == T_DERIVED_TYPE){
if((SYMB_CODE(cname) == STRUCT_NAME) && (SYMB_TYPE(cname) == NULL)
&&(BIF_CODE(SYMB_SCOPE(cname)) == GLOBAL))
BufPutString("struct ", 0);
if((SYMB_CODE(cname) == CLASS_NAME) && (SYMB_TYPE(cname) == NULL)
&&(BIF_CODE(SYMB_SCOPE(cname)) == GLOBAL))
BufPutString("class ", 0);
if((SYMB_CODE(cname) == UNION_NAME) && (SYMB_TYPE(cname) == NULL)
&&(BIF_CODE(SYMB_SCOPE(cname)) == GLOBAL))
BufPutString("union ", 0);
}
if(TYPE_SCOPE_SYMB_DERIVE(ptype) && TYPE_CODE(ptype) != T_DERIVED_TEMPLATE) {
Tool_Unparse_Symbol(TYPE_SCOPE_SYMB_DERIVE(ptype));
BufPutString("::",0);
}
Tool_Unparse_Symbol(cname);
}
else if(TYPE_CODE(ptype) == T_MEMBER_POINTER)
Tool_Unparse_Symbol(TYPE_COLL_NAME(ptype));
else
{
printf("node = %d, variant = %d\n",TYPE_ID(ptype), TYPE_CODE(ptype));
BufPutString ("-------TYPE ERROR (ISYMBD)------",0);
}
i += strlen("SYMBID");
} else
if (strncmp(&(str[i]),"RANGLL1", strlen("RANGLL1"))== 0) /* %RANGLL1 : Low Level Node 1 of Ranges */
{
if (TYPE_RANGES (ptype))
Tool_Unparse2_LLnode (NODE_TEMPLATE_LL1 (TYPE_RANGES (ptype)));
i += strlen("RANGLL1");
} else
if (strncmp(&(str[i]),"COLLBASE", strlen("COLLBASE"))== 0) /* %COLL BASE */
{
if (TYPE_COLL_BASE(ptype))
Tool_Unparse_Type(TYPE_COLL_BASE(ptype));
i += strlen("COLLBASE");
} else
if (strncmp(&(str[i]),"TMPLARGS", strlen("TMPLARGS"))== 0) /* %RANGLL1 : Low Level Node 1 of Ranges */
{
if (TYPE_TEMPL_ARGS(ptype))
Tool_Unparse2_LLnode(TYPE_TEMPL_ARGS(ptype));
i += strlen("TMPLARGS");
} else
Message (" *** Unknown type node COMMAND *** ",0);
}
else
{
BufPutChar (c);
i++;
}
c = str[i];
}
return Buf_address;
}
char *Tool_Unparse2_LLnode(ll)
PTR_LLND ll;
{
int variant;
int kind;
char *str;
char c;
int i;
if (!ll)
return NULL;
variant = NODE_CODE (ll);
/*BufPutInt(variant);
printf("LLNODE : %i\n%s",variant,Buf_address);*/
if (TASK_PROC_GENERATE&&(HPF_VERSION==2)&&
((variant==ARRAY_REF)||
(variant==VAR_REF)||
(variant==CONST_REF))&&
ON_BLOCK&&NODE_SYMB(ll))
{
PTR_LLND ptr,new_node,new_symb;
if (!SYMB_DOVAR(NODE_SYMB(ll))&&
(!(SYMB_ATTR(NODE_SYMB(ll))&TASK_BIT))&&
(!(SYMB_ATTR(NODE_SYMB(ll))&PROCESSORS_BIT)))
{
new_symb=make_llnode(variant,LLNULL,LLNULL,NODE_SYMB(ll));
new_node=make_llnode(EXPR_LIST,new_symb,LLNULL,SMNULL);
if (parameter_list)
{
ptr=Follow_Llnd(parameter_list,2);
NODE_OPERAND1(ptr)=new_node;
}
if (!parameter_list) parameter_list=new_node;
SYMB_DOVAR(NODE_SYMB(ll))=2;
}
}
kind = (int) node_code_kind[(int) variant];
if (kind != (int)LLNODE)
{
Message("Error in Unparse, not a llnd node",0);
BufPutInt(variant);
BufPutString ("------ERROR--------",0);
return NULL;
}
str = Unparse_Def[variant].str;
/* now we have to interpret the code to unparse it */
if (str == NULL)
return NULL;
if (strcmp( str, "n") == 0)
return NULL;
i = 0 ;
c = str[i];
while (c != '\0')
{
if (c == '%')
{
i++;
c = str[i];
/******** WE HAVE TO INTERPRET THE COMMAND *********/
if (c == '%') /* %% : Percent Sign */
{
BufPutString ("%",0);
i++;
} else
if (strncmp(&(str[i]),"ERROR", strlen("ERROR"))== 0) /* %ERROR : Generate error message */
{
Message ("--- unparsing error[0] : ",0);
BufPutInt(variant);
BufPutString ("------ERROR--------",0);
i += strlen("ERROR");
} else
if (strncmp(&(str[i]),"NL", strlen("NL"))== 0) /* %NL : NewLine */
{
/* int j;*/
BufPutChar ('\n');
/* for (j = 0; j < TabNumber; j++)
if (j>1)
BufPutString (" ",0);
else
BufPutString (" ",0);*/
i += strlen("NL");
} else
if (strncmp(&(str[i]),"TAB", strlen("TAB"))== 0) /* %TAB : Tab */
{
BufPutString (" ",0); /* cychen */
i += strlen("TAB");
} else
if (strncmp(&(str[i]),"BACK", strlen("BACK"))== 0)
{
Buf_pointer--;
i += strlen("BACK");
} else
if (strncmp(&(str[i]),"IF", strlen("IF"))== 0) /* %IF : If ; syntax : %IF (condition) then_bloc [%ELSE else_bloc] %ENDIF */
{
i += strlen("IF");
i += Eval_LLND_Condition(&(str[i]), ll);
} else
if (strncmp(&(str[i]),"ELSE", strlen("ELSE"))== 0) /* %ELSE : Else */
{
i += strlen("ELSE");
i += SkipToEndif(&(str[i])); /* skip to the corresponding endif */
} else
if (strncmp(&(str[i]),"ENDIF", strlen("ENDIF"))== 0) /* %ENDIF : End of If */
{
i += strlen("ENDIF");
} else
if (strncmp(&(str[i]),"LL1", strlen("LL1"))== 0) /* %LL1 : Low Level Node 1 */
{
Tool_Unparse2_LLnode(NODE_TEMPLATE_LL1(ll));
i += strlen("LL1");
} else
if (strncmp(&(str[i]),"LL2", strlen("LL2"))== 0) /* %LL2 : Low Level Node 2 */
{
Tool_Unparse2_LLnode(NODE_TEMPLATE_LL2(ll));
i += strlen("LL2");
} else
if (strncmp(&(str[i]),"SYMBID", strlen("SYMBID"))== 0) /* %SYMBID : Symbol identifier */
{
Tool_Unparse_Symbol (NODE_SYMB (ll));
i += strlen("SYMBID");
} else
if (strncmp(&(str[i]),"NEWSPEC", strlen("NEWSPEC"))== 0)
{
if (NewSpecList)
{
#ifdef __SPF
removeFromCollection(NewSpecList);
#endif
free(NewSpecList);
}
NewSpecList=NODE_OPERAND0(ll);
i += strlen("NEWSPEC");
} else
if (strncmp(&(str[i]),"COMMONDECL", strlen("COMMONDECL"))== 0) /* %DECLARATION : We need to change declaration of Pointer descriptor */
{
int count=0;
if ((NODE_CODE(ll)==COMM_LIST)&&NODE_OPERAND0(ll)) count=FindCommonHeapDeclaration(NODE_OPERAND0(ll));
if (!count)
{
count=0;
Treat_Flag("(POINTER)",&count, 1);
}
i += strlen("COMMONDECL");
} else
if (strncmp(&(str[i]),"CHECK_HEAP", strlen("CHECK_HEAP"))== 0) /* %CHECK_HEAP : Pointer HEAP(PA) -> PA */
{
/* char *str;
if (ll) str=SYMB_IDENT(NODE_SYMB (ll));
if (!strcmp(str,"heap")||!strcmp(str,"HEAP")) */
if(SYMB_ATTR(NODE_SYMB (ll))&HEAP_BIT)
{
/*BufPutString("<HEAP_BIT",0);
BufPutString(SYMB_IDENT(NODE_SYMB (ll)),0);
BufPutString("/HEAP_BIT>",0);*/
Tool_Unparse2_LLnode (NODE_OPERAND0(ll));
return Buf_address;
}
i += strlen("CHECK_HEAP");
} else
if (strncmp(&(str[i]),"CHECK_PTR", strlen("CHECK_PTR"))== 0) /* %CHECK_HEAP : Pointer HEAP(PA) -> PA */
{
if (ll)
if(SYMB_ATTR(NODE_SYMB (ll))&DVM_POINTER_ARRAY_BIT)
BufPutString("%PTR",0);
i += strlen("CHECK_PTR");
} else
if (strncmp(&(str[i]),"CHECK_PROC_REF", strlen("CHECK_PROC_REF"))== 0) /* %CHECK_HEAP : Pointer HEAP(PA) -> PA */
{
int k=0;
if (ll)
if(SYMB_ATTR(NODE_SYMB (ll))&PROCESSORS_BIT)
if (!Get_Flag_val("(PROC_REF)",&k))
return Buf_address;
i += strlen("CHECK_PROC_REF");
} else
if (strncmp(&(str[i]),"DELETE_COMMA", strlen("DELETE_COMMA"))== 0) /* %CHECK_HEAP : Pointer HEAP(PA) -> PA */
{
if (Buf_address[Buf_pointer-1]==',')
Buf_pointer--;
i += strlen("DELETE_COMMA");
} else
if (strncmp(&(str[i]),"CHECK_DYNAMIC", strlen("CHECK_DYNAMIC"))== 0)
{
if (NODE_OPERAND0(ll)||NODE_OPERAND1(ll))
i += strlen("CHECK_DYNAMIC");
else {
int k=0;
if (Get_Flag_val("(DYNAMIC)",&k))
{
Buf_pointer--;
return Buf_address;
}
k=0;
Treat_Flag("(DYNAMIC)",&k,1);
BufPutString("DYNAMIC",0);
i += strlen("CHECK_DYNAMIC");
return Buf_address;
}
} else
if (strncmp(&(str[i]),"SAVE_SYMBOL", strlen("SAVE_SYMBOL"))== 0) /* %SAVE_SYMBOL : Reduction variables list */
{
if (Find_SaveSymbol (ll))
{
if (Buf_address[Buf_pointer-1]==',') Buf_pointer--;
return Buf_address;
}
i += strlen("SAVE_SYMBOL");
} else
if (strncmp(&(str[i]),"DELETE_SYMBOL", strlen("DELETE_SYMBOL"))== 0) /* %DELETE_SYMBOL : Clear reduction variables list */
{
Number_Of_Symbol=0;
i += strlen("DELETE_SYMBOL");
} else
if (strncmp(&(str[i]),"POINTER_NAME", strlen("POINTER_NAME"))== 0) /* %POINTER_NAME : We should change the definition of Pointer descriptor */
{
if ((NODE_CODE(ll)==VAR_REF)||(NODE_CODE(ll)==ARRAY_REF))
if(SYMB_ATTR(NODE_SYMB (ll))&DVM_POINTER_BIT)
{
Tool_Unparse_Symbol (NODE_SYMB (ll));
if (NODE_CODE(ll)==ARRAY_REF)
{
if(NODE_OPERAND0(ll))
{
BufPutChar('(');
Tool_Unparse2_LLnode (NODE_OPERAND0(ll));
BufPutChar(')');
}
}
return Buf_address;
}
i += strlen("POINTER_NAME");
} else
if (strncmp(&(str[i]),"DOPROC", strlen("DOPROC"))== 0) /* for subclass qualification */
{ int flg;
if(NODE_TYPE(ll) && (NODE_CODE(NODE_TYPE(ll)) == T_DESCRIPT)){
flg = (NODE_TYPE(ll))->entry.Template.dummy5;
if(flg & BIT_VIRTUAL) BufPutString(" virtual ",0);
if(flg & BIT_ATOMIC) BufPutString(" atomic ",0);
if(flg & BIT_PRIVATE) BufPutString(" private ",0);
if(flg & BIT_PROTECTED) BufPutString(" protected ",0);
if(flg & BIT_PUBLIC) BufPutString(" public ",0);
}
else BufPutString(" public ", 0);
/* note: this last else condition is to fix a bug in
the dep2C++ which does not create the right types
when converting a collection to a class.
*/
i += strlen("DOPROC");
} else
if (strncmp(&(str[i]),"TYPE", strlen("TYPE"))== 0) /* %TYPE : Type */
{
if(NODE_SYMB(ll) && (SYMB_ATTR(NODE_SYMB(ll)) & OVOPERATOR)){
/* this is an overloaded operator. don't do type */
}
else{ Tool_Unparse_Type (NODE_TYPE (ll)); }
i += strlen("TYPE");
} else
if (strncmp(&(str[i]),"L1SYMBCST", strlen("L1SYMBCST"))== 0) /* %L1SYMBCST : Constant Value of Low Level Node Symbol */
{
if (NODE_TEMPLATE_LL1 (ll) && NODE_SYMB (NODE_TEMPLATE_LL1 (ll)))
{
Tool_Unparse2_LLnode((NODE_SYMB (NODE_TEMPLATE_LL1 (ll)))->entry.const_value);
}
i += strlen("L1SYMBCST");
} else
if (strncmp(&(str[i]),"INTVAL", strlen("INTVAL"))== 0) /* %INTVAL : Integer Value */
{
if (NODE_INT_CST_LOW (ll) >= 0)
{
BufPutInt (NODE_INT_CST_LOW (ll));
} else
{
BufPutString ("(",0);
BufPutInt (NODE_INT_CST_LOW (ll));
BufPutString (")",0);
}
i += strlen("INTVAL");
} else
if (strncmp(&(str[i]),"STATENO", strlen("STATENO"))== 0) /* %STATENO : Statement number */
{
if (NODE_LABEL (ll))
{
BufPutInt ((int)( LABEL_STMTNO (NODE_LABEL (ll))));
}
i += strlen("STATENO");
} else
if (strncmp(&(str[i]),"STRVAL", strlen("STRVAL"))== 0) /* %STRVAL : String Value */
{
BufPutString (NODE_STR (ll),0);
i += strlen("STRVAL");
} else
if (strncmp(&(str[i]),"BOOLVAL", strlen("BOOLVAL"))== 0) /* %BOOLVAL : String Value */
{
BufPutString (NODE_BV (ll) ? ".TRUE." : ".FALSE.",0);
i += strlen("BOOLVAL");
} else
if (strncmp(&(str[i]),"CHARVAL", strlen("CHARVAL"))== 0) /* %CHARVAL : Char Value */
{
switch(NODE_CV(ll)){
case '\n':BufPutChar('\\'); BufPutChar('n'); break;
case '\t':BufPutChar('\\'); BufPutChar('t'); break;
case '\r':BufPutChar('\\'); BufPutChar('r'); break;
case '\f':BufPutChar('\\'); BufPutChar('f'); break;
case '\b':BufPutChar('\\'); BufPutChar('b'); break;
case '\a':BufPutChar('\\'); BufPutChar('a'); break;
case '\v':BufPutChar('\\'); BufPutChar('v'); break;
default:
BufPutChar (NODE_CV (ll));
}
i += strlen("CHARVAL");
} else
if (strncmp(&(str[i]),"ORBPL1", strlen("ORBPL1"))== 0) /* %ORBPL1 : Openning Round Brackets on Precedence of Low Level Node 1 */
{
int llvar = NODE_CODE (NODE_TEMPLATE_LL1 (ll));
if (binop (llvar) && (precedence [variant - EQ_OP] < precedence [llvar - EQ_OP]))
BufPutString ("(",0);
i += strlen("ORBPL1");
} else
if (strncmp(&(str[i]),"CRBPL1", strlen("CRBPL1"))== 0) /* %CRBPL1 : Closing Round Brackets on Precedence of Low Level Node 1 */
{
int llvar = NODE_CODE (NODE_TEMPLATE_LL1 (ll));
if (binop (llvar) && (precedence [variant - EQ_OP] < precedence [llvar - EQ_OP]))
BufPutString (")",0);
i += strlen("CRBPL1");
} else
if (strncmp(&(str[i]),"ORBPL2", strlen("ORBPL2"))== 0) /* %ORBPL2 : Openning Round Brackets on Precedence of Low Level Node 2 */
{
int llvar = NODE_CODE (NODE_TEMPLATE_LL2 (ll));
if (binop (llvar) && (precedence [variant - EQ_OP] <= precedence [llvar - EQ_OP]))
BufPutString ("(",0);
i += strlen("ORBPL2");
} else
if (strncmp(&(str[i]),"CRBPL2", strlen("CRBPL2"))== 0) /* %CRBPL2 : Closing Round Brackets on Precedence of Low Level Node 2 */
{
int llvar = NODE_CODE (NODE_TEMPLATE_LL2 (ll));
if (binop (llvar) && (precedence [variant - EQ_OP] <= precedence [llvar - EQ_OP]))
BufPutString (")",0);
i += strlen("CRBPL2");
} else
if (strncmp(&(str[i]),"SETFLAG", strlen("SETFLAG"))== 0)
{
i = i + strlen("SETFLAG");
Treat_Flag(str, &i,1);
} else
if (strncmp(&(str[i]),"UNSETFLAG", strlen("UNSETFLAG"))== 0)
{
i = i + strlen("UNSETFLAG");
Treat_Flag(str, &i,-1);
} else
if (strncmp(&(str[i]),"PUSHFLAG", strlen("PUSHFLAG"))== 0)
{
i = i + strlen("PUSHFLAG");
PushPop_Flag(str, &i,1);
} else
if (strncmp(&(str[i]),"POPFLAG", strlen("POPFLAG"))== 0)
{
i = i + strlen("POPFLAG");
PushPop_Flag(str, &i,-1);
} else
if (strncmp(&(str[i]),"PURE", strlen("PURE"))== 0) /* for pure function declarations */
{
PTR_SYMB symb;
symb = NODE_SYMB(ll);
if(symb && (SYMB_TEMPLATE_DUMMY8(symb) & 128)) BufPutString ("= 0",0);
i += strlen("PURE");
}
else
if (strncmp(&(str[i]),"CNSTF", strlen("CNSTF"))== 0) /* for const functions */
{
PTR_SYMB symb;
if (NODE_SYMB (ll)){
symb = BIF_SYMB (ll);
if(SYMB_TEMPLATE_DUMMY8(symb) & 64) BufPutString(" const",0);
}
i += strlen("CNSTF");
} else
if (strncmp(&(str[i]),"CNSTCHK", strlen("CNSTCHK"))== 0) /* do "const", vol" after * */
{
int flg;
PTR_TYPE t;
if((t = NODE_TYPE(ll)) &&( (NODE_CODE(t) == T_POINTER) ||
(NODE_CODE(t) == T_REFERENCE))){
flg = t->entry.Template.dummy5;
if(flg & BIT_RESTRICT) BufPutString(" restrict ",0);
if(flg & BIT_CONST) BufPutString(" const ",0);
if(flg & BIT_GLOBL) BufPutString(" global ",0);
if(flg & BIT_SYNC) BufPutString(" Sync ",0);
if(flg & BIT_VOLATILE) BufPutString(" volatile ",0);
}
i += strlen("CNSTCHK");
}
else
if (strncmp(&(str[i]),"VARLISTTY", strlen("VARLISTTY"))== 0) /* %VARLIST : list of variables / parameters */
{
PTR_SYMB symb, s;
PTR_LLND args, arg_item = NULL, t;
PTR_TYPE typ;
int new_op_flag; /* 1 if this is a new op */
new_op_flag = 0;
if(NODE_CODE(ll) == CAST_OP ){
args = NODE_OPERAND1(ll);
new_op_flag = 1;
}
else if(NODE_CODE(ll) != FUNCTION_OP){
args = NODE_OPERAND0(ll);
/* symb = SYMB_FUNC_PARAM(NODE_SYMB(ll)); */
}
else { /* this is a pointer to a function parameter */
args = NODE_OPERAND1(ll);
t = NODE_OPERAND0(ll); /* node_code(t) == deref_op */
t = NODE_OPERAND0(t); /* node_code(t) == var_ref */
s = NODE_SYMB(t);
if(s) symb = SYMB_NEXT(s);
else symb = NULL;
}
while (args )
{
int typflag;
if(new_op_flag) t = args;
else{
arg_item = NODE_OPERAND0(args);
t = arg_item;
typflag = 1;
while(t && typflag){
if((NODE_CODE(t) == VAR_REF) || (NODE_CODE(t) == ARRAY_REF))
typflag = 0;
else if (NODE_CODE(t) == SCOPE_OP) t = NODE_OPERAND1(t);
else t = NODE_OPERAND0(t);
}
}
if(t){
symb = NODE_SYMB(t);
typ = NODE_TYPE(t);
if(symb && (typ == NULL)) typ = SYMB_TYPE(symb);
if(new_op_flag || symb ) {
typflag = 1;
while(typ && typflag){
if(TYPE_CODE(typ) == T_ARRAY ||
TYPE_CODE(typ) == T_FUNCTION ||
TYPE_CODE(typ) == T_REFERENCE ||
TYPE_CODE(typ) == T_POINTER) typ = TYPE_BASE(typ);
else if(TYPE_CODE(typ) == T_MEMBER_POINTER)
typ = TYPE_COLL_BASE(typ);
else typflag = 0;
}
}
if(typ) Tool_Unparse_Type (typ);
BufPutString (" ",0);
}
else printf("unp could not find var ref!\n");
if(new_op_flag){
Tool_Unparse2_LLnode(args);
args = LLNULL;
new_op_flag = 0;
}
else{
Tool_Unparse2_LLnode(arg_item);
args = NODE_OPERAND1(args);
}
if (args) BufPutString (", ",0);
}
i += strlen("VARLISTTY");
}
else
if (strncmp(&(str[i]),"VARLIST", strlen("VARLIST"))== 0) /* %VARLIST : list of variables / parameters */
{
PTR_SYMB symb;
if (NODE_SYMB (ll))
symb = SYMB_FUNC_PARAM (NODE_SYMB (ll));
else
symb = NULL;
while (symb)
{
BufPutString ( SYMB_IDENT (symb),0);
symb = SYMB_NEXT_DECL (symb);
if (symb) BufPutString (", ",0);
}
i += strlen("VARLIST");
} else
if (strncmp(&(str[i]),"STRINGLEN", strlen("STRINGLEN"))== 0)
{
PTR_SYMB symb;
PTR_TYPE type;
if (NODE_SYMB (ll))
symb = NODE_SYMB (ll);
else
symb = NULL;
if (symb)
{
type = SYMB_TYPE(symb);
if (type && (TYPE_CODE(type) == T_ARRAY))
{
type = Find_BaseType(type);
}
if (type && (TYPE_CODE(type) == T_STRING))
{
if (TYPE_RANGES(type))
Tool_Unparse2_LLnode(TYPE_RANGES(type));
}
}
i += strlen("STRINGLEN");
} else
if (strncmp(&(str[i]),"CHPFCONTTAB", strlen("CHPFCONTTAB"))== 0) /* %TAB : Tab */
{
int j;
BufPutString ("\n!HPF$*",0);
for (j = 0; j < TabNumber; j++)
if (j>0)
BufPutString (" ",0);
else
BufPutString (" ",0);
Buf_pointer-=7;
i += strlen("CHPFCONTTAB");
} else
Message (" *** Unknown low level node COMMAND *** ",0);
}
else
{
BufPutChar ( c);
i++; /* Bodin */
}
c = str[i];
}
return Buf_address;
}
char *Tool_Unparse_Bif(bif)
PTR_BFND bif;
{
int variant;
int kind;
char *str;
char c;
int i;
int AfterDOLabel=0;
if (!bif)
return NULL;
variant = BIF_CODE(bif);
/*BufPutInt(variant);
printf("BIFNODE : %i\n%s",variant,Buf_address);*/
/*BufPutInt(isForNodeEndStmt(bif));
BufPutInt(variant);*/
kind = (int) node_code_kind[(int) variant];
if (kind != (int)BIFNODE)
Message("Error in Unparse, not a bif node",0);
str = Unparse_Def[variant].str;
if (TASK_PROC_GENERATE&&(HPF_VERSION==2)&&TaskRegionUnparse)
{ if (!BIF_ID(bif)) return Buf_address;
else BIF_ID(bif)=0;
}
if (TASK_PROC_GENERATE&&(HPF_VERSION==2)&&(variant==CONTROL_END))
if (NODE_CODE(BIF_CP(bif))==PROG_HEDR)
if (TaskRegion)
{
if (TabNumber>1) TabNumber--;
Puttab();
BufPutString("end \n\n",0);
UnparseTaskRegion(TaskRegion);
return Buf_address;
}
if (TASK_PROC_GENERATE&&(HPF_VERSION==2)&&(variant==DVM_ON_DIR))
{
char *name;
int i,temp=Buf_pointer;
PTR_FCALL fcall,new_node;
Tool_Unparse2_LLnode(BIF_LL1(bif));
name=xmalloc(Buf_pointer-temp);
for(i=0;i+temp<Buf_pointer;i++)
if(Buf_address[temp+i]!='(')
name[i]=Buf_address[temp+i];
else name[i]='_';
name[i-1]='\0';
Buf_pointer=temp;
function_name=make_funcsymb(name);
#ifdef __SPF
removeFromCollection(name);
#endif
free(name);
new_node=ALLOC(func_call);
FUNC_FIRST(new_node)=bif;
if (TaskRegion)
{
fcall=FindLast(TaskRegion);
FUNC_NEXT(fcall)=new_node;
}
else TaskRegion=new_node;
}
if (TASK_PROC_GENERATE&&(HPF_VERSION==2)&&(variant==DVM_END_ON_DIR))
{
PTR_FCALL fcall;
ON_BLOCK=0;
Buf_pointer=ON_BEGIN;
if (TaskRegion)
{
fcall=FindLast(TaskRegion);
FUNC_LAST(fcall)=bif;
FUNC_REF(fcall)=make_llnode(FUNC_CALL,parameter_list,LLNULL,function_name);
}
TabNumber++;
Puttab();
TabNumber--;
BufPutString("call ",0);
Tool_Unparse2_LLnode(make_llnode(FUNC_CALL,parameter_list,LLNULL,function_name));
BufPutString("\n",0);
parameter_list=NULL;
ResetSymbolDovar();
}
/* printf("variant = %d, str = %s\n", variant, str); */
/* now we have to interpret the code to unparse it */
if (str == NULL)
return NULL;
if (strcmp( str, "n") == 0)
if (strcmp ( str, "n") == 0)
{
Message("Node not define for unparse",BIF_LINE(bif));
return NULL;
}
i = 0 ;
if (Get_Flag_val("(COMMENT)",&i)) BufPutChar('C');
i = 0 ;
c = str[i];
while ((c != '\0') && (c != '\n'))
{
if (c == '%')
{
i++;
c = str[i];
/******** WE HAVE TO INTERPRET THE COMMAND *********/
if (c == '%') /* %% : Percent Sign */
{
BufPutString ("%",0);
i++;
} else
if (strncmp(&(str[i]),"CMNT", strlen("CMNT"))== 0)
{
i = i + strlen("CMNT");
if (!CommentOut)
{
/* print the attached comment first */
if (BIF_CMNT(bif))
{
if (CMNT_STRING(BIF_CMNT(bif)))
{
BufPutChar('\n');
BufPutString(CMNT_STRING(BIF_CMNT(bif)),0);
if (!Check_Lang_Fortran(cur_proj))
BufPutChar('\n');
}
}
}
} else
if (strncmp(&(str[i]),"DECLSPEC", strlen("DECLSPEC"))== 0) /* %DECLSPEC : for extern, static, inline, friend */
{
int index = BIF_DECL_SPECS(bif);
i = i + strlen("DECLSPEC");
if( index & BIT_EXTERN) {
BufPutString(ridpointers[(int)RID_EXTERN],0);
BufPutString(" ", 0);
}
if( index & BIT_STATIC) {
BufPutString(ridpointers[(int)RID_STATIC],0);
BufPutString(" ", 0);
}
if( index & BIT_INLINE) {
BufPutString(ridpointers[(int)RID_INLINE],0);
BufPutString(" ", 0);
}
if( index & BIT_FRIEND) {
BufPutString(ridpointers[(int)RID_FRIEND],0);
BufPutString(" ", 0);
}
} else
if (strncmp(&(str[i]),"SETFLAG", strlen("SETFLAG"))== 0)
{
i = i + strlen("SETFLAG");
Treat_Flag(str, &i,1);
} else
if (strncmp(&(str[i]),"INDEPENDENT_DO", strlen("INDEPENDENT_DO"))== 0)
{
int count=0;
if (BIF_CODE(bif)==DVM_PARALLEL_ON_DIR)
{
if (BIF_LL3(bif))
{
if (NODE_CODE(BIF_LL3(bif))==EXPR_LIST)
{
PTR_LLND expr_list;
for(expr_list=BIF_LL3(bif);expr_list;expr_list=NODE_OPERAND1(expr_list))
count++;
}
}
}
NumberOfIndependent=count-1;
i = i + strlen("INDEPENDENT_DO");
} else
if (strncmp(&(str[i]),"CHECK_INDEPENDENT_DO", strlen("CHECK_INDEPENDENT_DO"))== 0)
{
if (NumberOfIndependent>0)
{
BufPutString("!HPF$",0);
Puttab();
Buf_pointer-=5;
BufPutString("INDEPENDENT\n",0);
}
NumberOfIndependent--;
i = i + strlen("CHECK_INDEPENDENT_DO");
} else
if (strncmp(&(str[i]),"RESET_INDEPENDENT_DO", strlen("RESET_INDEPENDENT_DO"))== 0)
{
NumberOfIndependent=0;
i = i + strlen("RESET_INDEPENDENT_DO");
} else
if (strncmp(&(str[i]),"UNSETFLAG", strlen("UNSETFLAG"))== 0)
{
i = i + strlen("UNSETFLAG");
Treat_Flag(str, &i,-1);
} else
if (strncmp(&(str[i]),"PUSHFLAG", strlen("PUSHFLAG"))== 0)
{
i = i + strlen("PUSHFLAG");
PushPop_Flag(str, &i,1);
} else
if (strncmp(&(str[i]),"POPFLAG", strlen("POPFLAG"))== 0)
{
i = i + strlen("POPFLAG");
PushPop_Flag(str, &i,-1);
} else
if (strncmp(&(str[i]),"ERROR", strlen("ERROR"))== 0) /* %ERROR : Generate error message */
{
Message("--- stmt unparsing error[1] : ",0);
i += strlen("ERROR");
BufPutString (" *** UNPARSING ERROR OCCURRED HERE ***\n",0);
} else
if (strncmp(&(str[i]),"NL", strlen("NL"))== 0) /* %NL : NewLine */
{
int j=0;
if (!Get_Flag_val("(NO_NL)",&j))
BufPutChar ('\n');
/* for (j = 0; j < TabNumber; j++)
if (j>1)
BufPutString (" ",0);
else
BufPutString (" ",0);*/
i += strlen("NL");
} else
if (strncmp(&(str[i]),"NOTABNL", strlen("NOTABNL"))== 0) /* %NL : NewLine */
{
BufPutChar ('\n');
i += strlen("NOTABNL");
} else
if (strncmp(&(str[i]),"TAB", strlen("TAB"))== 0) /* %TAB : Tab */
{
BufPutString (" ",0); /* cychen */
i += strlen("TAB");
} else
if (strncmp(&(str[i]),"PUTTAB", strlen("PUTTAB"))== 0) /* %TAB : Tab */
{
int j;
int k=0;
if (!Get_Flag_val("(NO_NL)",&k))
for (j = 0; j < TabNumber; j++)
if (j>0)
BufPutString (" ",0);
else
BufPutString (" ",0); /* cychen */
i += strlen("PUTTAB");
} else
if (strncmp(&(str[i]),"CHPFTAB", strlen("CHPFTAB"))== 0) /* %TAB : Tab */
{
int j;
BufPutString ("!HPF$",0);
for (j = 0; j < TabNumber; j++)
if (j>0)
BufPutString (" ",0);
else
BufPutString (" ",0);
Buf_pointer-=6;
i += strlen("CHPFTAB");
} else
if (strncmp(&(str[i]),"GETRED", strlen("GETRED"))== 0) /* %TAB : Tab */
{
if (FindRedInExpr(BIF_LL1(bif),BIF_LL2 (bif)))
{
if (BIF_LL1(bif)&&NODE_SYMB(BIF_LL1(bif))&&(!IS_DISTRIBUTE_ARRAY(NODE_SYMB(BIF_LL1(bif))))&&(!SYMB_DOVAR(NODE_SYMB(BIF_LL1(bif)))))
{
BufPutString("Reduction var :",0);
Tool_Unparse2_LLnode(BIF_LL1(bif));
BufPutString("\n",0);
if (!FindInNewList(NewSpecList,BIF_LL1(bif)))
if(!FindInNewList(ReductionList,BIF_LL1(bif)))
{
ReductionList=AddToReductionList(ReductionList,BIF_LL1(bif));
BufPutString("Reduction LIST :",0);
Tool_Unparse2_LLnode(ReductionList);
BufPutString("\n",0);
}
}
}
i += strlen("GETRED");
} else
if (strncmp(&(str[i]),"INSERT_REDUCTION", strlen("INSERT_REDUCTION"))== 0) /* %CHECK_HEAP : Pointer HEAP(PA) -> PA */
{
if (ReductionList)
{
BufPutString("MY_REDUCTION (",0);
Tool_Unparse2_LLnode(ReductionList);
BufPutString(")",0);
ReductionList=FreeReductionList(ReductionList);
/*if (NewSpecList) free(NewSpecList);*/
}
i += strlen("INSERT_REDUCTION");
} else
if (strncmp(&(str[i]),"CHPFCONTTAB", strlen("CHPFCONTTAB"))== 0) /* %TAB : Tab */
{
int j;
BufPutString ("\n!HPF$*",0);
for (j = 0; j < TabNumber; j++)
if (j>0)
BufPutString (" ",0);
else
BufPutString (" ",0);
Buf_pointer-=7;
i += strlen("CHPFCONTTAB");
} else
if (strncmp(&(str[i]),"INCTAB", strlen("INCTAB"))== 0) /* increment tab */
{
TabNumber++;
i += strlen("INCTAB");
} else
if (strncmp(&(str[i]),"DECTAB", strlen("DECTAB"))== 0) /*deccrement tab */
{
if (Check_Lang_Fortran(cur_proj))
{
if (TabNumber>1)
TabNumber--;
} else
TabNumber--;
i += strlen("DECTAB");
} else
if (strncmp(&(str[i]),"IF", strlen("IF"))== 0) /* %IF : If ; syntax : %IF (condition) then_bloc [%ELSE else_bloc] %ENDIF */
{
i += strlen("IF");
i += Eval_Bif_Condition(&(str[i]), bif);
} else
if (strncmp(&(str[i]),"ELSE", strlen("ELSE"))== 0) /* %ELSE : Else */
{
i += strlen("ELSE");
i += SkipToEndif(&(str[i])); /* skip to the corresponding endif */
} else
if (strncmp(&(str[i]),"ENDIF", strlen("ENDIF"))== 0) /* %ENDIF : End of If */
{
i += strlen("ENDIF");
} else
if (strncmp(&(str[i]),"BLOB1", strlen("BLOB1"))== 0) /* %BLOB1 : All Blob 1 */
{
PTR_BLOB blob;
for (blob = BIF_BLOB1(bif);blob; blob = BLOB_NEXT (blob))
{
Tool_Unparse_Bif(BLOB_VALUE(blob));
}
i += strlen("BLOB1");
} else
if (strncmp(&(str[i]),"BLOB2", strlen("BLOB2"))== 0) /* %BLOB2 : All Blob 2 */
{
PTR_BLOB blob;
for (blob = BIF_BLOB2(bif);blob; blob = BLOB_NEXT (blob))
{
Tool_Unparse_Bif(BLOB_VALUE(blob));
}
i += strlen("BLOB2");
} else
if (strncmp(&(str[i]),"LL1", strlen("LL1"))== 0) /* %LL1 : Low Level Node 1 */
{
Tool_Unparse2_LLnode(BIF_LL1(bif));
i += strlen("LL1");
} else
if (strncmp(&(str[i]),"LL2", strlen("LL2"))== 0) /* %LL2 : Low Level Node 2 */
{
Tool_Unparse2_LLnode (BIF_LL2 (bif));
i += strlen("LL2");
} else
if (strncmp(&(str[i]),"LL3", strlen("LL3"))== 0) /* %LL3 : Low Level Node 3 */
{
Tool_Unparse2_LLnode(BIF_LL3(bif));
i += strlen("LL3");
} else
if (strncmp(&(str[i]),"L2L2", strlen("L2L2"))== 0) /* %L2L2 : Low Level Node 2 of Low Level Node 2 */
{
if (BIF_LL2 (bif))
Tool_Unparse2_LLnode (NODE_TEMPLATE_LL2 (BIF_LL2 (bif)));
i += strlen("L2L2");
} else
if (strncmp(&(str[i]),"FUNHD", strlen("FUNHD"))== 0) /* %FUNHD track down a function header */
{
PTR_LLND p;
p = BIF_LL1(bif);
while(p && NODE_CODE(p) != FUNCTION_REF) p = NODE_OPERAND0(p);
if(p == NULL) printf("unparse error in FUNHD!!\n");
else Tool_Unparse2_LLnode(p);
i += strlen("FUNHD");
} else
if (strncmp(&(str[i]),"SYMBIDFUL", strlen("SYMBIDFUL"))== 0) /* %SYMBID : Symbol identifier */
{
if (BIF_SYMB(bif) && SYMB_MEMBER_BASENAME(BIF_SYMB(bif)))
{
Tool_Unparse_Symbol(SYMB_MEMBER_BASENAME(BIF_SYMB(bif)));
BufPutString("::",0);
}
Tool_Unparse_Symbol(BIF_SYMB(bif));
i += strlen("SYMBIDFUL");
} else
if (strncmp(&(str[i]),"SYMBID", strlen("SYMBID"))== 0) /* %SYMBID : Symbol identifier */
{
Tool_Unparse_Symbol(BIF_SYMB(bif));
i += strlen("SYMBID");
} else
if (strncmp(&(str[i]),"SYMBSCOPE", strlen("SYMBSCOPE"))== 0) /* %SYMBSCOPE : Symbol identifier */
{
if (BIF_SYMB(bif) && SYMB_MEMBER_BASENAME(BIF_SYMB(bif)))
{
Tool_Unparse_Symbol(SYMB_MEMBER_BASENAME(BIF_SYMB(bif)));
}
i += strlen("SYMBSCOPE");
} else
if (strncmp(&(str[i]),"SYMBDC", strlen("SYMBDC"))== 0) /* %SYMBSCOPE : Symbol identifier */
{
if (BIF_LL3(bif) ||
(BIF_SYMB(bif) && SYMB_MEMBER_BASENAME(BIF_SYMB(bif))))
{
BufPutString("::",0);
}
i += strlen("SYMBDC");
} else
if (strncmp(&(str[i]),"STATENO", strlen("STATENO"))== 0) /* %STATENO : Statement number */
{
if (BIF_LABEL_USE (bif))
{
BufPutInt ((int)(LABEL_STMTNO (BIF_LABEL_USE (bif))));
}
i += strlen("STATENO");
} else
if (strncmp(&(str[i]),"LABELENDIF", strlen("LABELENDIF"))== 0) /* %STATENO : Statement number */
{
PTR_BFND temp;
PTR_BLOB blob;
temp = NULL;
if (!BIF_BLOB2(bif))
blob = BIF_BLOB1(bif);
else
blob = BIF_BLOB2(bif);
for (;blob; blob = BLOB_NEXT (blob))
{
temp = BLOB_VALUE(blob);
if (temp && (BIF_CODE(temp) == CONTROL_END))
{
if (BIF_LABEL(temp))
break;
}
temp = NULL;
}
if (temp && BIF_LABEL(temp))
{
BufPutInt ((int)(LABEL_STMTNO (BIF_LABEL(bif))));
}
i += strlen("LABELENDIF");
} else
if (strncmp(&(str[i]),"LABNAME", strlen("LABNAME")) == 0) /* %LABNAME for C labels: added by dbg */
{
if(BIF_LABEL_USE(bif)){
if(LABEL_SYMB(BIF_LABEL_USE(bif)))
BufPutString (SYMB_IDENT(LABEL_SYMB(BIF_LABEL_USE(bif))), 0);
else printf("label-symbol error\n");
} else printf("label error\n");
i += strlen("LABNAME");
} else
if (strncmp(&(str[i]),"LABEL", strlen("LABEL"))== 0) /* %STATENO : Statement number */
{
if (BIF_LABEL(bif))
{
/*if (BIF_CP(bif)&&(BIF_CODE(BIF_CP(bif))==FOR_NODE)&&
(HPF_VERSION==2))
{
AfterDOLabel=1;
if (BIF_LABEL_USE(BIF_CP(bif))&&
(LABEL_STMTNO (BIF_LABEL(bif))!=LABEL_STMTNO (BIF_LABEL_USE(BIF_CP(bif)))))
BufPutInt ((int)(LABEL_STMTNO (BIF_LABEL(bif))));
else if (!BIF_LABEL_USE(BIF_CP(bif)))
BufPutInt ((int)(LABEL_STMTNO (BIF_LABEL(bif))));
}
else21052001*/
/*BufPutInt (LABEL_STMTNO (BIF_LABEL(bif)));*/
if (BIF_CP(bif)&&(BIF_CODE(BIF_CP(bif))==FOR_NODE)&&
(HPF_VERSION==2))
{
AfterDOLabel=1;
if (BIF_LABEL_USE(BIF_CP(bif))&&
(LABEL_STMTNO (BIF_LABEL(bif))!=LABEL_STMTNO (BIF_LABEL_USE(BIF_CP(bif)))))
BufPutInt ((int)(LABEL_STMTNO (BIF_LABEL(bif))));
else if (!BIF_LABEL_USE(BIF_CP(bif)))
BufPutInt ((int)(LABEL_STMTNO (BIF_LABEL(bif))));
}
else
BufPutInt ((int)(LABEL_STMTNO (BIF_LABEL(bif))));
}
i += strlen("LABEL");
} else
if (strncmp(&(str[i]),"SYMBTYPE", strlen("SYMBTYPE"))== 0) /* SYMBTYPE : Type of Symbol */
{
if (BIF_SYMB (bif) && SYMB_TYPE (BIF_SYMB (bif)))
{
if (Check_Lang_Fortran(cur_proj))
BufPutString ( ftype_name [type_index (TYPE_CODE (SYMB_TYPE (BIF_SYMB (bif))))],0);
else if((SYMB_ATTR(BIF_SYMB(bif)) & OVOPERATOR ) == 0){
PTR_LLND el;
el = BIF_LL1(bif);
if((BIF_CODE(BIF_CP(bif)) == TEMPLATE_FUNDECL) &&
el && NODE_TYPE(el))
Tool_Unparse_Type(NODE_TYPE(el));
else
Tool_Unparse_Type(SYMB_TYPE (BIF_SYMB (bif)));
}
}
i += strlen("SYMBTYPE");
} else
if (strncmp(&(str[i]),"CNSTF", strlen("CNSTF"))== 0) /* for const functions */
{
PTR_SYMB symb;
if (BIF_SYMB (bif)){
symb = BIF_SYMB (bif);
/* if(SYMB_TEMPLATE_DUMMY8(symb) & 64) BufPutString(" const",0); */
}
i += strlen("CNSTF");
} else
if (strncmp(&(str[i]),"VARLISTTY", strlen("VARLISTTY"))== 0) /* %VARLIST : list of variables / parameters */
{
PTR_SYMB symb;
if (BIF_SYMB (bif))
symb = SYMB_FUNC_PARAM (BIF_SYMB (bif));
else
symb = NULL;
while (symb)
{
Tool_Unparse_Type (SYMB_TYPE(symb));
BufPutString (" ",0);
BufPutString ( SYMB_IDENT (symb),0);
symb = SYMB_NEXT_DECL (symb);
if (symb) BufPutString (", ",0);
}
i += strlen("VARLISTTY");
} else
if (strncmp(&(str[i]),"TMPLARGS", strlen("TMPLARGS"))== 0)
{
PTR_SYMB symb;
PTR_LLND args, arg_item, t;
PTR_TYPE typ;
if(BIF_CODE(bif) == FUNC_HEDR) args = BIF_LL3(bif);
else args = BIF_LL1(bif);
while (args )
{
int typflag;
arg_item = NODE_OPERAND0(args);
if(arg_item == NULL) printf("MAJOR TEMPLATE UNPARSE ERROR. contact dbg \n");
t = arg_item;
typflag = 1;
while(t && typflag){
if((NODE_CODE(t) == VAR_REF) || (NODE_CODE(t) == ARRAY_REF))
typflag = 0;
else if (NODE_CODE(t) == SCOPE_OP) t = NODE_OPERAND1(t);
else t = NODE_OPERAND0(t);
}
if(t){
symb = NODE_SYMB(t);
typ = NODE_TYPE(t);
if(typ == NULL) typ = SYMB_TYPE(symb);
if((int)strlen(symb->ident) > 0){ /* special case for named arguments */
typflag = 1;
while(typ && typflag){
if(TYPE_CODE(typ) == T_ARRAY ||
TYPE_CODE(typ) == T_FUNCTION ||
TYPE_CODE(typ) == T_REFERENCE ||
TYPE_CODE(typ) == T_POINTER) typ = TYPE_BASE(typ);
else if(TYPE_CODE(typ) == T_MEMBER_POINTER)
typ = TYPE_COLL_BASE(typ);
else typflag = 0;
}
}
else BufPutString("class ", 0);
Tool_Unparse_Type (typ);
BufPutString (" ",0);
}
/* else printf("could not find var ref!\n"); */
Tool_Unparse2_LLnode(arg_item);
args = NODE_OPERAND1(args);
if (args) BufPutString (", ",0);
}
i += strlen("TMPLARGS");
} else
if (strncmp(&(str[i]),"CONSTRU", strlen("CONSTRU"))== 0)
{
PTR_LLND ll;
if (BIF_LL1(bif))
{
ll = NODE_OPERAND0(BIF_LL1(bif));
if (ll)
ll = NODE_OPERAND1(ll);
if (ll)
{
BufPutString (":",0);
Tool_Unparse2_LLnode(ll);
}
}
i += strlen("CONSTRU");
} else
if (strncmp(&(str[i]),"L1SYMBID", strlen("L1SYMBID"))== 0) /* %L1SYMBID : Symbol of Low Level Node 1 */
{
if (BIF_LL1 (bif))
Tool_Unparse_Symbol (NODE_SYMB (BIF_LL1 (bif)));
i += strlen("L1SYMBID");
} else
if (strncmp(&(str[i]),"VARLIST", strlen("VARLIST"))== 0) /* %VARLIST : list of variables / parameters */
{
PTR_SYMB symb;
if (BIF_SYMB (bif))
symb = SYMB_FUNC_PARAM (BIF_SYMB (bif));
else
symb = NULL;
while (symb)
{
BufPutString ( SYMB_IDENT (symb),0);
symb = SYMB_NEXT_DECL (symb);
if (symb) BufPutString (", ",0);
}
i += strlen("VARLIST");
} else
if (strncmp(&(str[i]),"DELETE_COMMA", strlen("DELETE_COMMA"))== 0) /* %CHECK_HEAP : Pointer HEAP(PA) -> PA */
{
if (Buf_address[Buf_pointer-1]==',')
Buf_pointer--;
i += strlen("DELETE_COMMA");
} else
if (strncmp(&(str[i]),"TASKERROR0", strlen("TASKERROR0"))== 0)
{
/*Message("Error in block-task-region\n end-task-region-directive: CDVM$ END TASK_REGION is missing before TASK_REGION construct.",BIF_LINE(bif));*/
fprintf(stderr,"Error 210 on line %d of %s : End-task-region-directive: CDVM$ END TASK_REGION is missing before TASK_REGION construct\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
i += strlen("TASKERROR0");
} else
if (strncmp(&(str[i]),"TASKERROR1", strlen("TASKERROR1"))== 0)
{
/*Message("Error in block-task-region\n task-region-directive: CDVM$ TASK_REGION is missing before on-block.",BIF_LINE(bif));*/
fprintf(stderr,"Error 211 on line %d of %s : CDVM$ TASK_REGION is missing before on-block \n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
i += strlen("TASKERROR1");
} else
if (strncmp(&(str[i]),"TASKERROR2", strlen("TASKERROR2"))== 0)
{
/*Message("Error in block-task-region\n task-region-directive: CDVM$ TASK_REGION is missing before end-on-directive.",BIF_LINE(bif));*/
fprintf(stderr,"Error 212 on line %d of %s : CDVM$ TASK_REGION is missing before end-on-directive \n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
i += strlen("TASKERROR2");
} else
if (strncmp(&(str[i]),"TASKERROR3", strlen("TASKERROR3"))== 0)
{
/*Message("Error in block-task-region\n end-task-region-directive: CDVM$ END TASK_REGION is missing before end of program.",BIF_LINE(bif));*/
fprintf(stderr,"Error 213 on line %d of %s : End-task-region-directive: CDVM$ END TASK_REGION is missing before end of program\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
i += strlen("TASKERROR3");
} else
if (strncmp(&(str[i]),"TASKERROR4", strlen("TASKERROR4"))== 0)
{
/*Message("Error in block-task-region\n task-region-directive: CDVM$ TASK_REGION is missing before end-task-region-directive.",BIF_LINE(bif));*/
fprintf(stderr,"Error 214 on line %d of %s : End-task-region-directive: CDVM$ TASK_REGION is missing before end-task-region-directive\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
i += strlen("TASKERROR4");
} else
if (strncmp(&(str[i]),"ONERROR", strlen("ONERROR"))== 0)
{
if (On_count)
{
fprintf(stderr,"Error 215 on line %d of %s : Error in TASK_REGION construct\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
fprintf(stderr,"Warning 216 on line %d of %s : Incorrect number of ON and END_ON directives\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
/*Message("Error in TASK_REGION construct\nThis may be due to incorrect number of ON and END_ON directives.",BIF_LINE(bif));*/
On_count=0;
}
i += strlen("ONERROR");
} else
if (strncmp(&(str[i]),"HPF1_POINTER", strlen("HPF1_POINTER"))== 0)
{
/*Message("Error in DVM_POINTER_DIR\n Can`t work this pointers in HPF1.",BIF_LINE(bif));*/
fprintf(stderr,"Error 197 on line %d of %s : Can`t work this pointers in HPF1\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
i += strlen("HPF1_POINTER");
} else
if (strncmp(&(str[i]),"ONPLUS", strlen("ONPLUS"))== 0)
{
int k=0;
On_count++;
Treat_Flag("(ON_REGION)",&k,1);
i += strlen("ONPLUS");
}
else
if (strncmp(&(str[i]),"ONMINUS", strlen("ONMINUS"))== 0)
{
int k=0;
On_count--;
Treat_Flag("(ON_REGION)",&k,-1);
i += strlen("ONMINUS");
}
else
if (strncmp(&(str[i]),"ONINIT", strlen("ONINIT"))== 0)
{
On_count=0;
i += strlen("ONINIT");
}
else
if (strncmp(&(str[i]),"RESETID", strlen("RESETID"))== 0)
{
ResetSymbolId();
i += strlen("RESETID");
}
else
if (strncmp(&(str[i]),"CHANGE_TABNUMBER", strlen("CHANGE_TABNUMBER"))== 0)
{
int count=0,label;
count=NumberOfForNode(bif,&label);
if(count)
TabNumber-=count;
if (TabNumber<1) TabNumber=1;
i += strlen("CHANGE_TABNUMBER");
}
else
if (strncmp(&(str[i]),"FIND_DO", strlen("FIND_DO"))== 0) /* %FIND_DO : We need to find the corresponding FOR_NODE for CONT_STAT*/
{
i += strlen("FIND_DO");
/*21052001if (UnparseEndofCircle(bif))
return Buf_address;*/
if (UnparseEndofCircle(bif))
return Buf_address;
} else
if (strncmp(&(str[i]),"SAVE", strlen("SAVE"))== 0)
{
Pointer=Buf_pointer;
i += strlen("SAVE");
} else
if (strncmp(&(str[i]),"LOAD", strlen("LOAD"))== 0)
{
Buf_pointer=Pointer;
i += strlen("LOAD");
} else
if (strncmp(&(str[i]),"FIND_MAP", strlen("FIND_MAP"))== 0) /* %FIND_MAP : We need to find the corresponding MAP_DIR*/
{
PTR_LLND llnd;
if (BIF_LL1(bif))
{
llnd=FindMapDir(BIF_LL1(bif),bif);
if (llnd)
{
Tool_Unparse2_LLnode(llnd);
}
else
{
/*Message ("Error in Unparse, can`t find a corresponding MAP_DIR", BIF_LINE(bif));*/
fprintf(stderr,"Error 195 on line %d of %s : Can`t find a corresponding MAP_DIR\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
Tool_Unparse2_LLnode(BIF_LL1(bif));
}
}
i += strlen("FIND_MAP");
} else
if (strncmp(&(str[i]),"CHECK_REDISTRIBUTE_DIR", strlen("CHECK_REDISTRIBUTE_DIR"))== 0) /* %FIND_MAP : We need to find the corresponding MAP_DIR*/
{
PTR_LLND llnd;
if (BIF_LL1(bif))
{
for (llnd=BIF_LL1(bif);llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
if (FindRedistributeDir(NODE_OPERAND0(llnd),bif))
{
if (!FindDynamicDir(NODE_OPERAND0(llnd),bif))
{
BufPutString("!HPF$",0);
Puttab();
Buf_pointer-=5;
BufPutString("DYNAMIC ",0);
Tool_Unparse2_LLnode(NODE_OPERAND0(llnd));
BufPutString("\n",0);
}
}
}
i += strlen("CHECK_REDISTRIBUTE_DIR");
} else
if (strncmp(&(str[i]),"CHECK_REALIGN_DIR", strlen("CHECK_REALIGN_DIR"))== 0) /* %FIND_MAP : We need to find the corresponding MAP_DIR*/
{
PTR_LLND llnd;
if (BIF_LL1(bif))
{
for (llnd=BIF_LL1(bif);llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
if (FindRealignDir(NODE_OPERAND0(llnd),bif))
{
if (!FindDynamicDir(NODE_OPERAND0(llnd),bif))
{
BufPutString("!HPF$",0);
Puttab();
Buf_pointer-=5;
BufPutString("DYNAMIC ",0);
Tool_Unparse2_LLnode(NODE_OPERAND0(llnd));
BufPutString("\n",0);
}
}
}
i += strlen("CHECK_REALIGN_DIR");
} else
if (strncmp(&(str[i]),"CHECK_FORMAT_NULL", strlen("CHECK_FORMAT_NULL"))== 0) /* %FIND_MAP : We need to find the corresponding MAP_DIR*/
{
if (BIF_LL1(bif))
{
if (!BIF_LL2(bif)&&!BIF_LL3(bif))
{
BufPutString("!HPF$",0);
Puttab();
Buf_pointer-=5;
BufPutString("DYNAMIC ",0);
Tool_Unparse2_LLnode(BIF_LL1(bif));
BufPutString("\n",0);
return Buf_address;
}
}
i += strlen("CHECK_FORMAT_NULL");
} else
if (strncmp(&(str[i]),"CHECK_DVMBIT", strlen("CHECK_DVMBIT"))== 0) /* %FIND_MAP : We need to find the corresponding MAP_DIR*/
{
if (BIF_LL1(bif))
{
PTR_LLND ptr;
if (BIF_CODE(bif)==DVM_ALIGN_DIR)
{
for(ptr=BIF_LL1(bif);ptr&&(NODE_CODE(ptr)==EXPR_LIST);ptr=NODE_OPERAND1(ptr))
{
PTR_LLND llnd=NODE_OPERAND0(ptr);
if (!llnd||(NODE_CODE(llnd)!=ARRAY_REF)) break;
if (SYMB_ID(NODE_SYMB(llnd))==ALREADY_ALIGN_BIT)
{
fprintf(stderr,"Error 200 on line %d of %s:Object '%s' already has ALIGN_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else SYMB_ID(NODE_SYMB(llnd))=ALREADY_ALIGN_BIT;
}
}
if (BIF_CODE(bif)==HPF_PROCESSORS_STAT)
{
for(ptr=BIF_LL1(bif);ptr&&(NODE_CODE(ptr)==EXPR_LIST);ptr=NODE_OPERAND1(ptr))
{
PTR_LLND llnd=NODE_OPERAND0(ptr);
if (!llnd||(NODE_CODE(llnd)!=ARRAY_REF)) break;
if (SYMB_ID(NODE_SYMB(llnd))==ALREADY_PROCESSORS_BIT)
{
fprintf(stderr,"Error 201 on line %d of %s :Object '%s' already has PROCESSORS_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else SYMB_ID(NODE_SYMB(llnd))=ALREADY_PROCESSORS_BIT;
}
}
if (BIF_CODE(bif)==DVM_DISTRIBUTE_DIR)
{
for(ptr=BIF_LL1(bif);ptr&&(NODE_CODE(ptr)==EXPR_LIST);ptr=NODE_OPERAND1(ptr))
{
PTR_LLND llnd=NODE_OPERAND0(ptr);
if (!llnd||(NODE_CODE(llnd)!=ARRAY_REF)) break;
if (SYMB_ID(NODE_SYMB(llnd))==ALREADY_DISTRIBUTE_BIT)
{
fprintf(stderr,"Error 202 on line %d of %s :Object '%s' already has DISTRIBUTE_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else SYMB_ID(NODE_SYMB(llnd))=ALREADY_DISTRIBUTE_BIT;
}
}
if (BIF_CODE(bif)==HPF_TEMPLATE_STAT)
{
for(ptr=BIF_LL1(bif);ptr&&(NODE_CODE(ptr)==EXPR_LIST);ptr=NODE_OPERAND1(ptr))
{
PTR_LLND llnd=NODE_OPERAND0(ptr);
if (!llnd||(NODE_CODE(llnd)!=ARRAY_REF)) break;
if (SYMB_ID(NODE_SYMB(llnd))==ALREADY_TEMPLATE_BIT)
{
fprintf(stderr,"Error 203 on line %d of %s :Object '%s' already has TEMPLATE_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else SYMB_ID(NODE_SYMB(llnd))=ALREADY_TEMPLATE_BIT;
}
}
if (BIF_CODE(bif)==DVM_INHERIT_DIR)
{
for(ptr=BIF_LL1(bif);ptr&&(NODE_CODE(ptr)==EXPR_LIST);ptr=NODE_OPERAND1(ptr))
{
PTR_LLND llnd=NODE_OPERAND0(ptr);
if (!llnd||(NODE_CODE(llnd)!=ARRAY_REF)) break;
if (SYMB_ID(NODE_SYMB(llnd))==ALREADY_INHERIT_BIT)
{
fprintf(stderr,"Error 204 on line %d of %s :Object '%s' already has INHERIT_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else SYMB_ID(NODE_SYMB(llnd))=ALREADY_INHERIT_BIT;
}
}
if (BIF_CODE(bif)==DVM_DYNAMIC_DIR)
{
for(ptr=BIF_LL1(bif);ptr&&(NODE_CODE(ptr)==EXPR_LIST);ptr=NODE_OPERAND1(ptr))
{
PTR_LLND llnd=NODE_OPERAND0(ptr);
if (!llnd||(NODE_CODE(llnd)!=ARRAY_REF)) break;
if (SYMB_ID(NODE_SYMB(llnd))==ALREADY_DYNAMIC_BIT)
{
fprintf(stderr,"Error 205 on line %d of %s :Object '%s' already has DYNAMIC_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else SYMB_ID(NODE_SYMB(llnd))=ALREADY_DYNAMIC_BIT;
}
}
if (BIF_CODE(bif)==DVM_SHADOW_DIR)
{
for(ptr=BIF_LL1(bif);ptr&&(NODE_CODE(ptr)==EXPR_LIST);ptr=NODE_OPERAND1(ptr))
{
PTR_LLND llnd=NODE_OPERAND0(ptr);
if (!llnd||(NODE_CODE(llnd)!=ARRAY_REF)) break;
if (SYMB_ID(NODE_SYMB(llnd))==ALREADY_SHADOW_BIT)
{
fprintf(stderr,"Error 206 on line %d of %s :Object '%s' already has SHADOW_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else SYMB_ID(NODE_SYMB(llnd))=ALREADY_SHADOW_BIT;
}
}
if (BIF_CODE(bif)==DVM_TASK_DIR)
{
for(ptr=BIF_LL1(bif);ptr&&(NODE_CODE(ptr)==EXPR_LIST);ptr=NODE_OPERAND1(ptr))
{
PTR_LLND llnd=NODE_OPERAND0(ptr);
if (!llnd||(NODE_CODE(llnd)!=ARRAY_REF)) break;
if (SYMB_ID(NODE_SYMB(llnd))==ALREADY_TASK_BIT)
{
fprintf(stderr,"Error 207 on line %d of %s :Object '%s' already has TASK_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else SYMB_ID(NODE_SYMB(llnd))=ALREADY_TASK_BIT;
}
}
if (BIF_CODE(bif)==DVM_POINTER_DIR)
{
for(ptr=BIF_LL1(bif);ptr&&(NODE_CODE(ptr)==EXPR_LIST);ptr=NODE_OPERAND1(ptr))
{
PTR_LLND llnd=NODE_OPERAND0(ptr);
if (!llnd||(NODE_CODE(llnd)!=ARRAY_REF)) break;
if (SYMB_ID(NODE_SYMB(llnd))==ALREADY_DVM_POINTER_BIT)
{
fprintf(stderr,"Error 208 on line %d of %s :Object '%s' already has DVM_POINTER_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else SYMB_ID(NODE_SYMB(llnd))=ALREADY_DVM_POINTER_BIT;
}
}
if (BIF_CODE(bif)==DVM_VAR_DECL)
{
PTR_LLND ptr_llnd;
int BIT=0;
for(ptr_llnd=BIF_LL3(bif);ptr_llnd&&(NODE_CODE(ptr_llnd)==EXPR_LIST);ptr_llnd=NODE_OPERAND1(ptr_llnd))
{
if (NODE_CODE(NODE_OPERAND0(ptr_llnd))==DISTRIBUTE_OP)
BIT|=ALREADY_DISTRIBUTE_BIT;
if (NODE_CODE(NODE_OPERAND0(ptr_llnd))==PROCESSORS_OP)
BIT|=ALREADY_PROCESSORS_BIT;
if (NODE_CODE(NODE_OPERAND0(ptr_llnd))==ALIGN_OP)
{
BIT|=ALREADY_ALIGN_BIT;
}
if (NODE_CODE(NODE_OPERAND0(ptr_llnd))==TEMPLATE_OP)
{
BIT|=ALREADY_TEMPLATE_BIT;
}
if (NODE_CODE(NODE_OPERAND0(ptr_llnd))==SHADOW_OP)
{
BIT|=ALREADY_SHADOW_BIT;
}
if (NODE_CODE(NODE_OPERAND0(ptr_llnd))==DYNAMIC_OP)
{
BIT|=ALREADY_DYNAMIC_BIT;
}
}
for(ptr=BIF_LL1(bif);BIT&&ptr&&(NODE_CODE(ptr)==EXPR_LIST);ptr=NODE_OPERAND1(ptr))
{
PTR_LLND llnd=NODE_OPERAND0(ptr);
if (!llnd||(NODE_CODE(llnd)!=ARRAY_REF)) break;
if ((BIT&ALREADY_DYNAMIC_BIT)&&(SYMB_ID(NODE_SYMB(llnd))==ALREADY_DYNAMIC_BIT))
{
fprintf(stderr,"Error 205 on line %d of %s :Object '%s' already has DYNAMIC_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else
if (BIT&ALREADY_DYNAMIC_BIT) SYMB_ID(NODE_SYMB(llnd))=ALREADY_DYNAMIC_BIT;
if ((BIT&ALREADY_PROCESSORS_BIT)&&(SYMB_ID(NODE_SYMB(llnd))==ALREADY_PROCESSORS_BIT))
{
fprintf(stderr,"Error 201 on line %d of %s :Object '%s' already has PROCESSORS_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else
if (BIT&ALREADY_PROCESSORS_BIT) SYMB_ID(NODE_SYMB(llnd))=ALREADY_PROCESSORS_BIT;
if ((BIT&ALREADY_SHADOW_BIT)&&(SYMB_ID(NODE_SYMB(llnd))==ALREADY_SHADOW_BIT))
{
fprintf(stderr,"Error 206 on line %d of %s :Object '%s' already has SHADOW_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else
if (BIT&ALREADY_SHADOW_BIT) SYMB_ID(NODE_SYMB(llnd))=ALREADY_SHADOW_BIT;
if ((BIT&ALREADY_TEMPLATE_BIT)&&(SYMB_ID(NODE_SYMB(llnd))==ALREADY_TEMPLATE_BIT))
{
fprintf(stderr,"Error 203 on line %d of %s :Object '%s' already has TEMPLATE_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else
if (BIT&ALREADY_TEMPLATE_BIT) SYMB_ID(NODE_SYMB(llnd))=ALREADY_TEMPLATE_BIT;
if ((BIT&&ALREADY_ALIGN_BIT)&&(SYMB_ID(NODE_SYMB(llnd))==ALREADY_ALIGN_BIT))
{
fprintf(stderr,"Error 200 on line %d of %s :Object '%s' already has ALIGN_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else
if (BIT&ALREADY_ALIGN_BIT) SYMB_ID(NODE_SYMB(llnd))=ALREADY_ALIGN_BIT;
if ((BIT&ALREADY_DISTRIBUTE_BIT)&&(SYMB_ID(NODE_SYMB(llnd))==ALREADY_DISTRIBUTE_BIT))
{
fprintf(stderr,"Error 202 on line %d of %s :Object '%s' already has DISTRIBUTE_BIT\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name,SYMB_IDENT(NODE_SYMB(llnd)));
errnumber++;
}
else
if (BIT&ALREADY_DISTRIBUTE_BIT) SYMB_ID(NODE_SYMB(llnd))=ALREADY_DISTRIBUTE_BIT;
}
}
}
i += strlen("CHECK_DVMBIT");
} else
if (strncmp(&(str[i]),"CHECK_COMBINED_DIR", strlen("CHECK_COMBINED_DIR"))== 0) /* %FIND_MAP : We need to find the corresponding MAP_DIR*/
{
PTR_LLND llnd;
if (BIF_LL1(bif))
{
for (llnd=BIF_LL1(bif);llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
{
PTR_SYMB s=SMNULL;
if (NODE_CODE(NODE_OPERAND0(llnd))==ARRAY_REF)
s=NODE_SYMB(NODE_OPERAND0(llnd));
if (!s) continue;
if(s->attr & DISTRIBUTE_BIT)
if (FindRedistributeDir(NODE_OPERAND0(llnd),bif))
{
if (!FindDynamicDir(NODE_OPERAND0(llnd),bif))
{
BufPutString("\n!HPF$",0);
Puttab();
Buf_pointer-=5;
BufPutString("DYNAMIC ",0);
Tool_Unparse2_LLnode(NODE_OPERAND0(llnd));
}
}
if(s->attr & ALIGN_BIT)
if (FindRealignDir(NODE_OPERAND0(llnd),bif))
{
if (!FindDynamicDir(NODE_OPERAND0(llnd),bif))
{
BufPutString("\n!HPF$",0);
Puttab();
Buf_pointer-=5;
BufPutString("DYNAMIC ",0);
Tool_Unparse2_LLnode(NODE_OPERAND0(llnd));
}
}
}
}
i += strlen("CHECK_COMBINED_DIR");
} else
if (strncmp(&(str[i]),"CHECK_SHADOW_OP", strlen("CHECK_SHADOW_OP"))== 0) /* %FIND_MAP : We need to find the corresponding MAP_DIR*/
{
if (BIF_CODE(bif)==DVM_VAR_DECL)
{
PTR_LLND ptr_llnd;
int OpNumber=0;
int Shadow=0;
for(ptr_llnd=BIF_LL3(bif);ptr_llnd&&(NODE_CODE(ptr_llnd)==EXPR_LIST);ptr_llnd=NODE_OPERAND1(ptr_llnd))
{
if (NODE_CODE(NODE_OPERAND0(ptr_llnd))==SHADOW_OP)
Shadow=1;
else OpNumber++;
}
if ((Shadow==1)&&!OpNumber) return Buf_address;
}
i += strlen("CHECK_SHADOW_OP");
} else
if (strncmp(&(str[i]),"CHECK_DAC_DIR", strlen("CHECK_DAC_DIR"))== 0) /* %CHECK_DAC_DIR : We need to find FDVM-directive that can be transformed into DYNAMIC-directive*/
{
PTR_LLND llnd;
PTR_BFND ptr_bif;
int pointer,beg;
beg=Buf_pointer;
BufPutString("!HPF$",0);
Puttab();
Buf_pointer-=5;
BufPutString("DYNAMIC ",0);
pointer=Buf_pointer;
if (BIF_LL1(bif))
{
for (llnd=BIF_LL1(bif);llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
if ((ptr_bif=FindDistrAlignCombinedDir(NODE_OPERAND0(llnd),bif)))
{
if (!CheckNullDistribution(ptr_bif))
{
Tool_Unparse2_LLnode(NODE_OPERAND0(llnd));
BufPutString(" ,",0);
}
}
Buf_pointer--;
BufPutString("\n",0);
}
if (pointer==Buf_pointer) Buf_pointer=beg;
return Buf_address;
i += strlen("CHECK_DAC_DIR");
} else
if (strncmp(&(str[i]),"UNPARSE_ON", strlen("UNPARSE_ON"))== 0) /* %APPEND_ON : We need to append ON clause after FOR statement in INDEPENDENT cycle for DVM_PARALLEL_TASK_DIR*/
{
PTR_LLND llnd;
if (On_Clause)
{
llnd=FindMapDir(On_Clause,bif);
if (llnd)
{
BufPutString("!HPF$",0);
Puttab();
Buf_pointer-=5;
BufPutString("ON ( ",0);
Tool_Unparse2_LLnode(llnd);
BufPutString(" ) BEGIN",0);
}
else
{
/*Message ("Error in Unparse, can`t find a corresponding MAP_DIR for DVM_PARALLEL_TASK_DIR", BIF_LINE(bif));*/
fprintf(stderr,"Error 195 on line %d of %s : Can`t find a corresponding MAP_DIR\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
}
}
i += strlen("UNPARSE_ON");
} else
if (strncmp(&(str[i]),"CHECK_ACROSS", strlen("CHECK_ACROSS"))== 0)
{
i = i + strlen("CHECK_ACROSS");
if (CheckAcross(bif)) return Buf_address;
} else
if (strncmp(&(str[i]),"CHECK_REDUCTION", strlen("CHECK_REDUCTION"))== 0)
{
i = i + strlen("CHECK_REDUCTION");
if (CheckReduction(bif)) return Buf_address;
} else
if (strncmp(&(str[i]),"FIND_REDUCTION", strlen("FIND_REDUCTION"))== 0)
{
ForNodeStmt(BIF_NEXT(bif));
i = i + strlen("FIND_REDUCTION");
} else
if (strncmp(&(str[i]),"PAR_TASK_MAP", strlen("PAR_TASK_MAP"))== 0) /* %PAR_TASK_MAP : We need to save ON clause for DVM_PARALLEL_TASK_DIR*/
{
On_Clause=BIF_LL1(bif);
i += strlen("PAR_TASK_MAP");
} else
if (strncmp(&(str[i]),"CHECK_REDISTRIBUTE_ON_MAP", strlen("CHECK_REDISTRIBUTE_ON_MAP"))== 0) /* %CHECK_REDISTRIBUTE_ON_MAP : We need to find the corresponding MAP_DIR*/
{
PTR_LLND llnd,ptr_llnd;
if (BIF_LL3(bif))
{
ptr_llnd=ChangeRedistributeOntoTask(BIF_LL3(bif));
if (ptr_llnd)
{
llnd=FindMapDir(ptr_llnd,bif);
if (llnd)
{
/*if (HPF_VERSION==1)
Tool_Unparse_Symbol(NODE_SYMB(llnd));
else */
Tool_Unparse2_LLnode(llnd);
}
else
{
/*Message ("Error in Unparse, can`t find a corresponding MAP_DIR", BIF_LINE(bif));*/
fprintf(stderr,"Error 195 on line %d of %s : Can`t find a corresponding MAP_DIR\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
Tool_Unparse2_LLnode(BIF_LL3(bif));
}
}
else Tool_Unparse2_LLnode(BIF_LL3(bif));
}
i += strlen("CHECK_REDISTRIBUTE_ON_MAP");
} else
if (strncmp(&(str[i]),"CHECK_ALLOCATE", strlen("CHECK_ALLOCATE"))== 0) /* %CHECK_ALLOCATE : We must change the allocation for DVM`s pointers*/
{
PTR_LLND llnd;
if (NODE_CODE(BIF_LL2(bif))==FUNC_CALL)
{
if (!strcmp(SYMB_IDENT(NODE_SYMB(BIF_LL2(bif))),"allocate"))
if ((NODE_CODE(BIF_LL1(bif))==ARRAY_REF)&& (SYMB_ATTR(NODE_SYMB(BIF_LL1(bif)))&DVM_POINTER_BIT))
{
int count=0;
char *str;
count=FindPointerDir(NODE_SYMB(BIF_LL1(bif)),bif);
if (count)
{
int i=0;
BufPutString("ALLOCATE(", 0);
Tool_Unparse2_LLnode(BIF_LL1(bif));
BufPutChar('(');
llnd=NODE_OPERAND0(BIF_LL2(bif));
if (!llnd||(NODE_CODE(llnd)!=EXPR_LIST))
{
/*Message("Incorrect call of allocate function",BIF_LINE(bif));*/
fprintf(stderr,"Error 196 on line %d of %s : Incorrect call of allocate function\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
BufPutString("))\n", 0);
return Buf_address;
};
if (NODE_OPERAND0(llnd))
{
if (NODE_CODE(NODE_OPERAND0(llnd))==VAR_REF)
{
fprintf(stderr,"Error 196 on line %d of %s : Incorrect call of allocate function\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
fprintf(stderr,"Warning 197 on line %d of %s : You can`t use variable as SDIM array function\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
/*Message("Incorrect call of allocate function",0);
Message("You can`t use variable as SDIM array",BIF_LINE(bif));*/
BufPutString("))\n", 0);
return Buf_address;
}
else
if (NODE_CODE(NODE_OPERAND0(llnd))==ARRAY_REF)
{
int ar_index=0;
PTR_LLND ptr1=LLNULL,ptr2=LLNULL;
str=SYMB_IDENT(NODE_SYMB(NODE_OPERAND0(llnd)));
llnd=NODE_OPERAND0(NODE_OPERAND0(llnd));
if (!llnd)
{
for(i=1;i<=count;i++)
{
if (i!=1) BufPutChar(',');
BufPutString(str,0);
BufPutChar('(');
BufPutInt(i);
BufPutChar(')');
}
BufPutString("))\n", 0);
return Buf_address;
};
if (NODE_OPERAND0(llnd)) ptr1=NODE_OPERAND0(llnd);
if (NODE_OPERAND1(llnd)) ptr2=NODE_OPERAND0(NODE_OPERAND1(llnd));
if (ptr1&&!ptr2)
{
/*Message("Incorrect call of allocate function",BIF_LINE(bif));*/
fprintf(stderr,"Error 196 on line %d of %s : Incorrect call of allocate function\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
BufPutString("))\n", 0);
return Buf_address;
};
if (ptr1&&ptr2&&(NODE_CODE(ptr1)==INT_VAL))
{
ar_index=1;
if(NODE_CODE(ptr2)==INT_VAL)
{
fprintf(stderr,"Error 196 on line %d of %s : Incorrect call of allocate function\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
fprintf(stderr,"Warning 198 on line %d of %s : You can`t use 2 integer constants in SDIM array\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
/*Message("Incorrect call of allocate function",0);
Message("You can`t use 2 integer constants in SDIM array",BIF_LINE(bif));*/
BufPutString("))\n", 0);
return Buf_address;
};
}
else
if (ptr1&&ptr2&&(NODE_CODE(ptr2)==INT_VAL))
ar_index=2;
else
{
fprintf(stderr,"Error 196 on line %d of %s : Incorrect call of allocate function\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
fprintf(stderr,"Warning 199 on line %d of %s : You can`t use 2 variables in SDIM array\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
/* Message("Incorrect call of allocate function",0);
Message("You can`t use 2 variables in SDIM array",BIF_LINE(bif));*/
BufPutString("))\n", 0);
return Buf_address;
};
for(i=1;(i<=count)&&ar_index;i++)
{
if (i!=1) BufPutChar(',');
BufPutString(str,0);
BufPutChar('(');
if (ar_index==1)
{
BufPutInt(i);
BufPutChar(',');
Tool_Unparse2_LLnode(ptr2);
}
else
{
Tool_Unparse2_LLnode(ptr1);
BufPutChar(',');
BufPutInt(i);
}
BufPutChar(')');
}
}
}
BufPutChar(')');
BufPutString(")\n", 0);
return Buf_address;
}
}
}
else
if (NODE_CODE(bif)==ASSIGN_STAT)
{
llnd=BIF_LL1(bif);
if(((NODE_CODE(llnd)==ARRAY_REF)||(NODE_CODE(llnd)==VAR_REF))&&NODE_SYMB(llnd)&&(SYMB_ATTR(NODE_SYMB(llnd))&DVM_POINTER_BIT))
/* if(SYMB_ATTR(NODE_SYMB(llnd))&DVM_POINTER_BIT)*/
{
Tool_Unparse2_LLnode(llnd);
BufPutString(" => ",0);
Tool_Unparse2_LLnode(BIF_LL2(bif));
BufPutString("\n",0);
return Buf_address;
}
}
i += strlen("CHECK_ALLOCATE");
} else
if (strncmp(&(str[i]),"CHECK_FUNC", strlen("CHECK_FUNC"))== 0) /* %CHECK_FUNC : We must change function ALLOCATE*/
{
int count=0;
if (NODE_SYMB(bif))
if (!strcmp(SYMB_IDENT(NODE_SYMB(bif)),"ALLOCATE")||
!strcmp(SYMB_IDENT(NODE_SYMB(bif)),"allocate"))
Treat_Flag("(COMMENT)",&count,1);
i += strlen("CHECK_FUNC");
} else
if (strncmp(&(str[i]),"DECLARATION", strlen("DECLARATION"))== 0) /* %DECLARATION : We need to change declaration of Pointer descriptor */
{
int count=0;
if (BIF_LL1(bif)) count=FindPointerDeclaration(BIF_LL1(bif));
if (!count)
{
count=0;
Treat_Flag("(POINTER)",&count, 1);
}
i += strlen("DECLARATION");
} else
if (strncmp(&(str[i]),"DESCRIPTOR", strlen("DESCRIPTOR"))== 0) /* %DECLARATION : We need to change declaration of Pointer descriptor */
{
PTR_LLND ptr,llnd;
if (BIF_LL1(bif))
{
for(ptr=BIF_LL1(bif);ptr&&(NODE_CODE(ptr)==EXPR_LIST);ptr=NODE_OPERAND1(ptr))
{
if (NODE_OPERAND0(ptr))
{
llnd=FindPointerDescriptor(NODE_OPERAND0(ptr),bif);
if (NODE_OPERAND0(llnd)) continue;
if (!llnd)
{
/*Message("Can`t find a descriptor for POINTER",BIF_LINE(bif));*/
fprintf(stderr,"Error 222 on line %d of %s : Can`t find a descriptor for POINTER\n",BIF_LINE(bif),BIF_FILE_NAME(bif)->name);
errnumber++;
Tool_Unparse2_LLnode(NODE_OPERAND0(ptr));
}
else Tool_Unparse2_LLnode(llnd);
BufPutChar(',');
}
}
Buf_pointer--;
}
i += strlen("DESCRIPTOR");
} else
if (strncmp(&(str[i]),"PTR_ARRAY", strlen("PTR_ARRAY"))== 0) /* %DECLARATION : We need to change declaration of Pointer descriptor */
{
if (BIF_LL1(bif))
{
ArrayOfPointerDeclaration(bif);
PointerDeclaration(bif);
return Buf_address;
}
i += strlen("PTR_ARRAY");
} else
if (strncmp(&(str[i]),"RIDPT", strlen("RIDPT"))== 0)
{
PTR_TYPE type = NULL;
type = Find_Type_For_Bif(bif);
if (type )
{
DealWith_Rid(type, In_Class_Flag);
}
else if(BIF_CODE(bif) == CLASS_DECL)
{
DealWith_Rid(SYMB_TYPE(BIF_SYMB(bif)), In_Class_Flag);
}
i += strlen("RIDPT");
} else
if (strncmp(&(str[i]),"INCLASSON", strlen("INCLASSON"))== 0)
{
In_Class_Flag = 1;
i += strlen("INCLASSON");
} else
if (strncmp(&(str[i]),"INCLASSOFF", strlen("INCLASSOFF"))== 0)
{
In_Class_Flag = 0;
i += strlen("INCLASSOFF");
} else
if (strncmp(&(str[i]),"INWRITEON", strlen("INWRITEON"))== 0) /* %INWRITEON : In_Write_Statement Flag ON */
{
In_Write_Flag = 1;
i += strlen("INWRITEON");
} else
if (strncmp(&(str[i]),"INWRITEOFF", strlen("INWRITEOFF"))== 0) /* %INWRITEOFF : In_Write_Statement Flag OFF */
{
In_Write_Flag = 0;
i += strlen("INWRITEOFF");
} else
if (strncmp(&(str[i]),"RECPORTON", strlen("RECPORTON"))== 0) /* %RECPORTON : recursive_port_decl Flag ON */
{
Rec_Port_Decl = 1;
i += strlen("RECPORTON");
} else
if (strncmp(&(str[i]),"RECPORTOFF", strlen("RECPORTOFF"))== 0) /* %RECPORTOFF : recursive_port_decl Flag OFF */
{
Rec_Port_Decl = 0;
i += strlen("RECPORTOFF");
} else
if (strncmp(&(str[i]),"INPARAMON", strlen("INPARAMON"))== 0) /* %INPARAMON : In_Param_Statement Flag ON */
{
In_Param_Flag = 1;
i += strlen("INPARAMON");
} else
if (strncmp(&(str[i]),"INPARAMOFF", strlen("INPARAMOFF"))== 0) /* %INPARAMOFF : In_Param_Statement Flag OFF */
{
In_Param_Flag = 0;
i += strlen("INPARAMOFF");
} else
if (strncmp(&(str[i]),"INIMPLION", strlen("INIMPLION"))== 0) /* %INIMPLION : In_Impli_Statement Flag ON */
{
In_Impli_Flag = 1;
i += strlen("INIMPLION");
} else
if (strncmp(&(str[i]),"INIMPLIOFF", strlen("INIMPLIOFF"))== 0) /* %INIMPLIOFF : In_Impli_Statement Flag OFF */
{
In_Impli_Flag = 0;
i += strlen("INIMPLIOFF");
} else
if (strncmp(&(str[i]),"TYPE", strlen("TYPE"))== 0)
{
PTR_TYPE type = NULL;
type = Find_Type_For_Bif(bif);
if (!type)
{
Message("TYPE not found",0);
BufPutString("------TYPE ERROR----",0);
}
if( !is_overloaded_type(bif) )
Tool_Unparse_Type (type);
i += strlen("TYPE");
} else
if (strncmp(&(str[i]),"PROTECTION", strlen("PROTECTION"))== 0)
{
int protect = 0; /*protect = NULL*/
protect = Find_Protection_For_Bif(bif);
if (protect)
{
if (protect & 128)
{
/* BufPutString("MethodOfElement:\n",0); a temporary fix until dep2C++ done */
BufPutString("public:\n", 0);
} else
{
switch (protect)
{ /* find the definition of the flag someday */
case 64: BufPutString("public:\n",0); break;
case 32: BufPutString("protected:\n",0); break;
case 16: BufPutString("private:\n",0); break;
}
}
}
i += strlen("PROTECTION");
} else
if (strncmp(&(str[i]),"DUMMY", strlen("DUMMY"))== 0) /* %DUMMY Do nothing */
{
i += strlen("DUMMY");
} else
{
Message (" *** Unknown bif node COMMAND *** ",0);
Message (&(str[i]),0);
}
}
else
{
BufPutChar( c);
i++;
}
c = str[i];
}
if (AfterDOLabel&&(HPF_VERSION==2)) UnparseEndofCircle(bif);
if (TASK_PROC_GENERATE&&(HPF_VERSION==2)&&(variant==DVM_ON_DIR))
{
ON_BLOCK=1;
ON_BEGIN=Buf_pointer;
};
return Buf_address;
}
void DefineHPF1()
{
#define DEFNODECODE(SYM, NAME, TYPE, LENGTH, NT) Unparse_Def[SYM].str = create_unp_str( NAME);
#include"unparse1.hpf"
#undef DEFNODECODE
#define DEFNODECODE(SYM, NAME, TYPE, LENGTH, NT) Unparse_Def[SYM].fct = NULL;
#include"unparse1.hpf"
#undef DEFNODECODE
}
void DefineHPF2()
{
#define DEFNODECODE(SYM, NAME, TYPE, LENGTH, NT) Unparse_Def[SYM].str = create_unp_str( NAME);
#include"unparse.hpf"
#undef DEFNODECODE
#define DEFNODECODE(SYM, NAME, TYPE, LENGTH, NT) Unparse_Def[SYM].fct = NULL;
#include"unparse.hpf"
#undef DEFNODECODE
}
void Init_HPFUnparser()
{
int i,j;
CommentOut=1; /*Ignore comment*/
if (Parser_Initiated != Fortran_Initialized)
{
/*printf("\nHPF_VERSION = %d",HPF_VERSION);*/
if (HPF_VERSION==1) DefineHPF1();
else DefineHPF2();
Parser_Initiated = Fortran_Initialized;
/* set the first tabulation */
TabNumber = 1;
}
/* initialize the number of flag */
Number_Of_Flag = 0;
for (i=0; i < MAXFLAG ; i++)
{
TabOfFlag[i][0] = '\0';
FlagLenght[i] = 0;
for(j=0; j<MAXLEVEL; j++)
FlagOn[j][i] = 0;
FlagLevel[i] = 0;
}
/* Type definition for all BIF,LL,etc NODES */
#define DEFNODECODE(SYM, NAME, TYPE, LENGTH, NT,f1,f2,f3,f4,f5) node_code_kind[SYM] = NT;
#include"bif_node.def"
#undef DEFNODECODE
/* setbuffer to 0 */
Buf_pointer = 0;
Buf_address = &(UnpBuf[0]); /* may be reallocated */
memset(UnpBuf, 0, MAXLENGHTBUF);
}
/**************************************************************/
int UnparseFDVMProgram(fout,fi)
FILE *fout;
PTR_FILE fi;
{
Init_HPFUnparser();
current_file=fi;
errnumber=0;
fprintf(fout,"%s",filter(Tool_Unparse_Bif(fi->head_bfnd)));
return errnumber;
}
PTR_LLND FindMapDir(PTR_LLND ptr_llnd,PTR_BFND ptr_bif)
{
PTR_BFND bif,end=FindEndOfBlock(ptr_bif);
for(bif=FindBeginingOfBlock(ptr_bif);bif&&(bif!=end);bif=BIF_NEXT(bif))
{
if (BIF_CODE(bif)!=DVM_MAP_DIR) continue;
if (patternMatchExpression(ptr_llnd,BIF_LL1(bif)))
{
return BIF_LL2(bif);
}
}
return NULL;
}
int NumberOfForNode(PTR_BFND ptrbif,int *label)
{
int incircle=0;
PTR_BFND bif,end=FindEndOfBlock(ptrbif);
int count=0;
if (!BIF_LABEL(ptrbif)) return 0;
for(bif=FindBeginingOfBlock(ptrbif);bif&&(bif!=end);bif=BIF_NEXT(bif))
{
if (incircle&&(BIF_CODE(bif)==GOTO_NODE))
{
if (BIF_LL3(bif)&&NODE_LABEL (BIF_LL3(bif)))
{
if ( LABEL_STMTNO (NODE_LABEL (BIF_LL3(bif)))==LABEL_STMTNO (BIF_LABEL(ptrbif)))
{
*label=LABEL_STMTNO (BIF_LABEL(ptrbif));
}
}
}
if (BIF_CODE(bif)!=FOR_NODE) continue;
if (BIF_LABEL_USE (bif))
{
if (LABEL_STMTNO (BIF_LABEL_USE (bif))==LABEL_STMTNO (BIF_LABEL(ptrbif)))
{
count++;
incircle=1;
}
}
}
return count;
}
int FindPointerDir(PTR_SYMB symb,PTR_BFND ptr_bif)
{
PTR_BFND bif,end=FindEndOfBlock(ptr_bif);
for(bif=FindBeginingOfBlock(ptr_bif);bif&&(bif!=end);bif=BIF_NEXT(bif))
{
PTR_LLND llnd;
if (BIF_CODE(bif)!=DVM_POINTER_DIR) continue;
for(llnd=BIF_LL1(bif);llnd;llnd=NODE_OPERAND1(llnd))
if (!strcmp(SYMB_IDENT(NODE_SYMB(NODE_OPERAND0(llnd))),SYMB_IDENT(symb)))
{
int count=0;
char *str;
str=funparse_llnd(BIF_LL2(bif));
for(;*str!='\0';str++)
if (*str==':') count++;
return count;
}
}
return 0;
}
int Puttab()
{
int j;
for (j = 0; j < TabNumber; j++)
if (j>0)
BufPutString (" ",0);
else
BufPutString (" ",0); /* cychen */
return j;
}
PTR_LLND ChangeRedistributeOntoTask(PTR_LLND llnd)
{
if (!llnd) return LLNULL;
/*if (NODE_CODE(llnd)!=EXPR_LIST) return LLNULL;
if (NODE_CODE(NODE_OPERAND0(llnd))!=ARRAY_REF) return LLNULL;
if (!(SYMB_ATTR(NODE_SYMB(NODE_OPERAND0(llnd)))&TASK_BIT)) return LLNULL;*/
if (NODE_CODE(llnd)!=ARRAY_REF) return LLNULL;
if (!(SYMB_ATTR(NODE_SYMB(llnd))&TASK_BIT)) return LLNULL;
/*return NODE_OPERAND0(llnd);*/
return llnd;
}
int Find_SaveSymbol(PTR_LLND llnd)
{
int i;
if (NODE_CODE(llnd)!=VAR_REF) return 0;
for (i=0;i<Number_Of_Symbol;i++)
if (SymbolID[i]==NODE_SYMB(llnd)) return 1;
SymbolID[Number_Of_Symbol++]=NODE_SYMB(llnd);
if (Number_Of_Symbol==MAXFLAG)
{
Message("Too many reductions variables; sorry",0);
Number_Of_Symbol--;
}
return 0;
}
int FindPointerDeclaration(PTR_LLND llnd)
{
int count=0;
for(;llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
if ((NODE_CODE(NODE_OPERAND0(llnd))==VAR_REF)||(NODE_CODE(NODE_OPERAND0(llnd))==ARRAY_REF))
{
/*printf("\nFindPointerDecl : %s ",SYMB_IDENT(NODE_SYMB(NODE_OPERAND0(llnd))));*/
if (!(SYMB_ATTR(NODE_SYMB(NODE_OPERAND0(llnd)))&DVM_POINTER_BIT))
{
/*printf(": %s ",SYMB_IDENT(NODE_SYMB(NODE_OPERAND0(llnd))));*/
/*if(strcmp(SYMB_IDENT(NODE_SYMB(NODE_OPERAND0(llnd))),"heap"))*/
if(!(SYMB_ATTR(NODE_SYMB (NODE_OPERAND0(llnd)))&HEAP_BIT))
{
if (count) BufPutChar(',');
/*printf(": %s",SYMB_IDENT(NODE_SYMB(NODE_OPERAND0(llnd))));*/
Tool_Unparse2_LLnode(NODE_OPERAND0(llnd));
count++;
/*BufPutString("QWERTY\n",0);*/
}
};
}
else
{
if (count) BufPutChar(',');
Tool_Unparse2_LLnode(NODE_OPERAND0(llnd));
count++;
};
return count;
}
int FindCommonHeapDeclaration(PTR_LLND llnd)
{
int count=0;
for(;llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
if ((NODE_CODE(NODE_OPERAND0(llnd))==VAR_REF)||(NODE_CODE(NODE_OPERAND0(llnd))==ARRAY_REF))
{
if(!(SYMB_ATTR(NODE_SYMB (NODE_OPERAND0(llnd)))&HEAP_BIT))
{
if (count) BufPutChar(',');
Tool_Unparse2_LLnode(NODE_OPERAND0(llnd));
count++;
}
}
else
{
if (count) BufPutChar(',');
Tool_Unparse2_LLnode(NODE_OPERAND0(llnd));
count++;
};
return count;
}
PTR_LLND FindRedistributeDir(PTR_LLND ptr_llnd,PTR_BFND ptr_bif)
{
PTR_BFND bif,end=FindEndOfBlock(ptr_bif);
for(bif=FindBeginingOfBlock(ptr_bif);bif&&(bif!=end);bif=BIF_NEXT(bif))
{
if (BIF_CODE(bif)!=DVM_REDISTRIBUTE_DIR) continue;
if (BIF_LL1(bif))
{
PTR_LLND llnd;
for(llnd=BIF_LL1(bif);llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
{
if (patternMatchExpression(ptr_llnd,NODE_OPERAND0(llnd)))
return NODE_OPERAND0(llnd);
}
}
}
return NULL;
}
PTR_LLND FindRealignDir(PTR_LLND ptr_llnd,PTR_BFND ptr_bif)
{
PTR_BFND bif,end=FindEndOfBlock(ptr_bif);
for(bif=FindBeginingOfBlock(ptr_bif);bif&&(bif!=end);bif=BIF_NEXT(bif))
{
if (BIF_CODE(bif)!=DVM_REALIGN_DIR) continue;
if (BIF_LL1(bif))
{
PTR_LLND llnd;
for(llnd=BIF_LL1(bif);llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
{
if (patternMatchExpression(ptr_llnd,NODE_OPERAND0(llnd)))
return NODE_OPERAND0(llnd);
}
}
}
return NULL;
}
PTR_LLND FindDynamicDir(PTR_LLND ptr_llnd,PTR_BFND ptr_bif)
{
PTR_BFND bif,end=FindEndOfBlock(ptr_bif);
for(bif=FindBeginingOfBlock(ptr_bif);bif&&(bif!=end);bif=BIF_NEXT(bif))
{
if (BIF_CODE(bif)!=DVM_DYNAMIC_DIR) continue;
if (BIF_LL1(bif))
{
PTR_LLND llnd;
for(llnd=BIF_LL1(bif);llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
{
if (patternMatchExpression(ptr_llnd,NODE_OPERAND0(llnd)))
return NODE_OPERAND0(llnd);
}
}
}
/*for(bif=current_file->head_bfnd;bif;bif=BIF_NEXT(bif))
{
PTR_LLND ptr;
int ok=0;
if (BIF_CODE(bif)!=DVM_VAR_DECL) continue;
for(ptr=BIF_LL3(bif);ptr&&(NODE_CODE(ptr)==EXPR_LIST);ptr=NODE_OPERAND1(ptr))
if (NODE_CODE(NODE_OPERAND0(ptr))==DYNAMIC_OP) ok=1;
if (BIF_LL1(bif))
{
PTR_LLND llnd;
for(llnd=BIF_LL1(bif);llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
{
if (patternMatchExpression(ptr_llnd,NODE_OPERAND0(llnd)))
if (ok)
return NODE_OPERAND0(llnd);
else return 0;
}
}
}
*/
return NULL;
}
int UnparseEndofCircle(PTR_BFND bif)
{
int TabNum;
int i,count=0,label=0;
TabNum=TabNumber;
count=NumberOfForNode(bif,&label);
if (label) BufPutInt(label);
if(count)
{
if (TabNumber>1) TabNumber--;
for(i=0;i<count;i++)
{
if (i==count-1)
{
int k = 0 ;
if (Get_Flag_val("(TASK_DIR)",&k))
{
BufPutString("!HPF$",0);
Puttab();
Buf_pointer-=5;
BufPutString("END ON\n",0);
if (TabNumber>1) TabNumber--;
k=0;
Treat_Flag("(TASK_DIR)",&k,-1);
TabNum--;
}
}
Puttab();
if (TabNumber>1) TabNumber--;
BufPutString("end do\n",0);
}
TabNumber=TabNum;
}
return count;
/*21052001*/
}
PTR_BFND FindDistrAlignCombinedDir(PTR_LLND ptr_llnd,PTR_BFND ptr_bif)
{
PTR_BFND bif,end=FindEndOfBlock(ptr_bif);
for(bif=FindBeginingOfBlock(ptr_bif);bif&&(bif!=end);bif=BIF_NEXT(bif))
{
if ((BIF_CODE(bif)==DVM_DISTRIBUTE_DIR)||
(BIF_CODE(bif)==DVM_ALIGN_DIR)||
(BIF_CODE(bif)==DVM_VAR_DECL))
{
if (BIF_LL1(bif))
{
PTR_LLND llnd;
for(llnd=BIF_LL1(bif);llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
{
if (patternMatchExpression(ptr_llnd,NODE_OPERAND0(llnd)))
{
return bif;
}
}
}
}
}
return NULL;
}
PTR_LLND FindPointerDescriptor(PTR_LLND ptr_llnd,PTR_BFND ptr_bif)
{
PTR_BFND bif,end=FindEndOfBlock(ptr_bif);
for(bif=FindBeginingOfBlock(ptr_bif);bif&&(bif!=end);bif=BIF_NEXT(bif))
{
if (BIF_CODE(bif)!=VAR_DECL) continue;
if (BIF_LL1(bif))
{
PTR_LLND llnd;
for(llnd=BIF_LL1(bif);llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
{
if (!strcmp(SYMB_IDENT(NODE_SYMB(ptr_llnd)),SYMB_IDENT(NODE_SYMB(NODE_OPERAND0(llnd)))))
return NODE_OPERAND0(llnd);
}
}
}
return NULL;
}
int ArrayOfPointerDeclaration(PTR_BFND bif)
{
PTR_LLND llnd=BIF_LL1(bif);
int ok=1,empty=1;
int count=0;
for (;llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
{
PTR_LLND descr;
descr=FindPointerDescriptor(NODE_OPERAND0(llnd),bif);
if (ok&&!count)
{
char *str=NULL;
str=funparse_llnd(BIF_LL2(bif));
for(;*str!='\0';str++)
if (*str==':') count++;
}
if (count&&descr&&NODE_OPERAND0(descr))
{
char FLAG[10];
int i=0;
if (count>10)
{
Message("Can`t work : too many dimensions in DVM_POINTER_DIR",0);
return 0;
}
sprintf(FLAG,"(PTRTYPE%i)",count);
if (ok&&!Get_Flag_val(FLAG,&i))
{
i=0;
Treat_Flag(FLAG, &i,1);
GenerateType(count, BIF_LL3(bif));
};
if(ok)
{
Puttab();
BufPutString("TYPE (PTR_ARRAY",0);
BufPutInt(count);
BufPutString(") :: ",0);
ok=0;
empty=0;
BufPutString(SYMB_IDENT(NODE_SYMB(descr)),0);
SYMB_ATTR(NODE_SYMB(descr))|=DVM_POINTER_ARRAY_BIT;
BufPutChar('(');
Tool_Unparse2_LLnode(NODE_OPERAND0(descr));
BufPutChar(')');
continue;
}
if (!ok)
{
empty=0;
BufPutChar(',');
BufPutString(SYMB_IDENT(NODE_SYMB(descr)),0);
SYMB_ATTR(NODE_SYMB(descr))|=DVM_POINTER_ARRAY_BIT;
BufPutChar('(');
Tool_Unparse2_LLnode(NODE_OPERAND0(descr));
BufPutChar(')');
}
}
}
if (!empty) BufPutChar('\n');
return 1;
}
void PointerDeclaration(PTR_BFND bif)
{
PTR_LLND llnd=BIF_LL1(bif);
int ok=1,empty=1;
int count=0;
for (;llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
{
PTR_LLND descr;
descr=FindPointerDescriptor(NODE_OPERAND0(llnd),bif);
if (ok&&!count)
{
char *str=NULL;
str=funparse_llnd(BIF_LL2(bif));
for(;*str!='\0';str++)
if (*str==':') count++;
}
if ((count)&&descr&&!NODE_OPERAND0(descr))
{
if(ok)
{
Puttab();
Tool_Unparse2_LLnode(BIF_LL3(bif));
BufPutString(", POINTER, DIMENSION (",0);
Tool_Unparse2_LLnode(BIF_LL2(bif));
BufPutString(") :: ",0);
ok=0;
empty=0;
BufPutString(SYMB_IDENT(NODE_SYMB(descr)),0);
continue;
}
if (!ok)
{
empty=0;
BufPutChar(',');
BufPutString(SYMB_IDENT(NODE_SYMB(descr)),0);
}
}
}
if (!empty) BufPutChar('\n');
}
void GenerateType(int count, PTR_LLND llnd_type)
{
int i;
Puttab();
BufPutString("TYPE PTR_ARRAY",0);
BufPutInt(count);
BufPutChar('\n');
TabNumber++;
Puttab();
Tool_Unparse2_LLnode(llnd_type);
BufPutString(", POINTER, DIMENSION (",0);
for(i=0;i<count;i++)
{
BufPutString(":,",0);
}
Buf_pointer--;
BufPutString(") :: PTR\n",0);
BufPutString("!HPF$",0);
Puttab();
Buf_pointer-=5;
BufPutString("DYNAMIC PTR",0);
TabNumber--;
BufPutChar('\n');
Puttab();
BufPutString("END TYPE PTR_ARRAY",0);
BufPutInt(count);
BufPutChar('\n');
}
void gen_hpf_name (char *filename)
{
register int i;
hpfname = (char *) malloc((unsigned)(strlen(filename)+4));
strcpy (hpfname,filename);
for (i = strlen(filename)-1 ; i >= 0 ; i --)
if ( filename[i] == '.' )
break;
hpfname[i+1]='h';
hpfname[i+2]='p';
hpfname[i+3]='f';
hpfname[i+4]='\0';
}
int CheckNullDistribution(PTR_BFND bif)
{
if (BIF_CODE(bif)==DVM_DISTRIBUTE_DIR)
{
if (!BIF_LL2(bif)&&!BIF_LL3(bif))
return 1;
};
if (BIF_CODE(bif)==DVM_ALIGN_DIR)
{
if (!BIF_LL2(bif)&&!BIF_LL3(bif))
return 1;
};
if (BIF_CODE(bif)==DVM_VAR_DECL)
{
PTR_LLND llnd=BIF_LL3(bif);
for(;llnd&&(NODE_CODE(llnd)==EXPR_LIST);llnd=NODE_OPERAND1(llnd))
{
/*BufPutInt(NODE_CODE(NODE_OPERAND0(llnd)));*/
if (NODE_CODE(NODE_OPERAND0(llnd))==DYNAMIC_OP)
return 1;
if (NODE_CODE(NODE_OPERAND0(llnd))==DISTRIBUTE_OP)
if (!NODE_OPERAND0(NODE_OPERAND0(llnd))&&!NODE_OPERAND1(NODE_OPERAND0(llnd)))
return 1;
if (NODE_CODE(NODE_OPERAND0(llnd))==ALIGN_OP)
if (!NODE_OPERAND0(NODE_OPERAND0(llnd))&&!NODE_OPERAND1(NODE_OPERAND0(llnd)))
return 1;
};
}
/*BufPutInt(1234567);*/
return 0;
}
void ResetSymbolId()
{
int i,j;
char FLAG[10];
PTR_SYMB symb;
for (symb = current_file->head_symb; symb ; symb = SYMB_NEXT (symb))
SYMB_ID (symb) = 0;
for (j=0;j<10;j++)
{
sprintf(FLAG,"(PTRTYPE%i)",j);
i=0;
if (Get_Flag_val(FLAG,&i))
{
i=0;
Treat_Flag(FLAG, &i,-1);
};
}
}
PTR_BFND FindBeginingOfBlock(PTR_BFND ptr_bif)
{
PTR_BFND bif,ptr=NULL;
for(bif=current_file->head_bfnd;bif&&(bif!=ptr_bif);bif=BIF_NEXT(bif))
{
if ((BIF_CODE(bif)==PROG_HEDR)||
(BIF_CODE(bif)==PROC_HEDR)||
(BIF_CODE(bif)==PROS_HEDR))
ptr=bif;
}
return ptr;
}
PTR_BFND FindEndOfBlock(PTR_BFND ptr_bif)
{
PTR_BFND bif;
for(bif=ptr_bif;bif;bif=BIF_NEXT(bif))
{
if (BIF_CODE(bif)==CONTROL_END)
if ((BIF_CODE(BIF_CP(bif))==PROG_HEDR)||
(BIF_CODE(BIF_CP(bif))==PROC_HEDR)||
(BIF_CODE(BIF_CP(bif))==PROS_HEDR))
{
return bif;
}
}
return NULL;
}
int CheckAcross(PTR_BFND bif)
{
PTR_LLND llnd;
if (!bif) return 0;
for (llnd=BIF_LL2(bif);llnd&&NODE_CODE(llnd)==EXPR_LIST;llnd=NODE_OPERAND1(llnd))
{
if (NODE_OPERAND0(llnd)&&(NODE_CODE(NODE_OPERAND0(llnd))==ACROSS_OP))
return 1;
}
return 0;
}
int CheckReduction(PTR_BFND bif)
{
PTR_LLND llnd;
if (!bif) return 0;
for (llnd=BIF_LL2(bif);llnd&&NODE_CODE(llnd)==EXPR_LIST;llnd=NODE_OPERAND1(llnd))
{
if (NODE_OPERAND0(llnd)&&(NODE_CODE(NODE_OPERAND0(llnd))==REDUCTION_OP))
return 1;
}
return 0;
}
int IfReduction(PTR_LLND e1, PTR_LLND e2)
{
if(!e1||!e2) return(0);
if(NODE_CODE(e1) != NODE_CODE(e2))
return(0);
if(NODE_CODE(e1) != VAR_REF && NODE_CODE(e1) != ARRAY_REF)
return(0);
if(NODE_SYMB(e1) != NODE_SYMB(e2))
return(0);
if(NODE_CODE(e1) == ARRAY_REF && !patternMatchExpression(NODE_OPERAND0(e1),NODE_OPERAND0(e2)))
return(0);
return (1);
}
int FindRedInExpr(PTR_LLND red, PTR_LLND expr)
{
if(!expr) return 0;
if (!red) return 0;
if (NODE_CODE(red)!=VAR_REF && NODE_CODE(red)!=ARRAY_REF) return 0;
if(NODE_CODE(red)==VAR_REF && NODE_CODE(red) == NODE_CODE(expr))
{
if (NODE_SYMB(red)== NODE_SYMB(expr))
return 1;
else return 0;
}
if(NODE_CODE(red)==ARRAY_REF && NODE_CODE(red) == NODE_CODE(expr))
{
if (NODE_SYMB(red) == NODE_SYMB(expr))
return(patternMatchExpression(NODE_OPERAND0(red),NODE_OPERAND0(expr)));
}
return (FindRedInExpr(red,NODE_OPERAND0(expr))+FindRedInExpr(red,NODE_OPERAND1(expr)));
}
PTR_LLND AddToReductionList(PTR_LLND redlist, PTR_LLND newred)
{
PTR_LLND new_node,ptr;
new_node=make_llnode(EXPR_LIST,newred,LLNULL,SMNULL);
if (new_node)
{
if (redlist)
{
ptr=Follow_Llnd(redlist,2);
NODE_OPERAND1(ptr)=new_node;
}
if (!redlist) redlist=new_node;
}
else
{
return NULL;
}
return redlist;
}
int FindInNewList(PTR_LLND newlist, PTR_LLND red)
{
PTR_LLND ExprList;
if (!newlist) return 0;
if (!red) return 0;
if (NODE_CODE(red)!=VAR_REF && NODE_CODE(red)!=ARRAY_REF) return 0;
for (ExprList=newlist;ExprList&&(NODE_CODE(ExprList)==EXPR_LIST);ExprList=NODE_OPERAND1(ExprList))
{
if (NODE_CODE(NODE_OPERAND0(ExprList))==VAR_REF || NODE_CODE(NODE_OPERAND0(ExprList))==ARRAY_REF )
if (NODE_SYMB(NODE_OPERAND0(ExprList))==NODE_SYMB(red))
return 1;
}
return 0;
}
int isForNodeEndStmt(PTR_BFND stmt)
{
PTR_LABEL lab, do_lab;
PTR_BFND parent;
if(!(lab=BIF_LABEL(stmt)) && BIF_CODE(stmt) != CONTROL_END) /*the statement has no label and*/
return(0); /*is not ENDDO */
parent = BIF_CP(stmt);
if (parent)
{
if(BIF_CODE(parent)!=FOR_NODE) /*parent isn't DO statement*/
return(0);
do_lab = BIF_LABEL_USE(parent); /* label of loop end or NULL*/
if(do_lab) /* DO statement with label */
if(lab && LABEL_STMTNO(lab) == LABEL_STMTNO(do_lab))
/* the statement label is the label of loop end*/
return(1);
else
return(0);
else /* DO statement without label */
if(BIF_CODE(stmt) == CONTROL_END)
return(1);
else
return(0);
}
else return (0);
}
int ForNodeStmt(PTR_BFND stmt)
{
PTR_BFND bif;
int count=0,label;
for(bif=stmt;bif;bif=BIF_NEXT(bif))
{
/*BufPutString("Count=",0);
BufPutInt(count);*/
if (BIF_CODE(bif)==ASSIGN_STAT)
{
if (FindRedInExpr(BIF_LL1(bif),BIF_LL2 (bif)))
{
if (BIF_LL1(bif)&&NODE_SYMB(BIF_LL1(bif))&&(!IS_DISTRIBUTE_ARRAY(NODE_SYMB(BIF_LL1(bif))))&&(!SYMB_DOVAR(NODE_SYMB(BIF_LL1(bif)))))
{
/*BufPutString("Reduction var :",0);
Tool_Unparse2_LLnode(BIF_LL1(bif));
BufPutString("\n",0);*/
if (!FindInNewList(NewSpecList,BIF_LL1(bif)))
if(!FindInNewList(ReductionList,BIF_LL1(bif)))
{
ReductionList=AddToReductionList(ReductionList,BIF_LL1(bif));
/*BufPutString("Reduction LIST :",0);
Tool_Unparse2_LLnode(ReductionList);
BufPutString("\n",0);*/
}
}
}
continue;
}
if (BIF_CODE(bif)==FOR_NODE)
{
count++;
continue;
}
else
{
if (isForNodeEndStmt(bif))
{
if (BIF_CODE(bif)==CONTROL_END)
count--;
else
count-=NumberOfForNode(bif,&label);
}
}
if (!count) break;
}
return 0;
}
PTR_LLND FreeReductionList(PTR_LLND redlist)
{
PTR_LLND llnd,ptr;
llnd=redlist;
while((ptr=llnd))
{
if (NODE_OPERAND1(llnd) == NULL)
break;
llnd = NODE_OPERAND1(llnd);
NODE_OPERAND0(ptr)=NULL;
NODE_OPERAND1(ptr)=NULL;
#ifdef __SPF
removeFromCollection(ptr);
#endif
free(ptr);
}
return (NULL);
}
int ForNodeLabel(PTR_BFND stmt)
{
PTR_BFND bif;
int count=0,label;
/*int LABEL=0;*/
for(bif=stmt;bif;bif=BIF_NEXT(bif))
{
if (BIF_CODE(bif)==FOR_NODE)
{
count++;
continue;
}
else
{
if (isForNodeEndStmt(bif))
{
if (BIF_CODE(bif)==CONTROL_END)
count--;
else
count-=NumberOfForNode(bif,&label);
}
}
if (!count) break;
}
return 0;
}