3#include "markLhsValues.h"
5#include "FileUtility.h"
6#include <Sawyer/Message.h>
8#include "AstJSONGeneration.h"
10#include "SgNodeHelper.h"
12#include "Rose/AST/Utility.h"
14#include "sageInterface.h"
15#include "Combinatorics.h"
18#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
19#include "replaceExpressionWithStatement.h"
21#include "constantFolding.h"
28#include "sageBuilder.h"
34#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
37#include "AstInterface_ROSE.h"
38#include "LoopTransformInterface.h"
40#include "DepInfoAnal.h"
41#include "ArrayAnnot.h"
42#include "ArrayInterface.h"
44#include "LoopUnroll.h"
45#include "abstract_handle.h"
46#include "roseAdapter.h"
49#include <boost/lexical_cast.hpp>
50#include <boost/foreach.hpp>
56#include <unordered_map>
58#ifdef ROSE_BUILD_JAVA_LANGUAGE_SUPPORT
66 extern jclass currentJavaTraversalClass;
67 extern JNIEnv *currentEnvironment;
68 extern jmethodID mainMethod;
69 extern jmethodID hasConflictsMethod;
70 extern jmethodID getTempDirectoryMethod;
71 extern jmethodID createTempFileMethod;
72 extern jmethodID createTempNamedFileMethod;
73 extern jmethodID createTempNamedDirectoryMethod;
80using namespace Rose::Frontend::Java::Ecj;
86namespace EDG_ROSE_Translation
89#if defined(ROSE_BUILD_CXX_LANGUAGE_SUPPORT) && !defined(ROSE_USE_CLANG_FRONTEND)
91 extern std::map<std::string, SgIncludeFile*> edg_include_file_map;
94 std::map<std::string, SgIncludeFile*> edg_include_file_map;
101#include "detectMacroOrIncludeFileExpansions.h"
104 template<
class T>
void setSourcePositionToDefault( T* node );
108#ifdef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
109 #include "transformationSupport.h"
113#include "rose_config.h"
119#include "AST_FILE_IO.h"
124#define OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS 1
134typedef std::set<SgLabelStatement*> SgLabelStatementPtrSet;
153 vector<SgBasicBlock*> addedBasicBlockNodes;
170 std::vector<SgNode*> resultlist;
171 void visit (
SgNode* node)
174 ROSE_ASSERT(result != NULL);
176 printf (
"In SageInterface::deleteAllNodes(): result = %p = %s \n",result,result->
class_name().c_str());
181 resultlist.push_back(result);
184 resultlist.push_back(result);
188 virtual ~MyTraversal() {}
192 size_t numberOfNodes_before = numberOfNodes();
194 MyTraversal my_traversal;
198 my_traversal.traverseMemoryPool();
204 vector<SgNode*> & nodeList = my_traversal.resultlist;
206 printf (
"In SageInterface::deleteAllNodes(): get list of SgNode: nodeList.size() = %zu \n",nodeList.size());
208 vector<SgNode*>::iterator i = nodeList.begin();
211 while (i != nodeList.end())
217 printf (
" --- calling delete (and thus the destructor) node = %p = %s \n",node,node->
class_name().c_str());
227 vector<SgFunctionDeclaration*> functionDeclarationList = getSgNodeListFromMemoryPool<SgFunctionDeclaration>();
228 printf (
"In SageInterface::deleteAllNodes(): get list of SgFunctionDeclaration: functionDeclarationList.size() = %zu \n",functionDeclarationList.size());
232 AST_FILE_IO::clearAllMemoryPools();
234 size_t numberOfNodes_after = numberOfNodes();
237 printf (
"Leaving SageInterface::deleteAllNodes(): numberOfNodes_before = %zu numberOfNodes_after = %zu \n",numberOfNodes_before,numberOfNodes_after);
266 void visit (
SgNode* node)
273 resultlist.push_back(result);
276 virtual ~MyTraversal() {}
280 size_t numberOfNodes_before = numberOfNodes();
282 MyTraversal my_traversal;
286 my_traversal.traverseMemoryPool();
295 ASSERT_not_null(decl);
298 printf (
"TOP of SageInterface::DeclarationSets::addDeclaration(): decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
303 if (firstNondefiningDeclaration ==
nullptr)
307 printf (
"WARNING: SageInterface::DeclarationSets::addDeclaration(): firstNondefiningDeclaration == NULL: decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
311 ASSERT_not_null(firstNondefiningDeclaration);
313 if (decl == firstNondefiningDeclaration)
316 if (isSgTypedefDeclaration(decl) !=
nullptr)
318 printf (
"TOP of SageInterface::DeclarationSets::addDeclaration(): decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
321 if (declarationMap.find(firstNondefiningDeclaration) == declarationMap.end())
324 printf (
"In SageInterface::DeclarationSets::addDeclaration(): Add a set for decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
327 if (isSgTypedefDeclaration(decl) !=
nullptr)
329 printf (
"In SageInterface::DeclarationSets::addDeclaration(): Add a set for decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
333 declarationMap[decl] =
new set<SgDeclarationStatement*>();
335 ROSE_ASSERT (declarationMap.find(firstNondefiningDeclaration) != declarationMap.end());
336 ROSE_ASSERT(declarationMap[decl] !=
nullptr);
339 declarationMap[firstNondefiningDeclaration]->insert(decl);
343 if (declarationMap[firstNondefiningDeclaration]->find(decl) == declarationMap[firstNondefiningDeclaration]->end())
346 printf (
"In SageInterface::DeclarationSets::addDeclaration(): Add the declaration to the existing set: decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
349 if (isSgTypedefDeclaration(decl) !=
nullptr)
351 printf (
"In SageInterface::DeclarationSets::addDeclaration(): Add the declaration to the existing set: decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
355 declarationMap[firstNondefiningDeclaration]->insert(decl);
360 printf (
"WARNING: SageInterface::DeclarationSets::addDeclaration(): A set already exists for decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
364 bool ignore_error = (isSgFunctionParameterList(decl) !=
nullptr);
375 bool isInTemplateFunctionDeclaration = enclosingFunction !=
nullptr && (isSgTemplateMemberFunctionDeclaration(enclosingFunction) || isSgTemplateFunctionDeclaration(enclosingFunction));
379 bool isInTemplateClassDefinition = enclosingClassDefinition !=
nullptr && isSgTemplateClassDefinition(enclosingClassDefinition);
381 bool isInTemplateDeclaration = isInTemplateFunctionDeclaration || isInTemplateClassDefinition;
383 ignore_error = ignore_error || (isSgTypedefDeclaration(decl) !=
nullptr) || (isSgTemplateInstantiationDecl(decl) !=
nullptr) || (isInTemplateDeclaration ==
true);
388 if (isSgClassDeclaration(decl) !=
nullptr)
390 ignore_error = ignore_error || (isSgClassDeclaration(decl)->get_isUnNamed() ==
true);
398 if (declarationMap.find(firstNondefiningDeclaration) != declarationMap.end())
401 ROSE_ASSERT (declarationMap[firstNondefiningDeclaration] !=
nullptr);
402 if (declarationMap[firstNondefiningDeclaration]->find(decl) == declarationMap[firstNondefiningDeclaration]->end())
405 declarationMap[firstNondefiningDeclaration]->insert(decl);
410 printf (
"This declaration is already in the set (skip adding it twice): decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
419 printf (
"In SageInterface::DeclarationSets::addDeclaration(): Adding set and declaration for the firstNondefiningDeclaration = %p = %s = %s \n",
420 firstNondefiningDeclaration,firstNondefiningDeclaration->
class_name().c_str(),
get_name(firstNondefiningDeclaration).c_str());
427 declarationMap[firstNondefiningDeclaration] =
new set<SgDeclarationStatement*>();
429 ROSE_ASSERT (declarationMap.find(firstNondefiningDeclaration) != declarationMap.end());
433 declarationMap[firstNondefiningDeclaration]->insert(decl);
436 ROSE_ASSERT(declarationMap[firstNondefiningDeclaration]->find(decl) != declarationMap[firstNondefiningDeclaration]->end());
438 printf (
"SageInterface::DeclarationSets::addDeclaration(): No set exists for the firstNondefiningDeclaration = %p = %s = %s \n",firstNondefiningDeclaration,firstNondefiningDeclaration->
class_name().c_str(),
get_name(firstNondefiningDeclaration).c_str());
445 printf (
"Leaving SageInterface::DeclarationSets::addDeclaration(): decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
449const std::set<SgDeclarationStatement*>*
455 ROSE_ASSERT(declarationMap.find(firstNondefiningDeclaration) != declarationMap.end());
457 const set<SgDeclarationStatement*>* declarationSet = declarationMap[firstNondefiningDeclaration];
460 return declarationSet;
463std::map<SgDeclarationStatement*,std::set<SgDeclarationStatement*>* > &
464SageInterface::DeclarationSets::getDeclarationMap()
466 return declarationMap;
482#define DEBUG_LOCATED_IN_DEFINING_SCOPE 0
485 ROSE_ASSERT(firstNondefiningDeclaration !=
nullptr);
487 set<SgDeclarationStatement*>* declarationSet = declarationMap[firstNondefiningDeclaration];
488 ROSE_ASSERT(declarationSet !=
nullptr);
490 set<SgDeclarationStatement*>::iterator i = declarationSet->begin();
492 bool isDefinedInNamedScope =
false;
494#if DEBUG_LOCATED_IN_DEFINING_SCOPE
495 printf (
"In DeclarationSets::isLocatedInDefiningScope(): decl = %p = %s \n",decl,decl->
class_name().c_str());
496 printf (
" --- declarationSet->size() = %" PRIuPTR
" \n",declarationSet->size());
499 while (isDefinedInNamedScope ==
false && i != declarationSet->end())
501 ROSE_ASSERT(*i !=
nullptr);
502#if DEBUG_LOCATED_IN_DEFINING_SCOPE
503 printf (
" --- *i = %p = %s \n",*i,(*i)->class_name().c_str());
507 SgScopeStatement* structural_scope = isSgScopeStatement((*i)->get_parent());
509#if DEBUG_LOCATED_IN_DEFINING_SCOPE
510 printf (
" --- semantic_scope = %p = %s \n",semantic_scope,semantic_scope->
class_name().c_str());
511 printf (
" --- structural_scope = %p = %s \n",structural_scope,structural_scope->
class_name().c_str());
514 SgScopeStatement* scope = isSgClassDefinition(semantic_scope) !=
nullptr ? semantic_scope : structural_scope;
515 ASSERT_not_null(scope);
517#if DEBUG_LOCATED_IN_DEFINING_SCOPE
518 printf (
" --- scope = %p = %s \n",scope,scope->
class_name().c_str());
519 printf (
" --- scope->isNamedScope() = %s \n",scope->
isNamedScope() ?
"true" :
"false");
521 SgGlobal* globalScope = isSgGlobal(scope);
524 if (globalScope !=
nullptr || (scope->
isNamedScope() ==
true && isSgClassDefinition(structural_scope) ==
nullptr) )
527 bool willBeOutput = ((*i)->get_file_info()->isCompilerGenerated() ==
false ||
528 ((*i)->get_file_info()->isCompilerGenerated() &&
529 (*i)->get_file_info()->isOutputInCodeGeneration()) );
530#if DEBUG_LOCATED_IN_DEFINING_SCOPE
531 printf (
" --- before: willBeOutput = %s \n",willBeOutput ?
"true" :
"false");
534 willBeOutput = willBeOutput && scope == structural_scope;
536#if DEBUG_LOCATED_IN_DEFINING_SCOPE
537 printf (
" --- after: willBeOutput = %s \n",willBeOutput ?
"true" :
"false");
543 isDefinedInNamedScope = willBeOutput;
549#if DEBUG_LOCATED_IN_DEFINING_SCOPE
550 if (associatedDeclaration !=
nullptr)
552 printf (
"Leaving DeclarationSets::isLocatedInDefiningScope(): associatedDeclaration = %p = %s \n",associatedDeclaration,
associatedDeclaration->
class_name().c_str());
556 printf (
"Leaving DeclarationSets::isLocatedInDefiningScope(): associatedDeclaration = %p \n",associatedDeclaration);
560 return isDefinedInNamedScope;
564SageInterface::buildDeclarationSets(
SgNode* n)
566 DeclarationSets* declarationSet =
new DeclarationSets();
571 DeclarationSets* declarationSet;
574 DeclarationSetTraversal(DeclarationSets* ds) : declarationSet(ds) {}
580 declarationSet->addDeclaration(decl);
586 DeclarationSetTraversal traversal(declarationSet);
587 traversal.traverse(n, preorder);
589 return declarationSet;
596string getVariantName ( VariantT v )
598 ROSE_ASSERT(
int(v) <
int(V_SgNumVariants));
605 extern const char* roseGlobalVariantNameList[];
606 return string(roseGlobalVariantNameList[v]);
613 bool usingTemplateSyntax =
false;
614 string nameString = name.getString();
617 usingTemplateSyntax = (nameString.find(
'<') != string::npos) && (nameString.find(
'>') != string::npos);
621 if (nameString ==
"<unnamed>")
623 printf (
"In SageInterface::hasTemplateSyntax(): Identified case of name == <unnamed> \n");
625 usingTemplateSyntax =
false;
629 return usingTemplateSyntax;
641 ROSE_ASSERT(node != NULL);
645 ROSE_ASSERT(isSgFile(node) == NULL);
646 ROSE_ASSERT(isSgFileList(node) == NULL);
647 ROSE_ASSERT(isSgProject(node) == NULL);
652 while (parent !=
nullptr && isSgFileList(parent) ==
nullptr)
656 printf (
"--- parent = %p = %s \n",parent,parent->
class_name().c_str());
659 parent->
get_file_info()->display(
"In SageInterface::whereAmI() diagnostics support");
686 ifstmt->setCaseInsensitive(
true);
689 if (conditional) conditional->
set_parent(ifstmt);
691 if (false_body) false_body->
set_parent(ifstmt);
698 ROSE_ASSERT(switchStatement != NULL);
702 switchStatement->setCaseInsensitive(
true);
707 if (switchStatement->
get_body() ==
nullptr)
711 if (item_selector !=
nullptr)
721 ROSE_ASSERT(whileStatement);
725 whileStatement->setCaseInsensitive(
true);
729 if (whileStatement->
get_body() ==
nullptr)
733 if (whileStatement->get_else_body() ==
nullptr)
734 whileStatement->set_else_body(else_body);
737 if (condition) condition->
set_parent(whileStatement);
741 if (else_body !=
nullptr)
743 whileStatement->set_else_body(else_body);
764 ROSE_ASSERT(declaration != NULL);
768 while ( isSgNamespaceDefinitionStatement(tempScope) ==
nullptr && isSgGlobal(tempScope) ==
nullptr )
771 ROSE_ASSERT(tempScope != NULL);
778 return namespaceScope;
792 ASSERT_not_null(defn);
796 ASSERT_not_null(templateDeclaration);
802 if (templateInstatiationClassDefinition !=
nullptr)
806 ASSERT_not_null(parentTemplateInstantiationDefinition);
808 ASSERT_not_null(parentTemplateInstantiationDeclaration);
811 ASSERT_not_null(parentDeclaration);
813 else if (cdefn !=
nullptr)
817 ASSERT_not_null(parentDeclaration);
819 else if (nrscope !=
nullptr)
821 parentDeclaration = isSgDeclarationStatement(nrscope->
get_parent());
822 ASSERT_not_null(parentDeclaration);
829 return parentDeclaration;
838 ASSERT_not_null(var_decl);
839 ASSERT_not_null(base_decl);
853 if (find(stmt_list.begin(), stmt_list.end(), base_decl) != stmt_list.end())
858 var_decl->set_baseTypeDefiningDeclaration(base_decl);
864 t1.traverseMemoryPool();
873 bool foundExistingPrototype =
false;
875 ROSE_ASSERT(scope != NULL);
876 ROSE_ASSERT(functionDeclaration != NULL);
877 ROSE_ASSERT(startingAtDeclaration != NULL);
880 if (isSgDeclarationScope(scope)) {
881 printf(
"TODO: SgDeclarationScope handling in SageInterface::isPrototypeInScope see ROSE-1378\n");
892 SgDeclarationStatementPtrList::iterator startingLocation = find(declarationList.begin(),declarationList.end(),startingAtDeclaration);
894 if (startingLocation != declarationList.end())
897 printf (
"startingLocation = %p = %s = %s \n",*startingLocation,(*startingLocation)->class_name().c_str(),
SageInterface::get_name(*startingLocation).c_str());
900 SgDeclarationStatementPtrList::iterator i = startingLocation;
902 SgName targetName = functionDeclaration->get_name();
904 while (i != declarationList.end())
910 if (templateMemberFunction !=
nullptr)
913 if (targetScope == templateMemberFunction->
get_scope())
915 if (targetName == templateMemberFunction->get_name())
918 if (templateMemberFunction->
isForward() ==
true)
920 foundExistingPrototype =
true;
933 return foundExistingPrototype;
939 ROSE_ASSERT(node1 && node2);
949 }
while( (curnode!=
nullptr) && (curnode!=node1));
966#define DEBUG_HAS_SAME_SCOPE 0
968#if DEBUG_HAS_SAME_SCOPE
969 printf (
"In SageInterface::hasSameGlobalScope(): \n");
970 printf (
" --- statement_1 = %p = %s \n",statement_1,statement_1->
class_name().c_str());
971 printf (
" --- statement_2 = %p = %s \n",statement_2,statement_2->
class_name().c_str());
974 bool includingSelf =
true;
975 SgGlobal* global_scope_1 = getEnclosingNode<SgGlobal>(statement_1,includingSelf);
976 SgGlobal* global_scope_2 = getEnclosingNode<SgGlobal>(statement_2,includingSelf);
978#if DEBUG_HAS_SAME_SCOPE
979 printf (
" --- global_scope_1 = %p = %s \n",global_scope_1,global_scope_1->
class_name().c_str());
981 printf (
" --- --- sourcefile_1 = %p filename = %s \n",sourcefile_1,sourcefile_1->
getFileName().c_str());
983 printf (
" --- global_scope_2 = %p = %s \n",global_scope_2,global_scope_2->
class_name().c_str());
985 printf (
" --- --- sourcefile_2 = %p filename = %s \n",sourcefile_2,sourcefile_2->
getFileName().c_str());
988 bool returnResult = (global_scope_1 == global_scope_2);
990#if DEBUG_HAS_SAME_SCOPE
991 printf (
"Leaving SageInterface::hasSameGlobalScope(): returning: %s \n",returnResult ?
"true" :
"false");
1001 std::vector<SgNode*> intersectionSet;
1004 std::vector<SgNode*> AST_original = NodeQuery::querySubTree (original,V_SgNode);
1005 std::vector<SgNode*> AST_copy = NodeQuery::querySubTree (copy,V_SgNode);
1007 int AST_original_size = AST_original.size();
1008 int AST_copy_size = AST_copy.size();
1012 printf (
"Original AST size = %d \n",AST_original_size);
1013 printf (
"Copy of original AST size = %d \n",AST_copy_size);
1016 int differenceInSizes = AST_original_size - AST_copy_size;
1017 if (differenceInSizes == 0)
1020 printf (
"Copied AST is the SAME size as the original (size = %d) \n",AST_original_size);
1024 printf (
"Warning: Copied AST and the original are DIFFERENT sizes (original size = %d copyied size = %d) \n",AST_original_size,AST_copy_size);
1029 std::set<SgNode*> AST_set_original;
1030 for (
int i = 0; i < AST_original_size; i++)
1032 AST_set_original.insert(AST_original[i]);
1035 std::set<SgNode*> AST_set_copy;
1036 for (
int i = 0; i < AST_copy_size; i++)
1038 AST_set_copy.insert(AST_copy[i]);
1041 int size = AST_original_size;
1042 std::vector<SgNode*> intersectionList(size);
1045 std::vector<SgNode*>::iterator end = set_intersection(AST_set_original.begin(),AST_set_original.end(),AST_set_copy.begin(),AST_set_copy.end(),intersectionList.begin());
1048 std::vector<SgNode*> meaningIntersectionList = std::vector<SgNode*>(intersectionList.begin(),end);
1049 std::vector<SgNode*> deleteList;
1050 for (
int i = 0; i < (int)meaningIntersectionList.size(); i++)
1052 if (meaningIntersectionList[i] !=
nullptr && isSgType(meaningIntersectionList[i]) !=
nullptr)
1054 deleteList.push_back(meaningIntersectionList[i]);
1060 printf (
"Remove the types that are allowed to be shared: deleteList.size() = %ld \n",(
long)deleteList.size());
1062 for (std::vector<SgNode*>::iterator i = deleteList.begin(); i != deleteList.end(); i++)
1064 meaningIntersectionList.erase(find(meaningIntersectionList.begin(),meaningIntersectionList.end(),*i));
1068 printf (
"After removing the types there are meaningIntersectionList.size() = %ld \n",(
long)meaningIntersectionList.size());
1070 for (
int i = 0; i < (int)meaningIntersectionList.size(); i++)
1072 printf (
" meaningIntersectionList[%d] = %p = %s = %s \n",i,meaningIntersectionList[i],meaningIntersectionList[i]->class_name().c_str(),
get_name(meaningIntersectionList[i]).c_str());
1075 int unmatchedIRnodes = 0;
1076 if (help !=
nullptr)
1078 std::vector<SgNode*> tmp_AST_original;
1079 std::vector<SgNode*> tmp_AST_copy;
1081 int AST_original_size = AST_original.size();
1082 for (
int j = 0; j < AST_original_size; j++)
1084 if (AST_original[j] != NULL && isSgType(AST_original[j]) == NULL)
1086 tmp_AST_original.push_back(AST_original[j]);
1090 int AST_copy_size = AST_copy.size();
1091 for (
int j = 0; j < AST_copy_size; j++)
1093 if (AST_copy[j] != NULL && isSgType(AST_copy[j]) == NULL)
1095 tmp_AST_copy.push_back(AST_copy[j]);
1099 std::vector<SgNode*> deleteList_original;
1100 std::vector<SgNode*> deleteList_copy;
1101 for (
int j = 0; j < (int)tmp_AST_original.size(); j++)
1104 SgCopyHelp::copiedNodeMapTypeIterator i = help->get_copiedNodeMap().find(tmp_AST_original[j]);
1106 if (i != help->get_copiedNodeMap().end())
1109 SgNode* associated_node_copy = i->second;
1110 ROSE_ASSERT(associated_node_copy != NULL);
1111 deleteList_original.push_back(tmp_AST_original[j]);
1112 deleteList_copy.push_back(associated_node_copy);
1117 if (templateMemberFunction != NULL)
1119 printf (
"In SageInterface::astIntersection(): Found a SgTemplateInstantiationMemberFunctionDecl = %p copy = %p \n",templateMemberFunction,associated_node_copy);
1127 int deleteList_original_size = deleteList_original.size();
1128 for (
int j = 0; j < deleteList_original_size; j++)
1131 std::vector<SgNode*>::iterator k = find(tmp_AST_original.begin(),tmp_AST_original.end(),deleteList_original[j]);
1132 if (k != tmp_AST_original.end())
1134 tmp_AST_original.erase(k);
1139 printf (
"IR nodes different between the original AST and the copy of the AST = %" PRIuPTR
" \n",tmp_AST_original.size());
1141 for (
int j = 0; j < (int)tmp_AST_original.size(); j++)
1143 printf (
"non matched IR node = %p = %s = %s \n",tmp_AST_original[j],tmp_AST_original[j]->class_name().c_str(),
get_name(tmp_AST_original[j]).c_str());
1147 unmatchedIRnodes = (int)tmp_AST_original.size();
1151 if (differenceInSizes != 0)
1153 SgProject* originalProject = isSgProject(original);
1154 if (originalProject != NULL)
1156 printf (
"In %s Copied AST and the original are DIFFERENT sizes (original size = %d copyied size = %d) IR nodes different = %d \n",
1157 (*originalProject)[0]->get_sourceFileNameWithoutPath().c_str(),AST_original_size,AST_copy_size,unmatchedIRnodes);
1160 if (unmatchedIRnodes > 0)
1162 printf (
"Make this an error under stricter testing \n");
1167 return intersectionSet;
1177 ROSE_ASSERT(initializedNameNode != NULL);
1179#define DEBUG_SET_NAME 0
1183 printf (
"In SageInterface::set_name(): initializedNameNode = %p name = %s new_name = %s \n",initializedNameNode,initializedNameNode->get_name().str(),new_name.str());
1190 while((node!=NULL) && ( isSgScopeStatement(node)==NULL))
1193 ROSE_ASSERT(node!=NULL);
1201 if (isSgEnumDeclaration(initializedNameNode->
get_parent()) != NULL)
1203 ROSE_ASSERT(scope_stmt != NULL);
1204 printf (
"scope_stmt = %p = %s \n",scope_stmt,scope_stmt->
class_name().c_str());
1206 printf (
"Detected isSgEnumDeclaration as parent: exiting as a test in SageInterface::set_name() \n");
1211 ROSE_ASSERT(scope_stmt != NULL);
1217 ROSE_ASSERT(parent_declaration != NULL);
1220 std::pair<SgSymbolTable::hash_iterator,SgSymbolTable::hash_iterator> pair_it = scope_stmt->
get_symbol_table()->get_table()->equal_range(initializedNameNode->get_name());
1222 SgSymbolTable::hash_iterator found_it = scope_stmt->
get_symbol_table()->get_table()->end();
1224 for (SgSymbolTable::hash_iterator it = pair_it.first; it != pair_it.second; ++it)
1227 printf (
"Looking for symbol in scope = %p = %s \n",scope_stmt,scope_stmt->
class_name().c_str());
1228 printf (
" --- *it = %p = %s \n",(*it).second,(*it).second->class_name().c_str());
1230 switch(parent_declaration->
variantT())
1232 case V_SgFunctionParameterList:
1233 case V_SgVariableDeclaration:
1235 if (isSgVariableSymbol((*it).second) != NULL)
1240 case V_SgClassDeclaration:
1242 if (isSgClassSymbol((*it).second) != NULL)
1247 case V_SgFunctionDeclaration:
1249 if (isSgFunctionSymbol((*it).second) != NULL)
1255 case V_SgEnumDeclaration:
1257 if (isSgEnumFieldSymbol((*it).second) != NULL)
1264 printf (
"Default reached in switch in SageInterface::set_name() \n");
1272 printf (
"Warning: There is no Variable, Class, Function, or EnumValue symbol associated with p_name \n");
1279 printf (
"WARNING: SageInterface::set_name(): This statement can not be transformed because it is part of a header file specific more then once with different include file syntax \n");
1285 printf (
"In SageInterface::set_name(): This statement can be transformed! parent_declaration = %p = %s \n",parent_declaration,
get_name(parent_declaration).c_str());
1290 printf (
"Exiting as a test! \n");
1295 SgSymbol * associated_symbol = (*found_it).second;
1310 found_it = scope_stmt->
get_symbol_table()->get_table()->insert(pair<SgName,SgSymbol*> ( new_name,associated_symbol));
1312 found_it = scope_stmt->
get_symbol_table()->get_table()->insert(pair<SgName,SgSymbol*> ( new_name,associated_symbol));
1317 printf (
"Warning: insertion of new symbol failed \n");
1323 printf (
"Reset initializedNameNode->get_name() = %s to new_name = %s \n",initializedNameNode->get_name().str(),new_name.str());
1327 initializedNameNode->set_name(new_name);
1332 ROSE_ASSERT(enclosingStatement != NULL);
1348 void visit (
SgNode* node)
1353 ROSE_ASSERT(varRefExp != NULL);
1354 ROSE_ASSERT(variableSymbol != NULL);
1356 if (varRefExp->get_symbol() == variableSymbol)
1359 printf (
"In SageInterface::set_name(): Found associated SgVarRefExp varRefExp = %p to symbol associated_symbol = %p \n",varRefExp,variableSymbol);
1362 printf (
"Exiting as a test! \n");
1373 printf (
"In SageInterface::set_name(): When unparsing header files, we need to set the physical file id to the correct file \n");
1378 ROSE_ASSERT(associatedStatement != NULL);
1384 ROSE_ASSERT(associatedStatement != NULL);
1392 RoseVisitor(
SgSymbol* symbol_parmeter) : counter(0), symbol(symbol_parmeter)
1395 printf (
"roseVisitor::visit: counter %4d node = %s \n",counter,symbol_parmeter->
class_name().c_str());
1403 RoseVisitor t1(associated_symbol);
1408 printf (
"Leaving SageInterface::set_name(): initializedNameNode = %p name = %s new_name = %s (return 1) \n",initializedNameNode,initializedNameNode->get_name().str(),new_name.str());
1420 printf (
"In SageInterface::listHeaderFiles(): includeFile filename = %s \n",includeFile->get_filename().str());
1426 void visit (
SgNode* node)
1428 printf (
"In listHeaderFiles visit(): node = %p = %s \n",node,node->
class_name().c_str());
1430 if (includeFile != NULL)
1432 printf (
"include file: filename = %s \n",includeFile->get_filename().str());
1438 PrefixTraversal traversal;
1439 traversal.traverse(includeFile, preorder);
1458 ROSE_ASSERT(scope != NULL);
1459 int scope_file_id = scope->
get_file_info()->get_physical_file_id();
1461 bool return_value =
false;
1465 SgDeclarationStatementPtrList & declarationStatementList = scope->
getDeclarationList();
1467 printf (
"In scopeHasStatementsFromSameFile(): DeclarationStatementList not implemented \n");
1470 printf (
"declarationStatementList.size() = %zu \n",declarationStatementList.size());
1472 SgDeclarationStatementPtrList::iterator i = declarationStatementList.begin();
1474 while (i != declarationStatementList.end() && return_value ==
false)
1477 int statement_file_id = statement->
get_file_info()->get_physical_file_id();
1479 if (statement_file_id == scope_file_id)
1481 return_value =
true;
1487 printf (
"Exiting as a test! \n");
1495 printf (
"In scopeHasStatementsFromSameFile(): StatementList not implemented \n");
1497 SgStatementPtrList::iterator i = statementList.begin();
1499 while (i != statementList.end() && return_value ==
false)
1502 int statement_file_id = statement->
get_file_info()->get_physical_file_id();
1504 if (statement_file_id == scope_file_id)
1506 return_value =
true;
1513 return return_value;
1519 template <
class SageDecl>
1520 std::string genericGetName(SageDecl* dcl)
1523 return dcl->get_name();
1533 string name =
"undefined_name";
1535 ROSE_ASSERT(directive != NULL);
1544 case V_SgIncludeDirectiveStatement:
1545 case V_SgDefineDirectiveStatement:
1546 case V_SgUndefDirectiveStatement:
1547 case V_SgIfdefDirectiveStatement:
1548 case V_SgIfndefDirectiveStatement:
1549 case V_SgDeadIfDirectiveStatement:
1550 case V_SgIfDirectiveStatement:
1551 case V_SgElseDirectiveStatement:
1552 case V_SgElseifDirectiveStatement:
1553 case V_SgLineDirectiveStatement:
1554 case V_SgWarningDirectiveStatement:
1555 case V_SgErrorDirectiveStatement:
1556 case V_SgEmptyDirectiveStatement:
1563 case V_SgClinkageStartStatement:
1564 case V_SgClinkageEndStatement:
1570 case V_SgFortranIncludeLine:
1578 printf (
"Warning: default case reached in SageInterface::get_name ( const SgC_PreprocessorDirectiveStatement* directive ), directive = %p = %s \n",
1582 name =
"directive_default_name_case_reached_not_handled";
1594 string name =
"undefined_name";
1596 ROSE_ASSERT(declaration != NULL);
1600 if (directive != NULL)
1607 case V_SgTemplateMemberFunctionDeclaration:
1608 name = isSgTemplateMemberFunctionDeclaration(declaration)->get_name().str();
1611 case V_SgTemplateFunctionDeclaration:
1612 name = isSgTemplateFunctionDeclaration(declaration)->get_name().str();
1615 case V_SgTemplateClassDeclaration:
1616 name = isSgTemplateClassDeclaration(declaration)->get_name().str();
1619 case V_SgTemplateDeclaration:
1620 name = isSgTemplateDeclaration(declaration)->
get_name().str();
1623 case V_SgTemplateInstantiationDecl:
1624 name = isSgTemplateInstantiationDecl(declaration)->
get_templateName().str();
1627 case V_SgClassDeclaration:
1628 case V_SgDerivedTypeStatement:
1629 case V_SgJovialTableStatement:
1630 name = isSgClassDeclaration(declaration)->get_name().str();
1635 case V_SgJovialDefineDeclaration:
1636 case V_SgJovialDirectiveStatement:
1637 case V_SgJovialCompoolStatement:
1638 name =
"__" + declaration->
class_name() +
"_";
1642 case V_SgJovialLabelDeclaration:
1643 name = isSgJovialLabelDeclaration(declaration)->get_label();
1646 case V_SgEnumDeclaration:
1647 name = isSgEnumDeclaration(declaration)->
get_name().str();
1651 case V_SgTemplateInstantiationTypedefDeclaration:
1653 case V_SgTemplateTypedefDeclaration:
1654 case V_SgTypedefDeclaration:
1655 name = isSgTypedefDeclaration(declaration)->get_name().str();
1658 case V_SgFunctionDeclaration:
1659 case V_SgProgramHeaderStatement:
1660 case V_SgProcedureHeaderStatement:
1661 case V_SgMemberFunctionDeclaration:
1662 case V_SgTemplateInstantiationFunctionDecl:
1663 case V_SgTemplateInstantiationMemberFunctionDecl:
1664 case V_SgAdaFunctionRenamingDecl:
1665 case V_SgAdaEntryDecl:
1666 name = isSgFunctionDeclaration(declaration)->get_name().str();
1669 case V_SgNamespaceDeclarationStatement:
1670 name = isSgNamespaceDeclarationStatement(declaration)->
get_name().str();
1674 case V_SgFunctionParameterList:
1677 ROSE_ASSERT(declaration->
get_parent() != NULL);
1681 name =
get_name(functionDeclaration);
1689 name +=
"_parameter_list_";
1694 case V_SgTemplateVariableDeclaration:
1695 case V_SgTemplateVariableInstantiation:
1698 case V_SgVariableDeclaration:
1702 name =
"_variable_declaration_";
1704 ROSE_ASSERT(variableDeclaration != NULL);
1705 SgInitializedNamePtrList::const_iterator i = variableDeclaration->
get_variables().begin();
1708 ROSE_ASSERT(i != variableDeclaration->
get_variables().end());
1711 name += string((*i)->get_name().str());
1720 case V_SgVariableDefinition:
1724 name =
"_variable_definition_";
1726 ROSE_ASSERT(variableDefinition != NULL);
1729 ROSE_ASSERT(variableDefinition->
get_vardefn() != NULL);
1735 case V_SgPragmaDeclaration:
1737 name =
"_pragma_declaration_";
1739 ROSE_ASSERT(pragmaDeclaration != NULL);
1740 ROSE_ASSERT(pragmaDeclaration->get_pragma() != NULL);
1741 name +=
get_name(pragmaDeclaration->get_pragma());
1746 case V_SgUsingDirectiveStatement:
1748 name =
"_using_directive_statement_";
1750 ROSE_ASSERT(usingDeclaration != NULL);
1757 case V_SgNamespaceAliasDeclarationStatement:
1759 name =
"_namespace_alias_directive_statement_";
1761 ROSE_ASSERT(namespaceAliasDeclaration != NULL);
1762 ROSE_ASSERT(namespaceAliasDeclaration->
get_name().is_null() ==
false);
1763 name += namespaceAliasDeclaration->
get_name();
1768 case V_SgUsingDeclarationStatement:
1770 name =
"_using_declaration_statement_";
1772 ROSE_ASSERT(usingDeclaration != NULL);
1786 case V_SgTemplateInstantiationDirectiveStatement:
1788 name =
"_template_instantiation_directive_statement_";
1789 ROSE_ASSERT(declaration != NULL);
1791 ROSE_ASSERT(templateInstantiationDirective != NULL);
1792 ROSE_ASSERT(templateInstantiationDirective->
get_declaration() != NULL);
1800 case V_SgCtorInitializerList:
1802 name =
"_ctor_list_";
1804 ROSE_ASSERT(ctorDeclaration != NULL);
1805 ROSE_ASSERT(ctorDeclaration->
get_parent() != NULL);
1813 name =
"_asm_stmt_";
1814 const SgAsmStmt* asmStatement = isSgAsmStmt(declaration);
1815 ROSE_ASSERT(asmStatement != NULL);
1816 ROSE_ASSERT(asmStatement->
get_parent() != NULL);
1822 case V_SgImplicitStatement:
1824 name =
"_fortran_implicit_";
1826 ROSE_ASSERT(implicitStatement != NULL);
1827 ROSE_ASSERT(implicitStatement->
get_parent() != NULL);
1833 case V_SgNamelistStatement:
1835 name =
"_fortran_namelist_";
1837 ROSE_ASSERT(namelistStatement != NULL);
1838 ROSE_ASSERT(namelistStatement->
get_parent() != NULL);
1844 case V_SgEquivalenceStatement:
1846 name =
"_fortran_equivalence_";
1848 ROSE_ASSERT(equivalenceStatement != NULL);
1849 ROSE_ASSERT(equivalenceStatement->
get_parent() != NULL);
1856 case V_SgCommonBlock:
1858 name =
"_fortran_common_block_";
1859 const SgCommonBlock* commonBlockStatement = isSgCommonBlock(declaration);
1860 ROSE_ASSERT(commonBlockStatement != NULL);
1861 ROSE_ASSERT(commonBlockStatement->
get_parent() != NULL);
1867 case V_SgImportStatement:
1869 name =
"_fortran_import_stmt_";
1871 ROSE_ASSERT(importStatement != NULL);
1872 ROSE_ASSERT(importStatement->
get_parent() != NULL);
1878 case V_SgFormatStatement:
1880 name =
"_fortran_format_stmt_";
1882 ROSE_ASSERT(formatStatement != NULL);
1883 ROSE_ASSERT(formatStatement->
get_parent() != NULL);
1889 case V_SgModuleStatement:
1891 name =
"_fortran_module_stmt_";
1893 ROSE_ASSERT(moduleStatement != NULL);
1894 ROSE_ASSERT(moduleStatement->
get_parent() != NULL);
1900 case V_SgUseStatement:
1902 name =
"_fortran_use_stmt_";
1903 const SgUseStatement* useStatement = isSgUseStatement(declaration);
1904 ROSE_ASSERT(useStatement != NULL);
1905 ROSE_ASSERT(useStatement->
get_parent() != NULL);
1911 case V_SgContainsStatement:
1913 name =
"_fortran_contains_stmt_";
1915 ROSE_ASSERT(containsStatement != NULL);
1916 ROSE_ASSERT(containsStatement->
get_parent() != NULL);
1922 case V_SgEntryStatement:
1924 name =
"_fortran_entry_stmt_";
1926 ROSE_ASSERT(entryStatement != NULL);
1927 ROSE_ASSERT(entryStatement->
get_parent() != NULL);
1933 case V_SgAttributeSpecificationStatement:
1935 name =
"_fortran_attribute_specification_stmt_";
1937 ROSE_ASSERT(statement != NULL);
1938 ROSE_ASSERT(statement->
get_parent() != NULL);
1943 case V_SgInterfaceStatement:
1945 name =
"_fortran_interface_stmt_";
1947 ROSE_ASSERT(statement != NULL);
1948 ROSE_ASSERT(statement->
get_parent() != NULL);
1953 case V_SgFortranIncludeLine:
1955 name =
"_fortran_include_line_stmt_";
1957 ROSE_ASSERT(statement != NULL);
1958 ROSE_ASSERT(statement->
get_parent() != NULL);
1964 case V_SgJavaImportStatement:
1966 name =
"_java_import_stmt_";
1968 ROSE_ASSERT(statement != NULL);
1969 ROSE_ASSERT(statement->
get_parent() != NULL);
1974 case V_SgJavaPackageDeclaration:
1976 name =
"_java_package_declaration_";
1978 ROSE_ASSERT(package_declaration != NULL);
1979 ROSE_ASSERT(package_declaration->
get_parent() != NULL);
1984 case V_SgJavaPackageStatement:
1986 name =
"_java_package_stmt_";
1988 ROSE_ASSERT(statement != NULL);
1989 ROSE_ASSERT(statement->
get_parent() != NULL);
1995 case V_SgStaticAssertionDeclaration:
1997 name =
"_static_assertion_declaration_stmt_";
1999 ROSE_ASSERT(statement != NULL);
2000 ROSE_ASSERT(statement->
get_parent() != NULL);
2005 case V_SgNonrealDecl:
2007 const SgNonrealDecl * nrdecl = isSgNonrealDecl(declaration);
2008 ROSE_ASSERT(nrdecl != NULL);
2009 name = nrdecl->get_name();
2014 case V_SgEmptyDeclaration:
2017 ROSE_ASSERT(emptyDeclaration != NULL);
2022 case V_SgAdaPackageSpecDecl:
2024 name = genericGetName(isSgAdaPackageSpecDecl(declaration));
2028 case V_SgAdaPackageBodyDecl:
2030 name = genericGetName(isSgAdaPackageBodyDecl(declaration));
2034 case V_SgAdaFormalTypeDecl:
2036 name = genericGetName(isSgAdaFormalTypeDecl(declaration));
2040 case V_SgAdaGenericDecl:
2044 name =
get_name(gendcl->get_declaration());
2047 if (isSgFunctionDeclaration(dcl->get_declaration())) {
2048 name =
"_ada_generic_decl_" + genericGetName(isSgFunctionDeclaration(dcl->get_declaration()));
2051 if (isSgAdaPackageSpecDecl(dcl->get_declaration())) {
2052 name =
"_ada_generic_decl_" + genericGetName(isSgAdaPackageSpecDecl(dcl->get_declaration()));
2062 case V_SgAdaDiscriminatedTypeDecl:
2073 name =
"_incomplete_Ada_discriminated_type_";
2079 case V_SgAdaVariantDecl:
2081 name =
"_ada_variant_decl_";
2085 case V_SgAdaAttributeClause:
2087 name =
"_ada_attribute_clause_";
2091 case V_SgAdaRepresentationClause:
2093 name =
"_ada_representation_clause_";
2097 case V_SgAdaEnumRepresentationClause:
2099 name =
"_ada_enum_representation_clause_";
2103 case V_SgAdaComponentClause:
2105 name =
"_ada_component_clause_";
2109 case V_SgAdaTaskTypeDecl:
2111 name = genericGetName(isSgAdaTaskTypeDecl(declaration));
2115 case V_SgAdaProtectedTypeDecl:
2117 name = genericGetName(isSgAdaProtectedTypeDecl(declaration));
2121 case V_SgAdaTaskBodyDecl:
2123 name = genericGetName(isSgAdaTaskBodyDecl(declaration));
2127 case V_SgAdaProtectedBodyDecl:
2129 name = genericGetName(isSgAdaProtectedBodyDecl(declaration));
2133 case V_SgAdaRenamingDecl:
2135 name = genericGetName(isSgAdaRenamingDecl(declaration));
2139 case V_SgAdaTaskSpecDecl:
2141 name = genericGetName(isSgAdaTaskSpecDecl(declaration));
2145 case V_SgAdaProtectedSpecDecl:
2147 name = genericGetName(isSgAdaProtectedSpecDecl(declaration));
2151 case V_SgAdaGenericInstanceDecl:
2153 name = genericGetName(isSgAdaGenericInstanceDecl(declaration));
2157 case V_SgAdaFormalPackageDecl:
2159 name = genericGetName(isSgAdaFormalPackageDecl(declaration));
2163 case V_SgAdaParameterList:
2168 name = std::accumulate( plst->get_parameters().begin(), plst->get_parameters().end(),
2169 std::string{
"_ada_parameter_list_"},
2172 n += SageInterface::get_name(rhs);
2181 printf (
"Warning: default case reached in SageInterface::get_name ( const SgDeclarationStatement* declaration ), declaration = %p = %s \n",
2182 declaration,declaration->
class_name().c_str());
2192 string name =
"undefined_name";
2194 ROSE_ASSERT(scope != NULL);
2199 case V_SgTemplateClassDefinition:
2200 name =
get_name(isSgTemplateClassDefinition(scope)->get_declaration());
2203 case V_SgClassDefinition:
2204 case V_SgTemplateInstantiationDefn:
2205 name =
get_name(isSgClassDefinition(scope)->get_declaration());
2209 case V_SgTemplateFunctionDefinition:
2210 case V_SgFunctionDefinition:
2211 name =
get_name(isSgFunctionDefinition(scope)->get_declaration());
2214 case V_SgNamespaceDefinitionStatement:
2215 name =
get_name(isSgNamespaceDefinitionStatement(scope)->get_namespaceDeclaration());
2217 case V_SgJavaLabelStatement:
2218 name = (isSgJavaLabelStatement(scope)->get_label()).getString();
2222 case V_SgDeclarationScope:
2225 case V_SgAssociateStatement:
2226 case V_SgJavaForEachStatement:
2228 case V_SgFunctionParameterScope:
2229 case V_SgAdaPackageSpec:
2230 case V_SgAdaPackageBody:
2231 case V_SgAdaTaskSpec:
2232 case V_SgAdaTaskBody:
2233 case V_SgAdaProtectedSpec:
2234 case V_SgAdaProtectedBody:
2235 case V_SgAdaGenericDefn:
2236 case V_SgAdaAcceptStmt:
2237 case V_SgJovialForThenStatement:
2238 case V_SgMatlabForStatement:
2239 case V_SgBasicBlock:
2240 case V_SgCatchOptionStmt:
2241 case V_SgDoWhileStmt:
2242 case V_SgForStatement:
2245 case V_SgSwitchStatement:
2248 case V_SgForAllStatement:
2249 case V_SgRangeBasedForStatement:
2254 printf (
"Error: undefined case (SgScopeStatement) in SageInterface::get_name(): node = %s \n",scope->
class_name().c_str());
2264 string name =
"undefined_name";
2266 ROSE_ASSERT(stmt != NULL);
2269 if (declaration != NULL)
2287 case V_SgCaseOptionStmt:
2288 case V_SgCatchStatementSeq:
2289 case V_SgClinkageStartStatement:
2290 case V_SgContinueStmt:
2291 case V_SgDefaultOptionStmt:
2293 case V_SgForInitStmt:
2294 case V_SgFunctionTypeTable:
2295 case V_SgGotoStatement:
2296 case V_SgReturnStmt:
2302 case V_SgLabelStatement:
2305 name = labelStatement->
get_label().str();
2328 ROSE_ASSERT(node != NULL);
2330 string name =
"undefined_name";
2332 ROSE_ASSERT(node != NULL);
2336 case V_SgInitializedName:
2339 if (initializedName != NULL)
2341 name = initializedName->get_name().str();
2349 name =
"_pragma_string_";
2350 const SgPragma* pragma = isSgPragma(node);
2351 ROSE_ASSERT(pragma != NULL);
2352 name += pragma->get_pragma();
2366 case V_SgSourceFile:
2367#ifdef ROSE_ENABLE_BINARY_ANALYSIS
2368 case V_SgBinaryComposite:
2374 const SgFile* file = isSgFile(node);
2375 ROSE_ASSERT(file != NULL);
2382 case V_SgSymbolTable:
2384 name =
"_symbol_table_";
2389 case V_SgStorageModifier:
2391 name =
"_storage_modifier_";
2397 case V_Sg_File_Info:
2399 name =
"_file_info_";
2404 case V_SgTemplateArgument:
2406 name =
"_template_argument_";
2408 ROSE_ASSERT(templateArgument != NULL);
2414 ROSE_ASSERT(t != NULL);
2428 ROSE_ASSERT(templateArgument->get_initializedName() == NULL);
2433 ROSE_ASSERT(t == NULL);
2435 ROSE_ASSERT(initializedName != NULL);
2446 ROSE_ASSERT(t != NULL);
2453 printf (
"Error: default case reached in switch on templateArgument->get_argumentType() \n");
2462 case V_SgTypeModifier:
2465 ROSE_ASSERT(typeModifier != NULL);
2466 name =
"_type_modifier_" + typeModifier->displayString();
2473 const SgNameGroup* nameGroup = isSgNameGroup(node);
2474 ROSE_ASSERT(nameGroup != NULL);
2475 name =
"_name_group_" + nameGroup->get_group_name();
2480 case V_SgDataStatementGroup:
2483 ROSE_ASSERT(dataGroup != NULL);
2484 name =
"_data_statement_group_";
2489 case V_SgDataStatementObject:
2492 ROSE_ASSERT(dataObject != NULL);
2493 name =
"_data_statement_object_";
2498 case V_SgDataStatementValue:
2501 ROSE_ASSERT(dataValue != NULL);
2502 name =
"_data_statement_value_";
2507 case V_SgCommonBlockObject:
2510 ROSE_ASSERT(commonBlockObject != NULL);
2511 name =
"_common_block_object_" + commonBlockObject->get_block_name();
2516 case V_SgFormatItem:
2519 ROSE_ASSERT(formatItem != NULL);
2520 name =
"_format_item_";
2525 case V_SgFormatItemList:
2528 ROSE_ASSERT(formatItemList != NULL);
2529 name =
"_format_item_list_";
2534 case V_SgRenamePair:
2537 ROSE_ASSERT(renamePair != NULL);
2538 name = renamePair->get_local_name() +
"__" + renamePair->get_use_name() +
"_rename_pair_";
2545 const SgName* name_node = isSgName(node);
2546 ROSE_ASSERT(name_node != NULL);
2547 name =
"_name_" + name_node->getString();
2552 case V_SgTemplateParameter:
2555 ROSE_ASSERT(template_parameter_node != NULL);
2556 name =
"_template_parameter_";
2558 switch(template_parameter_node->get_parameterType())
2562 name +=
"type_parameter_";
2568 name +=
"nontype_parameter_";
2572 if (template_parameter_node->get_expression() != NULL)
2578 ROSE_ASSERT(template_parameter_node->get_initializedName() != NULL);
2584 name += template_parameter_node->get_initializedName()->
unparseToString();
2592 name +=
"template_parameter_";
2598 printf (
"Error: default reached \n");
2608 const SgBaseClass* base_class_node = isSgBaseClass(node);
2609 ROSE_ASSERT(base_class_node != NULL);
2610 ROSE_ASSERT(base_class_node->get_base_class() != NULL);
2615 ROSE_ASSERT(baseClassModifier != NULL);
2616 access = baseClassModifier->displayString();
2618 name =
"_base_class_" + access +
"_" +
get_name(base_class_node->get_base_class());
2624 printf (
"Default reached in switch for SgSupport IR node = %s \n",node->
class_name().c_str());
2625 name =
"default name";
2640 ROSE_ASSERT(symbol != NULL);
2642 string aliasSymbolPrefix =
"";
2643 if (isSgAliasSymbol(symbol) != NULL)
2645 aliasSymbolPrefix =
"_ALIAS";
2652 return symbol->
get_name() + aliasSymbolPrefix +
"_symbol_";
2660 ROSE_ASSERT(type != NULL);
2664 const SgNamedType* namedType = isSgNamedType(type);
2665 if (namedType != NULL)
2667 returnName =
"named_type_";
2668 returnName = namedType->
get_name().getString();
2674 case V_SgPointerType:
2677 returnName =
"pointer_to_";
2678 returnName +=
get_name(pointerType->get_base_type());
2682 case V_SgReferenceType:
2685 returnName =
"reference_to_";
2686 returnName +=
get_name(referenceType->get_base_type());
2692 const SgArrayType* arrayType = isSgArrayType(type);
2693 returnName =
"array_of_";
2694 returnName +=
get_name(arrayType->get_base_type());
2698 case V_SgModifierType:
2702 returnName +=
get_name(modifierType->get_base_type());
2707 case V_SgTemplateType:
2710 returnName =
"templateType_";
2711 returnName += templateType->get_name();
2728 string name =
"undefined_name";
2736 name =
"var_ref_of_";
2737 ROSE_ASSERT(varRef != NULL);
2738 ROSE_ASSERT(varRef->get_symbol() != NULL);
2739 name += varRef->get_symbol()->
get_name();
2744 case V_SgLabelRefExp:
2747 name =
"label_ref_of_";
2748 ROSE_ASSERT(labelRef != NULL);
2749 ROSE_ASSERT(labelRef->get_symbol() != NULL);
2750 name += labelRef->get_symbol()->
get_name();
2754 case V_SgPntrArrRefExp:
2757 name =
"array_ref_of_";
2764 case V_SgFunctionCallExp:
2767 name =
"function_call_";
2768 name +=
get_name(functionCall->get_function());
2772 case V_SgFunctionRefExp:
2775 name =
"function_ref_";
2776 name += functionRefExp->get_symbol()->
get_name();
2781 case V_SgMemberFunctionRefExp:
2784 name =
"member_function_ref_";
2785 name += memberFunctionRefExp->get_symbol()->
get_name();
2791 const SgIntVal* valueExp = isSgIntVal(expr);
2792 name =
"integer_value_exp_";
2799 const SgStringVal* valueExp = isSgStringVal(expr);
2800 name =
"string_value_exp_";
2801 name += valueExp->get_value();
2805 case V_SgSubscriptExpression:
2808 name =
"subscript_exp_";
2810 name +=
get_name(subscriptExpression->get_lowerBound());
2813 name +=
get_name(subscriptExpression->get_upperBound());
2816 name +=
get_name(subscriptExpression->get_stride());
2820 case V_SgNullExpression:
2822 name =
"null_expression";
2827 case V_SgExprListExp:
2830 name =
"expr_list_exp_";
2831 for (
size_t i = 0; i < exprListExp->get_expressions().size(); i++)
2833 name +=
get_name(exprListExp->get_expressions()[i]);
2839 case V_SgActualArgumentExpression:
2842 name =
"actual_arg_exp_name_";
2843 name += actualArgExp->get_argument_name();
2845 name +=
get_name(actualArgExp->get_expression());
2850 case V_SgTemplateParameterVal:
2853 name =
"template_parameter_value_expression_number_";
2863 const SgDotExp* dotExp = isSgDotExp(expr);
2864 ROSE_ASSERT(dotExp != NULL);
2866 name =
"_dot_exp_lhs_";
2868 name +=
"_dot_exp_rhs_";
2877 const SgLambdaExp* lambdaExp = isSgLambdaExp(expr);
2878 ROSE_ASSERT (lambdaExp != NULL);
2879 name =
"lambda_expression_";
2886 const SgThisExp* thisExp = isSgThisExp(expr);
2887 ROSE_ASSERT(thisExp != NULL);
2889 name =
"_this_exp_for_";
2892 ROSE_ASSERT(classSymbol != NULL);
2905 printf (
"Note: default reached in get_name() expr = %p = %s \n",expr,expr->
class_name().c_str());
2924 ROSE_ASSERT(node != NULL);
2930 case V_SgRenamePair:
2933 returnName =
"rename_pair_";
2934 returnName += n->get_local_name().str();
2935 returnName +=
"_from_";
2936 returnName += n->get_use_name().str();
2940 case V_SgInitializedName:
2943 ROSE_ASSERT (n != NULL);
2944 returnName =
"initialized_name_";
2945 returnName += n->get_name().str();
2950 case V_SgLambdaCapture:
2953 ROSE_ASSERT (n != NULL);
2954 returnName =
"lambda_capture_";
2960 case V_SgInterfaceBody:
2963 returnName =
"interface_body";
2983 string name =
"undefined_name";
2985 ROSE_ASSERT(node != NULL);
2988 if (locatedNode != NULL)
2990 const SgStatement* statement = isSgStatement(node);
2991 if (statement != NULL)
2998 if (expression != NULL)
3005 if (locatedNodeSupport != NULL)
3007 name =
get_name(locatedNodeSupport);
3011 const SgToken* token = isSgToken(node);
3018 printf (
"Unknown SgLocatedNode = %p = %s \n",node,node->
class_name().c_str());
3027 const SgSupport* supportNode = isSgSupport(node);
3028 if (supportNode != NULL)
3035 const SgSymbol* symbol = isSgSymbol(node);
3043 const SgType* type = isSgType(node);
3064 string name =
"undefined_name";
3066 ROSE_ASSERT(token != NULL);
3067 name = token->get_lexeme_string();
3072 else if (name ==
"\n")
3074 else if (name ==
"\t")
3116 case V_SgClassDeclaration:
3117 case V_SgTemplateClassDeclaration:
3121 ROSE_ASSERT(classDeclaration != NULL);
3123 string type_name = classDeclaration->get_name();
3125 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier_support(): case class or template type: type_name = %s \n",type_name.c_str());
3127 string className = string(
"scope_") + scope +
"_type_name_" + type_name;
3129 printf (
"classDeclaration->get_scope() = %p = %s scope = %s \n",classDeclaration->
get_scope(),classDeclaration->
get_scope()->
class_name().c_str(),scope.c_str());
3136 case V_SgTemplateInstantiationDecl:
3139 ROSE_ASSERT(templateInstantiationDeclaration != NULL);
3145 string type_name = templateInstantiationDeclaration->get_name();
3147 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier_support(): case SgTemplateInstantiationDecl: type_name = %s \n",type_name.c_str());
3149 string className = string(
"scope_") + scope +
"_type_name_" + type_name;
3164 printf (
"className = %s compressedClassName = %s \n",className.c_str(),compressedClassName.c_str());
3167 printf (
"templateInstantiationDeclaration->get_scope() = %p = %s scope = %s \n",
3171 s = compressedClassName;
3173 printf (
"Exiting as a test! \n");
3179 case V_SgFunctionDeclaration:
3180 case V_SgTemplateFunctionDeclaration:
3181 case V_SgTemplateInstantiationFunctionDecl:
3184 ROSE_ASSERT(functionDeclaration != NULL);
3186 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier_support(): case SgFunctionDeclaration: not implemented \n");
3189 string original_name = functionDeclaration->get_name();
3191 string function_name_part = mangleFunctionName(original_name,
"return_type");
3192 string function_name = string(
"scope_") + scope +
"_function_name_" + function_name_part;
3206 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier(): Collision count = %d \n",count);
3213 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier(): case SgFunctionDeclaration: Exiting as a test! \n");
3219 case V_SgMemberFunctionDeclaration:
3220 case V_SgTemplateMemberFunctionDeclaration:
3221 case V_SgTemplateInstantiationMemberFunctionDecl:
3224 ROSE_ASSERT(memberFunctionDeclaration != NULL);
3226 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier_support(): case SgMemberFunctionDeclaration: not implemented \n");
3229 string original_name = memberFunctionDeclaration->get_name();
3235 string member_function_name_part = mangleFunctionName(original_name,
"return_type");
3237 string member_function_name = string(
"scope_") + scope +
"_member_function_name_" + member_function_name_part;
3251 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier(): Collision count = %d \n",count);
3256 s = member_function_name;
3258 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier(): case SgMemberFunctionDeclaration: Exiting as a test! \n");
3266 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier(): Unsupported declaration = %p = %s \n",declaration,declaration->
class_name().c_str());
3272 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier(): s = %s \n",s.c_str());
3277 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier(): s = %s \n",s.c_str());
3282 printf (
"Exiting as a test! \n");
3301 printf (
"In generateUniqueNameForUseAsIdentifier(): evaluating declaration = %p = %s \n",declaration,declaration->
class_name().c_str());
3314 if (definingDeclaration != NULL)
3317 printf (
"In generateUniqueName(): Using the defining declaration = %p since %p was not in the map \n",definingDeclaration,declaration);
3325 printf (
"Warning: defining declaration not in SageInterface::local_node_to_name_map: declaration = %p = %s using name = %s \n",
3332 ROSE_ASSERT(nondefiningDeclaration != NULL);
3338 printf (
"Exiting as a test! \n");
3349 ROSE_ASSERT(astNode != NULL);
3359 void visit (
SgNode* node)
3366 if (classDeclaration != NULL || functionDeclaration != NULL)
3377 UniqueNameTraversal traversal;
3378 traversal.traverse(astNode, preorder);
3388 ROSE_ASSERT(classDeclaration != NULL);
3390 ROSE_ASSERT(definingDeclaration != NULL);
3391 SgClassDeclaration* definingClassDeclaration = isSgClassDeclaration(definingDeclaration);
3395 if (definingClassDeclaration != NULL)
3397 SgClassDefinition* classDefinition = definingClassDeclaration->get_definition();
3398 ROSE_ASSERT(classDefinition != NULL);
3400 SgDeclarationStatementPtrList::iterator i = classDefinition->
get_members().begin();
3401 while ( i != classDefinition->
get_members().end() )
3404 ROSE_ASSERT( (*i)->get_parent() != NULL);
3405 ROSE_ASSERT( (*i)->get_parent() == classDefinition);
3408 if (memberFunction != NULL)
3411 if ( memberFunction->get_specialFunctionModifier().isConstructor() ==
true )
3412 defaultConstructor = memberFunction;
3423 return defaultConstructor;
3431 ROSE_ASSERT(classDeclaration != NULL);
3433 if (definingDeclaration != NULL)
3435 ROSE_ASSERT(definingDeclaration != NULL);
3436 SgClassDeclaration* definingClassDeclaration = isSgClassDeclaration(definingDeclaration);
3440 if (definingClassDeclaration != NULL)
3442 SgClassDefinition* classDefinition = definingClassDeclaration->get_definition();
3443 ROSE_ASSERT(classDefinition != NULL);
3445 SgDeclarationStatementPtrList::iterator i = classDefinition->
get_members().begin();
3446 while ( i != classDefinition->
get_members().end() )
3450 ROSE_ASSERT(i_parent != NULL);
3455 if ( i_parent != classDefinition )
3457 printf (
"Error: (*i)->get_parent() = %p = %s \n",i_parent,i_parent->
class_name().c_str());
3458 printf (
"(*i) = %p = %s = %s \n",*i,(*i)->class_name().c_str(),(*i)->unparseToString().c_str());
3459 (*i)->get_file_info()->display(
"Called from SageInterface::getDefaultDestructor: debug");
3461 ROSE_ASSERT( i_parent == classDefinition);
3464 if (memberFunction != NULL)
3466 if ( memberFunction->get_specialFunctionModifier().isDestructor() ==
true )
3467 defaultDestructor = memberFunction;
3476 return defaultDestructor;
3488#define DEBUG_ADD_DEFAULT_CONSTRUCTOR 0
3492 ASSERT_not_null(classType);
3494 bool returnValue =
false;
3497 SgClassDeclaration* classDeclaration = isSgClassDeclaration(classType->get_declaration());
3498 ROSE_ASSERT(classDeclaration != NULL);
3500 ROSE_ASSERT(definingClassDeclaration != NULL);
3501 SgClassDefinition* classDefinition = definingClassDeclaration->get_definition();
3502 ROSE_ASSERT(classDefinition != NULL);
3504 SgDeclarationStatementPtrList & declarationList = classDefinition->
get_members();
3506 bool foundConstructor =
false;
3507 bool foundDefaultConstructor =
false;
3509#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3510 printf (
"In addDefaultConstructorIfRequired(): class name = %s \n",classDeclaration->get_name().str());
3513 SgDeclarationStatementPtrList::iterator i = declarationList.begin();
3514 while (i != declarationList.end())
3517 if (memberFunctionDeclaration != NULL)
3519 bool isConstructor = memberFunctionDeclaration->get_specialFunctionModifier().isConstructor();
3520 if (isConstructor ==
true)
3522 foundConstructor =
true;
3524#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3525 printf (
"Found a constructor! \n");
3528 ROSE_ASSERT(functionParameterList != NULL);
3532 foundDefaultConstructor = ((foundDefaultConstructor ==
true) || (functionParameterList->
get_args().size() == 0));
3534#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3535 if (foundDefaultConstructor ==
true)
3537 printf (
"Found a default constructor! \n");
3541 printf (
"This is not a default constructor: functionParameterList->get_args().size() = %zu \n",functionParameterList->
get_args().size());
3547#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3548 printf (
"This is not a constructor \n");
3556#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3557 printf (
"foundConstructor = %s \n",foundConstructor ?
"true" :
"false");
3558 printf (
"foundDefaultConstructor = %s \n",foundDefaultConstructor ?
"true" :
"false");
3561 if (foundConstructor ==
true)
3564#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3565 printf (
"Since there is at least one constructor, we can't rely on compiler generated constructors \n");
3567 if (foundDefaultConstructor ==
true)
3570#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3571 printf (
"We can use the existing default constructor (no need to build one) \n");
3578#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3579 printf (
"########################################################### \n");
3580 printf (
"Need to build a default constructor in the associated class \n");
3583 ROSE_ASSERT(constructorDeclaration != NULL);
3585#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3586 printf (
" --- constructorDeclaration = %p = %s name = %s \n",constructorDeclaration,constructorDeclaration->
class_name().c_str(),constructorDeclaration->get_name().str());
3588 ROSE_ASSERT (constructorDeclaration->get_declarationModifier().get_accessModifier().isPublic() ==
true);
3590 classDefinition->prepend_statement(constructorDeclaration);
3593 ROSE_ASSERT(constructorDeclaration->
get_parent() != NULL);
3601 constructorDeclaration->
get_endOfConstruct ()->set_physical_file_id(physical_file_id);
3605 ROSE_ASSERT(constructorDeclaration->get_definition() != NULL);
3608 constructorDeclaration->get_definition()->
get_startOfConstruct()->set_physical_file_id(physical_file_id);
3609 constructorDeclaration->get_definition()->
get_endOfConstruct ()->set_physical_file_id(physical_file_id);
3612#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3613 printf (
"DONE: Need to build a default constructor in the associated class \n");
3614 printf (
"################################################################# \n");
3617 printf (
"Exiting as a test! \n");
3626#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3627 printf (
"No constructors found, so we don't need to add an explicit default constructor \n");
3631#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3632 printf (
"Leaving addDefaultConstructorIfRequired(): returnValue = %s \n",returnValue ?
"true" :
"false");
3664 astTraversal.
traverse(node,preorder);
3674 printf (
"Exiting as a test! \n");
3684 printf (
"Symbol Table from %p = %s at: \n",scope,scope->
sage_class_name());
3685 scope->
get_file_info()->display(
"Symbol Table Location (Called from SageInterface::OutputLocalSymbolTables::visit())");
3687 scope->print_symboltable(
"Called from SageInterface::OutputLocalSymbolTables::visit()");
3702 bool result =
false;
3717 bool result =
false;
3721 if (isTemplateMemberFunction(memberFunctionDeclaration) ==
true)
3724 printf (
"templateDeclaration = %p parent of templateDeclaration = %p \n",templateDeclaration,templateDeclaration->
get_parent());
3727 SgClassDeclaration* classDeclaration = memberFunctionDeclaration->get_class_scope()->get_declaration();
3728 ROSE_ASSERT(classDeclaration != NULL);
3731 if (classTemplateInstantiation != NULL)
3734 if (classTemplateDeclaration != NULL && classTemplateDeclaration != templateDeclaration)
3748 if (templateDeclaration != NULL && templateDeclaration->
get_parent() != NULL)
3751 if (isSgClassDefinition(parentScope) != NULL)
3764 printf (
"Error: This is no longer used. \n");
3777 if (firstNondefiningDeclaration != NULL)
3778 keyDeclaration = firstNondefiningDeclaration;
3780 keyDeclaration = definingDeclaration;
3781 ROSE_ASSERT(keyDeclaration != NULL);
3783 return keyDeclaration;
3789 string pragmaString = pragmaDeclaration->get_pragma()->get_pragma();
3790 istringstream istr(pragmaString);
3800 ROSE_ASSERT (n != NULL);
3801 bool result =
false;
3802 if (isSgOmpBarrierStatement(n)||
3803 isSgOmpBodyStatement(n)||
3804 isSgOmpDeclareSimdStatement(n) ||
3805 isSgOmpFlushStatement(n)||
3806 isSgOmpThreadprivateStatement(n)||
3807 isSgOmpTaskwaitStatement(n) )
3835 if (memberFunctionDeclaration != NULL)
3845 ROSE_ASSERT(scope != NULL);
3848 if (isSgDeclarationScope(scope)) {
3849 printf(
"TODO SageInterface::isOverloaded case when scope is SgDeclarationScope. See ROSE-1378.\n");
3855 isSgClassDefinition(memberFunctionDeclaration->
get_scope());
3856 ROSE_ASSERT(classDefinition != NULL);
3860 ROSE_ASSERT(classDeclaration != NULL);
3863 SgDeclarationStatementPtrList & memberList = classDefinition->
get_members();
3866 printf (
" memberList.size() = %" PRIuPTR
" \n",memberList.size());
3868 for (SgDeclarationStatementPtrList::iterator i = memberList.begin(); i != memberList.end(); i++)
3871 printf (
" counter = %d declaration = %p = %s \n",counter,*i,(*i)->class_name().c_str());
3877 if (tempMemberFunction != NULL)
3882 if ( keyDeclaration == generateUniqueDeclaration(tempMemberFunction) )
3885 printf (
"Skipping the case of keyDeclaration == generateUniqueDeclaration(tempMemberFunction) = %p \n",keyDeclaration);
3890 ROSE_ASSERT(tempMemberFunction->get_name() !=
"");
3892 printf (
" tempMemberFunction = (name) %s = (qualified) %s \n",
3893 tempMemberFunction->get_name().str(),
3894 tempMemberFunction->get_qualified_name().str());
3896 if (tempMemberFunction->get_name() == memberFunctionDeclaration->get_name())
3899 printf (
" Found a matching overloaded member function! \n");
3908 if (tempTemplateDeclaration != NULL)
3914 printf (
"tempTemplateDeclaration->get_name() = %s \n",tempTemplateDeclaration->
get_name().str());
3916 if (memberFunctionDeclaration->get_name() == tempTemplateDeclaration->
get_name())
3919 printf (
" Found a matching overloaded member function! \n");
3928 if (functionDeclaration->
variantT() == V_SgFunctionDeclaration)
3930 printf (
"In SageInterface::isOverloaded(): could friend functions be overloaded in a class? \n");
3943 printf (
"In SageInterface::isOverloaded(): case of non-member function not yet implemented! \n");
3950 return (counter > 1);
3965 ROSE_ASSERT(memberFunctionInstantiation != NULL);
3968 printf (
"buildForwardFunctionDeclaration: Member function = %p = %s = definition = %p \n",
3969 memberFunctionInstantiation,
3970 memberFunctionInstantiation->get_name().str(),
3971 memberFunctionInstantiation->get_definition());
3972 memberFunctionInstantiation->
get_file_info()->display(
"memberFunctionInstantiation: debug");
3978 class NondefiningFunctionDeclarationCopyType :
public SgCopyHelp
3988 SgNode* returnValue = NULL;
3996 case V_SgFunctionDeclaration:
3997 case V_SgMemberFunctionDeclaration:
3998 case V_SgTemplateInstantiationFunctionDecl:
3999 case V_SgTemplateInstantiationMemberFunctionDecl:
4003 ROSE_ASSERT(functionDeclaration != NULL);
4009 returnValue =
const_cast<SgNode *
>(n);
4021 case V_SgFunctionDefinition:
4023 printf (
"Skip copying the function definition if it is present \n");
4025 returnValue =
const_cast<SgNode *
>(n);
4039 if (returnValue == NULL)
4040 returnValue = n->copy(*
this);
4042 ROSE_ASSERT(returnValue != NULL);
4045 } nondefiningFunctionDeclarationCopy;
4050 if (memberFunctionInstantiation->get_definition() != NULL)
4052 printf (
"\n\nNEED TO REMOVE POINTERS IN THE NON-DEFINING DECLARATION TO THE SgClassDefinition objects. \n");
4057 memberFunctionInstantiation->set_definition(NULL);
4059 SgNode* copyOfMemberFunctionNode = memberFunctionInstantiation->copy(nondefiningFunctionDeclarationCopy);
4078 printf (
"copyOfMemberFunction->isForward() = %s \n",copyOfMemberFunction->
isForward() ?
"true" :
"false");
4079 printf (
"memberFunctionInstantiation->isForward() = %s \n",memberFunctionInstantiation->
isForward() ?
"true" :
"false");
4082 printf (
"memberFunctionInstantiation->isSpecialization() = %s \n",memberFunctionInstantiation->isSpecialization() ?
"true" :
"false");
4083 printf (
"copyOfMemberFunctionNode = %p = %s = %s memberFunctionInstantiation->isSpecialization() = %s \n",
4084 copyOfMemberFunction,copyOfMemberFunction->
class_name().c_str(),
SageInterface::get_name(copyOfMemberFunction).c_str(),copyOfMemberFunction->isSpecialization() ?
"true" :
"false");
4085 copyOfMemberFunction->
get_file_info()->display(
"copyOfMemberFunction: debug");
4089 ROSE_ASSERT(memberFunctionInstantiation->get_args().size() == copyOfMemberFunction->get_args().size());
4095 ROSE_ASSERT(copyOfMemberFunction != NULL);
4096 return copyOfMemberFunction;
4105 ROSE_ASSERT(declarationForType != NULL);
4108 switch(declarationForType->
variantT())
4111 case V_SgTemplateInstantiationDecl:
4112 case V_SgTemplateClassDeclaration:
4114 case V_SgClassDeclaration:
4119 if (isSgTemplateClassDeclaration(declarationForType) != NULL)
4128 ROSE_ASSERT(symbol != NULL);
4129 SgName name = classDeclaration->get_name();
4130 symbolTable->insert(name,symbol);
4134 case V_SgEnumDeclaration:
4138 ROSE_ASSERT(symbol != NULL);
4140 symbolTable->insert(name,symbol);
4144 case V_SgFunctionDeclaration:
4148 ROSE_ASSERT(symbol != NULL);
4149 SgName name = functionDeclaration->get_name();
4150 symbolTable->insert(name,symbol);
4154 case V_SgMemberFunctionDeclaration:
4158 ROSE_ASSERT(symbol != NULL);
4162 SgName name = functionDeclaration->get_name();
4163 symbolTable->insert(name,symbol);
4169 printf (
"Default reached in evaluation of typedef inner definition = %p = %s and building a symbol for it for the symbol table \n",declarationForType,declarationForType->
class_name().c_str());
4180 SgInitializedNamePtrList::iterator i = variableList.begin();
4181 while (i != variableList.end())
4185 if (
variable->get_scope() == scope)
4193 printf (
"WARNING: Scopes do NOT match! variable = %p = %s (could this be a static variable, or has the symbol table been setup before the scopes have been set?) \n",
variable,
variable->get_name().str());
4198 ROSE_ASSERT(symbol != NULL);
4200 symbolTable->insert(name,symbol);
4208SageInterface::supportForInitializedNameLists (
SgScopeStatement* scope, SgInitializedNamePtrList & variableList )
4211 ROSE_ASSERT(symbolTable != NULL);
4213 supportForVariableLists(scope,symbolTable,variableList);
4221 SgInitializedNamePtrList & variableList = variableDeclaration->
get_variables();
4222 supportForVariableLists(scope,symbolTable,variableList);
4230 ROSE_ASSERT(symbolTable != NULL);
4241 std::vector<SgNode*> labelList = NodeQuery::querySubTree (scope,V_SgLabelStatement);
4243 int numberOfLabels = labelList.size();
4244 for (
int i=0; i < numberOfLabels; i++)
4248 ROSE_ASSERT(labelStatement != NULL);
4249 ROSE_ASSERT(labelStatement->
get_scope() == scope);
4252 ROSE_ASSERT(symbol != NULL);
4256 SgName name = labelStatement->get_name();
4257 symbolTable->insert(name,symbol);
4267 ROSE_ASSERT(scope != NULL);
4269 printf (
"In SageInterface::rebuildSymbolTable(): Symbol Table from %p = %s \n",scope,scope->
class_name().c_str());
4272 printf (
"Exiting as a test \n");
4278 if (symbolTable != NULL)
4281 if (symbolTable->
size() != 0)
4283 printf (
"symbolTable->size() = %d \n",symbolTable->
size());
4285 ROSE_ASSERT(symbolTable->
size() == 0);
4287 printf (
"Symbol Table from %p = %s of size = %" PRIuPTR
" \n",scope,scope->
class_name().c_str(),symbolTable->
size());
4288 symbolTable->
print(
"Called from SageInterface::rebuildSymbolTable()");
4294 printf (
"In SageInterface::rebuildSymbolTable(): No symbol table found \n");
4296 ROSE_ASSERT(symbolTable == NULL);
4301 ROSE_ASSERT(symbolTable != NULL);
4302 ROSE_ASSERT(symbolTable->get_table() != NULL);
4306 ROSE_ASSERT(symbolTable->
get_parent() != NULL);
4319 case V_SgForStatement:
4326 SgStatementPtrList::iterator i = forStatement->get_init_stmt().begin();
4330 while (i != forStatement->get_init_stmt().end())
4334 if (variableDeclarationInitializer != NULL)
4339 supportForVariableDeclarations ( scope, symbolTable, variableDeclarationInitializer );
4345 SgVariableDeclaration* variableDeclarationCondition = isSgVariableDeclaration(forStatement->get_test());
4346 if (variableDeclarationCondition != NULL)
4351 supportForVariableDeclarations ( scope, symbolTable, variableDeclarationCondition );
4358 case V_SgJovialForThenStatement:
4359 case V_SgMatlabForStatement:
4367 case V_SgTemplateFunctionDefinition:
4369 case V_SgFunctionDefinition:
4376 if (functionDefinition != NULL)
4382 if (functionDeclaration != NULL)
4385 if (functionDeclaration->
isForward() ==
true)
4387 printf (
"ERROR: functionDeclaration = %p = %s = %s \n",functionDeclaration,functionDeclaration->
class_name().c_str(),functionDeclaration->get_name().str());
4388 printf (
" --- functionDeclaration (get_name()) = %s \n",
get_name(functionDeclaration).c_str());
4389 printf (
" --- functionDeclaration (mangled name) = %s \n",functionDeclaration->get_mangled_name().str());
4391 if (memberFunctionDeclaration != NULL)
4393 printf (
"memberFunctionDeclaration != NULL \n");
4396 ROSE_ASSERT(functionDeclaration->
isForward() ==
false);
4397 SgInitializedNamePtrList & argumentList = functionDeclaration->get_args();
4398 supportForVariableLists(scope,symbolTable,argumentList);
4411 supportForLabelStatements(scope,symbolTable);
4422 SgIfStmt* ifStatement = isSgIfStmt(scope);
4424 if (variableDeclarationCondition != NULL)
4429 supportForVariableDeclarations ( scope, symbolTable, variableDeclarationCondition );
4435 case V_SgSwitchStatement:
4442 if (variableDeclarationSelector != NULL)
4447 supportForVariableDeclarations ( scope, symbolTable, variableDeclarationSelector );
4459 SgWhileStmt* whileStatement = isSgWhileStmt(scope);
4461 if (variableDeclarationCondition != NULL)
4467 supportForVariableDeclarations ( scope, symbolTable, variableDeclarationCondition );
4473 case V_SgCatchOptionStmt:
4474 case V_SgDoWhileStmt:
4483 case V_SgTemplateClassDefinition:
4485 case V_SgBasicBlock:
4486 case V_SgClassDefinition:
4487 case V_SgTemplateInstantiationDefn:
4489 case V_SgNamespaceDefinitionStatement:
4497 case V_SgJavaForEachStatement:
4500 SgVariableDeclaration* variableDeclarationCondition = isSgVariableDeclaration(javaForEachStatement->get_element());
4501 if (variableDeclarationCondition != NULL)
4507 supportForVariableDeclarations ( scope, symbolTable, variableDeclarationCondition );
4515 printf (
"Default reached in SageInterface::rebuildSymbolTable() scope = %p = %s \n",scope,scope->
class_name().c_str());
4521 printf (
"In SageInterface::rebuildSymbolTable(): fixup declarations in Symbol Table from %p = %s \n",scope,scope->
class_name().c_str());
4529 for (SgStatementPtrList::iterator i = statementList.begin(); i != statementList.end(); i++)
4536 if (declaration != NULL)
4542 list<SgSymbol*> symbolList;
4545 case V_SgTemplateInstantiationMemberFunctionDecl:
4549 if (scope == derivedDeclaration->
get_scope())
4552 ROSE_ASSERT(symbol != NULL);
4558 SgName name = derivedDeclaration->get_name();
4559 symbolTable->insert(name,symbol);
4570 ROSE_ASSERT(derivedDeclarationScope != NULL);
4577 ROSE_ASSERT(templateDeclaration != NULL);
4585 SgType* functionType = templateDeclaration->get_type();
4586 SgTemplateParameterPtrList & templateParameterList = templateDeclaration->get_templateParameters();
4589 if (templateSymbol != NULL)
4593 printf (
"Building a symbol for derivedDeclaration = %p = %s to an alternative symbol table in derivedDeclarationScope = %p \n",
4594 derivedDeclaration,
get_name(derivedDeclaration).c_str(),derivedDeclarationScope);
4597 ROSE_ASSERT(symbol != NULL);
4598 SgName name = derivedDeclaration->get_name();
4610 case V_SgTemplateMemberFunctionDeclaration:
4612 case V_SgMemberFunctionDeclaration:
4617 if (scope == derivedDeclaration->
get_scope())
4621 if (isSgTemplateFunctionDeclaration(declaration) != NULL)
4626 ROSE_ASSERT(symbol != NULL);
4630 SgName name = derivedDeclaration->get_name();
4631 symbolTable->insert(name,symbol);
4642 case V_SgTemplateInstantiationFunctionDecl:
4646 if (scope == derivedDeclaration->
get_scope())
4649 ROSE_ASSERT(symbol != NULL);
4650 SgName name = derivedDeclaration->get_name();
4651 symbolTable->insert(name,symbol);
4655 if (derivedDeclaration->get_declarationModifier().
isFriend() ==
false)
4657#if PRINT_DEVELOPER_WARNINGS
4658 printf (
"Shouldn't this be a friend declaration = %p = %s \n",derivedDeclaration,derivedDeclaration->
class_name().c_str());
4667 case V_SgTemplateFunctionDeclaration:
4669 case V_SgFunctionDeclaration:
4675 if (useThisDeclaration ==
true)
4677 if (scope == derivedDeclaration->
get_scope())
4682 if (isSgTemplateFunctionDeclaration(declaration) != NULL)
4687 ROSE_ASSERT(symbol != NULL);
4688 SgName name = derivedDeclaration->get_name();
4689 symbolTable->insert(name,symbol);
4693 if (derivedDeclaration->get_declarationModifier().
isFriend() ==
false)
4695#if PRINT_DEVELOPER_WARNINGS
4696 printf (
"Shouldn't this be a friend declaration = %p = %s \n",derivedDeclaration,derivedDeclaration->
class_name().c_str());
4705 case V_SgTemplateVariableDeclaration:
4707 case V_SgVariableDeclaration:
4710 SgInitializedNamePtrList & variableList = derivedDeclaration->
get_variables();
4711 SgInitializedNamePtrList::iterator i = variableList.begin();
4712 while ( i != variableList.end() )
4718 if (
variable->get_scope() == scope)
4721 ROSE_ASSERT(symbol != NULL);
4726 symbolTable->insert(name,symbol);
4743 ROSE_ASSERT(symbolTable != NULL);
4752 case V_SgTemplateInstantiationDecl:
4759 if (scope == derivedDeclaration->
get_scope())
4763 ROSE_ASSERT(symbol != NULL);
4764 SgName name = derivedDeclaration->get_name();
4767 if (scope != derivedDeclaration->
get_scope())
4769 printf (
"Error: scopes don't match for derivedDeclaration = %p = %s \n",derivedDeclaration,derivedDeclaration->
class_name().c_str());
4771 ROSE_ASSERT(scope == derivedDeclaration->
get_scope());
4773 symbolTable->insert(name,symbol);
4779 if (derivedDeclaration->get_declarationModifier().
isFriend() ==
false)
4781#if PRINT_DEVELOPER_WARNINGS
4782 printf (
"Shouldn't this be a friend declaration = %p = %s \n",derivedDeclaration,derivedDeclaration->
class_name().c_str());
4788 ROSE_ASSERT(symbol != NULL);
4789 SgName name = derivedDeclaration->get_name();
4790 symbolTable->insert(name,symbol);
4797 case V_SgTemplateClassDeclaration:
4799 case V_SgClassDeclaration:
4803 if (scope == derivedDeclaration->
get_scope())
4806 if (isSgTemplateClassDeclaration(declaration) != NULL)
4811 ROSE_ASSERT(symbol != NULL);
4812 SgName name = derivedDeclaration->get_name();
4813 symbolTable->insert(name,symbol);
4817 if (derivedDeclaration->get_declarationModifier().
isFriend() ==
false)
4819#if PRINT_DEVELOPER_WARNINGS
4820 printf (
"Shouldn't this be a friend declaration = %p = %s \n",derivedDeclaration,derivedDeclaration->
class_name().c_str());
4826 ROSE_ASSERT(symbol != NULL);
4827 SgName name = derivedDeclaration->get_name();
4828 symbolTable->insert(name,symbol);
4833 case V_SgEnumDeclaration:
4836 ROSE_ASSERT(derivedDeclaration != NULL);
4838 ROSE_ASSERT(symbol != NULL);
4840 symbolTable->insert(name,symbol);
4843 SgInitializedNamePtrList & enumFieldList = derivedDeclaration->
get_enumerators();
4844 SgInitializedNamePtrList::iterator i = enumFieldList.begin();
4847 while (i != enumFieldList.end())
4850 ROSE_ASSERT(enum_field_symbol != NULL);
4851 SgName enum_field_name = (*i)->get_name();
4852 symbolTable->insert(enum_field_name,enum_field_symbol);
4862 case V_SgTemplateTypedefDeclaration:
4864 case V_SgTypedefDeclaration:
4868 ROSE_ASSERT(symbol != NULL);
4869 SgName name = derivedDeclaration->get_name();
4870 symbolTable->insert(name,symbol);
4872 printf (
"In SageInterface::rebuildSymbolTable(): case of SgTypedefDeclaration \n");
4877 if (derivedDeclaration->get_typedefBaseTypeContainsDefiningDeclaration() ==
true)
4880 ROSE_ASSERT(symbolTable != NULL);
4883 printf (
"In SageInterface::rebuildSymbolTable(): case of SgTypedefDeclaration: typedefBaseTypeContainsDefiningDeclaration == true calling supportForBaseTypeDefiningDeclaration() \n");
4891 if (declaration != NULL)
4894 printf (
"In SageInterface::rebuildSymbolTable(): case of SgTypedefDeclaration: typedefBaseTypeContainsDefiningDeclaration == false calling supportForBaseTypeDefiningDeclaration() \n");
4899 printf (
"In SageInterface::rebuildSymbolTable(): case of SgTypedefDeclaration: typedefBaseTypeContainsDefiningDeclaration == false: skipping call to supportForBaseTypeDefiningDeclaration() \n");
4903 printf (
"In SageInterface::rebuildSymbolTable(): Leaving case of SgTypedefDeclaration \n");
4908 case V_SgTemplateDeclaration:
4914 printf (
"case V_SgTemplateDeclaration: derivedDeclaration = %p \n",derivedDeclaration);
4915 printf (
"case V_SgTemplateDeclaration: derivedDeclaration->get_declarationModifier().isFriend() = %s \n",derivedDeclaration->get_declarationModifier().
isFriend() ?
"true" :
"false");
4916 printf (
"case V_SgTemplateDeclaration: derivedDeclaration->get_name() = %s \n",derivedDeclaration->
get_name().str());
4917 printf (
"case V_SgTemplateDeclaration: derivedDeclaration->get_string() = %s \n",derivedDeclaration->
get_string().str());
4919 if (scope == derivedDeclaration->
get_scope())
4922 ROSE_ASSERT(symbol != NULL);
4924 symbolTable->insert(name,symbol);
4928 if (derivedDeclaration->get_declarationModifier().
isFriend() ==
false)
4930#if PRINT_DEVELOPER_WARNINGS
4931 printf (
"Shouldn't this be a friend declaration = %p = %s \n",derivedDeclaration,derivedDeclaration->
class_name().c_str());
4938 ROSE_ASSERT(symbol != NULL);
4940 symbolTable->insert(name,symbol);
4947 case V_SgNamespaceAliasDeclarationStatement:
4950 ROSE_ASSERT(aliasDeclaration != NULL);
4954 ROSE_ASSERT(derivedDeclaration != NULL);
4958 ROSE_ASSERT(symbol != NULL);
4960 symbolTable->insert(name,symbol);
4968 case V_SgNamespaceDeclarationStatement:
4971 ROSE_ASSERT(derivedDeclaration != NULL);
4975 ROSE_ASSERT(symbol != NULL);
4977 symbolTable->insert(name,symbol);
4983 case V_SgUsingDirectiveStatement:
4984 case V_SgPragmaDeclaration:
4985 case V_SgTemplateInstantiationDirectiveStatement:
4986 case V_SgUsingDeclarationStatement:
4990 printf (
"This declaration is ignored in rebuilding symbol table %p = %s = %s \n",*i,(*i)->class_name().c_str(),
get_name(*i).c_str());
4999 printf (
"An ASM statement (SgAsmStmt) declaration is not really a declaration %p = %s = %s \n",*i,(*i)->class_name().c_str(),
get_name(*i).c_str());
5005 case V_SgVariableDefinition:
5006 case V_SgFunctionParameterList:
5007 case V_SgCtorInitializerList:
5010 printf (
"Special cases not handled %p = %s = %s \n",*i,(*i)->class_name().c_str(),
get_name(*i).c_str());
5014 case V_SgStaticAssertionDeclaration:
5018 printf (
"A static assertion statement (SgStaticAssertionDeclaration) declaration is not really a declaration %p = %s = %s \n",*i,(*i)->class_name().c_str(),
get_name(*i).c_str());
5025 printf (
"Error: Default reached in rebuildSymbolTable declaration = %p = %s \n",declaration,declaration->
class_name().c_str());
5030 ROSE_ASSERT(symbolTable != NULL);
5031 ROSE_ASSERT(symbolTable->get_table() != NULL);
5037 ROSE_ASSERT(symbolTable != NULL);
5038 ROSE_ASSERT(symbolTable->get_table() != NULL);
5041 printf (
"Leaving SageInterface::rebuildSymbolTable(): fixup declarations in Symbol Table from %p = %s \n",scope,scope->
class_name().c_str());
5045 printf (
"Symbol Table from %p = %s at: \n",scope,scope->
class_name().c_str());
5047 symbolTable->
print(
"Called from SageInterface::rebuildSymbolTable()");
5062#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
5063 ROSE_ASSERT(this_scope != NULL);
5064 ROSE_ASSERT(copy_scope != NULL);
5067 printf (
"In fixupReferencesToSymbols(this_scope = %p = %s = %s, copy_scope = %p = %s = %s) \n",
5075 printf (
"Before fixup: this scope = %p = %s this_symbolTable->get_table()->size() = %" PRIuPTR
" \n",this_scope,this_scope->
class_name().c_str(),this_symbolTable->get_table()->size());
5076 printf (
"Before fixup: copy scope = %p = %s copy_symbolTable->get_table()->size() = %" PRIuPTR
" \n",copy_scope,copy_scope->
class_name().c_str(),copy_symbolTable->get_table()->size());
5082 if (this_symbolTable->get_table()->size() != copy_symbolTable->get_table()->size())
5086 printf (
"Before fixup: this scope = %p = %s this_symbolTable->get_table()->size() = %" PRIuPTR
" \n",this_scope,this_scope->
class_name().c_str(),this_symbolTable->get_table()->size());
5087 printf (
"Before fixup: copy scope = %p = %s copy_symbolTable->get_table()->size() = %" PRIuPTR
" \n",copy_scope,copy_scope->
class_name().c_str(),copy_symbolTable->get_table()->size());
5088 printf (
"Warning the symbols tables in these different scopes are different sizes \n");
5093 SgSymbolTable::hash_iterator i = this_symbolTable->get_table()->begin();
5096 std::map<SgNode*, SgNode*> replacementMap;
5098 while (i != this_symbolTable->get_table()->end())
5100 ROSE_ASSERT ( isSgSymbol( (*i).second ) != NULL );
5102 SgName name = (*i).first;
5105 ROSE_ASSERT ( symbol != NULL );
5107 SgSymbol* associated_symbol = NULL;
5109 printf (
"Symbol number: %d (pair.first (SgName) = %s) pair.second (SgSymbol) = %p sage_class_name() = %s \n",counter,i->first.str(),i->second,i->second->class_name().c_str());
5112 SgSymbolTable::hash_iterator associated_symbol_iterator = copy_symbolTable->get_table()->find(name);
5117 while (associated_symbol_iterator != copy_symbolTable->get_table()->end() && associated_symbol_iterator->first == name)
5119 if ( associated_symbol_iterator->second->variantT() == symbol->
variantT() )
5121 associated_symbol = associated_symbol_iterator->second;
5124 associated_symbol_iterator++;
5127 if (associated_symbol != NULL)
5129 ROSE_ASSERT ( associated_symbol != NULL );
5132 ROSE_ASSERT(copy_scope->symbol_exists(associated_symbol) ==
true);
5137 replacementMap.insert(pair<SgNode*,SgNode*>(symbol,associated_symbol));
5144 help.get_copiedNodeMap().insert(pair<const SgNode*,SgNode*>(symbol,associated_symbol));
5151 printf (
"Warning: Symbol number: %d (pair.first (SgName) = %s) pair.second (SgSymbol) = %p sage_class_name() = %s \n",counter,i->first.str(),i->second,i->second->class_name().c_str());
5152 printf (
"Warning: associated_symbol == NULL, need to investigate this (ignoring for now) \n");
5162 printf (
"\n\n************************************************************\n");
5163 printf (
"fixupReferencesToSymbols(this_scope = %p copy_scope = %p = %s = %s): calling Utils::edgePointerReplacement() \n",this_scope,copy_scope,copy_scope->
class_name().c_str(),
get_name(copy_scope).c_str());
5169 printf (
"fixupReferencesToSymbols(): calling Utils::edgePointerReplacement(): DONE \n");
5170 printf (
"************************************************************\n\n");
5172 printf (
"\n\n After replacementMapTraversal(): intermediateDeleteSet: \n");
5173 displaySet(intermediateDeleteSet,
"After Utils::edgePointerReplacement");
5175 printf (
"After fixup: this_symbolTable->get_table()->size() = %" PRIuPTR
" \n",this_symbolTable->get_table()->size());
5176 printf (
"After fixup: copy_symbolTable->get_table()->size() = %" PRIuPTR
" \n",copy_symbolTable->get_table()->size());
5185 printf (
"Exiting as a test in fixupReferencesToSymbols() \n");
5201 vector<SgFile*> fileList;
5202 void visit (
SgNode* node)
5204 SgFile* file = isSgFile(node);
5205 ROSE_ASSERT(file != NULL);
5208 fileList.push_back(file);
5212 virtual ~FileTraversal() {}
5215 FileTraversal fileTraversal;
5220#ifdef ROSE_ENABLE_BINARY_ANALYSIS
5231 return fileTraversal.fileList;
5249 void visit (
SgNode* node)
5251 project = isSgProject(node);
5252 ROSE_ASSERT(project!= NULL);
5254 virtual ~ProjectTraversal() {}
5257 ProjectTraversal projectTraversal;
5259 return projectTraversal.project;
5261 std::vector<SgProject* > resultlist = getSgNodeListFromMemoryPool<SgProject>();
5262 if (resultlist.empty())
5264 ROSE_ASSERT(resultlist.size()==1);
5265 return resultlist[0];
5270 return getEnclosingNode<SgProject>(node,
true );
5275 if (isSgFunctionRefExp(func))
5277 return isSgFunctionRefExp(func)->get_symbol()->get_declaration();
5279 else if (isSgDotExp(func) || isSgArrowExp(func))
5282 if (isSgMemberFunctionRefExp(func2))
5283 return isSgMemberFunctionRefExp(func2)->get_symbol()->get_declaration();
5286 cerr<<
"Warning in SageInterface::getDeclarationOfNamedFunction(): rhs operand of dot or arrow operations is not a member function, but a "<<func2->
class_name()<<endl;
5295 const SgExpressionPtrList& ls = el->get_expressions();
5296 if (ls.empty())
return 0;
5297 if (isSgAssignOp(ls.back()))
return 0;
5304 ASSERT_not_null(astNode);
5305 Rose_STL_Container<SgNode*> arr_exp_list = NodeQuery::querySubTree(astNode,V_SgPntrArrRefExp);
5306 for (
SgNode* expr : arr_exp_list)
5309 ASSERT_not_null(arr_exp);
5310 Rose_STL_Container<SgNode*> refList = NodeQuery::querySubTree(arr_exp->
get_lhs_operand(),V_SgVarRefExp);
5311 for (
SgNode* ref : refList)
5314 ASSERT_not_null(cur_ref);
5316 ASSERT_not_null(sym);
5318 ASSERT_not_null(iname);
5319 SgArrayType * a_type = isSgArrayType(iname->get_typeptr());
5320 if (a_type && a_type->get_dim_info())
5322 Rose_STL_Container<SgNode*> dim_ref_list = NodeQuery::querySubTree(a_type->get_dim_info(),V_SgVarRefExp);
5323 for (Rose_STL_Container<SgNode*>::iterator iter2 = dim_ref_list.begin(); iter2 != dim_ref_list.end(); iter2++)
5326 NodeList_t.push_back(dim_ref);
5336#if (INLINE_OPTIMIZED_IS_LANGUAGE_KIND_FUNCTIONS == 0)
5340#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5342 return Rose::is_Ada_language;
5344 bool returnValue =
false;
5348 int size = (int)fileList.size();
5349 for (
int i = 0; i < size; i++)
5351 if (fileList[i]->get_Ada_only() ==
true)
5362#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5364 return Rose::is_C_language;
5366 bool returnValue =
false;
5370 int size = (int)fileList.size();
5371 for (
int i = 0; i < size; i++)
5373 if (fileList[i]->get_C_only() ==
true)
5384#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5386 return Rose::is_OpenMP_language;
5388 bool returnValue =
false;
5392 int size = (int)fileList.size();
5393 for (
int i = 0; i < size; i++)
5395 if (fileList[i]->get_openmp() ==
true)
5406#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5408 return Rose::is_UPC_language;
5410 bool returnValue =
false;
5414 int size = (int)fileList.size();
5415 for (
int i = 0; i < size; i++)
5417 if (fileList[i]->get_UPC_only() ==
true)
5429#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5431 return Rose::is_CAF_language;
5433 bool returnValue =
false;
5437 int size = (int)fileList.size();
5438 for (
int i = 0; i < size; i++)
5440 if (fileList[i]->get_CoArrayFortran_only()==
true)
5453#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5455 return Rose::is_UPC_dynamic_threads;
5457 bool returnValue =
false;
5461 int size = (int)fileList.size();
5462 for (
int i = 0; i < size; i++)
5464 if (fileList[i]->get_upc_threads() > 0)
5477#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5479 return Rose::is_C99_language;
5481 bool returnValue =
false;
5485 int size = (int)fileList.size();
5486 for (
int i = 0; i < size; i++)
5488 if (fileList[i]->get_C99_only() ==
true)
5499#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5501 return Rose::is_Cxx_language;
5503 bool returnValue =
false;
5507 int size = (int)fileList.size();
5508 for (
int i = 0; i < size; i++)
5511 if (fileList[i]->get_Cxx_only() ==
true)
5513 ROSE_ASSERT(fileList[i]->get_Fortran_only() ==
false && fileList[i]->get_C99_only() ==
false && fileList[i]->get_C_only() ==
false && fileList[i]->get_binary_only() ==
false);
5526#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5528 return Rose::is_Java_language;
5530 bool returnValue =
false;
5534 int size = (int)fileList.size();
5535 for (
int i = 0; i < size; i++)
5537 if (fileList[i]->get_Java_only() ==
true)
5548#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5550 return Rose::is_Jvm_language;
5552 bool returnValue =
false;
5556 int size = (int)fileList.size();
5557 for (
int i = 0; i < size; i++)
5559 if (fileList[i]->get_Jvm_only() ==
true)
5571#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5573 return Rose::is_Jovial_language;
5575 bool returnValue =
false;
5579 int size = (int)fileList.size();
5580 for (
int i = 0; i < size; i++)
5582 if (fileList[i]->get_Jovial_only() ==
true)
5594#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5596 return Rose::is_Fortran_language;
5598 bool returnValue =
false;
5602 int size = (int)fileList.size();
5603 for (
int i = 0; i < size; i++)
5605 if (fileList[i]->get_Fortran_only() ==
true)
5617#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5619 return Rose::is_binary_executable;
5621 bool returnValue =
false;
5625 int size = (int)fileList.size();
5626 for (
int i = 0; i < size; i++)
5628 if (fileList[i]->get_binary_only() ==
true)
5639#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5641 return Rose::is_PHP_language;
5643 bool returnValue =
false;
5647 int size = (int)fileList.size();
5648 for (
int i = 0; i < size; i++)
5650 if (fileList[i]->get_PHP_only() ==
true)
5661#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5663 return Rose::is_Python_language;
5665 bool returnValue =
false;
5669 int size = (int)fileList.size();
5670 for (
int i = 0; i < size; i++)
5672 if (fileList[i]->get_Python_only() ==
true)
5683#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5685 return Rose::is_Cuda_language;
5687 bool returnValue =
false;
5691 int size = (int)fileList.size();
5692 for (
int i = 0; i < size; i++)
5694 if (fileList[i]->get_Cuda_only() ==
true)
5705#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5707 return Rose::is_OpenCL_language;
5709 bool returnValue =
false;
5713 int size = (int)fileList.size();
5714 for (
int i = 0; i < size; i++)
5716 if (fileList[i]->get_OpenCL_only() ==
true)
5764 ASSERT_not_null(functionDefinition);
5765 std::map<SgNode*,int> & scopeMap = functionDefinition->get_scope_number_list();
5768 scopeMap.erase(scopeMap.begin(),scopeMap.end());
5770 ASSERT_require(scopeMap.empty() ==
true);
5771 ASSERT_require(functionDefinition->get_scope_number_list().empty() ==
true);
5781 ROSE_ASSERT(functionDefinition != NULL);
5784 ROSE_ASSERT(functionDefinition->get_scope_number_list().empty() ==
true);
5790 ScopeNumberingTraversal() : count (0), storedFunctionDefinition(NULL) {}
5791 void visit (
SgNode* node)
5798 if (testFunctionDefinition != NULL && storedFunctionDefinition == NULL)
5800 ROSE_ASSERT(storedFunctionDefinition == NULL);
5801 storedFunctionDefinition = testFunctionDefinition;
5805 ROSE_ASSERT(storedFunctionDefinition != NULL);
5809 std::map<SgNode*,int> & scopeMap = storedFunctionDefinition->get_scope_number_list();
5810 scopeMap.insert(pair<SgNode*,int>(scope,count));
5812 string functionName = storedFunctionDefinition->get_declaration()->get_name().str();
5813 printf (
"In function = %s insert scope = %p = %s with count = %d into local map (size = %d) \n",
5814 functionName.c_str(),scope,scope->
class_name().c_str(),count,scopeMap.size());
5825 ScopeNumberingTraversal traversal;
5826 traversal.traverse(functionDefinition, preorder);
5840 ROSE_ASSERT(globalScope != NULL);
5841 std::map<SgNode*,std::string> & mangledNameCache = globalScope->get_mangledNameCache();
5844 mangledNameCache.erase(mangledNameCache.begin(),mangledNameCache.end());
5846 ROSE_ASSERT(mangledNameCache.empty() ==
true);
5847 ROSE_ASSERT(globalScope->get_mangledNameCache().empty() ==
true);
5855 ROSE_ASSERT(globalScope != NULL);
5856 ROSE_ASSERT(globalScope->get_mangledNameCache().empty() ==
true);
5862 MangledNameTraversal() : storedGlobalScope(NULL) {}
5863 void visit (
SgNode* node)
5866 if ( (mangleableNode != NULL) || (isSgGlobal(node) != NULL) )
5869 SgGlobal* testGlobalScope = isSgGlobal(mangleableNode);
5870 if (testGlobalScope != NULL && storedGlobalScope == NULL)
5872 ROSE_ASSERT(storedGlobalScope == NULL);
5873 storedGlobalScope = testGlobalScope;
5877 ROSE_ASSERT(storedGlobalScope != NULL);
5879 string mangledName = mangleableNode->get_mangled_name();
5882 std::map<SgNode*,std::string> & mangledNameCache = storedGlobalScope->get_mangledNameCache();
5883 mangledNameCache.insert(pair<SgNode*,std::string>(mangleableNode,mangledName));
5885 string nodeName =
get_name(mangleableNode);
5886 printf (
"At node = %p = %s = %s in local map (size = %d) \n",
5887 mangleableNode,mangleableNode->
class_name().c_str(),nodeName.c_str(),mangledNameCache.size());
5897 MangledNameTraversal traversal;
5898 traversal.traverse(globalScope, preorder);
5910 SgGlobal* globalScope = isSgGlobal(astNode);
5912 if (globalScope == NULL && isSgFile(astNode) != NULL)
5914 globalScope = isSgFile(astNode)->get_globalScope();
5915 ROSE_ASSERT(globalScope != NULL);
5918 if (globalScope == NULL && isSgProject(astNode) != NULL)
5921 ROSE_ASSERT( isSgProject(astNode)->get_fileList()->size() == 1 );
5922 globalScope = isSgProject(astNode)->get_fileList()->operator[](0)->get_globalScope();
5923 ROSE_ASSERT(globalScope != NULL);
5927 while (temp->
get_parent() != NULL && globalScope == NULL)
5930 globalScope = isSgGlobal(temp);
5932 ROSE_ASSERT(globalScope != NULL);
5939 std::map<SgNode*,std::string>::iterator i = mangledNameCache.find(astNode);
5942 if (i != mangledNameCache.end())
5946 mangledName = i->second;
5957#define DEBUG_SAGE_INTERFACE_ADD_MANGLED_TO_CACHE 0
5958#define DEBUG_MANGLED_SHORTNAME 1
5967#if DEBUG_SAGE_INTERFACE_ADD_MANGLED_TO_CACHE
5968 printf (
"In SageInterface::addMangledNameToCache(): TOP: astNode = %p = %s oldMangledName = %s \n",astNode,astNode->
class_name().c_str(),oldMangledName.c_str());
5972#ifdef DEBUG_MANGLED_SHORTNAME
5973 static std::unordered_map<uint64_t, std::string> mangledNameHashCollisionCheckMap;
5978 SgGlobal* globalScope = isSgGlobal(astNode);
5980 if (globalScope == NULL && isSgFile(astNode) != NULL)
5982 globalScope = isSgFile(astNode)->get_globalScope();
5983 ROSE_ASSERT(globalScope != NULL);
5986 if (globalScope == NULL && isSgProject(astNode) != NULL)
5989 ROSE_ASSERT( isSgProject(astNode)->get_fileList()->size() == 1 );
5990 globalScope = isSgProject(astNode)->get_fileList()->operator[](0)->get_globalScope();
5991 ROSE_ASSERT(globalScope != NULL);
5995 while (temp->
get_parent() != NULL && globalScope == NULL)
5998 globalScope = isSgGlobal(temp);
6000 ROSE_ASSERT(globalScope != NULL);
6005 std::string mangledName;
6007 if (SgProject::get_mangled_noshortname() ==
false) {
6010 if (oldMangledName.size() > 40) {
6011 std::map<std::string, uint64_t>::const_iterator shortMNIter = shortMangledNameCache.find(oldMangledName);
6012 uint64_t idNumber = 0;
6013 if (shortMNIter != shortMangledNameCache.end())
6015 idNumber = shortMNIter->second;
6017#ifdef DEBUG_MANGLED_SHORTNAME
6019 auto collisionIt = mangledNameHashCollisionCheckMap.find(idNumber);
6020 if(collisionIt != mangledNameHashCollisionCheckMap.end() &&
6021 oldMangledName != shortMNIter->first)
6023 mlog[Sawyer::Message::Common::ERROR] <<
" Got a short mangled name collision. \n "<<
6024 oldMangledName <<
" and \n " << shortMNIter->first <<
" \n" <<
6028 mangledNameHashCollisionCheckMap[idNumber] = oldMangledName;
6036 hasher.
insert(oldMangledName);
6039 shortMangledNameCache.insert(std::pair<std::string, uint64_t>(oldMangledName, idNumber));
6042 std::ostringstream mn;
6044 mangledName = mn.str();
6046 mangledName = oldMangledName;
6057 static unsigned long counter = 0;
6061 if (counter++ % 500 == 0)
6063 printf (
"WARNING: In SageInterface::addMangledNameToCache(): Using longer forms of mangled names (can cause some function names with embedded special characters to fail; test2004_141.C) \n");
6065 mangledName = oldMangledName;
6072 printf (
"Updating mangled name cache for node = %p = %s with mangledName = %s \n",astNode,astNode->
class_name().c_str(),mangledName.c_str());
6075#ifdef ROSE_DEBUG_NEW_EDG_ROSE_CONNECTION
6081 printf (
"Warning: SageInterface::addMangledNameToCache(): In it might be premature to add this IR node and name to the mangledNameCache: statement = %p = %s oldMangledName = %s \n",
6082 statement,statement->
class_name().c_str(),oldMangledName.c_str());
6087 mangledNameCache.insert(pair<SgNode*,string>(astNode,mangledName));
6089#if DEBUG_SAGE_INTERFACE_ADD_MANGLED_TO_CACHE
6090 printf (
"In SageInterface::addMangledNameToCache(): returning mangledName = %s \n",mangledName.c_str());
6114 : storedNondefiningDeclaration(nonDefiningDeclaration),
6115 storedDefiningDeclaration(definingDeclaration)
6117 storedDeclarationFound =
false;
6118 nonDefiningDeclarationPreceedsDefiningDeclaration =
false;
6121 void visit (
SgNode* node)
6123 ROSE_ASSERT(storedNondefiningDeclaration != NULL);
6124 ROSE_ASSERT(storedDefiningDeclaration != NULL);
6125 ROSE_ASSERT(storedNondefiningDeclaration != storedDefiningDeclaration);
6133 if ( declaration != NULL )
6135 if (storedDeclarationFound ==
false)
6137 if (declaration == storedDefiningDeclaration)
6139 storedDeclarationFound =
true;
6140 nonDefiningDeclarationPreceedsDefiningDeclaration =
false;
6142 if (declaration == storedNondefiningDeclaration)
6144 storedDeclarationFound =
true;
6145 nonDefiningDeclarationPreceedsDefiningDeclaration =
true;
6152 bool storedDeclarationFound;
6153 bool nonDefiningDeclarationPreceedsDefiningDeclaration;
6160 ROSE_ASSERT(nonDefiningDeclaration != NULL);
6162 printf (
"In SageInterface::declarationPreceedsDefinition(): \n");
6163 printf (
" nondefiningDeclaration = %p = %s \n",nonDefiningDeclaration,nonDefiningDeclaration->
class_name().c_str());
6164 nonDefiningDeclaration->
get_file_info()->display(
"nonDefiningDeclaration");
6165 printf (
" nondefiningDeclaration->get_definingDeclaration() = %p \n",nonDefiningDeclaration->
get_definingDeclaration());
6166 printf (
" definingDeclaration = %p = %s \n",definingDeclaration,definingDeclaration->
class_name().c_str());
6167 definingDeclaration->
get_file_info()->display(
"definingDeclaration");
6168 printf (
"************************************************************* \n");
6175 printf (
"In SageInterface::declarationPreceedsDefinition() (warning): \n");
6176 printf (
" nondefiningDeclaration = %p \n",nonDefiningDeclaration);
6177 printf (
" nondefiningDeclaration->get_definingDeclaration() = %p \n",nonDefiningDeclaration->
get_definingDeclaration());
6178 printf (
" definingDeclaration = %p \n",definingDeclaration);
6183 bool returnResult =
false;
6184 if (nonDefiningDeclaration != definingDeclaration)
6187 SgGlobal* globalScope = TransformationSupport::getGlobalScope(definingDeclaration);
6188 ROSE_ASSERT(globalScope != NULL);
6191 DeclarationOrderTraversal traversal (nonDefiningDeclaration,definingDeclaration);
6194 traversal.traverse(globalScope, preorder);
6197 printf (
"Skipping traversal within SageInterface::declarationPreceedsDefinition() \n");
6198 traversal.storedDeclarationFound =
true;
6199 traversal.nonDefiningDeclarationPreceedsDefiningDeclaration =
false;
6206 if (traversal.storedDeclarationFound ==
false)
6209 printf (
"In SageInterface::declarationPreceedsDefinition(): warning, nonDefiningDeclaration not found in the AST \n");
6210 nonDefiningDeclaration->
get_file_info()->display(
"nonDefiningDeclaration");
6211 definingDeclaration->
get_file_info()->display(
"definingDeclaration");
6212 printf (
"---------------------------------------------------- \n\n");
6216 returnResult =
true;
6220 returnResult = traversal.nonDefiningDeclarationPreceedsDefiningDeclaration;
6226 printf (
"returnResult = %s \n",returnResult ?
"true" :
"false");
6227 printf (
"************************************************************* \n\n");
6229 return returnResult;
6246 : storedFunctionCall(functionCall)
6248 ROSE_ASSERT(functionCall != NULL);
6249 ROSE_ASSERT(functionCall->get_function() != NULL);
6250 SgExpression* functionExpression = functionCall->get_function();
6252 switch (functionExpression->
variantT())
6258 case V_SgArrowStarOp:
6259 case V_SgPointerDerefExp:
6262 printf (
"These are the acceptable cases, but not handled yet... \n");
6266 case V_SgFunctionRefExp:
6269 ROSE_ASSERT(functionRefExp != NULL);
6271 ROSE_ASSERT(functionSymbol != NULL);
6274 ROSE_ASSERT(functionSymbol->get_declaration() != NULL);
6275 storedFunctionDeclaration = functionSymbol->get_declaration();
6279 case V_SgMemberFunctionRefExp:
6282 ROSE_ASSERT(memberFunctionRefExp != NULL);
6284 ROSE_ASSERT(memberFunctionSymbol != NULL);
6286 storedFunctionDeclaration = memberFunctionSymbol->get_declaration();
6288 printf (
"V_SgMemberFunctionRefExp case not handled yet... \n");
6294 printf (
"default reached in SageInterface::functionCallExpressionPreceedsDeclarationWhichAssociatesScope() functionExpression = %s \n",
6302 ROSE_ASSERT(storedFunctionDeclaration != NULL);
6304 storedFunctionCallFound =
false;
6308 void visit (
SgNode* node)
6310 ROSE_ASSERT(storedFunctionCall != NULL);
6311 ROSE_ASSERT(storedFunctionDeclaration != NULL);
6314 if (storedFunctionCallFound ==
false)
6317 if ( functionCall != NULL )
6319 if (functionCall == storedFunctionCall)
6321 storedFunctionCallFound =
true;
6331 ROSE_ASSERT(storedFunctionDeclaration != NULL);
6344 storedFunctionCallFound =
true;
6350 printf (
"Found a declaration which preceeds the function \n");
6351 declaration->
get_file_info()->display(
"Found a declaration which preceeds the function: declaration");
6352 storedFunctionCall->get_file_info()->display(
"Found a declaration which preceeds the function: storedFunctionCall");
6353 storedFunctionDeclaration->get_file_info()->display(
"Found a declaration which preceeds the function: storedFunctionDeclaration");
6359 if (parentScopeOfDeclaration == NULL)
6362 printf (
"Strange case of parentScopeOfDeclaration == NULL in SageInterface::functionCallExpressionPreceedsDeclarationWhichAssociatesScope() \n");
6364 if (parent != NULL) {
6365 printf (
"declaration->get_parent() = %s \n",parent->
class_name().c_str());
6368 printf (
"declaration->get_parent() = NULL \n");
6370 declaration->
get_file_info()->display(
"case of parentScopeOfDeclaration == NULL");
6379 bool storedFunctionCallFound;
6387 ROSE_ASSERT(functionCall != NULL);
6389 printf (
"In SageInterface::functionCallExpressionPreceedsDeclarationWhichAssociatesScope(): \n");
6390 printf (
" storedFunctionCall = %p = %s \n",functionCall,functionCall->
class_name().c_str());
6391 functionCall->
get_file_info()->display(
"storedFunctionCall");
6392 printf (
" storedFunctionCall->get_function() = %p = %s \n",functionCall->get_function(),functionCall->get_function()->
class_name().c_str());
6393 printf (
"************************************************************* \n");
6397 bool returnResult =
false;
6400 SgGlobal* globalScope = TransformationSupport::getGlobalScope(functionCall);
6401 ROSE_ASSERT(globalScope != NULL);
6404 DeclarationOrderTraversal traversal (functionCall);
6407 traversal.traverse(globalScope, preorder);
6410 printf (
"Skipping traversal within SageInterface::functionCallExpressionPreceedsDeclarationWhichAssociatesScope() \n");
6411 traversal.storedFunctionCallFound =
true;
6412 traversal.functionCallExpressionPreceedsDeclarationWhichAssociatesScope =
false;
6419 if (traversal.storedFunctionCallFound ==
false)
6422 printf (
"In SageInterface::functionCallExpressionPreceedsDeclarationWhichAssociatesScope(): warning, storedFunctionCall not found in the AST \n");
6424 printf (
"---------------------------------------------------- \n\n");
6429 returnResult =
true;
6433 returnResult = traversal.functionCallExpressionPreceedsDeclarationWhichAssociatesScope;
6437 ROSE_ASSERT(traversal.storedFunctionCallFound ==
true);
6439 printf (
"returnResult = %s \n",returnResult ?
"true" :
"false");
6440 printf (
"************************************************************* \n\n");
6442 return returnResult;
6463 ROSE_ASSERT(project != NULL);
6470 Rose_STL_Container<string>::iterator i = fileList.begin();
6473 if ( fileList.empty() ==
true )
6475 return "empty_file_list";
6479 string filename = *i;
6485 if (i != fileList.begin())
6486 projectName +=
"--";
6490 string filenameWithoutSuffix;
6491 if ( i != fileList.end() || supressSuffix ==
true )
6494 filenameWithoutSuffix = filename;
6501 filename = filenameWithoutPathOrSuffix;
6503 unsigned long int n = 0;
6504 while (n < filename.size())
6506 if (filename[n] ==
'/')
6513 projectName += filename;
6517 while (i != fileList.end());
6536 if (currentScope == NULL)
6538 ROSE_ASSERT(currentScope != NULL);
6541 while ((functionSymbol == NULL) && (tempScope != NULL))
6543 functionSymbol = tempScope->lookup_function_symbol(functionName);
6545 printf (
"In lookupFunctionSymbolInParentScopes(): Searching scope = %p = %s functionName = %s functionSymbol = %p \n",tempScope,tempScope->
class_name().c_str(),functionName.str(),functionSymbol);
6548 tempScope = isSgGlobal(tempScope) ? NULL : tempScope->
get_scope();
6552 return functionSymbol;
6563 if (currentScope == NULL)
6565 ROSE_ASSERT(currentScope != NULL);
6568 while ((functionSymbol == NULL) && (tempScope != NULL))
6570 functionSymbol = tempScope->lookup_template_function_symbol(functionName, ftype, tplparams);
6572 printf (
"In lookupTemplateFunctionSymbolInParentScopes(): Searching scope = %p = %s functionName = %s functionSymbol = %p \n",tempScope,tempScope->
class_name().c_str(),functionName.str(),functionSymbol);
6575 tempScope = isSgGlobal(tempScope) ? NULL : tempScope->
get_scope();
6579 return functionSymbol;
6590 if (currentScope == NULL)
6592 ROSE_ASSERT(currentScope != NULL);
6595 while ((functionSymbol == NULL) && (tempScope != NULL))
6597 functionSymbol = tempScope->lookup_template_member_function_symbol(functionName, ftype, tplparams);
6599 printf (
"In lookupTemplateMemberFunctionSymbolInParentScopes(): Searching scope = %p = %s functionName = %s functionSymbol = %p \n",tempScope,tempScope->
class_name().c_str(),functionName.str(),functionSymbol);
6602 tempScope = isSgGlobal(tempScope) ? NULL : tempScope->
get_scope();
6606 return functionSymbol;
6614 if (isSgType(astNode) != NULL)
6616 printf (
"Error: the mechanism to add text to be unparsed at IR nodes is not intended to operate on SgType IR nodes (since they are shared) \n");
6620 if (astNode->
attributeExists(AstUnparseAttribute::markerName) ==
true)
6622 AstUnparseAttribute* code =
dynamic_cast<AstUnparseAttribute*
>(astNode->
getAttribute(AstUnparseAttribute::markerName));
6623 ROSE_ASSERT(code != NULL);
6627 code->addString(s,inputlocation);
6636 AstUnparseAttribute* code =
new AstUnparseAttribute(s,inputlocation);
6637 ROSE_ASSERT(code != NULL);
6654 ROSE_ASSERT(cscope != NULL);
6656 while ((cscope != NULL) && (symbol == NULL))
6659 symbol = cscope->lookup_class_symbol(name,NULL);
6662 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6693 if (currentScope == NULL)
6695 ROSE_ASSERT(currentScope != NULL);
6697 while (functionSymbol == NULL && tempScope != NULL)
6699 functionSymbol = tempScope->lookup_function_symbol(functionName,t);
6701 tempScope = isSgGlobal(tempScope) ? NULL : tempScope->
get_scope();
6702 else tempScope = NULL;
6704 return functionSymbol;
6711 if (cscope ==
nullptr) {
6714 ASSERT_not_null(cscope);
6716 while ((cscope !=
nullptr) && (symbol ==
nullptr))
6718 symbol = cscope->lookup_symbol(name,templateParameterList,templateArgumentList);
6720 cscope = isSgGlobal(cscope) ? nullptr : cscope->
get_scope();
6739 if (currentScope == NULL)
6744 ROSE_ASSERT(currentScope != NULL);
6746#define DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS 0
6748#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6749 printf (
"In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): currentScope = %p = %s (templateParameterList = %p templateArgumentList = %p) \n",
6750 currentScope,currentScope->
class_name().c_str(),templateParameterList,templateArgumentList);
6753 while ((currentScope != NULL) && (symbol == NULL))
6755#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6756 printf(
" --- In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): name = %s currentScope = %p = %s \n",
6757 name.str(),currentScope,currentScope->
class_name().c_str());
6762 symbol = currentScope->lookup_symbol(name,templateParameterList,templateArgumentList);
6764 if (isSgAliasSymbol(symbol) != NULL)
6766#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6767 printf (
"Found a SgAliasSymbol: reset to NULL: symbol = %p = %s \n",symbol,symbol->
class_name().c_str());
6772#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS && 1
6774 printf(
" --- In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): symbol = %p \n",symbol);
6775 currentScope->print_symboltable(
"In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): debug");
6778 currentScope = isSgGlobal(currentScope) ? NULL : currentScope->
get_scope();
6780 currentScope = NULL;
6782#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6783 printf (
" --- In SageInterface:: (base of loop) lookupSymbolInParentScopesIgnoringAliasSymbols(): cscope = %p symbol = %p \n\n",currentScope,symbol);
6789#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6790 printf (
"Warning: In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): could not locate the specified name %s in any outer symbol table (templateParameterList = %p templateArgumentList = %p) \n",
6791 name.str(),templateParameterList,templateArgumentList);
6797 printf (
"Support for lookupSymbolInParentScopesIgnoringAliasSymbols() is not yet implemented \n");
6819 ROSE_ASSERT(cscope);
6821 while ((cscope!=NULL)&&(symbol==NULL))
6823 symbol = cscope->lookup_symbol(name);
6827 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6853 printf (
"WARNING: SageInterface::lookupVariableSymbolInParentScopes() should be implemented similar to SageInterface::lookupClassSymbolInParentScopes() \n");
6859 if (isSgAliasSymbol(symbol) != NULL)
6861 printf (
"Error: This SageInterface::lookupVariableSymbolInParentScopes() function does not handle SgAliasSymbols \n");
6864 result = isSgVariableSymbol(symbol);
6872 ROSE_ASSERT(cscope != NULL);
6874 while ((cscope != NULL) && (symbol == NULL))
6877 symbol = cscope->lookup_variable_symbol(name);
6880 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6889#define DEBUG_LOOKUP_TEMPLATE_VARIABLE 0
6894#if DEBUG_LOOKUP_TEMPLATE_VARIABLE
6895 printf (
"In SageInterface::lookupTemplateVariableSymbolInParentScopes():\n");
6896 printf (
" -- name = %s\n", name.str());
6897 printf (
" -- tplparams = %p [%zd]\n", tplparams, tplparams ? tplparams->size() : 0);
6898 printf (
" -- tplargs = %p [%zd]\n", tplargs, tplargs ? tplargs->size() : 0);
6899 printf (
" -- cscope = %p (%s)\n", cscope, cscope ? cscope->
class_name().c_str() :
"");
6905 ROSE_ASSERT(cscope != NULL);
6907 while ((cscope != NULL) && (symbol == NULL))
6910 symbol = cscope->lookup_template_variable_symbol(name, tplparams, tplargs);
6913 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6929 ROSE_ASSERT(cscope != NULL);
6931 while ((cscope != NULL) && (symbol == NULL))
6935 symbol = cscope->lookup_class_symbol(name,templateArgumentList);
6938 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6952 ROSE_ASSERT(cscope != NULL);
6954 while ((cscope != NULL) && (symbol == NULL))
6956 symbol = cscope->lookup_nonreal_symbol(name,templateParameterList,templateArgumentList);
6959 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6974 ROSE_ASSERT(cscope != NULL);
6977 printf (
"In lookupTypedefSymbolInParentScopes(): name = %s starting with cscope = %p = %s \n",name.str(),cscope,cscope->
class_name().c_str());
6981 while ((cscope != NULL) && (symbol == NULL))
6984 symbol = cscope->lookup_typedef_symbol(name);
6987 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6992 printf (
"In lookupTypedefSymbolInParentScopes(): symbol = %p next cscope = %p = %s \n",symbol,cscope,(cscope != NULL) ? cscope->
class_name().c_str() :
"null");
6997 printf (
"Leaving lookupTypedefSymbolInParentScopes(): symbol = %p \n",symbol);
7015 ROSE_ASSERT(cscope != NULL);
7017 while ((cscope != NULL) && (symbol == NULL))
7023 symbol = cscope->lookup_template_symbol(name,NULL,NULL);
7025 printf (
"In lookupTemplateSymbolInParentScopes(): Searching scope = %p = %s name = %s symbol = %p \n",cscope,cscope->
class_name().c_str(),name.str(),symbol);
7028 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
7045 ROSE_ASSERT(cscope != NULL);
7047 while ((cscope != NULL) && (symbol == NULL))
7053 symbol = cscope->lookup_template_class_symbol(name,templateParameterList,templateArgumentList);
7055 printf (
"In lookupTemplateSymbolInParentScopes(): Searching scope = %p = %s name = %s symbol = %p \n",cscope,cscope->
class_name().c_str(),name.str(),symbol);
7058 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
7075 ROSE_ASSERT(cscope != NULL);
7077 while ((cscope != NULL) && (symbol == NULL))
7080 symbol = cscope->lookup_enum_symbol(name);
7083 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
7098 ROSE_ASSERT(cscope != NULL);
7100 while ((cscope != NULL) && (symbol == NULL))
7103 symbol = cscope->lookup_namespace_symbol(name);
7106 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
7116SageInterface::setSourcePositionToDefault( T* node )
7134 ROSE_ASSERT(node != NULL);
7137 if (node->get_endOfConstruct() == NULL && node->get_startOfConstruct() == NULL)
7140 printf (
"Both startOfConstruct and endOfConstruct are NOT yet initialized with pointers to Sg_File_Info objects (node = %p = %s) \n",node,node->class_name().c_str());
7143 ROSE_ASSERT(node->get_endOfConstruct() == NULL);
7144 ROSE_ASSERT(node->get_startOfConstruct() == NULL);
7151 printf (
"In SageInterface::setSourcePositionToDefault(): Calling setSourcePositionUnavailableInFrontend() \n");
7153 start_fileInfo->setSourcePositionUnavailableInFrontend();
7154 end_fileInfo->setSourcePositionUnavailableInFrontend();
7158 printf (
"In SageInterface::setSourcePositionToDefault(): Calling setOutputInCodeGeneration() \n");
7164 node->set_startOfConstruct(start_fileInfo);
7165 node->set_endOfConstruct (end_fileInfo);
7167 node->get_startOfConstruct()->set_parent(node);
7168 node->get_endOfConstruct ()->set_parent(node);
7175 printf (
"Both startOfConstruct and endOfConstruct are ALREADY initialized with pointers to Sg_File_Info objects (node = %p = %s) \n",node,node->class_name().c_str());
7177 if (node->get_startOfConstruct() == NULL)
7179 printf (
"ERROR: startOfConstruct not set for locatedNode = %p = %s \n",node,node->class_name().c_str());
7181 if (node->get_endOfConstruct() == NULL)
7183 printf (
"ERROR: endOfConstruct not set for locatedNode = %p = %s \n",node,node->class_name().c_str());
7186 ROSE_ASSERT(node->get_startOfConstruct() != NULL);
7187 ROSE_ASSERT(node->get_endOfConstruct() != NULL);
7188 ROSE_ASSERT(node->get_endOfConstruct() != NULL && node->get_startOfConstruct() != NULL);
7209 if (expression != NULL)
7212 SgBinaryOp* binaryOp = isSgBinaryOp(expression);
7213 if (binaryOp != NULL)
7215 if (binaryOp->get_operatorPosition() == NULL)
7218 operator_fileInfo->setSourcePositionUnavailableInFrontend();
7220 binaryOp->set_operatorPosition(operator_fileInfo);
7223 binaryOp->get_operatorPosition()->
set_parent(binaryOp);
7228 if (expression->get_operatorPosition() == NULL)
7231 operator_fileInfo->setSourcePositionUnavailableInFrontend();
7233 expression->set_operatorPosition(operator_fileInfo);
7238 ROSE_ASSERT(expression->get_operatorPosition()->
get_parent() == expression);
7249#ifdef ROSE_DEBUG_NEW_EDG_ROSE_CONNECTION
7250 printf (
"+++++ Depricated function (use setSourcePositionAsTransformation() instead) (no using internal source position mode) \n");
7269 ROSE_ASSERT(node != NULL);
7278 SgPragma* pragma = isSgPragma(node);
7279 SgGlobal* global = isSgGlobal(node);
7284 printf (
"Debug, Found a variable definition: %p\n", v_d);
7287 if (locatedNode != NULL)
7299 if (expression!=NULL)
7302 expression->get_operatorPosition()->
set_parent(expression);
7321 printf (
"+++++ Depricated name setOneSourcePositionNull() (use setSourcePositionPointersToNull() instead) (no using internal source position mode) \n");
7339 ROSE_ASSERT(node != NULL);
7343 SgPragma* pragma = isSgPragma(node);
7344 SgGlobal* global = isSgGlobal(node);
7350 if (locatedNode != NULL)
7353 printf (
"WARNING: In SageInterface::setSourcePositionPointersToNull(): Memory leak of startOfConstruct Sg_File_Info object (setting Sg_File_Info pointers to NULL) \n");
7361 printf (
"WARNING: In SageInterface::setSourcePositionPointersToNull(): Memory leak of endOfConstruct Sg_File_Info object (setting Sg_File_Info pointers to NULL) \n");
7367 if (expression != NULL)
7369 if (expression->get_operatorPosition() != NULL)
7370 printf (
"WARNING: In SageInterface::setSourcePositionPointersToNull(): Memory leak of operatorPosition Sg_File_Info object (setting Sg_File_Info pointers to NULL) \n");
7372 expression->set_operatorPosition(NULL);
7379 printf (
"WARNING: In SageInterface::setSourcePositionPointersToNull(): Memory leak of Sg_File_Info object (setting Sg_File_Info pointers to NULL) \n");
7381 pragma->set_startOfConstruct(NULL);
7392 printf (
"+++++ Depricated name setSourcePositionForTransformation() (use setSourcePositionAtRootAndAllChildrenAsTransformation() instead) \n");
7405 Rose_STL_Container <SgNode*> nodeList = NodeQuery::querySubTree(root,V_SgNode);
7406 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i!=nodeList.end(); i++ )
7417SageInterface::setSourcePositionAtRootAndAllChildrenAsTransformation(
SgNode *root)
7419 Rose_STL_Container <SgNode*> nodeList= NodeQuery::querySubTree(root,V_SgNode);
7420 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i!=nodeList.end(); i++ )
7429SageInterface::setSourcePositionAtRootAndAllChildrenAsDefault(
SgNode *root)
7431 Rose_STL_Container <SgNode*> nodeList= NodeQuery::querySubTree(root,V_SgNode);
7432 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i!=nodeList.end(); i++ )
7434 setSourcePositionAsDefault(*i);
7444 Rose_STL_Container <SgNode*> nodeList = NodeQuery::querySubTree(root,V_SgNode);
7447 printf (
"In setSourcePositionAtRootAndAllChildren(): nodeList.size() = %" PRIuPTR
" \n",nodeList.size());
7450 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
7453 printf (
"In setSourcePositionAtRootAndAllChildren(): *i = %p = %s \n",*i,(*i)->class_name().c_str());
7472 printf (
"In SageInterface::setSourcePosition(): SourcePositionClassification scp = %s \n",
display(scp).c_str());
7477 case e_sourcePositionError:
7479 printf (
"Error: error value e_sourcePositionError in SageInterface::setSourcePosition() \n");
7486 printf (
"e_sourcePositionDefault in SageInterface::setSourcePosition() \n");
7489 if (locatedNode != NULL)
7491 setSourcePositionToDefault(locatedNode);
7496 printf (
"Error: can't call setSourcePosition() in mode e_sourcePositionDefault with non SgLocatedNode (node = %p = %s) \n",node,node->
class_name().c_str());
7505 printf (
"e_sourcePositionTransformation in SageInterface::setSourcePosition() \n");
7514 printf (
"e_sourcePositionCompilerGenerated in SageInterface::setSourcePosition() \n");
7516 printf (
"Sorry, not implemented \n");
7525 printf (
"e_sourcePositionNullPointers in SageInterface::setSourcePosition() \n");
7542 printf (
"e_sourcePositionFrontendConstruction in SageInterface::setSourcePosition() \n");
7545 if (locatedNode != NULL)
7548 setSourcePositionToDefault(locatedNode);
7553 SgPragma* pragma = isSgPragma(node);
7556 setSourcePositionToDefault(pragma);
7562 SgType* type = isSgType(node);
7570 if (functionParameterTypeList != NULL)
7576 printf (
"Error: can't call setSourcePosition() in mode e_sourcePositionFrontendConstruction with non SgLocatedNode (node = %p = %s) \n",node,node->
class_name().c_str());
7589 printf (
"Error: error value e_sourcePositionError in SageInterface::setSourcePosition() \n");
7595 printf (
"Error: default reached in SageInterface::setSourcePosition() \n");
7603 node->
get_file_info()->display(
"Leaving SageInterface::setSourcePosition()");
7610SageInterface::setSourcePositionForTransformation_memoryPool()
7615 printf (
"ERROR: In setSourcePositionForTransformation_memoryPool(): This seems like a very dangerous function to have, is it required? \n");
7618 VariantVector vv(V_SgNode);
7619 Rose_STL_Container<SgNode*> nodeList = NodeQuery::queryMemoryPool(vv);
7620 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++ )
7631 ROSE_ASSERT(project != NULL);
7634 ROSE_ASSERT(project->get_fileList().empty() ==
false);
7637 SgSourceFile* file = isSgSourceFile(project->get_fileList()[0]);
7638 SgGlobal* global = file->get_globalScope();
7641 SgFilePtrListPtr fileList = project->get_fileList();
7642 SgFilePtrList::const_iterator i= fileList->begin();
7644 SgGlobal* global = (*i)->get_globalScope();
7646 ROSE_ASSERT(global != NULL);
7667 if (declList.empty() ==
false)
7669 stmt = isSgStatement(declList.back());
7678 if (stmtList.empty() ==
false)
7680 stmt = stmtList.back();
7702 if (includingCompilerGenerated)
7706 if (declList.empty() ==
false)
7708 stmt = isSgStatement(declList.front());
7714 SgDeclarationStatementPtrList::iterator i=declList.begin();
7715 while (i != declList.end())
7742 if (includingCompilerGenerated)
7746 if (stmtList.empty() ==
false)
7748 stmt = stmtList.front();
7754 SgStatementPtrList::iterator i = stmtList.begin();
7755 while (i!=stmtList.end())
7790 SgDeclarationStatementPtrList::iterator i=declList.begin();
7791 while (i!=declList.end())
7815 SgStatementPtrList::iterator i=stmtList.begin();
7816 while (i!=stmtList.end())
7843 bool result =
false;
7846 if (isSgProgramHeaderStatement(n)) {
7851 if (isSgFunctionDeclaration(n) !=
nullptr) {
7852 bool either =
false;
7858 ROSE_ASSERT(stmnt !=
nullptr);
7865 ROSE_ASSERT(funcDefn !=
nullptr);
7866 if (funcDefn->get_name() ==
"main") {
7890 return isSgFunctionDeclaration(n);
7893 for (vector<SgNode*>::const_iterator i = children.begin();
7894 i != children.end(); ++i) {
7912 ROSE_ASSERT (scope != NULL);
7916 for (
size_t i = 0; i<stmt_list.size(); i++)
7920 if (isSgDeclarationStatement(cur_stmt))
7922 if (isSgPragmaDeclaration (cur_stmt))
7942 rt = n->copy (g_treeCopy);
7952 bool isC = TransformationSupport::getSourceFile(n)->get_outputLanguage() ==
SgFile::e_C_language;
7964#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
7966 for (std::vector<SgContinueStmt*>::iterator i = continues.begin(); i != continues.end(); ++i)
7971 LowLevelRewrite::replace(*i, make_unit_list( gotoStatement ) );
7977 printf (
"Not supported in mode: ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT (LowLevelRewrite::replace() is unavailable)");
7982#define DEBUG_TEMPLATE_ARG_EQUIVALENCE 0
7988#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
7989 printf (
"In templateArgumentEquivalence(): same pointer to template argument: returning true \n");
7996#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
7997 printf (
"In templateArgumentEquivalence(): different argumentType(): returning false \n");
8006 ROSE_ASSERT(arg1->
get_type() != NULL);
8007 ROSE_ASSERT(arg2->
get_type() != NULL);
8009#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8010 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::type_argument: checking for the same type: arg1->get_type() = %p = %s arg2->get_type() = %p = %s \n",
8018#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8019 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::type_argument: checking for the same type: returning true \n");
8032#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8033 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::type_argument: checking for the same type: pointers are different: returning typesAreEqual = %s \n",typesAreEqual ?
"true" :
"false");
8035 return typesAreEqual;
8043 if (expr1 == expr2) {
8044#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8045 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::nontype_argument: checking for the same expression: returning true \n");
8049#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8050 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::nontype_argument: same variant of expression: %s\n", expr1->
class_name().c_str());
8053 case V_SgLongIntVal: {
8057 case V_SgUnsignedLongVal:
8062 printf (
"FATAL: In templateArgumentEquivalence(): case SgTemplateArgument::nontype_argument: expression have the same variant %s but comparison is not NIY!\n", expr1->
class_name().c_str());
8067#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8068 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::nontype_argument: different variant of expression: returning false \n");
8076 if (arg1->get_templateDeclaration() == arg2->get_templateDeclaration())
8078#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8079 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::template_template_argument: checking for the same templateDeclaration: returning true \n");
8085 ROSE_ASSERT(!
"NIY: template template argument comparaison.");
8091 ROSE_ASSERT(!
"Try to compare template arguments of unknown type...");
8100 ROSE_ASSERT(!
"Try to compare template arguments of unknown type start_of_pack_expansion_argument");
8106 printf (
"Error: default case not handled! \n");
8114#define DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE 0
8118 if (list1.size() != list2.size())
8120#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8121 printf (
"In templateArgumentListEquivalence(): different list sizes: returning false \n");
8122 printf (
" --- list1.size() = %zu \n",list1.size());
8123 printf (
" --- list2.size() = %zu \n",list2.size());
8130#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8131 printf (
"In templateArgumentListEquivalence(): same list using STL equality operator: returning true \n");
8137 for (
size_t i = 0; i < list1.size(); i++)
8139#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8140 printf (
"In templateArgumentListEquivalence(): calling templateArgumentEquivalence() for i = %zu \n",i);
8145#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8146 printf (
"In templateArgumentListEquivalence(): calling templateArgumentEquivalence() for i = %zu --- returned false: returning false \n",i);
8152#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8153 printf (
"In templateArgumentListEquivalence(): reached base of function: returning true \n");
8173 SgName labelname =
"rose_label__";
8186 if (isSgNullExpression(f->get_increment()))
return;
8191 f->set_increment(ne);
8201 ROSE_ASSERT(condstmt);
8203 if (isSgNullStatement(condstmt))
return true;
8207 return isSgNullExpression(exprStmt->get_expression());
8216 bbStmts = initStmts;
8217 for (
size_t i = 0; i < bbStmts.size(); ++i) {
8218 bbStmts[i]->set_parent(bb);
8221 const bool testIsNull = hasEmptyCondition(f);
8231 Rose_STL_Container<SgNode*> fors = NodeQuery::querySubTree(top,
8233 for (
size_t i = 0; i < fors.size(); ++i) {
8241 Rose_STL_Container<SgNode*> allGotos = NodeQuery::querySubTree(scope, V_SgGotoStatement);
8243 vector<SgGotoStatement*> result;
8244 for (Rose_STL_Container<SgNode*>::const_iterator i = allGotos.begin(); i != allGotos.end(); ++i) {
8245 if (isSgGotoStatement(*i)->
get_label() == l) {
8246 result.push_back(isSgGotoStatement(*i));
8254 vector<SgReturnStmt*> SageInterface::findReturnStmts(
SgStatement* scope) {
8257 Rose_STL_Container<SgNode*> returns = NodeQuery::querySubTree(scope, V_SgReturnStmt);
8259 vector<SgReturnStmt*> result;
8260 for (Rose_STL_Container<SgNode*>::const_iterator i = returns.begin(); i != returns.end(); ++i) {
8261 result.push_back(isSgReturnStmt(*i));
8267static void getSwitchCasesHelper(
SgStatement* top, vector<SgStatement*>& result) {
8269 if (isSgSwitchStatement(top))
return;
8270 if (isSgCaseOptionStmt(top) || isSgDefaultOptionStmt(top)) {
8271 result.push_back(top);
8274 for (
unsigned int i = 0; i < children.size(); ++i) {
8275 if (isSgStatement(children[i])) {
8276 getSwitchCasesHelper(isSgStatement(children[i]), result);
8282 vector<SgStatement*> result;
8283 getSwitchCasesHelper(sw->
get_body(), result);
8313 if (
const SgSymbol* symbol = isSgSymbol(astNode))
8314 return symbol->get_scope();
8319 else if (
const SgQualifiedName* qualifiedName = isSgQualifiedName(astNode))
8323 const SgNode* parentNode = astNode;
8324 while (!isSgScopeStatement(parentNode))
8329 if (isSgFunctionParameterList(parentNode) || isSgCtorInitializerList(parentNode))
8332 ROSE_ASSERT(funcDeclaration != NULL);
8334 if (funcDeclaration != NULL)
8336 return funcDeclaration->get_definition();
8341 if (parentNode == NULL)
8349 if ( isSgScopeStatement(parentNode) == NULL &&
8350 dynamic_cast<const SgType*
>(parentNode) == NULL &&
8351 dynamic_cast<const SgSymbol*
>(parentNode) == NULL )
8353 printf (
"Error: In SageInterface::getScope(): could not trace back to SgScopeStatement node \n");
8358 if (
dynamic_cast<const SgType*
>(parentNode) != NULL ||
dynamic_cast<const SgSymbol*
>(parentNode) != NULL )
8360 printf (
"Error: can't locate an associated SgStatement from astNode = %p = %s parentNode = %p = %s \n",astNode,astNode->
class_name().c_str(),parentNode,parentNode->
class_name().c_str());
8368 ROSE_ASSERT (scopeStatement != NULL);
8371 if (isSgScopeStatement(astNode))
8372 if (isSgScopeStatement(parentNode))
8374 ROSE_ASSERT (astNode == parentNode);
8401 printf (
"In getVarSymFromName(): name->get_name() = %s \n",name->get_name().str());
8404 ROSE_ASSERT (scope != NULL);
8406 printf (
"In getVarSymFromName(): name->get_name() = %s scope = %p = %s \n",name->get_name().str(),scope,scope->
class_name().c_str());
8408 v_sym = scope->lookup_var_symbol (name->get_name());
8417 if (decl_scope != NULL)
8418 v_sym = decl_scope->lookup_var_symbol (name->get_name());
8421 cerr <<
"\t\t*** WARNING: Can't seem to find a symbol for '"
8422 << name->get_name ().str ()
8452getVarSym_const (
const SgNode* n)
8458 v_sym = isSgVarRefExp (n)->get_symbol ();
8460 case V_SgInitializedName:
8461 v_sym = getVarSymFromName_const (isSgInitializedName (n));
8487 if (!decl)
return 0;
8488 const SgInitializedNamePtrList& names = decl->
get_variables ();
8489 if (names.begin () != names.end ())
8492 return getVarSym_const (name);
8511 if (names.begin () != names.end ())
8512 return *(names.begin ());
8518static void findBreakStmtsHelper(
SgStatement* code,
const std::string& fortranLabel,
bool inOutermostBody, vector<SgBreakStmt*>& breakStmts) {
8519 if (isSgWhileStmt(code) || isSgDoWhileStmt(code) || isSgForStatement(code) || isSgSwitchStatement(code)) {
8520 if (fortranLabel ==
"") {
8525 inOutermostBody =
false;
8528 if (isSgBreakStmt(code)) {
8530 bool breakMatchesThisConstruct =
false;
8531 if (bs->get_do_string_label() ==
"") {
8533 breakMatchesThisConstruct = inOutermostBody;
8535 breakMatchesThisConstruct = (fortranLabel == bs->get_do_string_label());
8537 if (breakMatchesThisConstruct) {
8538 breakStmts.push_back(bs);
8543 for (
unsigned int i = 0; i < children.size(); ++i) {
8544 if (isSgStatement(children[i])) {
8545 findBreakStmtsHelper(isSgStatement(children[i]), fortranLabel, inOutermostBody, breakStmts);
8553 vector<SgBreakStmt*> result;
8554 findBreakStmtsHelper(code, fortranLabel,
true, result);
8559static void findContinueStmtsHelper(
SgStatement* code,
const std::string& fortranLabel,
bool inOutermostBody, vector<SgContinueStmt*>& continueStmts) {
8560 if (isSgWhileStmt(code) || isSgDoWhileStmt(code) || isSgForStatement(code)) {
8561 if (fortranLabel ==
"") {
8566 inOutermostBody =
false;
8569 if (isSgContinueStmt(code)) {
8571 bool continueMatchesThisConstruct =
false;
8572 if (cs->get_do_string_label() ==
"") {
8574 continueMatchesThisConstruct = inOutermostBody;
8576 continueMatchesThisConstruct = (fortranLabel == cs->get_do_string_label());
8578 if (continueMatchesThisConstruct) {
8579 continueStmts.push_back(cs);
8584 for (
unsigned int i = 0; i < children.size(); ++i) {
8586 if (stmnt != NULL) {
8587 findContinueStmtsHelper(stmnt, fortranLabel, inOutermostBody, continueStmts);
8595 vector<SgContinueStmt*> result;
8596 findContinueStmtsHelper(code, fortranLabel,
true, result);
8607 std::cout <<
"Starting getInitializerOfExpression on 0x" << std::hex << (int)n <<
", which has type " << n->
sage_class_name() << std::endl;
8609 while (!isSgInitializer(n)) {
8612 std::cout <<
"Continuing getInitializerOfExpression on 0x" << std::hex << (int)n;
8614 std::cout << std::endl;
8618 return isSgInitializer(n);
8626 std::vector<SgVariableSymbol*> symbols;
8628 virtual void visit(
SgNode* n) {
8629 if (isSgVarRefExp(n))
8630 symbols.push_back(isSgVarRefExp(n)->get_symbol());
8634 GetSymbolsUsedInExpressionVisitor vis;
8635 vis.traverse(expr, preorder);
8642 return getEnclosingNode<SgSourceFile>(n, includingSelf);
8648 return findDeclarationStatement<SgFunctionDeclaration> (root, name, scope, isDefining);
8659 return getEnclosingNode<SgFunctionDefinition>(n, includingSelf);
8665 return getEnclosingNode<SgFunctionDeclaration>(astNode, includingSelf);
8675 return getEnclosingNode<SgGlobal>(astNode,
true );
8680 return getEnclosingNode<SgClassDefinition>(astNode, includingSelf);
8688 return getEnclosingNode<SgClassDeclaration>(astNode,
true);
8693 return getEnclosingNode<SgExprListExp>(astNode, includingSelf);
8699 bool returnValue =
false;
8705 virtual void visit(
SgNode* n)
8707 if (n == expression_target)
8713 Visitor(
SgExpression* expr) : expression_target(expr), in_subtree(
false) {}
8716 Visitor traversal(exp);
8718 traversal.traverse(subtree, preorder);
8720 returnValue = traversal.in_subtree;
8734 ROSE_ASSERT (functionCallExp != NULL);
8736 SgExpression* expression = functionCallExp->get_function();
8737 ROSE_ASSERT (expression != NULL);
8741 SgDotExp* dotExp = isSgDotExp(expression);
8744 ROSE_ASSERT (dotExp != NULL);
8747 ROSE_ASSERT (rhsOperand != NULL);
8752 if (memberFunctionRefExp != NULL)
8759 if (functionReferenceExp != NULL)
8764 SgArrowExp* arrowExp = isSgArrowExp(expression);
8765 if ( arrowExp != NULL)
8767 ROSE_ASSERT (arrowExp != NULL);
8770 ROSE_ASSERT (rhsOperand != NULL);
8775 if (memberFunctionRefExp != NULL)
8781 return returnDeclaration;
8786std::list<SgClassType*>
8791#define DEBUG_DATA_MEMBER_TYPE_CHAIN 0
8797 ROSE_ASSERT(varRefExp != NULL || memberFunctionRefExp != NULL);
8799 std::list<SgClassType*> returnTypeChain;
8802 std::list<SgClassType*> classChain;
8807 if (varRefExp != NULL)
8813 ROSE_ASSERT(memberFunctionRefExp != NULL);
8818 ROSE_ASSERT(parent != NULL);
8820#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8821 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): parent = %p = %s \n",parent,parent->
class_name().c_str());
8825 SgDotExp* dotExp = isSgDotExp(parent);
8829 if (arrowExp != NULL)
8831#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8832 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): Found an arrow expression \n");
8834 binaryOperator = arrowExp;
8839#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8840 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): Found an dot expression \n");
8842 binaryOperator = dotExp;
8846 if (binaryOperator != NULL)
8849 ROSE_ASSERT(lhs != NULL);
8851#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8852 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs = %p = %s \n",lhs,lhs->
class_name().c_str());
8858 while (isSgCastExp(temp_lhs) != NULL)
8860 cast = isSgCastExp(temp_lhs);
8861 ROSE_ASSERT(cast != NULL);
8864#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8865 printf (
"Top of loop: processing cast = %p temp_lhs = %p = %s \n",cast,temp_lhs,temp_lhs->
class_name().c_str());
8867 ROSE_ASSERT(cast->
get_type() != NULL);
8869 if (classType == NULL)
8871#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8872 printf (
" --- looking for base type: In SageInterface::getClassTypeChainForDataMemberReference(): classType == NULL: cast->get_type() = %p = %s \n",
8875 SgType* baseType = cast->
get_type()->
stripType(SgType::STRIP_POINTER_TYPE | SgType::STRIP_MODIFIER_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE | SgType::STRIP_TYPEDEF_TYPE);
8876 ROSE_ASSERT(baseType != NULL);
8878#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8879 printf (
" --- baseType = %p = %s name = %s \n",baseType,baseType->
class_name().c_str(),
get_name(baseType).c_str());
8881 classType = isSgClassType(baseType);
8885 ROSE_ASSERT(temp_lhs != NULL);
8887#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8888 printf (
" --- temp_lhs = %p = %s name = %s \n",temp_lhs,temp_lhs->
class_name().c_str(),
get_name(temp_lhs).c_str());
8894 if (classType != NULL)
8896 classChain.push_front(classType);
8900 if (classType != NULL)
8911 ROSE_ASSERT(target_type != NULL);
8912 SgClassType* target_classType = isSgClassType(target_type);
8914 if (target_classType != NULL)
8917 ROSE_ASSERT(target_declaration != NULL);
8918 SgClassDeclaration* target_classDeclaration = isSgClassDeclaration(target_declaration);
8919 ROSE_ASSERT(target_classDeclaration != NULL);
8921 ROSE_ASSERT(target_definingClassDeclaration != NULL);
8922 SgScopeStatement* target_scope = target_definingClassDeclaration->get_definition();
8923 ROSE_ASSERT(target_scope != NULL);
8925#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8926 printf (
"target_classDeclaration = %p = %s name = %s target_scope = %p = %s \n",
8927 target_classDeclaration,target_classDeclaration->
class_name().c_str(),target_classDeclaration->get_name().str(),target_scope,target_scope->
class_name().c_str());
8930 ROSE_ASSERT(source_classType != NULL);
8932 ROSE_ASSERT(source_declaration != NULL);
8933 SgClassDeclaration* source_classDeclaration = isSgClassDeclaration(source_declaration);
8934 ROSE_ASSERT(source_classDeclaration != NULL);
8936 ROSE_ASSERT(source_definingClassDeclaration != NULL);
8937 SgScopeStatement* source_scope = source_definingClassDeclaration->get_definition();
8938 ROSE_ASSERT(source_scope != NULL);
8940#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8941 printf (
"source_classDeclaration = %p = %s name = %s source_scope = %p = %s \n",
8942 source_classDeclaration,source_classDeclaration->
class_name().c_str(),source_classDeclaration->get_name().str(),source_scope,source_scope->
class_name().c_str());
8945 while (tmp_scope != NULL && tmp_scope != target_scope)
8947#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8948 printf (
"tmp_scope = %p = %s \n",tmp_scope,tmp_scope->
class_name().c_str());
8951 ROSE_ASSERT(tmp_classDefinition != NULL);
8953 ROSE_ASSERT(tmp_classDeclaration != NULL);
8955#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8956 SgName scope_name = tmp_classDeclaration->get_name();
8957 printf (
"scope_name = %s \n",scope_name.str());
8959 SgClassType* tmp_classType = tmp_classDeclaration->get_type();
8960 ROSE_ASSERT(tmp_classType != NULL);
8963 classChain.push_front(tmp_classType);
8967 if (isSgGlobal(tmp_scope) != NULL)
8976 printf (
"In loop processing cast: target_type = %p = %s \n",target_type,target_type->
class_name().c_str());
8982#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8983 printf (
"Bottom of loop: processing cast = %p temp_lhs = %p = %s \n",cast,temp_lhs,temp_lhs->
class_name().c_str());
8989 ROSE_ASSERT(temp_lhs != NULL);
8991#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8992 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): temp_lhs = %p = %s \n",temp_lhs,temp_lhs->
class_name().c_str());
8995 SgVarRefExp* derivedClassVarRefExp = isSgVarRefExp(temp_lhs);
8996 if (derivedClassVarRefExp != NULL)
8998 SgVariableSymbol* derivedClassVariableSymbol = derivedClassVarRefExp->get_symbol();
8999 ROSE_ASSERT(derivedClassVariableSymbol != NULL);
9001 SgName derivedClassVariableName = derivedClassVariableSymbol->
get_name();
9003#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9004 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): derivedClassVariableName = %s \n",derivedClassVariableName.str());
9008 ROSE_ASSERT(type != NULL);
9010#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9011 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs type = %p = %s \n",type,type->
class_name().c_str());
9015 SgType* stripped_type = type->
stripType(SgType::STRIP_POINTER_TYPE|SgType::STRIP_ARRAY_TYPE|SgType::STRIP_REFERENCE_TYPE|SgType::STRIP_RVALUE_REFERENCE_TYPE|SgType::STRIP_MODIFIER_TYPE);
9017#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9018 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs stripped_type = %p = %s \n",stripped_type,stripped_type->
class_name().c_str());
9022 SgClassType* classType = isSgClassType(stripped_type);
9025 if (classType != NULL)
9027#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9028 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs classType = %p = %s \n",classType,classType->
class_name().c_str());
9029 SgClassDeclaration* classDeclaration = isSgClassDeclaration(classType->get_declaration());
9030 ROSE_ASSERT(classDeclaration != NULL);
9031 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs classDeclaration = %p = %s name = %s \n",
9032 classDeclaration,classDeclaration->
class_name().c_str(),classDeclaration->get_name().str());
9037 classChain.push_front(classType);
9041#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9042 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs stripped_type is not a SgClassType \n");
9048#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9049 printf (
"Need to support alternative to SgVarRefExp: temp_lhs = %p = %s \n",temp_lhs,temp_lhs->
class_name().c_str());
9052 ROSE_ASSERT(type != NULL);
9054#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9055 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs type = %p = %s name = %s \n",type,type->
class_name().c_str(),
get_name(type).c_str());
9059 SgType* stripped_type = type->
stripType(SgType::STRIP_POINTER_TYPE|SgType::STRIP_ARRAY_TYPE|SgType::STRIP_REFERENCE_TYPE|SgType::STRIP_RVALUE_REFERENCE_TYPE|SgType::STRIP_MODIFIER_TYPE);
9061#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9062 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): stripped_type = %p = %s name = %s \n",stripped_type,stripped_type->
class_name().c_str(),
get_name(stripped_type).c_str());
9065 SgClassType* classType = isSgClassType(stripped_type);
9067 if (classType != NULL)
9069 classChain.push_front(classType);
9073#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9074 printf (
"classChain.size() = %zu \n",classChain.size());
9075 std::list<SgClassType*>::iterator iter = classChain.begin();
9076 while(iter != classChain.end())
9078 printf (
" --- *iter = %p = %s name = %s \n",*iter,(*iter)->class_name().c_str(),(*iter)->get_name().str());
9091 if (varRefExp != NULL)
9093 ROSE_ASSERT(varRefExp != NULL);
9094 ROSE_ASSERT(memberFunctionRefExp == NULL);
9096 referenceSymbol = varRefExp->get_symbol();
9100 ROSE_ASSERT(varRefExp == NULL);
9101 ROSE_ASSERT(memberFunctionRefExp != NULL);
9103 referenceSymbol = memberFunctionRefExp->get_symbol();
9105 ROSE_ASSERT(referenceSymbol != NULL);
9108#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9109 printf (
"referenceSymbol = %p = %s \n",referenceSymbol,referenceSymbol->
class_name().c_str());
9110 printf (
"symbolName = %s \n",symbolName.str());
9115 if (functionSymbol != NULL)
9120 if (templateInstantiationMemberFunctionDeclaration != NULL)
9122#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9123 printf (
"This is a template name, we want the name without template arguments \n");
9124 printf (
"templateInstantiationMemberFunctionDeclaration = %p \n",templateInstantiationMemberFunctionDeclaration);
9125 printf (
"templateInstantiationMemberFunctionDeclaration->get_name() = %s \n",templateInstantiationMemberFunctionDeclaration->get_name().str());
9132 isSgTemplateMemberFunctionDeclaration(templateInstantiationMemberFunctionDeclaration->
get_templateDeclaration());
9133 if (templateMemberFunctionDeclaration != NULL)
9135#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9136 printf (
"templateMemberFunctionDeclaration = %p \n",templateMemberFunctionDeclaration);
9137 printf (
"templateMemberFunctionDeclaration->get_name() = %s \n",templateMemberFunctionDeclaration->get_name().str());
9140 symbolName = templateMemberFunctionDeclaration->get_name();
9144#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9145 printf (
"templateMemberFunctionDeclaration == NULL: template declaration not available from template instantiation (rare, I think) \n");
9149 printf (
"Exiting as a test! \n");
9157 ROSE_ASSERT(declarationStatement != NULL);
9158#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9159 printf (
"functionSymbol != NULL: but declaration is not a member function: declarationStatement = %p = %s \n",declarationStatement,declarationStatement->
class_name().c_str());
9166 if (variableSymbol != NULL)
9172#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9173 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): NOTE: referenceSymbol is not a SgFunctionSymbol or SgVariableSymbol \n");
9176 printf (
"Exiting as a test! \n");
9183#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9184 printf (
"symbolName = %s \n",symbolName.str());
9193 std::list<SgClassType*> saveList;
9195#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9196 printf (
"classChain.size() = %zu \n",classChain.size());
9199 std::list<SgClassType*>::iterator i = classChain.begin();
9200 std::list<SgClassType*>::iterator save_iter = i;
9206 bool ambiguityDetectedSoSaveWholeChain =
false;
9208 while(i != classChain.end())
9210#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9211 printf (
"******** TOP OF WHILE LOOP ******** \n");
9212 printf (
" --- *i = %p = %s name = %s \n",*i,(*i)->class_name().c_str(),(*i)->get_name().str());
9213 printf (
" --- --- referenceSymbol = %p = %s \n",referenceSymbol,referenceSymbol->
class_name().c_str());
9215 bool ambiguityDetected =
false;
9218 ROSE_ASSERT(declarationStatement != NULL);
9220 if (definingDeclarationStatement != NULL)
9222 SgClassDeclaration* classDeclaration = isSgClassDeclaration(definingDeclarationStatement);
9223 ROSE_ASSERT(classDeclaration != NULL);
9226#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9227 printf (
" --- classDeclaration = %p = %s name = %s \n",classDeclaration,classDeclaration->
class_name().c_str(),classDeclaration->get_name().str());
9228 printf (
" --- classDefinition = %p = %s \n",classDefinition,classDefinition->
class_name().c_str());
9231 ambiguityDetected = classDefinition->hasAmbiguity(symbolName,referenceSymbol);
9233#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9234 printf (
" --- ambiguityDetected = %s \n",ambiguityDetected ?
"true" :
"false");
9239 if (ambiguityDetected ==
true || ambiguityDetectedSoSaveWholeChain ==
true)
9241 ambiguityDetectedSoSaveWholeChain =
true;
9243 if (save_iter != classChain.end())
9245#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9246 printf (
" --- add to saveList: *save_iter = %p \n",*save_iter);
9248 saveList.push_back(*save_iter);
9252#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9253 printf (
" --- save_iter == classChain.end() \n");
9258#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9259 printf (
"******** BOTTOM OF WHILE LOOP ******** \n");
9269#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9270 printf (
"saveList.size() = %zu \n",saveList.size());
9271 std::list<SgClassType*>::iterator saveList_iterator = saveList.begin();
9272 while (saveList_iterator != saveList.end())
9274 printf (
" --- *saveList_iterator = %p = %s name = %s \n",*saveList_iterator,(*saveList_iterator)->class_name().c_str(),(*saveList_iterator)->get_name().str());
9276 saveList_iterator++;
9280 returnTypeChain = saveList;
9285 return returnTypeChain;
9295#define DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE 0
9297 ROSE_ASSERT(memberFunctionRefExp != NULL);
9299 bool returnValue =
false;
9305 SgDotExp* dotExp = isSgDotExp(parent);
9312 if (arrowExp != NULL || dotExp != NULL || addressOfOp != NULL)
9316 ROSE_ASSERT(symbol != NULL);
9319 ROSE_ASSERT(functionDeclaration != NULL);
9322 if (functionDeclaration != NULL)
9324 bool isStatic = functionDeclaration->get_declarationModifier().get_storageModifier().
isStatic();
9325#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9326 printf (
"isStatic = %s \n",
isStatic ?
"true" :
"false");
9331 ROSE_ASSERT(scope != NULL);
9334 if (classDefinition != NULL)
9342#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9343 printf (
"In SageInterface::isMemberFunctionMemberReference(): memberFunctionRefExp is not associated with variableDeclaration (could not compute if it is static data member) \n");
9349#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9350 printf (
"In SageInterface::isMemberFunctionMemberReference(): memberFunctionRefExp parent is not a is not SgArrowExp or SgDotExp expression \n");
9354#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9355 printf (
"Leaving SageInterface::isMemberFunctionMemberReference(): returnValue = %s \n",returnValue ?
"true" :
"false");
9374#define DEBUG_IS_DATA_MEMBER_REFERENCE 0
9376 ROSE_ASSERT(varRefExp != NULL);
9378 bool returnValue =
false;
9384 SgDotExp* dotExp = isSgDotExp(parent);
9388 if (arrowExp != NULL || dotExp != NULL || addressOfOp != NULL)
9390 if (arrowExp != NULL)
9394 ROSE_ASSERT(parentOfArrowExp != NULL);
9395 SgSizeOfOp* sizeOfOp = isSgSizeOfOp(parentOfArrowExp);
9396 if (sizeOfOp != NULL && sizeOfOp->get_is_objectless_nonstatic_data_member_reference() ==
true)
9399#if DEBUG_IS_DATA_MEMBER_REFERENCE
9400 printf (
"In SageInterface::isDataMemberReference(): Found case of expression used in sizeof with objectless_nonstatic_data_member_reference \n");
9407 ROSE_ASSERT(symbol != NULL);
9410 ROSE_ASSERT(initializedName != NULL);
9414 if (variableDeclaration != NULL)
9416 bool isStatic = variableDeclaration->get_declarationModifier().get_storageModifier().
isStatic();
9420 ROSE_ASSERT(scope != NULL);
9423 if (classDefinition != NULL)
9431#if DEBUG_IS_DATA_MEMBER_REFERENCE
9432 printf (
"In SageInterface::isDataMemberReference(): varRefExp is not associated with variableDeclaration (could not compute if it is static data member) \n");
9438#if DEBUG_IS_DATA_MEMBER_REFERENCE
9439 printf (
"In SageInterface::isDataMemberReference(): varRefExp parent is not a is not SgArrowExp or SgDotExp expression \n");
9443#if DEBUG_IS_DATA_MEMBER_REFERENCE
9444 printf (
"Leaving SageInterface::isDataMemberReference(): returnValue = %s \n",returnValue ?
"true" :
"false");
9456 ROSE_ASSERT(varRefExp != NULL);
9458 bool returnValue =
false;
9462 if (addressOfOp != NULL)
9480 ROSE_ASSERT(varRefExp != NULL || memberFunctionRefExp != NULL);
9484 ROSE_ASSERT(refExp != NULL);
9486 bool returnValue =
false;
9491 if (addressOfOp != NULL)
9509 ROSE_ASSERT (astNode != NULL);
9513 ROSE_ASSERT (isSgProject(astNode) == NULL);
9515 SgNode* previous_parent = NULL;
9516 SgNode* previous_previous_parent = NULL;
9518 SgNode* parent = astNode;
9520 while ( (parent != NULL) && (isSgFile(parent) == NULL) && isSgJavaPackageDeclaration(parent) == NULL)
9523 printf (
"In getEnclosingFileNode(): parent = %p = %s \n",parent,parent->
class_name().c_str());
9525 previous_previous_parent = previous_parent;
9526 previous_parent = parent;
9531 if (previous_previous_parent != NULL && previous_parent != NULL && isSgJavaPackageDeclaration(parent) != NULL)
9535 printf (
"parent = %p = %s \n",parent,parent->
class_name().c_str());
9536 printf (
"previous_parent = %p = %s \n",previous_parent,previous_parent->
class_name().c_str());
9537 printf (
"previous_previous_parent = %p = %s \n",previous_previous_parent,previous_previous_parent->
class_name().c_str());
9539 SgClassDeclaration* classDeclaration = isSgClassDeclaration(previous_previous_parent);
9540 if (classDeclaration != NULL)
9543 printf (
"Class name = %p = %s = %s \n",classDeclaration,classDeclaration->
class_name().c_str(),classDeclaration->get_name().str());
9548 SgProject* project = TransformationSupport::getProject(parent);
9549 ROSE_ASSERT(project != NULL);
9550 SgFileList* fileList = project->get_fileList_ptr();
9551 ROSE_ASSERT(fileList != NULL);
9552 SgFilePtrList & vectorFile = fileList->get_listOfFiles();
9554 printf (
"Output list of files: \n");
9556 SgFilePtrList::iterator i = vectorFile.begin();
9557 while (i != vectorFile.end())
9560 ROSE_ASSERT(file != NULL);
9562 printf (
" --- filename = %s \n",file->
getFileName().c_str());
9565 string filenameWithoutPath = file->get_sourceFileNameWithoutPath();
9566 string classname = classDeclaration->get_name();
9567 string matchingfilename = classname +
".java";
9569 printf (
" --- --- filename = %s \n",filename.c_str());
9570 printf (
" --- --- filenameWithoutPath = %s \n",filenameWithoutPath.c_str());
9571 printf (
" --- --- classname = %s \n",classname.c_str());
9572 printf (
" --- --- matchingfilename = %s \n",matchingfilename.c_str());
9574 if (filenameWithoutPath == matchingfilename)
9577 printf (
" return file = %p \n",file);
9593 SgSourceFile *sourcefile = isSgSourceFile(attribute->getNode());
9594 ROSE_ASSERT(sourcefile != NULL);
9603 if (previous_parent == NULL && isSgJavaPackageDeclaration(parent) != NULL)
9606 ROSE_ASSERT(isSgJavaPackageDeclaration(astNode) != NULL);
9611 if (previous_previous_parent == NULL && isSgJavaPackageDeclaration(parent) != NULL)
9614 ROSE_ASSERT(isSgClassDefinition(astNode) != NULL);
9625 if (parent ==
nullptr)
9631 return isSgFile(parent);
9637 std::set<SgNode*> specific;
9638 std::set<SgNode*> non_specific;
9640 static void recursive_collect(
SgNode* node , std::set<SgNode *> & collection ) {
9642 if (node == NULL || !collection.insert(node).second)
return;
9645 for (std::vector<std::pair<SgNode*, std::string> >::iterator i = data_members.begin(); i != data_members.end(); ++i) {
9646 recursive_collect(i->first, collection);
9653 if (fileInfo != NULL) {
9654 if (fileInfo->isFrontendSpecific()) {
9656 recursive_collect(n, specific);
9658 non_specific.insert(n);
9659 recursive_collect(n, non_specific);
9662 fileInfo = isSg_File_Info(n);
9663 if (fileInfo != NULL) {
9664 if (fileInfo->isFrontendSpecific()) {
9667 non_specific.insert(n);
9673 std::set<SgNode*> apply() {
9674 traverseMemoryPool();
9676 std::set<SgNode*> result;
9678 std::set_difference(
9679 specific.begin(), specific.end(),
9680 non_specific.begin(), non_specific.end(),
9681 std::insert_iterator<set<SgNode*> >(result, result.begin())
9688 FrontendSpecificTraversal fst;
9701 void visit(
SgNode *astNode)
9703 ROSE_ASSERT(astNode != NULL);
9705 if (file_info != NULL)
9709 printf (
"Found shared node: astNode = %p = %s \n",astNode,astNode->
class_name().c_str());
9715 OutputSharedNodesTraversal tt;
9716 tt.traverse(node,preorder);
9724 while (n && !isSgStatement(n)) n = n->
get_parent();
9725 return isSgStatement(n);
9734SageInterface::DeferredTransformation::DeferredTransformation()
9735 : deferredTransformationKind(e_default),
9736 statementToRemove(NULL),
9737 statementToAdd(NULL),
9738 class_definition(NULL),
9739 target_class_member(NULL),
9740 new_function_prototype(NULL),
9742 locationToOverwriteWithTransformation(NULL),
9743 transformationToOverwriteFirstStatementInInterval(NULL),
9744 blockOfStatementsToOutline(NULL)
9748 printf (
"In SageInterface::DeferredTransformation default constructor called \n");
9756SageInterface::DeferredTransformation::DeferredTransformation(
9760 : deferredTransformationKind(e_outliner),
9761 statementToRemove(NULL),
9762 statementToAdd(NULL),
9763 class_definition(input_class_definition),
9764 target_class_member(input_target_class_member),
9765 new_function_prototype(input_new_function_prototype),
9767 locationToOverwriteWithTransformation(NULL),
9768 transformationToOverwriteFirstStatementInInterval(NULL),
9769 blockOfStatementsToOutline(NULL)
9773 printf (
"In SageInterface::DeferredTransformation constructor for outliner called \n");
9781 printf (
"In SageInterface::DeferredTransformation constructor for replaceDefiningFunctionDeclarationWithFunctionPrototype called \n");
9787 X.deferredTransformationKind = e_replaceDefiningFunctionDeclarationWithFunctionPrototype;
9788 X.statementToRemove = functionDeclaration;
9789 X.statementToAdd = NULL;
9790 X.class_definition = NULL;
9791 X.target_class_member = NULL;
9792 X.new_function_prototype = NULL;
9795 X.locationToOverwriteWithTransformation = NULL;
9796 X.transformationToOverwriteFirstStatementInInterval = NULL;
9797 X.blockOfStatementsToOutline = NULL;
9803SageInterface::DeferredTransformation::replaceStatement(
SgStatement* oldStmt,
SgStatement* newStmt,
bool )
9806 printf (
"In SageInterface::DeferredTransformation constructor for replaceStatement called \n");
9812 X.deferredTransformationKind = e_replaceStatement;
9813 X.statementToRemove = oldStmt;
9814 X.statementToAdd = newStmt;
9815 X.class_definition = NULL;
9816 X.target_class_member = NULL;
9817 X.new_function_prototype = NULL;
9820 X.locationToOverwriteWithTransformation = NULL;
9821 X.transformationToOverwriteFirstStatementInInterval = NULL;
9822 X.blockOfStatementsToOutline = NULL;
9827SageInterface::DeferredTransformation::DeferredTransformation (
const DeferredTransformation& X)
9829 : deferredTransformationKind(X.deferredTransformationKind),
9830 statementToRemove(X.statementToRemove),
9831 statementToAdd(X.StatementToAdd),
9832 class_definition(X.class_definition),
9833 target_class_member(X.target_class_member),
9834 new_function_prototype(X.new_function_prototype),
9835 targetClasses(X.targetClasses),
9836 targetFriends(X.targetFriends)
9842 printf (
"In SageInterface::DeferredTransformation copy constructor called \n");
9852 printf (
"Inside of SageInterface::DeferredTransformation::operator= (const DeferredTransformation& X) \n");
9857 targetFriends = X.targetFriends;
9858 targetClasses = X.targetClasses;
9864 transformationLabel = X.transformationLabel;
9867 deferredTransformationKind = X.deferredTransformationKind;
9868 statementToRemove = X.statementToRemove;
9869 statementToAdd = X.statementToAdd;
9871 class_definition = X.class_definition;
9872 target_class_member = X.target_class_member;
9873 new_function_prototype = X.new_function_prototype;
9874 targetClasses = X.targetClasses;
9875 targetFriends = X.targetFriends;
9878 statementInterval = X.statementInterval;
9879 locationToOverwriteWithTransformation = X.locationToOverwriteWithTransformation;
9880 transformationToOverwriteFirstStatementInInterval = X.transformationToOverwriteFirstStatementInInterval;
9883 blockOfStatementsToOutline = X.blockOfStatementsToOutline;
9894std::string SageInterface::DeferredTransformation::outputDeferredTransformationKind(
const TransformationKind & kind)
9896 string returnValue =
"uninitialized";
9899 case e_error: returnValue =
"e_error";
break;
9900 case e_default: returnValue =
"e_default";
break;
9901 case e_outliner: returnValue =
"e_outliner";
break;
9902 case e_replaceStatement: returnValue =
"e_replaceStatement";
break;
9903 case e_removeStatement: returnValue =
"e_removeStatement";
break;
9904 case e_replaceDefiningFunctionDeclarationWithFunctionPrototype: returnValue =
"e_replaceDefiningFunctionDeclarationWithFunctionPrototype";
break;
9905 case e_last: returnValue =
"e_last";
break;
9908 printf (
"Error: SageInterface::DeferredTransformation::get_deferredTransformationKind_string(): default reached \n");
9916void SageInterface::DeferredTransformation::display ( std::string label )
const
9918 printf (
"SageInterface::DeferredTransformation::display(): label = %s \n",label.c_str());
9923 printf (
" --- transformationLabel = %s \n",transformationLabel.c_str());
9925 printf (
" --- deferredTransformationKind = %s \n",outputDeferredTransformationKind(deferredTransformationKind).c_str());
9926 if (statementToRemove != NULL)
9928 printf (
" --- statementToRemove = %p = %s name = %s \n",statementToRemove,statementToRemove->class_name().c_str(),
get_name(statementToRemove).c_str());
9932 printf (
" --- statementToRemove == NULL \n");
9935 if (statementToAdd != NULL)
9937 printf (
" --- statementToAdd = %p = %s name = %s \n",statementToAdd,statementToAdd->class_name().c_str(),
get_name(statementToAdd).c_str());
9941 printf (
" --- statementToAdd == NULL \n");
9944 if (class_definition != NULL)
9947 printf (
" --- class_definition = %p \n",class_definition);
9950 if (target_class_member != NULL)
9952 printf (
" --- target_class_member = %p = %s name = %s \n",target_class_member,target_class_member->class_name().c_str(),
get_name(target_class_member).c_str());
9955 if (new_function_prototype != NULL)
9957 printf (
" --- new_function_prototype = %p = %s name = %s \n",new_function_prototype,new_function_prototype->class_name().c_str(),
get_name(new_function_prototype).c_str());
9961 if (locationToOverwriteWithTransformation != NULL)
9965 printf (
" --- locationToOverwriteWithTransformation = %p \n",locationToOverwriteWithTransformation);
9969 if (transformationToOverwriteFirstStatementInInterval != NULL)
9973 printf (
" --- transformationToOverwriteFirstStatementInInterval = %p \n",transformationToOverwriteFirstStatementInInterval);
9977 if (blockOfStatementsToOutline != NULL)
9979 printf (
" --- blockOfStatementsToOutline = %p \n",blockOfStatementsToOutline);
9982 printf (
"targetClasses.size() = %zu \n",targetClasses.size());
9983 printf (
"targetFriends.size() = %zu \n",targetFriends.size());
9986 printf (
"statementInterval.size() = %zu \n",statementInterval.size());
9996#define REMOVE_STATEMENT_DEBUG 0
10001#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
10012 ASSERT_not_null(targetStmt);
10020 bool isRemovable = (parentStatement != NULL) ? LowLevelRewrite::isRemovableStatement(targetStmt) :
false;
10022#if REMOVE_STATEMENT_DEBUG || 0
10023 printf (
"In SageInterface::removeStatement(): parentStatement = %p = %s remove targetStatement = %p = %s (isRemovable = %s) \n",
10024 parentStatement,parentStatement->
class_name().c_str(),targetStmt,targetStmt->
class_name().c_str(),isRemovable ?
"true" :
"false");
10027 if (isRemovable ==
true)
10034 if (autoRelocatePreprocessingInfo ==
true)
10044 if (comments !=
nullptr && isSgBasicBlock(targetStmt) ==
nullptr )
10046 vector<int> captureList;
10047#if REMOVE_STATEMENT_DEBUG
10048 printf (
"Found attached comments (removing %p = %s): comments->size() = %" PRIuPTR
" \n",targetStmt,targetStmt->
class_name().c_str(),comments->size());
10054 int commentIndex = 0;
10055 AttachedPreprocessingInfoType::iterator i;
10056 for (i = comments->begin(); i != comments->end(); i++)
10058 ROSE_ASSERT ( (*i) != NULL );
10059#if REMOVE_STATEMENT_DEBUG
10060 printf (
" Attached Comment (relativePosition=%s): %s\n",
10061 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
10062 (*i)->getString().c_str());
10063 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
10064 (*i)->get_file_info()->display(
"comment/directive location debug");
10066 captureList.push_back(commentIndex);
10070#if REMOVE_STATEMENT_DEBUG
10071 printf (
"captureList.size() = %" PRIuPTR
" \n",captureList.size());
10074 if (captureList.empty() ==
false)
10079 bool surroundingStatementPreceedsTargetStatement =
false;
10082 if (surroundingStatement !=
nullptr)
10085#if REMOVE_STATEMENT_DEBUG
10086 printf (
"In removeStatement(): surroundingStatementPreceedsTargetStatement = %s \n",surroundingStatementPreceedsTargetStatement ?
"true" :
"false");
10087 printf (
" --- moving comments from targetStmt = %p = %s name = %s \n",targetStmt,targetStmt->
class_name().c_str(),
get_name(targetStmt).c_str());
10088 printf (
" --- moving comments to surroundingStatement = %p = %s name = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str(),
get_name(surroundingStatement).c_str());
10103 printf (
"Error: This is not supported within Microsoft Windows (I forget why). \n");
10125 printf (
"In SageInterface::resetInternalMapsForTargetStatement(SgStatement*): sourceStatement = %p = %s \n",sourceStatement,sourceStatement->
class_name().c_str());
10134 printf (
"In SageInterface::resetInternalMapsForTargetStatement(SgStatement*): sourceFile = %p \n",sourceFile);
10137 if (sourceFile != NULL)
10139 std::map<SgStatement*,MacroExpansion*> & macroExpansionMap = sourceFile->get_macroExpansionMap();
10141 if (macroExpansionMap.find(sourceStatement) != macroExpansionMap.end())
10143 MacroExpansion* macroExpansion = macroExpansionMap[sourceStatement];
10144 ROSE_ASSERT(macroExpansion != NULL);
10146 printf (
"In resetInternalMapsForTargetStatement(): macroExpansion = %p = %s \n",macroExpansion,macroExpansion->macro_name.c_str());
10148 if (macroExpansion->isTransformed ==
false)
10151 std::vector<SgStatement*> & associatedStatementVector = macroExpansion->associatedStatementVector;
10153 for (
size_t i = 0; i < associatedStatementVector.size(); i++)
10156 SgStatement* statement = associatedStatementVector[i];
10158 printf (
"Mark as transformation to be output: statement = %p = %s \n",statement,statement->
class_name().c_str());
10182 macroExpansion->isTransformed =
true;
10199#if REMOVE_STATEMENT_DEBUG || 0
10200 printf (
"In moveCommentsToNewStatement(): destinationStatementProceedsSourceStatement = %s \n",destinationStatementProceedsSourceStatement ?
"true" :
"false");
10201 printf (
" --- sourceStatement = %p = %s name = %s \n",sourceStatement,sourceStatement->
class_name().c_str(),
get_name(sourceStatement).c_str());
10202 printf (
" --- destinationStatement = %p = %s name = %s \n",destinationStatement,destinationStatement->
class_name().c_str(),
get_name(destinationStatement).c_str());
10210#if REMOVE_STATEMENT_DEBUG
10211 printf (
"Output the comments attached to sourceStatement: \n");
10213 printf (
"Output the comments attached to destinationStatement: \n");
10218 vector<int>::const_iterator j = indexList.begin();
10220 while (j != indexList.end())
10223 ROSE_ASSERT(destinationStatement->
get_file_info() != NULL);
10224#if REMOVE_STATEMENT_DEBUG || 0
10225 printf (
"Attaching comments to destinationStatement = %p = %s on file = %s line %d \n",
10226 destinationStatement,destinationStatement->
class_name().c_str(),
10227 destinationStatement->
get_file_info()->get_filenameString().c_str(),
10230 printf (
"(*comments)[*j]->getRelativePosition() = %s \n",PreprocessingInfo::relativePositionName((*comments)[*j]->getRelativePosition()).c_str());
10242 if (destinationStatementProceedsSourceStatement ==
true || isSgGlobal(destinationStatement) != NULL )
10248 auto commentPosition = (*comments)[*j]->getRelativePosition();
10249 if (commentPosition == PreprocessingInfo::before)
10252 (*comments)[*j]->setRelativePosition(PreprocessingInfo::after);
10254 else if (commentPosition == PreprocessingInfo::after ||
10255 commentPosition == PreprocessingInfo::end_of)
10261 ROSE_ASSERT(
false &&
"Comment relative position neither, before, after, nor end_of");
10273 (*comments)[*j]->setRelativePosition(PreprocessingInfo::inside);
10284 if ((*comments)[*j]->getRelativePosition() == PreprocessingInfo::before)
10292 ASSERT_require((*comments)[*j]->getRelativePosition() == PreprocessingInfo::after||
10293 (*comments)[*j]->getRelativePosition() == PreprocessingInfo::end_of);
10294 (*comments)[*j]->setRelativePosition(PreprocessingInfo::before);
10303 if (targetInfoList==NULL)
10312 if( prevTargetAnchorComment==NULL)
10325 prevTargetAnchorComment = (*comments)[*j];
10330#if REMOVE_STATEMENT_DEBUG
10331 printf (
"Marking entry from comments list as NULL on sourceStatement = %p = %s \n",sourceStatement,sourceStatement->
class_name().c_str());
10333 (*comments)[*j] =
nullptr;
10340 for (
size_t n = 0; n < indexList.size(); n++)
10342#if REMOVE_STATEMENT_DEBUG || 0
10343 printf (
"Erase entry from comments list on comments->size() %" PRIuPTR
" \n",comments->size());
10345 bool modifiedList =
false;
10346 AttachedPreprocessingInfoType::iterator k = comments->begin();
10347 while (k != comments->end() && modifiedList ==
false)
10352 k = comments->erase(k);
10353 modifiedList =
true;
10375 ROSE_ASSERT(targetStmt != NULL);
10380#if REMOVE_STATEMENT_DEBUG || 0
10381 printf (
"TOP of findSurroundingStatementFromSameFile(): surroundingStatementPreceedsTargetStatement = %s \n",surroundingStatementPreceedsTargetStatement ?
"true" :
"false");
10384 std::set<SgStatement*> previousVisitedStatementSet;
10389 surroundingStatementPreceedsTargetStatement =
true;
10391#if REMOVE_STATEMENT_DEBUG
10392 printf (
" targetStmt->get_file_info()->get_file_id() = %d \n",targetStmt->
get_file_info()->get_file_id());
10394#if REMOVE_STATEMENT_DEBUG
10395 printf (
"Before loop: surroundingStatement = %p = %s name = %s surroundingStatement_fileId = %d \n",surroundingStatement,
10398 bool returningNullSurroundingStatement =
false;
10410#if REMOVE_STATEMENT_DEBUG
10411 printf (
"In loop: after getPreviousStatement(): surroundingStatement = %p = %s name = %s \n",surroundingStatement,
10415 if (surroundingStatement == NULL)
10418#if REMOVE_STATEMENT_DEBUG
10419 printf (
" surroundingStatement_fileId set to Sg_File_Info::BAD_FILE_ID \n");
10424 surroundingStatement_fileId = surroundingStatement->
get_file_info()->get_file_id();
10425#if REMOVE_STATEMENT_DEBUG
10426 printf (
" surroundingStatement = %p = %s surroundingStatement->get_file_info()->get_file_id() = %d \n",
10427 surroundingStatement,surroundingStatement->
class_name().c_str(),surroundingStatement->
get_file_info()->get_file_id());
10431#if REMOVE_STATEMENT_DEBUG
10432 if (surroundingStatement != NULL)
10434 printf (
"Looping toward the top of the file for a statement to attach comments and CPP directives to: surroundingStatement = %p = %s file = %s file id = %d line = %d \n",
10435 surroundingStatement,surroundingStatement->
class_name().c_str(),
10436 surroundingStatement->
get_file_info()->get_filenameString().c_str(),
10442 printf (
"surroundingStatement == NULL \n");
10447 if (previousVisitedStatementSet.find(surroundingStatement) != previousVisitedStatementSet.end())
10449 printf (
"This statement has been previously visited: surroundingStatement = %p = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str());
10451 printf (
"ERROR: SageInterface::findSurroundingStatementFromSameFile(): cannot located surrounding statement from same file (return NULL) \n");
10453 surroundingStatement = NULL;
10459 previousVisitedStatementSet.insert(surroundingStatement);
10463 if (surroundingStatement == NULL || isSgGlobal(surroundingStatement) != NULL)
10466#if REMOVE_STATEMENT_DEBUG
10467 printf (
"We just ran off the start (top) of the file... targetStmt = %p = %s \n",targetStmt,targetStmt->
class_name().c_str());
10473 surroundingStatementPreceedsTargetStatement =
false;
10476 surroundingStatement = targetStmt;
10477 SgStatement* previousStatement = surroundingStatement;
10481 std::set<SgStatement*> forwardVisitedStatementSet;
10484 while ( (surroundingStatement != NULL) && (surroundingStatement_fileId != targetStmt->
get_file_info()->get_file_id()) )
10487 if (forwardVisitedStatementSet.find(surroundingStatement) != forwardVisitedStatementSet.end())
10489 printf (
"This statement has been previously visited: surroundingStatement = %p = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str());
10491 printf (
"ERROR: SageInterface::findSurroundingStatementFromSameFile(): cannot located surrounding statement from same file (return NULL) \n");
10493 surroundingStatement = NULL;
10499 forwardVisitedStatementSet.insert(surroundingStatement);
10502 previousStatement = surroundingStatement;
10505 if (surroundingStatement == NULL)
10508#if REMOVE_STATEMENT_DEBUG
10509 printf (
"We just ran off the end (bottom) of the file... \n");
10514 returningNullSurroundingStatement =
true;
10518 surroundingStatement_fileId = surroundingStatement->
get_file_info()->get_file_id();
10519#if REMOVE_STATEMENT_DEBUG
10520 printf (
"Looping toward the bottom of the file for a statement to attach comments and CPP directives to: surroundingStatement = %p = %s file = %s file id = %d line = %d \n",
10521 surroundingStatement,surroundingStatement->
class_name().c_str(),
10522 surroundingStatement->
get_file_info()->get_filenameString().c_str(),
10529 if (surroundingStatement == NULL)
10531#if REMOVE_STATEMENT_DEBUG
10532 printf (
"Resetting the surroundingStatement to the previousStatement = %p = %s \n",previousStatement,previousStatement->
class_name().c_str());
10534 surroundingStatement = previousStatement;
10537 if (surroundingStatement == targetStmt)
10541#if REMOVE_STATEMENT_DEBUG
10542 printf (
"Setting the surroundingStatement to be global scope \n");
10544 surroundingStatement = TransformationSupport::getGlobalScope(targetStmt);
10550 ROSE_ASSERT(surroundingStatement != NULL);
10554 printf (
"This is a special statement (not associated with the original source code, comment relocation is not supported for these statements) targetStmt file id = %d \n",targetStmt->
get_file_info()->get_file_id());
10555 surroundingStatement = NULL;
10558#if REMOVE_STATEMENT_DEBUG
10559 printf (
"BOTTOM of findSurroundingStatementFromSameFile(): surroundingStatementPreceedsTargetStatement = %s surroundingStatement = %p \n",surroundingStatementPreceedsTargetStatement ?
"true" :
"false",surroundingStatement);
10560 if (surroundingStatement != NULL)
10562 printf (
"surroundingStatement = %p = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str());
10568 return surroundingStatement;
10578 virtual void visit(
SgNode* n) {
10582 Visitor().
traverse(root, postorder);
10592 ROSE_ASSERT(oldStmt);
10593 ROSE_ASSERT(newStmt);
10595 if (oldStmt == newStmt)
return;
10606 ROSE_ASSERT (f_do->get_body() == oldStmt);
10607 if (!isSgBasicBlock(newStmt))
10609 f_do->set_body(isSgBasicBlock(newStmt));
10626 printf (
"In SageInterface::replaceStatement(): physical_file_id = %d \n",physical_file_id);
10637 if (movePreprocessingInfoValue)
10645 printf (
"In SageInterface::replaceStatement(): calling moveUpPreprocessingInfo() changed to movePreprocessingInfo() \n");
10657 bool usePrepend =
true;
10659 movePreprocessingInfo ( oldStmt, newStmt, PreprocessingInfo::undef, PreprocessingInfo::undef, usePrepend );
10680 printf (
"In SageInterface::moveDeclarationToAssociatedNamespace(): declarationStatement = %p = %s \n",declarationStatement,declarationStatement->
class_name().c_str());
10681 printf (
" --- previousDeclarationStatement = %p = %s \n",previousDeclarationStatement,previousDeclarationStatement != NULL ? previousDeclarationStatement->
class_name().c_str() :
"null");
10682 printf (
" --- nextDeclarationStatement = %p \n",nextDeclarationStatement);
10683 printf (
" --- nextDeclarationStatement = %p = %s \n",nextDeclarationStatement, nextDeclarationStatement != NULL ? nextDeclarationStatement->
class_name().c_str() :
"null");
10687 if (previousDeclarationStatement != NULL)
10693 printf (
"There is no previous statement so there is no namespace to close off! \n");
10696 printf (
"Exiting as a test! \n");
10701 if (nextDeclarationStatement != NULL)
10708 printf (
"There is no next statement so there is no namespace to reopen! \n");
10712 printf (
"Exiting as a test! \n");
10717 if (previousDeclarationStatement != NULL && nextDeclarationStatement != NULL)
10721 printf (
"Identified the most common case... \n");
10726 printf (
"declarationScope = %p = %s \n",declarationScope,declarationScope->
class_name().c_str());
10730 printf (
"Exiting as a test! \n");
10736 if (previousDeclarationStatement != NULL && nextDeclarationStatement == NULL)
10740 printf (
"Found 2nd most common case: previousDeclarationStatement != NULL && nextDeclarationStatement == NULL \n");
10744 printf (
"Exiting as a test! \n");
10750 if (previousDeclarationStatement == NULL && nextDeclarationStatement == NULL)
10752 printf (
"This case should require no special handling, unless we are still in the wrong namespace \n");
10755 printf (
"Exiting as a test! \n");
10760 printf (
"This case should have been caught above! \n");
10763 printf (
"Exiting as a test! \n");
10770 if (declarationParent == NULL)
10773 printf (
"declarationStatement->get_parent() = %p = %s \n",declarationStatement->
get_parent(), (declarationStatement->
get_parent() != NULL) ? declarationStatement->
get_parent()->
class_name().c_str() :
"null");
10779 if (declarationParent != NULL)
10782 ROSE_ASSERT(declarationScope != NULL);
10785 if (namespaceDefinition != NULL)
10788 ROSE_ASSERT(namespaceDeclaration != NULL);
10790 printf (
"The declaration has been identified to be associuated with a valid namespace = %p = %s \n",namespaceDeclaration,namespaceDeclaration->
get_name().str());
10791 printf (
" --- declarationParent = %p = %s \n",declarationParent,declarationParent->
class_name().c_str());
10792 printf (
" --- Move declaration from scope = %p = %s to namespace = %p = %s \n",declarationParent,declarationParent->
class_name().c_str(),namespaceDeclaration,namespaceDeclaration->
get_name().str());
10795 printf (
"Exiting as a test! \n");
10802 printf (
"declaration is not associated with a namespace, so we don't have to wrap it: declarationScope = %p = %s \n",declarationScope,declarationScope->
class_name().c_str());
10809 printf (
"Warning: declarationParent == NULL: declarationStatement->get_parent() = %p = %s \n",declarationStatement->
get_parent(), (declarationStatement->
get_parent() != NULL) ? declarationStatement->
get_parent()->
class_name().c_str() :
"null");
10821 if (isSgTemplateInstantiationDefn(node) != NULL)
10824 printf (
"Note: In SageInterface::isTemplateInstantiationNode(): skipping SgTemplateInstantiationDefn \n");
10828 return isSgTemplateInstantiationDecl(node)
10831 || isSgTemplateInstantiationDefn(node)
10832 || isSgTemplateInstantiationFunctionDecl(node)
10833 || isSgTemplateInstantiationMemberFunctionDecl(node)
10834 || isSgTemplateInstantiationTypedefDeclaration(node)
10835 || isSgTemplateInstantiationDirectiveStatement(node)
10844SageInterface::isTemplateDeclarationNode(
SgNode* node)
10847 if (isSgTemplateDefinition(node) != NULL)
10850 printf (
"Note: In SageInterface::isTemplateDeclarationNode(): skipping SgTemplateDefinition \n");
10854 return isSgTemplateInstantiationDecl(node)
10857 || isSgTemplateInstantiationDefn(node)
10858 || isSgTemplateInstantiationFunctionDecl(node)
10859 || isSgTemplateInstantiationMemberFunctionDecl(node)
10860 || isSgTemplateInstantiationTypedefDeclaration(node)
10861 || isSgTemplateInstantiationDirectiveStatement(node)
10874 std::vector<SgDeclarationStatement*> templateInstantiationVector;
10886 if (declaration != NULL)
10888 templateInstantiationVector.push_back(declaration);
10897 std::cerr <<
"This feature for now is available with autotools only!" << std::endl;
10901 std::vector<SgDeclarationStatement*>::iterator j = templateInstantiationVector.begin();
10902 while (j != templateInstantiationVector.end())
10916 SgExpression * pattern_exp = isSgExpression(new_pattern);
10917 ROSE_ASSERT (anchor_exp != NULL);
10918 ROSE_ASSERT (pattern_exp != NULL);
10921 Rose_STL_Container<SgNode*> opaque_exp_list = NodeQuery::querySubTree(pattern_exp,V_SgExpression);
10922 for (
size_t i = 0; i<opaque_exp_list.size(); i++)
10924 SgExpression* opaque_exp = isSgExpression(opaque_exp_list[i]);
10925 ROSE_ASSERT (opaque_exp != NULL);
10926 if (opaque_exp->
variantT() == V_SgVariantExpression)
10935 return new_pattern;
10942 static int counter = 0;
10945 bool collision =
false;
10948 name =
"__" + baseName + boost::lexical_cast<string > (counter++) +
"__";
10954 collision = (nameSymbol != NULL);
10957 Rose_STL_Container<SgNode*> childScopes = NodeQuery::querySubTree(scope, V_SgScopeStatement);
10959 BOOST_FOREACH(
SgNode* childScope, childScopes)
10965 nameSymbol = childScopeStatement->lookup_symbol(
SgName(name),NULL,NULL);
10967 collision = collision || (nameSymbol != NULL);
10969 }
while (collision);
10979 SgType* variableType = expressionType;
10986 SgType* expressionBaseType = expressionType->
stripType(SgType::STRIP_TYPEDEF_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE);
10991 if (
SgArrayType* arrayType=isSgArrayType(expressionType)) {
10992 if(
SgArrayType* strippedArrayType = isSgArrayType(arrayType->stripType(SgType::STRIP_TYPEDEF_TYPE))) {
10993 SgType* strippedArrayBaseType = strippedArrayType->get_base_type();
10999 if (isSgPointerDerefExp(expression))
11007 ROSE_ASSERT(tempVarInitExpression != NULL);
11018 if (initializeInDeclaration)
11025 ROSE_ASSERT(tempVarDeclaration != NULL);
11028 if (reEvaluate != NULL)
11042 return std::make_pair(tempVarDeclaration, varRefExpression);
11055 SgType* variableType = expressionType;
11058 if (
SgArrayType* arrayType=isSgArrayType(expressionType))
11060 if(
SgArrayType* strippedArrayType = isSgArrayType(arrayType->stripType(SgType::STRIP_TYPEDEF_TYPE))) {
11061 SgType* strippedArrayBaseType = strippedArrayType->get_base_type();
11075 ROSE_ASSERT(tempVarDeclaration != NULL);
11079 return std::make_pair(tempVarDeclaration, varRefExpression);
11086 replaceExpressionInSgExpressionPtrList(
SgExpression* oldExp,
SgExpression* newExp, SgExpressionPtrList& lst,
bool replAll =
false)
11088 SgExpressionPtrList::iterator lim = lst.end();
11089 SgExpressionPtrList::iterator pos = lst.begin();
11094 pos = std::find(pos, lim, oldExp);
11096 if (pos != lim) { *pos = newExp; ++pos; chg =
true; }
11097 }
while (replAll && (pos != lim));
11111 ROSE_ASSERT(oldExp);
11112 ROSE_ASSERT(newExp);
11113 if (oldExp==newExp)
return;
11115 if (isSgVarRefExp(newExp))
11119 ROSE_ASSERT(parent!=NULL);
11125 if (isSgExprStatement(parent)) {
11126 isSgExprStatement(parent)->set_expression(newExp);
11127 }
else if (isSgForStatement(parent)) {
11128 ROSE_ASSERT (isSgForStatement(parent)->get_increment() == oldExp);
11129 isSgForStatement(parent)->set_increment(newExp);
11132 if(matlabFor->get_index() == oldExp)
11133 matlabFor->set_index(newExp);
11134 else if(matlabFor->get_range() == oldExp)
11135 matlabFor->set_range(newExp);
11137 ROSE_ASSERT(!
"sub-expression not found");
11139 if(jovFor->get_initialization() == oldExp)
11140 jovFor->set_initialization(newExp);
11141 else if(jovFor->get_while_expression() == oldExp)
11142 jovFor->set_while_expression(newExp);
11143 else if(jovFor->get_by_or_then_expression() == oldExp)
11144 jovFor->set_by_or_then_expression(newExp);
11146 ROSE_ASSERT(!
"sub-expression not found");
11147 }
else if (
SgRangeExp* rngexp = isSgRangeExp(parent)) {
11148 if (rngexp->get_start() == oldExp)
11149 rngexp->set_start(newExp);
11150 else if (rngexp->get_end() == oldExp)
11151 rngexp->set_end(newExp);
11152 else if (rngexp->get_stride() == oldExp)
11153 rngexp->set_stride(newExp);
11155 ROSE_ASSERT(!
"sub-expression not found");
11156 }
else if (isSgReturnStmt(parent)) {
11157 isSgReturnStmt(parent)->set_expression(newExp);
11158 }
else if (isSgBinaryOp(parent)!=NULL) {
11159 if (oldExp==isSgBinaryOp(parent)->get_lhs_operand()) {
11161 }
else if (oldExp==isSgBinaryOp(parent)->get_rhs_operand()) {
11166 }
else if (isSgUnaryOp(parent)!=NULL){
11167 if (oldExp==isSgUnaryOp(parent)->get_operand_i())
11171 }
else if (isSgConditionalExp(parent) != NULL) {
11181 }
else if (isSgExprListExp(parent) != NULL) {
11182 SgExpressionPtrList& explist = isSgExprListExp(parent)->get_expressions();
11183 for (Rose_STL_Container<SgExpression*>::iterator i=explist.begin();i!=explist.end();i++) {
11184 if (isSgExpression(*i)==oldExp) {
11190 }
else if (isSgValueExp(parent)) {
11195 ROSE_ASSERT(oldExp == actexp->get_expression());
11196 actexp->set_expression(newExp);
11198 if (oldExp == attrexp->get_object()) {
11199 attrexp->set_object(newExp);
11200 }
else if (oldExp == attrexp->get_args()) {
11202 ASSERT_not_null(newLst);
11204 attrexp->set_args(newLst);
11209 }
else if ((parentExp=isSgExpression(parent)) != NULL) {
11212 ROSE_ASSERT (worked);
11213 }
else if (isSgInitializedName(parent)) {
11215 if (oldExp == initializedNameParent->get_initializer()) {
11217 ROSE_ASSERT(isSgInitializer(newExp));
11218 initializedNameParent->set_initializer(isSgInitializer(newExp));
11223 }
else if (isSgCaseOptionStmt(parent)) {
11225 if (oldExp == case_stmt->
get_key()) {
11227 }
else if(oldExp == case_stmt->get_key_range_end()) {
11228 case_stmt->set_key_range_end(newExp);
11232 }
else if (isSgProcessControlStatement(parent)) {
11234 if (oldExp == ctrl_stmt->get_quiet()) {
11235 ctrl_stmt->set_quiet(newExp);
11236 }
else if (oldExp == ctrl_stmt->get_code()) {
11237 ctrl_stmt->set_code(newExp);
11241 }
else if (isSgFortranDo(parent)) {
11243 if (oldExp == fortranDo->get_initialization()) {
11244 fortranDo->set_initialization(newExp);
11245 }
else if(oldExp == fortranDo->get_bound()) {
11246 fortranDo->set_bound(newExp);
11247 }
else if (oldExp == fortranDo->get_increment()) {
11248 fortranDo->set_increment(newExp);
11254 ROSE_ASSERT(oldExp == stm->get_condition());
11255 stm->set_condition(newExp);
11258 ROSE_ASSERT(oldExp == ptype->get_modexpr());
11259 ptype->set_modexpr(newExp);
11262 ROSE_ASSERT(oldExp == stm->get_time());
11263 stm->set_time(newExp);
11265 ROSE_ASSERT(oldExp == clause->get_size());
11266 clause->set_size(newExp);
11268 ROSE_ASSERT(oldExp == dcl->get_renamed());
11269 dcl->set_renamed(newExp);
11271 ROSE_ASSERT(oldExp == dcl->get_entryBarrier());
11272 dcl->set_entryBarrier(newExp);
11274 ROSE_ASSERT(oldExp == stm->get_guard());
11275 stm->set_guard(newExp);
11277 ROSE_ASSERT(oldExp == delc->get_delta());
11278 delc->set_delta(newExp);
11280 ROSE_ASSERT(oldExp == digc->get_digits());
11281 digc->set_digits(newExp);
11283 replaceExpressionInSgExpressionPtrList(oldExp, newExp, disc->get_discriminants());
11285 ROSE_ASSERT(oldExp == rngc->get_range());
11286 rngc->set_range(newExp);
11288 replaceExpressionInSgExpressionPtrList(oldExp, newExp, idxc->get_indexRanges());
11290 ROSE_ASSERT(oldExp == vtdcl->get_discriminant());
11291 vtdcl->set_discriminant(newExp);
11293 ROSE_ASSERT(oldExp == clause->get_alignment());
11294 clause->set_alignment(newExp);
11297 if (newLst && (oldExp == vtwhen->get_choices()))
11298 vtwhen->set_choices(newLst);
11302 if (oldExp == clause->get_offset())
11303 clause->set_offset(newExp);
11304 else if (oldExp == clause->get_range() && isSgRangeExp(newExp))
11305 clause->set_range(isSgRangeExp(newExp));
11306 else if (oldExp == clause->get_component() && isSgVarRefExp(newExp))
11307 clause->set_component(isSgVarRefExp(newExp));
11311 if (oldExp == rendcl->get_renamed_function())
11312 rendcl->set_renamed_function(newExp);
11316 cerr<<
"SageInterface::replaceExpression(). Unhandled parent expression type of SageIII enum value: " <<parent->
class_name()<<endl;
11331 return Rose::getNextStatement(currentStmt);
11340 return isSgIntVal(e) && isSgIntVal(e)->get_value() == value;
11345 ROSE_ASSERT(func1&& func2);
11346 bool result =
false;
11347 if (func1 == func2)
11353 if (func1->get_name() == func2->get_name())
11358 if (func1->get_qualified_name().getString() +
11359 func1->get_mangled_name().getString() ==
11360 func2->get_qualified_name().getString() +
11361 func2->get_mangled_name().getString()
11367 if (func1->get_name() == func2->get_name())
11372 cout<<
"Error: SageInterface::isSameFunction(): unhandled language"<<endl;
11383 bool result =
false;
11384 ROSE_ASSERT(stmt != NULL);
11386 ROSE_ASSERT(p_scope != NULL);
11391 if (stmtlist[stmtlist.size()-1] == stmt)
11397 if (stmtlist[stmtlist.size()-1] == stmt)
11402 if (stmtlist[stmtlist.size()-1] == stmt)
11414 virtual void visit(
SgNode* n) {
11416 if (valueExp != NULL) {
11417 valueExp->set_originalExpressionTree(NULL);
11421 if (cast_exp != NULL) {
11422 cast_exp->set_originalExpressionTree(NULL);
11427 Visitor().traverse(top, preorder);
11432 while (s && !isSgSwitchStatement(s)) {
11436 return isSgSwitchStatement(s);
11441 while (s && !isSgOmpClauseBodyStatement(s)) {
11447 return isSgOmpClauseBodyStatement(s);
11453 for (; s; s = isSgStatement(s->
get_parent())) {
11458 case V_SgDoWhileStmt: {
11459 if (label.empty()) {
11464 case V_SgForStatement: {
11465 if (label.empty()) {
11470 case V_SgFortranDo:
11471 case V_SgFortranNonblockedDo: {
11472 if (label.empty() ||
11473 label == isSgFortranDo(sc)->get_string_label()) {
11478 case V_SgWhileStmt: {
11479 if (label.empty() ||
11480 label == isSgWhileStmt(sc)->get_string_label()) {
11485 case V_SgSwitchStatement: {
11486 if (stopOnSwitches)
return sc;
11489 case V_SgJavaForEachStatement: {
11490 if (label.empty()) {
11495 case V_SgJavaLabelStatement: {
11496 if (label.empty() ||
11497 label == isSgJavaLabelStatement(sc)->get_label().getString()) {
11513 virtual void visit(
SgNode* n) {
11514 if (isSgBasicBlock(n)) {
11516 bool changes =
true;
11519 for (SgStatementPtrList::iterator i = bb->
get_statements().begin();
11521 if (isSgGotoStatement(*i)) {
11523 SgStatementPtrList::iterator inext = i;
11527 if (!isSgLabelStatement(*inext))
11542 RemoveJumpsToNextStatementVisitor().traverse(top, postorder);
11551 ROSE_ASSERT (parent);
11555 ROSE_ASSERT (bb || fis);
11556 SgStatementPtrList& siblings =
11558 SgStatementPtrList::iterator j =
11559 std::find(siblings.begin(), siblings.end(), stmt);
11560 ROSE_ASSERT (j != siblings.end());
11573 SgLabelStatementPtrSet& used;
11574 SgLabelStatementPtrSet& all;
11577 FindUsedAndAllLabelsVisitor(SgLabelStatementPtrSet& used,
11578 SgLabelStatementPtrSet& all):
11579 used(used), all(all) {}
11581 virtual void visit(
SgNode* n) {
11582 if (isSgGotoStatement(n)) {
11583 used.insert(isSgGotoStatement(n)->get_label());
11585 if (isSgLabelStatement(n)) {
11586 all.insert(isSgLabelStatement(n));
11591 SgLabelStatementPtrSet used;
11592 SgLabelStatementPtrSet unused;
11593 FindUsedAndAllLabelsVisitor(used, unused).traverse(top, preorder);
11595 for (SgLabelStatementPtrSet::iterator i = used.begin();
11596 i != used.end(); ++i) {
11597 assert (unused.find(*i) != unused.end());
11610 for (SgLabelStatementPtrSet::iterator i = unused.begin();
11611 i != unused.end(); ++i) {
11619 l_stmt->set_statement(NULL);
11629 if (isSgWhileStmt(loopStmt))
return isSgWhileStmt(loopStmt)->
get_body();
11630 if (isSgForStatement(loopStmt))
return isSgForStatement(loopStmt)->
get_loop_body();
11631 if (isSgDoWhileStmt(loopStmt))
return isSgDoWhileStmt(loopStmt)->
get_body();
11633 ROSE_ASSERT (!
"Bad loop kind");
11638 if (isSgWhileStmt(loopStmt)) {
11639 isSgWhileStmt(loopStmt)->
set_body(body);
11640 }
else if (isSgForStatement(loopStmt)) {
11642 }
else if (isSgDoWhileStmt(loopStmt)) {
11643 isSgDoWhileStmt(loopStmt)->
set_body(body);
11645 ROSE_ASSERT (!
"Bad loop kind");
11651 if (isSgWhileStmt(loopStmt))
return isSgWhileStmt(loopStmt)->
get_condition();
11652 if (isSgForStatement(loopStmt))
return isSgForStatement(loopStmt)->get_test();
11653 if (isSgDoWhileStmt(loopStmt))
return isSgDoWhileStmt(loopStmt)->
get_condition();
11655 ROSE_ASSERT (!
"Bad loop kind");
11660 if (isSgWhileStmt(loopStmt)) {
11662 }
else if (isSgForStatement(loopStmt)) {
11663 isSgForStatement(loopStmt)->set_test(cond);
11664 }
else if (isSgDoWhileStmt(loopStmt)) {
11667 ROSE_ASSERT (!
"Bad loop kind");
11676 SgCastExp* cast_exp = isSgCastExp(exp);
11677 if (cast_exp != NULL)
11680 assert(operand != 0);
11681 return SkipCasting(operand);
11690 ROSE_ASSERT(loop!=NULL);
11692 SgStatementPtrList &init = loop ->get_init_stmt();
11693 if (init.size() !=1)
11704 ROSE_ASSERT(ivarname != NULL);
11706 if (isSgAssignInitializer(initor))
11708 lbast = isSgAssignInitializer(initor)->
get_operand();
11723 ROSE_ASSERT(funcDef!=NULL);
11725 ROSE_ASSERT(funcBody!=NULL);
11727 std::ostringstream os;
11728 os<<ivarname->get_name().getString();
11733 if (visibleSym != NULL)
11744 Rose_STL_Container<SgNode*> varRefs = NodeQuery::querySubTree(loop,V_SgVarRefExp);
11745 for (Rose_STL_Container<SgNode *>::iterator i = varRefs.begin(); i != varRefs.end(); i++)
11748 if (vRef->get_symbol()==osymbol)
11749 vRef->set_symbol(nsymbol);
11754 init.push_back(ninit);
11761 trans_records.forLoopInitNormalizationTable[loop] =
true;
11762 trans_records.forLoopInitNormalizationRecord[loop] = make_pair (decl, ndecl) ;
11775 ROSE_ASSERT (loop != NULL);
11777 if (!trans_records.forLoopInitNormalizationTable[loop])
11782 ROSE_ASSERT (decl!= NULL);
11783 ROSE_ASSERT (ndecl!= NULL);
11787 SgStatementPtrList &init = loop ->get_init_stmt();
11788 ROSE_ASSERT(init.size() ==1);
11793 ROSE_ASSERT (exp_stmt != NULL);
11794 SgAssignOp* assign_op = isSgAssignOp(exp_stmt->get_expression());
11795 ROSE_ASSERT (assign_op != NULL);
11802 init.push_back(decl);
11813 Rose_STL_Container<SgNode*> varRefs = NodeQuery::querySubTree(loop,V_SgVarRefExp);
11814 for (Rose_STL_Container<SgNode *>::iterator i = varRefs.begin(); i != varRefs.end(); i++)
11817 if (vRef->get_symbol()==osymbol)
11818 vRef->set_symbol(nsymbol);
11822 trans_records.forLoopInitNormalizationTable[loop] =
false;
11828 ROSE_ASSERT(loop != NULL);
11835 if (test_stmt!=NULL)
11837 if (isSgNullStatement(test_stmt))
11843 if (isSgBinaryOp(test))
11847 ROSE_ASSERT(testlhs && testrhs);
11852 SgVarRefExp* testlhs_var = isSgVarRefExp(SkipCasting(testlhs));
11853 if (testlhs_var == NULL )
11856 if (var_symbol==NULL)
11860 case V_SgLessThanOp:
11865 case V_SgGreaterThanOp:
11869 case V_SgLessOrEqualOp:
11870 case V_SgGreaterOrEqualOp:
11871 case V_SgNotEqualOp:
11880 ROSE_ASSERT(loop != NULL);
11884 if (isSgBinaryOp(test))
11888 ROSE_ASSERT(testlhs && testrhs);
11893 SgVarRefExp* testlhs_var = isSgVarRefExp(SkipCasting(testlhs));
11894 if (testlhs_var == NULL )
11897 if (var_symbol==NULL)
11903 ROSE_ASSERT(incr != NULL);
11905 case V_SgPlusPlusOp:
11908 SgVarRefExp* incr_var = isSgVarRefExp(SkipCasting(isSgPlusPlusOp(incr)->get_operand()));
11909 if (incr_var == NULL)
return false;
11910 if ( incr_var->get_symbol() != var_symbol)
11916 case V_SgMinusMinusOp:
11919 SgVarRefExp* incr_var = isSgVarRefExp(SkipCasting(isSgMinusMinusOp(incr)->get_operand()));
11920 if (incr_var == NULL)
return false;
11921 if ( incr_var->get_symbol() != var_symbol)
11927 case V_SgMinusAssignOp:
11929 SgVarRefExp* incr_var = isSgVarRefExp(SkipCasting(isSgMinusAssignOp(incr)->get_lhs_operand()));
11931 ROSE_ASSERT (rhs != NULL);
11932 if (incr_var == NULL)
return false;
11933 if ( incr_var->get_symbol() != var_symbol)
11940 case V_SgPlusAssignOp:
11953 ROSE_ASSERT(loop != NULL);
11971 ROSE_ASSERT(body!=NULL);
11989 ROSE_ASSERT (loop != NULL);
11991 if (isSgNullExpression(e_3))
11994 loop->set_increment(iv);
12009 ROSE_ASSERT(func!=NULL);
12010 AstInterfaceImpl faImpl(func->get_definition()->
get_body());
12011 AstInterface fa(&faImpl);
12012 ArrayAnnotation* annot = ArrayAnnotation::get_inst();
12013 ArrayInterface array_interface (*annot);
12014 array_interface.initialize(fa, AstNodePtrImpl(func->get_definition()));
12015 array_interface.observe(fa);
12016 LoopTransformInterface :: set_astInterface(fa);
12017 LoopTransformInterface :: set_arrayInterface(&array_interface);
12021 AstNodePtr result = AstNodePtrImpl(loop->
get_parent()) ;
12023 LoopUnrolling lu(unrolling_factor);
12026 result = lu(lpTrans, result);
12070#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
12072 if (unrolling_factor <= 1)
12093 cerr<<
"Error in SageInterface::loopUnrolling(): target loop is not canonical."<<endl;
12097 ROSE_ASSERT(ivar&& lb && ub && step);
12098 ROSE_ASSERT(isSgBasicBlock(orig_body));
12101 bool needFringe =
true;
12102 SgForStatement* fringe_loop = deepCopy<SgForStatement>(target_loop);
12120 ROSE_ASSERT(scope != NULL);
12124 attachComment(fringe_decl,
"iter_count = (ub-lb+1)%step ==0?(ub-lb+1)/step: (ub-lb+1)/step+1;");
12125 attachComment(fringe_decl,
"fringe = iter_count%unroll_factor==0 ? 0:unroll_factor*step");
12132 ConstantFolding::constantFoldingOptimization(fringe_decl,
false);
12134 ROSE_ASSERT(ivarname != NULL);
12138 if (isSgIntVal(init1->get_operand_i()))
12139 if (isSgIntVal(init1->get_operand_i())->get_value() == 0)
12140 needFringe =
false;
12144 ROSE_ASSERT(ub_bin_op);
12154 ROSE_ASSERT(step_bin_op != NULL);
12157 bool isPlus =
false;
12158 if (isSgPlusAssignOp(step_bin_op))
12160 else if (isSgMinusAssignOp(step_bin_op))
12164 cerr<<
"Error in SageInterface::loopUnrolling(): illegal incremental exp of a canonical loop"<<endl;
12170 for (
size_t i =1; i<unrolling_factor; i++)
12174 std::vector<SgVarRefExp*> refs = querySubTree<SgVarRefExp> (body, V_SgVarRefExp);
12175 for (std::vector<SgVarRefExp*>::iterator iter = refs.begin(); iter !=refs.end(); iter++)
12204 ConstantFolding::constantFoldingOptimization(scope,
false);
12216static size_t myfactorial (
size_t n)
12219 for (
size_t i=2; i<=n; i++)
12230std::vector<size_t> getPermutationOrder(
size_t n,
size_t lexicoOrder)
12232 size_t k = lexicoOrder;
12233 std::vector<size_t> s(n);
12235 for (
size_t i=0; i<n; i++)
12239 size_t factorial = myfactorial(n-1);
12241 if (k/n>=factorial)
12243 printf(
"Error: in getPermutationOrder(), lexicoOrder is larger than n!-1\n");
12259 for (
size_t j=0; j<n-1; j++)
12263 int tempj = (k/factorial) % (n - j);
12266 int temps = s[j+tempj];
12269 for (
size_t i=j+tempj; i>j; i--)
12276 factorial = factorial /(n-(j+1));
12279 for (
size_t i = 0; i<n; i++)
12311 ROSE_ASSERT(loopNest != NULL);
12312 ROSE_ASSERT(targetLevel >0);
12319 std::vector<SgForStatement* > loops= SageInterface::querySubTree<SgForStatement>(loopNest,V_SgForStatement);
12320 ROSE_ASSERT(loops.size()>=targetLevel);
12338 cerr<<
"Error in SageInterface::loopTiling(): target loop is not canonical."<<endl;
12342 ROSE_ASSERT(ivar&& lb && ub && step);
12350 parent = isSgLocatedNode(loopNest ->get_parent());
12352 ROSE_ASSERT(parent!= NULL);
12354 string ivar2_name =
"_lt_var_"+ivar->get_name().getString();
12364 if (isSgBinaryOp(orig_test))
12366 if (isSgLessOrEqualOp(orig_test))
12368 else if (isSgGreaterOrEqualOp(orig_test))
12374 cerr<<
"Error: illegal condition operator for a canonical loop"<<endl;
12381 cerr<<
"Error: illegal condition expression for a canonical loop"<<endl;
12385 ROSE_ASSERT(cond_stmt != NULL);
12390 SgExpression* orig_incr_exp = target_loop->get_increment();
12391 if( isSgPlusAssignOp(orig_incr_exp))
12395 else if (isSgMinusAssignOp(orig_incr_exp))
12401 cerr<<
"Error: illegal increment expression for a canonical loop"<<endl;
12413 ROSE_ASSERT(assign_op);
12417 ROSE_ASSERT(bin_op);
12437 if (lexicoOrder == 0)
12440 ROSE_ASSERT(loop != NULL);
12442 ROSE_ASSERT (depth >1);
12443 ROSE_ASSERT(lexicoOrder<myfactorial(depth));
12446 std::vector<SgForStatement* > loopNest = SageInterface::querySubTree<SgForStatement>(loop,V_SgForStatement);
12447 ROSE_ASSERT(loopNest.size()>=depth);
12448 std::vector<std::vector<SgNode*> > loopHeads;
12449 for (std::vector<SgForStatement* > ::iterator i = loopNest.begin(); i!= loopNest.end(); i++)
12452 std::vector<SgNode*> head;
12454 head.push_back(cur_loop->get_test());
12455 head.push_back(cur_loop->get_increment());
12456 loopHeads.push_back(head);
12460 std::vector<size_t> changedOrder = getPermutationOrder (depth, lexicoOrder);
12463 for (
size_t i=0; i<depth; i++)
12466 if (i != changedOrder[i])
12469 std::vector<SgNode*> newhead = loopHeads[changedOrder[i]];
12477 init->set_parent(cur_loop);
12482 cur_loop->set_test(test);
12490 cur_loop->set_increment(incr);
12504 ROSE_ASSERT(loop != NULL);
12510 SgAssignOp* assign_op = isSgAssignOp (do_loop->get_initialization());
12511 ROSE_ASSERT (assign_op != NULL);
12513 ROSE_ASSERT (var != NULL);
12514 ivarname = var->get_symbol()->get_declaration();
12515 ROSE_ASSERT (ivarname != NULL);
12529 SgStatementPtrList & init = fs->get_init_stmt();
12530 if (init.size() !=1)
12532 cerr<<
"SageInterface::getLoopIndexVariable(), no or more than one initialization statements are encountered. Not supported yet "<<endl;
12543 if (isSgVariableDeclaration(init1))
12547 ROSE_ASSERT(ivarname != NULL);
12554 SgVarRefExp* var = isSgVarRefExp(SkipCasting(ivarast));
12557 ivarname = var->get_symbol()->get_declaration();
12564 if (
SgCommaOpExp* comma_exp = isSgCommaOpExp(exp_stmt->get_expression()))
12571 SgVarRefExp* var = isSgVarRefExp(assign_op->get_lhs_operand());
12574 ivarname = var->get_symbol()->get_declaration();
12582 mlog[Sawyer::Message::Common::WARN] <<
"Warning: SageInterface::getLoopIndexVariable(). Unhandled init_stmt type of SgForStatement"<<endl;
12583 mlog[Sawyer::Message::Common::WARN] <<
"Init statement is :"<<init1->
class_name() <<
" " <<init1->
unparseToString()<<endl;
12601 ROSE_ASSERT (ivar != NULL);
12602 ROSE_ASSERT (subtree_root != NULL);
12603 bool result =
false;
12608 if (i_index == ivar)
12628 ROSE_ASSERT (loop !=NULL);
12629 SgStatementPtrList& stmt_list = loop->get_init_stmt();
12630 if (stmt_list.size() >1)
return true;
12631 if (stmt_list.size() == 0)
return false;
12636 if (decl_stmt != NULL)
12641 ROSE_ASSERT (exp_stmt != NULL);
12642 if (isSgCommaOpExp (exp_stmt->get_expression()) )
12652 ROSE_ASSERT(loop != NULL);
12660 SgAssignOp* init_assign = isSgAssignOp (init);
12665 bool isCase1=
false;
12670 ivarname = var->get_symbol()->get_declaration();
12672 if (ivarname && lbast )
12684 SgBinaryOp* test = isSgBinaryOp(fs->get_test_expr());
12688 case V_SgLessOrEqualOp:
12689 if (isInclusiveUpperBound != NULL)
12690 *isInclusiveUpperBound =
true;
12691 if (hasIncrementalIterationSpace != NULL)
12692 *hasIncrementalIterationSpace =
true;
12694 case V_SgLessThanOp:
12695 if (isInclusiveUpperBound != NULL)
12696 *isInclusiveUpperBound =
false;
12697 if (hasIncrementalIterationSpace != NULL)
12698 *hasIncrementalIterationSpace =
true;
12700 case V_SgGreaterOrEqualOp:
12701 if (isInclusiveUpperBound != NULL)
12702 *isInclusiveUpperBound =
true;
12703 if (hasIncrementalIterationSpace != NULL)
12704 *hasIncrementalIterationSpace =
false;
12706 case V_SgGreaterThanOp:
12707 if (isInclusiveUpperBound != NULL)
12708 *isInclusiveUpperBound =
false;
12709 if (hasIncrementalIterationSpace != NULL)
12710 *hasIncrementalIterationSpace =
false;
12719 if (testvar == NULL)
12725 ubast = loop->get_bound();
12727 if (isInclusiveUpperBound != NULL)
12728 *isInclusiveUpperBound =
true;
12731 ROSE_ASSERT (incr != NULL);
12732 if (isSgNullExpression(incr))
12734 cerr<<
"Error:isCanonicalDoLoop() found NULL increment expression. Please call doLoopNormalization() first!"<<endl;
12735 ROSE_ASSERT (
false);
12737 if (hasIncrementalIterationSpace != NULL)
12739 *hasIncrementalIterationSpace =
true;
12741 if (
SgIntVal* i_v = isSgIntVal(incr))
12743 if (i_v->get_value()<0)
12744 *hasIncrementalIterationSpace =
false;
12750 case V_SgPlusAssignOp:
12751 case V_SgMinusAssignOp:
12752 incr_var = isSgVarRefExp(SkipCasting(isSgBinaryOp(incr)->get_lhs_operand()));
12755 case V_SgPlusPlusOp:
12756 case V_SgMinusMinusOp:
12757 incr_var = isSgVarRefExp(SkipCasting(isSgUnaryOp(incr)->get_operand()));
12763 if (incr_var == NULL)
12777 if (body != NULL) {
12778 *body = fs->get_body();
12815 ROSE_ASSERT (s != NULL);
12818 std::set<SgNode*> bset = SgNodeHelper::loopRelevantBreakStmtNodes (s);
12819 if (bset.size()!=0 )
12833 ROSE_ASSERT(loop != NULL);
12844 SgStatementPtrList & init = fs->get_init_stmt();
12845 if (init.size() !=1)
12848 SgExpression* ivarast=NULL, *lbast=NULL, *ubast=NULL, *stepast=NULL;
12851 bool isCase1=
false, isCase2=
false;
12853 if (isSgVariableDeclaration(init1))
12857 ROSE_ASSERT(ivarname != NULL);
12859 if (isSgAssignInitializer(initor))
12861 lbast = isSgAssignInitializer(initor)->
get_operand();
12867 SgVarRefExp* var = isSgVarRefExp(SkipCasting(ivarast));
12870 ivarname = var->get_symbol()->get_declaration();
12875 ROSE_ASSERT(!(isCase1&&isCase2));
12877 if (!(isCase1||isCase2))
12889 case V_SgLessOrEqualOp:
12890 if (isInclusiveUpperBound != NULL)
12891 *isInclusiveUpperBound =
true;
12892 if (hasIncrementalIterationSpace != NULL)
12893 *hasIncrementalIterationSpace =
true;
12895 case V_SgLessThanOp:
12896 if (isInclusiveUpperBound != NULL)
12897 *isInclusiveUpperBound =
false;
12898 if (hasIncrementalIterationSpace != NULL)
12899 *hasIncrementalIterationSpace =
true;
12901 case V_SgGreaterOrEqualOp:
12902 if (isInclusiveUpperBound != NULL)
12903 *isInclusiveUpperBound =
true;
12904 if (hasIncrementalIterationSpace != NULL)
12905 *hasIncrementalIterationSpace =
false;
12907 case V_SgGreaterThanOp:
12908 if (isInclusiveUpperBound != NULL)
12909 *isInclusiveUpperBound =
false;
12910 if (hasIncrementalIterationSpace != NULL)
12911 *hasIncrementalIterationSpace =
false;
12920 if (testvar == NULL)
12944 case V_SgPlusAssignOp:
12945 case V_SgMinusAssignOp:
12946 incr_var = isSgVarRefExp(SkipCasting(isSgBinaryOp(incr)->get_lhs_operand()));
12949 case V_SgPlusPlusOp:
12950 case V_SgMinusMinusOp:
12951 incr_var = isSgVarRefExp(SkipCasting(isSgUnaryOp(incr)->get_operand()));
12954 case V_SgAssignOp: {
12955 incr_var=isSgVarRefExp(SkipCasting(isSgBinaryOp(incr)->get_lhs_operand()));
12956 if(incr_var == NULL)
12958 SgAddOp* addOp=isSgAddOp(SkipCasting(isSgBinaryOp(incr)->get_rhs_operand()));
12959 SgSubtractOp* subtractOp=isSgSubtractOp(SkipCasting(isSgBinaryOp(incr)->get_rhs_operand()));
12963 else if(subtractOp)
12964 arithOp=subtractOp;
12967 ROSE_ASSERT(arithOp!=0);
12968 if(
SgVarRefExp* varRefExp=isSgVarRefExp(SkipCasting(isSgBinaryOp(arithOp)->get_lhs_operand()))) {
12970 incr_var=varRefExp;
12972 }
else if(
SgVarRefExp* varRefExp=isSgVarRefExp(SkipCasting(isSgBinaryOp(arithOp)->get_rhs_operand()))) {
12973 if(isSgAddOp(arithOp)) {
12975 incr_var=varRefExp;
12985 if (incr_var == NULL)
13006 if (body != NULL) {
13015 ROSE_ASSERT(loop != NULL);
13016 ROSE_ASSERT(lb != NULL);
13021 if (forstmt != NULL)
13026 Rose_STL_Container<SgNode* > testList = NodeQuery::querySubTree( *((forstmt->get_init_stmt()).begin()), V_SgAssignOp);
13027 if (testList.size()>0)
13029 ROSE_ASSERT(testList.size()==1);
13030 SgAssignOp * assignop = isSgAssignOp((*testList.begin()));
13031 ROSE_ASSERT(assignop);
13041 Rose_STL_Container<SgNode* > testList = NodeQuery::querySubTree( *((forstmt->get_init_stmt()).begin()), V_SgAssignInitializer );
13042 ROSE_ASSERT(testList.size()==1);
13044 ROSE_ASSERT(init != NULL);
13045 init->set_operand(lb);
13050 else if (dostmt != NULL)
13053 ROSE_ASSERT (init != NULL);
13055 ROSE_ASSERT (a_op!=NULL);
13062 cerr<<
"Error. SageInterface::setLoopLowerBound(), illegal loop type:"<< loop->
class_name()<<endl;
13063 ROSE_ASSERT (
false);
13070 ROSE_ASSERT(loop != NULL);
13071 ROSE_ASSERT(ub != NULL);
13075 if (forstmt != NULL)
13078 SgBinaryOp * binop= isSgBinaryOp(isSgExprStatement(forstmt->get_test())->get_expression());
13079 ROSE_ASSERT(binop != NULL);
13083 else if (dostmt != NULL)
13085 dostmt->set_bound(ub);
13091 cerr<<
"Error. SageInterface::setLoopUpperBound(), illegal loop type:"<< loop->
class_name()<<endl;
13092 ROSE_ASSERT (
false);
13100 ROSE_ASSERT(loop != NULL);
13101 ROSE_ASSERT(stride != NULL);
13105 if (dostmt != NULL)
13107 dostmt->set_increment(stride);
13111 else if (forstmt != NULL)
13115 Rose_STL_Container<SgNode*> testList = NodeQuery::querySubTree( forstmt->get_increment(), V_SgPlusPlusOp);
13116 if (testList.size()>0)
13118 ROSE_ASSERT(testList.size() == 1);
13120 (isSgPlusPlusOp( *testList.begin())->
get_operand()));
13122 forstmt->set_increment(plusassignop);
13126 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgMinusMinusOp);
13127 if (testList.size()>0)
13129 ROSE_ASSERT(testList.size()==1);
13131 (isSgMinusMinusOp(*testList.begin())->
get_operand()));
13133 forstmt->set_increment(plusassignop);
13137 testList = NodeQuery::querySubTree( forstmt->get_increment(), V_SgPlusAssignOp);
13138 if (testList.size()>0)
13140 ROSE_ASSERT(testList.size()==1);
13141 SgPlusAssignOp * assignop = isSgPlusAssignOp(*(testList.begin()));
13142 ROSE_ASSERT(assignop!=NULL);
13147 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgMinusAssignOp);
13148 if (testList.size()>0)
13150 ROSE_ASSERT(testList.size()==1);
13153 SgExprStatement* exprstmt = isSgExprStatement((*testList.begin())->get_parent());
13154 ROSE_ASSERT(exprstmt !=NULL);
13156 exprstmt->set_expression(plusassignop);
13167 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgAddOp);
13168 if (testList.size()>0)
13170 ROSE_ASSERT(testList.size()==1);
13172 SgAddOp * addop = isSgAddOp(*(testList.begin()));
13173 ROSE_ASSERT(addop!=NULL);
13187 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgSubtractOp);
13188 if (testList.size()>0)
13190 ROSE_ASSERT(testList.size()==1);
13192 SgSubtractOp * subtractop = isSgSubtractOp(*(testList.begin()));
13193 ROSE_ASSERT(subtractop!=NULL);
13196 SgAssignOp *assignop = isSgAssignOp((*testList.begin())->get_parent());
13197 ROSE_ASSERT(assignop !=NULL);
13204 cerr<<
"Error. SageInterface::setLoopStride(), illegal loop type:"<< loop->
class_name()<<endl;
13205 ROSE_ASSERT (
false);
13216 SgExpression *exp = (n != 0)? n->get_expression() : isSgExpression(s);
13219 case V_SgPlusAssignOp:
13220 case V_SgMinusAssignOp:
13221 case V_SgAndAssignOp:
13222 case V_SgIorAssignOp:
13223 case V_SgMultAssignOp:
13224 case V_SgDivAssignOp:
13225 case V_SgModAssignOp:
13226 case V_SgXorAssignOp:
13234 if ( init->variantT() == V_SgAssignInitializer)
13235 init = isSgAssignInitializer(init)->
get_operand();
13239 *readlhs = (exp->
variantT() != V_SgAssignOp);
13253 Rose_STL_Container<SgNode*> gotos = NodeQuery::querySubTree(top,V_SgGotoStatement);
13254 for (
size_t i = 0; i < gotos.size(); ++i)
13259 if (!lsParent)
continue;
13262 size_t j = std::find(bbStatements.begin(), bbStatements.end(), ls) - bbStatements.begin();
13264 ROSE_ASSERT (j != bbStatements.size());
13266 while (j < bbStatements.size() - 1 && isSgLabelStatement(bbStatements[j + 1]))
13270 gs->
set_label(isSgLabelStatement(bbStatements[j]));
13286 ROSE_ASSERT(decl != NULL);
13287 ROSE_ASSERT(assign_stmt != NULL);
13290 SgAssignOp * assign_op = isSgAssignOp (assign_stmt->get_expression());
13291 if (assign_op == NULL)
13294 if (assign_op_var == NULL)
return false;
13298 if (decl_var->get_initptr()!= NULL )
return false;
13305 if (decl_var_symbol!=NULL)
13308 if (assign_op_var->get_symbol() != decl_var_symbol)
return false;
13313 if (assign_op_var->get_symbol()->
get_name() != decl_var ->get_name())
return false;
13327 if (removeAssignStmt)
13331 decl_var->set_initptr(initor);
13342 ROSE_ASSERT(assign_stmt != NULL);
13343 SgAssignOp * assign_op = isSgAssignOp (assign_stmt->get_expression());
13344 if (assign_op == NULL)
13347 if (assign_op_var == NULL)
13351 ROSE_ASSERT(decl != NULL);
13353 if (decl_var->get_initptr()!= NULL)
13360 ROSE_ASSERT(decl_var != NULL);
13362 if (decl_var_symbol != NULL) {
13364 if (assign_op_var->get_symbol() != decl_var_symbol)
13370 if (assign_op_var->get_symbol()->
get_name() != decl_var ->get_name())
13383 decl_var->set_initptr(initor);
13413 ROSE_ASSERT (decl != NULL);
13417 if (initor == NULL)
13424 rhs = ainitor->get_operand();
13430 decl_var->set_initptr(NULL);
13442 cerr<<
"SageInterface::splitVariableDeclaration() topLevelOnly == false is not yet implemented."<<endl;
13443 ROSE_ASSERT (
false);
13446 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(scope, V_SgVariableDeclaration);
13447 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
13452 ROSE_ASSERT(decl != NULL);
13465 ROSE_ASSERT (root != NULL);
13468 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(root, V_SgVarRefExp);
13472 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
13475 ROSE_ASSERT (vRef != NULL);
13476 result.push_back(vRef);
13483 ROSE_ASSERT (root != NULL);
13484 Rose_STL_Container<SgNode*> constructorList= NodeQuery::querySubTree(root, V_SgConstructorInitializer);
13485 for (
size_t i =0; i< constructorList.size(); i++)
13490 Rose_STL_Container<SgNode*> varList = NodeQuery::querySubTree (a_type->get_index(),V_SgVarRefExp);
13491 for (
size_t j =0 ; j< varList.size(); j++)
13493 SgVarRefExp* var_exp = isSgVarRefExp(varList[j]) ;
13494 currentVarRefList.push_back(var_exp);
13518 SgExpression* lhsCopy = isSgExpression(lhs->copy(treeCopy));
13519 ROSE_ASSERT (lhsCopy);
13543 SgExpression* lhsCopy = isSgExpression(lhs->copy(treeCopy));
13544 ROSE_ASSERT (lhsCopy);
13568 SgExpression* lhsCopy = isSgExpression(lhs->copy(treeCopy));
13569 ROSE_ASSERT (lhsCopy);
13586 ROSE_ASSERT(from != NULL);
13588#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
13592 ROSE_ASSERT (
false);
13597 SgStatement* stmt = getStatementOfExpression(from);
13599 if (!isSgForInitStatement(stmt->
get_parent())) {
13608 if (!parent && isSgForInitStatement(stmt->
get_parent()))
13614 SgName varname =
"rose_temp__";
13615 if (newName ==
"") {
13623 vector<SgExpression*> ancestors;
13624 for (
SgExpression *expr = from, *anc = isSgExpression(fromparent); anc != 0;
13625 expr = anc, anc = isSgExpression(anc->get_parent()))
13627 if ((isSgAndOp(anc) && expr != isSgAndOp(anc)->get_lhs_operand()) ||
13630 ancestors.push_back(anc);
13633 for (vector<SgExpression*>::reverse_iterator ai = ancestors.rbegin(); ai != ancestors.rend(); ++ai)
13636 switch ((*ai)->variantT()) {
13641 case V_SgConditionalExp:
13643 default: assert (!
"Should not happen"); abort();
13648 if (ancestors.size() != 0) {
13656 ROSE_ASSERT (initname);
13658 replaceExpressionWithExpression(from, varref);
13662 initname->set_initializer(ai);
13664 myStatementInsert(stmt, vardecl,
true);
13685 SplitStatementGenerator gen;
13691 Rose_STL_Container<SgNode*> gotos = NodeQuery::querySubTree(top,
13692 V_SgGotoStatement);
13693 map<SgLabelStatement*, SgLabelStatement*> labelsToReplace;
for
13694 (
size_t i = 0; i < gotos.size(); ++i) {
13697 if (!gsParent)
continue;
13699 size_t j = std::find(bbStatements.begin(), bbStatements.end(), gs)
13700 - bbStatements.begin();
13701 ROSE_ASSERT (j != bbStatements.size());
13702 if (j == 0)
continue;
13703 if (isSgLabelStatement(bbStatements[j - 1])) {
13704 labelsToReplace[isSgLabelStatement(bbStatements[j - 1])] =
13708 for (
size_t i = 0; i < gotos.size(); ++i) {
13711 while (labelsToReplace.find(oldLabel) != labelsToReplace.end()) {
13712 oldLabel = labelsToReplace[oldLabel];
13722 case V_SgBoolValExp:
return (isSgBoolValExp(e)->get_value() != 0);
13724 case V_SgBoolValExp:
return (isSgBoolValExp(e)->get_value() ==
true);
13726 case V_SgIntVal:
return isSgIntVal(e)->get_value() != 0;
13727 case V_SgCastExp:
return isConstantTrue(isSgCastExp(e)->get_operand());
13729 case V_SgAddressOfOp:
return true;
13730 default:
return false;
13736 case V_SgBoolValExp:
return isSgBoolValExp(e)->get_value() ==
false;
13737 case V_SgIntVal:
return isSgIntVal(e)->get_value() == 0;
13738 case V_SgCastExp:
return
13740 case V_SgNotOp:
return isConstantTrue(isSgNotOp(e)->get_operand());
13741 default:
return false;
13748 if (!fc)
return false;
13750 if (fr == NULL)
return false;
13751 return fr->get_symbol()->get_declaration() == decl;
13757 if (!fc)
return false;
13759 if (fr == NULL)
return false;
13761 fr->get_symbol()->get_declaration()->get_qualified_name().getString();
13762 return (name == qualifiedName &&
13763 fc->get_args()->get_expressions().size() == arity);
13768 ROSE_ASSERT( e != NULL);
13784 ROSE_ASSERT(expList);
13786 expList->append_expression(exp);
13792 for (
size_t i = 0; i < exp.size(); ++i)
13801template <
class actualFunction>
13811 ROSE_ASSERT(paralist);
13816 cerr <<
"Waring! Setting a used SgFunctionParameterList to function: "
13817 << (func->get_name()).getString()<<endl
13818 <<
" Sharing parameter lists can corrupt symbol tables!"<<endl
13819 <<
" Please use deepCopy() to get an exclusive parameter list for each function declaration!"<<endl;
13824 if (func->get_parameterList() != NULL)
13825 if (func->get_parameterList() != paralist)
13826 delete func->get_parameterList();
13828 func->set_parameterList(paralist);
13836 ROSE_ASSERT(paraList != NULL);
13837 ROSE_ASSERT(initName != NULL);
13839 if (isPrepend ==
true)
13840 paraList->prepend_arg(initName);
13842 paraList->append_arg(initName);
13849 ROSE_ASSERT(initName->
get_parent() == paraList);
13859 if (func_decl != NULL)
13865 ROSE_ASSERT(func_def);
13875 initName->set_declptr(func_decl);
13887 initName->set_scope(scope);
13907 return addArg(paraList,initName,
false);
13912 return addArg(paraList,initName,
true);
13918 ROSE_ASSERT(pragma);
13919 if (decl->get_pragma()!=NULL)
delete (decl->get_pragma());
13920 decl->set_pragma(pragma);
13931 void testAstForUniqueNodes (
SgNode* node );
13934 printf (
"In SageInterface::appendStatement(): stmt = %p = %s scope = %p \n",stmt,stmt->
class_name().c_str(),scope);
13943 printf (
" --- scope was not specified as input! \n");
13948 ROSE_ASSERT(stmt != NULL);
13949 ROSE_ASSERT(scope != NULL);
13952 printf (
"In SageInterface::appendStatement(): stmt = %p = %s scope = %p = %s \n",stmt,stmt->
class_name().c_str(),scope,scope->
class_name().c_str());
13959 if (declarationStatement != NULL)
13987 scope->insertStatementInScope(stmt,
false);
13991 bool skipAddingStatement =
false;
13993 if (classDeclaration != NULL)
13999 printf (
"Since the parent of this SgClassDeclaration is set, it must have been previously added to the AST: classDeclaration = %p = %s \n",classDeclaration,classDeclaration->
class_name().c_str());
14005 skipAddingStatement = (classDeclaration->get_isAutonomousDeclaration() ==
false);
14009 skipAddingStatement = (classDeclaration->get_isAutonomousDeclaration() ==
false) || (classDeclaration->
get_parent() != NULL);
14024 if (statementAlreadyExistsInScope ==
true)
14026 if (isSgTemplateInstantiationDecl(classDeclaration) != NULL)
14030#if PRINT_DEVELOPER_WARNINGS
14031 printf (
"RARE ISSUE #1: In SageInterface::appendStatement(): This template instantiation has previously been added to the scope, so avoid doing so again (see test2013_198.C): classDeclaration = %p = %s scope = %p = %s \n",
14039 printf (
"RARE ISSUE #2: In SageInterface::appendStatement(): This statement has previously been added to the scope, so avoid doing so again (see rose.h): stmt = %p = %s scope = %p = %s \n",
14044 skipAddingStatement =
true;
14051 if (enumDeclaration != NULL)
14054 skipAddingStatement = (enumDeclaration->get_isAutonomousDeclaration() ==
false);
14063 if (skipAddingStatement ==
false && statementAlreadyExistsInScope ==
true)
14066 printf (
"RARE ISSUE #2: In SageInterface::appendStatement(): This statement has previously been added to the scope, so avoid doing so again (see rose.h): stmt = %p = %s scope = %p = %s \n",
14070 printf (
"Exiting as a test! \n");
14073 skipAddingStatement =
true;
14078 printf (
" --- skipAddingStatement = %s \n",skipAddingStatement ?
"true" :
"false");
14081 if (skipAddingStatement ==
false)
14093 printf (
" --- calling insertStatementInScope(): scope = %p = %s stmt = %p = %s \n",scope,scope->
class_name().c_str(),stmt,stmt->
class_name().c_str());
14095 scope->insertStatementInScope(stmt,
false);
14122 testAstForUniqueNodes(scope);
14131 ROSE_ASSERT (stmt != NULL);
14132 ROSE_ASSERT (for_init_stmt != NULL);
14135 printf (
"In SageInterface::appendStatement(): stmt = %p = %s scope = %p = %s (resetInternalMapsForTargetStatement: stmt) \n",stmt,stmt->
class_name().c_str(),scope,scope->
class_name().c_str());
14144 printf (
"In SageInterface::appendStatement(): stmt = %p = %s scope = %p = %s (resetInternalMapsForTargetStatement: scope) \n",stmt,stmt->
class_name().c_str(),scope,scope->
class_name().c_str());
14152 for_init_stmt->append_init_stmt (stmt);
14158 for (
size_t i = 0; i < stmts.size(); ++i)
14161#ifdef ROSE_DEBUG_NEW_EDG_ROSE_CONNECTION
14162 printf (
"In appendStatementList(): stmts[i = %" PRIuPTR
"] = %p = %s \n",i,stmts[i],stmts[i]->class_name().c_str());
14168 if (stmts[i]->get_parent() != NULL)
14171#ifdef ROSE_DEBUG_NEW_EDG_ROSE_CONNECTION
14172 printf (
" --- In appendStatementList(): stmts[i = %" PRIuPTR
"] will be added to scope (because stmts[i]->get_parent() != NULL (= %p = %s) \n",i,stmts[i]->get_parent(),stmts[i]->get_parent()->class_name().c_str());
14179 printf (
" --- WARNING: In appendStatementList(): stmts[i = %" PRIuPTR
"] not added to scope (because stmts[i]->get_parent() == NULL) \n",i);
14188 ROSE_ASSERT (stmt != NULL);
14191 printf (
"In SageInterface::prependStatement(): stmt = %p = %s scope = %p \n",stmt,stmt->
class_name().c_str(),scope);
14201 ROSE_ASSERT(scope != NULL);
14211 printf (
"In SageInterface::prependStatement(): stmt = %p = %s scope = %p = %s (resetInternalMapsForTargetStatement: stmt) \n",
14223 printf (
"In SageInterface::prependStatement(): stmt = %p = %s scope = %p = %s (resetInternalMapsForTargetStatement: scope) \n",
14235 printf (
"Calling insertStatementInScope() \n");
14241 scope->insertStatementInScope(stmt,
true);
14261 printf (
"Leaving SageInterface::prependStatement() \n");
14269 ROSE_ASSERT (stmt != NULL);
14270 ROSE_ASSERT (for_init_stmt != NULL);
14273 printf (
"In SageInterface::prependStatement(): stmt = %p = %s scope = %p = %s (resetInternalMapsForTargetStatement: stmt) \n",stmt,stmt->
class_name().c_str(),scope,scope->
class_name().c_str());
14282 printf (
"In SageInterface::prependStatement(): stmt = %p = %s scope = %p = %s (resetInternalMapsForTargetStatement: scope) \n",stmt,stmt->
class_name().c_str(),scope,scope->
class_name().c_str());
14290 for_init_stmt->prepend_init_stmt (stmt);
14295 for (
size_t i = stmts.size(); i > 0; --i)
14307 ROSE_ASSERT (scope != NULL);
14310 case V_SgBasicBlock:
14311 case V_SgClassDefinition:
14312 case V_SgFunctionDefinition:
14314 case V_SgNamespaceDefinitionStatement:
14318 case V_SgAssociateStatement :
14319 case V_SgBlockDataStatement :
14320 case V_SgCatchOptionStmt:
14321 case V_SgDoWhileStmt:
14322 case V_SgForAllStatement:
14323 case V_SgForStatement:
14324 case V_SgFortranDo:
14326 case V_SgSwitchStatement:
14327 case V_SgUpcForAllStatement:
14328 case V_SgWhileStmt:
14333 cout<<
"unrecognized or unhandled scope type for SageInterface::hasSimpleChildrenList() "<<endl;
14346 SgDeclarationStatementPtrList & declarationList = globalScope->
get_declarations();
14349 SgDeclarationStatementPtrList::iterator i = declarationList.begin();
14351 while (i != declarationList.end() && (*i)->get_file_info() != NULL && (*i)->get_file_info()->isFrontendSpecific() ==
true)
14354 printf (
"(*i)->get_file_info()->get_file_id() = %d isFrontendSpecific = %s \n",(*i)->get_file_info()->get_file_id(),(*i)->get_file_info()->isFrontendSpecific() ?
"true" :
"false");
14356 last_statement = *i;
14361 ROSE_ASSERT(last_statement != NULL);
14363 printf (
"last_statement = %p = %s \n",last_statement,last_statement->
class_name().c_str());
14366 printf (
"Exiting as a test! \n");
14370 return last_statement;
14379 ROSE_ASSERT(targetStmt &&newStmt);
14380 ROSE_ASSERT(targetStmt != newStmt);
14382 if (parent == NULL)
14384 cerr <<
"Empty parent pointer for target statement. May be caused by the wrong order of target and new statements in insertStatement(targetStmt, newStmt)"<<endl;
14385 ROSE_ASSERT(parent);
14388 if (isSgLabelStatement(parent) != NULL)
14391 printf (
"In SageInterface::insertStatement(): Detected case of label statement as parent, using parent of label statement \n");
14396 ROSE_ASSERT(isSgLabelStatement(parent) == NULL);
14400 printf (
"In SageInterface::insertStatement(): insert newStmt = %p = %s before/after targetStmt = %p = %s \n",newStmt,newStmt->
class_name().c_str(),targetStmt,targetStmt->
class_name().c_str());
14418 ROSE_ASSERT(scope);
14421 printf (
"targetStmt = %p = %s \n",targetStmt,targetStmt->
class_name().c_str());
14422 printf (
"scope = %p = %s \n",scope,scope->
class_name().c_str());
14440 ROSE_ASSERT(isSgStatement(parent) != NULL);
14445 ROSE_ASSERT(targetStmt != NULL);
14449 printf (
"In SageInterface::insertStatement(): after checking for associated comments \n");
14450 reportNodesMarkedAsModified(scope);
14456 if (autoMovePreprocessingInfo)
14458 if (comments != NULL && isSgBasicBlock(newStmt) == NULL)
14460 vector<int> captureList;
14462 printf (
"Found attached comments (at %p = %s, inserting %p = %s insertBefore = %s): comments->size() = %" PRIuPTR
" \n",
14463 targetStmt,targetStmt->
class_name().c_str(),newStmt,newStmt->
class_name().c_str(),insertBefore ?
"true" :
"false",comments->size());
14470 printf (
"Warning: at present statements being inserted should not have attached comments of CPP directives (could be a problem, but comment relocation is not disabled). \n");
14475 int commentIndex = 0;
14476 AttachedPreprocessingInfoType::iterator i;
14477 for (i = comments->begin(); i != comments->end(); i++)
14479 ROSE_ASSERT ( (*i) != NULL );
14481 printf (
" Attached Comment (relativePosition=%s): %s\n",
14482 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
14483 (*i)->getString().c_str());
14484 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
14485 (*i)->get_file_info()->display(
"comment/directive location");
14488 if ((*i)->getRelativePosition() == relativePosition)
14491 captureList.push_back(commentIndex);
14498 if (captureList.empty() ==
false)
14504 ROSE_ASSERT(surroundingStatement != targetStmt);
14505 ROSE_ASSERT(surroundingStatement != NULL);
14507 if (surroundingStatement == NULL)
14510 surroundingStatement = (insertBefore ==
true) ? newStmt : newStmt;
14515 vector<int>::iterator j = captureList.begin();
14516 while (j != captureList.end())
14524 (*comments)[*j] = NULL;
14531 for (
size_t n = 0; n < captureList.size(); n++)
14533 AttachedPreprocessingInfoType::iterator k = comments->begin();
14534 while (k != comments->end())
14539 comments->erase(k);
14552 if (comments != NULL)
14554 printf (
"Warning: special rules appear to apply to the insertion of a SgBasicBlock which has attached comments and/or CPP directives (comment relocation disabled). \n");
14561 printf (
"In SageInterface::insertStatement(): after processing associated comments \n");
14562 reportNodesMarkedAsModified(scope);
14565 if (isSgIfStmt(parent))
14567 if (isSgIfStmt(parent)->get_conditional()==targetStmt)
14573 if (isSgIfStmt(parent)->get_true_body()==targetStmt)
14593 if (isSgIfStmt(parent)->get_false_body()==targetStmt)
14607 if (isSgWhileStmt(parent))
14609 if (isSgWhileStmt(parent)->get_condition()==targetStmt)
14615 if (isSgWhileStmt(parent)->get_body()==targetStmt)
14618 isSgWhileStmt(parent)->
set_body(newparent);
14628 if (isSgDoWhileStmt(parent))
14630 if (isSgDoWhileStmt(parent)->get_condition()==targetStmt)
14636 if (isSgDoWhileStmt(parent)->get_body()==targetStmt)
14639 isSgDoWhileStmt(parent)->
set_body(newparent);
14649 if (isSgForStatement(parent))
14651 if (isSgForStatement(parent)->get_loop_body()==targetStmt)
14662 if (isSgForStatement(parent)->get_test()==targetStmt)
14683 p->set_body(newparent);
14691 ROSE_ASSERT(stmnt != NULL);
14713 printf (
"In SageInterface::insertStatement(): at BASE of function \n");
14714 reportNodesMarkedAsModified(scope);
14723 for (
size_t i = 0; i < newStmts.size(); ++i)
14730 for (
size_t i = newStmts.size(); i > 0; --i)
14739 insertStatement(targetStmt,newStmt,
false, autoMovePreprocessingInfo);
14750 ROSE_ASSERT (stmt != NULL);
14751 ROSE_ASSERT (scope != NULL);
14763 ROSE_ASSERT (scope != NULL);
14764 vector <SgStatement* >::iterator iter;
14766 for (iter= stmt_list.begin(); iter != stmt_list.end(); iter++)
14768 if (iter == stmt_list.begin())
14774 ROSE_ASSERT (prev_stmt != NULL);
14783 ROSE_ASSERT(newStmt!=NULL);
14784 ROSE_ASSERT(scope!=NULL);
14786 if (!isSgDeclarationStatement(targetStmt)) {
14796 ROSE_ASSERT(scope!=NULL);
14798 if (!isSgDeclarationStatement(targetStmt)) {
14821 ROSE_ASSERT(target);
14822 ROSE_ASSERT(operand);
14823 ROSE_ASSERT(target!=operand);
14824 switch (target->variantT())
14826 case V_SgActualArgumentExpression:
14827 isSgActualArgumentExpression(target)->set_expression(operand);
14830 isSgAsmOp(target)->set_expression(operand);
14833 isSgSizeOfOp(target)->set_operand_expr(operand);
14836 isSgTypeIdOp(target)->set_operand_expr(operand);
14839 isSgVarArgOp(target)->set_operand_expr(operand);
14841 case V_SgVarArgStartOneOperandOp:
14842 isSgVarArgStartOneOperandOp(target)->set_operand_expr(operand);
14844 case V_SgAssignInitializer:
14845 isSgAssignInitializer (target)->
set_operand(operand);
14848 if (isSgUnaryOp(target)!=NULL)
14852 cerr<<
"\tSageInterface::setOperand(): unhandled case for target expression of type "
14853 <<target->class_name()<<endl;
14858 markLhsValues(target);
14864 ROSE_ASSERT(target);
14866 ROSE_ASSERT(target!=lhs);
14867 bool hasrhs =
false;
14873 if (varargcopy!=NULL)
14875 varargcopy->set_lhs_operand(lhs);
14876 if( varargcopy->get_rhs_operand()!=NULL) hasrhs=
true;
14878 else if(varargstart!=NULL)
14880 varargstart->set_lhs_operand(lhs);
14881 if( varargstart->get_rhs_operand()!=NULL) hasrhs=
true;
14883 else if(binary!=NULL)
14890 cout<<
"SageInterface::setLhsOperand(): unhandled case for target expression of type "
14891 <<target->class_name()<<endl;
14898 markLhsValues(target);
14903 ROSE_ASSERT(target);
14905 ROSE_ASSERT(target!=rhs);
14906 bool haslhs =
false;
14912 if (varargcopy!=NULL)
14914 varargcopy->set_rhs_operand(rhs);
14915 if( varargcopy->get_lhs_operand()!=NULL) haslhs=
true;
14917 else if(varargstart!=NULL)
14919 varargstart->set_rhs_operand(rhs);
14920 if( varargstart->get_lhs_operand()!=NULL) haslhs=
true;
14922 else if(binary!=NULL)
14929 cout<<
"SageInterface::setRhsOperand(): unhandled case for target expression of type "
14930 <<target->class_name()<<endl;
14936 markLhsValues(target);
14955 ROSE_ASSERT(parentFileList != NULL);
14961 if (parentDirectory != NULL)
14964 parentDirectory->get_directoryList()->get_listOfDirectories().push_back(directory);
14971 project = isSgProject(parentFileList->
get_parent());
14972 ROSE_ASSERT(project != NULL);
14975 project->get_directoryList()->get_listOfDirectories().push_back(directory);
14982 directory->get_fileList()->get_listOfFiles().push_back(file);
14985 parentFileList->get_listOfFiles().erase(find(parentFileList->get_listOfFiles().begin(),parentFileList->get_listOfFiles().end(),file));
14995 ROSE_ASSERT(structDecl != NULL);
14996 ROSE_ASSERT(scope != NULL);
14998 ROSE_ASSERT(nondefdecl != NULL);
15024 SgName name = structDecl->get_name();
15038 if (mysymbol == NULL)
15040 printf (
"Note: SageInterface::fixStructDeclaration(): structDecl = %p nondefdecl = %p (mysymbol == NULL) \n",structDecl,nondefdecl);
15044 ROSE_ASSERT(structDecl->
get_scope() != NULL);
15049 ROSE_ASSERT(mysymbol);
15052 printf (
"############## DANGER:DANGER:DANGER ################\n");
15054 printf (
"In SageInterface::fixStructDeclaration(): Adding class symbol to scope = %p = %s \n",scope,scope->
class_name().c_str());
15062 printf (
"*** WARNING: In SageInterface::fixStructDeclaration(): (mysymbol == NULL) Commented out the setting of the parent to be the same as the scope \n");
15071 printf (
"In SageInterface::fixStructDeclaration(): (mysymbol == NULL) Skipped building an associated symbol! \n");
15076 ROSE_ASSERT(nondefdecl->get_type() != NULL);
15079 ROSE_ASSERT(nondefdecl->get_type()->
variantT() != V_SgNode);
15082 ROSE_ASSERT(isSgClassType(nondefdecl->get_type()) != NULL);
15086 if (nondefdecl->get_type() == NULL)
15090 ROSE_ASSERT (nondefdecl->get_type() != NULL);
15093 if (defdecl != NULL)
15096 ROSE_ASSERT(defdecl->get_type()->
variantT() != V_SgNode);
15099 ROSE_ASSERT(isSgClassType(defdecl->get_type()) != NULL);
15103 if (defdecl != NULL)
15106 ROSE_ASSERT(defdecl->get_type() != NULL);
15107 if (defdecl->get_type() != nondefdecl->get_type())
15109 printf (
"ERROR: defdecl->get_type() != nondefdecl->get_type(): what are these: \n");
15110 printf (
" defdecl->get_type() = %p = %s \n",defdecl ->get_type(),defdecl ->get_type()->class_name().c_str());
15111 SgNamedType* namedType_definingDecl = isSgNamedType(defdecl->get_type());
15112 if (namedType_definingDecl != NULL)
15114 printf (
"namedType_definingDecl->get_declaration() = %p = %s \n",namedType_definingDecl->get_declaration(),namedType_definingDecl->get_declaration()->
class_name().c_str());
15116 printf (
" nondefdecl->get_type() = %p = %s \n",nondefdecl->get_type(),nondefdecl->get_type()->
class_name().c_str());
15117 SgNamedType* namedType_nondefiningDecl = isSgNamedType(nondefdecl->get_type());
15118 if (namedType_nondefiningDecl != NULL)
15120 printf (
"namedType_nondefiningDecl->get_declaration() = %p = %s \n",namedType_nondefiningDecl->get_declaration(),namedType_nondefiningDecl->get_declaration()->
class_name().c_str());
15136 ROSE_ASSERT(structDecl);
15137 ROSE_ASSERT(scope);
15139 ROSE_ASSERT(nondefdecl);
15158 if (mysymbol==NULL)
15165 ROSE_ASSERT(mysymbol);
15167 printf (
"In SageInterface::fixNamespaceDeclaration(): inserting namespace symbol into scope = %p = %s \n",scope,scope->
class_name().c_str());
15171 ROSE_ASSERT(defdecl);
15181#define DEBUG__SageInterface__fixVariableDeclaration 0
15185 ROSE_ASSERT(varDecl != NULL);
15186 ROSE_ASSERT(scope != NULL);
15188 SgInitializedNamePtrList namelist = varDecl->
get_variables();
15193#if DEBUG__SageInterface__fixVariableDeclaration
15194 printf (
"In SageInterface::fixVariableDeclaration():\n");
15195 printf (
" varDecl = %p scope = %p = %s \n", varDecl);
15196 printf (
" scope = %p : %s \n", scope, scope->
class_name().c_str());
15199 ROSE_ASSERT(namelist.size() > 0);
15201 SgInitializedNamePtrList::iterator i;
15202 for (i = namelist.begin(); i != namelist.end(); i++)
15205 ROSE_ASSERT(initName != NULL);
15206#if DEBUG__SageInterface__fixVariableDeclaration
15207 printf (
" initName = %p\n", initName);
15208 printf (
" initName->get_scope() = %p : %s\n", initName->get_scope(), initName->get_scope() ? initName->get_scope()->
class_name().c_str() :
"");
15211 SgName name = initName->get_name();
15212#if DEBUG__SageInterface__fixVariableDeclaration
15213 printf (
" name = %s\n", name.str());
15218#if DEBUG__SageInterface__fixVariableDeclaration
15219 printf (
" name = %s\n", name.str());
15226 if (preAssociatedScope != NULL) {
15227 requiredScope = preAssociatedScope;
15231 initName->set_scope(requiredScope);
15236 ROSE_ASSERT(requiredScope != NULL);
15237 SgVariableSymbol* varSymbol = requiredScope->lookup_variable_symbol(name);
15238#if DEBUG__SageInterface__fixVariableDeclaration
15239 printf (
" varSymbol = %p (%s)\n", varSymbol, varSymbol ? varSymbol->
class_name().c_str() :
"");
15241 if (varSymbol == NULL) {
15242 if (scope == initName->get_scope()) {
15243 if (isSgTemplateVariableDeclaration(varDecl)) {
15248 ROSE_ASSERT(varSymbol);
15253 ROSE_ASSERT(prev_decl);
15254 if (initName != prev_decl) {
15255 initName->set_prev_decl_item(prev_decl);
15257 ROSE_ASSERT(initName->get_prev_decl_item() != initName);
15259#if DEBUG__SageInterface__fixVariableDeclaration
15260 printf (
" varSymbol = %p (%s)\n", varSymbol, varSymbol ? varSymbol->
class_name().c_str() :
"");
15278 Rose_STL_Container<SgNode*> varList;
15281 Rose_STL_Container<SgNode*> reflist = NodeQuery::querySubTree(root, V_SgVarRefExp);
15282 for (Rose_STL_Container<SgNode*>::iterator i=reflist.begin();i!=reflist.end();i++)
15284 varRef= isSgVarRefExp(*i);
15285 ROSE_ASSERT(varRef->get_symbol());
15288 ROSE_ASSERT (initname != NULL);
15291 SgName varName=initname->get_name();
15302 if (varRef == arrowExp->get_rhs_operand_i())
15306 SgType* lhs_type = arrowExp->get_lhs_operand_i()->get_type() ;
15307 lhs_type = lhs_type->
stripType(SgType::STRIP_MODIFIER_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE | SgType::STRIP_TYPEDEF_TYPE);
15309 ROSE_ASSERT(ptrType);
15310 SgClassType* clsType = isSgClassType(ptrType->get_base_type()-> stripType(SgType::STRIP_MODIFIER_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE | SgType::STRIP_TYPEDEF_TYPE));
15311 ROSE_ASSERT(clsType);
15329 if (varRef == dotExp->get_rhs_operand_i())
15334 SgType* lhs_type = dotExp->get_lhs_operand_i()->get_type() ;
15335 lhs_type = lhs_type->
stripType(SgType::STRIP_MODIFIER_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE | SgType::STRIP_TYPEDEF_TYPE);
15337 ROSE_ASSERT(clsType);
15361 if (realSymbol==NULL)
15368 ROSE_ASSERT(realSymbol!=(varRef->get_symbol()));
15375 bool toDelete =
true;
15377 SgSymbol* symbolToDelete = varRef->get_symbol();
15378 varRef->set_symbol(isSgVariableSymbol(realSymbol));
15381 if (varList.empty())
15383 VariantVector vv(V_SgVarRefExp);
15384 varList = NodeQuery::queryMemoryPool(vv);
15387 for (Rose_STL_Container<SgNode*>::iterator i = varList.begin();
15388 i != varList.end(); ++i)
15392 if (var->get_symbol() == symbolToDelete)
15402 delete symbolToDelete;
15411 delete (varRef->get_symbol());
15415 varRef->set_symbol(isSgVariableSymbol(realSymbol));
15422 if (cleanUnusedSymbols)
15429 Rose_STL_Container<SgNode*> symbolList;
15430 VariantVector sym_vv(V_SgVariableSymbol);
15431 symbolList = NodeQuery::queryMemoryPool(sym_vv);
15433 Rose_STL_Container<SgNode*> varList;
15434 VariantVector var_vv(V_SgVarRefExp);
15438 varList = NodeQuery::querySubTree(root, V_SgVarRefExp);
15441 for (Rose_STL_Container<SgNode*>::iterator i = symbolList.begin();
15442 i != symbolList.end(); ++i)
15445 ROSE_ASSERT(symbolToDelete);
15449 bool toDelete =
true;
15453 for (Rose_STL_Container<SgNode*>::iterator j = varList.begin();
15454 j != varList.end(); ++j)
15459 if (var->get_symbol() == symbolToDelete)
15470 std::cout <<
"Symbol " << symbolToDelete->
get_name().str() <<
' ' << symbolToDelete <<
15471 ' ' << symbolToDelete->get_declaration() <<
" is deleted." << std::endl;
15473 delete symbolToDelete->get_declaration();
15474 delete symbolToDelete;
15487 ROSE_ASSERT(label_stmt);
15496 if (isSgFunctionDefinition(scope) !=
nullptr)
15498 ASSERT_not_null(label_scope);
15504 SgLabelSymbol* lsymbol = label_scope->lookup_label_symbol(name);
15506 if (lsymbol ==
nullptr)
15511 ASSERT_not_null(lsymbol);
15523 ROSE_ASSERT (stmt != NULL);
15524 ROSE_ASSERT (label_value >0 && label_value <=99999);
15527 if (label_scope == NULL)
15531 ROSE_ASSERT (label_scope != NULL);
15533 SgLabelSymbol * symbol = label_scope->lookup_label_symbol (label_name);
15534 if (symbol == NULL)
15540 ROSE_ASSERT(symbol != NULL);
15541 symbol->set_fortran_statement(stmt);
15542 symbol->set_numeric_label_value(label_value);
15547 cerr<<
"Error. SageInterface::setFortranNumericLabel() tries to set a duplicated label value!"<<endl;
15548 ROSE_ASSERT (
false);
15557 case SgLabelSymbol::e_start_label_type:
15559 stmt->set_numeric_label(ref_exp);
15562 case SgLabelSymbol::e_end_label_type:
15564 stmt->set_end_numeric_label(ref_exp);
15569 std::cerr <<
"SageInterface::setFortranNumericLabel: unimplemented for label_type " << label_type <<
"\n";
15581 ROSE_ASSERT (func_def != NULL);
15586 std::set<SgNode*>::iterator iter ;
15587 for (iter=symbols.begin(); iter !=symbols.end(); iter++)
15592 int cur_val = l_symbol->get_numeric_label_value();
15593 if (result <=cur_val)
15594 result = cur_val +10;
15598 ROSE_ASSERT (result <= 99999);
15609 ROSE_ASSERT(scope != NULL);
15614 ROSE_ASSERT(fTable != NULL);
15621 printf (
"WARNING: Skip setting the scope of the SgFunctionTypeTable scope = %p = %s \n",scope,scope->
class_name().c_str());
15627 printf (
"In SageInterface::fixStatement(): stmt = %p = %s \n",stmt,stmt->
class_name().c_str());
15640 if (tmfunc != NULL)
15641 assert(tmfunc->
variantT() == V_SgTemplateMemberFunctionDeclaration);
15642 else if (mfunc != NULL)
15643 assert(mfunc->
variantT() == V_SgMemberFunctionDeclaration || mfunc->
variantT() == V_SgTemplateInstantiationMemberFunctionDecl);
15644 else if (tfunc != NULL)
15645 assert(tfunc->
variantT() == V_SgTemplateFunctionDeclaration);
15646 else if (procfunc != NULL)
15647 assert(procfunc->
variantT() == V_SgProcedureHeaderStatement);
15648 else if (progfunc != NULL)
15649 assert(progfunc->
variantT() == V_SgProgramHeaderStatement);
15650 else if (func != NULL)
15651 assert(func->
variantT() == V_SgFunctionDeclaration || func->
variantT() == V_SgTemplateInstantiationFunctionDecl);
15655 printf (
"In SageInterface::fixStatement(): scope = %p = %s \n",scope,scope->
class_name().c_str());
15656 printf (
"In SageInterface::fixStatement(): stmt->get_scope() = %p \n",stmt->
get_scope());
15668 printf (
"Looking up the function symbol using name = %s and type = %p = %s \n",func->get_name().str(),func->get_type(),func->get_type()->
class_name().c_str());
15674 if (tmfunc != NULL)
15676 SgTemplateParameterPtrList & templateParameterList = tmfunc->get_templateParameters();
15679 func_symbol = scope->lookup_template_member_function_symbol (func->get_name(), func->get_type(),&templateParameterList);
15681 else if (mfunc != NULL)
15684 SgTemplateArgumentPtrList* templateArgumentList = (templateInstantiationMemberFunctionDecl != NULL) ? &(templateInstantiationMemberFunctionDecl->
get_templateArguments()) : NULL;
15686 func_symbol = scope->lookup_nontemplate_member_function_symbol (func->get_name(), func->get_type(),templateArgumentList);
15688 else if (tfunc != NULL)
15690 SgTemplateParameterPtrList & templateParameterList = tfunc->get_templateParameters();
15692 printf (
"In SageInterface::fixStatement(): templateParameterList.size() = %" PRIuPTR
" \n",templateParameterList.size());
15696 func_symbol = scope->lookup_template_function_symbol (func->get_name(), func->get_type(),&templateParameterList);
15698 else if (procfunc != NULL)
15701 printf (
"In SageInterface::fixStatement(): procfunc->get_name() = %s calling lookup_function_symbol() \n",procfunc->get_name().str());
15703 func_symbol = scope->lookup_function_symbol (procfunc->get_name(), procfunc->get_type());
15704 assert(func_symbol != NULL);
15706 else if (progfunc != NULL)
15708 func_symbol = scope->lookup_function_symbol (progfunc->get_name(), progfunc->get_type());
15709 assert(func_symbol != NULL);
15711 else if (func != NULL)
15714 printf (
"In SageInterface::fixStatement(): func->get_name() = %s calling lookup_function_symbol() \n",func->get_name().str());
15717 SgTemplateArgumentPtrList* templateArgumentList = (templateInstantiationFunctionDecl != NULL) ? &(templateInstantiationFunctionDecl->
get_templateArguments()) : NULL;
15719 func_symbol = scope->lookup_function_symbol (func->get_name(), func->get_type(),templateArgumentList);
15724 if (func_symbol == NULL)
15736 printf (
"In SageInterface::fixStatement(): func_symbol = %p \n",func_symbol);
15738 assert(func_symbol != NULL);
15749 printf (
"Need to handle SgTemplateDeclaration IR nodes as well...(implement later) \n");
15757 if (isSgVariableDeclaration(stmt))
15764 ROSE_ASSERT(classDeclaration !=
nullptr);
15767 else if (isSgClassDeclaration(stmt))
15771 else if (isSgLabelStatement(stmt))
15775 else if (isSgFunctionDeclaration(stmt))
15783 ROSE_ASSERT(fTable);
15792 printf (
"In SageInterface::fixStatement(): scope = %p = %s \n",scope,scope->
class_name().c_str());
15793 printf (
"In SageInterface::fixStatement(): stmt->get_scope() = %p \n",stmt->
get_scope());
15804 printf (
"Looking up the function symbol using name = %s and type = %p = %s \n",func->get_name().str(),func->get_type(),func->get_type()->
class_name().c_str());
15806 SgFunctionSymbol* func_symbol = scope->lookup_function_symbol (func->get_name(), func->get_type());
15808 printf (
"In SageInterface::fixStatement(): func_symbol = %p \n",func_symbol);
15809 if (func_symbol == NULL)
15821 ROSE_ASSERT (func_symbol != NULL);
15827 printf (
"In SageInterface::fixStatement(): found a valid function so no need to insert new symbol \n");
15835 if (local_symbol == NULL)
15840 if (func != src_func )
15850 else if (isSgTemplateDeclaration(stmt) != NULL)
15865 case V_SgEnumDeclaration:
15866 case V_SgTemplateDeclaration:
15867 case V_SgTypedefDeclaration:
15868 case V_SgFunctionDeclaration:
15869 case V_SgMemberFunctionDeclaration:
15870 case V_SgTemplateInstantiationFunctionDecl:
15885 printf (
"In SageInterface::fixStatement(): switch default case used (likely OK): stmt = %p = %s \n",stmt,stmt->
class_name().c_str());
15888 printf (
"switch case not handled properly: stmt = %p = %s \n",stmt,stmt->
class_name().c_str());
15920 ROSE_ASSERT(func != NULL && scope != NULL);
15922 ROSE_ASSERT(func != NULL);
15923 ROSE_ASSERT(scope != NULL);
15925 SgStatementPtrList stmtList, sameFuncList;
15932 SgDeclarationStatementPtrList::iterator i;
15933 for (i=declList.begin();i!=declList.end();i++)
15934 stmtList.push_back(*i);
15942 if (firstNondefiningFunctionDeclaration != NULL)
15947 printf (
"In SageInterface::updateDefiningNondefiningLinks(): func = %p Found a valid pointer to a firstNondefiningFunctionDeclaration = %p \n",func,firstNondefiningFunctionDeclaration);
15958 printf (
"WARNING: symbol for func->get_firstNondefiningDeclaration() = %p = %s = %s is not present in the scope = %p = %s associated with the firstNondefiningDeclaration \n",
15966 SgSymbol* functionSymbol = scope->lookup_function_symbol(func->get_name(),func->get_type());
15967 if (functionSymbol != NULL)
15969 printf (
"In SageInterface::updateDefiningNondefiningLinks(): func = %p Found a valid symbol = %p \n",func,functionSymbol);
15973 printf (
"In SageInterface::updateDefiningNondefiningLinks(): func = %p functionSymbol == NULL \n",func);
15978 SgStatementPtrList::iterator j;
15979 for (j = stmtList.begin(); j != stmtList.end(); j++)
15982 if (func_decl != NULL)
15989 sameFuncList.push_back(func_decl);
15995 printf (
"func = %p \n",func);
15999 ROSE_ASSERT(func != NULL);
16003 for (j = sameFuncList.begin(); j != sameFuncList.end(); j++)
16008 ROSE_ASSERT(func != NULL);
16011 ROSE_ASSERT(sameFuncList.empty() ==
false);
16013 if (func == isSgFunctionDeclaration(*(sameFuncList.begin())))
16015 for (j = sameFuncList.begin(); j != sameFuncList.end(); j++)
16019 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 1) Testing j = %p set_firstNondefiningDeclaration(%p) \n",*j,func);
16023 if (func_decl != func)
16030 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 1) Calling j = %p set_firstNondefiningDeclaration(%p) \n",*j,func);
16040 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 2) Testing func = %p set_firstNondefiningDeclaration(%p) \n",func,isSgFunctionDeclaration(*(sameFuncList.begin()))->
get_firstNondefiningDeclaration());
16047 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 2) Calling func = %p set_firstNondefiningDeclaration(%p) \n",func,isSgFunctionDeclaration(*(sameFuncList.begin()))->
get_firstNondefiningDeclaration());
16056 assert(source_file != NULL);
16057 assert(position == PreprocessingInfo::before || position == PreprocessingInfo::after);
16059 SgGlobal * global_scope = source_file->get_globalScope();
16062 ROSE_ASSERT(result);
16078 PreprocessingInfo::DirectiveType dtype )
16080 ASSERT_not_null(target);
16083 PreprocessingInfo::DirectiveType mytype=dtype;
16088 if (mytype == PreprocessingInfo::CpreprocessorUnknownDeclaration)
16094 mytype = PreprocessingInfo::C_StyleComment;
16099 mytype = PreprocessingInfo::CplusplusStyleComment;
16104 mytype = PreprocessingInfo::F90StyleComment;
16109 mytype = PreprocessingInfo::AdaStyleComment;
16114 mytype = PreprocessingInfo::JovialStyleComment;
16118 cout <<
"WARNING: SageInterface::attachComment(): Unknown programming language \n";
16124 bool resetPositionInfo =
false;
16127 case PreprocessingInfo::C_StyleComment: comment =
"/* " + content +
" */";
break;
16128 case PreprocessingInfo::CplusplusStyleComment: comment =
"// " + content;
break;
16129 case PreprocessingInfo::FortranStyleComment: comment =
" C " + content;
break;
16130 case PreprocessingInfo::F90StyleComment: comment =
"!" + content;
break;
16131 case PreprocessingInfo::AdaStyleComment: comment =
"-- " + content;
break;
16132 case PreprocessingInfo::JovialStyleComment:
16136 case PreprocessingInfo::CpreprocessorLineDeclaration:
16137 comment =
"#myline " + content;
16138 mytype = PreprocessingInfo::CplusplusStyleComment;
16139 resetPositionInfo =
true;
16141 case PreprocessingInfo::CpreprocessorIfndefDeclaration: comment =
"#ifndef " + content +
"\n";
break;
16142 case PreprocessingInfo::CpreprocessorDefineDeclaration: comment =
"#define " + content +
"\n";
break;
16143 case PreprocessingInfo::CpreprocessorEndifDeclaration: comment =
"#endif" + (content.empty() ?
"\n" : (
" /* " + content +
" */\n"));
break;
16144 case PreprocessingInfo::CpreprocessorEnd_ifDeclaration: comment =
"#end if" + (content.empty() ?
"\n" : (
" /* " + content +
" */\n"));
break;
16148 printf (
"Error: default in switch reached in SageInterface::attachComment() PreprocessingInfo::DirectiveType == %d \n",mytype);
16153 result =
new PreprocessingInfo (mytype,comment,
"transformation-generated", 0, 0, 0, position);
16156 if (resetPositionInfo ==
true)
16159 *(result->get_file_info()) = *(target->get_file_info());
16169 ASSERT_not_null(result);
16170 target->addToAttachedPreprocessingInfo(result);
16176 PreprocessingInfo::CpreprocessorIfDeclaration,
16178 "transformation-generated", 0, 0, 0,
16179 PreprocessingInfo::before
16181 target->addToAttachedPreprocessingInfo(if_macro);
16184 PreprocessingInfo::CpreprocessorEndifDeclaration,
16186 "transformation-generated", 0, 0, 0,
16187 PreprocessingInfo::after
16189 target->addToAttachedPreprocessingInfo(endif_macro);
16202static map<SgSourceFile*, map<string, PreprocessingInfo*> > fileHeaderDict;
16207 if (isSystemHeader)
16208 header_key=
"<"+header_file_name+
">";
16210 header_key=
"\""+header_file_name+
"\"";
16212 if (fileHeaderDict.count(source_file) && fileHeaderDict[source_file].count(header_key))
16213 return fileHeaderDict[source_file][header_key];
16215 vector<SgLocatedNode*> candidates;
16218 SgGlobal* global= source_file -> get_globalScope();
16220 candidates.push_back(global);
16223 SgDeclarationStatementPtrList decl_stmt_list = global->
get_declarations();
16224 for (SgDeclarationStatementPtrList::iterator iter= decl_stmt_list.begin(); iter!=decl_stmt_list.end(); iter++)
16225 candidates.push_back(*iter);
16227 bool found =
false;
16228 for (
size_t ci=0; ci<candidates.size(); ci++)
16233 if (comments == NULL)
continue;
16234 AttachedPreprocessingInfoType::iterator i;
16235 for (i = comments->begin (); i != comments->end (); i++)
16237 if ((*i)->getTypeOfDirective () != PreprocessingInfo::CpreprocessorIncludeDeclaration)
continue;
16238 string content = (*i)->getString ();
16239 if (content.find(header_key) != string::npos)
16241 fileHeaderDict[source_file][header_key] = *i;
16252 return fileHeaderDict[source_file][header_key];
16262 bool supportTokenUnparsing =
false;
16264 assert(source_file != NULL);
16265 assert(position == PreprocessingInfo::before || position == PreprocessingInfo::after);
16267 SgGlobal * global_scope = source_file->get_globalScope();
16270 if (isSystemHeader)
16271 content =
"#include <" + header_file_name +
"> \n";
16273 content =
"#include \"" + header_file_name +
"\" \n";
16276 ROSE_ASSERT(result);
16284 supportTokenUnparsing = source_file->get_unparse_tokens();
16285 bool supportUnparseHeaders = source_file->get_unparseHeaderFiles();
16288 printf (
"supportTokenUnparsing = %s \n",supportTokenUnparsing ?
"true" :
"false");
16289 printf (
"supportUnparseHeaders = %s \n",supportUnparseHeaders ?
"true" :
"false");
16290 printf (
"source_file = %p \n",source_file);
16291 printf (
"global_scope = %p \n",global_scope);
16294 printf (
"Exiting as a test! \n");
16299 if (supportTokenUnparsing ==
false)
16308 if (supportUnparseHeaders ==
true)
16313 printf (
"physical_file_id = %d \n",physical_file_id);
16318 printf (
"Exiting as a test! \n");
16325 global_scope->prepend_statement(emptyDeclaration);
16329 printf (
"Exiting as a test! \n");
16330 ROSE_ASSERT(
false);
16341 bool supportTokenUnparsing =
false;
16347 printf (
"In SageInterface::insertHeader(): filename = %s \n",filename.c_str());
16348 printf (
" --- position = %s \n",PreprocessingInfo::relativePositionName(position).c_str());
16354 ROSE_ASSERT(scope);
16357 ROSE_ASSERT(globalScope != NULL);
16365 if (isSystemHeader)
16366 content =
"#include <" + filename +
"> \n";
16368 content =
"#include \"" + filename +
"\" \n";
16377 ROSE_ASSERT(sourceFile != NULL);
16379 supportTokenUnparsing = sourceFile->get_unparse_tokens();
16381 bool supportUnparseHeaders = sourceFile->get_unparseHeaderFiles();
16383 if (supportUnparseHeaders)
16386 string suffix = Rose::StringUtility ::fileNameSuffix(filename);
16389 if (suffix==
"h" ||suffix==
"hpp"|| suffix==
"hh"||suffix==
"H" ||suffix==
"hxx"||suffix==
"h++" ||suffix==
"tcc")
16394 printf (
"supportTokenUnparsing = %s \n",supportTokenUnparsing ?
"true" :
"false");
16395 printf (
"supportUnparseHeaders = %s \n",supportUnparseHeaders ?
"true" :
"false");
16396 printf (
"sourceFile = %p \n",sourceFile);
16397 printf (
"globalScope = %p \n",globalScope);
16400 printf (
"supportTokenUnparsing = %s \n",supportTokenUnparsing ?
"true" :
"false");
16403 printf (
"Exiting as a test! \n");
16407 SgDeclarationStatementPtrList & stmtList = globalScope->
get_declarations();
16410 printf (
"stmtList.size() = %zu \n",stmtList.size());
16413 if (stmtList.size() > 0)
16415 for (SgDeclarationStatementPtrList::iterator j = stmtList.begin (); j != stmtList.end (); j++)
16419 if ( ((*j)->get_file_info())->isSameFile(srcScope->
get_file_info ()) || ((*j)->get_file_info ())->isTransformation() )
16421 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration, content,
"Transformation generated",0, 0, 0, PreprocessingInfo::before);
16422 ROSE_ASSERT(result != NULL);
16424 printf (
"Building a PreprocessingInfo: result = %p \n",result);
16432 if (supportTokenUnparsing ==
false)
16434 (*j)->addToAttachedPreprocessingInfo(result,position);
16438 (*j)->addToAttachedPreprocessingInfo(result,position);
16440 printf (
"In SageInterface::insertHeader(): Calling set_containsTransformationToSurroundingWhitespace(true) \n");
16444 (*j)->set_containsTransformationToSurroundingWhitespace(
true);
16453 printf (
"In SageInterface::insertHeader(): declarationStatement = %p = %s \n",declarationStatement,declarationStatement->
class_name().c_str());
16454 printf (
"In SageInterface::insertHeader(): declarationStatement->get_containsTransformationToSurroundingWhitespace() = %s \n",
16455 declarationStatement->get_containsTransformationToSurroundingWhitespace() ?
"true" :
"false");
16462 if (supportUnparseHeaders ==
true)
16467 printf (
"physical_file_id = %d \n",physical_file_id);
16469 emptyDeclaration->get_startOfConstruct()->set_physical_file_id(physical_file_id);
16470 emptyDeclaration->get_endOfConstruct()->set_physical_file_id(physical_file_id);
16472 printf (
"Exiting as a test! \n");
16473 ROSE_ASSERT(
false);
16477 emptyDeclaration->addToAttachedPreprocessingInfo(result, position);
16483 printf (
"break out of for loop: result = %p \n",result);
16493 cerr<<
"SageInterface::insertHeader() Empty file is found!"<<endl;
16494 cerr<<
"#include xxx is preprocessing information which has to be attached to some other located node (a statement for example)"<<endl;
16495 cerr<<
"You may have to insert some statement first before inserting a header"<<endl;
16496 ROSE_ASSERT(
false);
16497 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration, content,
"Transformation generated",0, 0, 0, PreprocessingInfo::after);
16498 ROSE_ASSERT(result);
16509 if (result != NULL)
16520 printf (
"Exiting as a test! \n");
16521 ROSE_ASSERT(
false);
16525 printf (
"Leaving SageInterface::insertHeader(): filename = %s \n",filename.c_str());
16529 printf (
"Exiting as a test! \n");
16530 ROSE_ASSERT(
false);
16540 ROSE_ASSERT (stmt != NULL);
16541 ROSE_ASSERT (newheader != NULL);
16544 printf (
"In SageInterface::insertHeader (SgStatement* stmt, PreprocessingInfo* newheader, bool asLastHeader) \n");
16550 position = PreprocessingInfo::after;
16552 position = PreprocessingInfo::before;
16558 if (comments != NULL)
16567 AttachedPreprocessingInfoType::iterator i, firsti, lasti;
16568 for (i = comments->begin (); i != comments->end (); i++)
16575 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration)
16578 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration)
16580 if (firstExistingHeader == NULL)
16582 firstExistingHeader = (*i);
16586 lastExistingHeader = (*i);
16592 if ( (*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration ||
16593 (*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorEndifDeclaration )
16596 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration)
16598 if (firstExistingHeader == NULL)
16600 firstExistingHeader = (*i);
16604 lastExistingHeader = (*i);
16607 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorEndifDeclaration)
16609 if (firstExistingEndif == NULL)
16611 firstExistingEndif = (*i);
16626 if (lastExistingHeader == NULL)
16630 comments->insert (lasti+1, newheader);
16635 if (firstExistingHeader == NULL)
16639 comments->insert (firsti, newheader);
16647 printf (
"Exiting as a test! \n");
16648 ROSE_ASSERT(
false);
16657 ROSE_ASSERT (source_file != NULL);
16658 SgGlobal* globalScope = source_file->get_globalScope();
16659 ROSE_ASSERT (globalScope != NULL);
16663 if (isSystemHeader)
16664 content =
"#include <" + filename +
"> \n";
16666 content =
"#include \"" + filename +
"\" \n";
16673 position = PreprocessingInfo::after;
16675 position = PreprocessingInfo::before;
16678 SgDeclarationStatementPtrList & stmtList = globalScope->
get_declarations ();
16679 if (stmtList.size()>0)
16681 for (SgDeclarationStatementPtrList::iterator j = stmtList.begin (); j != stmtList.end (); j++)
16686 if ( (*j)->get_file_info()->isSameFile(globalScope->
get_file_info()) || (*j)->get_file_info()->isTransformation() )
16689 printf (
"In SageInterface::insertHeader(): Found statement to attached #include: *j = %p = %s \n",*j,(*j)->class_name().c_str());
16690 printf (
" --- unparseToString() = %s \n",(*j)->unparseToString().c_str());
16692 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration, content,
"Transformation generated",0, 0, 0, PreprocessingInfo::before);
16693 ROSE_ASSERT(result);
16697 printf (
"Exiting as a test! \n");
16706 cerr<<
"SageInterface::insertHeader() Empty file is found!"<<endl;
16707 cerr<<
"#include xxx is preprocessing information which has to be attached to some other located node (a statement for example)"<<endl;
16708 cerr<<
"You may have to insert some statement first before inserting a header"<<endl;
16711 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration,
16712 content,
"Transformation generated",0, 0, 0, PreprocessingInfo::after);
16713 ROSE_ASSERT(result);
16720 printf (
"In SageInterface::insertHeader(): Marking include file for filename = %s as a transformation \n",filename.c_str());
16730 printf (
"Exiting as a test! \n");
16731 ROSE_ASSERT(
false);
16749 ROSE_ASSERT(target != NULL);
16756 PreprocessingInfo::DirectiveType mytype = PreprocessingInfo::CpreprocessorIfDeclaration;
16759 printf (
"Warning: attachArbitraryText(): attaching arbitrary text to the AST as a #if declaration: text = %s \n",text.c_str());
16761 result =
new PreprocessingInfo (mytype,text,
"transformation-generated", 0, 0, 0, position);
16762 ROSE_ASSERT(result);
16769 target->addToAttachedPreprocessingInfo(result);
16783 ROSE_ASSERT(target != NULL);
16784 AttachedPreprocessingInfoType *info= target->getAttachedPreprocessingInfo ();
16785 if (info == NULL)
return;
16786 AttachedPreprocessingInfoType::iterator j;
16787 for (j = info->begin (); j != info->end (); j++)
16789 if ((*j)->getTypeOfDirective()==PreprocessingInfo::CMacroCall)
16791#ifndef ROSE_SKIP_COMPILATION_OF_WAVE
16793 std::ostringstream os;
16794 token_container tc = (*j)->get_macro_call()->expanded_macro;
16795 token_container::const_iterator iter;
16796 for (iter=tc.begin(); iter!=tc.end(); iter++)
16797 os<<(*iter).get_value();
16800 string pragmaText = target->get_pragma()->get_pragma();
16801 string targetString = (*j)->getString();
16802 string replacement = os.str();
16804 size_t pos1 = pragmaText.find(targetString);
16805 while (pos1 != string::npos)
16807 pragmaText.replace(pos1, targetString.size(), replacement);
16808 pos1 = pragmaText.find(targetString);
16810 delete target->get_pragma();
16824 if (isSgWhileStmt(loopOrSwitch) || isSgDoWhileStmt(loopOrSwitch) ||
16825 isSgForStatement(loopOrSwitch)) {
16827 }
else if (isSgSwitchStatement(loopOrSwitch)) {
16828 body = isSgSwitchStatement(loopOrSwitch)->
get_body();
16830 ROSE_ASSERT (body);
16832 if (!breaks.empty()) {
16833 static int breakLabelCounter = 0;
16838 isSgScopeStatement(loopOrSwitch->
get_parent()));
16840 for (
size_t j = 0; j < breaks.size(); ++j) {
16845 newGoto->
set_parent(breaks[j]->get_parent());
16852 ROSE_ASSERT(node!=NULL);
16862 ROSE_ASSERT(node!=NULL);
16875 ROSE_ASSERT(stmt_src != NULL);
16876 ROSE_ASSERT(stmt_dst != NULL);
16879 if (infoList == NULL)
16882 printf (
"In SageInterface::movePreprocessingInfo(): infoList == NULL: exiting movePreprocessingInfo() \n");
16887 AttachedPreprocessingInfoType* infoToRemoveList =
new AttachedPreprocessingInfoType();
16890 printf (
"In SageInterface::movePreprocessingInfo(): \n");
16891 printf (
" --- stmt_src = %p = %s src_position = %d \n",stmt_src,stmt_src->
class_name().c_str(),src_position);
16893 if (src_declarationStatement != NULL)
16896 printf (
"src_declarationStatement->get_definingDeclaration() = %p \n",src_declarationStatement->
get_definingDeclaration());
16898 printf (
" --- stmt_dst = %p = %s dst_position = %d \n",stmt_dst,stmt_dst->
class_name().c_str(),dst_position);
16900 if (dst_declarationStatement != NULL)
16903 printf (
"dst_declarationStatement->get_definingDeclaration() = %p \n",dst_declarationStatement->
get_definingDeclaration());
16905 printf (
" --- src_position = %s \n",PreprocessingInfo::relativePositionName(src_position).c_str());
16906 printf (
" --- dst_position = %s \n",PreprocessingInfo::relativePositionName(dst_position).c_str());
16907 printf (
" --- usePrepend = %s \n",usePrepend ?
"true" :
"false");
16909 printf (
" --- infoList = %p \n",infoList);
16910 printf (
" --- infoToRemoveList = %p \n",infoToRemoveList);
16913 printf (
" --- dst_infoList = %p \n",dst_infoList);
16916 printf (
"****************************************************************** \n");
16917 printf (
"In SageInterface::movePreprocessingInfo(): Attached comments and CPP directives: stmt_src \n");
16919 printf (
"In SageInterface::movePreprocessingInfo(): Attached comments and CPP directives: stmt_dst \n");
16921 printf (
"****************************************************************** \n");
16931 printf (
" --- infoList->size() = %zu \n",infoList->size());
16932 printf (
" --- infoToRemoveList->size() = %zu \n",infoToRemoveList->size());
16938 for (Rose_STL_Container<PreprocessingInfo*>::iterator i = (*infoList).begin(); i != (*infoList).end(); i++)
16941 ROSE_ASSERT(*i != NULL);
16946 ROSE_ASSERT(info != NULL);
16949 printf (
"counter = %d Processing PreprocessingInfo = %s \n",counter,info->getString().c_str());
16958 for (Rose_STL_Container<PreprocessingInfo*>::iterator i = (*infoList).begin(); i != (*infoList).end(); i++)
16960 ROSE_ASSERT(*i != NULL);
16963 ROSE_ASSERT(info != NULL);
16966 (info->getTypeOfDirective()==PreprocessingInfo::C_StyleComment)||
16967 (info->getTypeOfDirective()==PreprocessingInfo::CplusplusStyleComment)||
16968 (info->getTypeOfDirective()==PreprocessingInfo::FortranStyleComment)||
16969 (info->getTypeOfDirective()==PreprocessingInfo::F90StyleComment)||
16970 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIncludeDeclaration )||
16971 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIncludeNextDeclaration )||
16972 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorDefineDeclaration )||
16973 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorUndefDeclaration)||
16974 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIfdefDeclaration )||
16975 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIfndefDeclaration )||
16976 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIfDeclaration )||
16977 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorDeadIfDeclaration )||
16978 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorElseDeclaration )||
16979 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorElifDeclaration )||
16980 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorEndifDeclaration ) ||
16981 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorEnd_ifDeclaration ) ||
16982 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorLineDeclaration) ||
16983 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorErrorDeclaration) ||
16984 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorWarningDeclaration) ||
16986 (info->getTypeOfDirective()==PreprocessingInfo::ClinkageSpecificationStart) ||
16987 (info->getTypeOfDirective()==PreprocessingInfo::ClinkageSpecificationEnd)
16992 if ( src_position == PreprocessingInfo::undef || info->getRelativePosition() == src_position)
16994 if (usePrepend ==
true)
16997 if (prevItem == NULL)
17015 info->setAsTransformation();
17023 stmt_dst->set_containsTransformationToSurroundingWhitespace(
true);
17024 if (isMarkedAsModified ==
false)
17031 (*infoToRemoveList).push_back(*i);
17035 if (dst_position != PreprocessingInfo::undef)
17037 info->setRelativePosition(dst_position);
17043 AttachedPreprocessingInfoType::iterator j;
17044 for (j = (*infoToRemoveList).begin(); j != (*infoToRemoveList).end(); j++)
17046 infoList->erase( find(infoList->begin(),infoList->end(),*j) );
17082 return info && (info->getRelativePosition () != pos);
17092 return info && !isNotRelPos (info, pos);
17099 ASSERT_not_null(src_node);
17102 AttachedPreprocessingInfoType* info = src_node->get_attachedPreprocessingInfoPtr();
17106 remove_copy_if(info->begin(),
17108 back_inserter(save_buf),
17109 [pos](
auto x) {
return !isRelPos(x, pos); }
17113 AttachedPreprocessingInfoType::iterator
17114 new_end = remove_if(info->begin(),
17116 [pos](
auto x) { return isRelPos(x, pos); }
17118 info->erase(new_end, info->end());
17122static AttachedPreprocessingInfoType *
17126 AttachedPreprocessingInfoType* info_list = s->get_attachedPreprocessingInfoPtr ();
17129 info_list =
new AttachedPreprocessingInfoType;
17130 ROSE_ASSERT (info_list);
17131 s->set_attachedPreprocessingInfoPtr (info_list);
17135 ROSE_ASSERT (info_list);
17142 if (save_buf.size()==0)
return;
17144 AttachedPreprocessingInfoType* info = createInfoList (dst_node);
17145 ROSE_ASSERT (info);
17152 if (pos==PreprocessingInfo::before)
17154 for(AttachedPreprocessingInfoType::reverse_iterator i=save_buf.rbegin();i!=save_buf.rend();i++)
17155 info->insert(info->begin(),*i);
17158 else if (pos==PreprocessingInfo::after)
17159 copy (save_buf.begin (), save_buf.end (), back_inserter (*info));
17160 else if (pos==PreprocessingInfo::inside)
17162 copy (save_buf.begin (), save_buf.end (), back_inserter (*info));
17163 cerr<<
"SageInterface::pastePreprocessingInfo() pos==PreprocessingInfo::inside is not supported."<<endl;
17164 save_buf[0]->display(
"ttt");
17170 ROSE_ASSERT(locatedNode != NULL);
17171 AttachedPreprocessingInfoType *comments =
17174 if (comments != NULL)
17176 printf (
"-----------------------------------------------\n");
17177 printf (
"Found an IR node (at %p of type: %s) in file %s \n",
17178 locatedNode, locatedNode->
class_name ().c_str (),
17179 (locatedNode->
get_file_info ()->get_filenameString ()).c_str ());
17181 AttachedPreprocessingInfoType::iterator i;
17182 for (i = comments->begin (); i != comments->end (); i++)
17185 (
"with attached preprocessingInfo numbering #%d :------------- \nclassification= %s:\nString format:%s\n",
17187 PreprocessingInfo::directiveTypeName ((*i)->getTypeOfDirective ()).
17188 c_str (), (*i)->getString ().c_str ());
17189 if ((*i)->getRelativePosition () == PreprocessingInfo::inside)
17190 printf (
"relative position is: inside\n");
17192 printf (
"relative position is: %s\n", \
17193 ((*i)->getRelativePosition () == PreprocessingInfo::before) ?
"before" :
"after");
17198 printf (
"No attached preprocessing info. (at %p of type: %s): \n", locatedNode,
17214template <
class ParentNode>
17224 if (basicblock == NULL) {
17226 (stmt.*setter)(basicblock);
17230 ROSE_ASSERT (basicblock != NULL);
17237 if (!isSgBasicBlock(b)) {
17245 ROSE_ASSERT (isSgBasicBlock(b));
17246 return isSgBasicBlock(b);
17252 if (!isSgBasicBlock(b)) {
17260 ROSE_ASSERT (isSgBasicBlock(b));
17261 return isSgBasicBlock(b);
17267 if (!isSgBasicBlock(b)) {
17275 ROSE_ASSERT (isSgBasicBlock(b));
17276 return isSgBasicBlock(b);
17281 ROSE_ASSERT (fs != NULL);
17283 return ensureBasicBlock_aux(*fs, &SgUpcForAllStatement::get_loop_body, &SgUpcForAllStatement::set_loop_body);
17288 if (!isSgBasicBlock(b)) {
17296 ROSE_ASSERT (isSgBasicBlock(b));
17297 return isSgBasicBlock(b);
17302 if (!isSgBasicBlock(b)) {
17310 ROSE_ASSERT (isSgBasicBlock(b));
17311 return isSgBasicBlock(b);
17316 if (!isSgBasicBlock(b)) {
17324 ROSE_ASSERT (isSgBasicBlock(b));
17325 return isSgBasicBlock(b);
17330 if (!isSgBasicBlock(b)) {
17338 printf (
"In SageInterface::ensureBasicBlockAsTrueBodyOfIf(): Added SgBasicBlock b = %p to addedBasicBlockNodes.size() = %zu \n",b,addedBasicBlockNodes.size());
17341 ROSE_ASSERT (isSgBasicBlock(b));
17342 return isSgBasicBlock(b);
17352 ROSE_ASSERT(bb != NULL);
17353 addedBasicBlockNodes.push_back(bb);
17355 printf (
"In SageInterface::recordNormalizations(): Added SgBasicBlock = %p to addedBasicBlockNodes.size() = %zu \n",bb,addedBasicBlockNodes.size());
17366 printf (
"In SageInterface::cleanupNontransformedBasicBlockNode(): addedBasicBlockNodes.size() = %zu \n",addedBasicBlockNodes.size());
17369 for (vector<SgBasicBlock*>::iterator i = addedBasicBlockNodes.begin(); i != addedBasicBlockNodes.end(); i++)
17372 ROSE_ASSERT(b != NULL);
17376 printf (
"This SgBasicBlock can be denormalized: b = %p \n",b);
17379 ROSE_ASSERT(parentOfBlock != NULL);
17384 ROSE_ASSERT(s != NULL);
17386 switch (parentOfBlock->
variantT())
17390 SgIfStmt* ifStatement = isSgIfStmt(parentOfBlock);
17394 printf (
"Calling set_true_body on ifStatement = %p = %s \n",ifStatement,ifStatement->
class_name().c_str());
17399 printf (
"Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17404 printf (
"DONE: Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17413 printf (
"Calling set_false_body on ifStatement = %p = %s \n",ifStatement,ifStatement->
class_name().c_str());
17418 printf (
"Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17423 printf (
"DONE: Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17427 printf (
"Mark as NOT modified after calling set_false_body on ifStatement = %p = %n \n",ifStatement,ifStatement->
class_name().c_str());
17430 printf (
"Error: case not handled in case V_SgIfStmt: parentOfBlock = %p = %s \n",parentOfBlock,parentOfBlock->
class_name().c_str());
17438 case V_SgWhileStmt:
17440 SgWhileStmt* whileStatement = isSgWhileStmt(parentOfBlock);
17441 if (b == whileStatement->
get_body())
17450 case V_SgSwitchStatement:
17453 if (b == switchStatement->
get_body())
17462 case V_SgForStatement:
17474 case V_SgCaseOptionStmt:
17476 SgCaseOptionStmt* caseOptionStatement = isSgCaseOptionStmt(parentOfBlock);
17477 if (b == caseOptionStatement->
get_body())
17486 case V_SgDefaultOptionStmt:
17489 if (b == defaultOptionStatement->
get_body())
17491 defaultOptionStatement->
set_body(s);
17498 case V_SgDoWhileStmt:
17500 SgDoWhileStmt* doWhileStatement = isSgDoWhileStmt(parentOfBlock);
17501 if (b == doWhileStatement->
get_body())
17511 printf (
"Error: case not handled in switch: parentOfBlock = %p = %s \n",parentOfBlock,parentOfBlock->
class_name().c_str());
17517 if (wasPreviouslyModified ==
false)
17522 printf (
"In SageInterface::cleanupNontransformedBasicBlockNode(): parentOfBlock reset to FALSE after IR node member function call (e.g. set_body()): parentOfBlock = %p = %s \n",parentOfBlock,parentOfBlock->
class_name().c_str());
17529 printf (
"Exiting as a test! \n");
17536 printf (
"Leaving SageInterface::cleanupNontransformedBasicBlockNode(): addedBasicBlockNodes.size() = %zu \n",addedBasicBlockNodes.size());
17544 if (!createEmptyBody && (b == NULL || isSgNullStatement(b)))
17546 if (!isSgBasicBlock(b)) {
17554 ROSE_ASSERT (isSgBasicBlock(b));
17555 return isSgBasicBlock(b);
17560 if (!isSgBasicBlock(b)) {
17565 ROSE_ASSERT (isSgBasicBlock(b));
17566 return isSgBasicBlock(b);
17572 if (!isSgBasicBlock(b)) {
17577 ROSE_ASSERT (isSgBasicBlock(b));
17578 return isSgBasicBlock(b);
17590 case V_SgForStatement:
17592 if (isSgForStatement(p)->get_loop_body() == s)
17596 case V_SgUpcForAllStatement:
17599 if (upcforall.get_loop_body() == s)
17603 case V_SgWhileStmt:
17605 if (isSgWhileStmt(p)->get_body() == s)
17609 case V_SgDoWhileStmt:
17611 if (isSgDoWhileStmt(p)->get_body() == s)
17615 case V_SgSwitchStatement:
17617 if (isSgSwitchStatement(p)->get_body() == s)
17621 case V_SgCaseOptionStmt:
17623 if (isSgCaseOptionStmt(p)->get_body() == s)
17627 case V_SgDefaultOptionStmt:
17629 if (isSgDefaultOptionStmt(p)->get_body() == s)
17633 case V_SgCatchOptionStmt:
17635 if (isSgCatchOptionStmt(p)->get_body() == s)
17641 if (isSgIfStmt(p)->get_true_body() == s)
17643 else if (isSgIfStmt(p)->get_false_body() == s)
17649 if (isSgOmpBodyStatement(p))
17661 ROSE_ASSERT (singleStmt != NULL);
17662 ROSE_ASSERT (isSgBasicBlock(singleStmt) == NULL);
17674 case V_SgForStatement:
17676 if (isSgForStatement(p)->get_loop_body() == s)
17680 case V_SgUpcForAllStatement:
17684 if (upcforall.get_loop_body() == s)
17688 case V_SgWhileStmt:
17690 if (isSgWhileStmt(p)->get_body() == s)
17694 case V_SgDoWhileStmt:
17696 if (isSgDoWhileStmt(p)->get_body() == s)
17700 case V_SgSwitchStatement:
17702 if (isSgSwitchStatement(p)->get_body() == s)
17706 case V_SgCaseOptionStmt:
17708 if (isSgCaseOptionStmt(p)->get_body() == s)
17712 case V_SgDefaultOptionStmt:
17714 if (isSgDefaultOptionStmt(p)->get_body() == s)
17718 case V_SgCatchOptionStmt:
17720 if (isSgCatchOptionStmt(p)->get_body() == s)
17726 if (isSgIfStmt(p)->get_true_body() == s)
17728 else if (isSgIfStmt(p)->get_false_body() == s)
17734 if (isSgOmpBodyStatement(p))
17741 ROSE_ASSERT (rt != NULL);
17755 case V_SgBasicBlock:
return isSgBasicBlock(p);
17756 case V_SgForStatement:
17758 if (isSgForStatement(p)->get_loop_body() == s)
17760 else if (isSgForStatement(p)->get_test() == s)
17763 else if (isSgForStatement(p)->get_for_init_stmt() == s)
17769 case V_SgUpcForAllStatement:
17773 if (upcforall.get_loop_body() == s)
17776 ROSE_ASSERT( (s == upcforall.get_for_init_stmt())
17777 || (s == upcforall.get_test())
17781 case V_SgWhileStmt:
17783 if (isSgWhileStmt(p)->get_body() == s)
17785 else if (isSgWhileStmt(p)->get_condition() == s)
17791 case V_SgDoWhileStmt:
17793 if (isSgDoWhileStmt(p)->get_body() == s)
17795 else if (isSgDoWhileStmt(p)->get_condition() == s)
17801 case V_SgSwitchStatement:
17803 if (isSgSwitchStatement(p)->get_body() == s)
17805 else if (isSgSwitchStatement(p)->get_item_selector() == s)
17811 case V_SgCatchOptionStmt:
17813 if (isSgCatchOptionStmt(p)->get_body() == s)
17815 else if (isSgCatchOptionStmt(p)->get_condition() == s)
17823 if (isSgIfStmt(p)->get_true_body() == s)
17825 else if (isSgIfStmt(p)->get_false_body() == s)
17827 else if (isSgIfStmt(p)->get_conditional() == s)
17835 if (isSgOmpBodyStatement(p))
17850 void SageInterface::changeAllLoopBodiesToBlocks(
SgNode* top) {
17851 cerr<<
"Warning: SageInterface::changeAllLoopBodiesToBlocks() is being replaced by SageInterface::changeAllBodiesToBlocks()."<<endl;
17852 cerr<<
"Please use SageInterface::changeAllBodiesToBlocks() if you can."<<endl;
17860 bool allowEmptyBody;
17861 Visitor (
bool flag):allowEmptyBody(flag) {}
17862 virtual void visit(
SgNode* n) {
17867 case V_SgForStatement: {
17871 case V_SgWhileStmt: {
17875 case V_SgDoWhileStmt: {
17879 case V_SgSwitchStatement: {
17888 printf (
"In changeAllBodiesToBlocks(): case SgIfStmt: n->get_isModified() = %s \n",n->
get_isModified() ?
"true" :
"false");
17895 printf (
"In changeAllBodiesToBlocks(): AFTER RESET: case SgIfStmt: n->get_isModified() = %s \n",n->
get_isModified() ?
"true" :
"false");
17900 case V_SgCatchOptionStmt: {
17904 case V_SgUpcForAllStatement: {
17911 if (isSgOmpBodyStatement(n))
17918 if (wasPreviouslyModified ==
false)
17923 printf (
"In SageInterface::changeAllBodiesToBlocks(): parentOfBlock reset to FALSE after IR node member function call (e.g. set_body()): parentOfBlock = %p = %s \n",n,n->
class_name().c_str());
17932 Visitor(createEmptyBody).traverse(top, postorder);
17953#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
17954 SgStatement* enclosingStatement = getStatementOfExpression(from);
17955 SgExprStatement* exprStatement = isSgExprStatement(enclosingStatement);
17957 SgForStatement* forStatement = isSgForStatement(enclosingStatement);
17958 SgReturnStmt* returnStatement = isSgReturnStmt(enclosingStatement);
17964 ROSE_ASSERT (exprStatement || forStatement || returnStatement || varDeclarationStatement);
17966 if (varDeclarationStatement)
17973 ROSE_ASSERT (root);
17976 if (forStatement && forStatement->get_increment() == root)
17987 forStatement->get_increment()->
set_parent(incrStmt);
17991 forStatement->set_increment(ne);
17998 assert (enclosingStmtParent);
17999 SgWhileStmt* whileStatement = isSgWhileStmt(enclosingStmtParent);
18000 SgDoWhileStmt* doWhileStatement = isSgDoWhileStmt(enclosingStmtParent);
18001 SgIfStmt* ifStatement = isSgIfStmt(enclosingStmtParent);
18003 SgForStatement* enclosingForStatement = isSgForStatement(enclosingStmtParent);
18004 if (enclosingForStatement && enclosingForStatement->get_test() == exprStatement)
18016 pushTestIntoBody(enclosingForStatement);
18019 else if (whileStatement && whileStatement->
get_condition() == exprStatement)
18032 pushTestIntoBody(whileStatement);
18036 else if (doWhileStatement && doWhileStatement->
get_condition() == exprStatement)
18052 myStatementInsert(doWhileStatement, new_statement,
false);
18054 SgName varname =
"rose__temp1";
18059 varname,
buildBoolType(), assignInitializer, new_statement);
18062 initname->set_scope(new_statement);
18094 else if (ifStatement && ifStatement->
get_conditional() == exprStatement)
18100 myStatementInsert(ifStatement, new_statement,
false);
18102 SgName varname =
"rose__temp2";
18111 initname->set_scope(new_statement);
18136 else if (switchStatement && switchStatement->
get_item_selector() == exprStatement)
18138 SgExpression* switchCond = exprStatement->get_expression();
18139 ROSE_ASSERT (switchCond);
18144 myStatementInsert(switchStatement, new_statement,
false);
18146 SgName varname =
"rose__temp3";
18193#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
18194 SgStatement* stmt = getStatementOfExpression(from);
18196 if (isSgExprStatement(stmt))
18210 if (isSgAssignOp(top) && isSgAssignOp(top)->get_rhs_operand() == from)
18228 convertInitializerIntoAssignment(init);
18231 SgExprStatement* new_stmt = isSgExprStatement(getStatementOfExpression(from));
18232 assert (new_stmt != NULL);
18233 replaceAssignmentStmtWithStatement(new_stmt, to);
18250 ROSE_ASSERT(func&&s);
18252 Rose_STL_Container <SgNode* > stmts = NodeQuery::querySubTree(func, V_SgReturnStmt);
18254 Rose_STL_Container<SgNode*>::iterator i;
18255 for (i=stmts.begin();i!=stmts.end();i++)
18258 ROSE_ASSERT(cur_stmt);
18261 bool needRewrite = (exp != NULL) && !(isSgValueExp(exp));
18272 if (stmts.size()==0 )
18277 cout<<
"In instrumentEndOfFunction(), found an empty function body.! "<<endl;
18289 return ((stmt->get_declarationModifier()).get_storageModifier()).isStatic();
18296 return ((stmt->get_declarationModifier()).get_storageModifier()).setStatic();
18302 return ((stmt->get_declarationModifier()).get_storageModifier()).isExtern();
18310 return ((stmt->get_declarationModifier()).get_storageModifier()).setExtern();
18317 return name->get_storageModifier().isMutable();
18330 std::vector<SgInitializedName*> in_params;
18342 std::vector<SgInitializedName*> out_params;
18352 case V_SgCharVal:
return (
long long)(isSgCharVal(expr)->get_value());
18353 case V_SgSignedCharVal:
return (
long long)(isSgSignedCharVal(expr)->get_value());
18354 case V_SgUnsignedCharVal:
return isSgUnsignedCharVal(expr)->get_value();
18355 case V_SgShortVal:
return (
long long)(isSgShortVal(expr)->get_value());
18356 case V_SgUnsignedShortVal:
return isSgUnsignedShortVal(expr)->get_value();
18357 case V_SgIntVal:
return (
long long)(isSgIntVal(expr)->get_value());
18358 case V_SgUnsignedIntVal:
return isSgUnsignedIntVal(expr)->get_value();
18359 case V_SgLongIntVal:
return (
long long)(isSgLongIntVal(expr)->get_value());
18360 case V_SgUnsignedLongVal:
return isSgUnsignedLongVal(expr)->get_value();
18361 case V_SgLongLongIntVal:
return isSgLongLongIntVal(expr)->get_value();
18362 case V_SgUnsignedLongLongIntVal:
return isSgUnsignedLongLongIntVal(expr)->get_value();
18363 case V_SgBoolValExp:
return (
long long )(isSgBoolValExp(expr)->get_value());
18369 printf (
"ERROR: In SageInterface::getIntegerConstantValue(): default reached: expr = %p = %s \n",expr,expr->
class_name().c_str());
18370 ROSE_ASSERT (
false);
18375 ROSE_ASSERT (!
"Bad kind return in getIntegerConstantValue");
18380#ifdef ROSE_ENABLE_BINARY_ANALYSIS
18389 ROSE_ASSERT(binary!=NULL);
18394 if (1==headers.size()) {
18395 requisite_header = headers[0];
18397 for (SgAsmGenericHeaderPtrList::const_iterator hi=headers.begin(); hi!=headers.end(); ++hi) {
18398 if (isSgAsmPEFileHeader(*hi)) {
18399 requisite_header = isSgAsmPEFileHeader(*hi);
18404 ROSE_ASSERT(requisite_header!=NULL);
18407 const SgAsmInterpretationPtrList &interps = binary->get_interpretations()->
get_interpretations();
18408 for (SgAsmInterpretationPtrList::const_iterator ii=interps.begin(); ii!=interps.end(); ++ii) {
18409 const SgAsmGenericHeaderPtrList &headers = (*ii)->get_headers()->get_headers();
18410 for (SgAsmGenericHeaderPtrList::const_iterator hi=headers.begin(); hi!=headers.end(); ++hi) {
18411 if ((*hi)==requisite_header)
18416 ROSE_ASSERT(!
"no appropriate interpretation");
18429 SgNode* copy = n->copy(*
this);
18433 if (fileInfo != NULL)
18442 } collectDependentDeclarationsCopyType;
18450 vector<PreprocessingInfo*> cppDirectiveList;
18452 void visit(
SgNode *astNode);
18460 if (locatedNode != NULL)
18464 if (comments != NULL)
18467 printf (
"Found attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
sage_class_name());
18469 AttachedPreprocessingInfoType::iterator i;
18470 for (i = comments->begin(); i != comments->end(); i++)
18472 ROSE_ASSERT ( (*i) != NULL );
18474 printf (
" Attached Comment (relativePosition=%s): %s\n",
18475 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
18476 (*i)->getString().c_str());
18477 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
18478 (*i)->get_file_info()->display(
"comment/directive location");
18486 cppDirectiveList.push_back(*i);
18488 printf (
" Attached include directive (relativePosition=%s): %s\n",
18489 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
18490 (*i)->getString().c_str());
18498 printf (
"No attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
sage_class_name());
18509vector<PreprocessingInfo*>
18516 return t.cppDirectiveList;
18520vector<PreprocessingInfo*>
18527 return t.cppDirectiveList;
18532outputPreprocessingInfoList (
const vector<PreprocessingInfo*> & l )
18536 vector<PreprocessingInfo*>::const_iterator i = l.begin();
18537 while ( i != l.end() )
18539 printf (
" Attached include directive (relativePosition=%s): %s\n",
18540 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
18541 (*i)->getString().c_str());
18556 case V_SgNamespaceDefinitionStatement:
18559 declaration = namespaceDefinition->get_namespaceDeclaration();
18563 case V_SgClassDefinition:
18564 case V_SgTemplateInstantiationDefn:
18573 printf (
"Error: default reached in getAssociatedDeclaration(): scope = %p = %s \n",scope,scope->
class_name().c_str());
18579 ROSE_ASSERT(declaration != NULL);
18581 return declaration;
18590 vector<SgDeclarationStatement*> declarationList;
18594 vector<SgSymbol*> symbolList;
18597 set<SgDeclarationStatement*> alreadySavedDeclarations;
18600 void visit(
SgNode *astNode);
18616 ROSE_ASSERT(scope != NULL);
18621 SgGlobal* globalScope = isSgGlobal(scope);
18622 if (globalScope == NULL)
18629 ROSE_ASSERT(parentScope != NULL);
18630 while (globalScope == NULL)
18632 associatedDeclaration = getAssociatedDeclaration(parentScope);
18633 ROSE_ASSERT(associatedDeclaration != NULL);
18635 parentScope = parentScope->
get_scope();
18636 globalScope = isSgGlobal(parentScope);
18642 return returnDeclaration;
18648outputDeclarationList (
const vector<SgDeclarationStatement*> & l )
18653 vector<SgDeclarationStatement*>::const_iterator i = l.begin();
18654 while ( i != l.end() )
18656 printf (
"In outputDeclarationList(): list[%d] = %p = %s = %s \n",counter++,*i,(*i)->class_name().c_str(),
SageInterface::get_name(*i).c_str());
18664 if (declaration != NULL)
18673 if (alreadySavedDeclarations.find(dependentDeclaration) == alreadySavedDeclarations.end())
18676 printf (
"In CollectDependentDeclarationsTraversal::visit(): selected dependentDeclaration = %p = %s = %s \n",
18680 declarationList.push_back(dependentDeclaration);
18683 alreadySavedDeclarations.insert(dependentDeclaration);
18685 printf (
"In CollectDependentDeclarationsTraversal::visit(): astNode = %p = %s = %s \n",astNode,astNode->
class_name().c_str(),
SageInterface::get_name(astNode).c_str());
18686 printf (
"############### ADDING dependentDeclaration = %p = %s to alreadySavedDeclarations set (size = %" PRIuPTR
") \n",
18687 dependentDeclaration,dependentDeclaration->
class_name().c_str(),alreadySavedDeclarations.size());
18695 printf (
"In CollectDependentDeclarationsTraversal::visit(): astNode = %p = %s = %s \n",astNode,astNode->
class_name().c_str(),
SageInterface::get_name(astNode).c_str());
18696 printf (
"############### EXISTING dependentDeclaration = %p = %s found in alreadySavedDeclarations set (size = %" PRIuPTR
") \n",
18697 dependentDeclaration,dependentDeclaration->
class_name().c_str(),alreadySavedDeclarations.size());
18704static std::vector<SgTypedefDeclaration*> collectTypedefDeclarations(
SgType* type)
18706 ROSE_ASSERT(type != NULL);
18707 std::vector<SgTypedefDeclaration*> result;
18708 SgType* currentType = type;
18718 modType = isSgModifierType(currentType);
18721 currentType = modType->get_base_type();
18725 refType = isSgReferenceType(currentType);
18728 currentType = refType->get_base_type();
18732 pointType = isSgPointerType(currentType);
18735 currentType = pointType->get_base_type();
18739 arrayType = isSgArrayType(currentType);
18742 currentType = arrayType->get_base_type();
18746 typedefType = isSgTypedefType(currentType);
18757 result.push_back(decl);
18771 if (result.size()>0)
18773 cout<<
"------------Found a chain of typedef decls: count="<<result.size()<<endl;
18774 for (vector <SgTypedefDeclaration*>::const_iterator iter = result.begin();
18775 iter!=result.end(); iter ++)
18802 if (fileInfo != NULL && fileInfo->isFrontendSpecific() ==
false && (isSgStatement(astNode) != NULL) )
18804 printf (
"\n\nIn CollectDependentDeclarationsTraversal::visit(): astNode = %p = %s = %s \n",astNode,astNode->
class_name().c_str(),
SageInterface::get_name(astNode).c_str());
18807 printf (
"alreadySavedDeclarations.size() = %" PRIuPTR
" \n",alreadySavedDeclarations.size());
18808 for (set<SgDeclarationStatement*>::iterator i = alreadySavedDeclarations.begin(); i != alreadySavedDeclarations.end(); i++)
18810 printf (
"alreadySavedDeclarations %d: %p = %s \n",counter++,*i,(*i)->class_name().c_str());
18821 if (initializedname != NULL)
18823 SgType* type = initializedname->get_type();
18826 std::vector <SgTypedefDeclaration*> typedefVec = collectTypedefDeclarations(type);
18827 for (std::vector <SgTypedefDeclaration*>::const_iterator iter =typedefVec.begin();
18828 iter != typedefVec.end(); iter++)
18831 addDeclaration(typedef_decl);
18855 SgNamedType* namedType = isSgNamedType(strippedType);
18856 if (namedType != NULL)
18864 if (classDeclaration != NULL)
18871 if (declaration != NULL)
18874 addDeclaration(declaration);
18877 addDeclaration (classDeclaration);
18888 ROSE_ASSERT(classSymbol != NULL);
18891 symbolList.push_back(classSymbol);
18896 if (enum_decl != NULL)
18899 ROSE_ASSERT(declaration != NULL);
18900 addDeclaration(declaration);
18905 ROSE_ASSERT(esymbol!= NULL);
18906 symbolList.push_back(esymbol);
18910 printf (
"Found reference to type = %p = %s strippedType = %p = %s \n",type,type->
class_name().c_str(),strippedType,strippedType->
class_name().c_str());
18917 if (functionCallExp != NULL)
18922 if (declaration != NULL)
18923 addDeclaration(declaration);
18930 if (functionSymbol)
18931 symbolList.push_back(functionSymbol);
18936 SgEnumVal * eval = isSgEnumVal(astNode);
18939 declaration = eval->get_declaration();
18940 ROSE_ASSERT(declaration != NULL);
18941 addDeclaration(declaration);
18943 ROSE_ASSERT(symbol != NULL);
18944 symbolList.push_back(symbol);
18949static std::map<const SgStatement*, bool> visitedDeclMap;
18961 printf (
"\n\n********************************************************** \n");
18962 printf (
" Inside of getDependentDeclarations(stmt = %p = %s) \n",stmt,stmt->
class_name().c_str());
18963 printf (
"********************************************************** \n");
18965 visitedDeclMap[stmt]=
true;
18969 declarationList = t.declarationList;
18970 symbolList = t.symbolList;
18973 copy(t.declarationList.begin(),t.declarationList.end(), back_inserter(declarationList));
18974 copy(t.symbolList.begin(),t.symbolList.end(), back_inserter(symbolList));
18976 sort (declarationList.begin(), declarationList.end());
18977 vector<SgDeclarationStatement*>::iterator new_end = unique(declarationList.begin(), declarationList.end());
18978 declarationList.erase(new_end, declarationList.end());
18980 sort (symbolList.begin(), symbolList.end());
18981 vector<SgSymbol*>::iterator end2 = unique(symbolList.begin(), symbolList.end());
18982 symbolList.erase(end2, symbolList.end());
18986 for (vector<SgDeclarationStatement*>::const_iterator iter = t.declarationList.begin();
18987 iter !=t.declarationList.end(); iter++)
18990 SgType* base_type = NULL;
18995 if (isSgClassDeclaration(decl))
18997 base_type = isSgClassDeclaration(decl)->get_type();
18999 if (isSgTypedefDeclaration(decl))
19003 base_type = isSgTypedefDeclaration(decl)->get_base_type()->
stripType(SgType::STRIP_POINTER_TYPE|SgType::STRIP_ARRAY_TYPE|SgType::STRIP_REFERENCE_TYPE|SgType::STRIP_RVALUE_REFERENCE_TYPE|SgType::STRIP_MODIFIER_TYPE);
19011 if (isSgClassType(base_type))
19013 SgClassDeclaration* class_decl = isSgClassDeclaration(isSgClassType(base_type)->get_declaration()->get_definingDeclaration());
19014 if (class_decl!=NULL)
19016 body_stmt = class_decl->get_definition();
19020 if ((body_stmt!=NULL) &&(!visitedDeclMap[body_stmt]))
19032vector<SgDeclarationStatement*>
19035 vector<SgDeclarationStatement*> sortedNode;
19037 if (nodevec.size()==0 )
19040 if (nodevec.size() ==1)
19044 Rose_STL_Container<SgNode*> queryResult = NodeQuery::querySubTree(project,V_SgDeclarationStatement);
19045 for (Rose_STL_Container<SgNode*>::const_iterator iter = queryResult.begin();
19046 iter!= queryResult.end(); iter++)
19049 SgNode* cur_node = *iter;
19051 ROSE_ASSERT(cur_stmt!=NULL);
19063 ROSE_ASSERT (cur_stmt != func_decl);
19066 vector<SgDeclarationStatement*>::const_iterator i = find (nodevec.begin(), nodevec.end(), cur_stmt);
19067 if (i!=nodevec.end())
19071 vector<SgDeclarationStatement*>::const_iterator j = find (sortedNode.begin(), sortedNode.end(), *i);
19072 if (j == sortedNode.end())
19073 sortedNode.push_back(*i);
19077 if (nodevec.size() != sortedNode.size())
19079 cerr<<
"Fatal error in sortSgNodeListBasedOnAppearanceOrderInSource(): nodevec.size() != sortedNode.size()"<<endl;
19080 cerr<<
"nodevec() have "<< nodevec.size()<<
" elements. They are:"<<endl;
19081 for (vector<SgDeclarationStatement*>::const_iterator iter = nodevec.begin(); iter != nodevec.end(); iter++)
19083 cerr<<(*iter)<<
" "<<(*iter)->class_name() <<
" "<<(*iter)->unparseToString()<<endl;
19085 cerr<<
"sortedNode() have " << sortedNode.size() <<
" elements. They are:"<<endl;
19086 for (vector<SgDeclarationStatement*>::const_iterator iter = sortedNode.begin(); iter != sortedNode.end(); iter++)
19088 cerr<<(*iter)<<
" "<<(*iter)->class_name() <<
" "<<(*iter)->unparseToString()<<endl;
19091 ROSE_ASSERT(nodevec.size() == sortedNode.size());
19098std::vector<SgDeclarationStatement*>
19104 printf (
"\n\n********************************************************** \n");
19105 printf (
" Inside of getDependentDeclarations(stmt = %p = %s) \n",stmt,stmt->
class_name().c_str());
19106 printf (
"********************************************************** \n");
19111 return t.declarationList;
19114 visitedDeclMap.clear();
19115 vector<SgDeclarationStatement*> declarationList;
19116 vector<SgSymbol*> symbolList;
19120 printf (
"\n\n ********************************************************** \n");
19121 cout<<
"Found dependent decl: count="<<declarationList.size()<<endl;
19122 for ( vector<SgDeclarationStatement*>::const_iterator iter = declarationList.begin();
19123 iter != declarationList.end(); iter++)
19125 cout<<
"\t"<<(*iter)->class_name()<<
" at line "<<(*iter)->get_file_info()->get_line()<<endl;
19126 if ((*iter)->variantT()== V_SgFunctionDeclaration)
19127 cout<<
"func name is:"<<isSgFunctionDeclaration(*iter)->get_name().getString()<<endl;
19130 printf (
"\n ********************************************************** \n");
19133 return declarationList;
19142 bool returnValue =
false;
19145 printf (
"In SageInterface::isPrefixOperatorName(): functionName = %s (might have to check the return type to distinguish the deref operator from the multiply operator) \n",functionName.str());
19148 if (functionName.is_null() ==
false)
19151 if ( functionName ==
"operator++" || functionName ==
"operator--" || functionName ==
"operator&" ||
19152 functionName ==
"operator!" || functionName ==
"operator*" || functionName ==
"operator+" ||
19153 functionName ==
"operator-" || functionName ==
"operator+" || functionName ==
"operator~")
19155 returnValue =
true;
19159 return returnValue;
19171 bool returnValue =
false;
19178 size_t numberOfOperands = 0;
19180 if (memberFunctionRefExp != NULL)
19182 ROSE_ASSERT(functionRefExp == NULL);
19184 if (memberFunctionDeclaration != NULL)
19186 functionName = memberFunctionDeclaration->get_name();
19187 numberOfOperands = memberFunctionDeclaration->get_args().size();
19193 if (functionRefExp != NULL)
19196 if (functionDeclaration != NULL)
19198 functionName = functionDeclaration->get_name();
19199 numberOfOperands = functionDeclaration->get_args().size();
19205 printf (
"In SageInterface::isPrefixOperator(): unknown case of exp = %p = %s \n",exp,exp->
class_name().c_str());
19210 printf (
"In SageInterface::isPrefixOperator(): functionName = %s numberOfOperands = %" PRIuPTR
" (might have to check the return type to distinguish the deref operator from the multiply operator) \n",functionName.str(),numberOfOperands);
19215 if (memberFunctionRefExp != NULL)
19218 ROSE_ASSERT(functionRefExp == NULL);
19219 if (numberOfOperands == 0)
19222 returnValue =
true;
19227 returnValue =
false;
19233 ROSE_ASSERT(functionRefExp != NULL);
19234 ROSE_ASSERT(memberFunctionRefExp == NULL);
19235 if (numberOfOperands == 1)
19238 returnValue =
true;
19243 ROSE_ASSERT(numberOfOperands == 2);
19244 returnValue =
false;
19250 printf (
"Leaving SageInterface::isPrefixOperator(): returnValue = %s \n",returnValue ?
"true" :
"false");
19253 return returnValue;
19269 bool returnValue =
false;
19271 if (memberFunctionRefExp == NULL)
19275 if (memberFunctionDeclaration != NULL)
19277 SgName functionName = memberFunctionDeclaration->get_name();
19278 if ( (functionName ==
"operator[]") && (isSgType(memberFunctionDeclaration->get_type()) != NULL) )
19280 returnValue =
true;
19284 if ( (functionName ==
"operator()") && (isSgType(memberFunctionDeclaration->get_type()) != NULL) )
19286 returnValue =
true;
19290 returnValue =
false;
19295 return returnValue;
19306 ROSE_ASSERT(scope != NULL);
19309 printf (
"In SageInterface::lastStatementOfScopeWithTokenInfo(): scope = %p = %s \n",scope,scope->
class_name().c_str());
19312 SgIfStmt* ifStatement = isSgIfStmt(scope);
19313 if (ifStatement != NULL)
19316 if (lastStatement == NULL || (tokenStreamSequenceMap.find(lastStatement) == tokenStreamSequenceMap.end() || tokenStreamSequenceMap[lastStatement] == NULL))
19319 if (lastStatement == NULL || (tokenStreamSequenceMap.find(lastStatement) == tokenStreamSequenceMap.end() || tokenStreamSequenceMap[lastStatement] == NULL))
19321 lastStatement = NULL;
19325 printf (
"Note: SgIfStmt scope in SageInterface::lastStatementOfScopeWithTokenInfo(): returning lastStatement = %p \n",lastStatement);
19326 if (lastStatement != NULL)
19328 printf (
" --- lastStatement = %p = %s \n",lastStatement,lastStatement->
class_name().c_str());
19331 return lastStatement;
19335 if (statementList.rbegin() != statementList.rend())
19338 SgStatementPtrList::reverse_iterator i = statementList.rbegin();
19340 while (i != statementList.rend() && (tokenStreamSequenceMap.find(*i) == tokenStreamSequenceMap.end() || tokenStreamSequenceMap[*i] == NULL) )
19345 if (i == statementList.rend())
19347 lastStatement = NULL;
19351 lastStatement = *i;
19355 return lastStatement;
19369 void visit (
SgNode* node)
19379 printf (
"Found declaration = %p = %s name = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
19380 if (decl != definingDeclaration && decl != firstNondefiningDeclaration)
19382 otherDeclaration = decl;
19385 if (definingDeclaration != NULL)
19387 definingDeclaration->get_declarationModifier().get_accessModifier().display(
"definingDeclaration: accessModifier");
19390 if (firstNondefiningDeclaration != NULL)
19392 firstNondefiningDeclaration->get_declarationModifier().get_accessModifier().display(
"firstNondefiningDeclaration: accessModifier");
19395 if (otherDeclaration != NULL)
19397 otherDeclaration->get_declarationModifier().get_accessModifier().display(
"otherDeclaration: accessModifier");
19407 DeclarationTraversal traversal;
19408 traversal.traverse(astNode, preorder);
19420 void visit (
SgNode* node)
19426 if (functionDefinition != NULL)
19429 ROSE_ASSERT(functionDeclaration != NULL);
19431 string functionName = functionDeclaration->get_name();
19433 printf (
"functionName = %s \n",functionName.c_str());
19435 if (functionName ==
"main")
19439 ROSE_ASSERT(functionBody != NULL);
19441 ROSE_ASSERT(symbolTable != NULL);
19444 symbolTable->
print();
19449 if (namespaceDefinition != NULL)
19452 ROSE_ASSERT(namespaceDeclaration != NULL);
19454 string namespaceName = namespaceDeclaration->
get_name();
19456 printf (
"namespaceName = %s \n",namespaceName.c_str());
19458 if (namespaceName ==
"B")
19461 ROSE_ASSERT(symbolTable != NULL);
19464 symbolTable->
print();
19472 ScopeTraversal traversal;
19473 traversal.traverse(astNode, preorder);
19481 if (fileInfo != NULL)
19487 if (locatedNode != NULL)
19496 printf (
"In markNodeToBeUnparsed(): physical_file_id = %d \n",physical_file_id);
19499 locatedNode->
get_file_info()->set_physical_file_id(physical_file_id);
19501 printf (
"Note: calling node markTransformationsForOutput(): node = %p = %s \n",node,node->
class_name().c_str());
19505 markTransformationsForOutput(node);
19510 printf (
"Note: node is not a SgLocatedNode: node = %p = %s \n",node,node->
class_name().c_str());
19517 printf (
"Note: no Sg_File_Info was found: node = %p = %s \n",node,node->
class_name().c_str());
19522 if (locatedNode != NULL)
19531 printf (
"In SageInterface::markNodeToBeUnparsed(): locatedNode = %p = %s calling set_physical_file_id(%d) \n",locatedNode,locatedNode->
class_name().c_str(),physical_file_id);
19533 locatedNode->
get_file_info()->set_physical_file_id(physical_file_id);
19538 printf (
"Note: no Sg_File_Info was found: node = %p = %s \n",node,node->
class_name().c_str());
19571 class InheritedAttribute
19574 int physical_file_id;
19575 bool isCastSubtree;
19576 InheritedAttribute(
int file_id): physical_file_id(file_id), isCastSubtree(
false) {}
19577 InheritedAttribute(
const InheritedAttribute & X)
19579 isCastSubtree = X.isCastSubtree;
19580 physical_file_id = X.physical_file_id;
19591 InheritedAttribute evaluateInheritedAttribute (
SgNode* node, InheritedAttribute inheritedAttribute)
19593 InheritedAttribute returnAttribute(inheritedAttribute);
19595 SgCastExp* castExpression = isSgCastExp(node);
19596 if (castExpression != NULL)
19598 returnAttribute.isCastSubtree =
true;
19601 if (returnAttribute.isCastSubtree ==
true)
19605 printf (
"In markSubtreeToBeUnparsedTreeTraversal(): subtree of a SgCastExp: node = %p = %s physical_file_id = %d \n",
19606 node,node->
class_name().c_str(),inheritedAttribute.physical_file_id);
19612 printf (
"In markSubtreeToBeUnparsedTreeTraversal(): Calling markNodeToBeUnparsed(): node = %p = %s physical_file_id = %d \n",
19613 node,node->
class_name().c_str(),inheritedAttribute.physical_file_id);
19619 return returnAttribute;
19623 InheritedAttribute inheritedAttribute(physical_file_id);
19626 SubtreeTraversal traversal;
19629 printf (
"\nIn markSubtreeToBeUnparsedTreeTraversal(): calling traverse \n");
19632 traversal.traverse(root, inheritedAttribute);
19634 printf (
"This function does not compile with GNU 4.9 or older compilers (part of ROSE used only with more modern compilers) \n");
19643vector<SgDeclarationStatement*>
19644generateCopiesOfDependentDeclarations (
const vector<SgDeclarationStatement*>& dependentDeclarations,
SgScopeStatement* targetScope)
19655 printf (
"\n\n********************************************************** \n");
19656 printf (
" Inside of generateCopiesOfDependentDeclarations(stmt = %p = %s) \n",stmt,stmt->
class_name().c_str());
19657 printf (
"********************************************************** \n");
19660 vector<SgDeclarationStatement*> copiesOfDependentDeclarations;
19665 printf (
"Output the dependentDeclarations: dependentDeclarations.size() = %" PRIuPTR
" \n",dependentDeclarations.size());
19666 outputDeclarationList(dependentDeclarations);
19669 printf (
"************************************************ \n");
19670 printf (
"*** Make all copies of dependentDeclarations *** \n");
19671 printf (
"************************************************ \n");
19675 ROSE_ASSERT(targetScope != NULL);
19678 ROSE_ASSERT(isSgGlobal(targetScope) != NULL);
19680 for (vector<SgDeclarationStatement*>::const_iterator i = dependentDeclarations.begin(); i != dependentDeclarations.end(); i++)
19683 printf (
"Copying declaration = %p = %s = %s \n",*i,(*i)->class_name().c_str(),
SageInterface::get_name(*i).c_str());
19687 SgNode* copy_node = NULL;
19692 if (functionDeclaration != NULL)
19701 printf (
"WARNING: In SageInterface -- generateCopiesOfDependentDeclarations(): I think this is the wrong lookup symbol function that is being used here! \n");
19708 printf (
"In generateCopiesOfDependentDeclarations(): Copy mechanism appied to SgFunctionDeclaration functionDeclaration->get_firstNondefiningDeclaration() = %p \n",functionDeclaration->
get_firstNondefiningDeclaration());
19710 printf (
"functionDeclaration = %p \n",functionDeclaration);
19711 printf (
"functionDeclaration->get_definingDeclaration() = %p \n",functionDeclaration->
get_definingDeclaration());
19713 printf (
"functionDeclaration->get_scope() = %p \n",functionDeclaration->
get_scope());
19714 printf (
"targetScope = %p \n",targetScope);
19717 assert(copy_functionDeclaration != NULL);
19719 copy_functionDeclaration->
set_parent(targetScope);
19729 assert(copy_functionDeclaration->
get_scope() != NULL);
19730 assert(copy_functionDeclaration->
get_scope() == targetScope);
19731 assert(copy_functionDeclaration->
get_scope()->lookup_function_symbol(copy_functionDeclaration->get_name(),
19732 copy_functionDeclaration->get_type()) != NULL);
19733 assert(copy_functionDeclaration->
get_scope()->lookup_function_symbol(copy_functionDeclaration->get_name(),
19736 copy_node = copy_functionDeclaration;
19738 printf (
"In generateCopiesOfDependentDeclarations(): DONE: Copy mechanism appied to SgFunctionDeclaration \n");
19752 cout<<
"Copying a defining typedef declaration:"<<tdecl->
unparseToString()<<endl;
19754 cout<<
"Copying a non-defining typedef declaration:"<<tdecl->
unparseToString()<<endl;
19758 tdecl_copy->set_typedefBaseTypeContainsDefiningDeclaration (
false);
19761 copy_node = (*i)->copy(collectDependentDeclarationsCopyType);
19765 ROSE_ASSERT(copy_declaration != NULL);
19769 copy_declaration->
set_scope(targetScope);
19781 ROSE_ASSERT(copy_node != NULL);
19790 ROSE_ASSERT(copy_definingDeclaration != NULL);
19792 ROSE_ASSERT( *i != NULL );
19793 ROSE_ASSERT(copy_definingDeclaration != NULL);
19796 if (copy_definingDeclaration->
get_parent() == NULL)
19798 copy_definingDeclaration->
set_parent(targetScope);
19800 ROSE_ASSERT(copy_definingDeclaration->
get_parent() != NULL);
19803 printf (
"DONE: Copying declaration: original scope = %p copied to scope = %p \n",(*i)->get_scope(),copy_definingDeclaration->
get_scope());
19813 ROSE_ASSERT(copy_definingDeclaration->
get_parent() == NULL);
19820 printf (
"copy_definingDeclaration = %p \n",copy_definingDeclaration);
19821 printf (
"copy_definingDeclaration->get_firstNondefiningDeclaration() == NULL \n");
19822 printf (
"copy_definingDeclaration->get_definingDeclaration() = %p \n",copy_definingDeclaration->
get_definingDeclaration());
19827 if ((*i)->get_firstNondefiningDeclaration() != NULL)
19835 copiesOfDependentDeclarations.push_back(copy_definingDeclaration);
19839 printf (
"****************************************************** \n");
19840 printf (
"*** DONE: Make all copies of dependentDeclarations *** \n");
19841 printf (
"****************************************************** \n");
19842 printf (
"copiesOfDependentDeclarations.size() = %" PRIuPTR
" \n",copiesOfDependentDeclarations.size());
19848 ROSE_ASSERT(copiesOfDependentDeclarations.size() <= dependentDeclarations.size());
19850 return copiesOfDependentDeclarations;
19855declarationContainsDependentDeclarations(
SgDeclarationStatement* decl, vector<SgDeclarationStatement*> & dependentDeclarationList )
19858 bool returnValue =
false;
19861 printf (
"\n\n********************************************************** \n");
19862 printf (
" Inside of declarationContainsDependentDeclarations(decl = %p = %s) \n",decl,decl->
class_name().c_str());
19863 printf (
"********************************************************** \n");
19871 for (
size_t i = 0; i < locallyDependentDeclarationList.size(); i++)
19877 vector<SgDeclarationStatement*>::iterator j = find(dependentDeclarationList.begin(),dependentDeclarationList.end(),d);
19878 if (j != dependentDeclarationList.end())
19883 printf (
"Found a dependent declaration buried in the class definition: locallyDependentDeclarationList[%" PRIuPTR
"] = %p = %s = %s \n",i,d,d->
class_name().c_str(),
SageInterface::get_name(d).c_str());
19885 returnValue =
true;
19890 printf (
"**************************************************************************** \n");
19891 printf (
" LEAVING: Inside of declarationContainsDependentDeclarations(decl = %p = %s) returnValue = %s \n",decl,decl->
class_name().c_str(),returnValue ?
"true" :
"false");
19892 printf (
"**************************************************************************** \n");
19895 return returnValue;
19900 ROSE_ASSERT (new_exp != NULL);
19901 ROSE_ASSERT (anchor_exp != NULL);
19902 ROSE_ASSERT (new_exp != anchor_exp);
19905 ROSE_ASSERT (parent != NULL);
19909 ROSE_ASSERT (result != NULL);
19921 ROSE_ASSERT (new_exp != NULL);
19922 ROSE_ASSERT (anchor_exp != NULL);
19923 ROSE_ASSERT (new_exp != anchor_exp);
19926 ROSE_ASSERT (parent != NULL);
19930 ROSE_ASSERT (t != NULL);
19932 ROSE_ASSERT (enclosing_stmt != NULL);
19939 ROSE_ASSERT (temp_sym != NULL);
19941 *temp_decl = t_decl;
19946 * temp_ref = first_ref;
19959 string fileName =
"separate-outlined-file";
19979 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl = %p \n",decl);
19980 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_parent() = %p \n",decl->
get_parent());
19981 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_scope() = %p \n",decl->
get_scope());
19982 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): original_statement = %p \n",original_statement);
19983 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): file (decl) = %s \n",TransformationSupport::getSourceFile(decl)->getFileName().c_str());
19984 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_firstNondefiningDeclaration() = %p \n",decl->
get_firstNondefiningDeclaration());
19986 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): file (first non-defining) = %s \n",TransformationSupport::getSourceFile(decl->
get_firstNondefiningDeclaration())->
getFileName().c_str());
19987 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_definingDeclaration() = %p \n",decl->
get_definingDeclaration());
19989 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): file (first non-defining) = %s \n",TransformationSupport::getSourceFile(decl->
get_definingDeclaration())->
getFileName().c_str());
19992#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
20024 vector<SgDeclarationStatement*> dependentDeclarationList_inOriginalFile;
20031 vector<SgDeclarationStatement*> dependentDeclarationList = generateCopiesOfDependentDeclarations(dependentDeclarationList_inOriginalFile,scope);
20032 ROSE_ASSERT(dependentDeclarationList.size() <= dependentDeclarationList_inOriginalFile.size());
20042 std::map<SgNode*, SgNode*> replacementMap;
20047 SgCopyHelp::copiedNodeMapType copyNodeMap = collectDependentDeclarationsCopyType.get_copiedNodeMap();
20048 SgCopyHelp::copiedNodeMapType::iterator copyNodeMapItrator = copyNodeMap.begin();
20049 while (copyNodeMapItrator != copyNodeMap.end())
20054 SgNode* first =
const_cast<SgNode*
>(copyNodeMapItrator->first);
20055 SgNode* second = copyNodeMapItrator->second;
20057 printf (
"copyNodeMapItrator.first = %p = %s second = %p = %s \n",first,first->
class_name().c_str(),second,second->
class_name().c_str());
20060 if (isSgSymbol(first) != NULL)
20065 replacementMap.insert(pair<SgNode*,SgNode*>(first,second));
20068 copyNodeMapItrator++;
20072 printf (
"Exiting after test of new functionality \n");
20078 SgSourceFile* sourceFile = TransformationSupport::getSourceFile(original_statement);
20079 vector<PreprocessingInfo*> requiredDirectivesList = collectCppDirectives(sourceFile);
20082 ROSE_ASSERT(outlinedFunctionDeclaration != NULL);
20083 SgGlobal* originalFileGlobalScope = TransformationSupport::getGlobalScope(original_statement);
20084 ROSE_ASSERT(originalFileGlobalScope != NULL);
20086 printf (
"WARNING: In SageInterface::appendStatementWithDependentDeclaration(): I think this is the wrong lookup symbol function that is being used here! \n");
20090 SgFunctionSymbol* outlinedFunctionSymbolFromOriginalFile = isSgFunctionSymbol(originalFileGlobalScope->lookup_symbol(outlinedFunctionDeclaration->get_name(),NULL,NULL));
20096 printf (
"outlinedFunctionSymbolFromOriginalFile = %p outlinedFunctionSymbolFromOutlinedFile = %p \n",outlinedFunctionSymbolFromOriginalFile,outlinedFunctionSymbolFromOutlinedFile);
20098 printf (
"TransformationSupport::getSourceFile(decl)->getFileName() = %s \n",TransformationSupport::getSourceFile(decl)->getFileName().c_str());
20099 printf (
"TransformationSupport::getSourceFile(decl->get_firstNondefiningDeclaration())->getFileName() = %s \n",TransformationSupport::getSourceFile(decl->
get_firstNondefiningDeclaration())->
getFileName().c_str());
20100 printf (
"TransformationSupport::getSourceFile(original_statement)->getFileName() = %s \n",TransformationSupport::getSourceFile(original_statement)->getFileName().c_str());
20103 ROSE_ASSERT(outlinedFunctionSymbolFromOriginalFile != NULL);
20104 ROSE_ASSERT(outlinedFunctionSymbolFromOutlinedFile != NULL);
20107 ROSE_ASSERT(outlinedFunctionSymbolFromOriginalFile == outlinedFunctionSymbolFromOutlinedFile);
20110 replacementMap.insert(pair<SgNode*,SgNode*>(originalFileGlobalScope,scope));
20113 SgFunctionDeclaration* outlinedNondefiningFunctionDeclarationFromOriginalFile = isSgFunctionDeclaration(outlinedFunctionSymbolFromOriginalFile->get_declaration());
20115 ROSE_ASSERT(outlinedNondefiningFunctionDeclarationFromOriginalFile != NULL);
20116 ROSE_ASSERT(outlinedNondefiningFunctionDeclarationFromOutlinedFile != NULL);
20117 replacementMap.insert(pair<SgNode*,SgNode*>(outlinedNondefiningFunctionDeclarationFromOriginalFile,outlinedNondefiningFunctionDeclarationFromOutlinedFile));
20126 for (
size_t i = 0; i < dependentDeclarationList.size(); i++)
20132 printf (
"originalDeclaration = %p \n",originalDeclaration);
20134 d->
get_file_info()->display(
"SageInterface::appendStatementWithDependentDeclaration()");
20142 ROSE_ASSERT(decl->
get_scope() == scope);
20148 printf (
"Add the required symbol information to the symbol table: scope = %p = %s \n",scope,scope->
class_name().c_str());
20155 case V_SgClassDeclaration:
20157 if ( declarationContainsDependentDeclarations(d,dependentDeclarationList) ==
true )
20158 printf (
"Warning: This class contains dependent declarations (not implemented) \n");
20162 case V_SgMemberFunctionDeclaration:
20163 printf (
"Sorry, support for dependent member function declarations not implemented! \n");
20166 case V_SgTemplateInstantiationDecl:
20167 printf (
"Sorry, not implemented: case SgTemplateInstantiationDecl not handled as dependent declaration \n");
20168 d->
get_file_info()->display(
"Sorry, not implemented: case SgTemplateInstantiationDecl not handled as dependent declaration");
20170 printf (
"Case of SgTemplateInstantiationDecl not implemented. \n");
20173 case V_SgNamespaceDeclarationStatement:
20174 if (declarationContainsDependentDeclarations(d,dependentDeclarationList) ==
true )
20175 printf (
"Warning: This namespace contains dependent declarations (not supported) \n");
20178 case V_SgFunctionDeclaration:
20179 case V_SgTypedefDeclaration:
20180 case V_SgEnumDeclaration:
20184 printf (
"default case in SageInterface::appendStatementWithDependentDeclaration() (handling dependentDeclarationList) d = %p = %s \n",d,d->
class_name().c_str());
20190 vector<PreprocessingInfo*> cppDirectivesAlreadyAttachedToDependentDeclarations = collectCppDirectives(d);
20193 printf (
"directives BEFORE excluding those already present in dependent declarations \n");
20194 outputPreprocessingInfoList(requiredDirectivesList);
20196 printf (
"directives already attached to dependent declarations \n");
20197 outputPreprocessingInfoList(cppDirectivesAlreadyAttachedToDependentDeclarations);
20201 vector<PreprocessingInfo*>::iterator j = cppDirectivesAlreadyAttachedToDependentDeclarations.begin();
20202 while ( j != cppDirectivesAlreadyAttachedToDependentDeclarations.end() )
20205 vector<PreprocessingInfo*>::iterator entry = find(requiredDirectivesList.begin(),requiredDirectivesList.end(),*j);
20206 ROSE_ASSERT(entry != requiredDirectivesList.end());
20208 requiredDirectivesList.erase(entry);
20214 printf (
"directives AFTER excluding those already present in dependent declarations \n");
20215 outputPreprocessingInfoList(requiredDirectivesList);
20224 if (dependentDeclarationList.empty() ==
true)
20226 firstStatmentInFile = decl;
20230 firstStatmentInFile = dependentDeclarationList[0];
20233 ROSE_ASSERT(firstStatmentInFile != NULL);
20241 if (excludeHeaderFiles ==
false)
20244 vector<PreprocessingInfo*>::reverse_iterator j = requiredDirectivesList.rbegin();
20245 while ( j != requiredDirectivesList.rend() )
20264 SgSourceFile* outlinedFile = TransformationSupport::getSourceFile(scope);
20265 ROSE_ASSERT(outlinedFile != NULL);
20271 printf (
"\n\n************************************************************\n");
20272 printf (
"Calling Utils::edgePointerReplacement() \n");
20278 printf (
"Calling Utils::edgePointerReplacement(): DONE \n");
20279 printf (
"************************************************************\n\n");
20281 printf (
"\n\n After replacementMapTraversal(): intermediateDeleteSet: \n");
20282 displaySet(intermediateDeleteSet,
"After Utils::edgePointerReplacement");
20286 ROSE_ASSERT(dependentDeclarationList.size() <= dependentDeclarationList_inOriginalFile.size());
20294 printf (
"replacementMap.size() = %" PRIuPTR
" dependentDeclarationList.size() = %" PRIuPTR
" \n",replacementMap.size(),dependentDeclarationList.size());
20310 int SgVariableSymbol_count;
20311 int SgFunctionSymbol_count;
20312 int SgClassDeclaration_count;
20313 int SgTypedefSymbol_count;
20314 int SgMemFuncSymbol_count;
20315 int SgTemplateSymbol_count;
20316 int SgEnumFieldSymbol_count;
20334 SgVariableSymbol_count = 0;
20335 SgVariableSymbolPtr = symbol;
20336 SgFunctionSymbolPtr =NULL;
20337 SgClassSymbolPtr =NULL;
20338 SgTypedefPtr = NULL;
20339 SgMemFuncSymbolPtr =NULL;
20340 class_defining = NULL;
20342 typedef_defining =NULL;
20343 function_decl = NULL;
20344 SgTemplateSymbolPtr = NULL;
20345 template_defining = NULL;
20346 SgEnumFieldSymbolPtr = NULL;
20347 templateInstantiate_defining =NULL;
20351 SgFunctionSymbol_count = 0;
20352 SgFunctionSymbolPtr = symbol;
20355 SgMemFuncSymbol_count =0;
20357 SgVariableSymbolPtr = NULL;
20358 SgClassSymbolPtr =NULL;
20359 SgTypedefPtr = NULL;
20360 SgMemFuncSymbolPtr =NULL;
20361 class_defining = NULL;
20363 typedef_defining =NULL;
20364 function_decl = NULL;
20365 SgTemplateSymbolPtr = NULL;
20366 template_defining = NULL;
20367 SgEnumFieldSymbolPtr = NULL;
20368 templateInstantiate_defining =NULL;
20372 SgClassDeclaration_count = 0;
20373 SgClassSymbolPtr = symbol;
20374 SgFunctionSymbolPtr = NULL;
20375 SgVariableSymbolPtr = NULL;
20376 SgTypedefPtr = NULL;
20377 SgMemFuncSymbolPtr =NULL;
20378 class_defining = NULL;
20380 typedef_defining =NULL;
20381 function_decl = NULL;
20382 SgTemplateSymbolPtr = NULL;
20383 template_defining = NULL;
20384 SgEnumFieldSymbolPtr = NULL;
20385 templateInstantiate_defining =NULL;
20389 SgTypedefSymbol_count =0;
20390 SgTypedefPtr = symbol;
20391 SgClassSymbolPtr = NULL;
20392 SgFunctionSymbolPtr = NULL;
20393 SgVariableSymbolPtr = NULL;
20394 SgMemFuncSymbolPtr =NULL;
20395 class_defining = NULL;
20397 typedef_defining =NULL;
20398 function_decl = NULL;
20399 SgTemplateSymbolPtr = NULL;
20400 template_defining = NULL;
20401 SgEnumFieldSymbolPtr = NULL;
20402 templateInstantiate_defining =NULL;
20406 SgMemFuncSymbolPtr = symbol;
20407 SgMemFuncSymbol_count =0;
20408 SgTypedefPtr = NULL;
20409 SgClassSymbolPtr = NULL;
20410 SgFunctionSymbolPtr = NULL;
20411 SgVariableSymbolPtr = NULL;
20412 class_defining = NULL;
20414 typedef_defining =NULL;
20415 function_decl = NULL;
20416 SgTemplateSymbolPtr = NULL;
20417 template_defining = NULL;
20418 SgEnumFieldSymbolPtr = NULL;
20419 templateInstantiate_defining =NULL;
20423 SgTemplateSymbolPtr = symbol;
20424 SgTemplateSymbol_count =0;
20425 SgMemFuncSymbolPtr = NULL;
20426 SgTypedefPtr = NULL;
20427 SgClassSymbolPtr = NULL;
20428 SgFunctionSymbolPtr = NULL;
20429 SgVariableSymbolPtr = NULL;
20430 class_defining = NULL;
20432 typedef_defining =NULL;
20433 function_decl = NULL;
20434 template_defining = NULL;
20435 SgEnumFieldSymbolPtr = NULL;
20436 templateInstantiate_defining =NULL;
20440 SgEnumFieldSymbolPtr = symbol;
20441 SgEnumFieldSymbol_count =0;
20442 SgTemplateSymbolPtr = NULL;
20443 SgMemFuncSymbolPtr = NULL;
20444 SgTypedefPtr = NULL;
20445 SgClassSymbolPtr = NULL;
20446 SgFunctionSymbolPtr = NULL;
20447 SgVariableSymbolPtr = NULL;
20448 class_defining = NULL;
20450 typedef_defining =NULL;
20451 function_decl = NULL;
20452 template_defining = NULL;
20453 templateInstantiate_defining =NULL;
20458 class_defining = node;
20459 SgMemFuncSymbolPtr = NULL;
20460 SgTypedefPtr = NULL;
20461 SgClassSymbolPtr = NULL;
20462 SgFunctionSymbolPtr = NULL;
20463 SgVariableSymbolPtr = NULL;
20465 typedef_defining =NULL;
20466 function_decl = NULL;
20467 SgTemplateSymbolPtr = NULL;
20468 template_defining = NULL;
20469 SgEnumFieldSymbolPtr = NULL;
20470 templateInstantiate_defining =NULL;
20474 template_defining = node;
20475 class_defining = NULL;
20476 SgMemFuncSymbolPtr = NULL;
20477 SgTypedefPtr = NULL;
20478 SgClassSymbolPtr = NULL;
20479 SgFunctionSymbolPtr = NULL;
20480 SgVariableSymbolPtr = NULL;
20482 typedef_defining =NULL;
20483 function_decl = NULL;
20484 SgTemplateSymbolPtr = NULL;
20485 SgEnumFieldSymbolPtr = NULL;
20486 templateInstantiate_defining =NULL;
20489 function_decl =node;
20490 class_defining = NULL;
20491 SgMemFuncSymbolPtr = NULL;
20492 SgTypedefPtr = NULL;
20493 SgClassSymbolPtr = NULL;
20494 SgFunctionSymbolPtr = NULL;
20495 SgVariableSymbolPtr = NULL;
20497 typedef_defining =NULL;
20498 SgTemplateSymbolPtr = NULL;
20499 template_defining = NULL;
20500 SgEnumFieldSymbolPtr = NULL;
20501 templateInstantiate_defining =NULL;
20506 function_decl =NULL;
20507 class_defining = NULL;
20508 SgMemFuncSymbolPtr = NULL;
20509 SgTypedefPtr = NULL;
20510 SgClassSymbolPtr = NULL;
20511 SgFunctionSymbolPtr = NULL;
20512 SgVariableSymbolPtr = NULL;
20513 typedef_defining =NULL;
20514 SgTemplateSymbolPtr = NULL;
20515 template_defining = NULL;
20516 SgEnumFieldSymbolPtr = NULL;
20517 templateInstantiate_defining =NULL;
20521 typedef_defining = node;
20523 function_decl =NULL;
20524 class_defining = NULL;
20525 SgMemFuncSymbolPtr = NULL;
20526 SgTypedefPtr = NULL;
20527 SgClassSymbolPtr = NULL;
20528 SgFunctionSymbolPtr = NULL;
20529 SgVariableSymbolPtr = NULL;
20530 SgTemplateSymbolPtr = NULL;
20531 template_defining = NULL;
20532 SgEnumFieldSymbolPtr = NULL;
20533 templateInstantiate_defining =NULL;
20537 templateInstantiate_defining =node;
20538 typedef_defining = NULL;
20540 function_decl =NULL;
20541 class_defining = NULL;
20542 SgMemFuncSymbolPtr = NULL;
20543 SgTypedefPtr = NULL;
20544 SgClassSymbolPtr = NULL;
20545 SgFunctionSymbolPtr = NULL;
20546 SgVariableSymbolPtr = NULL;
20547 SgTemplateSymbolPtr = NULL;
20548 template_defining = NULL;
20549 SgEnumFieldSymbolPtr = NULL;
20556 if(SgVariableSymbolPtr !=NULL)
20558 if(node->get_scope()!=NULL)
20564 if (isSgVariableSymbol(s) == SgVariableSymbolPtr) SgVariableSymbol_count++;
20569 if(SgEnumFieldSymbolPtr !=NULL)
20571 if(node->get_scope()!=NULL)
20577 if (isSgEnumFieldSymbol(s) == SgEnumFieldSymbolPtr) SgEnumFieldSymbol_count++;
20585 if(SgVariableSymbolPtr !=NULL){
20587 if (s == SgVariableSymbolPtr) SgVariableSymbol_count++;
20591 int get_num_variable_pointers(){
return SgVariableSymbol_count;}
20593 int get_num_EnumField_pointers(){
return SgEnumFieldSymbol_count;}
20598 if(SgFunctionSymbolPtr !=NULL){
20604 if ((
SgFunctionSymbol *)s == SgFunctionSymbolPtr) SgFunctionSymbol_count++;
20609 if(function_decl!=NULL){
20613 if(node!=function_decl && (define==function_decl || first_nondefine==function_decl))
delete node;
20622 printf (
"In visit(SgFunctionRefExp* node): SgFunctionSymbolPtr = %p \n",SgFunctionSymbolPtr);
20624 if (SgFunctionSymbolPtr !=NULL)
20627 if (isSgFunctionSymbol(s) == SgFunctionSymbolPtr)
20629 SgFunctionSymbol_count++;
20631 printf (
"Increment SgFunctionSymbol_count = %d \n",SgFunctionSymbol_count);
20641 printf (
"In visit(SgMemberFunctionRefExp* node): SgFunctionSymbolPtr = %p \n",SgFunctionSymbolPtr);
20643 if (SgFunctionSymbolPtr !=NULL)
20646 if (isSgFunctionSymbol(s) == SgFunctionSymbolPtr)
20648 SgFunctionSymbol_count++;
20650 printf (
"Increment SgFunctionSymbol_count = %d \n",SgFunctionSymbol_count);
20658 if (SgFunctionSymbolPtr !=NULL){
20660 if (isSgFunctionSymbol(s) == SgFunctionSymbolPtr) SgFunctionSymbol_count++;
20664 int get_num_Function_pointers(){
return SgFunctionSymbol_count;}
20669 if(SgClassSymbolPtr !=NULL){
20674 if (isSgClassSymbol(s) == SgClassSymbolPtr) SgClassDeclaration_count++;
20679 if(class_defining!=NULL) {
20683 if((class_decl==class_defining||class_decl1==class_defining) && node!=class_defining )
20691 if(SgClassSymbolPtr !=NULL){
20696 if (isSgClassSymbol(s) == SgClassSymbolPtr) SgClassDeclaration_count++;
20701 if(templateInstantiate_defining!=NULL) {
20708 if((template_decl==templateInstantiate_defining||template_decl1==templateInstantiate_defining) && node!=templateInstantiate_defining){
20728 if (SgClassSymbolPtr !=NULL){
20729 SgSymbol* s = node->get_class_symbol();
20730 if (s == SgClassSymbolPtr) SgClassDeclaration_count++;
20736 if (SgClassSymbolPtr !=NULL){
20738 if (isSgClassSymbol(s) == SgClassSymbolPtr) SgClassDeclaration_count++;
20743 int get_num_Class_pointers(){
return SgClassDeclaration_count;}
20749 if(memFunc !=NULL){
20751 if(func == memFunc){
20760 if (SgMemFuncSymbolPtr !=NULL){
20765 if(symbol == SgMemFuncSymbolPtr){
20766 SgMemFuncSymbol_count++;
20775 if (SgMemFuncSymbolPtr !=NULL){
20780 if(symbol == SgMemFuncSymbolPtr){
20781 SgMemFuncSymbol_count++;
20790 int get_num_memFunc_pointers(){
return SgMemFuncSymbol_count;}
20796 if(SgTypedefPtr!=NULL){
20805 if(typedef_defining!=NULL){
20807 if(typedef_define == typedef_defining && node != typedef_defining ) {
20813 int get_num_Typedef_pointers(){
return SgTypedefSymbol_count;}
20819 if (SgTemplateSymbolPtr !=NULL){
20824 if(symbol == SgTemplateSymbolPtr){
20825 SgTemplateSymbol_count++;
20831 if(template_defining !=NULL) {
20838 if((template_decl==template_defining||template_decl1==template_defining) && node!=template_defining) {
20848 int get_num_Template_pointers(){
return SgTemplateSymbol_count;}
20858 void visit (
SgNode* node)
20865 printf (
"In DeleteAST::visit(): node = %p = %s \n",node,node->
class_name().c_str());
20870 if (isSgScopeStatement(node) !=NULL)
20874 printf (
"Deleting the scopes type table: scope->get_type_table() = %p \n",scope->get_type_table());
20876 delete scope->get_type_table();
20882 if (isSgTypeTable(node) !=NULL)
20886 printf (
"Deleting the type table (SgSymbolTable): typeTable->get_type_table() = %p \n",typeTable->get_type_table());
20888 delete typeTable->get_type_table();
20891 if(isSgInitializedName(node) !=NULL){
20895 if(isSgVariableDefinition(var_def) !=NULL){
20902 if(isSgInitializedName(node)->get_scope()!=NULL){
20906 if(isSgVariableSymbol(symbol) !=NULL){
20908 traverseMemoryPoolVisitorPattern(visitor);
20909 if(visitor.get_num_variable_pointers()==1){
20916 if(isSgEnumFieldSymbol(symbol) !=NULL){
20918 traverseMemoryPoolVisitorPattern(visitor);
20919 if(visitor.get_num_EnumField_pointers()==1){
20930 if(isSgVarRefExp(node) !=NULL){
20932 ClassicVisitor visitor(symbol);
20933 traverseMemoryPoolVisitorPattern(visitor);
20934 if(visitor.get_num_variable_pointers()==1){
20946 SgFunctionDeclaration* funcDecl = isSgFunctionDeclaration(node);
20947 if (funcDecl != NULL){
20948 if (isSgMemberFunctionDeclaration(node) == NULL) {
20949 if (funcDecl->get_scope() != NULL) {
20950 if (funcDecl->get_scope()->get_symbol_table() != NULL) {
20951 SgSymbol* symbol = ((SgFunctionDeclaration*)node)->get_symbol_from_symbol_table();
20952 ClassicVisitor visitor((SgFunctionSymbol *)symbol);
20953 traverseMemoryPoolVisitorPattern(visitor);
20954 if (visitor.get_num_Function_pointers()==1) { //only one reference to this FunctionSymbol => safe to delete
20955 ((SgFunctionDeclaration*)node)->get_scope()->get_symbol_table()->remove(symbol);
20957 //printf("A SgFunctionSymbol was deleted\n");
20959 ClassicVisitor visitor1((SgFunctionDeclaration *)node);
20960 traverseMemoryPoolVisitorPattern(visitor1);
20967 if(isSgFunctionRefExp(node) !=NULL)
20970 SgFunctionRefExp* functionRefExp = isSgFunctionRefExp(node);
20971 ROSE_ASSERT(functionRefExp->get_symbol_i() != NULL);
20972 printf ("In DeleteAST::visit(): functionRefExp->get_symbol_i() = %p = %s \n",functionRefExp->get_symbol_i(),functionRefExp->get_symbol_i()->class_name().c_str());
20974 SgFunctionSymbol *symbol = ((SgFunctionRefExp*)node)->get_symbol_i();
20975 ClassicVisitor visitor(symbol);
20976 traverseMemoryPoolVisitorPattern(visitor);
20977 if(visitor.get_num_Function_pointers()==1)
20979 // only one reference to this FunctionSymbol => safe to delete
20980 //((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
20982 //printf("A SgFunctionSymbol was deleted\n");
20987 if(isSgUserDefinedBinaryOp(node) !=NULL){
20988 SgFunctionSymbol *symbol = ((SgUserDefinedBinaryOp*)node)->get_symbol();
20989 ClassicVisitor visitor(symbol);
20990 traverseMemoryPoolVisitorPattern(visitor);
20991 if(visitor.get_num_Function_pointers()==1){ //only one reference to this FunctionSymbol => safe to delete
20992 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
20994 //printf("A SgFunctionSymbol was deleted\n");
21002 if(isSgTypedefDeclaration(node) !=NULL){
21007 if(isSgTypedefSymbol(symbol)){
21009 traverseMemoryPoolVisitorPattern(visitor);
21010 if(visitor.get_num_Typedef_pointers()==1){
21021 traverseMemoryPoolVisitorPattern(visitor1);
21029 if(isSgNamespaceDeclarationStatement(node) !=NULL){
21030 if(((SgNamespaceDeclarationStatement*)node)->get_scope()!=NULL){
21031 if(((SgNamespaceDeclarationStatement*)node)->get_scope()->get_symbol_table()!=NULL)
21033 SgSymbol* symbol = ((SgNamespaceDeclarationStatement*)node)->get_symbol_from_symbol_table();
21034 if(isSgNamespaceSymbol(symbol)){
21035 ((SgNamespaceDeclarationStatement*)node)->get_scope()->get_symbol_table()->remove(symbol);
21037 //printf("A SgNamespaceSymbol was deleted\n");
21044 if(isSgNamespaceAliasDeclarationStatement(node) !=NULL){
21045 if(((SgNamespaceAliasDeclarationStatement*)node)->get_scope()!=NULL){
21046 if(((SgNamespaceAliasDeclarationStatement*)node)->get_scope()->get_symbol_table()!=NULL)
21048 SgSymbol* symbol = ((SgNamespaceAliasDeclarationStatement*)node)->get_symbol_from_symbol_table();
21049 if(isSgNamespaceSymbol(symbol)){
21050 ((SgNamespaceAliasDeclarationStatement*)node)->get_scope()->get_symbol_table()->remove(symbol);
21052 //printf("A SgNamespaceSymbol was deleted\n");
21063 if(isSgLabelStatement(node) !=NULL){
21068 if(isSgLabelSymbol(symbol)){
21077 if(isSgLabelRefExp(node) !=NULL){
21089 if(isSgEnumDeclaration(node) !=NULL){
21090 if(((SgEnumDeclaration*)node)->get_scope()!=NULL){
21091 if(((SgEnumDeclaration*)node)->get_scope()->get_symbol_table()!=NULL)
21093 SgSymbol* symbol = ((SgEnumDeclaration*)node)->get_symbol_from_symbol_table();
21094 if(isSgEnumSymbol(symbol) !=NULL){
21095 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21097 //printf("A SgEnumSymbol was deleted\n");
21101 SgEnumType* type= ((SgEnumDeclaration*)node)->get_type();
21104 //printf("A SgEnumType was deleted\n");
21113 if(isSgClassDeclaration(node) !=NULL && isSgTemplateInstantiationDecl(node) ==NULL){
21118 if(isSgClassSymbol(symbol) !=NULL){
21120 traverseMemoryPoolVisitorPattern(visitor);
21121 if(visitor.get_num_Class_pointers()==1){
21131 traverseMemoryPoolVisitorPattern(visitor);
21140 if(isSgThisExp(node) !=NULL){
21143 traverseMemoryPoolVisitorPattern(visitor);
21144 if(visitor.get_num_Class_pointers()==1){
21145 ((
SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21152 if(isSgClassNameRefExp(node) !=NULL){
21154 if(isSgClassSymbol(symbol) !=NULL)
21157 traverseMemoryPoolVisitorPattern(visitor);
21158 if(visitor.get_num_Class_pointers()==1){
21159 ((
SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21171 if(isSgMemberFunctionDeclaration(node) !=NULL){
21172 if(((SgMemberFunctionDeclaration*)node)->get_scope()!=NULL){
21173 if(((SgMemberFunctionDeclaration*)node)->get_scope()->get_symbol_table()!=NULL)
21175 SgSymbol* symbol = ((SgMemberFunctionDeclaration*)node)->get_symbol_from_symbol_table();
21176 if(isSgMemberFunctionSymbol(symbol)){
21177 ClassicVisitor visitor((SgMemberFunctionSymbol*)symbol);
21178 traverseMemoryPoolVisitorPattern(visitor);
21179 if(visitor.get_num_memFunc_pointers()==1){
21180 ((SgMemberFunctionDeclaration*)node)->get_scope()->get_symbol_table()->remove(symbol);
21182 //printf("A SgMemberFunctionSymbol was deleted\n");
21187 ClassicVisitor visitor((SgMemberFunctionDeclaration*) node);
21188 traverseMemoryPoolVisitorPattern(visitor);
21191//Tan: I have no idea why the codes below cannot work. Perhaps it conflicts with some prior works
21193 if(isSgMemberFunctionRefExp(node) !=NULL){
21194 SgMemberFunctionSymbol* symbol = ((SgMemberFunctionRefExp*)node)->get_symbol_i();
21195 ClassicVisitor visitor(symbol);
21196 traverseMemoryPoolVisitorPattern(visitor);
21197 if(visitor.get_num_memFunc_pointers()==1){ //only one reference to this symbol => safe to delete
21198 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21200 //printf("A SgClassSymbol was deleted\n");
21205 if(isSgFunctionType(node) !=NULL){
21206 SgSymbol* symbol = ((SgFunctionType*)node)->get_symbol_from_symbol_table();
21207 if(isSgFunctionTypeSymbol(symbol)){
21208 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21210 //printf("A SgFunctionTypeSymbol was deleted\n");
21219 if(isSgInterfaceStatement(node) !=NULL){
21224 if(isSgInterfaceSymbol(symbol)){
21235 if(isSgModuleStatement(node) !=NULL){
21240 if(isSgModuleSymbol(symbol)){
21253 if(isSgTemplateInstantiationMemberFunctionDecl(node) !=NULL){
21258 if(isSgMemberFunctionSymbol(symbol)){
21260 traverseMemoryPoolVisitorPattern(visitor);
21261 if(visitor.get_num_memFunc_pointers()==1){
21270 traverseMemoryPoolVisitorPattern(visitor);
21273 if(isSgTemplateDeclaration(node) !=NULL){
21279 traverseMemoryPoolVisitorPattern(visitor);
21280 if(visitor.get_num_Template_pointers()==1){
21283 printf(
"A SgTemplateSymbol was deleted\n");
21289 traverseMemoryPoolVisitorPattern(visitor1);
21294 if(isSgInterfaceStatement(node) !=NULL){
21299 if(isSgInterfaceSymbol(symbol)){
21310 if(isSgModuleStatement(node) !=NULL){
21315 if(isSgModuleSymbol(symbol)){
21325 if(isSgTemplateInstantiationDecl(node) !=NULL){
21330 if(isSgClassSymbol(symbol)){
21332 traverseMemoryPoolVisitorPattern(visitor);
21333 if(visitor.get_num_Class_pointers()==1){
21352 printf(
"SgTemplateArg in normal traversal\n");
21354 printf(
"SgTemplateInstantiationDecl in normal traversal\n");
21357 traverseMemoryPoolVisitorPattern(visitor);
21367 printf (
"After delete node: node = %p = %s \n",node,node->
class_name().c_str());
21373 DeleteAST deleteTree;
21376 deleteTree.traverse(n,postorder);
21379 printf (
"Leaving SageInterface::deleteAST(): n = %p = %s \n",n,n->
class_name().c_str());
21406 virtual void visit(
SgNode* n)
21409 if (expression != NULL)
21411 Visitor().traverse(expression->get_originalExpressionTree(), postorder);
21418 Visitor().traverse(root, postorder);
21430 SgSymbol* symbol = s_table->find(iname);
21431 ASSERT_not_null(symbol);
21436 ASSERT_not_null(sourceBlock);
21437 ASSERT_not_null(targetBlock);
21452 SgSymbol* symbol = s_table->find(iname);
21453 ASSERT_not_null(symbol);
21460 ASSERT_not_null(symbol);
21471 ASSERT_require(stmt->
get_parent() == targetBlock);
21486 func->set_scope(targetBlock);
21489 SgFunctionDeclaration* nondef_decl= isSgFunctionDeclaration(func->get_firstNondefiningDeclaration());
21490 if (func != nondef_decl)
21492 ASSERT_not_null(nondef_decl);
21499 else if (
auto labelStmt = isSgLabelStatement(stmt))
21501 if (labelStmt->get_scope() == sourceBlock) {
21502 labelStmt->set_scope(targetBlock);
21507 else if (isSgJovialTableStatement(stmt) || isSgTypedefDeclaration(stmt) || isSgEnumDeclaration(stmt))
21515 mlog[Rose::Diagnostics::WARN] <<
"test failing stmt->get_scope() == targetBlock in SageInterface::moveStatementsBetweenBlocks(): class: "
21522 if (declaration !=
nullptr)
21529 case V_SgVariableDeclaration:
21534 for (SgInitializedNamePtrList::iterator ii = l.begin(); ii != l.end(); ii++)
21544 SgType* var_type = init_name->get_type();
21547 var_type = mod_type->get_base_type();
21554 if (isSgEnumType(var_type))
21556 SgEnumType* enum_type = isSgEnumType(var_type);
21571 enumerator->set_scope(targetBlock);
21575 else if (isSgJovialTableType(var_type))
21591 SgVariableSymbol* var_sym = isSgVariableSymbol(init_name -> search_for_symbol_from_symbol_table ()) ;
21592 ASSERT_not_null(var_sym);
21595 if (old_scope != sourceBlock)
21597 old_scope->remove_symbol (var_sym);
21598 sourceBlock ->
insert_symbol(init_name->get_name(), var_sym);
21601 init_name->set_scope(targetBlock);
21602 initname_vec.push_back(init_name);
21606 case V_SgFunctionDeclaration:
21609 ASSERT_not_null(funcDecl);
21616 if (old_scope != sourceBlock)
21618 old_scope->remove_symbol (func_sym);
21626 case V_SgProgramHeaderStatement:
21627 case V_SgProcedureHeaderStatement:
21628 case V_SgClassDeclaration:
21629 case V_SgEnumDeclaration:
21632 ASSERT_not_null(nondef_decl);
21646 if (
auto proc = isSgProcedureHeaderStatement(nondef_decl)) {
21647 for (
auto arg : proc->get_parameterList()->get_args()) {
21648 if (arg->get_scope() != proc->get_scope()) {
21652 arg->set_scope(proc->get_scope());
21664 name->set_scope(targetBlock);
21669 case V_SgJovialTableStatement:
21673 ROSE_ASSERT (table);
21682 case V_SgTypedefDeclaration:
21686 ASSERT_not_null(typedef_decl);
21691 case V_SgAttributeSpecificationStatement:
21692 case V_SgEmptyDeclaration:
21693 case V_SgFortranIncludeLine:
21694 case V_SgImplicitStatement:
21695 case V_SgJovialDefineDeclaration:
21696 case V_SgJovialDirectiveStatement:
21697 case V_SgJovialLabelDeclaration:
21698 case V_SgJovialOverlayDeclaration:
21699 case V_SgPragmaDeclaration:
21700 case V_SgAdaAttributeClause:
21704 printf (
"Moving this declaration = %p = %s = %s between blocks is not yet supported \n",declaration,declaration->
class_name().c_str(),
SageInterface::get_name(declaration).c_str());
21713template <
class T1,
class T2>
21714void moveDeclarationsBetweenScopes( T1* sourceBlock, T2* targetBlock)
21718 ROSE_ASSERT (sourceBlock && targetBlock);
21719 ROSE_ASSERT (sourceBlock->containsOnlyDeclarations() && targetBlock->containsOnlyDeclarations());
21720 if ((
void*)sourceBlock == (
void*)targetBlock)
21722 cerr<<
"warning: SageInterface::moveStatementsBetweenScopes() is skipped, "<<endl;
21723 cerr<<
" since program is trying to move statements from and to the identical scoped block. "<<endl;
21727 SgDeclarationStatementPtrList& srcStmts = sourceBlock->get_declarations ();
21728 std::vector <SgInitializedName*> initname_vec;
21730 for (
auto stmt : srcStmts)
21732 moveOneStatement(sourceBlock, targetBlock, stmt, initname_vec);
21737 ROSE_ASSERT(srcStmts.empty() ==
true);
21738 ROSE_ASSERT(sourceBlock->get_declarations().empty() ==
true);
21741 moveSymbolTableBetweenBlocks(sourceBlock, targetBlock, initname_vec);
21754template <
class T1,
class T2>
21755void moveStatementsBetweenScopes( T1* sourceBlock, T2* targetBlock)
21758 ROSE_ASSERT (sourceBlock && targetBlock);
21759 if ((
void*)sourceBlock == (
void*)targetBlock)
21761 cerr<<
"warning: SageInterface::moveStatementsBetweenScopes() is skipped, "<<endl;
21762 cerr<<
" since program is trying to move statements from and to the identical scoped block. "<<endl;
21766 SgStatementPtrList & srcStmts = sourceBlock->get_statements();
21767 std::vector <SgInitializedName*> initname_vec;
21771 moveOneStatement(sourceBlock, targetBlock, stmt, initname_vec);
21776 ROSE_ASSERT(srcStmts.empty() ==
true);
21777 ROSE_ASSERT(sourceBlock->get_statements().empty() ==
true);
21780 moveSymbolTableBetweenBlocks(sourceBlock, targetBlock, initname_vec);
21794 ASSERT_not_null(decl);
21798 ASSERT_require(local_def && global_def && (local_def!=global_def));
21800 for (
auto symbol : local_def->get_symbol_table()->get_symbols())
21802 SgSymbol *orig_sym = isSgSymbol(symbol);
21803 ASSERT_not_null(orig_sym);
21812 moveDeclarationsBetweenScopes(sourceBlock, targetBlock);
21814 createAliasSymbols(isSgNamespaceDeclarationStatement(targetBlock->
get_parent()));
21819 moveStatementsBetweenScopes(sourceBlock, targetBlock);
21821 createAliasSymbols(isSgNamespaceDeclarationStatement(targetBlock->
get_parent()));
21826 moveDeclarationsBetweenScopes(sourceBlock, targetBlock);
21832 moveStatementsBetweenScopes (sourceBlock, targetBlock);
21840 ROSE_ASSERT (func != NULL);
21842 ROSE_ASSERT (p != NULL);
21844 if (le && le->get_lambda_function() == func)
21857 #pragma message ("WARNING: MSVC does not handle isLambdaCapturedVariable() properly.")
21859 ROSE_ASSERT (varRef!= NULL);
21863 SgThisExp* te = isSgThisExp(p->get_lhs_operand_i());
21867 ROSE_ASSERT (csym!= NULL);
21870 ROSE_ASSERT (xdecl != NULL);
21874 if (le->get_lambda_closure_class() == xdecl )
21890 ROSE_ASSERT(current != NULL);
21892 if (isSgInitializedName(current))
21894 name = isSgInitializedName(current);
21896 else if (isSgPntrArrRefExp(current) != NULL)
21900 ROSE_ASSERT(exp != NULL);
21902 ROSE_ASSERT(suc ==
true);
21906 else if (isSgVarRefExp(current) != NULL)
21912 if (isSgDotExp(parent))
21914 if (isSgDotExp(parent)->get_rhs_operand() == current)
21920 if (isSgArrowExp(parent)->get_rhs_operand() == current)
21924 name = isSgVarRefExp(current)->get_symbol()->get_declaration();
21926 else if (isSgFunctionRefExp(current) != NULL ||
21927 isSgTemplateFunctionRefExp(current) != NULL ||
21928 isSgMemberFunctionRefExp(current) != NULL ||
21929 isSgTemplateMemberFunctionRefExp(current) != NULL)
21934 else if (isSgNonrealRefExp(current) != NULL)
21939 else if (isSgDotExp(current))
21946 ROSE_ASSERT(child);
21950 else if (isSgArrowExp(current))
21971 ROSE_ASSERT(child);
21976 else if (isSgThisExp(current))
21981 else if (isSgPointerDerefExp(current))
21985 else if(isSgUnaryOp(current)) {
21988 else if (isSgCastExp(current))
21994 else if (isSgAddOp(current))
21999 else if (isSgSubtractOp(current))
22010 else if (isSgIntVal(current))
22020 if (!isSgConstructorInitializer(current))
22022 mlog[Sawyer::Message::Common::WARN] <<
22023 "convertRefToInitializedName: " <<
22026 cerr<<
"In SageInterface::convertRefToInitializedName(): unhandled reference type:"<<current->
class_name()<<endl;
22037#ifdef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22038 printf (
"AbstractHandle support is disabled for ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT \n");
22044 size_t pos = input_string.find(
"SourceFile<");
22045 ROSE_ASSERT (pos != string::npos);
22046 string trimed_string = input_string.substr(pos);
22050 if (handle->getNode()!=NULL)
22055#pragma message ("WARNING: covariant return type for get_node() not supported in MSVC.")
22056 printf (
"ERROR: covariant return type for get_node() not supported in MSVC. \n");
22079 ROSE_ASSERT(node != NULL);
22082 cout<<
"///////////// begin of SageInterface::dumpInfo() ///////////////"<<endl;
22083 cout<<
"--------------base info. for SgNode---------------"<<endl;
22089 cout<<
"--------------source location info. for SgNode---------------"<<endl;
22097 cout<<
"--------------preprocessing info. for SgNode---------------"<<endl;
22098 AttachedPreprocessingInfoType::iterator i;
22099 cout<<
"Total attached preprocessingInfo count="<<comments->size()<<endl;
22100 for (i = comments->begin (); i != comments->end (); i++)
22103 pinfo->display(
"");
22106 cout<<
"--------------name info. for SgNode---------------"<<endl;
22110 cout<<
"\tqualified name="<<decl->get_qualified_name().getString()<<endl;
22113 cout<<
"\treferenced variable name= "<<varRef->get_symbol()->
get_name().getString()<<endl;
22120 cout<<
"///////////// end of SageInterface::dumpInfo() ///////////////"<<endl;
22131 bool retVal =
true;
22133 ROSE_ASSERT(stmt !=NULL);
22135#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22142 if (funcDecl != NULL)
22145 if (funcDecl == NULL)
22147 cerr<<
"In collectReadWriteRefs(): cannot proceed without a function body!"<<endl;
22150 stmt = funcDecl->get_definition()->
get_body();
22158 ROSE_ASSERT(funcDef != NULL);
22160 ROSE_ASSERT(funcBody!= NULL);
22163 AstInterfaceImpl faImpl(funcBody);
22164 AstInterface fa(&faImpl);
22165 ArrayAnnotation* annot = ArrayAnnotation::get_inst();
22166 if( useCachedDefUse ){
22167 ArrayInterface* array_interface = ArrayInterface::get_inst(*annot, fa, funcDef, AstNodePtrImpl(funcDef));
22168 LoopTransformInterface::set_arrayInfo(array_interface);
22170 ArrayInterface array_interface(*annot);
22173 array_interface.observe(fa);
22174 LoopTransformInterface::set_arrayInfo(&array_interface);
22176 LoopTransformInterface::set_astInterface(fa);
22178 LoopTransformInterface::set_sideEffectInfo(annot);
22181 DoublyLinkedListWrap<AstNodePtr> rRef1, wRef1;
22182 CollectDoublyLinkedList<AstNodePtr> crRef1(rRef1),cwRef1(wRef1);
22183 AstNodePtr s1 = AstNodePtrImpl(stmt);
22186 if (!AnalyzeStmtRefs(fa, s1, cwRef1, crRef1))
22191 mlog[Sawyer::Message::Common::DEBUG] <<
"Function: " << funcDef->get_declaration()->get_qualified_name() <<
" calls at least one function that has not been annotated." << endl;
22196 for (DoublyLinkedEntryWrap<AstNodePtr>* p = rRef1.First(); p != 0; )
22198 DoublyLinkedEntryWrap<AstNodePtr>* p1 = p;
22200 AstNodePtr cur = p1->GetEntry();
22201 SgNode* sgRef = AstNodePtrImpl(cur).get_ptr();
22202 ROSE_ASSERT(sgRef != NULL);
22203 readRefs.push_back(sgRef);
22208 for (DoublyLinkedEntryWrap<AstNodePtr>* p = wRef1.First(); p != 0; )
22210 DoublyLinkedEntryWrap<AstNodePtr>* p1 = p;
22212 AstNodePtr cur = p1->GetEntry();
22213 SgNode* sgRef = AstNodePtrImpl(cur).get_ptr();
22214 ROSE_ASSERT(sgRef != NULL);
22215 writeRefs.push_back(sgRef);
22228static bool skipSomeRefs(
SgNode* n)
22231 return (isSgThisExp(n)||isSgArrowExp(n)||isSgDotExp(n));
22237 ROSE_ASSERT(stmt != NULL);
22238 vector <SgNode* > readRefs, writeRefs;
22242 vector<SgNode*>::iterator iter = readRefs.begin();
22243 for (; iter!=readRefs.end();iter++)
22245 SgNode* current = *iter;
22248 ROSE_ASSERT (current != NULL);
22251 if (!name)
continue;
22254 readVars.insert(name);
22257 vector<SgNode*>::iterator iterw = writeRefs.begin();
22258 for (; iterw!=writeRefs.end();iterw++)
22260 SgNode* current = *iterw;
22261 ROSE_ASSERT (current != NULL);
22263 if (!name)
continue;
22267 writeVars.insert(name);
22275 ROSE_ASSERT(stmt != NULL);
22276 set<SgInitializedName*> readVars, writeVars;
22281 set_difference(readVars.begin(), readVars.end(),
22282 writeVars.begin(), writeVars.end(),
22283 std::inserter(readOnlyVars, readOnlyVars.begin()));
22293 readOnlyVars.insert (v_ref->get_symbol()->get_declaration());
22303 set<SgInitializedName*> temp;
22306 for (set<SgInitializedName*>::const_iterator iter = temp.begin();
22307 iter!=temp.end(); iter++)
22309 SgSymbol* symbol = (*iter)->get_symbol_from_symbol_table () ;
22310 ROSE_ASSERT(symbol != NULL );
22311 ROSE_ASSERT(isSgVariableSymbol(symbol));
22312 readOnlySymbols.insert(isSgVariableSymbol(symbol));
22320 bool result =
false;
22321 ROSE_ASSERT(ref != NULL);
22333 ROSE_ASSERT(grandparent);
22334 if (isSgFunctionCallExp(grandparent))
22340 size_t param_index = 0;
22342 SgExpressionPtrList expList = isSgExprListExp(ref->
get_parent())->get_expressions();
22343 Rose_STL_Container<SgExpression*>::const_iterator iter= expList.begin();
22344 for (; iter!=expList.end(); iter++)
22352 SgExpression* func_exp = isSgFunctionCallExp(grandparent)->get_function();
22353 ROSE_ASSERT (func_exp);
22358 SgInitializedNamePtrList nameList = funcDecl->get_args();
22363 if (param_index >= nameList.size() ||isSgTypeEllipse(nameList[param_index]->get_type()) )
22365 if (isSgReferenceType(ref))
22369 if (isSgReferenceType(nameList[param_index]->get_type()))
22374 else if (isSgDotExp (func_exp) || isSgArrowExp(func_exp))
22377 ROSE_ASSERT (binOp);
22379 ROSE_ASSERT (mfuncRef);
22381 ROSE_ASSERT (mfuncDecl);
22382 SgInitializedNamePtrList nameList = mfuncDecl->get_args();
22384 if (isSgReferenceType(nameList[param_index]->get_type()))
22399 Rose_STL_Container <SgNode*> var_refs = NodeQuery::querySubTree (
const_cast<SgStatement *
> (s), V_SgVarRefExp);
22401 Rose_STL_Container<SgNode*>::iterator iter = var_refs.begin();
22402 for (; iter!=var_refs.end(); iter++)
22405 ROSE_ASSERT(ref != NULL);
22412 varSetB.insert(ref);
22418 ROSE_ASSERT(grandparent);
22419 if (isSgFunctionCallExp(grandparent))
22422 int param_index =0;
22423 SgExpressionPtrList expList = isSgExprListExp(ref->
get_parent())->get_expressions();
22424 Rose_STL_Container<SgExpression*>::const_iterator iter= expList.begin();
22425 for (; iter!=expList.end(); iter++)
22433 SgFunctionRefExp * funcRef = isSgFunctionRefExp(isSgFunctionCallExp(grandparent)->get_function());
22435 SgInitializedNamePtrList nameList = funcDecl->get_args();
22437 if (isSgReferenceType(nameList[param_index]->get_type()))
22439 varSetB.insert(ref);
22445 varSetB.insert(ref);
22449#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22454 static LivenessAnalysis* liv = NULL;
22458 static DFAnalysis * defuse = NULL;
22462 ROSE_ASSERT(project != NULL);
22463 defuse =
new DefUseAnalysis(project);
22466 ROSE_ASSERT(defuse != NULL);
22467 defuse->run(debug);
22470 defuse->dfaToDOT();
22473 liv =
new LivenessAnalysis(debug,(DefUseAnalysis*)defuse);
22474 ROSE_ASSERT(liv != NULL);
22476 std::vector <FilteredCFGNode < IsDFAFilter > > dfaFunctions;
22477 NodeQuerySynthesizedAttributeType vars =
22478 NodeQuery::querySubTree(project, V_SgFunctionDefinition);
22479 NodeQuerySynthesizedAttributeType::const_iterator i;
22480 bool abortme=
false;
22482 for (i= vars.begin(); i!=vars.end();++i)
22485 ROSE_ASSERT(func != NULL);
22489 string funcName = func->get_declaration()->get_qualified_name().str();
22490 cout<<
" .. running liveness analysis for function: " << funcName << endl;
22492 FilteredCFGNode <IsDFAFilter> rem_source = liv->run(func,abortme);
22494 liv->fixupStatementsINOUT(func);
22495 if (rem_source.getNode()!=NULL)
22496 dfaFunctions.push_back(rem_source);
22502 cout <<
"Writing out liveness analysis results into var.dot... " << endl;
22503 std::ofstream f2(
"var.dot");
22504 dfaToDot(f2,
string(
"var"), dfaFunctions, (DefUseAnalysis*)defuse, liv);
22508 cerr<<
"Error: Liveness analysis is ABORTING ." << endl;
22516#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22520 ROSE_ASSERT(liv != NULL);
22521 ROSE_ASSERT(loop != NULL);
22523 std::vector<SgInitializedName*> liveIns0, liveOuts0;
22533 CFGNode cfgnode(forstmt,2);
22534 FilteredCFGNode<IsDFAFilter> filternode= FilteredCFGNode<IsDFAFilter> (cfgnode);
22538 ROSE_ASSERT(filternode.getNode()==forstmt);
22541 vector<FilteredCFGEdge < IsDFAFilter > > out_edges = filternode.outEdges();
22542 ROSE_ASSERT(out_edges.size()==2);
22543 vector<FilteredCFGEdge < IsDFAFilter > >::iterator iter= out_edges.begin();
22545 for (; iter!=out_edges.end();iter++)
22547 FilteredCFGEdge < IsDFAFilter > edge= *iter;
22551 if (edge.condition()==eckTrue)
22553 SgNode* firstnode= edge.target().getNode();
22554 liveIns0 = liv->getIn(firstnode);
22556 for (std::vector<SgInitializedName*>::iterator iter = liveIns0.begin();
22557 iter!=liveIns0.end(); iter++)
22560 liveIns.insert(*iter);
22565 else if (edge.condition()==eckFalse)
22567 SgNode* firstnode= edge.target().getNode();
22568 liveOuts0 = liv->getIn(firstnode);
22570 for (std::vector<SgInitializedName*>::iterator iter = liveOuts0.begin();
22571 iter!=liveOuts0.end(); iter++)
22575 liveOuts.insert(*iter);
22580 cerr<<
"Unexpected CFG out edge type for SgForStmt!"<<endl;
22589static bool isAssignReduction (
SgVarRefExp* ref_exp1,
SgVarRefExp* ref_exp2, OmpSupport::omp_construct_enum& optype)
22591 bool isReduction =
false;
22593 ROSE_ASSERT (ref_exp1!= NULL);
22594 ROSE_ASSERT (ref_exp2!= NULL);
22595 ROSE_ASSERT (ref_exp1-> get_symbol() == ref_exp2-> get_symbol());
22601 if (stmt != stmt2)
return false;
22608 if (exp_stmt && isSgAssignOp(exp_stmt->get_expression()))
22611 assign_lhs = isSgAssignOp(exp_stmt->get_expression())->
get_lhs_operand();
22612 assign_rhs = isSgAssignOp(exp_stmt->get_expression())->
get_rhs_operand();
22613 ROSE_ASSERT(assign_lhs && assign_rhs);
22621 SgBinaryOp * binop = isSgBinaryOp(assign_rhs);
22627 if( !((op_lhs==ref_exp1)||(op_lhs==ref_exp2))
22628 && !((op_rhs==ref_exp1)||(op_rhs==ref_exp2)))
22631 bool isOnLeft =
false;
22632 if ((op_lhs==ref_exp1)||
22633 (op_lhs==ref_exp2))
22639 optype = OmpSupport::e_reduction_plus;
22640 isReduction =
true;
22643 case V_SgMultiplyOp:
22645 optype = OmpSupport::e_reduction_mul;
22646 isReduction =
true;
22649 case V_SgSubtractOp:
22651 optype = OmpSupport::e_reduction_minus;
22654 isReduction =
true;
22660 optype = OmpSupport::e_reduction_bitand ;
22661 isReduction =
true;
22666 optype = OmpSupport::e_reduction_bitxor;
22667 isReduction =
true;
22672 optype = OmpSupport::e_reduction_bitor;
22673 isReduction =
true;
22678 optype = OmpSupport::e_reduction_logand;
22679 isReduction =
true;
22684 optype = OmpSupport::e_reduction_logor;
22685 isReduction =
true;
22694 return isReduction;
22703 bool matchStmt1 =
false;
22704 bool matchStmt2 =
false;
22711 ROSE_ASSERT (ref1 != NULL);
22712 ROSE_ASSERT (ref2 != NULL);
22713 ROSE_ASSERT (ref1-> get_symbol() == ref2-> get_symbol());
22721 if (stmt1 == stmt2)
return false;
22744 bool matchBody =
false;
22745 bool matchCondition=
false;
22746 if (
SgIfStmt * if_stmt = isSgIfStmt (if_cond_stmt->get_parent()) )
22748 if (
SgStatement* body = if_stmt->get_true_body())
22753 ROSE_ASSERT(stmt2 != NULL);
22754 if ( ((block->get_statements()).size() == 1) && stmt2->
get_scope() == block )
22765 if (
SgExprStatement* cond_exp_stmt = isSgExprStatement (if_stmt->get_conditional()) )
22767 SgExpression* cond_exp = cond_exp_stmt->get_expression();
22768 if (
SgBinaryOp * binop = isSgBinaryOp (cond_exp))
22773 if (isSgLessThanOp (binop))
22775 optype = OmpSupport::e_reduction_max;
22776 matchCondition=
true;
22778 else if (isSgGreaterThanOp(binop))
22780 optype = OmpSupport::e_reduction_min;
22781 matchCondition=
true;
22787 if (isSgLessThanOp (binop))
22789 optype = OmpSupport::e_reduction_min;
22790 matchCondition=
true;
22792 else if (isSgGreaterThanOp(binop))
22794 optype = OmpSupport::e_reduction_max;
22795 matchCondition=
true;
22802 matchStmt1 = matchBody && matchCondition;
22806 return (matchStmt2 && matchStmt1);
22813static bool isSingleAppearanceReduction(
SgVarRefExp* ref1, OmpSupport::omp_construct_enum& optype )
22815 bool isReduction =
false;
22817 ROSE_ASSERT (ref1 != NULL);
22823 if (isSgExprStatement(stmt))
22825 SgExpression* exp = isSgExprStatement(stmt)->get_expression();
22827 if (isSgPlusPlusOp(exp))
22830 optype = OmpSupport::e_reduction_plus;
22831 isReduction =
true;
22833 else if (isSgMinusMinusOp(exp))
22835 optype = OmpSupport::e_reduction_minus;
22836 isReduction =
true;
22847 case V_SgPlusAssignOp:
22849 optype = OmpSupport::e_reduction_plus;
22850 isReduction =
true;
22853 case V_SgMultAssignOp:
22855 optype = OmpSupport::e_reduction_mul;
22856 isReduction =
true;
22859 case V_SgMinusAssignOp:
22861 optype = OmpSupport::e_reduction_minus;
22862 isReduction =
true;
22865 case V_SgAndAssignOp:
22867 optype = OmpSupport::e_reduction_bitand;
22868 isReduction =
true;
22871 case V_SgXorAssignOp:
22873 optype = OmpSupport::e_reduction_bitxor;
22874 isReduction =
true;
22877 case V_SgIorAssignOp:
22879 optype = OmpSupport::e_reduction_bitor;
22880 isReduction =
true;
22889 return isReduction;
22921 std::set<SgInitializedName*> candidateVars;
22923 std::map <SgInitializedName*, vector<SgVarRefExp* > > var_references;
22925 Rose_STL_Container<SgNode*> reflist = NodeQuery::querySubTree(loop, V_SgVarRefExp);
22927 ROSE_ASSERT(lbody != NULL);
22928 Rose_STL_Container<SgNode*>::iterator iter = reflist.begin();
22929 for (; iter!=reflist.end(); iter++)
22938 ROSE_ASSERT(var_scope != NULL);
22939 if ((
isScalarType(initname->get_type())) &&(initname !=loopindex)
22942 candidateVars.insert(initname);
22943 var_references[initname].push_back(ref_exp);
22948 std::set<SgInitializedName*>::iterator niter=candidateVars.begin();
22949 for (; niter!=candidateVars.end(); niter++)
22952 bool isReduction =
false;
22953 OmpSupport::omp_construct_enum optype;
22955 if (var_references[initname].size()==1)
22957 mlog[Sawyer::Message::Common::DEBUG] <<
"Debug: SageInterface::ReductionRecognition() A candidate used once:"<<initname->get_name().getString()<<endl;
22958 SgVarRefExp* ref_exp = *(var_references[initname].begin());
22959 if (isSingleAppearanceReduction (ref_exp, optype))
22960 isReduction =
true;
22963 else if (var_references[initname].size()==2)
22965 mlog[Sawyer::Message::Common::DEBUG] <<
"Debug: A candidate used twice:"<<initname->get_name().getString()<<endl;
22966 SgVarRefExp* ref_exp1 = *(var_references[initname].begin());
22967 SgVarRefExp* ref_exp2 = *(++var_references[initname].begin());
22970 if (isAssignReduction (ref_exp1, ref_exp2, optype) || isIfReduction (ref_exp1, ref_exp2, optype) )
22972 isReduction =
true;
22978 results.insert(make_pair(initname,optype));
22985 ROSE_ASSERT(r!=NULL);
22986#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22987 ConstantFolding::constantFoldingOptimization(r,
false);
22997 virtual void visit (
SgNode * n)
23004 ROSE_ASSERT (name_attribute != NULL);
23012 exampleTraversal.
traverse(project, preorder);
23044 const SgInitializedNamePtrList& orig_decls = params.
get_args();
23046 std::transform( orig_decls.begin(), orig_decls.end(), sg::sage_inserter(copy), sg::InitNameCloner(copy, fundef) );
23060 sg::swap_child(ll, rr, &SgFunctionDeclaration::get_definition, &SgFunctionDeclaration::set_definition);
23061 sg::swap_child(ll, rr, &SgFunctionDeclaration::get_parameterList, &SgFunctionDeclaration::set_parameterList);
23071 std::pair<SgStatement*, SgInitializedName*>
23085 SgType* result_type = definingDeclaration.get_type()->get_return_type();
23090 SgFunctionDeclaration* wrapperfn = SB::buildDefiningFunctionDeclaration(newName, result_type, ¶m_list, containing_scope);
23093 ROSE_ASSERT(wrapperdef);
23096 wrapperfn->set_exceptionSpecification(definingDeclaration.get_exceptionSpecification());
23100 swapDefiningElements(definingDeclaration, *wrapperfn);
23105 SgInitializedNamePtrList& param_decls = param_list.
get_args();
23107 std::transform( param_decls.begin(), param_decls.end(), sg::sage_inserter(*args), sg::VarRefBuilder(*wrapperdef) );
23109 SgFunctionCallExp* callWrapped = SB::buildFunctionCallExp( newName, result_type, args, body );
23114 if (!isSgTypeVoid(result_type))
23117 SgVariableDeclaration* res = SB::buildVariableDeclaration(
"res", result_type, SB::buildAssignInitializer(callWrapped), body );
23124 callStatement = res;
23131 callStatement = SB::buildExprStatement(callWrapped);
23135 ROSE_ASSERT(callStatement);
23139 SgFunctionDeclaration* wrapperfn_proto = SB::buildNondefiningFunctionDeclaration(wrapperfn, containing_scope, decorator_proto);
23145 return std::make_pair(callStatement, resultName);
23153 struct VarrefBuilder
23172 template <
class AstNode>
23173 struct VarrefCreator : VarrefBuilder
23178 VarrefCreator(AstNode& orig)
23182 SgVarRefExp*
get()
const {
return VarrefBuilder::build(origin); }
23185 template <
class AstNode>
23186 VarrefCreator<AstNode>
23187 varrefCreator(AstNode& n)
23189 return VarrefCreator<AstNode>(n);
23199 return SB::buildMultiplyOp(lhs, SI::deepCopy(rhs));
23202 std::pair<std::vector<SgExpression*>,
SgType*>
23203 get_C_array_dimensions_aux(
const SgArrayType& arr_type)
23209 std::vector<SgExpression*> indices;
23210 SgType* undertype = NULL;
23214 if (arrtype->get_index() == NULL)
23216 indices.push_back(SB::buildNullExpression());
23217 undertype = arrtype->get_base_type();
23218 arrtype = isSgArrayType(undertype);
23224 ROSE_ASSERT(indexexpr);
23226 indices.push_back(SI::deepCopy(indexexpr));
23227 undertype = arrtype->get_base_type();
23228 arrtype = isSgArrayType(undertype);
23231 ROSE_ASSERT((!indices.empty()) && undertype);
23232 return std::make_pair(indices, undertype);
23236 std::vector<SgExpression*>
23237 get_C_array_dimensions_aux(
const SgArrayType& arrtype,
const VarrefBuilder& varrefBuilder)
23241 std::pair<std::vector<SgExpression*>,
SgType*> res = get_C_array_dimensions_aux(arrtype);
23242 const std::vector<SgExpression*>::iterator first = res.first.begin();
23245 if (isSgNullExpression(*first))
23253 const std::vector<SgExpression*>::iterator aa = first+1;
23254 const std::vector<SgExpression*>::iterator zz = res.first.end();
23256 SgExpression* sz_undertype = SB::buildSizeOfOp(res.second);
23257 SgExpression* denominator = std::accumulate(aa, zz, sz_undertype, create_mulop);
23258 SgSizeOfOp* sz_var = SB::buildSizeOfOp(varrefBuilder.get());
23259 SgExpression* sz = SB::buildDivideOp(sz_var, denominator);
23261 std::swap(*first, sz);
23269 std::vector<SgExpression*>
23272 return get_C_array_dimensions_aux(arrtype).first;
23275 std::vector<SgExpression*>
23278 return get_C_array_dimensions_aux(arrtype, varrefCreator(varref));
23281 std::vector<SgExpression*>
23284 return get_C_array_dimensions_aux(arrtype, varrefCreator(initname));
23291 set<unsigned int> sourceSequenceSet;
23293 void visit (
SgNode* astNode );
23301 if (fileInfo != NULL)
23303 unsigned int source_sequence_number = fileInfo->get_source_sequence_number();
23305 printf (
"In CollectSourceSequenceNumbers::visit(): source_sequence_number = %" PRIuPTR
" \n",source_sequence_number);
23307 sourceSequenceSet.insert(source_sequence_number);
23317 traversal.
traverse(astNode,preorder);
23319 return traversal.sourceSequenceSet;
23406#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
23408 if (collapsing_factor <= 1)
23421 ROSE_ASSERT (global_scope != NULL);
23430 bool *isPlus =
new bool[collapsing_factor];
23434 std::vector<SgForStatement* > loops= SageInterface::querySubTree<SgForStatement>(target_loop,V_SgForStatement);
23435 ROSE_ASSERT(loops.size()>=collapsing_factor);
23451 ROSE_ASSERT(
getScope(target_loop)->get_parent()!= NULL);
23455 while(scope == NULL)
23457 parent = isSgStatement(parent->
get_parent());
23458 scope = isSgScopeStatement(parent);
23462 if (insert_target != NULL)
23467 ROSE_ASSERT(scope != NULL);
23470 for(
size_t i = 0; i < collapsing_factor; i ++)
23472 temp_target_loop = loops[i];
23477 if (!
isCanonicalForLoop(temp_target_loop, &ivar[i], &lb[i], &ub[i], &step[i], &orig_body[i], &isPlus[i]))
23479 cerr<<
"Error in SageInterface::loopCollapsing(): target loop is not canonical."<<endl;
23487 delete[] orig_body;
23488 delete[] total_iters;
23495 ROSE_ASSERT(ivar[i]&& lb[i] && ub[i] && step[i]);
23499 if(isPlus[i] ==
true)
23513 string iter_var_name=
"_total_iters";
23534 new_var_list->append_expression(isSgVarRefExp(ub_exp));
23537 for(
unsigned int i = 0; i < collapsing_factor; i++)
23540 for(
unsigned int j = collapsing_factor - 1; j > i; j--)
23549 new_var_list->append_expression(isSgVarRefExp(interval[i]));
23559 ROSE_ASSERT(insert_target != NULL);
23564 new_var_list->append_expression(clps_index_ref);
23570 ROSE_ASSERT(body != NULL);
23573 std::vector<SgStatement*> new_stmt_list;
23584 for(
unsigned int i = 0; i < collapsing_factor - 1; i ++)
23586 if(isPlus[i] ==
true)
23592 new_stmt_list.push_back(assign_stmt);
23595 if(i != collapsing_factor - 2){
23596 string remain_var_name=
"_remainder";
23597 remain_var_name =
"__"+ ivar[i]->get_name().getString() + remain_var_name;
23600 new_stmt_list.push_back(loop_index_decl);
23606 if(isPlus[collapsing_factor - 1] ==
true)
23610 new_stmt_list.push_back(assign_stmt);
23622 ROSE_ASSERT(cond_stmt != NULL);
23629 target_loop = new_loop;
23631 ConstantFolding::constantFoldingOptimization(scope->
get_parent(),
false);
23637 delete [] orig_body;
23638 delete [] total_iters;
23639 delete [] interval;
23644 return new_var_list;
23663 RoseAst ast_of_original(tree2);
23672 while (i_copy != ast_of_copy.
end())
23675 printf (
"*i_copy = %p = %s \n",*i_copy,(*i_copy)->class_name().c_str());
23676 printf (
"*i_original = %p = %s \n",*i_original,(*i_original)->class_name().c_str());
23680 if ((*i_copy)->variantT() != (*i_original)->variantT())
23683 printf (
"ERROR: return from SageInterface::isStructurallyEquivalentAST(): (*i_copy)->variantT() != (*i_original)->variantT() \n");
23686 printf (
"Making this an error! \n");
23696 ROSE_ASSERT(i_original != ast_of_original.
end());
23701 ROSE_ASSERT(i_copy == ast_of_copy.
end() && i_original == ast_of_original.
end());
23721 lower_bound = NULL;
23722 upper_bound = NULL;
23726 const std::vector<SgStatement *> & init_stmts = for_init_stmt->
get_init_stmt();
23727 assert(init_stmts.size() == 1);
23729 assert(init_stmt != NULL);
23732 SgAssignOp * assign_init = isSgAssignOp(init);
23733 assert(assign_init != NULL);
23735 assert(iterator_init_ref != NULL);
23736 iterator = iterator_init_ref->get_symbol();
23737 assert(iterator != NULL);
23740 SgExprStatement * test_stmt = isSgExprStatement(for_loop->get_test());
23741 assert(test_stmt != NULL);
23747 while (isSgCastExp(lhs_exp)) lhs_exp = ((
SgCastExp *)lhs_exp)->get_operand_i();
23748 SgVarRefExp * lhs_var_ref = isSgVarRefExp(lhs_exp);
23749 bool lhs_it = (lhs_var_ref != NULL) && (lhs_var_ref->get_symbol() == iterator);
23752 while (isSgCastExp(rhs_exp)) rhs_exp = ((
SgCastExp *)rhs_exp)->get_operand_i();
23753 SgVarRefExp * rhs_var_ref = isSgVarRefExp(rhs_exp);
23755 bool rhs_it = (rhs_var_ref != NULL) && (rhs_var_ref->get_symbol() == iterator);
23763 assert(lhs_it != rhs_it);
23772 case V_SgGreaterOrEqualOp:
23773 inclusive = lhs_it;
23776 case V_SgGreaterThanOp:
23777 inclusive = !lhs_it;
23780 case V_SgLessOrEqualOp:
23781 inclusive = lhs_it;
23782 reversed = !lhs_it;
23784 case V_SgLessThanOp:
23785 inclusive = !lhs_it;
23786 reversed = !lhs_it;
23788 case V_SgEqualityOp:
23789 case V_SgNotEqualOp:
23795 switch (increment->variantT()) {
23796 case V_SgPlusPlusOp:
23800 case V_SgMinusMinusOp:
23804 case V_SgPlusAssignOp:
23809 assert(var_ref_lhs != NULL && var_ref_lhs->get_symbol() == iterator);
23814 case V_SgMinusAssignOp:
23819 assert(var_ref_lhs != NULL && var_ref_lhs->get_symbol() == iterator);
23829 assert(inc_assign_lhs != NULL && inc_assign_lhs->get_symbol() == iterator);
23832 assert(inc_assign_rhs != NULL);
23834 if (inc_assign_rhs_lhs != NULL && inc_assign_rhs_lhs->get_symbol() == iterator)
23837 if (inc_assign_rhs_rhs != NULL && inc_assign_rhs_rhs->get_symbol() == iterator)
23858#ifdef ROSE_BUILD_JAVA_LANGUAGE_SUPPORT
23865 jstring temp_directory = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(::currentJavaTraversalClass, Rose::Frontend::Java::Ecj::getTempDirectoryMethod);
23867 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_directory, NULL);
23869 string directory_name = utf8;
23870 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_directory, utf8);
23872 list<string> sourcepath = project -> get_Java_sourcepath();
23873 sourcepath.push_back(directory_name);
23874 project -> set_Java_sourcepath(sourcepath);
23876 return directory_name;
23884 string command = string(
"rm -fr ") + directory_name;
23885 int status = system(command.c_str());
23886 ROSE_ASSERT(status == 0);
23897 project -> get_sourceFileNameList().push_back(filename);
23898 Rose_STL_Container<std::string> arg_list = project -> get_originalCommandLineArgumentList();
23899 arg_list.push_back(filename);
23902 int error_code = 0;
23903 SgFile *file = determineFileType(arg_list, error_code, project);
23905 ROSE_ASSERT(sourcefile);
23906 sourcefile -> set_parent(project);
23911 project -> get_fileList_ptr() -> get_listOfFiles().push_back(sourcefile);
23912 ROSE_ASSERT(sourcefile == isSgSourceFile((*project)[filename]));
23914 sourcefile -> build_Java_AST(arg_list, project -> get_originalCommandLineArgumentList());
23917 project -> get_fileList_ptr() -> get_listOfFiles().pop_back();
23918 ROSE_ASSERT(sourcefile != isSgSourceFile((*project)[filename]));
23922 ROSE_ASSERT(file->get_preprocessorDirectivesAndCommentsList() != NULL);
23933 string command =
"package " + package_name +
";";
23938 jstring temp_file = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
23939 Rose::Frontend::Java::Ecj::createTempFileMethod,
23940 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(command.c_str()));
23942 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_file, NULL);
23944 string filename = (string) utf8;
23945 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_file, utf8);
23949 return package_name;
23958 string command =
"import " + import_string +
";";
23963 jstring temp_file = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
23964 Rose::Frontend::Java::Ecj::createTempFileMethod,
23965 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(command.c_str()));
23967 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_file, NULL);
23969 string filename = (string) utf8;
23970 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_file, utf8);
23974 return import_string;
23986 jstring temp_file = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
23987 Rose::Frontend::Java::Ecj::createTempNamedFileMethod,
23988 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(file_name.c_str()),
23989 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(file_content.c_str()));
23991 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_file, NULL);
23993 string filename = (string) utf8;
23994 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_file, utf8);
24004 ROSE_ASSERT(scope);
24006 for (
int index = 0, length = package_name.size(); index < length; index++) {
24008 for (n = index; n < length; n++) {
24009 if (package_name[n] ==
'.') {
24013 string name = package_name.substr(index, n - index);
24015 SgClassSymbol *package_symbol = scope -> lookup_class_symbol(name);
24016 if (package_symbol == NULL) {
24020 SgJavaPackageDeclaration *package_declaration = isSgJavaPackageDeclaration(package_symbol -> get_declaration() -> get_definingDeclaration());
24021 ROSE_ASSERT(package_declaration);
24022 package_definition = package_declaration -> get_definition();
24023 ROSE_ASSERT(package_definition);
24024 scope = package_definition;
24029 return package_definition;
24037 SgGlobal *global_scope = project -> get_globalScopeAcrossFiles();
24039 if (package_definition == NULL) {
24045 if (create_directory) {
24046 Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
24047 Rose::Frontend::Java::Ecj::createTempNamedDirectoryMethod,
24048 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(package_name.c_str()));
24054 return package_definition;
24061 ROSE_ASSERT(package_definition);
24062 SgClassSymbol *class_symbol = package_definition -> lookup_class_symbol(class_name);
24065 : isSgClassDeclaration(class_symbol -> get_declaration() -> get_definingDeclaration()));
24066 if ((! class_declaration) || (! class_declaration -> attributeExists(
"complete"))) {
24067 string qualified_name = package_definition -> get_qualified_name().getString() +
"." + class_name;
24069 class_symbol = package_definition -> lookup_class_symbol(class_name);
24072 class_declaration = (class_symbol == NULL
24074 : isSgClassDeclaration(class_symbol -> get_declaration() -> get_definingDeclaration()));
24076 return class_declaration;
24092 SgClassDeclaration *class_declaration = isSgClassDeclaration(class_type -> get_declaration() -> get_definingDeclaration());
24093 ROSE_ASSERT(class_declaration);
24094 SgClassDefinition *scope = isSgClassDefinition(class_declaration -> get_scope());
24095 while (scope && (! isSgJavaPackageDeclaration(scope -> get_parent()))) {
24096 class_declaration = isSgClassDeclaration(scope -> get_parent());
24097 ROSE_ASSERT(class_declaration);
24098 scope = isSgClassDefinition(class_declaration -> get_scope());
24105 string class_name = class_declaration ->
get_name().getString();
24114 ROSE_ASSERT(class_definition);
24116 ROSE_ASSERT(type_list);
24118 ROSE_ASSERT(string_array_type);
24119 type_list -> append_argument(string_array_type);
24125 SgFunctionSymbol *method_symbol = class_definition -> lookup_function_symbol(
"main", member_function_type);
24127 return (method_symbol == NULL ? NULL : isSgMemberFunctionDeclaration(method_symbol -> get_declaration()));
24135 SgClassDeclaration *class_declaration = isSgClassDeclaration(class_type -> get_declaration() -> get_definingDeclaration());
24136 ROSE_ASSERT(class_declaration);
24149 ROSE_ASSERT (old_sym != NULL);
24150 ROSE_ASSERT (new_sym != NULL);
24151 ROSE_ASSERT (old_sym != new_sym);
24152 ROSE_ASSERT (scope != NULL);
24154 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(scope, V_SgVarRefExp);
24155 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
24158 if (vRef->get_symbol() == old_sym)
24159 vRef->set_symbol(new_sym);
24172 bool result =
true;
24174 bool includingSelf =
false;
24177 if (sourceFile == NULL)
24179 printf (
"In SageInterface::statementCanBeTransformed(): sourceFile not found \n");
24183 ROSE_ASSERT(sourceFile != NULL);
24185 if (sourceFile != NULL && sourceFile->get_unparse_tokens() ==
true && sourceFile->get_unparseHeaderFiles() ==
true)
24189 string source_filename = stmt->getFilenameString();
24191 printf (
"In SageInterface::statementCanBeTransformed(): source_filename = %s \n",source_filename.c_str());
24192 printf (
" --- Rose::includeFileMapForUnparsing.size() = %zu \n",Rose::includeFileMapForUnparsing.size());
24196 if (EDG_ROSE_Translation::edg_include_file_map.find(source_filename) != EDG_ROSE_Translation::edg_include_file_map.end())
24198 SgIncludeFile* include_file = EDG_ROSE_Translation::edg_include_file_map[source_filename];
24199 ROSE_ASSERT(include_file != NULL);
24201 printf (
"include_file->get_can_be_supported_using_token_based_unparsing() = %s \n",include_file->get_can_be_supported_using_token_based_unparsing() ?
"true" :
"false");
24203 if (include_file->get_can_be_supported_using_token_based_unparsing() ==
false)
24206 printf (
"NOTE: Transformations of this statement cannot be supported using the header file unparsing with token unparsing options! \n");
24216 printf (
"Not found in Rose::includeFileMapForUnparsing: source_filename = %s \n",source_filename.c_str());
24219 printf (
"Exiting as a test! \n");
24225 printf (
"Error: In statementCanBeTransformed(): this might be an issue! \n");
24238 ROSE_ASSERT (decl!= NULL);
24239 ROSE_ASSERT (target_scope != NULL);
24240 ROSE_ASSERT (target_scope != decl->
get_scope());
24247 if (isSgIfStmt (target_scope))
24250 if (target_scope == )
24260 case V_SgBasicBlock:
24272 case V_SgForStatement:
24276 ROSE_ASSERT(stmt != NULL);
24277 SgStatementPtrList& stmt_list = stmt->get_init_stmt();
24281 if (stmt_list.size() !=1)
24283 cerr<<
"Error in moveVariableDeclaration(): only single init statement is handled for SgForStatement now."<<endl;
24284 ROSE_ASSERT (stmt_list.size() ==1);
24287 ROSE_ASSERT (exp_stmt != NULL);
24288 SgAssignOp* assign_op = isSgAssignOp(exp_stmt->get_expression());
24289 ROSE_ASSERT (assign_op != NULL);
24299 if (init_name->get_initptr() != NULL)
24301 init_name->set_initptr(initor);
24304 stmt_list.insert (stmt_list.begin(), decl );
24310 cerr<<
"Error. Unhandled target scope type:"<<target_scope->
class_name()<<endl;
24311 ROSE_ASSERT (
false);
24317 ROSE_ASSERT(sym != NULL);
24319 if (orig_scope != target_scope)
24324 init_name->set_scope(target_scope);
24326 orig_scope->remove_symbol(sym);
24331 ROSE_ASSERT (target_scope->symbol_exists(sym));
24341 subtreeVal.hasValue_ =
true;
24343 if (isSgIntVal(valExp)) {
24344 subtreeVal.value_ = isSgIntVal(valExp)->get_value();
24345 }
else if (isSgLongIntVal(valExp)) {
24346 subtreeVal.value_ = isSgLongIntVal(valExp)->get_value();
24347 }
else if (isSgLongLongIntVal(valExp)) {
24348 subtreeVal.value_ = isSgLongLongIntVal(valExp)->get_value();
24349 }
else if (isSgShortVal(valExp)) {
24350 subtreeVal.value_ = isSgShortVal(valExp)->get_value();
24351 }
else if (isSgUnsignedIntVal(valExp)) {
24352 subtreeVal.value_ = isSgUnsignedIntVal(valExp)->get_value();
24353 }
else if (isSgUnsignedLongVal(valExp)) {
24354 subtreeVal.value_ = isSgUnsignedLongVal(valExp)->get_value();
24355 }
else if (isSgUnsignedLongLongIntVal(valExp)) {
24356 subtreeVal.value_ = isSgUnsignedLongLongIntVal(valExp)->get_value();
24357 }
else if (isSgUnsignedShortVal(valExp)) {
24358 subtreeVal.value_ = isSgUnsignedShortVal(valExp)->get_value();
24364 if (isSgModifierType(vRef->get_type()) == NULL) {
24367 val.hasValue_ =
false;
24370 if (isSgModifierType(vRef->get_type())->
get_typeModifier().get_constVolatileModifier().isConst()) {
24376 if (isSgAssignInitializer(ini)) {
24381 return variableEval.
traverse(rhs);
24385 val.hasValue_ =
false;
24391 if (isSgExpression(node) != NULL) {
24393 if (valueExp != NULL) {
24394 return this->getValueExpressionValue(valueExp);
24398 if (varRefExp != NULL) {
24400 return evaluateVariableReference(varRefExp);
24403 if (isSgAssignInitializer(node)) {
24404 if(synList.at(0).hasValue_){
24405 return synList.at(0);
24409 val.hasValue_ =
false;
24414 evaluatedValue.hasValue_ =
false;
24415 evaluatedValue.value_ = -1;
24417 if(synList.size() != 2){
24418 for(SynthesizedAttributesList::iterator it = synList.begin(); it != synList.end(); ++it){
24419 std::cout <<
"Node: " << node->unparseToString() <<
"\n" << (*it).value_ << std::endl;
24420 std::cout <<
"Parent: " << node->get_parent()->unparseToString() << std::endl;
24421 std::cout <<
"Parent, Parent: " << node->get_parent()->get_parent()->unparseToString() << std::endl;
24425 for (SynthesizedAttributesList::iterator it = synList.begin(); it != synList.end(); ++it) {
24426 if((*it).hasValue_){
24427 if (isSgAddOp(node)) {
24428 assert(synList.size() == 2);
24429 evaluatedValue.value_ = synList[0].value_ + synList[1].value_ ;
24430 evaluatedValue.hasValue_ =
true;
24431 }
else if (isSgSubtractOp(node)) {
24432 assert(synList.size() == 2);
24433 evaluatedValue.value_ = synList[0].value_ - synList[1].value_ ;
24434 evaluatedValue.hasValue_ =
true;
24435 }
else if (isSgMultiplyOp(node)) {
24436 assert(synList.size() == 2);
24437 evaluatedValue.value_ = synList[0].value_ * synList[1].value_ ;
24438 evaluatedValue.hasValue_ =
true;
24439 }
else if (isSgDivideOp(node)) {
24440 assert(synList.size() == 2);
24441 evaluatedValue.value_ = synList[0].value_ / synList[1].value_ ;
24442 evaluatedValue.hasValue_ =
true;
24443 }
else if (isSgModOp(node)) {
24444 assert(synList.size() == 2);
24445 evaluatedValue.value_ = synList[0].value_ % synList[1].value_ ;
24446 evaluatedValue.hasValue_ =
true;
24449 std::cerr <<
"Expression is not evaluatable" << std::endl;
24450 evaluatedValue.hasValue_ =
false;
24451 evaluatedValue.value_ = -1;
24452 return evaluatedValue;
24455 evaluatedValue.hasValue_ =
true;
24456 return evaluatedValue;
24459 evaluatedValue.hasValue_ =
false;
24460 evaluatedValue.value_ = -1;
24461 return evaluatedValue;
24474 class TypeEquivalenceChecker {
24476 TypeEquivalenceChecker(
bool profile,
bool useSemanticEquivalence)
24477 : profile_(profile), useSemanticEquivalence_(useSemanticEquivalence),
24478 namedType_(0), pointerType_(0), arrayType_(0), functionType_(0)
24484 if (isSgTypedefType(t)) {
24486 node = isSgTypedefType(t)->
stripType(SgType::STRIP_TYPEDEF_TYPE);
24488 if(useSemanticEquivalence_){
24489 if(isSgModifierType(t)){
24491 ROSE_ASSERT(modType != NULL);
24498 std::cout <<
"Hit volatile type, stripping of modifier type" << std::endl;
24499 node = modType->get_base_type();
24503 std::cout <<
"Hit restrict type, stripping of modifier type" << std::endl;
24504 node = modType->get_base_type();
24508 ROSE_ASSERT(node != NULL);
24513 bool equal =
false;
24514 if(t1 == NULL || t2 == NULL){
24515 std::string wasNull;
24521 std::cerr <<
"ERROR: " << wasNull <<
" was NULL" << std::endl;
24534 i != subT1.
end() && j != subT2.
end(); ++i, ++j) {
24539 nodeT1 = getBasetypeIfApplicable(nodeT1);
24540 nodeT2 = getBasetypeIfApplicable(nodeT2);
24544 if(isSgModifierType(nodeT1)){
24548 if(modT1.get_constVolatileModifier().isConst() != modT2.get_constVolatileModifier().isConst()){
24551 if(modT1.get_constVolatileModifier().isVolatile() != modT2.get_constVolatileModifier().isVolatile()){
24554 }
else if (isSgNamedType(nodeT1)) {
24558 i.skipChildrenOnForward();
24559 j.skipChildrenOnForward();
24565 if(!c1->get_autonomous_declaration()){
24568 if (!c2->get_autonomous_declaration()){
24577 }
else if (isSgPointerType(nodeT1)) {
24584 return typesAreEqual(t1->get_base_type(), t2->get_base_type());
24586 }
else if(isSgReferenceType(nodeT1)){
24590 return typesAreEqual(t1->get_base_type(), t2->get_base_type());
24591 }
else if (isSgArrayType(nodeT1)) {
24598 bool arrayBaseIsEqual = typesAreEqual(a1->get_base_type(), a2->get_base_type());
24602 bool arrayIndexExpressionIsEquivalent =
false;
24603 if(t1Index.hasValue_ && t2Index.hasValue_){
24604 if(t1Index.value_ == t2Index.value_){
24605 arrayIndexExpressionIsEquivalent =
true;
24608 bool arraysAreEqual = (arrayBaseIsEqual && arrayIndexExpressionIsEquivalent);
24609 return arraysAreEqual;
24610 }
else if (isSgFunctionType(nodeT1)) {
24618 if(typesAreEqual(funcTypeA->get_return_type(), funcTypeB->get_return_type())) {
24628 for(SgTypePtrList::const_iterator ii = funcTypeA->
get_arguments().begin(),
24635 if(!typesAreEqual((*ii), (*jj))) {
24655 std::cerr <<
"This feature for now is available with autotools only!" << std::endl;
24660int getNamedTypeCount() {
24664int getPointerTypeCount() {
24665 return pointerType_;
24668int getArrayTypeCount() {
24672int getFunctionTypeCount() {
24673 return functionType_;
24677 bool profile_, useSemanticEquivalence_;
24678 int namedType_, pointerType_, arrayType_, functionType_;
24681TypeEquivalenceChecker tec(
false,
false);
24682return tec.typesAreEqual(typeA, typeB);
24686std::set<SgStatement*>
24695 StatementTraversal() : count (0) {}
24696 void visit (
SgNode* node)
24701 returnset.insert(statement);
24707 std::set<SgStatement*> returnset;
24711 StatementTraversal traversal;
24712 traversal.traverse(node, preorder);
24714 return traversal.returnset;
24717std::set<SgStatement*>
24724 printf (
"In collectModifiedStatements(): node = %p = %s \n",node,node->
class_name().c_str());
24730 StatementTraversal() : count (0) {}
24731 void visit (
SgNode* node)
24736 returnset.insert(statement);
24742 std::set<SgStatement*> returnset;
24746 StatementTraversal traversal;
24747 traversal.traverse(node, preorder);
24749 return traversal.returnset;
24759 printf (
"In outputFileIds(): node = %p = %s \n",node,node->
class_name().c_str());
24765 LocatedNodeTraversal() {}
24766 void visit (
SgNode* node)
24769 if (locatedNode != NULL)
24772 printf (
"In outputFileIds(): isModified() == %s: locatedNode = %p = %s \n",locatedNode->
get_isModified() ?
"true" :
"false",locatedNode,locatedNode->
class_name().c_str());
24773 printf (
" --- file id = %d physical_file_id = %d \n",node->
get_file_info()->get_file_id(),node->
get_file_info()->get_physical_file_id());
24779 if (initializedName != NULL)
24781 printf (
"In outputFileIds(): isModified() == %s: initializedName = %p = %s \n",initializedName->
get_isModified() ?
"true" :
"false",initializedName,initializedName->
class_name().c_str());
24782 printf (
" --- file id = %d physical_file_id = %d \n",initializedName->
get_file_info()->get_file_id(),initializedName->
get_file_info()->get_physical_file_id());
24789 LocatedNodeTraversal traversal;
24790 traversal.traverse(node, preorder);
24793 printf (
"Exiting as a test! \n");
24799std::set<SgLocatedNode*>
24806 printf (
"In collectModifiedLocatedNodes(): node = %p = %s \n",node,node->
class_name().c_str());
24812 LocatedNodeTraversal() : count (0) {}
24813 void visit (
SgNode* node)
24816 if (locatedNode != NULL && locatedNode->
get_isModified() ==
true)
24819 printf (
"In collectModifiedLocatedNodes(): isModified() == true: locatedNode = %p = %s \n",locatedNode,locatedNode->
class_name().c_str());
24821 returnset.insert(locatedNode);
24827 std::set<SgLocatedNode*> returnset;
24831 LocatedNodeTraversal traversal;
24832 traversal.traverse(node, preorder);
24834 return traversal.returnset;
24845 printf (
"In resetModifiedLocatedNodes(): modifiedNodeSet.size() = %zu \n",modifiedNodeSet.size());
24848 std::set<SgLocatedNode*>::const_iterator i = modifiedNodeSet.begin();
24849 while (i != modifiedNodeSet.end())
24853 printf (
"Marking node = %p = %s as modified \n",node,node->
class_name().c_str());
24868 printf (
"\n\n##################################################### \n");
24869 printf (
"Report on modified statements: label = %s \n",label.c_str());
24872 if (sourceFile != NULL)
24874 printf (
" --- (SgSourceFile) filename = %s \n",sourceFile->
getFileName().c_str());
24878 SgGlobal* globalScope = isSgGlobal(node);
24879 if (globalScope != NULL)
24881 sourceFile = isSgSourceFile(globalScope->
get_parent());
24882 printf (
" --- (SgGlobal) filename = %s \n",sourceFile->
getFileName().c_str());
24886 ROSE_ASSERT(node != NULL);
24890 printf (
"In reportModifiedStatements(): collection.size() = %zu \n",collection.size());
24893 std::set<SgStatement*>::iterator i = collection.begin();
24894 while (i != collection.end())
24897 string filename = (*i)->get_file_info()->get_filename();
24900 if (filename ==
"transformation")
24903 printf (
" --- filename == transformation: sourceFile = %p using physical filename \n",sourceFile);
24906 SgSourceFile* sourceFile = TransformationSupport::getSourceFile(*i);
24907 if (sourceFile != NULL)
24913 printf (
" --- filename = %s modified statement = %p = %s \n",filename.c_str(),(*i),(*i)->class_name().c_str());
24921 printf (
"########################################################## \n");
24922 printf (
"reportModifiedStatements(): Called using label = %s \n",label.c_str());
24924 printf (
"########################################################## \n\n\n");
24927 printf (
"Exiting as a test! \n");
24928 ROSE_ASSERT(
false);
24940 printf (
"\n\n##################################################### \n");
24941 printf (
"Report on modified locatedNodes: label = %s \n",label.c_str());
24944 if (sourceFile != NULL)
24946 printf (
" --- (SgSourceFile) filename = %s \n",sourceFile->
getFileName().c_str());
24950 SgGlobal* globalScope = isSgGlobal(node);
24951 if (globalScope != NULL)
24953 sourceFile = isSgSourceFile(globalScope->
get_parent());
24954 printf (
" --- (SgGlobal) filename = %s \n",sourceFile->
getFileName().c_str());
24958 ROSE_ASSERT(node != NULL);
24962 printf (
"In reportModifiedLocatedNode(): collection.size() = %zu \n",collection.size());
24965 std::set<SgLocatedNode*>::iterator i = collection.begin();
24966 while (i != collection.end())
24969 string filename = (*i)->get_file_info()->get_filename();
24972 if (filename ==
"transformation")
24975 printf (
" --- filename == transformation: sourceFile = %p using physical filename \n",sourceFile);
24978 SgSourceFile* sourceFile = TransformationSupport::getSourceFile(*i);
24979 if (sourceFile != NULL)
24985 printf (
" --- filename = %s modified locatedNode = %p = %s \n",filename.c_str(),(*i),(*i)->class_name().c_str());
24993 printf (
"########################################################## \n");
24994 printf (
"reportModifiedLocatedNodes(): Called using label = %s \n",label.c_str());
24996 printf (
"########################################################## \n\n\n");
24999 printf (
"Exiting as a test! \n");
25000 ROSE_ASSERT(
false);
25014 ROSE_ASSERT(locatedNode != NULL);
25018 curprint (
"/* Inside of printOutComments() */");
25021 if (comments != NULL)
25024 printf (
"Found attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
class_name().c_str());
25025 curprint (
"/* Inside of printOutComments(): comments != NULL */");
25028 AttachedPreprocessingInfoType::iterator i;
25029 for (i = comments->begin(); i != comments->end(); i++)
25031 ROSE_ASSERT ( (*i) != NULL );
25032 printf (
" Attached Comment (relativePosition=%s): %s \n",
25035 PreprocessingInfo::relativePositionName((*i)->getRelativePosition()).c_str(),
25036 (*i)->getString().c_str());
25037 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
25041 (*i)->get_file_info()->display(
"comment/directive location");
25048 printf (
"In SageInterface::printOutComments(): No attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
class_name().c_str());
25058 bool returnValue =
false;
25060 ROSE_ASSERT(currentPreprocessingInfo != NULL);
25062 PreprocessingInfo::DirectiveType directive = currentPreprocessingInfo->getTypeOfDirective();
25064 if (directive == PreprocessingInfo::C_StyleComment ||
25065 directive == PreprocessingInfo::CplusplusStyleComment ||
25066 directive == PreprocessingInfo::FortranStyleComment ||
25067 directive == PreprocessingInfo::CpreprocessorBlankLine ||
25068 directive == PreprocessingInfo::ClinkageSpecificationStart ||
25069 directive == PreprocessingInfo::ClinkageSpecificationEnd)
25071 returnValue =
true;
25074 return returnValue;
25077std::vector<SgC_PreprocessorDirectiveStatement*>
25080 std::vector<SgC_PreprocessorDirectiveStatement*> directiveList;
25085 if (comments !=
nullptr)
25087 AttachedPreprocessingInfoType::iterator i;
25088 for (i = comments->begin (); i != comments->end(); i++)
25097 ROSE_ASSERT(directive != NULL);
25098 directiveList.push_back(directive);
25101 printf (
"directiveList.size() = %zu \n",directiveList.size());
25105 return directiveList;
25114 printf (
"In translateScopeToUseCppDeclarations(): declarationsOnly = %s scope = %p = %s \n",declarationsOnly ?
"true" :
"false",scope,scope->
class_name().c_str());
25116 std::map<SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> > directiveMap;
25118 if (declarationsOnly ==
true)
25122 SgDeclarationStatementPtrList::iterator i = declarationList.begin();
25123 while (i != declarationList.end())
25126 ROSE_ASSERT(declaration != NULL);
25130 printf (
"attachDirectives.size() = %zu \n",attachDirectives.size());
25132 if (attachDirectives.empty() ==
false)
25134 directiveMap.insert(std::pair<
SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> >(declaration,attachDirectives));
25146 SgStatementPtrList::iterator i = statementList.begin();
25147 while (i != statementList.end())
25150 ROSE_ASSERT(statement != NULL);
25154 printf (
"attachDirectives.size() = %zu \n",attachDirectives.size());
25156 if (attachDirectives.empty() ==
false)
25158 directiveMap.insert(std::pair<
SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> >(statement,attachDirectives));
25165 printf (
"directiveMap.size() = %zu \n",directiveMap.size());
25167 printf (
"Processing the directiveMap: \n");
25168 std::map<SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> >::iterator i = directiveMap.begin();
25169 while (i != directiveMap.end())
25172 std::vector<SgC_PreprocessorDirectiveStatement*> directives = i->second;
25174 printf (
"statement = %p = %s \n",statement,statement->
class_name().c_str());
25175 printf (
"directives.size() = %zu \n",directives.size());
25177 std::vector<SgC_PreprocessorDirectiveStatement*>::iterator j = directives.begin();
25178 while (j != directives.end())
25187 ROSE_ASSERT(comments != NULL);
25189 AttachedPreprocessingInfoType deleteList;
25194 AttachedPreprocessingInfoType::iterator k;
25195 for (k = comments->begin(); k != comments->end(); k++)
25198 ROSE_ASSERT ( (*k) != NULL );
25199 printf (
" Attached Comment (relativePosition=%s): %s\n",
25200 ((*k)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
25201 (*k)->getString().c_str());
25202 printf (
"translateScopeToUseCppDeclarations(): Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*k)->getNumberOfLines(),(*k)->getColumnNumberOfEndOfString());
25209 printf (
"Do NOT delete *k = %p = %s \n",*k,(*k)->getString().c_str());
25213 printf (
"DO delete *k = %p = %s \n",*k,(*k)->getString().c_str());
25215 deleteList.push_back(*k);
25221 printf (
"Iterate over the deleteList: deleteList.size() = %zu comments->size() = %zu \n",deleteList.size(),comments->size());
25222 AttachedPreprocessingInfoType::iterator m = deleteList.begin();
25223 while (m != deleteList.end())
25227 comments->erase(std::remove(comments->begin(), comments->end(), *m), comments->end());
25229 printf (
" --- comments->size() = %zu \n",comments->size());
25241 printf (
"Leaving translateScopeToUseCppDeclarations(): scope = %p = %s \n",scope,scope->
class_name().c_str());
25251 CppTranslationTraversal() {}
25252 void visit (
SgNode* node)
25254 printf (
"In CppTranslationTraversal::visit(): node = %p = %s \n",node,node->
class_name().c_str());
25257 SgGlobal* globalScope = isSgGlobal(scope);
25258 if (globalScope != NULL)
25260 printf (
"In CppTranslationTraversal::visit(): processing scope = %p = %s \n",scope,scope->
class_name().c_str());
25267 printf (
"In SageInterface::translateToUseCppDeclarations(): Currently skipping all but global scope! \n");
25274 CppTranslationTraversal traversal;
25276 printf (
"In translateToUseCppDeclarations(): Calling traversal.traverse() \n");
25280 traversal.traverse(n, postorder);
25282 printf (
"Leaving translateToUseCppDeclarations(): DONE: Calling traversal.traverse() \n");
25289 cout<<
"--------------"<<endl;
25293 cout<<
"file info:\t ";
25294 lnode->get_file_info()->display();
25295 cout<<
"\n unparseToString:\t ";
25296 lnode->unparseToString();
25307static void serialize(SgTemplateArgumentPtrList& plist,
string& prefix,
bool hasRemaining, ostringstream& out,
string& edgeLabel)
25310 out<< (hasRemaining?
"|---":
"|___");
25313 out<<
" "<<edgeLabel<<
" ->";
25315 out<<
"@"<<&plist<<
" "<<
"SgTemplateArgumentPtrList ";
25319 int last_non_null_child_idx =-1;
25320 for (
int i = (
int) (plist.size())-1; i>=0; i--)
25324 last_non_null_child_idx = i;
25329 for (
size_t i=0; i< plist.size(); i++ )
25331 bool n_hasRemaining=
false;
25333 if (i+1 < plist.size())
25334 n_hasRemaining=
true;
25336 if ((
int)i< last_non_null_child_idx) n_hasRemaining =
true;
25338 string suffix= hasRemaining?
"| " :
" ";
25339 string n_prefix = prefix+suffix;
25340 string n_edge_label=
"";
25342 serialize (plist[i], n_prefix, n_hasRemaining, out,n_edge_label);
25355 out<< (hasRemaining?
"|---":
"|___");
25357 out<<
" "<<edgeLabel<<
" ->";
25360 out<<
" NULL "<<endl;
25365 out<<
"@"<<node<<
" "<< node->
class_name()<<
" ";
25371 out<< lnode->get_file_info()->get_filename() <<
" "<<lnode->get_file_info()->get_line()<<
":"<<lnode->get_file_info()->get_col();
25373 AttachedPreprocessingInfoType *comments =
25374 lnode->getAttachedPreprocessingInfo ();
25376 if (comments != NULL)
25379 out<<
" AttachedPreprocessingInfoType@"<<comments;
25381 AttachedPreprocessingInfoType::iterator i;
25383 for (i = comments->begin (); i != comments->end (); i++)
25385 if (i!=comments->begin ())
25388 out<<counter++<<
" ";
25397 out<<*i<<
" classification="<<PreprocessingInfo::directiveTypeName((*i)->getTypeOfDirective ()). c_str ();
25398 out<<
" string="<<(*i)->getString ().c_str ();
25399 out<<
" relative pos=" ;
25401 if ((*i)->getRelativePosition () == PreprocessingInfo::inside)
25403 else if ((*i)->getRelativePosition () == PreprocessingInfo::before)
25417 out<<
" first nondefining decl@"<< v->get_firstNondefiningDeclaration();
25418 out<<
" defining decl@"<< v->get_definingDeclaration();
25422 out<<
" value="<< f->get_value() <<
" declaration="<<f->get_declaration() <<
" name="<< f->get_name().getString();
25429 out<<
" renamed_function "<< f->get_renamed_function();
25432 out<<
" name="<< f->get_name() <<
" renamed decl "<<f->get_renamed() ;
25444 out<<
" enumType="<< f->get_enumType();
25452 out<<
" is_general_access"<< v->get_is_general_access();
25455 out<<
" is_anonymous:"<< v->get_is_anonymous ();
25460 out<<
" is_protected"<< v->get_is_protected();
25466 out<<
" type@"<< v->get_type();
25467 out<<
" initializer@"<< v->get_initializer();
25468 out<<
" scope@"<< v->get_scope();
25474 out<<
" template class decl@"<< f->get_templateDeclaration();
25477 out<<
" assoc. class decl@"<< f->get_associatedClassDeclaration();
25481 out<<
" member function decl@"<< ctor->get_declaration();
25484 if (
SgIntVal* v= isSgIntVal(node))
25485 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25488 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25491 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25494 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25497 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25500 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25503 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25506 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25509 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25512 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25515 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25518 out<<
" init name@"<< var_ref->get_symbol()->get_declaration() <<
" symbol name="<<var_ref->get_symbol()->get_name();
25521 out<<
" member func decl@"<< func_ref->get_symbol_i()->get_declaration();
25524 out<<
" template member func decl@"<< cnode->get_templateDeclaration();
25529 out<<
" func decl@"<< sym->get_declaration() <<
" func sym name="<<sym->
get_name();
25535 out<<
" ada renaming decl@"<< renaming_decl;
25541 out<<
" base_type@"<< v->get_base_type();
25546 out<<
" base_type@"<< v->get_base_type();
25549 out<<
" base_type@"<< v->get_base_type();
25552 out<<
" type@"<< v->get_type();
25555 out<<
" attribute@"<< v->get_attribute();
25558 out<<
" namespaceDeclaration="<< v->get_namespaceDeclaration();
25564 int total_count = children.size();
25565 int current_index=0;
25568 int last_non_null_child_idx =-1;
25569 for (
int i = (
int) (children.size())-1; i>=0; i--)
25573 last_non_null_child_idx = i;
25581 if (isSgTemplateInstantiationDecl (node))
25588 SgTemplateArgumentPtrList& plist = sn->get_templateArguments();
25589 bool n_hasRemaining=
false;
25590 if (last_non_null_child_idx>-1) n_hasRemaining =
true;
25591 string suffix= hasRemaining?
"| " :
" ";
25592 string n_prefix = prefix+suffix;
25593 string n_edge_label=
"";
25594 serialize_list(plist,
"SgTemplateArgumentPtrList", n_prefix, n_hasRemaining, out, n_edge_label);
25598 SgExpressionPtrList& plist = import_stmt->get_import_list();
25599 bool n_hasRemaining=
false;
25600 if (last_non_null_child_idx>-1) n_hasRemaining =
true;
25601 string suffix= hasRemaining?
"| " :
" ";
25602 string n_prefix = prefix+suffix;
25603 string n_edge_label=
"";
25604 serialize_list(plist,
"SgExpressionPtrList", n_prefix, n_hasRemaining, out, n_edge_label);
25610 for (
size_t i =0; i< children.size(); i++)
25612 bool n_hasRemaining=
false;
25614 if (current_index+1<total_count)
25615 n_hasRemaining=
true;
25618 if ((
int)i<last_non_null_child_idx) n_hasRemaining =
true;
25620 string suffix= hasRemaining?
"| " :
" ";
25621 string n_prefix = prefix+suffix;
25623 serialize (children[i], n_prefix, n_hasRemaining, out, successorNames[i]);
25632 serialize(node, prefix,
false, oss, label);
25653 serialize(node, prefix,
false, oss, label);
25655 textfile.open(filename, ios::out);
25656 textfile<<oss.str();
25661 textfile<<
"Types encountered ...."<<endl;
25662 ostringstream oss2;
25663 VariantVector vv(V_SgType);
25664 Rose_STL_Container<SgNode*> tnodes= NodeQuery::queryMemoryPool(vv);
25665 for (Rose_STL_Container<SgNode*>::const_iterator i = tnodes.begin(); i != tnodes.end(); ++i)
25667 serialize (*i, prefix,
false, oss2, label);
25669 textfile<<oss2.str();
25677 saveToPDF(node,
string(
"temp.pdf.json") );
25683 ROSE_ASSERT(node != NULL);
25690 bool rtval =
false;
25691 ROSE_ASSERT (node != NULL);
25695 string fname = finfo->get_filenameString();
25696 string buildtree_str1 = string(
"include-staging/gcc_HEADERS");
25697 string buildtree_str2 = string(
"include-staging/g++_HEADERS");
25698 string installtree_str1 = string(
"include/edg/gcc_HEADERS");
25699 string installtree_str2 = string(
"include/edg/g++_HEADERS");
25700 string system_headers = string(
"/usr/include");
25702 if ((fname.find (buildtree_str1, 0) != string::npos) ||
25703 (fname.find (buildtree_str2, 0) != string::npos) ||
25704 (fname.find (installtree_str1, 0) != string::npos) ||
25705 (fname.find (installtree_str2, 0) != string::npos) ||
25706 (fname.find (system_headers, 0) != string::npos)
25719 bool returnValue =
false;
25722 ROSE_ASSERT(fileInfo != NULL);
25723 string filename = fileInfo->get_filenameString();
25726 printf (
"In SageInterface::insideHeader(): node = %s line: %d column: %d file: %s \n",node->
class_name().c_str(),fileInfo->
get_line(),fileInfo->
get_col(),filename.c_str());
25731 if (EDG_ROSE_Translation::edg_include_file_map.find(filename) == EDG_ROSE_Translation::edg_include_file_map.end())
25734 printf (
"This is NOT in the EDG_ROSE_Translation::edg_include_file_map \n");
25740 printf (
"This IS in the EDG_ROSE_Translation::edg_include_file_map \n");
25742 returnValue =
true;
25745 return returnValue;
25752 ROSE_ASSERT(return_type != NULL);
25753 ROSE_ASSERT(typeList != NULL);
25755 ROSE_ASSERT(fTable);
25760 SgFunctionType* funcType = isSgFunctionType(fTable->lookup_function_type(typeName));
25770 ROSE_ASSERT (lhs != NULL);
25771 ROSE_ASSERT (rhs != NULL);
25776 SgType* rt1 = lhs->get_return_type();
25777 SgType* rt2 = rhs->get_return_type();
25784 if (f1_arg_types.size() == f2_arg_types.size())
25788 size_t counter = 0;
25791 for (
size_t i=0; i< f1_arg_types.size(); i++)
25799 if (counter == f1_arg_types.size())
25821 ROSE_ASSERT(lhs != NULL);
25822 ROSE_ASSERT(rhs != NULL);
25824 bool isSame =
false;
25827 static int counter = 0;
25829 const SgType & X = *lhs;
25830 const SgType & Y = *rhs;
25838#define DEBUG_TYPE_EQUIVALENCE 0
25840#if DEBUG_TYPE_EQUIVALENCE
25841 printf (
"In SageInterface::isEquivalentType(): evaluation of type equivalence for lhs and rhs: counter = %d \n",counter);
25846#if DEBUG_TYPE_EQUIVALENCE || 0
25849 printf (
"In SageInterface::isEquivalentType(): evaluation of type equivalence for lhs and rhs: counter = %d \n",counter);
25855#if DEBUG_TYPE_EQUIVALENCE || 0
25861 printf (
"Output of type chain for lhs: \n");
25862 for (
size_t i = 0; i < X_typeChain.size(); i++)
25864 SgType* element_type = X_typeChain[i];
25865 printf (
"X_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
25866 printf (
" --- X_element_type unparseToString: = %s \n",element_type->
unparseToString().c_str());
25868 if (modifierType != NULL)
25872 printf (
" --- type chain modifier: %s \n",s.c_str());
25873 printf (
" --- type chain modifier: unparseToString: %s \n",modifierType->
unparseToString().c_str());
25877 printf (
"Output of type chain for rhs: \n");
25878 for (
size_t i = 0; i < Y_typeChain.size(); i++)
25880 SgType* element_type = Y_typeChain[i];
25881 printf (
"Y_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
25882 printf (
" --- Y_element_type unparseToString: = %s \n",element_type->
unparseToString().c_str());
25884 if (modifierType != NULL)
25888 printf (
" --- type chain modifier: %s \n",s.c_str());
25889 printf (
" --- type chain modifier: unparseToString: %s \n",modifierType->
unparseToString().c_str());
25900 if (counter >= 280)
25903 printf (
"In SageInterface::isEquivalentType(): counter = %d: type chain X_element_type = %s = %p Y_element_type = %s = %p \n",counter,X.
class_name().c_str(),lhs,Y.
class_name().c_str(),rhs);
25915 printf (
"ERROR: In SageInterface::isEquivalentType(): recursive limit exceeded for : counter = %d \n",counter);
25926 SgReferenceType* X_referenceType = isSgReferenceType(X_element_type);
25927 SgReferenceType* Y_referenceType = isSgReferenceType(Y_element_type);
25929 if (X_referenceType != NULL && Y_referenceType != NULL)
25931 X_element_type = X_referenceType->get_base_type();
25932 Y_element_type = Y_referenceType->get_base_type();
25943 SgPointerType* X_pointerType = isSgPointerType(X_element_type);
25944 SgPointerType* Y_pointerType = isSgPointerType(Y_element_type);
25946 if (X_pointerType != NULL && Y_pointerType != NULL)
25948 X_element_type = X_pointerType->get_base_type();
25949 Y_element_type = Y_pointerType->get_base_type();
25960 SgArrayType* X_arrayType = isSgArrayType(X_element_type);
25961 SgArrayType* Y_arrayType = isSgArrayType(Y_element_type);
25964 if (X_arrayType != NULL && Y_arrayType != NULL)
25966 X_element_type = X_arrayType->get_base_type();
25967 Y_element_type = Y_arrayType->get_base_type();
25969 SgExpression* X_array_index_expression = X_arrayType->get_index();
25970 SgExpression* Y_array_index_expression = Y_arrayType->get_index();
25972 if (X_array_index_expression == Y_array_index_expression)
25974#if DEBUG_TYPE_EQUIVALENCE || 0
25975 printf (
"In SageInterface::isEquivalentType(): counter = %d: Need to check the array size for static equivalence \n",counter);
25986#if DEBUG_TYPE_EQUIVALENCE || 0
25987 printf (
"In SageInterface::isEquivalentType(): counter = %d Need more complex test for expression equivalence \n",counter);
25990 printf (
" --- array index expressions: str1 = %s str2 = %s \n",str1.c_str(),str2.c_str());
26002 SgNonrealType* X_templateType = isSgNonrealType(X_element_type);
26003 SgNonrealType* Y_templateType = isSgNonrealType(Y_element_type);
26006 if (X_templateType != NULL && Y_templateType != NULL)
26008 string X_name = X_templateType->
get_name();
26009 string Y_name = Y_templateType->
get_name();
26011 SgNonrealDecl* X_templateDecl = isSgNonrealDecl(X_templateType->get_declaration());
26012 ROSE_ASSERT(X_templateDecl != NULL);
26013 SgNonrealDecl* Y_templateDecl = isSgNonrealDecl(Y_templateType->get_declaration());
26014 ROSE_ASSERT(Y_templateDecl != NULL);
26016 int X_template_parameter_position = X_templateDecl->get_template_parameter_position();
26017 int Y_template_parameter_position = Y_templateDecl->get_template_parameter_position();
26022#if DEBUG_TYPE_EQUIVALENCE
26025 printf (
"In SageInterface::isEquivalentType(): case SgNonrealType:\n");
26026 printf (
" -- X_name = %s Y_name = %s\n", X_name.c_str(),Y_name.c_str());
26027 printf (
" -- X_template_parameter_position = %d Y_template_parameter_position = %d\n", X_template_parameter_position,Y_template_parameter_position);
26028 printf (
" -- X_parent = %p (%s) Y_parent = %p (%s)\n", X_parent, X_parent ? X_parent->
class_name().c_str() :
"", Y_parent, Y_parent ? Y_parent->
class_name().c_str() :
"");
26029 printf (
" -- X_parent_parent = %p (%s) Y_parent_parent = %p (%s)\n", X_parent_parent, X_parent_parent ? X_parent_parent->
class_name().c_str() :
"", Y_parent_parent, Y_parent_parent ? Y_parent_parent->
class_name().c_str() :
"");
26030 printf (
" -- X_templateDecl->get_mangled_name() = %s\n", X_templateDecl->get_mangled_name().str());
26031 printf (
" -- Y_templateDecl->get_mangled_name() = %s\n", Y_templateDecl->get_mangled_name().str());
26033 bool value = (X_parent == Y_parent);
26035 if (value && X_templateDecl->get_is_template_param() && Y_templateDecl->get_is_template_param()) {
26036 value = (X_template_parameter_position == Y_template_parameter_position);
26037 }
else if (value && X_templateDecl->get_is_class_member() && Y_templateDecl->get_is_class_member()) {
26038 value = (X_name == Y_name);
26050 printf (
"Nothing to do here since we have explored all uniform pairs of intermediate types possible: isSame = %s \n",isSame ?
"true" :
"false");
26056#if DEBUG_TYPE_EQUIVALENCE
26057 printf (
"In SageInterface::isEquivalentType(): loop: Nothing to do here since we have explored all uniform pairs of intermediate types possible: isSame = %s \n",isSame ?
"true" :
"false");
26064 SgModifierType* X_modifierType = isSgModifierType(X_element_type);
26065 SgModifierType* Y_modifierType = isSgModifierType(Y_element_type);
26067#if DEBUG_TYPE_EQUIVALENCE
26068 printf (
"In SageInterface::isEquivalentType(): counter = %d: type chain X_element_type = %p = %s Y_element_type = %p = %s \n",
26069 counter,X_element_type,X_element_type->
class_name().c_str(),Y_element_type,Y_element_type->
class_name().c_str());
26072 if (X_modifierType != NULL && Y_modifierType != NULL)
26075#if DEBUG_TYPE_EQUIVALENCE
26076 printf (
"In SageInterface::isEquivalentType(): loop: these are the both SgModifierType nodes: isSame = %s \n",isSame ?
"true" :
"false");
26078 if (X_modifierType == Y_modifierType)
26081#if DEBUG_TYPE_EQUIVALENCE
26082 printf (
"In SageInterface::isEquivalentType(): loop: these are the same modifier type: isSame = %s \n",isSame ?
"true" :
"false");
26089#if DEBUG_TYPE_EQUIVALENCE
26090 printf (
"In SageInterface::isEquivalentType(): loop: these are equivalent modifiers: check the base type: isSame = %s \n",isSame ?
"true" :
"false");
26094 isSame =
isEquivalentType(X_modifierType->get_base_type(),Y_modifierType->get_base_type());
26098#if DEBUG_TYPE_EQUIVALENCE
26099 printf (
"In SageInterface::isEquivalentType(): loop: these are not equivalent modifier types: check for default settings: isSame = %s \n",isSame ?
"true" :
"false");
26102 bool skippingOverIdentityModifier =
false;
26106#if DEBUG_TYPE_EQUIVALENCE
26107 printf (
"In SageInterface::isEquivalentType(): loop: found self-similar setting for lhs: isSame = %s \n",isSame ?
"true" :
"false");
26109 X_element_type = X_modifierType->get_base_type();
26112 skippingOverIdentityModifier =
true;
26117#if DEBUG_TYPE_EQUIVALENCE
26118 printf (
"In SageInterface::isEquivalentType(): loop: found self-similar setting for rhs: isSame = %s \n",isSame ?
"true" :
"false");
26120 Y_element_type = Y_modifierType->get_base_type();
26123 skippingOverIdentityModifier =
true;
26127#if DEBUG_TYPE_EQUIVALENCE
26128 printf (
"In SageInterface::isEquivalentType(): loop: skippingOverIdentityModifier = %s \n",skippingOverIdentityModifier ?
"true" :
"false");
26133 if (skippingOverIdentityModifier ==
true)
26135#if DEBUG_TYPE_EQUIVALENCE
26136 printf (
"In SageInterface::isEquivalentType(): loop: recursive call on different adjusted modifier types: before recursive call to compare base types: isSame = %s \n",isSame ?
"true" :
"false");
26145#if DEBUG_TYPE_EQUIVALENCE
26146 printf (
"In SageInterface::isEquivalentType(): loop: no progress was made in resolving the base type, so returning isSame set to false: isSame = %s \n",isSame ?
"true" :
"false");
26150#if DEBUG_TYPE_EQUIVALENCE
26151 printf (
"In SageInterface::isEquivalentType(): loop: these are different modifier types: after recursive call to compare base types: isSame = %s \n",isSame ?
"true" :
"false");
26160 if (X_modifierType != NULL || Y_modifierType != NULL)
26162 bool isReduceable =
false;
26164 if (X_modifierType != NULL && X_modifierType->
get_typeModifier().isIdentity() ==
true)
26166#if DEBUG_TYPE_EQUIVALENCE
26167 printf (
"In SageInterface::isEquivalentType(): loop: found default setting for lhs: isSame = %s \n",isSame ?
"true" :
"false");
26169 X_element_type = X_modifierType->get_base_type();
26170 isReduceable =
true;
26173 if (Y_modifierType != NULL && Y_modifierType->
get_typeModifier().isIdentity() ==
true)
26175#if DEBUG_TYPE_EQUIVALENCE
26176 printf (
"In SageInterface::isEquivalentType(): loop: found default setting for rhs: isSame = %s \n",isSame ?
"true" :
"false");
26178 Y_element_type = Y_modifierType->get_base_type();
26179 isReduceable =
true;
26183#if DEBUG_TYPE_EQUIVALENCE
26184 printf (
"In SageInterface::isEquivalentType(): loop: these are different modifier types: after recursive call to compare base types: isReduceable = %s \n",isReduceable ?
"true" :
"false");
26186 if (isReduceable ==
true)
26198#if DEBUG_TYPE_EQUIVALENCE
26199 printf (
"In SageInterface::isEquivalentType(): loop: these are different modifier types: after recursive call to compare base types: isReduceable = %s isSame = %s \n",
26200 isReduceable ?
"true" :
"false",isSame ?
"true" :
"false");
26209 if (X_element_type == Y_element_type)
26212#if DEBUG_TYPE_EQUIVALENCE || 0
26214 printf (
"In SageInterface::isEquivalentType(): resolved to equal types: isSame = %s lhs = %p = %s rhs = %p = %s \n",
26217#if DEBUG_TYPE_EQUIVALENCE || 0
26220 const SgTypedefType* lhs_typedefType = isSgTypedefType(lhs);
26221 const SgTypedefType* rhs_typedefType = isSgTypedefType(rhs);
26223 if (lhs_typedefType != NULL || rhs_typedefType != NULL)
26226 if (lhs_typedefType != NULL)
26228 printf (
"lhs was a typedef: lhs = %p = %s \n",lhs,lhs->
unparseToString().c_str());
26230 if (rhs_typedefType != NULL)
26232 printf (
"rhs was a typedef: rhs = %p = %s \n",rhs,rhs->
unparseToString().c_str());
26235 printf (
" --- one was a typedef: lhs = %p = %s \n",lhs,lhs->
unparseToString().c_str());
26236 printf (
" --- one was a typedef: rhs = %p = %s \n",rhs,rhs->
unparseToString().c_str());
26247 SgReferenceType* X_referenceType = isSgReferenceType(X_element_type);
26248 SgReferenceType* Y_referenceType = isSgReferenceType(Y_element_type);
26250 if (X_referenceType != NULL || Y_referenceType != NULL)
26253 if (X_referenceType != NULL)
26255 X_element_type = X_referenceType->get_base_type();
26259 isReduceable =
false;
26262 if (Y_referenceType != NULL)
26264 Y_element_type = Y_referenceType->get_base_type();
26268 isReduceable =
false;
26271 if (isReduceable ==
true)
26292#if DEBUG_TYPE_EQUIVALENCE
26293 printf (
"In SageInterface::isEquivalentType(): loop: evaluation of inner types: isSame = %s \n",isSame ?
"true" :
"false");
26297 SgPointerType* X_pointerType = isSgPointerType(X_element_type);
26298 SgPointerType* Y_pointerType = isSgPointerType(Y_element_type);
26300 if (X_pointerType != NULL || Y_pointerType != NULL)
26303 if (X_pointerType != NULL)
26305 X_element_type = X_pointerType->get_base_type();
26309 isReduceable =
false;
26312 if (Y_pointerType != NULL)
26314 Y_element_type = Y_pointerType->get_base_type();
26318 isReduceable =
false;
26321 if (isReduceable ==
true)
26342#if DEBUG_TYPE_EQUIVALENCE
26343 printf (
"In SageInterface::isEquivalentType(): loop: evaluation of inner types: isSame = %s \n",isSame ?
"true" :
"false");
26347 SgArrayType* X_arrayType = isSgArrayType(X_element_type);
26348 SgArrayType* Y_arrayType = isSgArrayType(Y_element_type);
26350 if (X_arrayType != NULL || Y_arrayType != NULL)
26353 if (X_arrayType != NULL)
26355 X_element_type = X_arrayType->get_base_type();
26359 isReduceable =
false;
26362 if (Y_arrayType != NULL)
26364 Y_element_type = Y_arrayType->get_base_type();
26368 isReduceable =
false;
26371 if (isReduceable ==
true)
26392#if DEBUG_TYPE_EQUIVALENCE
26393 printf (
"In SageInterface::isEquivalentType(): loop: evaluation of inner types: isSame = %s \n",isSame ?
"true" :
"false");
26397 SgFunctionType* X_functionType = isSgFunctionType(X_element_type);
26398 SgFunctionType* Y_functionType = isSgFunctionType(Y_element_type);
26400 if (X_functionType != NULL || Y_functionType != NULL)
26402 bool value = ( (X_functionType != NULL && Y_functionType != NULL) && (X_functionType == Y_functionType) );
26405#if DEBUG_TYPE_EQUIVALENCE || 0
26406 printf (
"In SageInterface::isEquivalentType(): loop: Process case of SgFunctionType: value = %s \n",value ?
"true" :
"false");
26424 if (X_memberFunctionType != NULL || Y_memberFunctionType != NULL)
26427 printf (
"This should be unreachable code \n");
26431 bool value = ( (X_memberFunctionType != NULL && Y_memberFunctionType != NULL) && (X_memberFunctionType == Y_memberFunctionType) );
26432#if DEBUG_TYPE_EQUIVALENCE || 0
26433 printf (
"In SageInterface::isEquivalentType(): loop: Process case of SgMemberFunctionType: value = %s \n",value ?
"true" :
"false");
26446 bool X_isReduceable =
true;
26447 if (isSgTypeSignedLong(X_element_type) != NULL ||
26448 isSgTypeUnsignedInt(X_element_type) != NULL ||
26449 isSgTypeBool(X_element_type) != NULL ||
26450 isSgTypeInt(X_element_type) != NULL)
26452 X_isReduceable =
false;
26455 bool Y_isReduceable =
true;
26456 if (isSgTypeSignedLong(Y_element_type) != NULL ||
26457 isSgTypeUnsignedInt(Y_element_type) != NULL ||
26458 isSgTypeBool(Y_element_type) != NULL ||
26459 isSgTypeInt(Y_element_type) != NULL)
26461 Y_isReduceable =
false;
26463#if DEBUG_TYPE_EQUIVALENCE || 0
26464 printf (
"In SageInterface::isEquivalentType(): loop: Process default case: X_isReduceable = %s Y_isReduceable = %s \n",
26465 X_isReduceable ?
"true" :
"false",Y_isReduceable ?
"true" :
"false");
26467 if (X_isReduceable ==
true || Y_isReduceable ==
true)
26481#if DEBUG_TYPE_EQUIVALENCE || 0
26482 printf (
"In SageInterface::isEquivalentType(): loop: Process default case: X_element_type = %p = %s Y_element_type = %p = %s \n",
26483 X_element_type,X_element_type->
class_name().c_str(),Y_element_type,Y_element_type->
class_name().c_str());
26488 isSame = (X_element_type == Y_element_type);
26508#if DEBUG_TYPE_EQUIVALENCE || 0
26509 printf (
"In SageInterface::isEquivalentType(): isSame = %s \n",isSame ?
"true" :
"false");
26512#if DEBUG_TYPE_EQUIVALENCE || 0
26513 if (counter == 1 && isSame ==
true)
26515 printf (
"In SageInterface::isEquivalentType(): counter = %d: isSame = %s type chain X_element_type = %s Y_element_type = %s \n",counter,isSame ?
"true" :
"false",X.
class_name().c_str(),Y.
class_name().c_str());
26522 printf (
" --- Output of type chain for lhs: \n");
26523 for (
size_t i = 0; i < X_typeChain.size(); i++)
26525 SgType* element_type = X_typeChain[i];
26526 printf (
" --- --- X_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
26528 if (modifierType != NULL)
26532 printf (
" --- type chain modifier: %s \n",s.c_str());
26536 printf (
" --- Output of type chain for rhs: \n");
26537 for (
size_t i = 0; i < Y_typeChain.size(); i++)
26539 SgType* element_type = Y_typeChain[i];
26540 printf (
" --- --- Y_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
26542 if (modifierType != NULL)
26546 printf (
" --- --- type chain modifier: %s \n",s.c_str());
26555 if (isSame ==
true)
26558 printf (
" --- isSame = %s \n",isSame ?
"true" :
"false");
26561 printf (
" --- --- X_element_type = %p = %s = %s \n",X_element_type,X_element_type->
class_name().c_str(),X_element_type->
unparseToString().c_str());
26562 printf (
" --- --- Y_element_type = %p = %s = %s \n",Y_element_type,Y_element_type->
class_name().c_str(),Y_element_type->
unparseToString().c_str());
26567 printf (
" --- isSame = %s \n",isSame ?
"true" :
"false");
26572 printf (
" --- counter = %d \n",counter);
26589 bool retval =
false;
26598 retval = function->get_marked_as_edg_normalization();
26606 if (templateInstantiationFunction != NULL)
26611 if (templateFunctionDeclaration != NULL)
26622 printf (
" --- case of templateInstantiationFunction: retval = %s \n",retval ?
"true" :
"false");
26627 if (templateInstantiationMemberFunction != NULL)
26630 templateInstantiationMemberFunction = isSgTemplateInstantiationMemberFunctionDecl(templateInstantiationMemberFunction->
get_firstNondefiningDeclaration());
26632 if (templateMemberFunctionDeclaration != NULL)
26643 printf (
" --- case of templateInstantiationMemberFunction: retval = %s \n",retval ?
"true" :
"false");
26655 printf(
"In detectCycleInType():\n");
26656 printf(
" -- from = %s\n", from.c_str());
26657 printf(
" -- type = %p (%s)\n", type, type->
class_name().c_str());
26659 std::vector<SgType *> seen_types;
26661 while (type != NULL) {
26664 ROSE_ASSERT(type != NULL);
26666 std::vector<SgType *>::const_iterator it = std::find(seen_types.begin(), seen_types.end(), type);
26667 if (it != seen_types.end()) {
26668 printf(
"ERROR: Cycle found in type = %p (%s):\n", type, type->
class_name().c_str());
26670 for (; it != seen_types.end(); it++) {
26671 printf(
" [%zd] %p (%s)\n", i, *it, (*it)->class_name().c_str());
26674 printf(
"-> detectCycleInType() was called from: %s\n", from.c_str());
26677 seen_types.push_back(type);
26687 if (isSgPointerMemberType(type) != NULL)
26694 type = modType->get_base_type();
26695 }
else if ( refType ) {
26696 type = refType->get_base_type();
26697 }
else if ( pointType ) {
26698 type = pointType->get_base_type();
26701 }
else if ( arrayType ) {
26702 type = arrayType->get_base_type();
26703 }
else if ( typedefType ) {
26708 ROSE_ASSERT(type != NULL);
26729 std::vector<SgFunctionDeclaration*> functionList;
26732 string filenameWithPath;
26735 TransformFunctionDefinitionsTraversal(): sourceFile(NULL), sourceFileId(-99) {}
26737 void visit (
SgNode* node)
26740 printf (
"In convertFunctionDefinitionsToFunctionPrototypes visit(): node = %p = %s \n",node,node->
class_name().c_str());
26743 if (temp_sourceFile != NULL)
26745 sourceFile = temp_sourceFile;
26749 filenameWithPath = sourceFile->get_sourceFileNameWithPath();
26751 printf (
"Found source file: id = %d name = %s \n",sourceFileId,sourceFile->get_sourceFileNameWithPath().c_str());
26756 if (functionDeclaration != NULL)
26759 ROSE_ASSERT(sourceFile != NULL);
26762 if (functionDeclaration == definingFunctionDeclaration)
26765 printf (
"Found a defining function declaration: functionDeclaration = %p = %s name = %s \n",
26766 functionDeclaration,functionDeclaration->
class_name().c_str(),functionDeclaration->get_name().str());
26768 printf (
" --- recorded source file: id = %d name = %s \n",sourceFileId,sourceFile->get_sourceFileNameWithPath().c_str());
26769 printf (
" --- source file: file_info: id = %d name = %s \n",
26774 bool isInSourceFile = (filenameWithPath == functionDeclaration->
get_file_info()->get_filenameString());
26776 printf (
" --- isInSourceFile = %s \n",isInSourceFile ?
"true" :
"false");
26780 if (isInSourceFile ==
true && functionDeclarationScope != NULL)
26783 printf (
" --- Found a defining function declaration: functionDeclarationScope = %p = %s \n",
26784 functionDeclarationScope,functionDeclarationScope->
class_name().c_str());
26788 functionList.push_back(functionDeclaration);
26796 TransformFunctionDefinitionsTraversal traversal;
26797 traversal.traverse(node, preorder);
26799 std::vector<SgFunctionDeclaration*> & functionList = traversal.functionList;
26802 printf (
"In convertFunctionDefinitionsToFunctionPrototypes(): functionList.size() = %zu \n",functionList.size());
26805 std::vector<SgFunctionDeclaration*>::iterator i = functionList.begin();
26806 while (i != functionList.end())
26809 ROSE_ASSERT(functionDeclaration != NULL);
26812 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
26815 printf (
" --- Removing function declaration: functionDeclaration = %p = %s name = %s \n",
26816 functionDeclaration,functionDeclaration->
class_name().c_str(),functionDeclaration->get_name().str());
26826 printf (
"In convertFunctionDefinitionsToFunctionPrototypes(): exiting as a test! \n");
26837 ROSE_ASSERT(scope != NULL);
26839 printf (
"Output the statements in scope = %p = %s \n",scope,scope->
class_name().c_str());
26843 for (
size_t i = 0; i < statementList.size(); i++)
26850 printf (
"Exiting as a test at the end of evaluation of global scope! \n");
26863 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration = %p = %s name = %s \n",
26864 functionDeclaration,functionDeclaration->
class_name().c_str(),functionDeclaration->get_name().str());
26868 bool isConstructor =
false;
26870 if (tmp_memberFunctionDeclaration != NULL)
26872 isConstructor = tmp_memberFunctionDeclaration->get_specialFunctionModifier().isConstructor();
26875 if (isConstructor ==
true)
26877 printf (
"Skipping case of constructors (in building prototype from defining function declaration) \n");
26887 SgName name = functionDeclaration->get_name();
26888 SgType* return_type = functionDeclaration->get_type()->get_return_type();
26896 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration = %p \n",functionDeclaration);
26897 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration->get_firstNondefiningDeclaration() = %p \n",functionDeclaration->
get_firstNondefiningDeclaration());
26898 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration->get_definingDeclaration() = %p \n",functionDeclaration->
get_definingDeclaration());
26902 for (
size_t i = 0; i < functionDeclaration->get_args().size(); i++)
26906 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration->get_args(): (i = %zu) arg = %p = %s isDefaultArgument = %s \n",
26907 i,arg,arg->get_name().str(),arg->
get_file_info()->isDefaultArgument() ?
"true" :
"false");
26908 printf (
" --- arg->get_initializer() = %p \n",arg->get_initializer());
26912 printf (
"NOTE: default argument (i = %zu) not reproduced in function prototype: arg = %p = %s \n",i,arg,arg->get_name().str());
26925 if (templateInstantiationFunctionDecl == NULL)
26932 if (templateInstantiationMemberFunctionDecl == NULL)
26941 bool isTemplateInstantiationMemberFunctionDecl =
false;
26946 bool buildTemplateInstantiation =
false;
26947 SgTemplateArgumentPtrList* templateArgumentsList = NULL;
26952 ROSE_ASSERT(param_list == NULL || param_list->
get_parent() == NULL);
26954 switch (functionDeclaration->
variantT())
26956 case V_SgTemplateMemberFunctionDeclaration:
26959 printf (
"This function to replace the defining declaration with a non-defining declaration does not yet support template member functions \n");
26962 ROSE_ASSERT(original_templateMemberFunctionDeclaration != NULL);
26966 unsigned int functionConstVolatileFlags = 0;
26968 ROSE_ASSERT(original_templateMemberFunctionDeclaration->get_type() != NULL);
26973 SgMemberFunctionType* memberFunctionType = isSgMemberFunctionType(original_templateMemberFunctionDeclaration->get_type());
26974 ROSE_ASSERT(memberFunctionType != NULL);
26976 functionConstVolatileFlags = memberFunctionType->get_mfunc_specifier();
26982 SgTemplateParameterPtrList templateParameterList = original_templateMemberFunctionDeclaration->get_templateParameters();
26985 templateMemberFunctionDeclaration =
26988 printf (
"ERROR: Template functions are not yet supported! \n");
26991 nondefiningFunctionDeclaration = templateMemberFunctionDeclaration;
26993 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
26996 if (isConstructor ==
true)
26998 templateMemberFunctionDeclaration->get_specialFunctionModifier().setConstructor();
27004 case V_SgTemplateFunctionDeclaration:
27007 printf (
"This function to replace the defining declaration with a non-defining declaration does not yet support template functions \n");
27010 ROSE_ASSERT(original_templateFunctionDeclaration != NULL);
27018 SgTemplateParameterPtrList templateParameterList = original_templateFunctionDeclaration->get_templateParameters();
27022 printf (
"ERROR: Template functions are not yet supported! \n");
27025 nondefiningFunctionDeclaration = templateFunctionDeclaration;
27027 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27033 case V_SgTemplateInstantiationMemberFunctionDecl:
27035 buildTemplateInstantiation =
true;
27037 isTemplateInstantiationMemberFunctionDecl =
true;
27040 ROSE_ASSERT(templateInstantiationMemberFunctionDecl != NULL);
27043 printf (
"name from functionDeclaration->get_name(): name = %s \n",name.str());
27045 printf (
"name from templateInstantiationMemberFunctionDecl->get_templateName(): template_name = %s \n",templateInstantiationMemberFunctionDecl->
get_templateName().str());
27047 if (templateDeclaration != NULL)
27049 printf (
"name from templateInstantiationMemberFunctionDecl->get_template_declaration()->get_name(): template_name = %s \n",templateDeclaration->get_name().str());
27050 printf (
"name from templateInstantiationMemberFunctionDecl->get_template_declaration()->get_template_name(): template_name = %s \n",templateDeclaration->
get_template_name().str());
27057 printf (
"In case V_SgTemplateInstantiationMemberFunctionDecl: using name = %s \n",name.str());
27062 case V_SgMemberFunctionDeclaration:
27065 printf (
"This function to replace the defining declaration with a non-defining declaration does not yet support member functions \n");
27068 ROSE_ASSERT(original_memberFunctionDeclaration != NULL);
27076 unsigned int functionConstVolatileFlags = 0;
27078 ROSE_ASSERT(original_memberFunctionDeclaration->get_type() != NULL);
27087 bool buildPrototype = isTemplateInstantiationMemberFunctionDecl || original_memberFunctionDeclaration->
get_parent() == original_memberFunctionDeclaration->
get_scope();
27089 printf (
"In SageInterface::buildFunctionPrototype(): buildPrototype = %s \n",buildPrototype ?
"true" :
"false");
27091 if (buildPrototype ==
true)
27093 SgMemberFunctionType* memberFunctionType = isSgMemberFunctionType(original_memberFunctionDeclaration->get_type());
27094 ROSE_ASSERT(memberFunctionType != NULL);
27096 printf (
"original_memberFunctionDeclaration->get_parent() == original_memberFunctionDeclaration->get_scope() \n");
27098 functionConstVolatileFlags = memberFunctionType->get_mfunc_specifier();
27100 memberFunctionDeclaration =
27102 ( name, return_type, param_list, scope, python_decoratorList, functionConstVolatileFlags,
27103 buildTemplateInstantiation,templateArgumentsList );
27105 printf (
"ERROR: Member functions are not yet supported! \n");
27109 if (isConstructor ==
true)
27111 memberFunctionDeclaration->get_specialFunctionModifier().setConstructor();
27114 nondefiningFunctionDeclaration = memberFunctionDeclaration;
27116 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27122 printf (
"NOTE: Member functions defined outside of their class can not be output as member function prototypes (not allowed in C++) \n");
27126 nondefiningFunctionDeclaration = NULL;
27128 nondefiningFunctionDeclaration = NULL;
27130 replaceWithEmptyDeclaration =
true;
27132 ROSE_ASSERT(emptyDeclaration != NULL);
27141 printf (
"Exiting as a test! \n");
27151 case V_SgFunctionDeclaration:
27154 nondefiningFunctionDeclaration =
buildNondefiningFunctionDeclaration (name, return_type, param_list, scope, python_decoratorList, buildTemplateInstantiation,templateArgumentsList);
27155 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27160 case V_SgTemplateInstantiationFunctionDecl:
27163 buildTemplateInstantiation =
true;
27165 ROSE_ASSERT(templateInstantiationFunctionDecl != NULL);
27168 printf (
"name from functionDeclaration->get_name(): name = %s \n",name.str());
27170 printf (
"name from templateInstantiationFunctionDecl->get_templateName(): template_name = %s \n",templateInstantiationFunctionDecl->
get_templateName().str());
27172 if (templateDeclaration != NULL)
27174 printf (
"name from templateInstantiationFunctionDecl->get_template_declaration()->get_name(): template_name = %s \n",templateDeclaration->get_name().str());
27175 printf (
"name from templateInstantiationFunctionDecl->get_template_declaration()->get_template_name(): template_name = %s \n",templateDeclaration->
get_template_name().str());
27180 printf (
"In case V_SgTemplateInstantiationFunctionDecl: using name = %s \n",name.str());
27182 nondefiningFunctionDeclaration =
buildNondefiningFunctionDeclaration (name, return_type, param_list, scope, python_decoratorList, buildTemplateInstantiation,templateArgumentsList);
27183 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27202 ROSE_ASSERT(param_list == NULL || param_list->
get_parent() != NULL);
27208 if (nondefiningFunctionDeclaration != NULL)
27213 printf (
"Setting the firstNondefiningDeclaration \n");
27221 printf (
"Setting the definingDeclaration \n");
27230 if (nondefiningFunctionDeclaration != NULL)
27240 return nondefiningFunctionDeclaration;
27249 ROSE_ASSERT(functionDeclaration != NULL);
27252 printf (
"****************************************************************** \n");
27253 printf (
"Attached comments and CPP directives: defining functionDeclaration \n");
27255 printf (
"****************************************************************** \n");
27263 if (nondefiningFunctionDeclaration != NULL)
27274 if (templateInstantiationFunctionDecl == NULL)
27276 if (nondefiningFunctionDeclaration != NULL)
27279 nondefiningFunctionDeclaration->get_declarationModifier() = functionDeclaration->get_declarationModifier();
27282 nondefiningFunctionDeclaration->get_functionModifier() = functionDeclaration->get_functionModifier();
27283 nondefiningFunctionDeclaration->get_specialFunctionModifier() = functionDeclaration->get_specialFunctionModifier();
27285 nondefiningFunctionDeclaration->set_linkage( functionDeclaration->get_linkage() );
27286 nondefiningFunctionDeclaration->set_externBrace( functionDeclaration->get_externBrace() );
27288 ROSE_ASSERT(nondefiningFunctionDeclaration->get_forward() ==
true);
27291 int file_id = functionDeclaration->
get_file_info()->get_physical_file_id();
27292 nondefiningFunctionDeclaration->
get_file_info()->set_physical_file_id(file_id);
27308 ROSE_ASSERT(nondefiningFunctionDeclaration->
get_parent() != NULL);
27314 nondefiningFunctionDeclaration = NULL;
27318 if (functionDeclaration->get_declarationModifier().get_storageModifier().
isStatic() ==
true)
27320 ROSE_ASSERT(nondefiningFunctionDeclaration->get_declarationModifier().get_storageModifier().
isStatic() ==
true);
27324 return nondefiningFunctionDeclaration;
27328std::vector<SgFunctionDeclaration*>
27340 std::vector<SgFunctionDeclaration*> functionList;
27341 FunctionDefinitionsTraversal() {}
27343 void visit (
SgNode* node)
27346 if (functionDeclaration != NULL)
27352 if (functionDeclaration == definingFunctionDeclaration)
27356 if (functionDeclarationScope != NULL)
27358 functionList.push_back(functionDeclaration);
27366 FunctionDefinitionsTraversal traversal;
27368 traversal.traverseWithinFile(node, preorder);
27370 std::vector<SgFunctionDeclaration*> & functionList = traversal.functionList;
27372 return functionList;
27379 ROSE_ASSERT(node != NULL);
27382 std::vector<SgFunctionDeclaration*>::iterator i = functionList.begin();
27384 while (i != functionList.end())
27387 ROSE_ASSERT(functionDeclaration != NULL);
27405 ROSE_ASSERT(node !=
nullptr);
27411 void visit (
SgNode* node)
27414 if (variableDeclaration != NULL)
27417 SgExpression* initializer = initializedName->get_initializer();
27419 printf (
"variableDeclaration = %p initializedName = %p = %s initializer = %p \n",
27420 variableDeclaration,initializedName,initializedName->get_name().str(),initializer);
27422 if (initializer != NULL)
27424 printf (
" --- initializer = %s \n",initializer->
class_name().c_str());
27431 CheckInitializerTraversal traversal;
27432 traversal.traverse(node, preorder);
27440 void setResult(
SgType*) { }
27442 void handle(
SgNode& n,
SgNode&) { SG_UNEXPECTED_NODE(n); }
27444 template <
class SageDeclarationStatement>
27450 setResult(n.get_type());
27453 template <
class SageNode>
27454 void handle(SageNode& n)
27467 SgGlobal * gsaf = project->get_globalScopeAcrossFiles();
27468 ROSE_ASSERT(gsaf !=
nullptr);
27470 ROSE_ASSERT(st !=
nullptr);
27472 ROSE_ASSERT(hmm !=
nullptr);
27476 ROSE_ASSERT(st !=
nullptr);
27477 hmm = st->get_table();
27478 ROSE_ASSERT(hmm !=
nullptr);
27482 ROSE_ASSERT(st !=
nullptr);
27483 hmm = st->get_table();
27484 ROSE_ASSERT(hmm !=
nullptr);
27504 int match_count = 0;
27505 ROSE_ASSERT (root);
27509 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(root, V_SgArrowExp);
27513 boost::unordered::unordered_map <SgNode*, bool> visited;
27516 for (Rose_STL_Container<SgNode *>::reverse_iterator i = nodeList.rbegin(); i != nodeList.rend(); i++)
27519 if (visited.count(*i)==1)
27528 cerr<<
"SageInterface::normalizeArrowExpWithAddressOfLeftOperand() expects SgArrowExp while encountering "<<(*i)->class_name()<<
"@"<<(*i) <<endl;
27529 ROSE_ASSERT (a_exp);
27532 if (transformationGeneratedOnly)
27540 if (
SgVarRefExp* left = isSgVarRefExp(address_op->get_operand()))
27553 return match_count;
27563 Traversal() : found(
false) {}
27564 void visit (
SgNode* node)
27566 SgCastExp* castExpression = isSgCastExp(node);
27567 if (castExpression != NULL)
27571 if (initializer == NULL)
27576 printf (
" --- Found a SgCastExp marked as a transformation: castExpression = %p \n",castExpression);
27579 printf (
"Exiting as a test! \n");
27580 ROSE_ASSERT(
false);
27586 printf (
" --- SgCastExp (but not marked as a transformation) node = %p = %s \n",node,node->
class_name().c_str());
27594 printf (
" --- SgCastExp (but from an initializer) node = %p = %s \n",node,node->
class_name().c_str());
27601 printf (
" --- node = %p = %s \n",node,node->
class_name().c_str());
27608 printf (
"In findFirstSgCastExpMarkedAsTransformation(): s = %s \n",s.c_str());
27612 Traversal traversal;
27613 traversal.traverse(n, preorder);
27616 printf (
"In findFirstSgCastExpMarkedAsTransformation(): s = %s traversal.found = %s \n",s.c_str(),traversal.found ?
"true" :
"false");
27620 if (traversal.found ==
true)
27622 printf (
"In findFirstSgCastExpMarkedAsTransformation(): returning false \n");
27627 return traversal.found;
27638 ROSE_ASSERT (info != NULL);
27639 PreprocessingInfo::DirectiveType dtype= info->getTypeOfDirective();
27640 if (dtype == PreprocessingInfo::CpreprocessorIfdefDeclaration ||
27641 dtype == PreprocessingInfo::CpreprocessorIfndefDeclaration ||
27642 dtype == PreprocessingInfo::CpreprocessorIfDeclaration )
27646 else if (dtype==PreprocessingInfo::CpreprocessorElseDeclaration||
27647 dtype==PreprocessingInfo::CpreprocessorElifDeclaration)
27651 else if (dtype==PreprocessingInfo::CpreprocessorEndifDeclaration)
27660static void moveInofListToNewPlace(AttachedPreprocessingInfoType* infoList,
int cidx, set <AttachedPreprocessingInfoType*>& relatedInfoList,
SgLocatedNode* lnode,
int &retVal)
27665 relatedInfoList.insert (infoList);
27669 info->setRelativePosition(PreprocessingInfo::after);
27676 (*infoList)[cidx]= NULL;
27683 ROSE_ASSERT(lnode);
27689 vector < pair< AttachedPreprocessingInfoType*, int> > empty_entries;
27690 for(;ast_i!=ast.
end();++ast_i) {
27692 if (current ==NULL )
27696 if (infoList == NULL)
continue;
27698 int commentIndex=0;
27699 for (Rose_STL_Container<PreprocessingInfo*>::iterator ci = (*infoList).begin(); ci != (*infoList).end(); ci++)
27705 empty_entries.push_back( make_pair (infoList, commentIndex) );
27711 for (
auto ki = empty_entries.rbegin(); ki != empty_entries.rend(); ki ++)
27713 AttachedPreprocessingInfoType* infoList = (*ki).first;
27714 int cidx= (*ki).second;
27717 ROSE_ASSERT (info==NULL);
27720 AttachedPreprocessingInfoType::iterator k = infoList->begin();
27721 infoList->erase(k+cidx);
27731static std::unordered_map <PreprocessingInfo*, SageInterface::PreprocessingInfoData> infoMap;
27736 if (current == NULL)
27742 vector<PreprocessingInfo*> afterList;
27745 AttachedPreprocessingInfoType* comments = locatedNode->getAttachedPreprocessingInfo();
27747 if (comments !=
nullptr)
27749 AttachedPreprocessingInfoType::iterator i;
27751 for (i = comments->begin (); i != comments->end (); i++)
27757 data.container=comments;
27759 data.depth = depth;
27762 if (info->getRelativePosition () == PreprocessingInfo::before
27765 infoList.push_back (info);
27766 infoMap[info] = data;
27771 else if (info->getRelativePosition () == PreprocessingInfo::after
27772 || info->getRelativePosition () == PreprocessingInfo::inside
27775 afterList.push_back (info);
27776 infoMap[info] = data;
27780 mlog[Sawyer::Message::Common::WARN] <<
"Warning: unhandled relative position value:" <<info->getRelativePosition () <<endl;
27791 for (
auto c: children)
27795 for (
auto fi : afterList)
27796 infoList.push_back(fi);
27810 ROSE_ASSERT(lnode);
27826 vector < pair< AttachedPreprocessingInfoType*, int> > keepers;
27830 unordered_map < PreprocessingInfo * , vector< pair<AttachedPreprocessingInfoType*, int>> > associated_directives;
27835 vector< pair<AttachedPreprocessingInfoType*, int>> associated_erase;
27843 vector<PreprocessingInfo*> candidateInfoList;
27848 for (
auto candidate: candidateInfoList)
27855 if (infoMap[info].depth ==0)
27858 int commentIndex = infoMap[info].index;
27859 AttachedPreprocessingInfoType* infoList = infoMap[info].container;
27862 if ( isBeginDirective(info) == 1)
27864 keepers.push_back(make_pair (infoList,commentIndex));
27867 else if (isBeginDirective(info) == 2)
27872 if (keepers.size()==0)
27873 keepers.push_back(make_pair (infoList, commentIndex));
27874 else if (isBeginDirective( (*(keepers.back().first))[keepers.back().second] )!=1 )
27876 keepers.push_back(make_pair (infoList,commentIndex));
27878 else if(isBeginDirective( (*(keepers.back().first))[keepers.back().second] )==1 )
27880 PreprocessingInfo* begin_info = (*(keepers.back().first))[keepers.back().second];
27882 associated_directives[begin_info].push_back(make_pair (infoList,commentIndex));
27886 else if ( isBeginDirective(info) == -1)
27888 bool neutralized =
false;
27890 if (keepers.size()>0)
27892 AttachedPreprocessingInfoType* comments = keepers.back().first;
27893 int idx = keepers.back().second;
27895 if(isBeginDirective( (*comments)[idx] )==1)
27897 keepers.pop_back();
27898 neutralized =
true;
27903 keepers.push_back(make_pair (infoList,commentIndex));
27911 for(;ast_i!=ast.
end();++ast_i) {
27913 if (current ==NULL )
27917 if (infoList == NULL)
continue;
27919 int commentIndex=0;
27920 for (Rose_STL_Container<PreprocessingInfo*>::iterator ci = (*infoList).begin(); ci != (*infoList).end(); ci++)
27922 ROSE_ASSERT(*ci != NULL);
27928 if ( isBeginDirective(info) == 1)
27930 keepers.push_back(make_pair (infoList,commentIndex));
27933 else if (isBeginDirective(info) == 2)
27938 if (keepers.size()==0)
27939 keepers.push_back(make_pair (infoList,commentIndex));
27940 else if (isBeginDirective( (*(keepers.back().first))[keepers.back().second] )!=1 )
27942 keepers.push_back(make_pair (infoList,commentIndex));
27944 else if(isBeginDirective( (*(keepers.back().first))[keepers.back().second] )==1 )
27946 PreprocessingInfo* begin_info = (*(keepers.back().first))[keepers.back().second];
27948 associated_directives[begin_info].push_back(make_pair (infoList,commentIndex));
27952 else if ( isBeginDirective(info) == -1)
27954 bool neutralized =
false;
27956 if (keepers.size()>0)
27958 AttachedPreprocessingInfoType* comments = keepers.back().first;
27959 int idx = keepers.back().second;
27961 if(isBeginDirective( (*comments)[idx] )==1)
27963 keepers.pop_back();
27964 neutralized =
true;
27969 keepers.push_back(make_pair (infoList,commentIndex));
27976 set <AttachedPreprocessingInfoType*> relatedInfoList;
27979 for (
auto ki = keepers.begin(); ki != keepers.end(); ki ++)
27981 AttachedPreprocessingInfoType* infoList = (*ki).first;
27982 int cidx= (*ki).second;
27984 relatedInfoList.insert (infoList);
27988 info->setRelativePosition(PreprocessingInfo::after);
27995 if (associated_directives.count (info)!=0)
27997 vector<pair<AttachedPreprocessingInfoType*,int>> a_list_vec = associated_directives[info];
27998 for (
auto vec_i = a_list_vec.rbegin(); vec_i != a_list_vec.rend(); vec_i ++ )
28000 AttachedPreprocessingInfoType* a_infoList = (*vec_i).first;
28001 int aidx= (*vec_i).second;
28002 moveInofListToNewPlace (a_infoList, aidx, relatedInfoList, lnode, retVal);
28003 associated_erase.push_back(make_pair (a_infoList, aidx));
28009 (*infoList)[cidx]= NULL;
to specify a construct using a specifier Can be used alone or with parent handles when relative speci...
virtual void * getNode() const
Get the raw IR node associated with the current abstract node.
Base class for all IR node attribute values.
Attribute Evaluator for synthesized attributes.
SynthesizedAttributeType traverse(SgNode *node)
evaluates attributes on the entire AST
Attribute storing an SgNode.
Class for traversing the AST.
void traverse(SgNode *node, Order treeTraversalOrder)
traverse the entire AST. Order defines preorder (preorder) or postorder (postorder) traversal....
void visit(SgNode *astNode)
this method is called at every traversed node.
void visit(SgNode *astNode)
visitor function for each node to collect non-builtin types' declarations
void visit(SgNode *astNode)
this method is called at every traversed node.
For preprocessing information including source comments, include , if, define, etc.
RelativePositionType
MK: Enum type to store if the directive goes before or after the corresponding line of source code.
Interface for iterating over an AST.
iterator begin()
Iterator positioned at root of subtree.
iterator end()
Iterator positioned at the end of the traversal.
const Digest & digest() override
Return the digest.
void insert(const std::string &x)
Insert data into the digest.
uint64_t make64Bits()
Returns the hash as a 64 bit int.
void visit(SgNode *node)
this method is called at every traversed node.
Interface for creating a statement whose computation writes its answer into a given variable.
A persistent attribute to represent a unique name for an expression.
SgName get_name() const override
Access function for getting name from declarations or types internally.
Base class for binary files.
SgAsmGenericHeaderList *const & get_headers() const
Property: List of all headers in file.
SgAsmInterpretationPtrList const & get_interpretations() const
Property: Interpretation list.
Represents an interpretation of a binary container.
This class represents the concept of a C Assembler statement.
This class represents the rhs of a variable declaration which includes an optional assignment (e....
void set_operand(SgExpression *exp)
This sets the rhs expression.
SgExpression * get_operand() const
Returns the rhs.
This class represents the concept of a block (not a basic block from control flow analysis).
const SgStatementPtrList & get_statements() const
Returns a const STL list by reference.
static void traverseMemoryPoolNodes(ROSE_VisitTraversal &visit)
FOR INTERNAL USE Support for visitor pattern over all IR nodes by type of IR node.
This class represents the notion of a binary operator. It is derived from a SgExpression because oper...
SgExpression * get_lhs_operand() const
returns SgExpression pointer to the lhs operand associated with this binary operator.
void set_rhs_operand(SgExpression *exp)
This function allows the p_rhs_operand pointer to be set (used internally).
void set_lhs_operand(SgExpression *exp)
This function allows the p_lhs_operand pointer to be set (used internally).
SgExpression * get_rhs_operand_i() const
returns SgExpression pointer to the operand associated with this binary operator.
SgExpression * get_lhs_operand_i() const
returns SgExpression pointer to the operand associated with this binary operator.
virtual VariantT variantT() const override
returns new style SageIII enum values
SgExpression * get_rhs_operand() const
returns SgExpression pointer to the rhs operand associated with this binary operator.
This class represents a boolean value (expression value).
This class represents the notion of a break statement (typically used in a switch statment).
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the concept of a C and C++ case option (used within a switch statement).
SgStatement * get_body() const
Returns pointer to a SgBasicBlock object.
void set_key(SgExpression *key)
Access function for pointer to SgExpression object wrapped by SgExpressionRoot in p_key_root.
void set_body(SgStatement *body)
Access function for p_body.
SgExpression * get_key() const
Returns pointer to a SgExpression object wrapped by SgExpressionRoot in p_key_root.
This class represents a cast of one type to another.
SgType * get_type() const override
unparsing support for pragmas
This class represents the concept of a catch within a try-catch construct used in C++ exception handl...
void set_body(SgStatement *body)
Access function for p_body.
SgStatement * get_body() const
Access function for p_body.
This class represents the concept of a class declaration statement. It includes the concept of an ins...
void set_scope(SgScopeStatement *scope) override
Support for setting scopes (only meaningful on IR statements that store the scope explicitly).
virtual std::string class_name() const override
returns a string representing the class name
virtual SgSymbol * get_symbol_from_symbol_table() const override
FOR INTERNAL USE Get the associated symbol from the symbol table in the stored scope....
SgScopeStatement * get_scope() const override
Returns scope of current statement.
This class represents the concept of a class definition in C++.
SgClassDeclaration * get_declaration() const
returns the class declaration associated with this class decinition.
const SgDeclarationStatementPtrList & get_members() const
Returns a const list to the data member declarations.
virtual std::string class_name() const override
returns a string representing the class name
This class represents the concept of a C++ expression built from a class name.
SgClassSymbol * get_symbol() const
Returns pointer to SgSymbol.
This class represents the concept of a class name within the compiler.
SgName get_name() const override
Access function for getting name from declarations or types internally.
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
static SgClassType * createType(SgDeclarationStatement *decl=NULL, SgExpression *optional_fortran_type_kind=NULL)
more sophisticated version for more complex types like SgClassType (types whose constructors take par...
This class represents the concept of a C trinary conditional expression (e.g. "test ?...
SgExpression * get_true_exp() const
Access function for p_true_exp.
void set_false_exp(SgExpression *false_exp)
Access function for p_false_exp.
SgExpression * get_conditional_exp() const
Access function for p_conditional_exp.
SgExpression * get_false_exp() const
Access function for p_false_exp.
void set_true_exp(SgExpression *true_exp)
Access function for p_true_exp.
void set_conditional_exp(SgExpression *conditional_exp)
Access function for p_conditional_exp.
This class represents the call of a class constructor to initialize a variable. For example "Foo foo;...
SgType * get_expression_type() const
Access function for p_expression_type, returns pointer to SgType associated with constructor.
This class represents the concept of a C or C++ continue statement.
Supporting class from copy mechanism within ROSE.
This class represents the concept of a contructor initializer list (used in constructor (member funct...
bool isFriend() const
declaration modifier is friend.
This class represents the concept of a declaration statement.
SgSymbol * search_for_symbol_from_symbol_table() const
User interface for retrieving the associated symbol from the declaration.
void set_definingDeclaration(SgDeclarationStatement *definingDeclaration)
This is an access function for the SgDeclarationStatement::p_definingDeclaration data member (see tha...
void set_firstNondefiningDeclaration(SgDeclarationStatement *firstNondefiningDeclaration)
This is an access function for the SgDeclarationStatement::p_firstNondefiningDeclaration data member ...
SgDeclarationStatement * get_definingDeclaration() const
This is an access function for the SgDeclarationStatement::p_definingDeclaration data member (see tha...
virtual VariantT variantT() const override
returns new style SageIII enum values
virtual std::string class_name() const override
returns a string representing the class name
bool isForward() const
Returns boolean value indicating if this is a forward declaration.
SgDeclarationStatement * get_firstNondefiningDeclaration() const
This is an access function for the SgDeclarationStatement::p_firstNondefiningDeclaration data member ...
virtual SgSymbol * get_symbol_from_symbol_table() const override
FOR INTERNAL USE Get the associated symbol from the symbol table in the stored scope....
bool hasAssociatedSymbol() const
Returns boolean value true of this type of declaration has an associated sysmbol.
SgName get_template_name() const
This function returns the template name (taken from the template declaration for the class,...
This class represents the concept of a C or C++ default case within a switch statement.
void set_body(SgStatement *body)
Access function for p_body.
SgStatement * get_body() const
Returns pointer to SgBasicBlock.
This class represents a directory within a projects file structure of files and directories.
This class represents the concept of a do-while statement.
SgStatement * get_condition() const
Access function for p_condition.
SgStatement * get_body() const
Access function for p_body.
void set_condition(SgStatement *condition)
Access function for p_condition.
void set_body(SgStatement *body)
Access function for p_body.
This class represents the notion of an value (expression value).
This class represents the concept of an enum declaration.
SgScopeStatement * get_scope() const override
Access function for p_scope.
SgName get_name() const
Access function for p_name.
void set_scope(SgScopeStatement *scope) override
Access function for p_scope.
const SgInitializedNamePtrList & get_enumerators() const
Access function for p_enumerators.
This class represents the concept of a C and C++ expression list.
int replace_expression(SgExpression *o, SgExpression *n) override
This class represents the base class of all the expressions within this grammar.
This class represents the concept of a C or C++ statement which contains a expression.
This class represents the notion of an expression. Expressions are derived from SgLocatedNodes,...
virtual std::string class_name() const override
returns a string representing the class name
void set_need_paren(bool need_paren)
This function allows the p_need_paren flag to be set (used internally).
virtual VariantT variantT() const override
returns new style SageIII enum values
virtual SgType * get_type() const
unparsing support for pragmas
virtual int replace_expression(SgExpression *oldChild, SgExpression *newChild)
This class represents the base class of all the expressions within this grammar.
virtual const char * sage_class_name() const override
virtual Sg_File_Info * get_file_info(void) const override
Interface function to implement original SAGE interface to SgFile_Info objects.
void set_lvalue(bool lvalue)
This function allows the p_lvalue flag to be set (used internally).
bool get_lvalue() const
Returns a bool value if the current expression is assigned to.
This class represents a source file for a project (which may contian many source files and or directo...
std::string getFileName() const
associated filename
Sg_File_Info * get_file_info() const override
Access function calling get_startOfConstruct(), provided to support older interface.
This class represents the notion of an value (expression value).
This class represents the variable declaration or variable initialization withn a for loop.
const SgStatementPtrList & get_init_stmt() const
Returns const reference to a SgStatementPtrList (typedef to a STL list).
This class represents the concept of a for loop.
SgExpression * get_test_expr() const
Access function for p_test_expr_root.
SgForInitStatement * get_for_init_stmt() const
Access function for p_for_init_stmt.
void set_loop_body(SgStatement *loop_body)
Access function for p_loop_body.
SgStatement * get_loop_body() const
Access function for p_loop_body.
void set_for_init_stmt(SgForInitStatement *for_init_stmt)
Access function for p_for_init_stmt.
This class represents the concept of a C++ function call (which is an expression).
SgFunctionSymbol * getAssociatedFunctionSymbol() const
Returns the associated function symbol, if it can be resolved statically.
SgFunctionDeclaration * getAssociatedFunctionDeclaration() const
Returns the associated function declaration, if it can be resolved statically.
virtual std::string class_name() const override
returns a string representing the class name
This class represents the concept of a function declaration statement.
SgScopeStatement * get_scope() const override
Returns scope of current statement.
virtual SgSymbol * get_symbol_from_symbol_table() const override
FOR INTERNAL USE Get the associated symbol from the symbol table in the stored scope....
bool isTemplateFunction() const
Determines if function is a template or non-template function.
void set_scope(SgScopeStatement *scope) override
Support for setting scopes (only meaningful on IR statements that store the scope explicitly).
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the concept of a scope in C++ (e.g. global scope, fuction scope,...
virtual std::string class_name() const override
returns a string representing the class name
SgBasicBlock * get_body() const
Access function for p_body.
This class represents the concept of a declaration list.
const SgInitializedNamePtrList & get_args() const
Access function for p_args.
const SgTypePtrList & get_arguments() const
Get a const list of input types (types of the parameters list) to this function type (from a cost fun...
This class represents the function being called and must be assembled in the SgFunctionCall with the ...
SgFunctionDeclaration * getAssociatedFunctionDeclaration() const
Returns the associated function declaration, if it can be resolved statically.
SgName get_name() const override
Access function for getting name from declarations or types internally.
This class represents the function type table (stores all function types so that they can be shared i...
SgSymbolTable * get_function_type_table() const
Returns pointer to SgSymbolTable used for function type symbols only.
This class represents a type for all functions.
virtual std::string class_name() const override
returns a string representing the class name
const SgTypePtrList & get_arguments() const
This is a const convience access function to the STL container of types in the child IR node (SgFunct...
virtual SgName get_mangled(void) const override
Mangled name support for unparser support.
This class represents the concept of a namespace definition.
virtual std::string class_name() const override
returns a string representing the class name
const SgDeclarationStatementPtrList & get_declarations() const
Returns a const list to the global scope declarations.
This class represents the concept of a C or C++ goto statement.
SgLabelStatement * get_label() const
Returns pointer to SgLabelStatement where control flow will be transfered during execution.
void set_label(SgLabelStatement *label)
Access function for p_label.
InheritedAttributeType traverse(SgGraphNode *basenode, SgIncidenceDirectedGraph *g, InheritedAttributeType inheritedValue, InheritedAttributeType nullInherit, SgGraphNode *endnode, bool insep=false, bool pcHk=false)
This is the function that is used by the user directly to start the algorithm.
This class represents the concept of an "if" construct.
void set_false_body(SgStatement *false_body)
Access function for p_false_body.
virtual std::string class_name() const override
returns a string representing the class name
void set_true_body(SgStatement *true_body)
Access function for p_true_body.
SgStatement * get_conditional() const
Access function for p_conditional.
SgStatement * get_true_body() const
Access function for p_true_body.
SgStatement * get_false_body() const
Access function for p_false_body.
void set_conditional(SgStatement *conditional)
Access function for p_conditional.
This class represents the notion of a declared variable.
SgName get_qualified_name() const
Returns the name with appropriate qualified names representing nested scopes.
SgSymbol * get_symbol_from_symbol_table() const
Get the associated SgSymbol from the symbol table located in the scope, without considering possible ...
virtual std::string class_name() const override
returns a string representing the class name
SgDeclarationStatement * get_declaration() const
Equal operator : it checks if all the data members are the same or point to the same objects.
This class represents the notion of an initializer for a variable declaration or expression in a func...
This class represents the concept of a C or C++ label statement.
SgName get_label() const
Returns SgName by value.
SgScopeStatement * get_scope() const override
Returns scope of current statement.
void set_scope(SgScopeStatement *scope) override
Support for setting scopes (only meaningful on IR statements that store the scope explicitly).
label_type_enum
Type of label used (fortran only)
SgName get_name() const override
Access function for getting name from declarations or types internally.
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the notion of an expression or statement which has a position within the source...
virtual std::string class_name() const override
returns a string representing the class name
virtual const char * sage_class_name() const override
Sg_File_Info * get_endOfConstruct() const override
New function interface for Sg_File_Info data stores ending location of contruct (typically the closin...
void setTransformation()
Allow IR nodes (mostly SgLocatedNode) to be marked as a transformation.
virtual void addNewAttribute(std::string s, AstAttribute *a) override
Add a new attribute represented by the named string.
void set_endOfConstruct(Sg_File_Info *endOfConstruct)
This function sets the current source location position of the end of the current construct.
Sg_File_Info * get_startOfConstruct() const override
New function interface for Sg_File_Info data stores starting location of contruct (typically the open...
void addToAttachedPreprocessingInfo(PreprocessingInfo *prepInfoPtr, PreprocessingInfo::RelativePositionType locationInList=PreprocessingInfo::after)
This function adds comment or CPP directives to the current IR node.
virtual AstAttribute * getAttribute(std::string s) const override
Returns attribute of name 's'.
void set_startOfConstruct(Sg_File_Info *startOfConstruct)
This function sets the current source location position of the start of the current construct.
bool isCompilerGenerated() const
Simple test for if this is a compiler generated node.
void insertToAttachedPreprocessingInfo(PreprocessingInfo *prepInfoPtr, PreprocessingInfo *anchorInfoPtr, bool insertAfter=true)
Insert prepInfo After (or before if last parameter is false) an anchor info ptr in the list of prepro...
virtual VariantT variantT() const override
returns new style SageIII enum values
void setOutputInCodeGeneration()
Allow IR nodes (mostly SgLocatedNode) to be marked as to when the information was unavilable in the f...
virtual Sg_File_Info * get_file_info() const override
Interface function to implement original SAGE interface to SgFile_Info objects.
bool isTransformation() const
Simple test for if this is a part of a transformation.
AttachedPreprocessingInfoType *& getAttachedPreprocessingInfo(void)
Computes the number of nodes in the defined subtree of the AST.
This class represents the notion of an value (expression value).
This class represents the concept of a member function declaration statement.
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the member function being called and must be assembled in the SgFunctionCall wi...
SgMemberFunctionDeclaration * getAssociatedMemberFunctionDeclaration() const
This is helpful in chasing down the associated declaration to this member function reference.
SgName get_name() const override
Access function for getting name from declarations or types internally.
SgTypeModifier & get_typeModifier()
Access function for modifier.
This class represents strings within the IR nodes.
virtual SgName get_name() const
Gets name of the type (useful for debugging, unparsing, etc.)
SgName get_qualified_name() const
Used for the SgNamedType object (base class for the SgClassType, SgTypedefType and the SgEnumType obj...
This class represents the concept of a C++ namespace alias declaration statement.
SgName get_name() const
Access function for p_name.
SgNamespaceDeclarationStatement * get_namespaceDeclaration() const
Access function for p_namespaceDeclaration.
This class represents the concept of a C++ namespace declaration.
virtual SgSymbol * get_symbol_from_symbol_table() const override
FOR INTERNAL USE Get the associated symbol from the symbol table in the stored scope....
SgName get_name() const
Access function for p_name.
SgNamespaceDefinitionStatement * get_definition() const
Returns pointer to SgNamespaceDefinitionStatement.
This class represents the concept of a namespace definition.
This class represents the concept of a namespace name within the compiler.
This class represents the base class for all IR nodes within Sage III.
static SgTypeTable * get_globalTypeTable()
Access function for symbol table specific to non-function types.
virtual std::vector< std::string > get_traversalSuccessorNamesContainer() const
container of names of variables or container indices used used in the traversal to access AST success...
SgNode * get_parent() const
Access function for parent node.
void set_isModified(bool isModified)
All nodes in the AST contain a isModified flag used to track changes to the AST.
virtual std::vector< SgNode * > get_traversalSuccessorContainer() const
container of pointers to AST successor nodes used in the traversal overridden in every class by gener...
virtual VariantT variantT() const
returns new style SageIII enum values
void set_parent(SgNode *parent)
All nodes in the AST contain a reference to a parent node.
virtual std::string unparseToString(SgUnparse_Info *info) const
This function unparses the AST node (excluding comments and unnecessary white space)
virtual std::string class_name() const
returns a string representing the class name
static std::map< SgNode *, std::string > & get_globalMangledNameMap()
Access function for performance optimizing global mangled name map.
virtual void checkDataMemberPointersIfInMemoryPool()
FOR INTERNAL USE This is used in internal tests to verify that all IR nodes are allocated from the he...
virtual AstAttribute * getAttribute(std::string s) const
Returns attribute of name 's'.
static SgFunctionTypeTable * get_globalFunctionTypeTable()
Access function for symbol table specific to function types.
virtual Sg_File_Info * get_file_info(void) const
File information containing filename, line number, column number, and if the SgNode is a part of a ne...
virtual bool attributeExists(std::string s) const
Tests if attribute of name 's' is present.
virtual std::vector< std::pair< SgNode *, std::string > > returnDataMemberPointers() const
FOR INTERNAL USE Returns STL vector of pairs of SgNode* and strings for use in AST tools
virtual void addNewAttribute(std::string s, AstAttribute *a)
Add a new attribute represented by the named string.
static std::map< std::string, uint64_t > & get_shortMangledNameCache()
Access function for lower level optimizing of global mangled name map.
bool get_isModified() const
Acess function for isModified flag.
SgName get_name() const override
Support for some classes which have pure virtual function in base classes.
This class represents the concept of a C Assembler statement (untested).
Sg_File_Info * get_startOfConstruct() const override
New function interface for Sg_File_Info data stores starting location of contruct (typically the open...
This class represents a source project, with a list of SgFile objects and global information about th...
std::vector< std::string > getAbsolutePathFileNames() const
This function generates a list of files resolved to absolute paths (symbolic links should not be reso...
static void visitRepresentativeNode(ROSE_VisitTraversal &visit)
FOR INTERNAL USE Support for type-based traversal.
static int get_verbose(void)
DQ: Modified to accept a value on the command line (no longer a boolean variable) value of 0 means qu...
This class represents a OLD concept of the structure require for qualified names when they were in th...
This class represents the concept of a C Assembler statement (untested).
This class represents the concept of a scope in C++ (e.g. global scope, fuction scope,...
bool supportsDefiningFunctionDeclaration()
Reports if scope can support defining function declarations. Not all scopes permit function declarati...
const SgStatementPtrList generateStatementList() const
Generate s list of statements from either the existing list of statements or the list of declarations...
bool isNamedScope()
Some scopes have associated names for purposed of name qualification. This returns true if the scope ...
SgSymbolTable * get_symbol_table() const
Returns a pointer to the locally strored SgSymbolTable.
virtual const char * sage_class_name() const override
SgDeclarationStatementPtrList & getDeclarationList()
Gets reference to internal STL list of pointers to SgDeclarationStatement objects (only defined for s...
SgStatementPtrList & getStatementList()
Gets reference to internal STL list of pointers to SgStatement objects (only defined for scopes conta...
void append_statement(SgStatement *stmt)
Higher level function to handle statements and declarations is scopes.
void set_symbol_table(SgSymbolTable *symbol_table)
Sets the pointer to the locally strored SgSymbolTable.
virtual std::string class_name() const override
returns a string representing the class name
bool statementExistsInScope(SgStatement *statement)
Test for existence of statement is scope.
bool containsOnlyDeclarations() const
This function is used to indicate if either the getDeclarationList() or getStatementList() can be cal...
void insert_symbol(const SgName &n, SgSymbol *s)
Puts a SgSymbol object into the local symbol table.
virtual VariantT variantT() const override
returns new style SageIII enum values
virtual SgName get_qualified_name() const
Returns SgName (a string) representing the name of the current scope.
This class represents the "sizeof()" operator (applied to any type).
static void traverseMemoryPoolNodes(ROSE_VisitTraversal &visit)
FOR INTERNAL USE Support for visitor pattern over all IR nodes by type of IR node.
This class represents the notion of a statement.
virtual std::string class_name() const override
returns a string representing the class name
void insert_statement(SgStatement *target, SgStatement *newstmt, bool inFront=true)
This function inserts a single statement at the position indicated by target.
virtual void set_scope(SgScopeStatement *newScope)
Support for setting scopes (only meaningful on IR statements that store the scope explicitly).
virtual bool hasExplicitScope() const
Support for where the scope is explicitly required.
virtual SgSymbol * get_symbol_from_symbol_table() const
Get the associated symbol from the symbol table in the stored scope.
virtual SgScopeStatement * get_scope(void) const
Returns scope of current statement.
void remove_statement(SgStatement *)
This function removes the target statement from the AST.
virtual std::vector< SgNode * > get_traversalSuccessorContainer() const override
container of pointers to AST successor nodes used in the traversal overridden in every class by gener...
void replace_statement(SgStatement *target, SgStatement *newstmt)
This function replaces the target statement with a single statement.
virtual VariantT variantT() const override
returns new style SageIII enum values
bool isStatic() const
Storage modifier is static (always false for the SgStorageModifier in the SgInitializedName).
This class represents the base class of a numbr of IR nodes that don't otherwise fit into the existin...
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the concept of a switch.
void set_item_selector(SgStatement *item_selector)
Access function for p_item_selector.
SgStatement * get_body() const
Access function for p_body.
SgStatement * get_item_selector() const
Access function for p_item_selector_root.
void set_body(SgStatement *body)
Access function for p_body.
This class represents the symbol tables used in both SgScopeStatement and the SgFunctionTypeSymbolTab...
std::set< SgNode * > get_symbols() const
Complexity O(n)
void print(std::string label, VariantT nodeType=V_SgSymbol)
Outputs symbol table information (useful for debugging)
int size() const
Computes the number of symbols in the symbol table (forced to count them, I think,...
void remove(const SgSymbol *symbol)
Complexity O(n)
This class represents the concept of a name within the compiler.
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
virtual SgName get_name() const =0
Access function for getting name from declarations or types internally.
virtual SgType * get_type() const =0
This function returns the type associated with the named entity.
This class represents template argument within the use of a template to build an instantiation.
SgExpression * get_expression() const
This function returns argumentExpression.
SgType * get_type() const
This function returns argumentType.
SgTemplateArgument::template_argument_enum get_argumentType() const
This function returns argumentType.
@ template_template_argument
@ start_of_pack_expansion_argument
This class represents the concept of a template declaration.
SgName get_string() const
Returns stringified template declaration.
virtual std::string class_name() const override
returns a string representing the class name
SgName get_name() const
Returns name of template declaration.
SgScopeStatement * get_scope() const override
Returns scope of current statement.
virtual SgSymbol * get_symbol_from_symbol_table() const override
FOR INTERNAL USE Get the associated symbol from the symbol table in the stored scope....
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the concept of an instantiated class template.
virtual std::string class_name() const override
returns a string representing the class name
virtual SgSymbol * get_symbol_from_symbol_table() const override
FOR INTERNAL USE Get the associated symbol from the symbol table in the stored scope....
SgName get_templateName() const
Returns name of class template, the name excludes template arguments.
SgTemplateClassDeclaration * get_templateDeclaration() const
Returns pointer to SgTemplateDeclaration from which instantiation is generated.
This class represents the concept of a class definition in C++.
This class represents the concept of a C++ template instantiation directive.
SgDeclarationStatement * get_declaration() const
Returns pointer to SgDeclarationStatement.
This class represents the concept of an instantiation of function template.
virtual std::string class_name() const override
returns a string representing the class name
const SgTemplateArgumentPtrList & get_templateArguments() const
Returns pointer to STL list of pointers to SgTemplateArgument objects.
SgTemplateFunctionDeclaration * get_templateDeclaration() const
Returns pointer to SgTemplateDeclaration from which instantiation is generated.
SgName get_templateName() const
Returns name of instantiated function template, name includes template arguments.
This class represents the concept of an instantiation of member function template or a member functio...
virtual std::string class_name() const override
returns a string representing the class name
const SgTemplateArgumentPtrList & get_templateArguments() const
Returns pointer to STL list of pointers to SgTemplateArgument objects.
SgName get_templateName() const
Returns name of instantiated function template, name includes template arguments.
SgTemplateMemberFunctionDeclaration * get_templateDeclaration() const
Returns pointer to SgTemplateDeclaration from which instantiation is generated.
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the "this" operator (can be applied to any member data).
Supporting class for "Deep" copies of the AST.
static SgTypeBool * createType(SgExpression *optional_fortran_type_kind=nullptr)
example of type used where construction is particularly simple
static SgTypeInt * createType(int sz=0, SgExpression *optional_fortran_type_kind=NULL)
more sophisticated version for more complex types like SgTypeInt (types whose constructors take param...
static SgTypeUnknown * createType(SgExpression *optional_fortran_type_kind=nullptr)
example of type used where construction is particularly simple
static SgTypeVoid * createType(SgExpression *optional_fortran_type_kind=nullptr)
example of type used where construction is particularly simple
This class represents the base class for all types.
std::vector< SgType * > getInternalTypes() const
Generate a container of types hidden in the input type.
SgType * stripType(unsigned char bit_array=STRIP_MODIFIER_TYPE|STRIP_REFERENCE_TYPE|STRIP_RVALUE_REFERENCE_TYPE|STRIP_POINTER_TYPE|STRIP_ARRAY_TYPE|STRIP_TYPEDEF_TYPE|STRIP_POINTER_MEMBER_TYPE) const
Returns hidden type beneath layers of typedefs, pointers, references, modifiers, array representation...
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the notion of a typedef declaration.
SgScopeStatement * get_scope() const override
Returns scope of current statement.
virtual SgSymbol * get_symbol_from_symbol_table() const override
FOR INTERNAL USE Get the associated symbol from the symbol table in the stored scope....
SgDeclarationStatement * get_baseTypeDefiningDeclaration() const
Returns the defining declaration if get_typedefBaseTypeContainsDefiningDeclaration() is true,...
void set_scope(SgScopeStatement *scope) override
Support for setting scopes (only meaningful on IR statements that store the scope explicitly).
SgType * get_base_type() const
This is used in the SgTypedefType object (is not associated with a base_type data field)
void set_operand_i(SgExpression *operand_i)
This function allows the p_operand_i pointer to be set (used internally).
SgExpression * get_operand() const
returns SgExpression pointer to the operand associated with this unary operator.
This class represents the concept of a C++ using declaration.
SgDeclarationStatement * get_declaration() const
Access function for p_declaration.
SgInitializedName * get_initializedName() const
Access function for p_initializedName.
This class represents the concept of a C++ using directive.
SgNamespaceDeclarationStatement * get_namespaceDeclaration() const
Access function for p_namespaceDeclaration.
This class represents the notion of an value (expression value).
virtual VariantT variantT() const override
returns new style SageIII enum values
virtual std::string class_name() const override
returns a string representing the class name
This class represents the variable refernece in expressions.
static void traverseMemoryPoolNodes(ROSE_VisitTraversal &visit)
FOR INTERNAL USE Support for visitor pattern over all IR nodes by type of IR node.
This class represents the concept of a C or C++ variable declaration.
const SgInitializedNamePtrList & get_variables() const
Access function for p_variables.
SgDeclarationStatement * get_baseTypeDefiningDeclaration() const
Returns the defining declaration if get_variableDeclarationContainsBaseTypeDefiningDeclaration() is t...
bool get_variableDeclarationContainsBaseTypeDefiningDeclaration() const
Access function for p_variableDeclarationContainsBaseTypeDefiningDeclaration.
This class represents the definition (initialization) of a variable.
SgInitializedName * get_vardefn() const
Access function for SgInitializedName stored in p_vardefn.
This class represents the concept of a variable name within the compiler (a shared container for the ...
virtual std::string class_name() const override
returns a string representing the class name
SgName get_name() const override
Access function for getting name from declarations or types internally.
This class represents the concept of a do-while statement.
SgStatement * get_condition() const
Access function for p_condition.
void set_condition(SgStatement *condition)
Access function for p_condition.
SgStatement * get_body() const
Access function for p_body.
void set_body(SgStatement *body)
Access function for p_body.
This class represents the location of the code associated with the IR node in the original source cod...
void setTransformation()
Marks an IR node to be a transformation if it is not one already.
const char * get_filename() const
Returns filename of source code associated with IR node.
bool isOutputInCodeGeneration() const
Returns true only if required to be unparsed in generated code.
int get_line() const
Returns the line number of the associated code for this IR node.
bool isCompilerGenerated() const
Returns true only if compiler generated (either by the front-end or by ROSE).
int get_col() const
Returns the column number of the associated code for this IR node.
static Sg_File_Info * generateDefaultFileInfoForTransformationNode()
Static function to return new Sg_File_Info object set to default values appropriate for transformatio...
bool isTransformation() const
Access function for classification bit field.
bool isShared() const
Returns true only if shared internally (either by the front-end or by ROSE).
static Sg_File_Info * generateDefaultFileInfo()
Static function to return new Sg_File_Info object set to default values.
void setOutputInCodeGeneration()
Marks IR node as compiler generated but required in the generated source (e.g. requied templates).
Hash table support for symbol tables within ROSE.
ROSE_DLL_API abstract_handle * buildAbstractHandle(SgNode *snode)
A default builder function handles all details: file use name, others use numbering
ROSE_DLL_API std::vector< std::string > generateSourceFilenames(std::vector< std::string > argList, bool binaryMode)
Build the list of isolated file names from the command line.
ROSE_UTIL_API void removeAllFileNamesExcept(std::vector< std::string > &argv, std::vector< std::string > filenameList, std::string exceptFilename)
Remove file names specified in filenameList from argv, except for 'exceptFilename'.
void edgePointerReplacement(replacement_map_t const &)
For all nodes in the memory pool, it looks for the edges in the replacement map. If a match is found ...
ROSE_DLL_API std::string toBase62String(uint64_t num)
Converts a 64 bit in to base 62 (All letters and numbers).
ROSE_DLL_API Sawyer::Message::Facility mlog
Diagnostic facility for the ROSE library as a whole.
void serialize(std::ostream &output, Graph &graph)
Serialize a graph into a stream of bytes.
ROSE_UTIL_API std::string stripFileSuffixFromFileName(const std::string &fileNameWithSuffix)
Get the file name without the ".suffix".
ROSE_UTIL_API std::string numberToString(long long)
Convert an integer to a string.
ROSE_UTIL_API std::string copyEdit(const std::string &inputString, const std::string &oldToken, const std::string &newToken)
Replace all occurrences of a string with another string.
ROSE_UTIL_API std::string stripPathFromFileName(const std::string &fileNameWithPath)
Returns the last component of a path in a filesystem.
SgStatement * getPreviousStatement(SgStatement *targetStatement, bool climbOutScope=true)
Functions to move to SgStatement object in SAGE III later.
Functions that build an AST.
ROSE_DLL_API SgAddOp * buildAddOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgFunctionDeclaration * buildNondefiningFunctionDeclaration(const SgName &name, SgType *return_type, SgFunctionParameterList *parlist, SgScopeStatement *scope=NULL, SgExprListExp *decoratorList=NULL, bool buildTemplateInstantiation=false, SgTemplateArgumentPtrList *templateArgumentsList=NULL, SgStorageModifier::storage_modifier_enum sm=SgStorageModifier::e_default)
Build a prototype for a function, handle function type, symbol etc transparently.
SourcePositionClassification
intended to be a private member, don't access it directly. could be changed any time
@ e_sourcePosition_last
Specify as source position to be filled in as part of AST construction in the front-end.
@ e_sourcePositionNullPointers
Classify as compiler generated code (e.g. template instantiation).
@ e_sourcePositionCompilerGenerated
Classify as a transformation.
@ e_sourcePositionFrontendConstruction
Set pointers to Sg_File_Info objects to NULL.
@ e_sourcePositionDefault
Error value for enum.
@ e_sourcePositionTransformation
Default source position.
ROSE_DLL_API SgPragma * buildPragma(const std::string &name)
Build SgPragma.
ROSE_DLL_API SourcePositionClassification getSourcePositionClassificationMode()
Get the current source position classification (defines how IR nodes built by the SageBuilder interfa...
ROSE_DLL_API SgEqualityOp * buildEqualityOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgTemplateMemberFunctionDeclaration * buildNondefiningTemplateMemberFunctionDeclaration(const SgName &name, SgType *return_type, SgFunctionParameterList *parlist, SgScopeStatement *scope, SgExprListExp *decoratorList, unsigned int functionConstVolatileFlags, SgTemplateParameterPtrList *templateParameterList)
Build a variable declaration, handle symbol table transparently.
ROSE_DLL_API SgLabelStatement * buildLabelStatement(const SgName &name, SgStatement *stmt=NULL, SgScopeStatement *scope=NULL)
Build a label statement, name is the label's name. Handling label symbol and scope internally.
ROSE_DLL_API SgAddressOfOp * buildAddressOfOp(SgExpression *op=NULL)
ROSE_DLL_API SgTemplateFunctionDeclaration * buildNondefiningTemplateFunctionDeclaration(const SgName &name, SgType *return_type, SgFunctionParameterList *parlist, SgScopeStatement *scope=NULL, SgExprListExp *decoratorList=NULL, SgTemplateParameterPtrList *templateParameterList=NULL)
Build a variable declaration, handle symbol table transparently.
ROSE_DLL_API SgMultiplyOp * buildMultiplyOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgGotoStatement * buildGotoStatement(SgLabelStatement *label=NULL)
Build a goto statement.
ROSE_DLL_API std::string display(SourcePositionClassification &scp)
display function for debugging
ROSE_DLL_API SgLabelRefExp * buildLabelRefExp(SgLabelSymbol *s)
Build a Fortran numeric label ref exp.
ROSE_DLL_API SgLessOrEqualOp * buildLessOrEqualOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgSubtractOp * buildSubtractOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgMemberFunctionType * buildMemberFunctionType(SgType *return_type, SgFunctionParameterTypeList *typeList, SgScopeStatement *struct_name, unsigned int mfunc_specifier)
Built in simple types.
ROSE_DLL_API SgWhileStmt * buildWhileStmt(SgStatement *condition, SgStatement *body, SgStatement *else_body=NULL)
Build while statement.
ROSE_DLL_API SgForStatement * buildForStatement(SgStatement *initialize_stmt, SgStatement *test, SgExpression *increment, SgStatement *loop_body, SgStatement *else_body=NULL)
Build a for statement, assume none of the arguments is NULL.
ROSE_DLL_API SgEmptyDeclaration * buildEmptyDeclaration()
Build an empty declaration (useful for adding precission to comments and CPP handling under token-bas...
ROSE_DLL_API SgConditionalExp * buildConditionalExp(SgExpression *test=NULL, SgExpression *a=NULL, SgExpression *b=NULL)
Build a conditional expression ?:
ROSE_DLL_API SgTypeInt * buildIntType()
Built in simple types.
SourcePositionClassification SourcePositionClassificationMode
C++ SageBuilder namespace specific state for storage of the source code position state (used to contr...
ROSE_DLL_API SgMinusOp * buildMinusOp(SgExpression *op=NULL)
ROSE_DLL_API SgExprListExp * buildExprListExp(SgExpression *expr1=NULL, SgExpression *expr2=NULL, SgExpression *expr3=NULL, SgExpression *expr4=NULL, SgExpression *expr5=NULL, SgExpression *expr6=NULL, SgExpression *expr7=NULL, SgExpression *expr8=NULL, SgExpression *expr9=NULL, SgExpression *expr10=NULL)
Build a SgExprListExp, used for function call parameter list etc.
ROSE_DLL_API SgPlusAssignOp * buildPlusAssignOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgVarRefExp * buildVarRefExp(const SgName &name, SgScopeStatement *scope=NULL)
Build SgVarRefExp based on a variable's Sage name. It will lookup the name in the symbol table intern...
bool symbol_table_case_insensitive_semantics
Support for construction of case sensitive/insensitive symbol table handling in scopes.
ROSE_DLL_API SgDotExp * buildDotExp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgAssignInitializer * buildAssignInitializer(SgExpression *operand_i=NULL, SgType *expression_type=NULL)
Build the rhs of a variable declaration which includes an assignment.
ROSE_DLL_API SgArrayType * getUniqueJavaArrayType(SgType *, int)
Build a SgFile node and attach it to SgProject.
ROSE_DLL_API SgVariableDeclaration * buildVariableDeclaration(const SgName &name, SgType *type, SgInitializer *varInit=NULL, SgScopeStatement *scope=NULL)
Build a variable declaration, handle symbol table transparently.
ROSE_DLL_API SgScopeStatement * topScopeStack()
intended to be a private member, don't access it directly. could be changed any time
ROSE_DLL_API SgNullExpression * buildNullExpression()
Build a null expression, set file info as the default one.
ROSE_DLL_API SgGreaterOrEqualOp * buildGreaterOrEqualOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgReferenceType * buildReferenceType(SgType *base_type=nullptr)
Build a reference type.
ROSE_DLL_API SgExprStatement * buildExprStatement(SgExpression *exp=NULL)
Build a SgExprStatement, set File_Info automatically.
ROSE_DLL_API SgIfStmt * buildIfStmt(SgStatement *conditional, SgStatement *true_body, SgStatement *false_body)
Build if statement.
ROSE_DLL_API SgFunctionParameterList * buildFunctionParameterList(SgInitializedName *in1=NULL, SgInitializedName *in2=NULL, SgInitializedName *in3=NULL, SgInitializedName *in4=NULL, SgInitializedName *in5=NULL, SgInitializedName *in6=NULL, SgInitializedName *in7=NULL, SgInitializedName *in8=NULL, SgInitializedName *in9=NULL, SgInitializedName *in10=NULL)
Build an empty SgFunctionParameterList, possibly with some initialized names filled in.
ROSE_DLL_API SgPointerDerefExp * buildPointerDerefExp(SgExpression *op=NULL)
ROSE_DLL_API SgTypeBool * buildBoolType()
Built in simple types.
ROSE_DLL_API SgAssignOp * buildAssignOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgPointerType * buildPointerType(SgType *base_type=nullptr)
Build a pointer type.
ROSE_DLL_API SgBoolValExp * buildBoolValExp(int value=0)
Build a bool value expression, the name convention of SgBoolValExp is little different from others fo...
ROSE_DLL_API SgName appendTemplateArgumentsToName(const SgName &name, const SgTemplateArgumentPtrList &templateArgumentsList)
DQ (7/27/2012): changed semantics from removing the template arguments in names to adding the templat...
ROSE_DLL_API SgFunctionParameterTypeList * buildFunctionParameterTypeList(SgFunctionParameterList *paralist)
Build SgFunctionParameterTypeList from SgFunctionParameterList.
ROSE_DLL_API SgLessThanOp * buildLessThanOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgCastExp * buildCastExp(SgExpression *operand_i=NULL, SgType *expression_type=NULL, SgCastExp::cast_type_enum cast_type=SgCastExp::e_C_style_cast)
Build a type casting expression.
ROSE_DLL_API SgMinusAssignOp * buildMinusAssignOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgDivideOp * buildDivideOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgBasicBlock * buildBasicBlock(SgStatement *stmt1=NULL, SgStatement *stmt2=NULL, SgStatement *stmt3=NULL, SgStatement *stmt4=NULL, SgStatement *stmt5=NULL, SgStatement *stmt6=NULL, SgStatement *stmt7=NULL, SgStatement *stmt8=NULL, SgStatement *stmt9=NULL, SgStatement *stmt10=NULL)
Build a SgBasicBlock, setting file info internally.
ROSE_DLL_API SgModOp * buildModOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgExprStatement * buildAssignStatement(SgExpression *lhs, SgExpression *rhs)
Build an assignment statement from lefthand operand and right hand operand.
ROSE_DLL_API SgMemberFunctionDeclaration * buildNondefiningMemberFunctionDeclaration(const SgName &name, SgType *return_type, SgFunctionParameterList *parlist, SgScopeStatement *scope, SgExprListExp *decoratorList, unsigned int functionConstVolatileFlags, bool buildTemplateInstantiation, SgTemplateArgumentPtrList *templateArgumentsList)
Build a prototype member function declaration.
ROSE_DLL_API SgMemberFunctionDeclaration * buildDefaultConstructor(SgClassType *classType)
Build a variable declaration, handle symbol table transparently.
ROSE_DLL_API SgCommaOpExp * buildCommaOpExp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgIntVal * buildIntVal(int value=0)
Build an integer value expression.
SgDeclarationStatement * associatedDeclaration(const SgSymbol &n)
returns the associated declaration for symbol n or nullptr if there is none.
Functions that are useful when operating on the AST.
ROSE_DLL_API void checkSgNodePointers()
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API bool isLastStatement(SgStatement *stmt)
Check if a statement is the last statement within its closed scope.
ROSE_DLL_API bool isUnionDeclaration(SgNode *node)
Check if a SgNode is a declaration for a union.
ROSE_DLL_API void translateScopeToUseCppDeclarations(SgScopeStatement *scope)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
void initializeIfStmt(SgIfStmt *ifstmt, SgStatement *conditional, SgStatement *true_body, SgStatement *false_body)
Support function used for variable declarations in conditionals.
ROSE_DLL_API void deepDelete(SgNode *root)
Deep delete a sub AST tree. It uses postorder traversal to delete each child node....
void annotateExpressionsWithUniqueNames(SgProject *project)
Generate unique names for expressions and attach the names as persistent attributes ("UniqueNameAttri...
ROSE_DLL_API bool hasMultipleInitStatmentsOrExpressions(SgForStatement *for_loop)
Check if a for loop uses C99 style initialization statement with multiple expressions like for (int i...
ROSE_DLL_API void fixNamespaceDeclaration(SgNamespaceDeclarationStatement *structDecl, SgScopeStatement *scope)
Fix symbols, parent and scope pointers. Used internally within appendStatment(), insertStatement() et...
void serialize(SgNode *node, std::string &prefix, bool hasRemaining, std::ostringstream &out, std::string &edgeLabel)
we have two serialize() functions, one for a single node, the other for a list of pointers
ROSE_DLL_API void deleteExpressionTreeWithOriginalExpressionSubtrees(SgNode *root)
Special purpose function for deleting AST expression tress containing valid original expression trees...
void setSourcePositionAsTransformation(SgNode *node)
DQ (5/1/2012): New function with improved name.
ROSE_DLL_API void insertStatementList(SgStatement *targetStmt, const std::vector< SgStatement * > &newStmts, bool insertBefore=true)
Insert a list of statements before or after the target statement within the.
void whereAmI(SgNode *node)
Diagnostic function for tracing back through the parent list to understand at runtime where in the AS...
ROSE_DLL_API SgStatement * getLastStatement(SgScopeStatement *scope)
get the last statement within a scope, return NULL if it does not exit
ROSE_DLL_API void addStepToLoopBody(SgScopeStatement *loopStmt, SgStatement *step)
Add a step statement to the end of a loop body Add a new label to the end of the loop,...
ROSE_DLL_API bool is_UPC_dynamic_threads()
ROSE_DLL_API SgFunctionDeclaration * getFunctionDeclaration(SgFunctionCallExp *functionCallExp)
Find a node by type using upward traversal.
ROSE_DLL_API bool is_mixed_Fortran_and_C_language()
ROSE_DLL_API void addTextForUnparser(SgNode *astNode, std::string s, AstUnparseAttribute::RelativePositionType inputlocation)
Add a string to be unparsed to support code generation for back-end specific tools or compilers.
ROSE_DLL_API std::string getTempDirectory(SgProject *project)
Create a temporary directory if it does not yet exist and return its name.
ROSE_DLL_API void displayScope(SgScopeStatement *scope)
Find a node by type using upward traversal.
ROSE_DLL_API bool is_Jovial_language()
ROSE_DLL_API SgMemberFunctionDeclaration * findJavaMain(SgClassDefinition *)
Find a main method in a Java class.
ROSE_DLL_API bool is_Cxx_language()
void resetScopeNumbers(SgFunctionDefinition *functionDeclaration)
Assigns unique numbers to each SgScopeStatement of a function.
ROSE_DLL_API SgFunctionDeclaration * replaceDefiningFunctionDeclarationWithFunctionPrototype(SgFunctionDeclaration *functionDeclaration)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API bool hasSameGlobalScope(SgStatement *statement_1, SgStatement *statement_2)
This is supporting the recognition of functions in header files from two different ASTs.
SgCommaOpExp * insertBeforeUsingCommaOp(SgExpression *new_exp, SgExpression *anchor_exp)
Insert an expression (new_exp )before another expression (anchor_exp) has possible side effects,...
ROSE_DLL_API void fixFunctionDeclaration(SgFunctionDeclaration *stmt, SgScopeStatement *scope)
Fix the symbol table and set scope (only if scope in declaration is not already set).
ROSE_DLL_API std::string preprocessImport(SgProject *, std::string)
Using the import_string parameter, create a file with the relevant import statement; translate the fi...
ROSE_DLL_API bool collectReadWriteRefs(SgStatement *stmt, std::vector< SgNode * > &readRefs, std::vector< SgNode * > &writeRefs, bool useCachedDefUse=false)
Collect all read and write references within stmt, which can be a function, a scope statement,...
ROSE_DLL_API void prependStatementList(const std::vector< SgStatement * > &stmt, SgScopeStatement *scope=NULL)
prepend a list of statements to the beginning of the current scope, handling side effects as appropri...
ROSE_DLL_API SgInitializer * getInitializerOfExpression(SgExpression *n)
Get the initializer containing an expression if it is within an initializer.
ROSE_DLL_API std::vector< SgInitializedName * > getInParameters(const SgInitializedNamePtrList ¶ms)
Get a vector of Jovial input parameters from the function parameter list (may work for Fortran in the...
ROSE_DLL_API bool language_may_contain_nondeclarations_in_scope()
ROSE_DLL_API std::set< SgStatement * > collectTransformedStatements(SgNode *node)
This collects the statements that are marked as transformed (useful in debugging).
ROSE_DLL_API void cleanupNontransformedBasicBlockNode()
Remove unused basic block IR nodes added as part of normalization.
ROSE_DLL_API bool skipTranslateToUseCppDeclaration(PreprocessingInfo *currentPreprocessingInfo)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API AbstractHandle::abstract_handle * buildAbstractHandle(SgNode *)
Build an abstract handle from an AST node, reuse previously built handle when possible.
ROSE_DLL_API void insertStatementListBefore(SgStatement *targetStmt, const std::vector< SgStatement * > &newStmts)
Insert a list of statements before a target statement.
ROSE_DLL_API void fixStructDeclaration(SgClassDeclaration *structDecl, SgScopeStatement *scope)
Fix symbols, parent and scope pointers. Used internally within appendStatment(), insertStatement() et...
void recursivePrintCurrentAndParent(SgNode *n)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API void appendExpressionList(SgExprListExp *, const std::vector< SgExpression * > &)
Append an expression list to a SgExprListExp, set the parent pointers also.
ROSE_DLL_API void collectReadOnlySymbols(SgStatement *stmt, std::set< SgVariableSymbol * > &readOnlySymbols, bool coarseGrain=true)
Collect read only variable symbols within a statement. The statement can be either of a function,...
bool isOverloaded(SgFunctionDeclaration *functionDeclaration)
Return true if function is overloaded.
ROSE_DLL_API int set_name(SgInitializedName *initializedNameNode, SgName new_name)
set_name of symbol in symbol table.
ROSE_DLL_API SgClassDefinition * findOrInsertJavaPackage(SgProject *, std::string, bool create_directory=false)
Process a qualified package name, if needed, and return its package definition.
ROSE_DLL_API SgClassDeclaration * findOrImportJavaClass(SgProject *, SgClassDefinition *package_definition, std::string)
If the class_name already exists in the scope, return it.
ROSE_DLL_API SgVariableSymbol * getFirstVarSym(SgVariableDeclaration *decl)
Get the variable symbol for the first initialized name of a declaration stmt.
ROSE_DLL_API bool templateArgumentEquivalence(SgTemplateArgument *arg1, SgTemplateArgument *arg2)
Verify that 2 SgTemplateArgument are equivalent (same type, same expression, or same template declara...
ROSE_DLL_API SgFunctionDeclaration * findFirstDefiningFunctionDecl(SgScopeStatement *scope)
Find the first defining function declaration statement in a scope.
ROSE_DLL_API bool is_Jvm_language()
void addMessageStatement(SgStatement *stmt, std::string message)
Function to add "C" style comment to statement.
ROSE_DLL_API bool isLoopIndexVariable(SgInitializedName *ivar, SgNode *subtree_root)
Check if a SgInitializedName is used as a loop index within a AST subtree This function will use a bo...
SgInitializedName & getFirstVariable(SgVariableDeclaration &vardecl)
convenience function that returns the first initialized name in a list of variable declarations.
void initializeSwitchStatement(SgSwitchStatement *switchStatement, SgStatement *item_selector, SgStatement *body)
Support function used for variable declarations in conditionals.
SgExprListExp * loopCollapsing(SgForStatement *target_loop, size_t collapsing_factor)
Add a step statement to the end of a loop body Add a new label to the end of the loop,...
ROSE_DLL_API void fixStatement(SgStatement *stmt, SgScopeStatement *scope)
A wrapper containing fixes (fixVariableDeclaration(),fixStructDeclaration(), fixLabelStatement(),...
ROSE_DLL_API SgStatement * copyStatement(SgStatement *s)
Deep copy a statement.
ROSE_DLL_API int eraseNullPreprocessingInfo(SgLocatedNode *lnode)
Dumps a located node's preprocessing information.
ROSE_DLL_API bool isCanonicalDoLoop(SgFortranDo *loop, SgInitializedName **ivar, SgExpression **lb, SgExpression **ub, SgExpression **step, SgStatement **body, bool *hasIncrementalIterationSpace, bool *isInclusiveUpperBound)
Check if a Fortran Do loop has a complete canonical form: Do I=1, 10, 1.
SgCommaOpExp * insertAfterUsingCommaOp(SgExpression *new_exp, SgExpression *anchor_exp, SgStatement **temp_decl=NULL, SgVarRefExp **temp_ref=NULL)
Insert an expression (new_exp ) after another expression (anchor_exp) has possible side effects,...
ROSE_DLL_API SgTemplateVariableSymbol * lookupTemplateVariableSymbolInParentScopes(const SgName &name, SgTemplateParameterPtrList *tplparams, SgTemplateArgumentPtrList *tplargs, SgScopeStatement *currentScope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API void moveUpPreprocessingInfo(SgStatement *stmt_dst, SgStatement *stmt_src, PreprocessingInfo::RelativePositionType src_position=PreprocessingInfo::undef, PreprocessingInfo::RelativePositionType dst_position=PreprocessingInfo::undef, bool usePrepend=false)
Identical to movePreprocessingInfo(), except for the stale name and confusing order of parameters....
ROSE_DLL_API SgStatement * lastStatementOfScopeWithTokenInfo(SgScopeStatement *scope, std::map< SgNode *, TokenStreamSequenceToNodeMapping * > &tokenStreamSequenceMap)
Used to support token unparsing (when the output the trailing token sequence).
ROSE_DLL_API void cutPreprocessingInfo(SgLocatedNode *src_node, PreprocessingInfo::RelativePositionType pos, AttachedPreprocessingInfoType &save_buf)
Cut preprocessing information from a source node and save it into a buffer. Used in combination of pa...
ROSE_DLL_API bool normalizeForLoopTest(SgForStatement *loop)
Normalize a for loop's test expression i<x is normalized to i<= (x-1) and i>x is normalized to i>= (x...
bool declarationPreceedsDefinition(SgDeclarationStatement *nonDefiningDeclaration, SgDeclarationStatement *definingDeclaration)
Check if a defining declaration comes before of after the non-defining declaration.
ROSE_DLL_API bool isSameFunction(SgFunctionDeclaration *func1, SgFunctionDeclaration *func2)
Check if two function declarations refer to the same one. Two function declarations are the same when...
std::vector< SgVariableSymbol * > getSymbolsUsedInExpression(SgExpression *expr)
Find referenced symbols within an expression.
ROSE_DLL_API bool isStructDeclaration(SgNode *node)
Check if a SgNode is a declaration for a structure.
ROSE_DLL_API void moveVariableDeclaration(SgVariableDeclaration *decl, SgScopeStatement *target_scope)
Move a variable declaration to a new scope, handle symbol, special scopes like For loop,...
ROSE_DLL_API std::string preprocessPackage(SgProject *, std::string)
Using the package_name, create a file with a package statement, translate it in order to load the pac...
ROSE_DLL_API void setOneSourcePositionForTransformation(SgNode *root)
Set current node's source position as transformation generated.
NodeType * deepCopy(const NodeType *subtree)
A template function for deep copying a subtree. It is also used to create deepcopy functions with spe...
void clearMangledNameCache(SgGlobal *globalScope)
Support for faster mangled name generation (caching avoids recomputation).
std::vector< SgStatement * > getSwitchCases(SgSwitchStatement *sw)
Query a subtree to get all nodes of a given type, with an appropriate downcast.
ROSE_DLL_API bool isScalarType(SgType *t)
Is this a scalar type?
ROSE_DLL_API void changeBreakStatementsToGotos(SgStatement *loopOrSwitch)
If the given statement contains any break statements in its body, add a new label below the statement...
ROSE_DLL_API SgFunctionDefinition * getEnclosingFunctionDefinition(SgNode *astNode, const bool includingSelf=false)
Find a node by type using upward traversal.
ROSE_DLL_API bool is_CAF_language()
ROSE_DLL_API void printOutComments(SgLocatedNode *locatedNode)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API void ReductionRecognition(SgForStatement *loop, std::set< std::pair< SgInitializedName *, OmpSupport::omp_construct_enum > > &results)
Recognize and collect reduction variables and operations within a C/C++ loop, following OpenMP 3....
ROSE_DLL_API bool loopUnrolling(SgForStatement *loop, size_t unrolling_factor)
Unroll a target loop with a specified unrolling factor. It handles steps larger than 1 and adds a fri...
ROSE_DLL_API void setLoopCondition(SgScopeStatement *loop, SgStatement *cond)
Set the condition statement of a loop, including While-loop, For-loop, and Do-While-loop.
bool ROSE_DLL_API isStatic(SgDeclarationStatement *stmt)
Check if a declaration has a "static' modifier.
PreprocessingInfo * attachComment(SgSourceFile *source_file, const std::string &content, PreprocessingInfo::DirectiveType directive_type=PreprocessingInfo::C_StyleComment, PreprocessingInfo::RelativePositionType position=PreprocessingInfo::before)
Build and attach comment onto the global scope of a source file.
ROSE_DLL_API SgClassDefinition * getEnclosingClassDefinition(SgNode *astnode, const bool includingSelf=false)
Get the closest class definition enclosing the specified AST node,.
ROSE_DLL_API bool mergeDeclarationAndAssignment(SgVariableDeclaration *decl, SgExprStatement *assign_stmt, bool removeAssignStmt=true)
Merge a variable assignment statement into a matching variable declaration statement....
ROSE_DLL_API void checkAccessPermissions(SgNode *)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API std::vector< SgFunctionDeclaration * > generateFunctionDefinitionsList(SgNode *node)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API void replaceMacroCallsWithExpandedStrings(SgPragmaDeclaration *target)
Check if a pragma declaration node has macro calls attached, if yes, replace macro calls within the p...
std::string generateUniqueNameForUseAsIdentifier(SgDeclarationStatement *declaration)
Generate a useful name to support construction of identifiers from declarations.
ROSE_DLL_API bool isRestrictType(SgType *t)
Is this a restrict type?
ROSE_DLL_API std::string generateProjectName(const SgProject *project, bool supressSuffix=false)
Added mechanism to generate project name from list of file names.
ROSE_DLL_API void resetInternalMapsForTargetStatement(SgStatement *sourceStatement)
Reset internal data structures used for token-based unparsing and macro summaries based on modificati...
ROSE_DLL_API bool is_Cuda_language()
ROSE_DLL_API bool isLambdaCapturedVariable(SgVarRefExp *varRef)
check if a variable reference is this->a[i] inside of a lambda function
ROSE_DLL_API int instrumentEndOfFunction(SgFunctionDeclaration *func, SgStatement *s)
Instrument(Add a statement, often a function call) into a function right before the return points,...
ROSE_DLL_API SgInitializedName * getFirstInitializedName(SgVariableDeclaration *decl)
Get the first initialized name of a declaration statement.
void setSourcePositionPointersToNull(SgNode *node)
Set the source code positon for the current (input) node.
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsBodyOfDoWhile(SgDoWhileStmt *ws)
Check if the body of a 'do .. while' statement is a SgBasicBlock, create one if not.
ROSE_DLL_API void reportModifiedStatements(const std::string &label, SgNode *node)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API std::vector< SgInitializedName * > getOutParameters(const SgInitializedNamePtrList ¶ms)
Get a vector of Jovial output parameters from the function parameter list (may work for Fortran in th...
ROSE_DLL_API void setSourcePositionForTransformation(SgNode *root)
Recursively set source position info(Sg_File_Info) as transformation generated.
ROSE_DLL_API SgGlobal * getGlobalScope(const SgNode *astNode)
Traverse back through a node's parents to find the enclosing global scope.
ROSE_DLL_API void insertStatementListAfter(SgStatement *targetStmt, const std::vector< SgStatement * > &newStmt)
Insert a list of statements after a target statement.
ROSE_DLL_API bool isMain(const SgNode *node)
Check if a SgNode is a main() function declaration.
std::map< std::string, int > local_name_collision_map
Global map of name collisions to support generateUniqueNameForUseAsIdentifier() function.
ROSE_DLL_API void fixClassDeclaration(SgClassDeclaration *classDecl, SgScopeStatement *scope)
Fix symbols, parent and scope pointers. Used internally within appendStatment(), insertStatement() et...
ROSE_DLL_API int collectVariableReferencesInArrayTypes(SgLocatedNode *root, Rose_STL_Container< SgNode * > ¤tVarRefList)
Collect variable references in array types. The default NodeQuery::querySubTree() will miss variables...
SgBasicBlock * ensureBasicBlockAsBodyOfCaseOption(SgCaseOptionStmt *cs)
Check if the body of a 'case option' statement is a SgBasicBlock, create one if not.
void checkForInitializers(SgNode *node)
Collect all read and write references within stmt, which can be a function, a scope statement,...
ROSE_DLL_API void removeUnusedLabels(SgNode *top, bool keepChild=false)
Remove labels which are not targets of any goto statements: its child statement is also removed by de...
ROSE_DLL_API SgProject * getProject()
Get the current SgProject IR Node.
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsBodyOfUpcForAll(SgUpcForAllStatement *fs)
Check if the body of a 'upc_forall' statement is a SgBasicBlock, create one if not.
ROSE_DLL_API SgClassDeclaration * getEnclosingClassDeclaration(SgNode *astNode)
Get the closest class declaration enclosing the specified AST node,.
ROSE_DLL_API void insertStatement(SgStatement *targetStmt, SgStatement *newStmt, bool insertBefore=true, bool autoMovePreprocessingInfo=true)
Insert a statement before or after the target statement within the target's scope....
ROSE_DLL_API void listHeaderFiles(SgIncludeFile *includeFile)
return path prefix for subtree of include files.
ROSE_DLL_API void markSubtreeToBeUnparsedTreeTraversal(SgNode *root, int physical_file_id)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
void saveToPDF(SgNode *node, std::string filename)
Save AST into a pdf file. Start from a node to find its enclosing file node. The entire file's AST wi...
ROSE_DLL_API bool normalizeForLoopInitDeclaration(SgForStatement *loop)
Normalize loop init stmt by promoting the single variable declaration statement outside of the for lo...
void detectCycleInType(SgType *type, const std::string &from)
Collect all read and write references within stmt, which can be a function, a scope statement,...
ROSE_DLL_API void deleteAST(SgNode *node)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API bool statementCanBeTransformed(SgStatement *stmt)
If header file unparsing and token-based unparsing are used, then some statements in header files use...
ROSE_DLL_API SgStatement * getNextStatement(SgStatement *currentStmt)
Get next statement within the same scope of current statement.
ROSE_DLL_API std::set< SgLabelStatement * > findUnusedLabels(SgNode *top)
Find unused labels which are not targets of any goto statements.
ROSE_DLL_API void setExtern(SgDeclarationStatement *stmt)
Set a declaration as extern.
ROSE_DLL_API void deleteAllNodes()
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API bool templateArgumentListEquivalence(const SgTemplateArgumentPtrList &list1, const SgTemplateArgumentPtrList &list2)
Verify that 2 SgTemplateArgumentPtrList are equivalent.
ROSE_DLL_API LivenessAnalysis * call_liveness_analysis(SgProject *project, bool debug=false)
Call liveness analysis on an entire project.
ROSE_DLL_API void reportModifiedLocatedNodes(const std::string &label, SgNode *node)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API void fixTemplateDeclaration(SgTemplateDeclaration *stmt, SgScopeStatement *scope)
Fix the symbol table and set scope (only if scope in declaration is not already set).
SgType * getBoolType(SgNode *n)
Get the right bool type according to C or C++ language input.
void clearSharedGlobalScopes(SgProject *project)
Collect all read and write references within stmt, which can be a function, a scope statement,...
void initializeWhileStatement(SgWhileStmt *whileStatement, SgStatement *condition, SgStatement *body, SgStatement *else_body)
Support function used for variable declarations in conditionals.
ROSE_DLL_API void setSourcePosition(SgNode *node)
Set the source code positon for the current (input) node.
ROSE_DLL_API void setPragma(SgPragmaDeclaration *decl, SgPragma *pragma)
Set a pragma of a pragma declaration. handle memory release for preexisting pragma,...
ROSE_DLL_API void insertStatementListBeforeFirstNonDeclaration(const std::vector< SgStatement * > &newStmts, SgScopeStatement *scope)
Insert statements before the first non-declaration statement in a scope. If the scope has no non-decl...
ROSE_DLL_API bool isPostfixOperator(SgExpression *exp)
Is an overloaded operator a postfix operator. (e.g. ).
ROSE_DLL_API SgStatement * findSurroundingStatementFromSameFile(SgStatement *targetStmt, bool &surroundingStatementPreceedsTargetStatement)
Supporting function to comment relocation in insertStatement() and removeStatement().
SgNamespaceDefinitionStatement * enclosingNamespaceScope(SgDeclarationStatement *declaration)
Find the enclosing namespace of a declaration.
ROSE_DLL_API SgStatement * getLoopBody(SgScopeStatement *loop)
Routines to get and set the body of a loop.
ROSE_DLL_API bool is_mixed_C_and_Cxx_language()
bool isStructurallyEquivalentAST(SgNode *tree1, SgNode *tree2)
Collect all read and write references within stmt, which can be a function, a scope statement,...
ROSE_DLL_API PreprocessingInfo * insertHeader(SgSourceFile *source_file, const std::string &header_file_name, bool isSystemHeader, bool asLastHeader)
Insert #include "filename" or #include <filename> (system header) onto the global scope of a source f...
void printAST2TextFile(SgNode *node, const char *filename, bool printType=true)
Pretty print AST horizontally, output to a specified text file. If printType is set to false,...
ROSE_DLL_API SgFunctionSymbol * lookupTemplateFunctionSymbolInParentScopes(const SgName &functionName, SgFunctionType *ftype, SgTemplateParameterPtrList *tplparams, SgScopeStatement *currentScope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API bool is_language_case_insensitive()
ROSE_DLL_API void replaceStatement(SgStatement *oldStmt, SgStatement *newStmt, bool movePreprocessinInfo=false)
Replace a statement with another. Move preprocessing information from oldStmt to newStmt if requested...
ROSE_DLL_API void recordNormalizations(SgStatement *s)
Record where normalization have been done so that we can preform denormalizations as required for the...
ROSE_DLL_API bool loopInterchange(SgForStatement *loop, size_t depth, size_t lexicoOrder)
Interchange/permutate a n-level perfectly-nested loop rooted at 'loop' using a lexicographical order ...
void printAST(SgNode *node)
Pretty print AST horizontally, output to std output.
ROSE_DLL_API SgFunctionSymbol * lookupTemplateMemberFunctionSymbolInParentScopes(const SgName &functionName, SgFunctionType *ftype, SgTemplateParameterPtrList *tplparams, SgScopeStatement *currentScope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API bool is_PHP_language()
ROSE_DLL_API bool isEqualToIntConst(SgExpression *e, int value)
Check if a SgIntVal node has a given value.
ROSE_DLL_API void insertStatementBeforeFirstNonDeclaration(SgStatement *newStmt, SgScopeStatement *scope, bool movePreprocessingInfo=true)
Insert a statement before the first non-declaration statement in a scope. If the scope has no non-dec...
ROSE_DLL_API SgFunctionSymbol * lookupFunctionSymbolInParentScopes(const SgName &functionName, SgScopeStatement *currentScope=NULL)
look up the first matched function symbol in parent scopes given only a function name,...
ROSE_DLL_API void appendStatementWithDependentDeclaration(SgDeclarationStatement *decl, SgGlobal *scope, SgStatement *original_statement, bool excludeHeaderFiles)
Append a copy ('decl') of a function ('original_statement') into a 'scope', include any referenced de...
ROSE_DLL_API bool insideHeader(SgLocatedNode *node)
Check if a node is from a header file.
ROSE_DLL_API void markSubtreeToBeUnparsed(SgNode *root, int physical_file_id)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API bool isDataMemberReference(SgVarRefExp *varRefExp)
Find a node by type using upward traversal.
ROSE_DLL_API bool collectReadWriteVariables(SgStatement *stmt, std::set< SgInitializedName * > &readVars, std::set< SgInitializedName * > &writeVars, bool coarseGrain=true)
Collect unique variables which are read or written within a statement. Note that a variable can be bo...
ROSE_DLL_API void constantFolding(SgNode *r)
Constant folding an AST subtree rooted at 'r' (replacing its children with their constant values,...
std::vector< SgBreakStmt * > findBreakStmts(SgStatement *code, const std::string &fortranLabel="")
Find break statements inside a particular statement, stopping at nested loops or switches.
ROSE_DLL_API SgFile * getEnclosingFileNode(SgNode *astNode)
get the SgFile node from current node
ROSE_DLL_API void setStatic(SgDeclarationStatement *stmt)
Set a declaration as static.
ROSE_DLL_API bool doLoopNormalization(SgFortranDo *loop)
Normalize a Fortran Do loop. Make the default increment expression (1) explicit.
ROSE_DLL_API SgFile * preprocessCompilationUnit(SgProject *, std::string, std::string, bool unparse=true)
Using the file_content string, create a file with the content in question; build its AST and add it t...
ROSE_DLL_API void removeLabeledGotos(SgNode *top)
Remove labeled goto statements.
std::map< SgNode *, std::string > local_node_to_name_map
Global map of name collisions to support generateUniqueNameForUseAsIdentifier() function.
std::vector< SgGotoStatement * > findGotoStmts(SgStatement *scope, SgLabelStatement *l)
Query a subtree to get all nodes of a given type, with an appropriate downcast.
ROSE_DLL_API bool mergeDeclarationWithAssignment(SgVariableDeclaration *decl, SgExprStatement *assign_stmt)
Merge a declaration statement into a matching followed variable assignment. Callers should make sure ...
ROSE_DLL_API bool isAssignmentStatement(SgNode *_s, SgExpression **lhs=NULL, SgExpression **rhs=NULL, bool *readlhs=NULL)
Check if a SgNode _s is an assignment statement (any of =,+=,-=,&=,/=, ^=, etc)
ROSE_DLL_API void outputSharedNodes(SgNode *node)
Find a node by type using upward traversal.
bool ROSE_DLL_API isAncestor(SgNode *node1, SgNode *node2)
check if node1 is a strict ancestor of node 2. (a node is not considered its own ancestor)
ROSE_DLL_API SgScopeStatement * getEnclosingScope(SgNode *n, const bool includingSelf=false)
Get the enclosing scope from a node n.
ROSE_DLL_API SgNonrealSymbol * lookupNonrealSymbolInParentScopes(const SgName &name, SgScopeStatement *currentScope=NULL, SgTemplateParameterPtrList *templateParameterList=NULL, SgTemplateArgumentPtrList *templateArgumentList=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API SgSwitchStatement * findEnclosingSwitch(SgStatement *s)
Find the closest switch outside a given statement (normally used for case and default statements)
ROSE_DLL_API void removeAllOriginalExpressionTrees(SgNode *top)
Set original expression trees to NULL for SgValueExp or SgCastExp expressions, so you can change the ...
ROSE_DLL_API std::vector< SgNode * > astIntersection(SgNode *original, SgNode *copy, SgCopyHelp *help=NULL)
Compute the intersection set for two ASTs.
ROSE_DLL_API bool isPrefixOperator(SgExpression *exp)
Is an overloaded operator a prefix operator (e.g. address operator X * operator&(),...
ROSE_DLL_API void setLhsOperand(SgExpression *target, SgExpression *lhs)
set left hand operand for binary expressions, transparently downcasting target expressions when neces...
ROSE_DLL_API std::vector< SgC_PreprocessorDirectiveStatement * > translateStatementToUseCppDeclarations(SgStatement *statement, SgScopeStatement *scope)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API int suggestNextNumericLabel(SgFunctionDefinition *func_def)
Suggest next usable (non-conflicting) numeric label value for a Fortran function definition scope.
ROSE_DLL_API std::set< SgStatement * > collectModifiedStatements(SgNode *node)
This collects the statements that are marked as modified (a flag automatically set by all set_* gener...
ROSE_DLL_API SgFunctionDeclaration * getEnclosingFunctionDeclaration(SgNode *astNode, const bool includingSelf=false)
Find the enclosing function declaration, including its derived instances like isSgProcedureHeaderStat...
SgFunctionDeclaration * findFunctionDeclaration(SgNode *root, std::string name, SgScopeStatement *scope, bool isDefining)
Topdown traverse a subtree from root to find the first function declaration matching the given name,...
ROSE_DLL_API bool isPrefixOperatorName(const SgName &functionName)
Check for proper names of possible prefix operators (used in isPrefixOperator()).
ROSE_DLL_API void setLoopStride(SgNode *loop, SgExpression *stride)
Set the stride(step) of a loop 's incremental expression, regardless the expression types (i+=s; i= i...
ROSE_DLL_API bool isInSubTree(SgExpression *subtree, SgExpression *exp)
Find a node by type using upward traversal.
ROSE_DLL_API bool forLoopNormalization(SgForStatement *loop, bool foldConstant=true)
Normalize a for loop, return true if successful.
unsigned long long getIntegerConstantValue(SgValueExp *expr)
Get the constant value from a constant integer expression; abort on everything else.
ROSE_DLL_API bool is_UPC_language()
ROSE_DLL_API void checkSymbolTables(SgNode *)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API void updateDefiningNondefiningLinks(SgFunctionDeclaration *func, SgScopeStatement *scope)
Update defining and nondefining links due to a newly introduced function declaration....
ROSE_DLL_API SgNode * deepCopyNode(const SgNode *subtree)
Deep copy an arbitrary subtree.
SgBasicBlock * ensureBasicBlockAsBodyOfDefaultOption(SgDefaultOptionStmt *cs)
Check if the body of a 'default option' statement is a SgBasicBlock, create one if not.
ROSE_DLL_API void getLiveVariables(LivenessAnalysis *liv, SgForStatement *loop, std::set< SgInitializedName * > &liveIns, std::set< SgInitializedName * > &liveOuts)
get liveIn and liveOut variables for a for loop from liveness analysis result liv.
ROSE_DLL_API void resetModifiedLocatedNodes(const std::set< SgLocatedNode * > &modifiedNodeSet)
Use the set of IR nodes and set the isModified flag in each IR node to true.
ROSE_DLL_API SgNode * replaceWithPattern(SgNode *anchor, SgNode *new_pattern)
Replace an anchor node with a specified pattern subtree with optional SgVariantExpression....
ROSE_DLL_API bool ROSE_DLL_API isJovialOutParam(SgInitializedName *name)
True if a parameter name is a Jovial output parameter.
ROSE_DLL_API void moveForStatementIncrementIntoBody(SgForStatement *f)
Add a step statement to the end of a loop body Add a new label to the end of the loop,...
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsBodyOfOmpBodyStmt(SgOmpBodyStatement *ompbodyStmt)
Check if the body of a SgOmpBodyStatement is a SgBasicBlock, create one if not.
ROSE_DLL_API bool is_Python_language()
ROSE_DLL_API bool is_mixed_Fortran_and_Cxx_language()
ROSE_DLL_API SgStatement * getLoopCondition(SgScopeStatement *loop)
Routines to get the condition of a loop. It recognize While-loop, For-loop, and Do-While-loop.
ROSE_DLL_API SgEnumSymbol * lookupEnumSymbolInParentScopes(const SgName &name, SgScopeStatement *currentScope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
std::pair< SgVariableDeclaration *, SgExpression * > createTempVariableAndReferenceForExpression(SgExpression *expression, SgScopeStatement *scope)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API SgTypedefSymbol * lookupTypedefSymbolInParentScopes(const SgName &name, SgScopeStatement *currentScope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsBodyOfWhile(SgWhileStmt *ws)
Check if the body of a 'while' statement is a SgBasicBlock, create one if not.
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsBodyOfFor(SgForStatement *fs)
Check if the body of a 'for' statement is a SgBasicBlock, create one if not.
ROSE_DLL_API PreprocessingInfo * attachArbitraryText(SgLocatedNode *target, const std::string &text, PreprocessingInfo::RelativePositionType position=PreprocessingInfo::before)
Attach an arbitrary string to a located node. A workaround to insert irregular statements or vendor-s...
ROSE_DLL_API void markNodeToBeUnparsed(SgNode *node, int physical_file_id)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API bool isConstantTrue(SgExpression *e)
Check if a bool or int constant expression evaluates to be a true value.
std::map< std::string, SgNode * > local_name_to_node_map
Global map of name collisions to support generateUniqueNameForUseAsIdentifier() function.
ROSE_DLL_API bool is_binary_executable()
void changeAllBodiesToBlocks(SgNode *top, bool createEmptyBody=true)
Fix up ifs, loops, while, switch, Catch, OmpBodyStatement, etc. to have blocks as body components....
void dumpPreprocInfo(SgLocatedNode *locatedNode)
Dumps a located node's preprocessing information.
void fixupReferencesToSymbols(const SgScopeStatement *this_scope, SgScopeStatement *copy_scope, SgCopyHelp &help)
All the symbol table references in the copied AST need to be reset after rebuilding the copied scope'...
ROSE_DLL_API void moveDeclarationToAssociatedNamespace(SgDeclarationStatement *declarationStatement)
Relocate the declaration to be explicitly represented in its associated namespace (required for some ...
ROSE_DLL_API bool isCanonicalForLoop(SgNode *loop, SgInitializedName **ivar=NULL, SgExpression **lb=NULL, SgExpression **ub=NULL, SgExpression **step=NULL, SgStatement **body=NULL, bool *hasIncrementalIterationSpace=NULL, bool *isInclusiveUpperBound=NULL)
Check if a for-loop has a canonical form, return loop index, bounds, step, and body if requested.
ROSE_DLL_API bool isArrayReference(SgExpression *ref, SgExpression **arrayNameExp=NULL, std::vector< SgExpression * > **subscripts=NULL)
Check if an expression is an array access (SgPntrArrRefExp). If so, return its name expression and su...
ROSE_DLL_API void insertStatementAfterLastDeclaration(SgStatement *stmt, SgScopeStatement *scope)
Insert a statement after the last declaration within a scope. The statement will be prepended to the ...
ROSE_DLL_API void destroyTempDirectory(std::string)
Use the system command to remove a temporary directory and all its containing files.
void serialize_list(T &plist, std::string T_name, std::string &prefix, bool hasRemaining, std::ostringstream &out, std::string &edgeLabel)
Query a subtree to get all nodes of a given type, with an appropriate downcast.
void resetMangledNameCache(SgGlobal *globalScope)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API SgTemplateInstantiationMemberFunctionDecl * buildForwardFunctionDeclaration(SgTemplateInstantiationMemberFunctionDecl *memberFunctionInstantiation)
Generate a non-defining (forward) declaration from a defining function declaration.
ROSE_DLL_API bool is_Fortran_language()
ROSE_DLL_API SgVariableSymbol * lookupVariableSymbolInParentScopes(const SgName &name, SgScopeStatement *currentScope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API void outputFileIds(SgNode *node)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API SgExprStatement * splitVariableDeclaration(SgVariableDeclaration *decl)
Split a variable declaration with an rhs assignment into two statements: a declaration and an assignm...
ROSE_DLL_API SgStatement * getFirstStatement(SgScopeStatement *scope, bool includingCompilerGenerated=false)
Get the first statement within a scope, return NULL if it does not exist. Skip compiler-generated sta...
ROSE_DLL_API SgNamespaceSymbol * lookupNamespaceSymbolInParentScopes(const SgName &name, SgScopeStatement *currentScope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API bool isExtern(SgDeclarationStatement *stmt)
Check if a declaration has an "extern" modifier.
std::string extractPragmaKeyword(const SgPragmaDeclaration *)
Extract a SgPragmaDeclaration's leading keyword . For example "#pragma omp parallel" has a keyword of...
ROSE_DLL_API SgTemplateClassSymbol * lookupTemplateClassSymbolInParentScopes(const SgName &name, SgTemplateParameterPtrList *templateParameterList, SgTemplateArgumentPtrList *templateArgumentList, SgScopeStatement *cscope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API bool isEquivalentFunctionType(const SgFunctionType *lhs, const SgFunctionType *rhs)
Test if two types are equivalent SgFunctionType nodes.
ROSE_DLL_API void setLoopLowerBound(SgNode *loop, SgExpression *lb)
Set the lower bound of a loop header for (i=lb; ...)
void guardNode(SgLocatedNode *target, std::string guard)
Add preproccessor guard around a given node.
bool checkTypesAreEqual(SgType *typeA, SgType *typeB)
Collect all read and write references within stmt, which can be a function, a scope statement,...
ROSE_DLL_API bool isReferenceType(SgType *t)
Is this type a const or non-const reference type? (Handles typedefs correctly)
ROSE_DLL_API void moveCommentsToNewStatement(SgStatement *sourceStatement, const std::vector< int > &indexList, SgStatement *destinationStatement, bool destinationStatementPreceedsSourceStatement)
Relocate comments and CPP directives from one statement to another.
ROSE_DLL_API SgStatement * getEnclosingStatement(SgNode *n)
Find the closest enclosing statement, including the given node.
ROSE_DLL_API void translateToUseCppDeclarations(SgNode *n)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API void changeContinuesToGotos(SgStatement *stmt, SgLabelStatement *label)
Change continue statements in a given block of code to gotos to a label.
void outputGlobalFunctionTypeSymbolTable()
Output function type symbols in global function type symbol table.
ROSE_DLL_API SgScopeStatement * findEnclosingLoop(SgStatement *s, const std::string &fortranLabel="", bool stopOnSwitches=false)
Find the closest loop outside the given statement; if fortranLabel is not empty, the Fortran label of...
std::pair< SgVariableDeclaration *, SgExpression * > createTempVariableForExpression(SgExpression *expression, SgScopeStatement *scope, bool initializeInDeclaration, SgAssignOp **reEvaluate=NULL)
Given an expression, generates a temporary variable whose initializer optionally evaluates that expre...
bool isBodyStatement(SgStatement *s)
Check if a statement is a (true or false) body of a container-like parent, such as For,...
bool functionCallExpressionPreceedsDeclarationWhichAssociatesScope(SgFunctionCallExp *functionCall)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API void convertAllForsToWhiles(SgNode *top)
Add a step statement to the end of a loop body Add a new label to the end of the loop,...
ROSE_DLL_API bool isConstantFalse(SgExpression *e)
Check if a bool or int constant expression evaluates to be a false value.
ROSE_DLL_API void outputLocalSymbolTables(SgNode *node)
Output the local symbol tables.
ROSE_DLL_API void preOrderCollectPreprocessingInfo(SgNode *current, std::vector< PreprocessingInfo * > &infoList, int depth)
Dumps a located node's preprocessing information.
ROSE_DLL_API SgMemberFunctionDeclaration * getDefaultDestructor(SgClassDeclaration *classDeclaration)
Get the default destructor from the class declaration.
void collectVarRefs(SgLocatedNode *root, std::vector< SgVarRefExp * > &result)
Collect all variable references in a subtree.
ROSE_DLL_API void setOperand(SgExpression *target, SgExpression *operand)
Set operands for expressions with single operand, such as unary expressions. handle file info,...
ROSE_DLL_API SgMemberFunctionDeclaration * getDefaultConstructor(SgClassDeclaration *classDeclaration)
Get the default constructor from the class declaration.
ROSE_DLL_API SgInitializedName * getLoopIndexVariable(SgNode *loop)
Return the loop index variable for a for loop.
ROSE_DLL_API SgAssignInitializer * splitExpression(SgExpression *from, std::string newName="")
Replace an expression with a temporary variable and an assignment statement.
ROSE_DLL_API void replaceVariableReferences(SgVariableSymbol *old_sym, SgVariableSymbol *new_sym, SgScopeStatement *scope)
Replace all variable references to an old symbol in a scope to being references to a new symbol.
ROSE_DLL_API bool is_OpenCL_language()
ROSE_DLL_API bool normalizeForLoopIncrement(SgForStatement *loop)
Add a step statement to the end of a loop body Add a new label to the end of the loop,...
ROSE_DLL_API SgVariableSymbol * appendArg(SgFunctionParameterList *, SgInitializedName *)
Append an argument to SgFunctionParameterList, transparently set parent,scope, and symbols for argume...
ROSE_DLL_API bool unnormalizeForLoopInitDeclaration(SgForStatement *loop)
Undo the normalization of for loop's C99 init declaration. Previous record of normalization is used t...
ROSE_DLL_API SgStatement * getPreviousStatement(SgStatement *currentStmt, bool climbOutScope=true)
Get previous statement of the current statement. It may return a previous statement of a parent scope...
ROSE_DLL_API void removeJumpsToNextStatement(SgNode *)
Remove jumps whose label is immediately after the jump. Used to clean up inlined code fragments.
bool isPrototypeInScope(SgScopeStatement *scope, SgFunctionDeclaration *functionDeclaration, SgDeclarationStatement *startingAtDeclaration)
Assigns unique numbers to each SgScopeStatement of a function.
ROSE_DLL_API int moveUpInnerDanglingIfEndifDirective(SgLocatedNode *lnode)
Extract sequences like " #endif #endif ... #if | #ifdef| #ifndef" buried inside subtree of lnode.
SgDeclarationStatement * getNonInstantiatonDeclarationForClass(SgTemplateInstantiationMemberFunctionDecl *memberFunctionInstantiation)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API bool isConstType(SgType *t)
Is this a const type?
SgFunctionDeclaration * getDeclarationOfNamedFunction(SgExpression *func)
Given a SgExpression that represents a named function (or bound member function), return the mentione...
ROSE_DLL_API bool is_C99_language()
ROSE_DLL_API bool addDefaultConstructorIfRequired(SgClassType *classType, int physical_file_id=Sg_File_Info::TRANSFORMATION_FILE_ID)
Get the default destructor from the class declaration.
ROSE_DLL_API void movePreprocessingInfo(SgStatement *stmt_src, SgStatement *stmt_dst, PreprocessingInfo::RelativePositionType src_position=PreprocessingInfo::undef, PreprocessingInfo::RelativePositionType dst_position=PreprocessingInfo::undef, bool usePrepend=false)
Move preprocessing information of stmt_src to stmt_dst, Only move preprocessing information from the ...
ROSE_DLL_API int fixVariableReferences(SgNode *root, bool cleanUnusedSymbol=true)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API bool isUseByAddressVariableRef(SgVarRefExp *ref)
Check if a variable reference is used by its address: including &a expression and foo(a) when type2 f...
struct const_int_expr_t evaluateConstIntegerExpression(SgExpression *expr)
The function tries to evaluate const integer expressions (such as are used in array dimension sizes)....
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsTrueBodyOfIf(SgIfStmt *ifs)
Check if the true body of a 'if' statement is a SgBasicBlock, create one if not.
ROSE_DLL_API void replaceExpression(SgExpression *oldExp, SgExpression *newExp, bool keepOldExp=false)
Replace an expression with another, used for variable reference substitution and others....
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsFalseBodyOfIf(SgIfStmt *ifs, bool createEmptyBody=true)
Check if the false body of a 'if' statement is a SgBasicBlock, create one if not when the flag is tru...
ROSE_DLL_API SgExprListExp * getEnclosingExprListExp(SgNode *astNode, const bool includingSelf=false)
Get the enclosing SgExprListExp (used as part of function argument index evaluation in subexpressions...
ROSE_DLL_API void appendStatement(SgStatement *stmt, SgScopeStatement *scope=NULL)
Append a statement to the end of the current scope, handle side effect of appending statements,...
ROSE_DLL_API SgFunctionDeclaration * buildFunctionPrototype(SgFunctionDeclaration *functionDeclaration)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
void addVarRefExpFromArrayDimInfo(SgNode *astNode, Rose_STL_Container< SgNode * > &NodeList_t)
Find all SgPntrArrRefExp under astNode, then add SgVarRefExp (if any) of SgPntrArrRefExp's dim_info i...
ROSE_DLL_API bool loopTiling(SgForStatement *loopNest, size_t targetLevel, size_t tileSize)
Tile the n-level (starting from 1) loop of a perfectly nested loop nest using tiling size s.
std::string generateUniqueName(const SgNode *node, bool ignoreDifferenceBetweenDefiningAndNondefiningDeclarations)
Generate unique name from C and C++ constructs. The name may contain space.
ROSE_DLL_API SgGlobal * getFirstGlobalScope(SgProject *project)
return the first global scope under current project
ROSE_DLL_API void setOneSourcePositionNull(SgNode *node)
Set current node's source position as NULL.
ROSE_DLL_API void setRhsOperand(SgExpression *target, SgExpression *rhs)
set left hand operand for binary expression
std::pair< SgStatement *, SgInitializedName * > wrapFunction(SgFunctionDeclaration &definingDeclaration, SgName newName)
moves the body of a function f to a new function f; f's body is replaced with code that forwards the ...
ROSE_DLL_API bool is_mixed_Fortran_and_C_and_Cxx_language()
ROSE_DLL_API bool isVolatileType(SgType *t)
Is this a volatile type?
void clearUnusedVariableSymbols(SgNode *root=NULL)
Clear those variable symbols with unknown type (together with initialized names) which are also not r...
ROSE_DLL_API void fixVariableDeclaration(SgVariableDeclaration *varDecl, SgScopeStatement *scope)
Patch up symbol, scope, and parent information when a SgVariableDeclaration's scope is known.
ROSE_DLL_API SgSymbol * lookupSymbolInParentScopesIgnoringAliasSymbols(const SgName &name, SgScopeStatement *currentScope=NULL, SgTemplateParameterPtrList *templateParameterList=NULL, SgTemplateArgumentPtrList *templateArgumentList=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
std::string generateUniqueVariableName(SgScopeStatement *scope, std::string baseName="temp")
Generate a name like temp# that is unique in the current scope and any parent and children scopes.
ROSE_DLL_API int gensym_counter
An internal counter for generating unique SgName.
ROSE_DLL_API void splitExpressionIntoBasicBlock(SgExpression *expr)
Split long expressions into blocks of statements.
void reset_name_collision_map()
Reset map variables used to support generateUniqueNameForUseAsIdentifier() function.
ROSE_DLL_API SgFunctionDefinition * getEnclosingProcedure(SgNode *n, const bool includingSelf=false)
Find the function definition.
std::vector< SgExpression * > get_C_array_dimensions(const SgArrayType &arrtype)
returns the array dimensions in an array as defined for arrtype
ROSE_DLL_API void replaceSubexpressionWithStatement(SgExpression *from, SageInterface::StatementGenerator *to)
Similar to replaceExpressionWithStatement, but with more restrictions.
ROSE_DLL_API void wrapAllTemplateInstantiationsInAssociatedNamespaces(SgProject *root)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
std::string get_name(const SgNode *node)
Generate a useful name to describe the SgNode.
ROSE_DLL_API void setLoopUpperBound(SgNode *loop, SgExpression *ub)
Set the upper bound of a loop header,regardless the condition expression type. for (i=lb; i op up,...
ROSE_DLL_API bool isMemberFunctionMemberReference(SgMemberFunctionRefExp *memberFunctionRefExp)
Find a node by type using upward traversal.
ROSE_DLL_API SgClassDefinition * findJavaPackage(SgScopeStatement *, std::string)
Look for a qualified package name in the given scope and return its package definition.
ROSE_DLL_API bool isOmpStatement(SgNode *)
Check if a node is SgOmp*Statement.
ROSE_DLL_API bool is_Ada_language()
std::string addMangledNameToCache(SgNode *astNode, const std::string &mangledName)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API bool is_C_language()
ROSE_DLL_API std::list< SgClassType * > getClassTypeChainForMemberReference(SgExpression *refExp)
Find a node by type using upward traversal.
ROSE_DLL_API void collectUseByAddressVariableRefs(const SgStatement *s, std::set< SgVarRefExp * > &varSetB)
Collect variable references involving use by address: including &a expression and foo(a) when type2 f...
std::vector< SgContinueStmt * > findContinueStmts(SgStatement *code, const std::string &fortranLabel="")
Find all continue statements inside a particular statement, stopping at nested loops.
std::string getMangledNameFromCache(SgNode *astNode)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API std::vector< SgDeclarationStatement * > sortSgNodeListBasedOnAppearanceOrderInSource(const std::vector< SgDeclarationStatement * > &nodevec)
Reorder a list of declaration statements based on their appearance order in source files.
ROSE_DLL_API std::set< SgLocatedNode * > collectModifiedLocatedNodes(SgNode *node)
This collects the SgLocatedNodes that are marked as modified (a flag automatically set by all set_* g...
SgExpression * forallMaskExpression(SgForAllStatement *stmt)
Get the mask expression from the header of a SgForAllStatement.
void clearScopeNumbers(SgFunctionDefinition *functionDefinition)
Clears the cache of scope,integer pairs for the input function.
ROSE_DLL_API SgInitializedName * convertRefToInitializedName(SgNode *current, bool coarseGrain=true)
Variable references can be introduced by SgVarRef, SgPntrArrRefExp, SgInitializedName,...
ROSE_DLL_API SgNode * getSgNodeFromAbstractHandleString(const std::string &input_string)
Obtain a matching SgNode from an abstract handle string.
ROSE_DLL_API void moveStatementsBetweenBlocks(SgBasicBlock *sourceBlock, SgBasicBlock *targetBlock)
Move statements in first block to the second block (preserves order and rebuilds the symbol table).
ROSE_DLL_API bool templateDefinitionIsInClass(SgTemplateInstantiationMemberFunctionDecl *memberFunctionDeclaration)
Return true if template definition is in the class, false if outside of class.
ROSE_DLL_API void fixLabelStatement(SgLabelStatement *label_stmt, SgScopeStatement *scope)
Fix symbol table for SgLabelStatement. Used Internally when the label is built without knowing its ta...
ROSE_DLL_API void replaceExpressionWithStatement(SgExpression *from, SageInterface::StatementGenerator *to)
Replace a given expression with a list of statements produced by a generator.
ROSE_DLL_API void convertForToWhile(SgForStatement *f)
Add a step statement to the end of a loop body Add a new label to the end of the loop,...
ROSE_DLL_API void insertStatementBefore(SgStatement *targetStmt, SgStatement *newStmt, bool autoMovePreprocessingInfo=true)
Insert a statement before a target statement.
ROSE_DLL_API bool findFirstSgCastExpMarkedAsTransformation(SgNode *n, const std::string &s)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API void dumpInfo(SgNode *node, std::string desc="")
Dump information about a SgNode for debugging.
ROSE_DLL_API void convertFunctionDefinitionsToFunctionPrototypes(SgNode *node)
XXX This function operates on the new file used to support outlined function definitions....
ROSE_DLL_API void appendStatementList(const std::vector< SgStatement * > &stmt, SgScopeStatement *scope=NULL)
Append a list of statements to the end of the current scope, handle side effect of appending statemen...
SgNamedType * getDeclaredType(const SgDeclarationStatement *declaration)
Returns the type introduced by a declaration.
ROSE_DLL_API bool isIndexOperator(SgExpression *exp)
Is an overloaded operator an index operator (also referred to as call or subscript operators)....
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsBodyOfCatch(SgCatchOptionStmt *cos)
Check if the body of a 'catch' statement is a SgBasicBlock, create one if not.
std::vector< SgFile * > generateFileList()
Returns STL vector of SgFile IR node pointers.
ROSE_DLL_API int normalizeArrowExpWithAddressOfLeftOperand(SgNode *root, bool transformationGeneratedOnly=true)
Convert all code within root matching the patern of (&left)->right, and translate them into left....
bool hasTemplateSyntax(const SgName &name)
Collect all read and write references within stmt, which can be a function, a scope statement,...
ROSE_DLL_API void moveToSubdirectory(std::string directoryName, SgFile *file)
Move file to be generated in a subdirectory (will be generated by the unparser).
ROSE_DLL_API bool isAddressTaken(SgExpression *refExp)
Find a node by type using upward traversal.
ROSE_DLL_API bool hasSimpleChildrenList(SgScopeStatement *scope)
Check if a scope statement has a simple children statement list so insert additional statements under...
ROSE_DLL_API SgFunctionDeclaration * findMain(SgNode *currentNode)
top-down traversal from current node to find the main() function declaration
ROSE_DLL_API SgClassSymbol * lookupClassSymbolInParentScopes(const SgName &name, SgScopeStatement *currentScope=NULL, SgTemplateArgumentPtrList *templateArgumentList=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API void removeConsecutiveLabels(SgNode *top)
Remove consecutive labels.
ROSE_DLL_API void setLoopBody(SgScopeStatement *loop, SgStatement *body)
Add a step statement to the end of a loop body Add a new label to the end of the loop,...
bool getForLoopInformations(SgForStatement *for_loop, SgVariableSymbol *&iterator, SgExpression *&lower_bound, SgExpression *&upper_bound, SgExpression *&stride)
ROSE_DLL_API void appendExpression(SgExprListExp *, SgExpression *)
Append an expression to a SgExprListExp, set the parent pointer also.
ROSE_DLL_API bool isLambdaFunction(SgFunctionDeclaration *func)
Check if a function declaration is a C++11 lambda function.
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsBodyOfSwitch(SgSwitchStatement *ws)
Check if the body of a 'switch' statement is a SgBasicBlock, create one if not.
ROSE_DLL_API void prependStatement(SgStatement *stmt, SgScopeStatement *scope=NULL)
Prepend a statement to the beginning of the current scope, handling side effects as appropriate.
ROSE_DLL_API bool isCallToParticularFunction(SgFunctionDeclaration *decl, SgExpression *e)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API bool ROSE_DLL_API isMutable(SgInitializedName *name)
True if an SgInitializedName is "mutable' (has storage modifier set)
ROSE_DLL_API bool isCopyConstructible(SgType *type)
Is a type copy constructible? This may not quite work properly.
ROSE_DLL_API SgVariableSymbol * prependArg(SgFunctionParameterList *, SgInitializedName *)
Prepend an argument to SgFunctionParameterList.
ROSE_DLL_API void setSourcePositionAtRootAndAllChildren(SgNode *root)
Set the source code positon for the subtree (including the root).
ROSE_DLL_API SgExpression * copyExpression(SgExpression *e)
Deep copy an expression.
void setParameterList(actualFunction *func, SgFunctionParameterList *paralist)
Set parameter list for a function declaration, considering existing parameter list etc.
SgStatement * findLastDeclarationStatement(SgScopeStatement *scope, bool includePragma=false)
Find the last declaration statement within a scope (if any). This is often useful to decide where to ...
ROSE_DLL_API bool insideSystemHeader(SgLocatedNode *node)
Set source position info(Sg_File_Info) as transformation generated for all SgNodes in memory pool.
std::vector< SgDeclarationStatement * > getDependentDeclarations(SgStatement *stmt)
Get a statement's dependent declarations which declares the types used in the statement....
SgBasicBlock * makeSingleStatementBodyToBlock(SgStatement *singleStmt)
Make a single statement body to be a basic block. Its parent is if, while, catch, or upc_forall etc.
void computeUniqueNameForUseAsIdentifier(SgNode *astNode)
Traversal to set the global map of names to node and node to names.collisions to support generateUniq...
ROSE_DLL_API void collectReadOnlyVariables(SgStatement *stmt, std::set< SgInitializedName * > &readOnlyVars, bool coarseGrain=true)
Collect read only variables within a statement. The statement can be either of a function,...
std::string generateUniqueNameForUseAsIdentifier_support(SgDeclarationStatement *declaration)
Global map of name collisions to support generateUniqueNameForUseAsIdentifier() function.
ROSE_DLL_API PreprocessingInfo * findHeader(SgSourceFile *source_file, const std::string &header_file_name, bool isSystemHeader)
Find the preprocessingInfo node representing #include <header.h> or #include "header....
ROSE_DLL_API void myRemoveStatement(SgStatement *stmt)
A special purpose statement removal function, originally from inlinerSupport.h, Need Jeremiah's atten...
ROSE_DLL_API SgScopeStatement * getScope(const SgNode *astNode)
Get the closest scope from astNode. Return astNode if it is already a scope.
ROSE_DLL_API bool isStrictIntegerType(SgType *t)
Check if a type is an integral type, only allowing signed/unsigned short, int, long,...
ROSE_DLL_API bool is_Java_language()
ROSE_DLL_API void insertStatementAfter(SgStatement *targetStmt, SgStatement *newStmt, bool autoMovePreprocessingInfo=true)
Insert a statement after a target statement, Move around preprocessing info automatically by default.
ROSE_DLL_API bool isEquivalentType(const SgType *lhs, const SgType *rhs)
Test for equivalence of types independent of access permissions (private or protected modes for membe...
ROSE_DLL_API bool isTemplateInstantiationNode(SgNode *node)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API void removeStatement(SgStatement *stmt, bool autoRelocatePreprocessingInfo=true)
Remove a statement from its attach point of the AST. Automatically keep its associated preprocessing ...
ROSE_DLL_API SgOmpClauseBodyStatement * findEnclosingOmpClauseBodyStatement(SgStatement *s)
Find enclosing OpenMP clause body statement from s. If s is already one, return it directly.
ROSE_DLL_API bool scopeHasStatementsFromSameFile(SgScopeStatement *scope)
This function supports the token-based unparsing when used with unparsing of header files to know whe...
ROSE_DLL_API SgSourceFile * getEnclosingSourceFile(SgNode *n, const bool includingSelf=false)
Find enclosing source file node.
void rebuildSymbolTable(SgScopeStatement *scope)
Regenerate the symbol table.
ROSE_DLL_API SgSymbol * lookupSymbolInParentScopes(const SgName &name, SgScopeStatement *currentScope=NULL, SgTemplateParameterPtrList *templateParameterList=NULL, SgTemplateArgumentPtrList *templateArgumentList=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
void setBaseTypeDefiningDeclaration(SgVariableDeclaration *var_decl, SgDeclarationStatement *base_decl)
a better version for SgVariableDeclaration::set_baseTypeDefininingDeclaration(), handling all side ef...
ROSE_DLL_API void pastePreprocessingInfo(SgLocatedNode *dst_node, PreprocessingInfo::RelativePositionType pos, AttachedPreprocessingInfoType &saved_buf)
Paste preprocessing information from a buffer to a destination node. Used in combination of cutPrepro...
ROSE_DLL_API SgStatement * lastFrontEndSpecificStatement(SgGlobal *globalScope)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API SgFunctionType * findFunctionType(SgType *return_type, SgFunctionParameterTypeList *typeList)
Find the function type matching a function signature plus a given return type.
std::set< unsigned int > collectSourceSequenceNumbers(SgNode *astNode)
Collect all read and write references within stmt, which can be a function, a scope statement,...
ROSE_DLL_API bool is_OpenMP_language()
ROSE_DLL_API std::set< SgNode * > getFrontendSpecificNodes()
Find a node by type using upward traversal.
ROSE_DLL_API bool mergeAssignmentWithDeclaration(SgExprStatement *assign_stmt, SgVariableDeclaration *decl, bool removeAssignStmt=true)
Merge an assignment into its upstream declaration statement. Callers should make sure the merge is se...
ROSE_DLL_API void setFortranNumericLabel(SgStatement *stmt, int label_value, SgLabelSymbol::label_type_enum label_type=SgLabelSymbol::e_start_label_type, SgScopeStatement *label_scope=NULL)
Set a numerical label for a Fortran statement. The statement should have a enclosing function definit...
ROSE_DLL_API SgType * lookupNamedTypeInParentScopes(const std::string &type_name, SgScopeStatement *scope=NULL)
Lookup a named type based on its name, bottomup searching from a specified scope. Note name collison ...
ROSE_DLL_API SgFile * processFile(SgProject *, std::string, bool unparse=false)
Invoke JavaRose to translate a given file and put the resulting AST in the global space of the projec...
bool get(const Word *words, size_t idx)
Return a single bit.
void swap_child(SageNode &lhs, SageNode &rhs, SageChild *(SageNode::*getter)() const, void(SageNode::*setter)(SageChild *))
swaps children (of equal kind) between two ancestor nodes of the same type
std::remove_const< typenamestd::remove_reference< RoseVisitor >::type >::type dispatch(RoseVisitor &&rv, SgNode *n)
uncovers the type of SgNode and passes it to an function "handle" in RoseVisitor.
This file implements generic (template) sage query functions Currently this includes functions for: