replacing kernel and handler names to avoid conflicts with C language keywords and intrinsic function names
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user