replacing kernel and handler names to avoid conflicts with C language keywords and intrinsic function names

This commit is contained in:
ALEXks
2024-04-05 12:37:59 +03:00
parent b65437a75c
commit 841eb0314d
5 changed files with 250 additions and 39 deletions

View File

@@ -172,7 +172,7 @@ static char* getNewCycleVar(const char *oldVar)
{
char *str = new char[strlen(oldVar) + 2];
str[0] = '\0';
strcat(str, "_");
strcat(str, "__");
strcat(str, oldVar);
return str;
}
@@ -3179,7 +3179,7 @@ void initF2C_FunctionCalls()
handlersOfFunction[string("sinh")] = FunctionParam("sinh", 1, &createNewFCall);
handlersOfFunction[string("shifta")] = FunctionParam("shifta", 2, &createNewFCall);
handlersOfFunction[string("shiftl")] = FunctionParam("lshft", 2, &createNewFCall);
handlersOfFunction[string("shiftr")] = FunctionParam("rshft", 2, &createNewFCall);
handlersOfFunction[string("shiftr")] = FunctionParam("shiftr", 2, &createNewFCall);
handlersOfFunction[string("tan")] = FunctionParam("tan", 1, &createNewFCall);
handlersOfFunction[string("tand")] = FunctionParam("tan", 0, &__sindcosdtand_handler);
handlersOfFunction[string("tanh")] = FunctionParam("tanh", 1, &createNewFCall);
@@ -3391,3 +3391,185 @@ void Translate_Fortran_To_C(SgStatement *firstStmt, SgStatement *lastStmt, vecto
printf("END: CONVERTION OF BODY ON LINE %d\n", number_of_loop_line);
#endif
}
void ChangeSymbolName(SgSymbol *symb)
{
char *name = new char[strlen(symb->identifier())+2];
sprintf(name, "_%s", symb->identifier());
SYMB_IDENT(symb->thesymb) = name;
}
void RenamingNewProcedureVariables(SgSymbol *proc_name)
{
// replacing new procedure names to avoid conflicts with C language keywords and intrinsic function names
SgSymbol *sl;
for(sl = proc_name; sl; sl = sl->next())
switch(sl->variant())
{
case VARIABLE_NAME:
case CONST_NAME:
case FIELD_NAME:
case TYPE_NAME:
case LABEL_VAR:
case COMMON_NAME:
case NAMELIST_NAME:
ChangeSymbolName(sl);
break;
default:
break;
}
}
SgSymbol *hasSameNameAsSource(SgSymbol *symb)
{
symb_list *sl;
if (!symb)
return NULL;
if (sl=isInSymbListByChar(symb, acc_array_list))
return sl->symb;
SgExpression *el;
if (newVars.size() != 0)
{
correctPrivateList(RESTORE);
newVars.clear();
}
for (el = private_list; el; el = el->rhs())
if (!strcmp(el->lhs()->symbol()->identifier(), symb->identifier()))
return el->lhs()->symbol();
if (el=isInUsesListByChar(symb->identifier()))
return el->lhs()->symbol();
for (el = dvm_parallel_dir->expr(2); el; el = el->rhs())
if (!strcmp(el->lhs()->symbol()->identifier(), symb->identifier()))
return el->lhs()->symbol();
reduction_operation_list *rl;
for (rl = red_struct_list; rl; rl = rl->next)
{
if(rl->redvar && !strcmp(rl->redvar->identifier(), symb->identifier()))
return rl->redvar;
if(rl->locvar && !strcmp(rl->locvar->identifier(), symb->identifier()))
return rl->locvar;
}
return NULL;
}
/*
void RenamingCudaFunctionVariables(SgStatement *first, SgStatement *last, SgSymbol *k_symb)
{ // replacing kernel names to avoid conflicts with C language keywords and intrinsic function names
SgSymbol *sl;
for (sl=k_symb->next(); sl; sl=sl->next())
{
SgSymbol *s_symb = hasSameNameAsSource(sl);
if (s_symb)
{
replaceSymbInStmts(first->thebif, last->thebif, s_symb->thesymb, sl->thesymb);
ChangeSymbolName(sl);
}
}
}
void ReplacingVariablesInTranslatedCode(SgStatement *first, SgSymbol *k_symb)
{ // replacing source symbols by kernel symbols of the same name
SgSymbol *sl;
for (sl=k_symb->next(); sl; sl=sl->next())
{
if (sl->scope() != kernel_st || sl->variant() != VARIABLE_NAME)
continue;
SgSymbol *s_symb = hasSameNameAsSource(sl);
if (s_symb)
{ //printf("::: %s id:%d variant:%d\n",sl->identifier(), sl->id(), sl->variant());
//replaceSymbInStmtsSameName(first->thebif, last->thebif, s_symb->thesymb, sl->thesymb);
first->replaceSymbBySymbSameName(s_symb,sl);
}
}
}
void RenamingCudaFunctionVariables(SgStatement *first, SgStatement *first_body, SgSymbol *k_symb, int replace_flag)
{ // replacing kernel names to avoid conflicts with C language keywords and intrinsic function names
if (first_body)
ReplacingVariablesInTranslatedCode(first_body, k_symb);
for (sl=k_symb->next(); sl; sl=sl->next())
{
if (sl->scope() != kernel_st || sl->variant() != VARIABLE_NAME)
continue;
SgSymbol *s_symb = hasSameNameAsSource(sl);
if (s_symb)
{
if (replace_flag)
first->replaceSymbBySymb(s_symb,sl);
//replaceSymbInStmts(first->thebif, last->thebif, s_symb->thesymb, sl->thesymb);
ChangeSymbolName(sl);
}
}
}
int isCudaVariable(SgSymbol *symb)
{
if(!strcmp(symb->identifier(), "blocks")) return 1;
if(!strcmp(symb->identifier(), "threads")) return 1;
if(!strcmp(symb->identifier(), "threadIdx")) return 1;
if(!strcmp(symb->identifier(), "blockIdx")) return 1;
if(!strcmp(symb->identifier(), "blockDim")) return 1;
if(!strcmp(symb->identifier(), "gridDim")) return 1;
return 0;
}
*/
int sameVariableName(SgSymbol *symb1, SgSymbol *symb2)
{
if (!symb1 || !symb2 || (symb1->variant() != VARIABLE_NAME && symb1->variant() != CONST_NAME) || symb2->variant() != VARIABLE_NAME && symb2->variant() != CONST_NAME)
return 0;
if (!strcmp (symb1->identifier(), symb2->identifier()))
return 1;
else
return 0;
}
void replaceSymbolSameNameInExpr(SgExpression *expr, SgSymbol *symb, SgSymbol *s_new)
{
//SgRecordRefExp *re;
if (!expr || !symb || !s_new)
return;
//if (isSgRecordRefExp(expr)) //&& isCudaVariable(re->recordName()))
// replaceSymbolSameNameInExpr(expr->lhs(), symb, s_new);
if (expr->symbol())
if (sameVariableName(expr->symbol(), symb))
expr->setSymbol(s_new);
replaceSymbolSameNameInExpr(expr->lhs(), symb, s_new);
replaceSymbolSameNameInExpr(expr->rhs(), symb, s_new);
}
void replaceVariableSymbSameNameInStatements(SgStatement *first, SgStatement *last, SgSymbol *symb, SgSymbol *s_new, int replace_flag)
{
SgStatement *stmt;
for (stmt=first; stmt; stmt = stmt->lexNext())
{
if (sameVariableName (stmt->symbol(), symb))
stmt->setSymbol(*s_new);
replaceSymbolSameNameInExpr(stmt->expr(0), symb, s_new);
replaceSymbolSameNameInExpr(stmt->expr(1), symb, s_new);
replaceSymbolSameNameInExpr(stmt->expr(2), symb, s_new);
if (last && stmt == last)
break;
}
}
void RenamingCudaFunctionVariables(SgStatement *first, SgSymbol *k_symb, int replace_flag)
{ // replacing kernel names to avoid conflicts with C language keywords and intrinsic function names
SgSymbol *sl;
for (sl=k_symb->next(); sl; sl=sl->next())
{
if (sl->scope() != first || sl->variant() != VARIABLE_NAME)
continue;
SgSymbol *s_symb = hasSameNameAsSource(sl);
if (s_symb)
{
if (replace_flag)
replaceVariableSymbSameNameInStatements(first,first->lastNodeOfStmt(), s_symb, sl, replace_flag);
// first->replaceSymbBySymb(s_symb,sl);
//replaceSymbInStmts(first->thebif, last->thebif, s_symb->thesymb, sl->thesymb);
ChangeSymbolName(sl);
}
}
}