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);
6038 idNumber = hasher.
toU64();
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 case V_SgBoolValExp:
8067 mlog[Sawyer::Message::Common::FATAL]
8068 <<
"FATAL: In templateArgumentEquivalence(): case SgTemplateArgument::nontype_argument: expression have the same variant "
8070 <<
" but comparison is not NIY!"
8076#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8077 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::nontype_argument: different variant of expression: returning false \n");
8085 if (arg1->get_templateDeclaration() == arg2->get_templateDeclaration())
8087#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8088 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::template_template_argument: checking for the same templateDeclaration: returning true \n");
8094 ROSE_ASSERT(!
"NIY: template template argument comparaison.");
8100 ROSE_ASSERT(!
"Try to compare template arguments of unknown type...");
8109 ROSE_ASSERT(!
"Try to compare template arguments of unknown type start_of_pack_expansion_argument");
8115 printf (
"Error: default case not handled! \n");
8123#define DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE 0
8127 if (list1.size() != list2.size())
8129#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8130 printf (
"In templateArgumentListEquivalence(): different list sizes: returning false \n");
8131 printf (
" --- list1.size() = %zu \n",list1.size());
8132 printf (
" --- list2.size() = %zu \n",list2.size());
8139#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8140 printf (
"In templateArgumentListEquivalence(): same list using STL equality operator: returning true \n");
8146 for (
size_t i = 0; i < list1.size(); i++)
8148#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8149 printf (
"In templateArgumentListEquivalence(): calling templateArgumentEquivalence() for i = %zu \n",i);
8154#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8155 printf (
"In templateArgumentListEquivalence(): calling templateArgumentEquivalence() for i = %zu --- returned false: returning false \n",i);
8161#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8162 printf (
"In templateArgumentListEquivalence(): reached base of function: returning true \n");
8182 SgName labelname =
"rose_label__";
8195 if (isSgNullExpression(f->get_increment()))
return;
8200 f->set_increment(ne);
8210 ROSE_ASSERT(condstmt);
8212 if (isSgNullStatement(condstmt))
return true;
8216 return isSgNullExpression(exprStmt->get_expression());
8225 bbStmts = initStmts;
8226 for (
size_t i = 0; i < bbStmts.size(); ++i) {
8227 bbStmts[i]->set_parent(bb);
8230 const bool testIsNull = hasEmptyCondition(f);
8240 Rose_STL_Container<SgNode*> fors = NodeQuery::querySubTree(top,
8242 for (
size_t i = 0; i < fors.size(); ++i) {
8250 Rose_STL_Container<SgNode*> allGotos = NodeQuery::querySubTree(scope, V_SgGotoStatement);
8252 vector<SgGotoStatement*> result;
8253 for (Rose_STL_Container<SgNode*>::const_iterator i = allGotos.begin(); i != allGotos.end(); ++i) {
8254 if (isSgGotoStatement(*i)->
get_label() == l) {
8255 result.push_back(isSgGotoStatement(*i));
8263 vector<SgReturnStmt*> SageInterface::findReturnStmts(
SgStatement* scope) {
8266 Rose_STL_Container<SgNode*> returns = NodeQuery::querySubTree(scope, V_SgReturnStmt);
8268 vector<SgReturnStmt*> result;
8269 for (Rose_STL_Container<SgNode*>::const_iterator i = returns.begin(); i != returns.end(); ++i) {
8270 result.push_back(isSgReturnStmt(*i));
8276static void getSwitchCasesHelper(
SgStatement* top, vector<SgStatement*>& result) {
8278 if (isSgSwitchStatement(top))
return;
8279 if (isSgCaseOptionStmt(top) || isSgDefaultOptionStmt(top)) {
8280 result.push_back(top);
8283 for (
unsigned int i = 0; i < children.size(); ++i) {
8284 if (isSgStatement(children[i])) {
8285 getSwitchCasesHelper(isSgStatement(children[i]), result);
8291 vector<SgStatement*> result;
8292 getSwitchCasesHelper(sw->
get_body(), result);
8322 if (
const SgSymbol* symbol = isSgSymbol(astNode))
8323 return symbol->get_scope();
8328 else if (
const SgQualifiedName* qualifiedName = isSgQualifiedName(astNode))
8332 const SgNode* parentNode = astNode;
8333 while (!isSgScopeStatement(parentNode))
8338 if (isSgFunctionParameterList(parentNode) || isSgCtorInitializerList(parentNode))
8341 ROSE_ASSERT(funcDeclaration != NULL);
8343 if (funcDeclaration != NULL)
8345 return funcDeclaration->get_definition();
8350 if (parentNode == NULL)
8358 if ( isSgScopeStatement(parentNode) == NULL &&
8359 dynamic_cast<const SgType*
>(parentNode) == NULL &&
8360 dynamic_cast<const SgSymbol*
>(parentNode) == NULL )
8362 printf (
"Error: In SageInterface::getScope(): could not trace back to SgScopeStatement node \n");
8367 if (
dynamic_cast<const SgType*
>(parentNode) != NULL ||
dynamic_cast<const SgSymbol*
>(parentNode) != NULL )
8369 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());
8377 ROSE_ASSERT (scopeStatement != NULL);
8380 if (isSgScopeStatement(astNode))
8381 if (isSgScopeStatement(parentNode))
8383 ROSE_ASSERT (astNode == parentNode);
8410 printf (
"In getVarSymFromName(): name->get_name() = %s \n",name->get_name().str());
8413 ROSE_ASSERT (scope != NULL);
8415 printf (
"In getVarSymFromName(): name->get_name() = %s scope = %p = %s \n",name->get_name().str(),scope,scope->
class_name().c_str());
8417 v_sym = scope->lookup_var_symbol (name->get_name());
8426 if (decl_scope != NULL)
8427 v_sym = decl_scope->lookup_var_symbol (name->get_name());
8430 cerr <<
"\t\t*** WARNING: Can't seem to find a symbol for '"
8431 << name->get_name ().str ()
8461getVarSym_const (
const SgNode* n)
8467 v_sym = isSgVarRefExp (n)->get_symbol ();
8469 case V_SgInitializedName:
8470 v_sym = getVarSymFromName_const (isSgInitializedName (n));
8496 if (!decl)
return 0;
8497 const SgInitializedNamePtrList& names = decl->
get_variables ();
8498 if (names.begin () != names.end ())
8501 return getVarSym_const (name);
8520 if (names.begin () != names.end ())
8521 return *(names.begin ());
8527static void findBreakStmtsHelper(
SgStatement* code,
const std::string& fortranLabel,
bool inOutermostBody, vector<SgBreakStmt*>& breakStmts) {
8528 if (isSgWhileStmt(code) || isSgDoWhileStmt(code) || isSgForStatement(code) || isSgSwitchStatement(code)) {
8529 if (fortranLabel ==
"") {
8534 inOutermostBody =
false;
8537 if (isSgBreakStmt(code)) {
8539 bool breakMatchesThisConstruct =
false;
8540 if (bs->get_do_string_label() ==
"") {
8542 breakMatchesThisConstruct = inOutermostBody;
8544 breakMatchesThisConstruct = (fortranLabel == bs->get_do_string_label());
8546 if (breakMatchesThisConstruct) {
8547 breakStmts.push_back(bs);
8552 for (
unsigned int i = 0; i < children.size(); ++i) {
8553 if (isSgStatement(children[i])) {
8554 findBreakStmtsHelper(isSgStatement(children[i]), fortranLabel, inOutermostBody, breakStmts);
8562 vector<SgBreakStmt*> result;
8563 findBreakStmtsHelper(code, fortranLabel,
true, result);
8568static void findContinueStmtsHelper(
SgStatement* code,
const std::string& fortranLabel,
bool inOutermostBody, vector<SgContinueStmt*>& continueStmts) {
8569 if (isSgWhileStmt(code) || isSgDoWhileStmt(code) || isSgForStatement(code)) {
8570 if (fortranLabel ==
"") {
8575 inOutermostBody =
false;
8578 if (isSgContinueStmt(code)) {
8580 bool continueMatchesThisConstruct =
false;
8581 if (cs->get_do_string_label() ==
"") {
8583 continueMatchesThisConstruct = inOutermostBody;
8585 continueMatchesThisConstruct = (fortranLabel == cs->get_do_string_label());
8587 if (continueMatchesThisConstruct) {
8588 continueStmts.push_back(cs);
8593 for (
unsigned int i = 0; i < children.size(); ++i) {
8595 if (stmnt != NULL) {
8596 findContinueStmtsHelper(stmnt, fortranLabel, inOutermostBody, continueStmts);
8604 vector<SgContinueStmt*> result;
8605 findContinueStmtsHelper(code, fortranLabel,
true, result);
8616 std::cout <<
"Starting getInitializerOfExpression on 0x" << std::hex << (int)n <<
", which has type " << n->
sage_class_name() << std::endl;
8618 while (!isSgInitializer(n)) {
8621 std::cout <<
"Continuing getInitializerOfExpression on 0x" << std::hex << (int)n;
8623 std::cout << std::endl;
8627 return isSgInitializer(n);
8635 std::vector<SgVariableSymbol*> symbols;
8637 virtual void visit(
SgNode* n) {
8638 if (isSgVarRefExp(n))
8639 symbols.push_back(isSgVarRefExp(n)->get_symbol());
8643 GetSymbolsUsedInExpressionVisitor vis;
8644 vis.traverse(expr, preorder);
8651 return getEnclosingNode<SgSourceFile>(n, includingSelf);
8657 return findDeclarationStatement<SgFunctionDeclaration> (root, name, scope, isDefining);
8668 return getEnclosingNode<SgFunctionDefinition>(n, includingSelf);
8674 return getEnclosingNode<SgFunctionDeclaration>(astNode, includingSelf);
8684 return getEnclosingNode<SgGlobal>(astNode,
true );
8689 return getEnclosingNode<SgClassDefinition>(astNode, includingSelf);
8697 return getEnclosingNode<SgClassDeclaration>(astNode,
true);
8702 return getEnclosingNode<SgExprListExp>(astNode, includingSelf);
8708 bool returnValue =
false;
8714 virtual void visit(
SgNode* n)
8716 if (n == expression_target)
8722 Visitor(
SgExpression* expr) : expression_target(expr), in_subtree(
false) {}
8725 Visitor traversal(exp);
8727 traversal.traverse(subtree, preorder);
8729 returnValue = traversal.in_subtree;
8743 ROSE_ASSERT (functionCallExp != NULL);
8745 SgExpression* expression = functionCallExp->get_function();
8746 ROSE_ASSERT (expression != NULL);
8750 SgDotExp* dotExp = isSgDotExp(expression);
8753 ROSE_ASSERT (dotExp != NULL);
8756 ROSE_ASSERT (rhsOperand != NULL);
8761 if (memberFunctionRefExp != NULL)
8768 if (functionReferenceExp != NULL)
8773 SgArrowExp* arrowExp = isSgArrowExp(expression);
8774 if ( arrowExp != NULL)
8776 ROSE_ASSERT (arrowExp != NULL);
8779 ROSE_ASSERT (rhsOperand != NULL);
8784 if (memberFunctionRefExp != NULL)
8790 return returnDeclaration;
8795std::list<SgClassType*>
8800#define DEBUG_DATA_MEMBER_TYPE_CHAIN 0
8806 ROSE_ASSERT(varRefExp != NULL || memberFunctionRefExp != NULL);
8808 std::list<SgClassType*> returnTypeChain;
8811 std::list<SgClassType*> classChain;
8816 if (varRefExp != NULL)
8822 ROSE_ASSERT(memberFunctionRefExp != NULL);
8827 ROSE_ASSERT(parent != NULL);
8829#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8830 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): parent = %p = %s \n",parent,parent->
class_name().c_str());
8834 SgDotExp* dotExp = isSgDotExp(parent);
8838 if (arrowExp != NULL)
8840#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8841 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): Found an arrow expression \n");
8843 binaryOperator = arrowExp;
8848#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8849 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): Found an dot expression \n");
8851 binaryOperator = dotExp;
8855 if (binaryOperator != NULL)
8858 ROSE_ASSERT(lhs != NULL);
8860#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8861 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs = %p = %s \n",lhs,lhs->
class_name().c_str());
8867 while (isSgCastExp(temp_lhs) != NULL)
8869 cast = isSgCastExp(temp_lhs);
8870 ROSE_ASSERT(cast != NULL);
8873#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8874 printf (
"Top of loop: processing cast = %p temp_lhs = %p = %s \n",cast,temp_lhs,temp_lhs->
class_name().c_str());
8876 ROSE_ASSERT(cast->
get_type() != NULL);
8878 if (classType == NULL)
8880#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8881 printf (
" --- looking for base type: In SageInterface::getClassTypeChainForDataMemberReference(): classType == NULL: cast->get_type() = %p = %s \n",
8884 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);
8885 ROSE_ASSERT(baseType != NULL);
8887#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8888 printf (
" --- baseType = %p = %s name = %s \n",baseType,baseType->
class_name().c_str(),
get_name(baseType).c_str());
8890 classType = isSgClassType(baseType);
8894 ROSE_ASSERT(temp_lhs != NULL);
8896#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8897 printf (
" --- temp_lhs = %p = %s name = %s \n",temp_lhs,temp_lhs->
class_name().c_str(),
get_name(temp_lhs).c_str());
8903 if (classType != NULL)
8905 classChain.push_front(classType);
8909 if (classType != NULL)
8920 ROSE_ASSERT(target_type != NULL);
8921 SgClassType* target_classType = isSgClassType(target_type);
8923 if (target_classType != NULL)
8926 ROSE_ASSERT(target_declaration != NULL);
8927 SgClassDeclaration* target_classDeclaration = isSgClassDeclaration(target_declaration);
8928 ROSE_ASSERT(target_classDeclaration != NULL);
8930 ROSE_ASSERT(target_definingClassDeclaration != NULL);
8931 SgScopeStatement* target_scope = target_definingClassDeclaration->get_definition();
8932 ROSE_ASSERT(target_scope != NULL);
8934#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8935 printf (
"target_classDeclaration = %p = %s name = %s target_scope = %p = %s \n",
8936 target_classDeclaration,target_classDeclaration->
class_name().c_str(),target_classDeclaration->get_name().str(),target_scope,target_scope->
class_name().c_str());
8939 ROSE_ASSERT(source_classType != NULL);
8941 ROSE_ASSERT(source_declaration != NULL);
8942 SgClassDeclaration* source_classDeclaration = isSgClassDeclaration(source_declaration);
8943 ROSE_ASSERT(source_classDeclaration != NULL);
8945 ROSE_ASSERT(source_definingClassDeclaration != NULL);
8946 SgScopeStatement* source_scope = source_definingClassDeclaration->get_definition();
8947 ROSE_ASSERT(source_scope != NULL);
8949#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8950 printf (
"source_classDeclaration = %p = %s name = %s source_scope = %p = %s \n",
8951 source_classDeclaration,source_classDeclaration->
class_name().c_str(),source_classDeclaration->get_name().str(),source_scope,source_scope->
class_name().c_str());
8954 while (tmp_scope != NULL && tmp_scope != target_scope)
8956#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8957 printf (
"tmp_scope = %p = %s \n",tmp_scope,tmp_scope->
class_name().c_str());
8960 ROSE_ASSERT(tmp_classDefinition != NULL);
8962 ROSE_ASSERT(tmp_classDeclaration != NULL);
8964#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8965 SgName scope_name = tmp_classDeclaration->get_name();
8966 printf (
"scope_name = %s \n",scope_name.str());
8968 SgClassType* tmp_classType = tmp_classDeclaration->get_type();
8969 ROSE_ASSERT(tmp_classType != NULL);
8972 classChain.push_front(tmp_classType);
8976 if (isSgGlobal(tmp_scope) != NULL)
8985 printf (
"In loop processing cast: target_type = %p = %s \n",target_type,target_type->
class_name().c_str());
8991#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8992 printf (
"Bottom of loop: processing cast = %p temp_lhs = %p = %s \n",cast,temp_lhs,temp_lhs->
class_name().c_str());
8998 ROSE_ASSERT(temp_lhs != NULL);
9000#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9001 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): temp_lhs = %p = %s \n",temp_lhs,temp_lhs->
class_name().c_str());
9004 SgVarRefExp* derivedClassVarRefExp = isSgVarRefExp(temp_lhs);
9005 if (derivedClassVarRefExp != NULL)
9007 SgVariableSymbol* derivedClassVariableSymbol = derivedClassVarRefExp->get_symbol();
9008 ROSE_ASSERT(derivedClassVariableSymbol != NULL);
9010 SgName derivedClassVariableName = derivedClassVariableSymbol->
get_name();
9012#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9013 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): derivedClassVariableName = %s \n",derivedClassVariableName.str());
9017 ROSE_ASSERT(type != NULL);
9019#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9020 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs type = %p = %s \n",type,type->
class_name().c_str());
9024 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);
9026#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9027 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs stripped_type = %p = %s \n",stripped_type,stripped_type->
class_name().c_str());
9031 SgClassType* classType = isSgClassType(stripped_type);
9034 if (classType != NULL)
9036#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9037 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs classType = %p = %s \n",classType,classType->
class_name().c_str());
9038 SgClassDeclaration* classDeclaration = isSgClassDeclaration(classType->get_declaration());
9039 ROSE_ASSERT(classDeclaration != NULL);
9040 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs classDeclaration = %p = %s name = %s \n",
9041 classDeclaration,classDeclaration->
class_name().c_str(),classDeclaration->get_name().str());
9046 classChain.push_front(classType);
9050#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9051 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs stripped_type is not a SgClassType \n");
9057#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9058 printf (
"Need to support alternative to SgVarRefExp: temp_lhs = %p = %s \n",temp_lhs,temp_lhs->
class_name().c_str());
9061 ROSE_ASSERT(type != NULL);
9063#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9064 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs type = %p = %s name = %s \n",type,type->
class_name().c_str(),
get_name(type).c_str());
9068 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);
9070#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9071 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());
9074 SgClassType* classType = isSgClassType(stripped_type);
9076 if (classType != NULL)
9078 classChain.push_front(classType);
9082#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9083 printf (
"classChain.size() = %zu \n",classChain.size());
9084 std::list<SgClassType*>::iterator iter = classChain.begin();
9085 while(iter != classChain.end())
9087 printf (
" --- *iter = %p = %s name = %s \n",*iter,(*iter)->class_name().c_str(),(*iter)->get_name().str());
9100 if (varRefExp != NULL)
9102 ROSE_ASSERT(varRefExp != NULL);
9103 ROSE_ASSERT(memberFunctionRefExp == NULL);
9105 referenceSymbol = varRefExp->get_symbol();
9109 ROSE_ASSERT(varRefExp == NULL);
9110 ROSE_ASSERT(memberFunctionRefExp != NULL);
9112 referenceSymbol = memberFunctionRefExp->get_symbol();
9114 ROSE_ASSERT(referenceSymbol != NULL);
9117#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9118 printf (
"referenceSymbol = %p = %s \n",referenceSymbol,referenceSymbol->
class_name().c_str());
9119 printf (
"symbolName = %s \n",symbolName.str());
9124 if (functionSymbol != NULL)
9129 if (templateInstantiationMemberFunctionDeclaration != NULL)
9131#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9132 printf (
"This is a template name, we want the name without template arguments \n");
9133 printf (
"templateInstantiationMemberFunctionDeclaration = %p \n",templateInstantiationMemberFunctionDeclaration);
9134 printf (
"templateInstantiationMemberFunctionDeclaration->get_name() = %s \n",templateInstantiationMemberFunctionDeclaration->get_name().str());
9141 isSgTemplateMemberFunctionDeclaration(templateInstantiationMemberFunctionDeclaration->
get_templateDeclaration());
9142 if (templateMemberFunctionDeclaration != NULL)
9144#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9145 printf (
"templateMemberFunctionDeclaration = %p \n",templateMemberFunctionDeclaration);
9146 printf (
"templateMemberFunctionDeclaration->get_name() = %s \n",templateMemberFunctionDeclaration->get_name().str());
9149 symbolName = templateMemberFunctionDeclaration->get_name();
9153#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9154 printf (
"templateMemberFunctionDeclaration == NULL: template declaration not available from template instantiation (rare, I think) \n");
9158 printf (
"Exiting as a test! \n");
9166 ROSE_ASSERT(declarationStatement != NULL);
9167#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9168 printf (
"functionSymbol != NULL: but declaration is not a member function: declarationStatement = %p = %s \n",declarationStatement,declarationStatement->
class_name().c_str());
9175 if (variableSymbol != NULL)
9181#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9182 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): NOTE: referenceSymbol is not a SgFunctionSymbol or SgVariableSymbol \n");
9185 printf (
"Exiting as a test! \n");
9192#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9193 printf (
"symbolName = %s \n",symbolName.str());
9202 std::list<SgClassType*> saveList;
9204#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9205 printf (
"classChain.size() = %zu \n",classChain.size());
9208 std::list<SgClassType*>::iterator i = classChain.begin();
9209 std::list<SgClassType*>::iterator save_iter = i;
9215 bool ambiguityDetectedSoSaveWholeChain =
false;
9217 while(i != classChain.end())
9219#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9220 printf (
"******** TOP OF WHILE LOOP ******** \n");
9221 printf (
" --- *i = %p = %s name = %s \n",*i,(*i)->class_name().c_str(),(*i)->get_name().str());
9222 printf (
" --- --- referenceSymbol = %p = %s \n",referenceSymbol,referenceSymbol->
class_name().c_str());
9224 bool ambiguityDetected =
false;
9227 ROSE_ASSERT(declarationStatement != NULL);
9229 if (definingDeclarationStatement != NULL)
9231 SgClassDeclaration* classDeclaration = isSgClassDeclaration(definingDeclarationStatement);
9232 ROSE_ASSERT(classDeclaration != NULL);
9235#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9236 printf (
" --- classDeclaration = %p = %s name = %s \n",classDeclaration,classDeclaration->
class_name().c_str(),classDeclaration->get_name().str());
9237 printf (
" --- classDefinition = %p = %s \n",classDefinition,classDefinition->
class_name().c_str());
9240 ambiguityDetected = classDefinition->hasAmbiguity(symbolName,referenceSymbol);
9242#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9243 printf (
" --- ambiguityDetected = %s \n",ambiguityDetected ?
"true" :
"false");
9248 if (ambiguityDetected ==
true || ambiguityDetectedSoSaveWholeChain ==
true)
9250 ambiguityDetectedSoSaveWholeChain =
true;
9252 if (save_iter != classChain.end())
9254#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9255 printf (
" --- add to saveList: *save_iter = %p \n",*save_iter);
9257 saveList.push_back(*save_iter);
9261#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9262 printf (
" --- save_iter == classChain.end() \n");
9267#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9268 printf (
"******** BOTTOM OF WHILE LOOP ******** \n");
9278#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9279 printf (
"saveList.size() = %zu \n",saveList.size());
9280 std::list<SgClassType*>::iterator saveList_iterator = saveList.begin();
9281 while (saveList_iterator != saveList.end())
9283 printf (
" --- *saveList_iterator = %p = %s name = %s \n",*saveList_iterator,(*saveList_iterator)->class_name().c_str(),(*saveList_iterator)->get_name().str());
9285 saveList_iterator++;
9289 returnTypeChain = saveList;
9294 return returnTypeChain;
9304#define DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE 0
9306 ROSE_ASSERT(memberFunctionRefExp != NULL);
9308 bool returnValue =
false;
9314 SgDotExp* dotExp = isSgDotExp(parent);
9321 if (arrowExp != NULL || dotExp != NULL || addressOfOp != NULL)
9325 ROSE_ASSERT(symbol != NULL);
9328 ROSE_ASSERT(functionDeclaration != NULL);
9331 if (functionDeclaration != NULL)
9333 bool isStatic = functionDeclaration->get_declarationModifier().get_storageModifier().
isStatic();
9334#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9335 printf (
"isStatic = %s \n",
isStatic ?
"true" :
"false");
9340 ROSE_ASSERT(scope != NULL);
9343 if (classDefinition != NULL)
9351#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9352 printf (
"In SageInterface::isMemberFunctionMemberReference(): memberFunctionRefExp is not associated with variableDeclaration (could not compute if it is static data member) \n");
9358#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9359 printf (
"In SageInterface::isMemberFunctionMemberReference(): memberFunctionRefExp parent is not a is not SgArrowExp or SgDotExp expression \n");
9363#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9364 printf (
"Leaving SageInterface::isMemberFunctionMemberReference(): returnValue = %s \n",returnValue ?
"true" :
"false");
9383#define DEBUG_IS_DATA_MEMBER_REFERENCE 0
9385 ROSE_ASSERT(varRefExp != NULL);
9387 bool returnValue =
false;
9393 SgDotExp* dotExp = isSgDotExp(parent);
9397 if (arrowExp != NULL || dotExp != NULL || addressOfOp != NULL)
9399 if (arrowExp != NULL)
9403 ROSE_ASSERT(parentOfArrowExp != NULL);
9404 SgSizeOfOp* sizeOfOp = isSgSizeOfOp(parentOfArrowExp);
9405 if (sizeOfOp != NULL && sizeOfOp->get_is_objectless_nonstatic_data_member_reference() ==
true)
9408#if DEBUG_IS_DATA_MEMBER_REFERENCE
9409 printf (
"In SageInterface::isDataMemberReference(): Found case of expression used in sizeof with objectless_nonstatic_data_member_reference \n");
9416 ROSE_ASSERT(symbol != NULL);
9419 ROSE_ASSERT(initializedName != NULL);
9423 if (variableDeclaration != NULL)
9425 bool isStatic = variableDeclaration->get_declarationModifier().get_storageModifier().
isStatic();
9429 ROSE_ASSERT(scope != NULL);
9432 if (classDefinition != NULL)
9440#if DEBUG_IS_DATA_MEMBER_REFERENCE
9441 printf (
"In SageInterface::isDataMemberReference(): varRefExp is not associated with variableDeclaration (could not compute if it is static data member) \n");
9447#if DEBUG_IS_DATA_MEMBER_REFERENCE
9448 printf (
"In SageInterface::isDataMemberReference(): varRefExp parent is not a is not SgArrowExp or SgDotExp expression \n");
9452#if DEBUG_IS_DATA_MEMBER_REFERENCE
9453 printf (
"Leaving SageInterface::isDataMemberReference(): returnValue = %s \n",returnValue ?
"true" :
"false");
9465 ROSE_ASSERT(varRefExp != NULL);
9467 bool returnValue =
false;
9471 if (addressOfOp != NULL)
9489 ROSE_ASSERT(varRefExp != NULL || memberFunctionRefExp != NULL);
9493 ROSE_ASSERT(refExp != NULL);
9495 bool returnValue =
false;
9500 if (addressOfOp != NULL)
9518 ROSE_ASSERT (astNode != NULL);
9522 ROSE_ASSERT (isSgProject(astNode) == NULL);
9524 SgNode* previous_parent = NULL;
9525 SgNode* previous_previous_parent = NULL;
9527 SgNode* parent = astNode;
9529 while ( (parent != NULL) && (isSgFile(parent) == NULL) && isSgJavaPackageDeclaration(parent) == NULL)
9532 printf (
"In getEnclosingFileNode(): parent = %p = %s \n",parent,parent->
class_name().c_str());
9534 previous_previous_parent = previous_parent;
9535 previous_parent = parent;
9540 if (previous_previous_parent != NULL && previous_parent != NULL && isSgJavaPackageDeclaration(parent) != NULL)
9544 printf (
"parent = %p = %s \n",parent,parent->
class_name().c_str());
9545 printf (
"previous_parent = %p = %s \n",previous_parent,previous_parent->
class_name().c_str());
9546 printf (
"previous_previous_parent = %p = %s \n",previous_previous_parent,previous_previous_parent->
class_name().c_str());
9548 SgClassDeclaration* classDeclaration = isSgClassDeclaration(previous_previous_parent);
9549 if (classDeclaration != NULL)
9552 printf (
"Class name = %p = %s = %s \n",classDeclaration,classDeclaration->
class_name().c_str(),classDeclaration->get_name().str());
9557 SgProject* project = TransformationSupport::getProject(parent);
9558 ROSE_ASSERT(project != NULL);
9559 SgFileList* fileList = project->get_fileList_ptr();
9560 ROSE_ASSERT(fileList != NULL);
9561 SgFilePtrList & vectorFile = fileList->get_listOfFiles();
9563 printf (
"Output list of files: \n");
9565 SgFilePtrList::iterator i = vectorFile.begin();
9566 while (i != vectorFile.end())
9569 ROSE_ASSERT(file != NULL);
9571 printf (
" --- filename = %s \n",file->
getFileName().c_str());
9574 string filenameWithoutPath = file->get_sourceFileNameWithoutPath();
9575 string classname = classDeclaration->get_name();
9576 string matchingfilename = classname +
".java";
9578 printf (
" --- --- filename = %s \n",filename.c_str());
9579 printf (
" --- --- filenameWithoutPath = %s \n",filenameWithoutPath.c_str());
9580 printf (
" --- --- classname = %s \n",classname.c_str());
9581 printf (
" --- --- matchingfilename = %s \n",matchingfilename.c_str());
9583 if (filenameWithoutPath == matchingfilename)
9586 printf (
" return file = %p \n",file);
9602 SgSourceFile *sourcefile = isSgSourceFile(attribute->getNode());
9603 ROSE_ASSERT(sourcefile != NULL);
9612 if (previous_parent == NULL && isSgJavaPackageDeclaration(parent) != NULL)
9615 ROSE_ASSERT(isSgJavaPackageDeclaration(astNode) != NULL);
9620 if (previous_previous_parent == NULL && isSgJavaPackageDeclaration(parent) != NULL)
9623 ROSE_ASSERT(isSgClassDefinition(astNode) != NULL);
9634 if (parent ==
nullptr)
9640 return isSgFile(parent);
9646 std::set<SgNode*> specific;
9647 std::set<SgNode*> non_specific;
9649 static void recursive_collect(
SgNode* node , std::set<SgNode *> & collection ) {
9651 if (node == NULL || !collection.insert(node).second)
return;
9654 for (std::vector<std::pair<SgNode*, std::string> >::iterator i = data_members.begin(); i != data_members.end(); ++i) {
9655 recursive_collect(i->first, collection);
9662 if (fileInfo != NULL) {
9663 if (fileInfo->isFrontendSpecific()) {
9665 recursive_collect(n, specific);
9667 non_specific.insert(n);
9668 recursive_collect(n, non_specific);
9671 fileInfo = isSg_File_Info(n);
9672 if (fileInfo != NULL) {
9673 if (fileInfo->isFrontendSpecific()) {
9676 non_specific.insert(n);
9682 std::set<SgNode*> apply() {
9683 traverseMemoryPool();
9685 std::set<SgNode*> result;
9687 std::set_difference(
9688 specific.begin(), specific.end(),
9689 non_specific.begin(), non_specific.end(),
9690 std::insert_iterator<set<SgNode*> >(result, result.begin())
9697 FrontendSpecificTraversal fst;
9710 void visit(
SgNode *astNode)
9712 ROSE_ASSERT(astNode != NULL);
9714 if (file_info != NULL)
9718 printf (
"Found shared node: astNode = %p = %s \n",astNode,astNode->
class_name().c_str());
9724 OutputSharedNodesTraversal tt;
9725 tt.traverse(node,preorder);
9733 while (n && !isSgStatement(n)) n = n->
get_parent();
9734 return isSgStatement(n);
9743SageInterface::DeferredTransformation::DeferredTransformation()
9744 : deferredTransformationKind(e_default),
9745 statementToRemove(NULL),
9746 statementToAdd(NULL),
9747 class_definition(NULL),
9748 target_class_member(NULL),
9749 new_function_prototype(NULL),
9751 locationToOverwriteWithTransformation(NULL),
9752 transformationToOverwriteFirstStatementInInterval(NULL),
9753 blockOfStatementsToOutline(NULL)
9757 printf (
"In SageInterface::DeferredTransformation default constructor called \n");
9765SageInterface::DeferredTransformation::DeferredTransformation(
9769 : deferredTransformationKind(e_outliner),
9770 statementToRemove(NULL),
9771 statementToAdd(NULL),
9772 class_definition(input_class_definition),
9773 target_class_member(input_target_class_member),
9774 new_function_prototype(input_new_function_prototype),
9776 locationToOverwriteWithTransformation(NULL),
9777 transformationToOverwriteFirstStatementInInterval(NULL),
9778 blockOfStatementsToOutline(NULL)
9782 printf (
"In SageInterface::DeferredTransformation constructor for outliner called \n");
9790 printf (
"In SageInterface::DeferredTransformation constructor for replaceDefiningFunctionDeclarationWithFunctionPrototype called \n");
9796 X.deferredTransformationKind = e_replaceDefiningFunctionDeclarationWithFunctionPrototype;
9797 X.statementToRemove = functionDeclaration;
9798 X.statementToAdd = NULL;
9799 X.class_definition = NULL;
9800 X.target_class_member = NULL;
9801 X.new_function_prototype = NULL;
9804 X.locationToOverwriteWithTransformation = NULL;
9805 X.transformationToOverwriteFirstStatementInInterval = NULL;
9806 X.blockOfStatementsToOutline = NULL;
9812SageInterface::DeferredTransformation::replaceStatement(
SgStatement* oldStmt,
SgStatement* newStmt,
bool )
9815 printf (
"In SageInterface::DeferredTransformation constructor for replaceStatement called \n");
9821 X.deferredTransformationKind = e_replaceStatement;
9822 X.statementToRemove = oldStmt;
9823 X.statementToAdd = newStmt;
9824 X.class_definition = NULL;
9825 X.target_class_member = NULL;
9826 X.new_function_prototype = NULL;
9829 X.locationToOverwriteWithTransformation = NULL;
9830 X.transformationToOverwriteFirstStatementInInterval = NULL;
9831 X.blockOfStatementsToOutline = NULL;
9836SageInterface::DeferredTransformation::DeferredTransformation (
const DeferredTransformation& X)
9838 : deferredTransformationKind(X.deferredTransformationKind),
9839 statementToRemove(X.statementToRemove),
9840 statementToAdd(X.StatementToAdd),
9841 class_definition(X.class_definition),
9842 target_class_member(X.target_class_member),
9843 new_function_prototype(X.new_function_prototype),
9844 targetClasses(X.targetClasses),
9845 targetFriends(X.targetFriends)
9851 printf (
"In SageInterface::DeferredTransformation copy constructor called \n");
9861 printf (
"Inside of SageInterface::DeferredTransformation::operator= (const DeferredTransformation& X) \n");
9866 targetFriends = X.targetFriends;
9867 targetClasses = X.targetClasses;
9873 transformationLabel = X.transformationLabel;
9876 deferredTransformationKind = X.deferredTransformationKind;
9877 statementToRemove = X.statementToRemove;
9878 statementToAdd = X.statementToAdd;
9880 class_definition = X.class_definition;
9881 target_class_member = X.target_class_member;
9882 new_function_prototype = X.new_function_prototype;
9883 targetClasses = X.targetClasses;
9884 targetFriends = X.targetFriends;
9887 statementInterval = X.statementInterval;
9888 locationToOverwriteWithTransformation = X.locationToOverwriteWithTransformation;
9889 transformationToOverwriteFirstStatementInInterval = X.transformationToOverwriteFirstStatementInInterval;
9892 blockOfStatementsToOutline = X.blockOfStatementsToOutline;
9903std::string SageInterface::DeferredTransformation::outputDeferredTransformationKind(
const TransformationKind & kind)
9905 string returnValue =
"uninitialized";
9908 case e_error: returnValue =
"e_error";
break;
9909 case e_default: returnValue =
"e_default";
break;
9910 case e_outliner: returnValue =
"e_outliner";
break;
9911 case e_replaceStatement: returnValue =
"e_replaceStatement";
break;
9912 case e_removeStatement: returnValue =
"e_removeStatement";
break;
9913 case e_replaceDefiningFunctionDeclarationWithFunctionPrototype: returnValue =
"e_replaceDefiningFunctionDeclarationWithFunctionPrototype";
break;
9914 case e_last: returnValue =
"e_last";
break;
9917 printf (
"Error: SageInterface::DeferredTransformation::get_deferredTransformationKind_string(): default reached \n");
9925void SageInterface::DeferredTransformation::display ( std::string label )
const
9927 printf (
"SageInterface::DeferredTransformation::display(): label = %s \n",label.c_str());
9932 printf (
" --- transformationLabel = %s \n",transformationLabel.c_str());
9934 printf (
" --- deferredTransformationKind = %s \n",outputDeferredTransformationKind(deferredTransformationKind).c_str());
9935 if (statementToRemove != NULL)
9937 printf (
" --- statementToRemove = %p = %s name = %s \n",statementToRemove,statementToRemove->class_name().c_str(),
get_name(statementToRemove).c_str());
9941 printf (
" --- statementToRemove == NULL \n");
9944 if (statementToAdd != NULL)
9946 printf (
" --- statementToAdd = %p = %s name = %s \n",statementToAdd,statementToAdd->class_name().c_str(),
get_name(statementToAdd).c_str());
9950 printf (
" --- statementToAdd == NULL \n");
9953 if (class_definition != NULL)
9956 printf (
" --- class_definition = %p \n",class_definition);
9959 if (target_class_member != NULL)
9961 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());
9964 if (new_function_prototype != NULL)
9966 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());
9970 if (locationToOverwriteWithTransformation != NULL)
9974 printf (
" --- locationToOverwriteWithTransformation = %p \n",locationToOverwriteWithTransformation);
9978 if (transformationToOverwriteFirstStatementInInterval != NULL)
9982 printf (
" --- transformationToOverwriteFirstStatementInInterval = %p \n",transformationToOverwriteFirstStatementInInterval);
9986 if (blockOfStatementsToOutline != NULL)
9988 printf (
" --- blockOfStatementsToOutline = %p \n",blockOfStatementsToOutline);
9991 printf (
"targetClasses.size() = %zu \n",targetClasses.size());
9992 printf (
"targetFriends.size() = %zu \n",targetFriends.size());
9995 printf (
"statementInterval.size() = %zu \n",statementInterval.size());
10005#define REMOVE_STATEMENT_DEBUG 0
10010#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
10021 ASSERT_not_null(targetStmt);
10029 bool isRemovable = (parentStatement != NULL) ? LowLevelRewrite::isRemovableStatement(targetStmt) :
false;
10031#if REMOVE_STATEMENT_DEBUG || 0
10032 printf (
"In SageInterface::removeStatement(): parentStatement = %p = %s remove targetStatement = %p = %s (isRemovable = %s) \n",
10033 parentStatement,parentStatement->
class_name().c_str(),targetStmt,targetStmt->
class_name().c_str(),isRemovable ?
"true" :
"false");
10036 if (isRemovable ==
true)
10043 if (autoRelocatePreprocessingInfo ==
true)
10053 if (comments !=
nullptr && isSgBasicBlock(targetStmt) ==
nullptr )
10055 vector<int> captureList;
10056#if REMOVE_STATEMENT_DEBUG
10057 printf (
"Found attached comments (removing %p = %s): comments->size() = %" PRIuPTR
" \n",targetStmt,targetStmt->
class_name().c_str(),comments->size());
10063 int commentIndex = 0;
10064 AttachedPreprocessingInfoType::iterator i;
10065 for (i = comments->begin(); i != comments->end(); i++)
10067 ROSE_ASSERT ( (*i) != NULL );
10068#if REMOVE_STATEMENT_DEBUG
10069 printf (
" Attached Comment (relativePosition=%s): %s\n",
10070 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
10071 (*i)->getString().c_str());
10072 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
10073 (*i)->get_file_info()->display(
"comment/directive location debug");
10075 captureList.push_back(commentIndex);
10079#if REMOVE_STATEMENT_DEBUG
10080 printf (
"captureList.size() = %" PRIuPTR
" \n",captureList.size());
10083 if (captureList.empty() ==
false)
10088 bool surroundingStatementPreceedsTargetStatement =
false;
10091 if (surroundingStatement !=
nullptr)
10094#if REMOVE_STATEMENT_DEBUG
10095 printf (
"In removeStatement(): surroundingStatementPreceedsTargetStatement = %s \n",surroundingStatementPreceedsTargetStatement ?
"true" :
"false");
10096 printf (
" --- moving comments from targetStmt = %p = %s name = %s \n",targetStmt,targetStmt->
class_name().c_str(),
get_name(targetStmt).c_str());
10097 printf (
" --- moving comments to surroundingStatement = %p = %s name = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str(),
get_name(surroundingStatement).c_str());
10112 printf (
"Error: This is not supported within Microsoft Windows (I forget why). \n");
10134 printf (
"In SageInterface::resetInternalMapsForTargetStatement(SgStatement*): sourceStatement = %p = %s \n",sourceStatement,sourceStatement->
class_name().c_str());
10143 printf (
"In SageInterface::resetInternalMapsForTargetStatement(SgStatement*): sourceFile = %p \n",sourceFile);
10146 if (sourceFile != NULL)
10148 std::map<SgStatement*,MacroExpansion*> & macroExpansionMap = sourceFile->get_macroExpansionMap();
10150 if (macroExpansionMap.find(sourceStatement) != macroExpansionMap.end())
10152 MacroExpansion* macroExpansion = macroExpansionMap[sourceStatement];
10153 ROSE_ASSERT(macroExpansion != NULL);
10155 printf (
"In resetInternalMapsForTargetStatement(): macroExpansion = %p = %s \n",macroExpansion,macroExpansion->macro_name.c_str());
10157 if (macroExpansion->isTransformed ==
false)
10160 std::vector<SgStatement*> & associatedStatementVector = macroExpansion->associatedStatementVector;
10162 for (
size_t i = 0; i < associatedStatementVector.size(); i++)
10165 SgStatement* statement = associatedStatementVector[i];
10167 printf (
"Mark as transformation to be output: statement = %p = %s \n",statement,statement->
class_name().c_str());
10191 macroExpansion->isTransformed =
true;
10208#if REMOVE_STATEMENT_DEBUG || 0
10209 printf (
"In moveCommentsToNewStatement(): destinationStatementProceedsSourceStatement = %s \n",destinationStatementProceedsSourceStatement ?
"true" :
"false");
10210 printf (
" --- sourceStatement = %p = %s name = %s \n",sourceStatement,sourceStatement->
class_name().c_str(),
get_name(sourceStatement).c_str());
10211 printf (
" --- destinationStatement = %p = %s name = %s \n",destinationStatement,destinationStatement->
class_name().c_str(),
get_name(destinationStatement).c_str());
10219#if REMOVE_STATEMENT_DEBUG
10220 printf (
"Output the comments attached to sourceStatement: \n");
10222 printf (
"Output the comments attached to destinationStatement: \n");
10227 vector<int>::const_iterator j = indexList.begin();
10229 while (j != indexList.end())
10232 ROSE_ASSERT(destinationStatement->
get_file_info() != NULL);
10233#if REMOVE_STATEMENT_DEBUG || 0
10234 printf (
"Attaching comments to destinationStatement = %p = %s on file = %s line %d \n",
10235 destinationStatement,destinationStatement->
class_name().c_str(),
10236 destinationStatement->
get_file_info()->get_filenameString().c_str(),
10239 printf (
"(*comments)[*j]->getRelativePosition() = %s \n",PreprocessingInfo::relativePositionName((*comments)[*j]->getRelativePosition()).c_str());
10251 if (destinationStatementProceedsSourceStatement ==
true || isSgGlobal(destinationStatement) != NULL )
10257 auto commentPosition = (*comments)[*j]->getRelativePosition();
10258 if (commentPosition == PreprocessingInfo::before)
10261 (*comments)[*j]->setRelativePosition(PreprocessingInfo::after);
10263 else if (commentPosition == PreprocessingInfo::after ||
10264 commentPosition == PreprocessingInfo::end_of)
10270 ROSE_ASSERT(
false &&
"Comment relative position neither, before, after, nor end_of");
10282 (*comments)[*j]->setRelativePosition(PreprocessingInfo::inside);
10293 if ((*comments)[*j]->getRelativePosition() == PreprocessingInfo::before)
10301 ASSERT_require((*comments)[*j]->getRelativePosition() == PreprocessingInfo::after||
10302 (*comments)[*j]->getRelativePosition() == PreprocessingInfo::end_of);
10303 (*comments)[*j]->setRelativePosition(PreprocessingInfo::before);
10312 if (targetInfoList==NULL)
10321 if( prevTargetAnchorComment==NULL)
10334 prevTargetAnchorComment = (*comments)[*j];
10339#if REMOVE_STATEMENT_DEBUG
10340 printf (
"Marking entry from comments list as NULL on sourceStatement = %p = %s \n",sourceStatement,sourceStatement->
class_name().c_str());
10342 (*comments)[*j] =
nullptr;
10349 for (
size_t n = 0; n < indexList.size(); n++)
10351#if REMOVE_STATEMENT_DEBUG || 0
10352 printf (
"Erase entry from comments list on comments->size() %" PRIuPTR
" \n",comments->size());
10354 bool modifiedList =
false;
10355 AttachedPreprocessingInfoType::iterator k = comments->begin();
10356 while (k != comments->end() && modifiedList ==
false)
10361 k = comments->erase(k);
10362 modifiedList =
true;
10384 ROSE_ASSERT(targetStmt != NULL);
10389#if REMOVE_STATEMENT_DEBUG || 0
10390 printf (
"TOP of findSurroundingStatementFromSameFile(): surroundingStatementPreceedsTargetStatement = %s \n",surroundingStatementPreceedsTargetStatement ?
"true" :
"false");
10393 std::set<SgStatement*> previousVisitedStatementSet;
10398 surroundingStatementPreceedsTargetStatement =
true;
10400#if REMOVE_STATEMENT_DEBUG
10401 printf (
" targetStmt->get_file_info()->get_file_id() = %d \n",targetStmt->
get_file_info()->get_file_id());
10403#if REMOVE_STATEMENT_DEBUG
10404 printf (
"Before loop: surroundingStatement = %p = %s name = %s surroundingStatement_fileId = %d \n",surroundingStatement,
10407 bool returningNullSurroundingStatement =
false;
10419#if REMOVE_STATEMENT_DEBUG
10420 printf (
"In loop: after getPreviousStatement(): surroundingStatement = %p = %s name = %s \n",surroundingStatement,
10424 if (surroundingStatement == NULL)
10427#if REMOVE_STATEMENT_DEBUG
10428 printf (
" surroundingStatement_fileId set to Sg_File_Info::BAD_FILE_ID \n");
10433 surroundingStatement_fileId = surroundingStatement->
get_file_info()->get_file_id();
10434#if REMOVE_STATEMENT_DEBUG
10435 printf (
" surroundingStatement = %p = %s surroundingStatement->get_file_info()->get_file_id() = %d \n",
10436 surroundingStatement,surroundingStatement->
class_name().c_str(),surroundingStatement->
get_file_info()->get_file_id());
10440#if REMOVE_STATEMENT_DEBUG
10441 if (surroundingStatement != NULL)
10443 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",
10444 surroundingStatement,surroundingStatement->
class_name().c_str(),
10445 surroundingStatement->
get_file_info()->get_filenameString().c_str(),
10451 printf (
"surroundingStatement == NULL \n");
10456 if (previousVisitedStatementSet.find(surroundingStatement) != previousVisitedStatementSet.end())
10458 printf (
"This statement has been previously visited: surroundingStatement = %p = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str());
10460 printf (
"ERROR: SageInterface::findSurroundingStatementFromSameFile(): cannot located surrounding statement from same file (return NULL) \n");
10462 surroundingStatement = NULL;
10468 previousVisitedStatementSet.insert(surroundingStatement);
10472 if (surroundingStatement == NULL || isSgGlobal(surroundingStatement) != NULL)
10475#if REMOVE_STATEMENT_DEBUG
10476 printf (
"We just ran off the start (top) of the file... targetStmt = %p = %s \n",targetStmt,targetStmt->
class_name().c_str());
10482 surroundingStatementPreceedsTargetStatement =
false;
10485 surroundingStatement = targetStmt;
10486 SgStatement* previousStatement = surroundingStatement;
10490 std::set<SgStatement*> forwardVisitedStatementSet;
10493 while ( (surroundingStatement != NULL) && (surroundingStatement_fileId != targetStmt->
get_file_info()->get_file_id()) )
10496 if (forwardVisitedStatementSet.find(surroundingStatement) != forwardVisitedStatementSet.end())
10498 printf (
"This statement has been previously visited: surroundingStatement = %p = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str());
10500 printf (
"ERROR: SageInterface::findSurroundingStatementFromSameFile(): cannot located surrounding statement from same file (return NULL) \n");
10502 surroundingStatement = NULL;
10508 forwardVisitedStatementSet.insert(surroundingStatement);
10511 previousStatement = surroundingStatement;
10514 if (surroundingStatement == NULL)
10517#if REMOVE_STATEMENT_DEBUG
10518 printf (
"We just ran off the end (bottom) of the file... \n");
10523 returningNullSurroundingStatement =
true;
10527 surroundingStatement_fileId = surroundingStatement->
get_file_info()->get_file_id();
10528#if REMOVE_STATEMENT_DEBUG
10529 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",
10530 surroundingStatement,surroundingStatement->
class_name().c_str(),
10531 surroundingStatement->
get_file_info()->get_filenameString().c_str(),
10538 if (surroundingStatement == NULL)
10540#if REMOVE_STATEMENT_DEBUG
10541 printf (
"Resetting the surroundingStatement to the previousStatement = %p = %s \n",previousStatement,previousStatement->
class_name().c_str());
10543 surroundingStatement = previousStatement;
10546 if (surroundingStatement == targetStmt)
10550#if REMOVE_STATEMENT_DEBUG
10551 printf (
"Setting the surroundingStatement to be global scope \n");
10553 surroundingStatement = TransformationSupport::getGlobalScope(targetStmt);
10559 ROSE_ASSERT(surroundingStatement != NULL);
10563 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());
10564 surroundingStatement = NULL;
10567#if REMOVE_STATEMENT_DEBUG
10568 printf (
"BOTTOM of findSurroundingStatementFromSameFile(): surroundingStatementPreceedsTargetStatement = %s surroundingStatement = %p \n",surroundingStatementPreceedsTargetStatement ?
"true" :
"false",surroundingStatement);
10569 if (surroundingStatement != NULL)
10571 printf (
"surroundingStatement = %p = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str());
10577 return surroundingStatement;
10587 virtual void visit(
SgNode* n) {
10591 Visitor().
traverse(root, postorder);
10601 ROSE_ASSERT(oldStmt);
10602 ROSE_ASSERT(newStmt);
10604 if (oldStmt == newStmt)
return;
10615 ROSE_ASSERT (f_do->get_body() == oldStmt);
10616 if (!isSgBasicBlock(newStmt))
10618 f_do->set_body(isSgBasicBlock(newStmt));
10635 printf (
"In SageInterface::replaceStatement(): physical_file_id = %d \n",physical_file_id);
10646 if (movePreprocessingInfoValue)
10654 printf (
"In SageInterface::replaceStatement(): calling moveUpPreprocessingInfo() changed to movePreprocessingInfo() \n");
10666 bool usePrepend =
true;
10668 movePreprocessingInfo ( oldStmt, newStmt, PreprocessingInfo::undef, PreprocessingInfo::undef, usePrepend );
10689 printf (
"In SageInterface::moveDeclarationToAssociatedNamespace(): declarationStatement = %p = %s \n",declarationStatement,declarationStatement->
class_name().c_str());
10690 printf (
" --- previousDeclarationStatement = %p = %s \n",previousDeclarationStatement,previousDeclarationStatement != NULL ? previousDeclarationStatement->
class_name().c_str() :
"null");
10691 printf (
" --- nextDeclarationStatement = %p \n",nextDeclarationStatement);
10692 printf (
" --- nextDeclarationStatement = %p = %s \n",nextDeclarationStatement, nextDeclarationStatement != NULL ? nextDeclarationStatement->
class_name().c_str() :
"null");
10696 if (previousDeclarationStatement != NULL)
10702 printf (
"There is no previous statement so there is no namespace to close off! \n");
10705 printf (
"Exiting as a test! \n");
10710 if (nextDeclarationStatement != NULL)
10717 printf (
"There is no next statement so there is no namespace to reopen! \n");
10721 printf (
"Exiting as a test! \n");
10726 if (previousDeclarationStatement != NULL && nextDeclarationStatement != NULL)
10730 printf (
"Identified the most common case... \n");
10735 printf (
"declarationScope = %p = %s \n",declarationScope,declarationScope->
class_name().c_str());
10739 printf (
"Exiting as a test! \n");
10745 if (previousDeclarationStatement != NULL && nextDeclarationStatement == NULL)
10749 printf (
"Found 2nd most common case: previousDeclarationStatement != NULL && nextDeclarationStatement == NULL \n");
10753 printf (
"Exiting as a test! \n");
10759 if (previousDeclarationStatement == NULL && nextDeclarationStatement == NULL)
10761 printf (
"This case should require no special handling, unless we are still in the wrong namespace \n");
10764 printf (
"Exiting as a test! \n");
10769 printf (
"This case should have been caught above! \n");
10772 printf (
"Exiting as a test! \n");
10779 if (declarationParent == NULL)
10782 printf (
"declarationStatement->get_parent() = %p = %s \n",declarationStatement->
get_parent(), (declarationStatement->
get_parent() != NULL) ? declarationStatement->
get_parent()->
class_name().c_str() :
"null");
10788 if (declarationParent != NULL)
10791 ROSE_ASSERT(declarationScope != NULL);
10794 if (namespaceDefinition != NULL)
10797 ROSE_ASSERT(namespaceDeclaration != NULL);
10799 printf (
"The declaration has been identified to be associuated with a valid namespace = %p = %s \n",namespaceDeclaration,namespaceDeclaration->
get_name().str());
10800 printf (
" --- declarationParent = %p = %s \n",declarationParent,declarationParent->
class_name().c_str());
10801 printf (
" --- Move declaration from scope = %p = %s to namespace = %p = %s \n",declarationParent,declarationParent->
class_name().c_str(),namespaceDeclaration,namespaceDeclaration->
get_name().str());
10804 printf (
"Exiting as a test! \n");
10811 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());
10818 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");
10830 if (isSgTemplateInstantiationDefn(node) != NULL)
10833 printf (
"Note: In SageInterface::isTemplateInstantiationNode(): skipping SgTemplateInstantiationDefn \n");
10837 return isSgTemplateInstantiationDecl(node)
10840 || isSgTemplateInstantiationDefn(node)
10841 || isSgTemplateInstantiationFunctionDecl(node)
10842 || isSgTemplateInstantiationMemberFunctionDecl(node)
10843 || isSgTemplateInstantiationTypedefDeclaration(node)
10844 || isSgTemplateInstantiationDirectiveStatement(node)
10853SageInterface::isTemplateDeclarationNode(
SgNode* node)
10856 if (isSgTemplateDefinition(node) != NULL)
10859 printf (
"Note: In SageInterface::isTemplateDeclarationNode(): skipping SgTemplateDefinition \n");
10863 return isSgTemplateInstantiationDecl(node)
10866 || isSgTemplateInstantiationDefn(node)
10867 || isSgTemplateInstantiationFunctionDecl(node)
10868 || isSgTemplateInstantiationMemberFunctionDecl(node)
10869 || isSgTemplateInstantiationTypedefDeclaration(node)
10870 || isSgTemplateInstantiationDirectiveStatement(node)
10883 std::vector<SgDeclarationStatement*> templateInstantiationVector;
10895 if (declaration != NULL)
10897 templateInstantiationVector.push_back(declaration);
10906 std::cerr <<
"This feature for now is available with autotools only!" << std::endl;
10910 std::vector<SgDeclarationStatement*>::iterator j = templateInstantiationVector.begin();
10911 while (j != templateInstantiationVector.end())
10925 SgExpression * pattern_exp = isSgExpression(new_pattern);
10926 ROSE_ASSERT (anchor_exp != NULL);
10927 ROSE_ASSERT (pattern_exp != NULL);
10930 Rose_STL_Container<SgNode*> opaque_exp_list = NodeQuery::querySubTree(pattern_exp,V_SgExpression);
10931 for (
size_t i = 0; i<opaque_exp_list.size(); i++)
10933 SgExpression* opaque_exp = isSgExpression(opaque_exp_list[i]);
10934 ROSE_ASSERT (opaque_exp != NULL);
10935 if (opaque_exp->
variantT() == V_SgVariantExpression)
10944 return new_pattern;
10951 static int counter = 0;
10954 bool collision =
false;
10957 name =
"__" + baseName + boost::lexical_cast<string > (counter++) +
"__";
10963 collision = (nameSymbol != NULL);
10966 Rose_STL_Container<SgNode*> childScopes = NodeQuery::querySubTree(scope, V_SgScopeStatement);
10968 BOOST_FOREACH(
SgNode* childScope, childScopes)
10974 nameSymbol = childScopeStatement->lookup_symbol(
SgName(name),NULL,NULL);
10976 collision = collision || (nameSymbol != NULL);
10978 }
while (collision);
10988 SgType* variableType = expressionType;
10995 SgType* expressionBaseType = expressionType->
stripType(SgType::STRIP_TYPEDEF_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE);
11000 if (
SgArrayType* arrayType=isSgArrayType(expressionType)) {
11001 if(
SgArrayType* strippedArrayType = isSgArrayType(arrayType->stripType(SgType::STRIP_TYPEDEF_TYPE))) {
11002 SgType* strippedArrayBaseType = strippedArrayType->get_base_type();
11008 if (isSgPointerDerefExp(expression))
11016 ROSE_ASSERT(tempVarInitExpression != NULL);
11027 if (initializeInDeclaration)
11034 ROSE_ASSERT(tempVarDeclaration != NULL);
11037 if (reEvaluate != NULL)
11051 return std::make_pair(tempVarDeclaration, varRefExpression);
11064 SgType* variableType = expressionType;
11067 if (
SgArrayType* arrayType=isSgArrayType(expressionType))
11069 if(
SgArrayType* strippedArrayType = isSgArrayType(arrayType->stripType(SgType::STRIP_TYPEDEF_TYPE))) {
11070 SgType* strippedArrayBaseType = strippedArrayType->get_base_type();
11084 ROSE_ASSERT(tempVarDeclaration != NULL);
11088 return std::make_pair(tempVarDeclaration, varRefExpression);
11095 replaceExpressionInSgExpressionPtrList(
SgExpression* oldExp,
SgExpression* newExp, SgExpressionPtrList& lst,
bool replAll =
false)
11097 SgExpressionPtrList::iterator lim = lst.end();
11098 SgExpressionPtrList::iterator pos = lst.begin();
11103 pos = std::find(pos, lim, oldExp);
11105 if (pos != lim) { *pos = newExp; ++pos; chg =
true; }
11106 }
while (replAll && (pos != lim));
11120 ROSE_ASSERT(oldExp);
11121 ROSE_ASSERT(newExp);
11122 if (oldExp==newExp)
return;
11124 if (isSgVarRefExp(newExp))
11128 ROSE_ASSERT(parent!=NULL);
11134 if (isSgExprStatement(parent)) {
11135 isSgExprStatement(parent)->set_expression(newExp);
11136 }
else if (isSgForStatement(parent)) {
11137 ROSE_ASSERT (isSgForStatement(parent)->get_increment() == oldExp);
11138 isSgForStatement(parent)->set_increment(newExp);
11141 if(matlabFor->get_index() == oldExp)
11142 matlabFor->set_index(newExp);
11143 else if(matlabFor->get_range() == oldExp)
11144 matlabFor->set_range(newExp);
11146 ROSE_ASSERT(!
"sub-expression not found");
11148 if(jovFor->get_initialization() == oldExp)
11149 jovFor->set_initialization(newExp);
11150 else if(jovFor->get_while_expression() == oldExp)
11151 jovFor->set_while_expression(newExp);
11152 else if(jovFor->get_by_or_then_expression() == oldExp)
11153 jovFor->set_by_or_then_expression(newExp);
11155 ROSE_ASSERT(!
"sub-expression not found");
11156 }
else if (
SgRangeExp* rngexp = isSgRangeExp(parent)) {
11157 if (rngexp->get_start() == oldExp)
11158 rngexp->set_start(newExp);
11159 else if (rngexp->get_end() == oldExp)
11160 rngexp->set_end(newExp);
11161 else if (rngexp->get_stride() == oldExp)
11162 rngexp->set_stride(newExp);
11164 ROSE_ASSERT(!
"sub-expression not found");
11165 }
else if (isSgReturnStmt(parent)) {
11166 isSgReturnStmt(parent)->set_expression(newExp);
11167 }
else if (isSgBinaryOp(parent)!=NULL) {
11168 if (oldExp==isSgBinaryOp(parent)->get_lhs_operand()) {
11170 }
else if (oldExp==isSgBinaryOp(parent)->get_rhs_operand()) {
11175 }
else if (isSgUnaryOp(parent)!=NULL){
11176 if (oldExp==isSgUnaryOp(parent)->get_operand_i())
11180 }
else if (isSgConditionalExp(parent) != NULL) {
11190 }
else if (isSgExprListExp(parent) != NULL) {
11191 SgExpressionPtrList& explist = isSgExprListExp(parent)->get_expressions();
11192 for (Rose_STL_Container<SgExpression*>::iterator i=explist.begin();i!=explist.end();i++) {
11193 if (isSgExpression(*i)==oldExp) {
11199 }
else if (isSgValueExp(parent)) {
11204 ROSE_ASSERT(oldExp == actexp->get_expression());
11205 actexp->set_expression(newExp);
11207 if (oldExp == attrexp->get_object()) {
11208 attrexp->set_object(newExp);
11209 }
else if (oldExp == attrexp->get_args()) {
11211 ASSERT_not_null(newLst);
11213 attrexp->set_args(newLst);
11218 }
else if ((parentExp=isSgExpression(parent)) != NULL) {
11221 ROSE_ASSERT (worked);
11222 }
else if (isSgInitializedName(parent)) {
11224 if (oldExp == initializedNameParent->get_initializer()) {
11226 ROSE_ASSERT(isSgInitializer(newExp));
11227 initializedNameParent->set_initializer(isSgInitializer(newExp));
11232 }
else if (isSgCaseOptionStmt(parent)) {
11234 if (oldExp == case_stmt->
get_key()) {
11236 }
else if(oldExp == case_stmt->get_key_range_end()) {
11237 case_stmt->set_key_range_end(newExp);
11241 }
else if (isSgProcessControlStatement(parent)) {
11243 if (oldExp == ctrl_stmt->get_quiet()) {
11244 ctrl_stmt->set_quiet(newExp);
11245 }
else if (oldExp == ctrl_stmt->get_code()) {
11246 ctrl_stmt->set_code(newExp);
11250 }
else if (isSgFortranDo(parent)) {
11252 if (oldExp == fortranDo->get_initialization()) {
11253 fortranDo->set_initialization(newExp);
11254 }
else if(oldExp == fortranDo->get_bound()) {
11255 fortranDo->set_bound(newExp);
11256 }
else if (oldExp == fortranDo->get_increment()) {
11257 fortranDo->set_increment(newExp);
11263 ROSE_ASSERT(oldExp == stm->get_condition());
11264 stm->set_condition(newExp);
11267 ROSE_ASSERT(oldExp == ptype->get_modexpr());
11268 ptype->set_modexpr(newExp);
11271 ROSE_ASSERT(oldExp == stm->get_time());
11272 stm->set_time(newExp);
11274 ROSE_ASSERT(oldExp == clause->get_size());
11275 clause->set_size(newExp);
11277 ROSE_ASSERT(oldExp == dcl->get_renamed());
11278 dcl->set_renamed(newExp);
11280 ROSE_ASSERT(oldExp == dcl->get_entryBarrier());
11281 dcl->set_entryBarrier(newExp);
11283 ROSE_ASSERT(oldExp == stm->get_guard());
11284 stm->set_guard(newExp);
11286 ROSE_ASSERT(oldExp == delc->get_delta());
11287 delc->set_delta(newExp);
11289 ROSE_ASSERT(oldExp == digc->get_digits());
11290 digc->set_digits(newExp);
11292 replaceExpressionInSgExpressionPtrList(oldExp, newExp, disc->get_discriminants());
11294 ROSE_ASSERT(oldExp == rngc->get_range());
11295 rngc->set_range(newExp);
11297 replaceExpressionInSgExpressionPtrList(oldExp, newExp, idxc->get_indexRanges());
11299 ROSE_ASSERT(oldExp == vtdcl->get_discriminant());
11300 vtdcl->set_discriminant(newExp);
11302 ROSE_ASSERT(oldExp == clause->get_alignment());
11303 clause->set_alignment(newExp);
11306 if (newLst && (oldExp == vtwhen->get_choices()))
11307 vtwhen->set_choices(newLst);
11311 if (oldExp == clause->get_offset())
11312 clause->set_offset(newExp);
11313 else if (oldExp == clause->get_range() && isSgRangeExp(newExp))
11314 clause->set_range(isSgRangeExp(newExp));
11315 else if (oldExp == clause->get_component() && isSgVarRefExp(newExp))
11316 clause->set_component(isSgVarRefExp(newExp));
11320 if (oldExp == rendcl->get_renamed_function())
11321 rendcl->set_renamed_function(newExp);
11325 cerr<<
"SageInterface::replaceExpression(). Unhandled parent expression type of SageIII enum value: " <<parent->
class_name()<<endl;
11340 return Rose::getNextStatement(currentStmt);
11349 return isSgIntVal(e) && isSgIntVal(e)->get_value() == value;
11354 ROSE_ASSERT(func1&& func2);
11355 bool result =
false;
11356 if (func1 == func2)
11362 if (func1->get_name() == func2->get_name())
11367 if (func1->get_qualified_name().getString() +
11368 func1->get_mangled_name().getString() ==
11369 func2->get_qualified_name().getString() +
11370 func2->get_mangled_name().getString()
11376 if (func1->get_name() == func2->get_name())
11381 cout<<
"Error: SageInterface::isSameFunction(): unhandled language"<<endl;
11392 bool result =
false;
11393 ROSE_ASSERT(stmt != NULL);
11395 ROSE_ASSERT(p_scope != NULL);
11400 if (stmtlist[stmtlist.size()-1] == stmt)
11406 if (stmtlist[stmtlist.size()-1] == stmt)
11411 if (stmtlist[stmtlist.size()-1] == stmt)
11423 virtual void visit(
SgNode* n) {
11425 if (valueExp != NULL) {
11426 valueExp->set_originalExpressionTree(NULL);
11430 if (cast_exp != NULL) {
11431 cast_exp->set_originalExpressionTree(NULL);
11436 Visitor().traverse(top, preorder);
11441 while (s && !isSgSwitchStatement(s)) {
11445 return isSgSwitchStatement(s);
11450 while (s && !isSgOmpClauseBodyStatement(s)) {
11456 return isSgOmpClauseBodyStatement(s);
11462 for (; s; s = isSgStatement(s->
get_parent())) {
11467 case V_SgDoWhileStmt: {
11468 if (label.empty()) {
11473 case V_SgForStatement: {
11474 if (label.empty()) {
11479 case V_SgFortranDo:
11480 case V_SgFortranNonblockedDo: {
11481 if (label.empty() ||
11482 label == isSgFortranDo(sc)->get_string_label()) {
11487 case V_SgWhileStmt: {
11488 if (label.empty() ||
11489 label == isSgWhileStmt(sc)->get_string_label()) {
11494 case V_SgSwitchStatement: {
11495 if (stopOnSwitches)
return sc;
11498 case V_SgJavaForEachStatement: {
11499 if (label.empty()) {
11504 case V_SgJavaLabelStatement: {
11505 if (label.empty() ||
11506 label == isSgJavaLabelStatement(sc)->get_label().getString()) {
11522 virtual void visit(
SgNode* n) {
11523 if (isSgBasicBlock(n)) {
11525 bool changes =
true;
11528 for (SgStatementPtrList::iterator i = bb->
get_statements().begin();
11530 if (isSgGotoStatement(*i)) {
11532 SgStatementPtrList::iterator inext = i;
11536 if (!isSgLabelStatement(*inext))
11551 RemoveJumpsToNextStatementVisitor().traverse(top, postorder);
11560 ROSE_ASSERT (parent);
11564 ROSE_ASSERT (bb || fis);
11565 SgStatementPtrList& siblings =
11567 SgStatementPtrList::iterator j =
11568 std::find(siblings.begin(), siblings.end(), stmt);
11569 ROSE_ASSERT (j != siblings.end());
11582 SgLabelStatementPtrSet& used;
11583 SgLabelStatementPtrSet& all;
11586 FindUsedAndAllLabelsVisitor(SgLabelStatementPtrSet& used,
11587 SgLabelStatementPtrSet& all):
11588 used(used), all(all) {}
11590 virtual void visit(
SgNode* n) {
11591 if (isSgGotoStatement(n)) {
11592 used.insert(isSgGotoStatement(n)->get_label());
11594 if (isSgLabelStatement(n)) {
11595 all.insert(isSgLabelStatement(n));
11600 SgLabelStatementPtrSet used;
11601 SgLabelStatementPtrSet unused;
11602 FindUsedAndAllLabelsVisitor(used, unused).traverse(top, preorder);
11604 for (SgLabelStatementPtrSet::iterator i = used.begin();
11605 i != used.end(); ++i) {
11606 assert (unused.find(*i) != unused.end());
11619 for (SgLabelStatementPtrSet::iterator i = unused.begin();
11620 i != unused.end(); ++i) {
11628 l_stmt->set_statement(NULL);
11638 if (isSgWhileStmt(loopStmt))
return isSgWhileStmt(loopStmt)->
get_body();
11639 if (isSgForStatement(loopStmt))
return isSgForStatement(loopStmt)->
get_loop_body();
11640 if (isSgDoWhileStmt(loopStmt))
return isSgDoWhileStmt(loopStmt)->
get_body();
11642 ROSE_ASSERT (!
"Bad loop kind");
11647 if (isSgWhileStmt(loopStmt)) {
11648 isSgWhileStmt(loopStmt)->
set_body(body);
11649 }
else if (isSgForStatement(loopStmt)) {
11651 }
else if (isSgDoWhileStmt(loopStmt)) {
11652 isSgDoWhileStmt(loopStmt)->
set_body(body);
11654 ROSE_ASSERT (!
"Bad loop kind");
11660 if (isSgWhileStmt(loopStmt))
return isSgWhileStmt(loopStmt)->
get_condition();
11661 if (isSgForStatement(loopStmt))
return isSgForStatement(loopStmt)->get_test();
11662 if (isSgDoWhileStmt(loopStmt))
return isSgDoWhileStmt(loopStmt)->
get_condition();
11664 ROSE_ASSERT (!
"Bad loop kind");
11669 if (isSgWhileStmt(loopStmt)) {
11671 }
else if (isSgForStatement(loopStmt)) {
11672 isSgForStatement(loopStmt)->set_test(cond);
11673 }
else if (isSgDoWhileStmt(loopStmt)) {
11676 ROSE_ASSERT (!
"Bad loop kind");
11685 SgCastExp* cast_exp = isSgCastExp(exp);
11686 if (cast_exp != NULL)
11689 assert(operand != 0);
11690 return SkipCasting(operand);
11699 ROSE_ASSERT(loop!=NULL);
11701 SgStatementPtrList &init = loop ->get_init_stmt();
11702 if (init.size() !=1)
11713 ROSE_ASSERT(ivarname != NULL);
11715 if (isSgAssignInitializer(initor))
11717 lbast = isSgAssignInitializer(initor)->
get_operand();
11732 ROSE_ASSERT(funcDef!=NULL);
11734 ROSE_ASSERT(funcBody!=NULL);
11736 std::ostringstream os;
11737 os<<ivarname->get_name().getString();
11742 if (visibleSym != NULL)
11753 Rose_STL_Container<SgNode*> varRefs = NodeQuery::querySubTree(loop,V_SgVarRefExp);
11754 for (Rose_STL_Container<SgNode *>::iterator i = varRefs.begin(); i != varRefs.end(); i++)
11757 if (vRef->get_symbol()==osymbol)
11758 vRef->set_symbol(nsymbol);
11763 init.push_back(ninit);
11770 trans_records.forLoopInitNormalizationTable[loop] =
true;
11771 trans_records.forLoopInitNormalizationRecord[loop] = make_pair (decl, ndecl) ;
11784 ROSE_ASSERT (loop != NULL);
11786 if (!trans_records.forLoopInitNormalizationTable[loop])
11791 ROSE_ASSERT (decl!= NULL);
11792 ROSE_ASSERT (ndecl!= NULL);
11796 SgStatementPtrList &init = loop ->get_init_stmt();
11797 ROSE_ASSERT(init.size() ==1);
11802 ROSE_ASSERT (exp_stmt != NULL);
11803 SgAssignOp* assign_op = isSgAssignOp(exp_stmt->get_expression());
11804 ROSE_ASSERT (assign_op != NULL);
11811 init.push_back(decl);
11822 Rose_STL_Container<SgNode*> varRefs = NodeQuery::querySubTree(loop,V_SgVarRefExp);
11823 for (Rose_STL_Container<SgNode *>::iterator i = varRefs.begin(); i != varRefs.end(); i++)
11826 if (vRef->get_symbol()==osymbol)
11827 vRef->set_symbol(nsymbol);
11831 trans_records.forLoopInitNormalizationTable[loop] =
false;
11837 ROSE_ASSERT(loop != NULL);
11844 if (test_stmt!=NULL)
11846 if (isSgNullStatement(test_stmt))
11852 if (isSgBinaryOp(test))
11856 ROSE_ASSERT(testlhs && testrhs);
11861 SgVarRefExp* testlhs_var = isSgVarRefExp(SkipCasting(testlhs));
11862 if (testlhs_var == NULL )
11865 if (var_symbol==NULL)
11869 case V_SgLessThanOp:
11874 case V_SgGreaterThanOp:
11878 case V_SgLessOrEqualOp:
11879 case V_SgGreaterOrEqualOp:
11880 case V_SgNotEqualOp:
11889 ROSE_ASSERT(loop != NULL);
11893 if (isSgBinaryOp(test))
11897 ROSE_ASSERT(testlhs && testrhs);
11902 SgVarRefExp* testlhs_var = isSgVarRefExp(SkipCasting(testlhs));
11903 if (testlhs_var == NULL )
11906 if (var_symbol==NULL)
11912 ROSE_ASSERT(incr != NULL);
11914 case V_SgPlusPlusOp:
11917 SgVarRefExp* incr_var = isSgVarRefExp(SkipCasting(isSgPlusPlusOp(incr)->get_operand()));
11918 if (incr_var == NULL)
return false;
11919 if ( incr_var->get_symbol() != var_symbol)
11925 case V_SgMinusMinusOp:
11928 SgVarRefExp* incr_var = isSgVarRefExp(SkipCasting(isSgMinusMinusOp(incr)->get_operand()));
11929 if (incr_var == NULL)
return false;
11930 if ( incr_var->get_symbol() != var_symbol)
11936 case V_SgMinusAssignOp:
11938 SgVarRefExp* incr_var = isSgVarRefExp(SkipCasting(isSgMinusAssignOp(incr)->get_lhs_operand()));
11940 ROSE_ASSERT (rhs != NULL);
11941 if (incr_var == NULL)
return false;
11942 if ( incr_var->get_symbol() != var_symbol)
11949 case V_SgPlusAssignOp:
12004 bool changed =
false;
12006 if (!switchStmt)
return changed;
12010 if (!bodyBlock)
return changed;
12014 std::vector<SgStatement*> stmts(stmtList.begin(), stmtList.end());
12015 int n =
static_cast<int>(stmts.size());
12019 for (
int i = 0; i < n; ) {
12024 auto processLabel = [&](
SgStatement* labelStmt) {
12028 std::vector<SgStatement*> toWrap;
12030 while (j < n && !isSgCaseOptionStmt(stmts[j]) && !isSgDefaultOptionStmt(stmts[j])) {
12031 toWrap.push_back(stmts[j]);
12038 if (toWrap.size() == 1
12039 && isSgBasicBlock(toWrap[0])
12040 && ((isSgCaseOptionStmt(labelStmt) && !isSgBasicBlock(isSgCaseOptionStmt(labelStmt)->get_body()))
12041 || (isSgDefaultOptionStmt(labelStmt) && !isSgBasicBlock(isSgDefaultOptionStmt(labelStmt)->get_body()))))
12047 if (
auto c = isSgCaseOptionStmt(labelStmt)) {
12048 c->set_body(moved);
12049 }
else if (
auto d = isSgDefaultOptionStmt(labelStmt)) {
12050 d->set_body(moved);
12056 else if (!toWrap.empty()) {
12071 if (
auto caseLabel = isSgCaseOptionStmt(labelStmt)) {
12072 caseLabel->set_body(newBlock);
12073 }
else if (
auto defaultLabel = isSgDefaultOptionStmt(labelStmt)) {
12074 defaultLabel->set_body(newBlock);
12078 for (
auto* w: toWrap) {
12091 if (
auto caseLabel = isSgCaseOptionStmt(curr)) {
12092 i = processLabel(caseLabel);
12093 }
else if (
auto defaultLabel = isSgDefaultOptionStmt(curr)) {
12094 i = processLabel(defaultLabel);
12108 ROSE_ASSERT(loop != NULL);
12126 ROSE_ASSERT(body!=NULL);
12144 ROSE_ASSERT (loop != NULL);
12146 if (isSgNullExpression(e_3))
12149 loop->set_increment(iv);
12164 ROSE_ASSERT(func!=NULL);
12165 AstInterfaceImpl faImpl(func->get_definition()->
get_body());
12166 AstInterface fa(&faImpl);
12167 ArrayAnnotation* annot = ArrayAnnotation::get_inst();
12168 ArrayInterface array_interface (*annot);
12169 array_interface.initialize(fa, AstNodePtrImpl(func->get_definition()));
12170 array_interface.observe(fa);
12171 LoopTransformInterface :: set_astInterface(fa);
12172 LoopTransformInterface :: set_arrayInterface(&array_interface);
12176 AstNodePtr result = AstNodePtrImpl(loop->
get_parent()) ;
12178 LoopUnrolling lu(unrolling_factor);
12181 result = lu(lpTrans, result);
12225#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
12227 if (unrolling_factor <= 1)
12248 cerr<<
"Error in SageInterface::loopUnrolling(): target loop is not canonical."<<endl;
12252 ROSE_ASSERT(ivar&& lb && ub && step);
12253 ROSE_ASSERT(isSgBasicBlock(orig_body));
12256 bool needFringe =
true;
12257 SgForStatement* fringe_loop = deepCopy<SgForStatement>(target_loop);
12275 ROSE_ASSERT(scope != NULL);
12279 attachComment(fringe_decl,
"iter_count = (ub-lb+1)%step ==0?(ub-lb+1)/step: (ub-lb+1)/step+1;");
12280 attachComment(fringe_decl,
"fringe = iter_count%unroll_factor==0 ? 0:unroll_factor*step");
12287 ConstantFolding::constantFoldingOptimization(fringe_decl,
false);
12289 ROSE_ASSERT(ivarname != NULL);
12293 if (isSgIntVal(init1->get_operand_i()))
12294 if (isSgIntVal(init1->get_operand_i())->get_value() == 0)
12295 needFringe =
false;
12299 ROSE_ASSERT(ub_bin_op);
12309 ROSE_ASSERT(step_bin_op != NULL);
12312 bool isPlus =
false;
12313 if (isSgPlusAssignOp(step_bin_op))
12315 else if (isSgMinusAssignOp(step_bin_op))
12319 cerr<<
"Error in SageInterface::loopUnrolling(): illegal incremental exp of a canonical loop"<<endl;
12325 for (
size_t i =1; i<unrolling_factor; i++)
12329 std::vector<SgVarRefExp*> refs = querySubTree<SgVarRefExp> (body, V_SgVarRefExp);
12330 for (std::vector<SgVarRefExp*>::iterator iter = refs.begin(); iter !=refs.end(); iter++)
12359 ConstantFolding::constantFoldingOptimization(scope,
false);
12371static size_t myfactorial (
size_t n)
12374 for (
size_t i=2; i<=n; i++)
12385std::vector<size_t> getPermutationOrder(
size_t n,
size_t lexicoOrder)
12387 size_t k = lexicoOrder;
12388 std::vector<size_t> s(n);
12390 for (
size_t i=0; i<n; i++)
12394 size_t factorial = myfactorial(n-1);
12396 if (k/n>=factorial)
12398 printf(
"Error: in getPermutationOrder(), lexicoOrder is larger than n!-1\n");
12414 for (
size_t j=0; j<n-1; j++)
12418 int tempj = (k/factorial) % (n - j);
12421 int temps = s[j+tempj];
12424 for (
size_t i=j+tempj; i>j; i--)
12431 factorial = factorial /(n-(j+1));
12434 for (
size_t i = 0; i<n; i++)
12466 ROSE_ASSERT(loopNest != NULL);
12467 ROSE_ASSERT(targetLevel >0);
12474 std::vector<SgForStatement* > loops= SageInterface::querySubTree<SgForStatement>(loopNest,V_SgForStatement);
12475 ROSE_ASSERT(loops.size()>=targetLevel);
12493 cerr<<
"Error in SageInterface::loopTiling(): target loop is not canonical."<<endl;
12497 ROSE_ASSERT(ivar&& lb && ub && step);
12505 parent = isSgLocatedNode(loopNest ->get_parent());
12507 ROSE_ASSERT(parent!= NULL);
12509 string ivar2_name =
"_lt_var_"+ivar->get_name().getString();
12519 if (isSgBinaryOp(orig_test))
12521 if (isSgLessOrEqualOp(orig_test))
12523 else if (isSgGreaterOrEqualOp(orig_test))
12529 cerr<<
"Error: illegal condition operator for a canonical loop"<<endl;
12536 cerr<<
"Error: illegal condition expression for a canonical loop"<<endl;
12540 ROSE_ASSERT(cond_stmt != NULL);
12545 SgExpression* orig_incr_exp = target_loop->get_increment();
12546 if( isSgPlusAssignOp(orig_incr_exp))
12550 else if (isSgMinusAssignOp(orig_incr_exp))
12556 cerr<<
"Error: illegal increment expression for a canonical loop"<<endl;
12568 ROSE_ASSERT(assign_op);
12572 ROSE_ASSERT(bin_op);
12592 if (lexicoOrder == 0)
12595 ROSE_ASSERT(loop != NULL);
12597 ROSE_ASSERT (depth >1);
12598 ROSE_ASSERT(lexicoOrder<myfactorial(depth));
12601 std::vector<SgForStatement* > loopNest = SageInterface::querySubTree<SgForStatement>(loop,V_SgForStatement);
12602 ROSE_ASSERT(loopNest.size()>=depth);
12603 std::vector<std::vector<SgNode*> > loopHeads;
12604 for (std::vector<SgForStatement* > ::iterator i = loopNest.begin(); i!= loopNest.end(); i++)
12607 std::vector<SgNode*> head;
12609 head.push_back(cur_loop->get_test());
12610 head.push_back(cur_loop->get_increment());
12611 loopHeads.push_back(head);
12615 std::vector<size_t> changedOrder = getPermutationOrder (depth, lexicoOrder);
12618 for (
size_t i=0; i<depth; i++)
12621 if (i != changedOrder[i])
12624 std::vector<SgNode*> newhead = loopHeads[changedOrder[i]];
12632 init->set_parent(cur_loop);
12637 cur_loop->set_test(test);
12645 cur_loop->set_increment(incr);
12659 ROSE_ASSERT(loop != NULL);
12665 SgAssignOp* assign_op = isSgAssignOp (do_loop->get_initialization());
12666 ROSE_ASSERT (assign_op != NULL);
12668 ROSE_ASSERT (var != NULL);
12669 ivarname = var->get_symbol()->get_declaration();
12670 ROSE_ASSERT (ivarname != NULL);
12684 SgStatementPtrList & init = fs->get_init_stmt();
12685 if (init.size() !=1)
12687 cerr<<
"SageInterface::getLoopIndexVariable(), no or more than one initialization statements are encountered. Not supported yet "<<endl;
12698 if (isSgVariableDeclaration(init1))
12702 ROSE_ASSERT(ivarname != NULL);
12709 SgVarRefExp* var = isSgVarRefExp(SkipCasting(ivarast));
12712 ivarname = var->get_symbol()->get_declaration();
12719 if (
SgCommaOpExp* comma_exp = isSgCommaOpExp(exp_stmt->get_expression()))
12726 SgVarRefExp* var = isSgVarRefExp(assign_op->get_lhs_operand());
12729 ivarname = var->get_symbol()->get_declaration();
12737 mlog[Sawyer::Message::Common::WARN] <<
"Warning: SageInterface::getLoopIndexVariable(). Unhandled init_stmt type of SgForStatement"<<endl;
12738 mlog[Sawyer::Message::Common::WARN] <<
"Init statement is :"<<init1->
class_name() <<
" " <<init1->
unparseToString()<<endl;
12756 ROSE_ASSERT (ivar != NULL);
12757 ROSE_ASSERT (subtree_root != NULL);
12758 bool result =
false;
12763 if (i_index == ivar)
12783 ROSE_ASSERT (loop !=NULL);
12784 SgStatementPtrList& stmt_list = loop->get_init_stmt();
12785 if (stmt_list.size() >1)
return true;
12786 if (stmt_list.size() == 0)
return false;
12791 if (decl_stmt != NULL)
12796 ROSE_ASSERT (exp_stmt != NULL);
12797 if (isSgCommaOpExp (exp_stmt->get_expression()) )
12807 ROSE_ASSERT(loop != NULL);
12815 SgAssignOp* init_assign = isSgAssignOp (init);
12820 bool isCase1=
false;
12825 ivarname = var->get_symbol()->get_declaration();
12827 if (ivarname && lbast )
12839 SgBinaryOp* test = isSgBinaryOp(fs->get_test_expr());
12843 case V_SgLessOrEqualOp:
12844 if (isInclusiveUpperBound != NULL)
12845 *isInclusiveUpperBound =
true;
12846 if (hasIncrementalIterationSpace != NULL)
12847 *hasIncrementalIterationSpace =
true;
12849 case V_SgLessThanOp:
12850 if (isInclusiveUpperBound != NULL)
12851 *isInclusiveUpperBound =
false;
12852 if (hasIncrementalIterationSpace != NULL)
12853 *hasIncrementalIterationSpace =
true;
12855 case V_SgGreaterOrEqualOp:
12856 if (isInclusiveUpperBound != NULL)
12857 *isInclusiveUpperBound =
true;
12858 if (hasIncrementalIterationSpace != NULL)
12859 *hasIncrementalIterationSpace =
false;
12861 case V_SgGreaterThanOp:
12862 if (isInclusiveUpperBound != NULL)
12863 *isInclusiveUpperBound =
false;
12864 if (hasIncrementalIterationSpace != NULL)
12865 *hasIncrementalIterationSpace =
false;
12874 if (testvar == NULL)
12880 ubast = loop->get_bound();
12882 if (isInclusiveUpperBound != NULL)
12883 *isInclusiveUpperBound =
true;
12886 ROSE_ASSERT (incr != NULL);
12887 if (isSgNullExpression(incr))
12889 cerr<<
"Error:isCanonicalDoLoop() found NULL increment expression. Please call doLoopNormalization() first!"<<endl;
12890 ROSE_ASSERT (
false);
12892 if (hasIncrementalIterationSpace != NULL)
12894 *hasIncrementalIterationSpace =
true;
12896 if (
SgIntVal* i_v = isSgIntVal(incr))
12898 if (i_v->get_value()<0)
12899 *hasIncrementalIterationSpace =
false;
12905 case V_SgPlusAssignOp:
12906 case V_SgMinusAssignOp:
12907 incr_var = isSgVarRefExp(SkipCasting(isSgBinaryOp(incr)->get_lhs_operand()));
12910 case V_SgPlusPlusOp:
12911 case V_SgMinusMinusOp:
12912 incr_var = isSgVarRefExp(SkipCasting(isSgUnaryOp(incr)->get_operand()));
12918 if (incr_var == NULL)
12932 if (body != NULL) {
12933 *body = fs->get_body();
12970 ROSE_ASSERT (s != NULL);
12973 std::set<SgNode*> bset = SgNodeHelper::loopRelevantBreakStmtNodes (s);
12974 if (bset.size()!=0 )
12988 ROSE_ASSERT(loop != NULL);
12999 SgStatementPtrList & init = fs->get_init_stmt();
13000 if (init.size() !=1)
13003 SgExpression* ivarast=NULL, *lbast=NULL, *ubast=NULL, *stepast=NULL;
13006 bool isCase1=
false, isCase2=
false;
13008 if (isSgVariableDeclaration(init1))
13012 ROSE_ASSERT(ivarname != NULL);
13014 if (isSgAssignInitializer(initor))
13016 lbast = isSgAssignInitializer(initor)->
get_operand();
13022 SgVarRefExp* var = isSgVarRefExp(SkipCasting(ivarast));
13025 ivarname = var->get_symbol()->get_declaration();
13030 ROSE_ASSERT(!(isCase1&&isCase2));
13032 if (!(isCase1||isCase2))
13044 case V_SgLessOrEqualOp:
13045 if (isInclusiveUpperBound != NULL)
13046 *isInclusiveUpperBound =
true;
13047 if (hasIncrementalIterationSpace != NULL)
13048 *hasIncrementalIterationSpace =
true;
13050 case V_SgLessThanOp:
13051 if (isInclusiveUpperBound != NULL)
13052 *isInclusiveUpperBound =
false;
13053 if (hasIncrementalIterationSpace != NULL)
13054 *hasIncrementalIterationSpace =
true;
13056 case V_SgGreaterOrEqualOp:
13057 if (isInclusiveUpperBound != NULL)
13058 *isInclusiveUpperBound =
true;
13059 if (hasIncrementalIterationSpace != NULL)
13060 *hasIncrementalIterationSpace =
false;
13062 case V_SgGreaterThanOp:
13063 if (isInclusiveUpperBound != NULL)
13064 *isInclusiveUpperBound =
false;
13065 if (hasIncrementalIterationSpace != NULL)
13066 *hasIncrementalIterationSpace =
false;
13075 if (testvar == NULL)
13099 case V_SgPlusAssignOp:
13100 case V_SgMinusAssignOp:
13101 incr_var = isSgVarRefExp(SkipCasting(isSgBinaryOp(incr)->get_lhs_operand()));
13104 case V_SgPlusPlusOp:
13105 case V_SgMinusMinusOp:
13106 incr_var = isSgVarRefExp(SkipCasting(isSgUnaryOp(incr)->get_operand()));
13109 case V_SgAssignOp: {
13110 incr_var=isSgVarRefExp(SkipCasting(isSgBinaryOp(incr)->get_lhs_operand()));
13111 if(incr_var == NULL)
13113 SgAddOp* addOp=isSgAddOp(SkipCasting(isSgBinaryOp(incr)->get_rhs_operand()));
13114 SgSubtractOp* subtractOp=isSgSubtractOp(SkipCasting(isSgBinaryOp(incr)->get_rhs_operand()));
13118 else if(subtractOp)
13119 arithOp=subtractOp;
13122 ROSE_ASSERT(arithOp!=0);
13123 if(
SgVarRefExp* varRefExp=isSgVarRefExp(SkipCasting(isSgBinaryOp(arithOp)->get_lhs_operand()))) {
13125 incr_var=varRefExp;
13127 }
else if(
SgVarRefExp* varRefExp=isSgVarRefExp(SkipCasting(isSgBinaryOp(arithOp)->get_rhs_operand()))) {
13128 if(isSgAddOp(arithOp)) {
13130 incr_var=varRefExp;
13140 if (incr_var == NULL)
13161 if (body != NULL) {
13170 ROSE_ASSERT(loop != NULL);
13171 ROSE_ASSERT(lb != NULL);
13176 if (forstmt != NULL)
13181 Rose_STL_Container<SgNode* > testList = NodeQuery::querySubTree( *((forstmt->get_init_stmt()).begin()), V_SgAssignOp);
13182 if (testList.size()>0)
13184 ROSE_ASSERT(testList.size()==1);
13185 SgAssignOp * assignop = isSgAssignOp((*testList.begin()));
13186 ROSE_ASSERT(assignop);
13196 Rose_STL_Container<SgNode* > testList = NodeQuery::querySubTree( *((forstmt->get_init_stmt()).begin()), V_SgAssignInitializer );
13197 ROSE_ASSERT(testList.size()==1);
13199 ROSE_ASSERT(init != NULL);
13200 init->set_operand(lb);
13205 else if (dostmt != NULL)
13208 ROSE_ASSERT (init != NULL);
13210 ROSE_ASSERT (a_op!=NULL);
13217 cerr<<
"Error. SageInterface::setLoopLowerBound(), illegal loop type:"<< loop->
class_name()<<endl;
13218 ROSE_ASSERT (
false);
13225 ROSE_ASSERT(loop != NULL);
13226 ROSE_ASSERT(ub != NULL);
13230 if (forstmt != NULL)
13233 SgBinaryOp * binop= isSgBinaryOp(isSgExprStatement(forstmt->get_test())->get_expression());
13234 ROSE_ASSERT(binop != NULL);
13238 else if (dostmt != NULL)
13240 dostmt->set_bound(ub);
13246 cerr<<
"Error. SageInterface::setLoopUpperBound(), illegal loop type:"<< loop->
class_name()<<endl;
13247 ROSE_ASSERT (
false);
13255 ROSE_ASSERT(loop != NULL);
13256 ROSE_ASSERT(stride != NULL);
13260 if (dostmt != NULL)
13262 dostmt->set_increment(stride);
13266 else if (forstmt != NULL)
13270 Rose_STL_Container<SgNode*> testList = NodeQuery::querySubTree( forstmt->get_increment(), V_SgPlusPlusOp);
13271 if (testList.size()>0)
13273 ROSE_ASSERT(testList.size() == 1);
13275 (isSgPlusPlusOp( *testList.begin())->
get_operand()));
13277 forstmt->set_increment(plusassignop);
13281 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgMinusMinusOp);
13282 if (testList.size()>0)
13284 ROSE_ASSERT(testList.size()==1);
13286 (isSgMinusMinusOp(*testList.begin())->
get_operand()));
13288 forstmt->set_increment(plusassignop);
13292 testList = NodeQuery::querySubTree( forstmt->get_increment(), V_SgPlusAssignOp);
13293 if (testList.size()>0)
13295 ROSE_ASSERT(testList.size()==1);
13296 SgPlusAssignOp * assignop = isSgPlusAssignOp(*(testList.begin()));
13297 ROSE_ASSERT(assignop!=NULL);
13302 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgMinusAssignOp);
13303 if (testList.size()>0)
13305 ROSE_ASSERT(testList.size()==1);
13308 SgExprStatement* exprstmt = isSgExprStatement((*testList.begin())->get_parent());
13309 ROSE_ASSERT(exprstmt !=NULL);
13311 exprstmt->set_expression(plusassignop);
13322 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgAddOp);
13323 if (testList.size()>0)
13325 ROSE_ASSERT(testList.size()==1);
13327 SgAddOp * addop = isSgAddOp(*(testList.begin()));
13328 ROSE_ASSERT(addop!=NULL);
13342 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgSubtractOp);
13343 if (testList.size()>0)
13345 ROSE_ASSERT(testList.size()==1);
13347 SgSubtractOp * subtractop = isSgSubtractOp(*(testList.begin()));
13348 ROSE_ASSERT(subtractop!=NULL);
13351 SgAssignOp *assignop = isSgAssignOp((*testList.begin())->get_parent());
13352 ROSE_ASSERT(assignop !=NULL);
13359 cerr<<
"Error. SageInterface::setLoopStride(), illegal loop type:"<< loop->
class_name()<<endl;
13360 ROSE_ASSERT (
false);
13371 SgExpression *exp = (n != 0)? n->get_expression() : isSgExpression(s);
13374 case V_SgPlusAssignOp:
13375 case V_SgMinusAssignOp:
13376 case V_SgAndAssignOp:
13377 case V_SgIorAssignOp:
13378 case V_SgMultAssignOp:
13379 case V_SgDivAssignOp:
13380 case V_SgModAssignOp:
13381 case V_SgXorAssignOp:
13389 if ( init->variantT() == V_SgAssignInitializer)
13390 init = isSgAssignInitializer(init)->
get_operand();
13394 *readlhs = (exp->
variantT() != V_SgAssignOp);
13408 Rose_STL_Container<SgNode*> gotos = NodeQuery::querySubTree(top,V_SgGotoStatement);
13409 for (
size_t i = 0; i < gotos.size(); ++i)
13414 if (!lsParent)
continue;
13417 size_t j = std::find(bbStatements.begin(), bbStatements.end(), ls) - bbStatements.begin();
13419 ROSE_ASSERT (j != bbStatements.size());
13421 while (j < bbStatements.size() - 1 && isSgLabelStatement(bbStatements[j + 1]))
13425 gs->
set_label(isSgLabelStatement(bbStatements[j]));
13441 ROSE_ASSERT(decl != NULL);
13442 ROSE_ASSERT(assign_stmt != NULL);
13445 SgAssignOp * assign_op = isSgAssignOp (assign_stmt->get_expression());
13446 if (assign_op == NULL)
13449 if (assign_op_var == NULL)
return false;
13453 if (decl_var->get_initptr()!= NULL )
return false;
13460 if (decl_var_symbol!=NULL)
13463 if (assign_op_var->get_symbol() != decl_var_symbol)
return false;
13468 if (assign_op_var->get_symbol()->
get_name() != decl_var ->get_name())
return false;
13482 if (removeAssignStmt)
13486 decl_var->set_initptr(initor);
13497 ROSE_ASSERT(assign_stmt != NULL);
13498 SgAssignOp * assign_op = isSgAssignOp (assign_stmt->get_expression());
13499 if (assign_op == NULL)
13502 if (assign_op_var == NULL)
13506 ROSE_ASSERT(decl != NULL);
13508 if (decl_var->get_initptr()!= NULL)
13515 ROSE_ASSERT(decl_var != NULL);
13517 if (decl_var_symbol != NULL) {
13519 if (assign_op_var->get_symbol() != decl_var_symbol)
13525 if (assign_op_var->get_symbol()->
get_name() != decl_var ->get_name())
13538 decl_var->set_initptr(initor);
13568 ROSE_ASSERT (decl != NULL);
13572 if (initor == NULL)
13579 rhs = ainitor->get_operand();
13585 decl_var->set_initptr(NULL);
13597 cerr<<
"SageInterface::splitVariableDeclaration() topLevelOnly == false is not yet implemented."<<endl;
13598 ROSE_ASSERT (
false);
13601 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(scope, V_SgVariableDeclaration);
13602 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
13607 ROSE_ASSERT(decl != NULL);
13620 ROSE_ASSERT (root != NULL);
13623 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(root, V_SgVarRefExp);
13627 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
13630 ROSE_ASSERT (vRef != NULL);
13631 result.push_back(vRef);
13638 ROSE_ASSERT (root != NULL);
13639 Rose_STL_Container<SgNode*> constructorList= NodeQuery::querySubTree(root, V_SgConstructorInitializer);
13640 for (
size_t i =0; i< constructorList.size(); i++)
13645 Rose_STL_Container<SgNode*> varList = NodeQuery::querySubTree (a_type->get_index(),V_SgVarRefExp);
13646 for (
size_t j =0 ; j< varList.size(); j++)
13648 SgVarRefExp* var_exp = isSgVarRefExp(varList[j]) ;
13649 currentVarRefList.push_back(var_exp);
13673 SgExpression* lhsCopy = isSgExpression(lhs->copy(treeCopy));
13674 ROSE_ASSERT (lhsCopy);
13698 SgExpression* lhsCopy = isSgExpression(lhs->copy(treeCopy));
13699 ROSE_ASSERT (lhsCopy);
13723 SgExpression* lhsCopy = isSgExpression(lhs->copy(treeCopy));
13724 ROSE_ASSERT (lhsCopy);
13741 ROSE_ASSERT(from != NULL);
13743#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
13747 ROSE_ASSERT (
false);
13752 SgStatement* stmt = getStatementOfExpression(from);
13754 if (!isSgForInitStatement(stmt->
get_parent())) {
13763 if (!parent && isSgForInitStatement(stmt->
get_parent()))
13769 SgName varname =
"rose_temp__";
13770 if (newName ==
"") {
13778 vector<SgExpression*> ancestors;
13779 for (
SgExpression *expr = from, *anc = isSgExpression(fromparent); anc != 0;
13780 expr = anc, anc = isSgExpression(anc->get_parent()))
13782 if ((isSgAndOp(anc) && expr != isSgAndOp(anc)->get_lhs_operand()) ||
13785 ancestors.push_back(anc);
13788 for (vector<SgExpression*>::reverse_iterator ai = ancestors.rbegin(); ai != ancestors.rend(); ++ai)
13791 switch ((*ai)->variantT()) {
13796 case V_SgConditionalExp:
13798 default: assert (!
"Should not happen"); abort();
13803 if (ancestors.size() != 0) {
13811 ROSE_ASSERT (initname);
13813 replaceExpressionWithExpression(from, varref);
13817 initname->set_initializer(ai);
13819 myStatementInsert(stmt, vardecl,
true);
13840 SplitStatementGenerator gen;
13846 Rose_STL_Container<SgNode*> gotos = NodeQuery::querySubTree(top,
13847 V_SgGotoStatement);
13848 map<SgLabelStatement*, SgLabelStatement*> labelsToReplace;
for
13849 (
size_t i = 0; i < gotos.size(); ++i) {
13852 if (!gsParent)
continue;
13854 size_t j = std::find(bbStatements.begin(), bbStatements.end(), gs)
13855 - bbStatements.begin();
13856 ROSE_ASSERT (j != bbStatements.size());
13857 if (j == 0)
continue;
13858 if (isSgLabelStatement(bbStatements[j - 1])) {
13859 labelsToReplace[isSgLabelStatement(bbStatements[j - 1])] =
13863 for (
size_t i = 0; i < gotos.size(); ++i) {
13866 while (labelsToReplace.find(oldLabel) != labelsToReplace.end()) {
13867 oldLabel = labelsToReplace[oldLabel];
13877 case V_SgBoolValExp:
return (isSgBoolValExp(e)->get_value() != 0);
13879 case V_SgBoolValExp:
return (isSgBoolValExp(e)->get_value() ==
true);
13881 case V_SgIntVal:
return isSgIntVal(e)->get_value() != 0;
13882 case V_SgCastExp:
return isConstantTrue(isSgCastExp(e)->get_operand());
13884 case V_SgAddressOfOp:
return true;
13885 default:
return false;
13891 case V_SgBoolValExp:
return isSgBoolValExp(e)->get_value() ==
false;
13892 case V_SgIntVal:
return isSgIntVal(e)->get_value() == 0;
13893 case V_SgCastExp:
return
13895 case V_SgNotOp:
return isConstantTrue(isSgNotOp(e)->get_operand());
13896 default:
return false;
13903 if (!fc)
return false;
13905 if (fr == NULL)
return false;
13906 return fr->get_symbol()->get_declaration() == decl;
13912 if (!fc)
return false;
13914 if (fr == NULL)
return false;
13916 fr->get_symbol()->get_declaration()->get_qualified_name().getString();
13917 return (name == qualifiedName &&
13918 fc->get_args()->get_expressions().size() == arity);
13923 ROSE_ASSERT( e != NULL);
13939 ROSE_ASSERT(expList);
13941 expList->append_expression(exp);
13947 for (
size_t i = 0; i < exp.size(); ++i)
13956template <
class actualFunction>
13966 ROSE_ASSERT(paralist);
13971 cerr <<
"Waring! Setting a used SgFunctionParameterList to function: "
13972 << (func->get_name()).getString()<<endl
13973 <<
" Sharing parameter lists can corrupt symbol tables!"<<endl
13974 <<
" Please use deepCopy() to get an exclusive parameter list for each function declaration!"<<endl;
13979 if (func->get_parameterList() != NULL)
13980 if (func->get_parameterList() != paralist)
13981 delete func->get_parameterList();
13983 func->set_parameterList(paralist);
13991 ROSE_ASSERT(paraList != NULL);
13992 ROSE_ASSERT(initName != NULL);
13994 if (isPrepend ==
true)
13995 paraList->prepend_arg(initName);
13997 paraList->append_arg(initName);
14004 ROSE_ASSERT(initName->
get_parent() == paraList);
14014 if (func_decl != NULL)
14020 ROSE_ASSERT(func_def);
14030 initName->set_declptr(func_decl);
14042 initName->set_scope(scope);
14062 return addArg(paraList,initName,
false);
14067 return addArg(paraList,initName,
true);
14073 ROSE_ASSERT(pragma);
14074 if (decl->get_pragma()!=NULL)
delete (decl->get_pragma());
14075 decl->set_pragma(pragma);
14086 void testAstForUniqueNodes (
SgNode* node );
14089 printf (
"In SageInterface::appendStatement(): stmt = %p = %s scope = %p \n",stmt,stmt->
class_name().c_str(),scope);
14098 printf (
" --- scope was not specified as input! \n");
14103 ROSE_ASSERT(stmt != NULL);
14104 ROSE_ASSERT(scope != NULL);
14107 printf (
"In SageInterface::appendStatement(): stmt = %p = %s scope = %p = %s \n",stmt,stmt->
class_name().c_str(),scope,scope->
class_name().c_str());
14114 if (declarationStatement != NULL)
14142 scope->insertStatementInScope(stmt,
false);
14146 bool skipAddingStatement =
false;
14148 if (classDeclaration != NULL)
14154 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());
14160 skipAddingStatement = (classDeclaration->get_isAutonomousDeclaration() ==
false);
14164 skipAddingStatement = (classDeclaration->get_isAutonomousDeclaration() ==
false) || (classDeclaration->
get_parent() != NULL);
14179 if (statementAlreadyExistsInScope ==
true)
14181 if (isSgTemplateInstantiationDecl(classDeclaration) != NULL)
14185#if PRINT_DEVELOPER_WARNINGS
14186 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",
14194 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",
14199 skipAddingStatement =
true;
14206 if (enumDeclaration != NULL)
14209 skipAddingStatement = (enumDeclaration->get_isAutonomousDeclaration() ==
false);
14218 if (skipAddingStatement ==
false && statementAlreadyExistsInScope ==
true)
14221 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",
14225 printf (
"Exiting as a test! \n");
14228 skipAddingStatement =
true;
14233 printf (
" --- skipAddingStatement = %s \n",skipAddingStatement ?
"true" :
"false");
14236 if (skipAddingStatement ==
false)
14248 printf (
" --- calling insertStatementInScope(): scope = %p = %s stmt = %p = %s \n",scope,scope->
class_name().c_str(),stmt,stmt->
class_name().c_str());
14250 scope->insertStatementInScope(stmt,
false);
14277 testAstForUniqueNodes(scope);
14286 ROSE_ASSERT (stmt != NULL);
14287 ROSE_ASSERT (for_init_stmt != NULL);
14290 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());
14299 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());
14307 for_init_stmt->append_init_stmt (stmt);
14313 for (
size_t i = 0; i < stmts.size(); ++i)
14316#ifdef ROSE_DEBUG_NEW_EDG_ROSE_CONNECTION
14317 printf (
"In appendStatementList(): stmts[i = %" PRIuPTR
"] = %p = %s \n",i,stmts[i],stmts[i]->class_name().c_str());
14323 if (stmts[i]->get_parent() != NULL)
14326#ifdef ROSE_DEBUG_NEW_EDG_ROSE_CONNECTION
14327 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());
14334 printf (
" --- WARNING: In appendStatementList(): stmts[i = %" PRIuPTR
"] not added to scope (because stmts[i]->get_parent() == NULL) \n",i);
14343 ROSE_ASSERT (stmt != NULL);
14346 printf (
"In SageInterface::prependStatement(): stmt = %p = %s scope = %p \n",stmt,stmt->
class_name().c_str(),scope);
14356 ROSE_ASSERT(scope != NULL);
14366 printf (
"In SageInterface::prependStatement(): stmt = %p = %s scope = %p = %s (resetInternalMapsForTargetStatement: stmt) \n",
14378 printf (
"In SageInterface::prependStatement(): stmt = %p = %s scope = %p = %s (resetInternalMapsForTargetStatement: scope) \n",
14390 printf (
"Calling insertStatementInScope() \n");
14396 scope->insertStatementInScope(stmt,
true);
14416 printf (
"Leaving SageInterface::prependStatement() \n");
14424 ROSE_ASSERT (stmt != NULL);
14425 ROSE_ASSERT (for_init_stmt != NULL);
14428 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());
14437 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());
14445 for_init_stmt->prepend_init_stmt (stmt);
14450 for (
size_t i = stmts.size(); i > 0; --i)
14462 ROSE_ASSERT (scope != NULL);
14465 case V_SgBasicBlock:
14466 case V_SgClassDefinition:
14467 case V_SgFunctionDefinition:
14469 case V_SgNamespaceDefinitionStatement:
14473 case V_SgAssociateStatement :
14474 case V_SgBlockDataStatement :
14475 case V_SgCatchOptionStmt:
14476 case V_SgDoWhileStmt:
14477 case V_SgForAllStatement:
14478 case V_SgForStatement:
14479 case V_SgFortranDo:
14481 case V_SgSwitchStatement:
14482 case V_SgUpcForAllStatement:
14483 case V_SgWhileStmt:
14488 cout<<
"unrecognized or unhandled scope type for SageInterface::hasSimpleChildrenList() "<<endl;
14501 SgDeclarationStatementPtrList & declarationList = globalScope->
get_declarations();
14504 SgDeclarationStatementPtrList::iterator i = declarationList.begin();
14506 while (i != declarationList.end() && (*i)->get_file_info() != NULL && (*i)->get_file_info()->isFrontendSpecific() ==
true)
14509 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");
14511 last_statement = *i;
14516 ROSE_ASSERT(last_statement != NULL);
14518 printf (
"last_statement = %p = %s \n",last_statement,last_statement->
class_name().c_str());
14521 printf (
"Exiting as a test! \n");
14525 return last_statement;
14534 ROSE_ASSERT(targetStmt &&newStmt);
14535 ROSE_ASSERT(targetStmt != newStmt);
14537 if (isSgGlobal(targetStmt) ||
14538 isSgClassDefinition(targetStmt)||
14539 isSgNamespaceDefinitionStatement(targetStmt)||
14540 isSgFunctionParameterList(targetStmt)||
14541 isSgFunctionDefinition(targetStmt)||
14542 isSgCtorInitializerList(targetStmt))
14544 string className = targetStmt->
class_name();
14545 string err_msg =
"targetStmt cannot be a " + className +
". Its parent does not implement insert_child(). Please revise your code to avoid inserting a stmt as a sibling of this type of targetStmt.";
14546 cerr<<err_msg<<endl;
14547 ROSE_ASSERT (
false);
14551 if (isSgCaseOptionStmt(targetStmt))
14553 if (!isSgCaseOptionStmt(newStmt))
14555 cerr<<
"Target statment is a case option stmt. The new stmt should also be the same type to be a sibling. But it is "<< newStmt->
class_name() <<
" instead. This is not semantically correct." <<endl;
14556 ROSE_ASSERT(
false);
14561 if (parent == NULL)
14563 cerr <<
"Empty parent pointer for target statement. May be caused by the wrong order of target and new statements in insertStatement(targetStmt, newStmt)"<<endl;
14564 ROSE_ASSERT(parent);
14590 cerr<<
"Error: you cannot insert a variable declaration stmt inside a case option statement without enclosing brances in between."<<endl;
14591 cerr<<
"parent of target is a case option stmt:"<<parent <<endl;
14592 cerr<<
"new statement is a variable statement:"<<newStmt <<endl;
14593 ROSE_ASSERT (
false);
14597 if (isSgLabelStatement(parent) != NULL)
14600 printf (
"In SageInterface::insertStatement(): Detected case of label statement as parent, using parent of label statement \n");
14605 ROSE_ASSERT(isSgLabelStatement(parent) == NULL);
14608 if (isSgFunctionDefinition(parent) ||
14609 isSgTypedefDeclaration(parent) ||
14610 isSgSwitchStatement(parent) ||
14611 isSgVariableDeclaration(parent))
14614 string err_msg =
"targetStmt's parent cannot be a " + className +
". This parent does not implement insert() function. Please revise your code to avoid inserting a stmt as a child of this type of parent.";
14615 cerr<<err_msg<<endl;
14618 if (switch_stmt->get_item_selector() == targetStmt)
14620 cerr<<
"The target statement is the item selector of a switch statement. You cannot insert any statement before or after it."<<endl;
14624 ROSE_ASSERT (
false);
14628 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());
14646 ROSE_ASSERT(scope);
14649 printf (
"targetStmt = %p = %s \n",targetStmt,targetStmt->
class_name().c_str());
14650 printf (
"scope = %p = %s \n",scope,scope->
class_name().c_str());
14668 ROSE_ASSERT(isSgStatement(parent) != NULL);
14673 ROSE_ASSERT(targetStmt != NULL);
14677 printf (
"In SageInterface::insertStatement(): after checking for associated comments \n");
14678 reportNodesMarkedAsModified(scope);
14684 if (autoMovePreprocessingInfo)
14686 if (comments != NULL && isSgBasicBlock(newStmt) == NULL)
14688 vector<int> captureList;
14690 printf (
"Found attached comments (at %p = %s, inserting %p = %s insertBefore = %s): comments->size() = %" PRIuPTR
" \n",
14691 targetStmt,targetStmt->
class_name().c_str(),newStmt,newStmt->
class_name().c_str(),insertBefore ?
"true" :
"false",comments->size());
14698 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");
14703 int commentIndex = 0;
14704 AttachedPreprocessingInfoType::iterator i;
14705 for (i = comments->begin(); i != comments->end(); i++)
14707 ROSE_ASSERT ( (*i) != NULL );
14709 printf (
" Attached Comment (relativePosition=%s): %s\n",
14710 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
14711 (*i)->getString().c_str());
14712 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
14713 (*i)->get_file_info()->display(
"comment/directive location");
14716 if ((*i)->getRelativePosition() == relativePosition)
14719 captureList.push_back(commentIndex);
14726 if (captureList.empty() ==
false)
14732 ROSE_ASSERT(surroundingStatement != targetStmt);
14733 ROSE_ASSERT(surroundingStatement != NULL);
14735 if (surroundingStatement == NULL)
14738 surroundingStatement = (insertBefore ==
true) ? newStmt : newStmt;
14743 vector<int>::iterator j = captureList.begin();
14744 while (j != captureList.end())
14752 (*comments)[*j] = NULL;
14759 for (
size_t n = 0; n < captureList.size(); n++)
14761 AttachedPreprocessingInfoType::iterator k = comments->begin();
14762 while (k != comments->end())
14767 comments->erase(k);
14780 if (comments != NULL)
14782 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");
14789 printf (
"In SageInterface::insertStatement(): after processing associated comments \n");
14790 reportNodesMarkedAsModified(scope);
14793 if (isSgIfStmt(parent))
14795 if (isSgIfStmt(parent)->get_conditional()==targetStmt)
14801 if (isSgIfStmt(parent)->get_true_body()==targetStmt)
14821 if (isSgIfStmt(parent)->get_false_body()==targetStmt)
14835 if (isSgWhileStmt(parent))
14837 if (isSgWhileStmt(parent)->get_condition()==targetStmt)
14843 if (isSgWhileStmt(parent)->get_body()==targetStmt)
14846 isSgWhileStmt(parent)->
set_body(newparent);
14856 if (isSgDoWhileStmt(parent))
14858 if (isSgDoWhileStmt(parent)->get_condition()==targetStmt)
14864 if (isSgDoWhileStmt(parent)->get_body()==targetStmt)
14867 isSgDoWhileStmt(parent)->
set_body(newparent);
14877 if (isSgForStatement(parent))
14879 if (isSgForStatement(parent)->get_loop_body()==targetStmt)
14890 if (isSgForStatement(parent)->get_test()==targetStmt)
14911 p->set_body(newparent);
14919 ROSE_ASSERT(stmnt != NULL);
14941 printf (
"In SageInterface::insertStatement(): at BASE of function \n");
14942 reportNodesMarkedAsModified(scope);
14951 for (
size_t i = 0; i < newStmts.size(); ++i)
14958 for (
size_t i = newStmts.size(); i > 0; --i)
14967 insertStatement(targetStmt,newStmt,
false, autoMovePreprocessingInfo);
14978 ROSE_ASSERT (stmt != NULL);
14979 ROSE_ASSERT (scope != NULL);
14991 ROSE_ASSERT (scope != NULL);
14992 vector <SgStatement* >::iterator iter;
14994 for (iter= stmt_list.begin(); iter != stmt_list.end(); iter++)
14996 if (iter == stmt_list.begin())
15002 ROSE_ASSERT (prev_stmt != NULL);
15011 ROSE_ASSERT(newStmt!=NULL);
15012 ROSE_ASSERT(scope!=NULL);
15014 if (!isSgDeclarationStatement(targetStmt)) {
15024 ROSE_ASSERT(scope!=NULL);
15026 if (!isSgDeclarationStatement(targetStmt)) {
15049 ROSE_ASSERT(target);
15050 ROSE_ASSERT(operand);
15051 ROSE_ASSERT(target!=operand);
15052 switch (target->variantT())
15054 case V_SgActualArgumentExpression:
15055 isSgActualArgumentExpression(target)->set_expression(operand);
15058 isSgAsmOp(target)->set_expression(operand);
15061 isSgSizeOfOp(target)->set_operand_expr(operand);
15064 isSgTypeIdOp(target)->set_operand_expr(operand);
15067 isSgVarArgOp(target)->set_operand_expr(operand);
15069 case V_SgVarArgStartOneOperandOp:
15070 isSgVarArgStartOneOperandOp(target)->set_operand_expr(operand);
15072 case V_SgAssignInitializer:
15073 isSgAssignInitializer (target)->
set_operand(operand);
15076 if (isSgUnaryOp(target)!=NULL)
15080 cerr<<
"\tSageInterface::setOperand(): unhandled case for target expression of type "
15081 <<target->class_name()<<endl;
15086 markLhsValues(target);
15092 ROSE_ASSERT(target);
15094 ROSE_ASSERT(target!=lhs);
15095 bool hasrhs =
false;
15101 if (varargcopy!=NULL)
15103 varargcopy->set_lhs_operand(lhs);
15104 if( varargcopy->get_rhs_operand()!=NULL) hasrhs=
true;
15106 else if(varargstart!=NULL)
15108 varargstart->set_lhs_operand(lhs);
15109 if( varargstart->get_rhs_operand()!=NULL) hasrhs=
true;
15111 else if(binary!=NULL)
15118 cout<<
"SageInterface::setLhsOperand(): unhandled case for target expression of type "
15119 <<target->class_name()<<endl;
15126 markLhsValues(target);
15131 ROSE_ASSERT(target);
15133 ROSE_ASSERT(target!=rhs);
15134 bool haslhs =
false;
15140 if (varargcopy!=NULL)
15142 varargcopy->set_rhs_operand(rhs);
15143 if( varargcopy->get_lhs_operand()!=NULL) haslhs=
true;
15145 else if(varargstart!=NULL)
15147 varargstart->set_rhs_operand(rhs);
15148 if( varargstart->get_lhs_operand()!=NULL) haslhs=
true;
15150 else if(binary!=NULL)
15157 cout<<
"SageInterface::setRhsOperand(): unhandled case for target expression of type "
15158 <<target->class_name()<<endl;
15164 markLhsValues(target);
15183 ROSE_ASSERT(parentFileList != NULL);
15189 if (parentDirectory != NULL)
15192 parentDirectory->get_directoryList()->get_listOfDirectories().push_back(directory);
15199 project = isSgProject(parentFileList->
get_parent());
15200 ROSE_ASSERT(project != NULL);
15203 project->get_directoryList()->get_listOfDirectories().push_back(directory);
15210 directory->get_fileList()->get_listOfFiles().push_back(file);
15213 parentFileList->get_listOfFiles().erase(find(parentFileList->get_listOfFiles().begin(),parentFileList->get_listOfFiles().end(),file));
15223 ROSE_ASSERT(structDecl != NULL);
15224 ROSE_ASSERT(scope != NULL);
15226 ROSE_ASSERT(nondefdecl != NULL);
15252 SgName name = structDecl->get_name();
15266 if (mysymbol == NULL)
15268 printf (
"Note: SageInterface::fixStructDeclaration(): structDecl = %p nondefdecl = %p (mysymbol == NULL) \n",structDecl,nondefdecl);
15272 ROSE_ASSERT(structDecl->
get_scope() != NULL);
15277 ROSE_ASSERT(mysymbol);
15280 printf (
"############## DANGER:DANGER:DANGER ################\n");
15282 printf (
"In SageInterface::fixStructDeclaration(): Adding class symbol to scope = %p = %s \n",scope,scope->
class_name().c_str());
15290 printf (
"*** WARNING: In SageInterface::fixStructDeclaration(): (mysymbol == NULL) Commented out the setting of the parent to be the same as the scope \n");
15299 printf (
"In SageInterface::fixStructDeclaration(): (mysymbol == NULL) Skipped building an associated symbol! \n");
15304 ROSE_ASSERT(nondefdecl->get_type() != NULL);
15307 ROSE_ASSERT(nondefdecl->get_type()->
variantT() != V_SgNode);
15310 ROSE_ASSERT(isSgClassType(nondefdecl->get_type()) != NULL);
15314 if (nondefdecl->get_type() == NULL)
15318 ROSE_ASSERT (nondefdecl->get_type() != NULL);
15321 if (defdecl != NULL)
15324 ROSE_ASSERT(defdecl->get_type()->
variantT() != V_SgNode);
15327 ROSE_ASSERT(isSgClassType(defdecl->get_type()) != NULL);
15331 if (defdecl != NULL)
15334 ROSE_ASSERT(defdecl->get_type() != NULL);
15335 if (defdecl->get_type() != nondefdecl->get_type())
15337 printf (
"ERROR: defdecl->get_type() != nondefdecl->get_type(): what are these: \n");
15338 printf (
" defdecl->get_type() = %p = %s \n",defdecl ->get_type(),defdecl ->get_type()->class_name().c_str());
15339 SgNamedType* namedType_definingDecl = isSgNamedType(defdecl->get_type());
15340 if (namedType_definingDecl != NULL)
15342 printf (
"namedType_definingDecl->get_declaration() = %p = %s \n",namedType_definingDecl->get_declaration(),namedType_definingDecl->get_declaration()->
class_name().c_str());
15344 printf (
" nondefdecl->get_type() = %p = %s \n",nondefdecl->get_type(),nondefdecl->get_type()->
class_name().c_str());
15345 SgNamedType* namedType_nondefiningDecl = isSgNamedType(nondefdecl->get_type());
15346 if (namedType_nondefiningDecl != NULL)
15348 printf (
"namedType_nondefiningDecl->get_declaration() = %p = %s \n",namedType_nondefiningDecl->get_declaration(),namedType_nondefiningDecl->get_declaration()->
class_name().c_str());
15364 ROSE_ASSERT(structDecl);
15365 ROSE_ASSERT(scope);
15367 ROSE_ASSERT(nondefdecl);
15386 if (mysymbol==NULL)
15393 ROSE_ASSERT(mysymbol);
15395 printf (
"In SageInterface::fixNamespaceDeclaration(): inserting namespace symbol into scope = %p = %s \n",scope,scope->
class_name().c_str());
15399 ROSE_ASSERT(defdecl);
15409#define DEBUG__SageInterface__fixVariableDeclaration 0
15413 ROSE_ASSERT(varDecl != NULL);
15414 ROSE_ASSERT(scope != NULL);
15416 SgInitializedNamePtrList namelist = varDecl->
get_variables();
15421#if DEBUG__SageInterface__fixVariableDeclaration
15422 printf (
"In SageInterface::fixVariableDeclaration():\n");
15423 printf (
" varDecl = %p scope = %p = %s \n", varDecl);
15424 printf (
" scope = %p : %s \n", scope, scope->
class_name().c_str());
15427 ROSE_ASSERT(namelist.size() > 0);
15429 SgInitializedNamePtrList::iterator i;
15430 for (i = namelist.begin(); i != namelist.end(); i++)
15433 ROSE_ASSERT(initName != NULL);
15434#if DEBUG__SageInterface__fixVariableDeclaration
15435 printf (
" initName = %p\n", initName);
15436 printf (
" initName->get_scope() = %p : %s\n", initName->get_scope(), initName->get_scope() ? initName->get_scope()->
class_name().c_str() :
"");
15439 SgName name = initName->get_name();
15440#if DEBUG__SageInterface__fixVariableDeclaration
15441 printf (
" name = %s\n", name.str());
15446#if DEBUG__SageInterface__fixVariableDeclaration
15447 printf (
" name = %s\n", name.str());
15454 if (preAssociatedScope != NULL) {
15455 requiredScope = preAssociatedScope;
15459 initName->set_scope(requiredScope);
15464 ROSE_ASSERT(requiredScope != NULL);
15465 SgVariableSymbol* varSymbol = requiredScope->lookup_variable_symbol(name);
15466#if DEBUG__SageInterface__fixVariableDeclaration
15467 printf (
" varSymbol = %p (%s)\n", varSymbol, varSymbol ? varSymbol->
class_name().c_str() :
"");
15469 if (varSymbol == NULL) {
15470 if (scope == initName->get_scope()) {
15471 if (isSgTemplateVariableDeclaration(varDecl)) {
15476 ROSE_ASSERT(varSymbol);
15481 ROSE_ASSERT(prev_decl);
15482 if (initName != prev_decl) {
15483 initName->set_prev_decl_item(prev_decl);
15485 ROSE_ASSERT(initName->get_prev_decl_item() != initName);
15487#if DEBUG__SageInterface__fixVariableDeclaration
15488 printf (
" varSymbol = %p (%s)\n", varSymbol, varSymbol ? varSymbol->
class_name().c_str() :
"");
15506 Rose_STL_Container<SgNode*> varList;
15509 Rose_STL_Container<SgNode*> reflist = NodeQuery::querySubTree(root, V_SgVarRefExp);
15510 for (Rose_STL_Container<SgNode*>::iterator i=reflist.begin();i!=reflist.end();i++)
15512 varRef= isSgVarRefExp(*i);
15513 ROSE_ASSERT(varRef->get_symbol());
15516 ROSE_ASSERT (initname != NULL);
15519 SgName varName=initname->get_name();
15530 if (varRef == arrowExp->get_rhs_operand_i())
15534 SgType* lhs_type = arrowExp->get_lhs_operand_i()->get_type() ;
15535 lhs_type = lhs_type->
stripType(SgType::STRIP_MODIFIER_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE | SgType::STRIP_TYPEDEF_TYPE);
15537 ROSE_ASSERT(ptrType);
15538 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));
15539 ROSE_ASSERT(clsType);
15557 if (varRef == dotExp->get_rhs_operand_i())
15562 SgType* lhs_type = dotExp->get_lhs_operand_i()->get_type() ;
15563 lhs_type = lhs_type->
stripType(SgType::STRIP_MODIFIER_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE | SgType::STRIP_TYPEDEF_TYPE);
15565 ROSE_ASSERT(clsType);
15589 if (realSymbol==NULL)
15596 ROSE_ASSERT(realSymbol!=(varRef->get_symbol()));
15603 bool toDelete =
true;
15605 SgSymbol* symbolToDelete = varRef->get_symbol();
15606 varRef->set_symbol(isSgVariableSymbol(realSymbol));
15609 if (varList.empty())
15611 VariantVector vv(V_SgVarRefExp);
15612 varList = NodeQuery::queryMemoryPool(vv);
15615 for (Rose_STL_Container<SgNode*>::iterator i = varList.begin();
15616 i != varList.end(); ++i)
15620 if (var->get_symbol() == symbolToDelete)
15630 delete symbolToDelete;
15639 delete (varRef->get_symbol());
15643 varRef->set_symbol(isSgVariableSymbol(realSymbol));
15650 if (cleanUnusedSymbols)
15657 Rose_STL_Container<SgNode*> symbolList;
15658 VariantVector sym_vv(V_SgVariableSymbol);
15659 symbolList = NodeQuery::queryMemoryPool(sym_vv);
15661 Rose_STL_Container<SgNode*> varList;
15662 VariantVector var_vv(V_SgVarRefExp);
15666 varList = NodeQuery::querySubTree(root, V_SgVarRefExp);
15669 for (Rose_STL_Container<SgNode*>::iterator i = symbolList.begin();
15670 i != symbolList.end(); ++i)
15673 ROSE_ASSERT(symbolToDelete);
15677 bool toDelete =
true;
15681 for (Rose_STL_Container<SgNode*>::iterator j = varList.begin();
15682 j != varList.end(); ++j)
15687 if (var->get_symbol() == symbolToDelete)
15698 std::cout <<
"Symbol " << symbolToDelete->
get_name().str() <<
' ' << symbolToDelete <<
15699 ' ' << symbolToDelete->get_declaration() <<
" is deleted." << std::endl;
15701 delete symbolToDelete->get_declaration();
15702 delete symbolToDelete;
15715 ROSE_ASSERT(label_stmt);
15724 if (isSgFunctionDefinition(scope) !=
nullptr)
15726 ASSERT_not_null(label_scope);
15732 SgLabelSymbol* lsymbol = label_scope->lookup_label_symbol(name);
15734 if (lsymbol ==
nullptr)
15739 ASSERT_not_null(lsymbol);
15751 ROSE_ASSERT (stmt != NULL);
15752 ROSE_ASSERT (label_value >0 && label_value <=99999);
15755 if (label_scope == NULL)
15759 ROSE_ASSERT (label_scope != NULL);
15761 SgLabelSymbol * symbol = label_scope->lookup_label_symbol (label_name);
15762 if (symbol == NULL)
15768 ROSE_ASSERT(symbol != NULL);
15769 symbol->set_fortran_statement(stmt);
15770 symbol->set_numeric_label_value(label_value);
15775 cerr<<
"Error. SageInterface::setFortranNumericLabel() tries to set a duplicated label value!"<<endl;
15776 ROSE_ASSERT (
false);
15785 case SgLabelSymbol::e_start_label_type:
15787 stmt->set_numeric_label(ref_exp);
15790 case SgLabelSymbol::e_end_label_type:
15792 stmt->set_end_numeric_label(ref_exp);
15797 std::cerr <<
"SageInterface::setFortranNumericLabel: unimplemented for label_type " << label_type <<
"\n";
15809 ROSE_ASSERT (func_def != NULL);
15814 std::set<SgNode*>::iterator iter ;
15815 for (iter=symbols.begin(); iter !=symbols.end(); iter++)
15820 int cur_val = l_symbol->get_numeric_label_value();
15821 if (result <=cur_val)
15822 result = cur_val +10;
15826 ROSE_ASSERT (result <= 99999);
15837 ROSE_ASSERT(scope != NULL);
15842 ROSE_ASSERT(fTable != NULL);
15849 printf (
"WARNING: Skip setting the scope of the SgFunctionTypeTable scope = %p = %s \n",scope,scope->
class_name().c_str());
15855 printf (
"In SageInterface::fixStatement(): stmt = %p = %s \n",stmt,stmt->
class_name().c_str());
15868 if (tmfunc != NULL)
15869 assert(tmfunc->
variantT() == V_SgTemplateMemberFunctionDeclaration);
15870 else if (mfunc != NULL)
15871 assert(mfunc->
variantT() == V_SgMemberFunctionDeclaration || mfunc->
variantT() == V_SgTemplateInstantiationMemberFunctionDecl);
15872 else if (tfunc != NULL)
15873 assert(tfunc->
variantT() == V_SgTemplateFunctionDeclaration);
15874 else if (procfunc != NULL)
15875 assert(procfunc->
variantT() == V_SgProcedureHeaderStatement);
15876 else if (progfunc != NULL)
15877 assert(progfunc->
variantT() == V_SgProgramHeaderStatement);
15878 else if (func != NULL)
15879 assert(func->
variantT() == V_SgFunctionDeclaration || func->
variantT() == V_SgTemplateInstantiationFunctionDecl);
15883 printf (
"In SageInterface::fixStatement(): scope = %p = %s \n",scope,scope->
class_name().c_str());
15884 printf (
"In SageInterface::fixStatement(): stmt->get_scope() = %p \n",stmt->
get_scope());
15896 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());
15902 if (tmfunc != NULL)
15904 SgTemplateParameterPtrList & templateParameterList = tmfunc->get_templateParameters();
15907 func_symbol = scope->lookup_template_member_function_symbol (func->get_name(), func->get_type(),&templateParameterList);
15909 else if (mfunc != NULL)
15912 SgTemplateArgumentPtrList* templateArgumentList = (templateInstantiationMemberFunctionDecl != NULL) ? &(templateInstantiationMemberFunctionDecl->
get_templateArguments()) : NULL;
15914 func_symbol = scope->lookup_nontemplate_member_function_symbol (func->get_name(), func->get_type(),templateArgumentList);
15916 else if (tfunc != NULL)
15918 SgTemplateParameterPtrList & templateParameterList = tfunc->get_templateParameters();
15920 printf (
"In SageInterface::fixStatement(): templateParameterList.size() = %" PRIuPTR
" \n",templateParameterList.size());
15924 func_symbol = scope->lookup_template_function_symbol (func->get_name(), func->get_type(),&templateParameterList);
15926 else if (procfunc != NULL)
15929 printf (
"In SageInterface::fixStatement(): procfunc->get_name() = %s calling lookup_function_symbol() \n",procfunc->get_name().str());
15931 func_symbol = scope->lookup_function_symbol (procfunc->get_name(), procfunc->get_type());
15932 assert(func_symbol != NULL);
15934 else if (progfunc != NULL)
15936 func_symbol = scope->lookup_function_symbol (progfunc->get_name(), progfunc->get_type());
15937 assert(func_symbol != NULL);
15939 else if (func != NULL)
15942 printf (
"In SageInterface::fixStatement(): func->get_name() = %s calling lookup_function_symbol() \n",func->get_name().str());
15945 SgTemplateArgumentPtrList* templateArgumentList = (templateInstantiationFunctionDecl != NULL) ? &(templateInstantiationFunctionDecl->
get_templateArguments()) : NULL;
15947 func_symbol = scope->lookup_function_symbol (func->get_name(), func->get_type(),templateArgumentList);
15952 if (func_symbol == NULL)
15964 printf (
"In SageInterface::fixStatement(): func_symbol = %p \n",func_symbol);
15966 assert(func_symbol != NULL);
15977 printf (
"Need to handle SgTemplateDeclaration IR nodes as well...(implement later) \n");
15985 if (isSgVariableDeclaration(stmt))
15992 ROSE_ASSERT(classDeclaration !=
nullptr);
15995 else if (isSgClassDeclaration(stmt))
15999 else if (isSgLabelStatement(stmt))
16003 else if (isSgFunctionDeclaration(stmt))
16011 ROSE_ASSERT(fTable);
16020 printf (
"In SageInterface::fixStatement(): scope = %p = %s \n",scope,scope->
class_name().c_str());
16021 printf (
"In SageInterface::fixStatement(): stmt->get_scope() = %p \n",stmt->
get_scope());
16032 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());
16034 SgFunctionSymbol* func_symbol = scope->lookup_function_symbol (func->get_name(), func->get_type());
16036 printf (
"In SageInterface::fixStatement(): func_symbol = %p \n",func_symbol);
16037 if (func_symbol == NULL)
16049 ROSE_ASSERT (func_symbol != NULL);
16055 printf (
"In SageInterface::fixStatement(): found a valid function so no need to insert new symbol \n");
16063 if (local_symbol == NULL)
16068 if (func != src_func )
16078 else if (isSgTemplateDeclaration(stmt) != NULL)
16093 case V_SgEnumDeclaration:
16094 case V_SgTemplateDeclaration:
16095 case V_SgTypedefDeclaration:
16096 case V_SgFunctionDeclaration:
16097 case V_SgMemberFunctionDeclaration:
16098 case V_SgTemplateInstantiationFunctionDecl:
16113 printf (
"In SageInterface::fixStatement(): switch default case used (likely OK): stmt = %p = %s \n",stmt,stmt->
class_name().c_str());
16116 printf (
"switch case not handled properly: stmt = %p = %s \n",stmt,stmt->
class_name().c_str());
16148 ROSE_ASSERT(func != NULL && scope != NULL);
16150 ROSE_ASSERT(func != NULL);
16151 ROSE_ASSERT(scope != NULL);
16153 SgStatementPtrList stmtList, sameFuncList;
16160 SgDeclarationStatementPtrList::iterator i;
16161 for (i=declList.begin();i!=declList.end();i++)
16162 stmtList.push_back(*i);
16170 if (firstNondefiningFunctionDeclaration != NULL)
16175 printf (
"In SageInterface::updateDefiningNondefiningLinks(): func = %p Found a valid pointer to a firstNondefiningFunctionDeclaration = %p \n",func,firstNondefiningFunctionDeclaration);
16186 printf (
"WARNING: symbol for func->get_firstNondefiningDeclaration() = %p = %s = %s is not present in the scope = %p = %s associated with the firstNondefiningDeclaration \n",
16194 SgSymbol* functionSymbol = scope->lookup_function_symbol(func->get_name(),func->get_type());
16195 if (functionSymbol != NULL)
16197 printf (
"In SageInterface::updateDefiningNondefiningLinks(): func = %p Found a valid symbol = %p \n",func,functionSymbol);
16201 printf (
"In SageInterface::updateDefiningNondefiningLinks(): func = %p functionSymbol == NULL \n",func);
16206 SgStatementPtrList::iterator j;
16207 for (j = stmtList.begin(); j != stmtList.end(); j++)
16210 if (func_decl != NULL)
16217 sameFuncList.push_back(func_decl);
16223 printf (
"func = %p \n",func);
16227 ROSE_ASSERT(func != NULL);
16231 for (j = sameFuncList.begin(); j != sameFuncList.end(); j++)
16236 ROSE_ASSERT(func != NULL);
16239 ROSE_ASSERT(sameFuncList.empty() ==
false);
16241 if (func == isSgFunctionDeclaration(*(sameFuncList.begin())))
16243 for (j = sameFuncList.begin(); j != sameFuncList.end(); j++)
16247 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 1) Testing j = %p set_firstNondefiningDeclaration(%p) \n",*j,func);
16251 if (func_decl != func)
16258 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 1) Calling j = %p set_firstNondefiningDeclaration(%p) \n",*j,func);
16268 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 2) Testing func = %p set_firstNondefiningDeclaration(%p) \n",func,isSgFunctionDeclaration(*(sameFuncList.begin()))->
get_firstNondefiningDeclaration());
16275 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 2) Calling func = %p set_firstNondefiningDeclaration(%p) \n",func,isSgFunctionDeclaration(*(sameFuncList.begin()))->
get_firstNondefiningDeclaration());
16284 assert(source_file != NULL);
16285 assert(position == PreprocessingInfo::before || position == PreprocessingInfo::after);
16287 SgGlobal * global_scope = source_file->get_globalScope();
16290 ROSE_ASSERT(result);
16306 PreprocessingInfo::DirectiveType dtype )
16308 ASSERT_not_null(target);
16311 PreprocessingInfo::DirectiveType mytype=dtype;
16316 if (mytype == PreprocessingInfo::CpreprocessorUnknownDeclaration)
16322 mytype = PreprocessingInfo::C_StyleComment;
16327 mytype = PreprocessingInfo::CplusplusStyleComment;
16332 mytype = PreprocessingInfo::F90StyleComment;
16337 mytype = PreprocessingInfo::AdaStyleComment;
16342 mytype = PreprocessingInfo::JovialStyleComment;
16346 cout <<
"WARNING: SageInterface::attachComment(): Unknown programming language \n";
16352 bool resetPositionInfo =
false;
16355 case PreprocessingInfo::C_StyleComment: comment =
"/* " + content +
" */";
break;
16356 case PreprocessingInfo::CplusplusStyleComment: comment =
"// " + content;
break;
16357 case PreprocessingInfo::FortranStyleComment: comment =
" C " + content;
break;
16358 case PreprocessingInfo::F90StyleComment: comment =
"!" + content;
break;
16359 case PreprocessingInfo::AdaStyleComment: comment =
"-- " + content;
break;
16360 case PreprocessingInfo::JovialStyleComment:
16364 case PreprocessingInfo::CpreprocessorLineDeclaration:
16365 comment =
"#myline " + content;
16366 mytype = PreprocessingInfo::CplusplusStyleComment;
16367 resetPositionInfo =
true;
16369 case PreprocessingInfo::CpreprocessorIfndefDeclaration: comment =
"#ifndef " + content +
"\n";
break;
16370 case PreprocessingInfo::CpreprocessorDefineDeclaration: comment =
"#define " + content +
"\n";
break;
16371 case PreprocessingInfo::CpreprocessorEndifDeclaration: comment =
"#endif" + (content.empty() ?
"\n" : (
" /* " + content +
" */\n"));
break;
16372 case PreprocessingInfo::CpreprocessorEnd_ifDeclaration: comment =
"#end if" + (content.empty() ?
"\n" : (
" /* " + content +
" */\n"));
break;
16376 printf (
"Error: default in switch reached in SageInterface::attachComment() PreprocessingInfo::DirectiveType == %d \n",mytype);
16381 result =
new PreprocessingInfo (mytype,comment,
"transformation-generated", 0, 0, 0, position);
16384 if (resetPositionInfo ==
true)
16387 *(result->get_file_info()) = *(target->get_file_info());
16397 ASSERT_not_null(result);
16398 target->addToAttachedPreprocessingInfo(result);
16404 PreprocessingInfo::CpreprocessorIfDeclaration,
16406 "transformation-generated", 0, 0, 0,
16407 PreprocessingInfo::before
16409 target->addToAttachedPreprocessingInfo(if_macro);
16412 PreprocessingInfo::CpreprocessorEndifDeclaration,
16414 "transformation-generated", 0, 0, 0,
16415 PreprocessingInfo::after
16417 target->addToAttachedPreprocessingInfo(endif_macro);
16430static map<SgSourceFile*, map<string, PreprocessingInfo*> > fileHeaderDict;
16435 if (isSystemHeader)
16436 header_key=
"<"+header_file_name+
">";
16438 header_key=
"\""+header_file_name+
"\"";
16440 if (fileHeaderDict.count(source_file) && fileHeaderDict[source_file].count(header_key))
16441 return fileHeaderDict[source_file][header_key];
16443 vector<SgLocatedNode*> candidates;
16446 SgGlobal* global= source_file -> get_globalScope();
16448 candidates.push_back(global);
16451 SgDeclarationStatementPtrList decl_stmt_list = global->
get_declarations();
16452 for (SgDeclarationStatementPtrList::iterator iter= decl_stmt_list.begin(); iter!=decl_stmt_list.end(); iter++)
16453 candidates.push_back(*iter);
16455 bool found =
false;
16456 for (
size_t ci=0; ci<candidates.size(); ci++)
16461 if (comments == NULL)
continue;
16462 AttachedPreprocessingInfoType::iterator i;
16463 for (i = comments->begin (); i != comments->end (); i++)
16465 if ((*i)->getTypeOfDirective () != PreprocessingInfo::CpreprocessorIncludeDeclaration)
continue;
16466 string content = (*i)->getString ();
16467 if (content.find(header_key) != string::npos)
16469 fileHeaderDict[source_file][header_key] = *i;
16480 return fileHeaderDict[source_file][header_key];
16490 bool supportTokenUnparsing =
false;
16492 assert(source_file != NULL);
16493 assert(position == PreprocessingInfo::before || position == PreprocessingInfo::after);
16495 SgGlobal * global_scope = source_file->get_globalScope();
16498 if (isSystemHeader)
16499 content =
"#include <" + header_file_name +
"> \n";
16501 content =
"#include \"" + header_file_name +
"\" \n";
16504 ROSE_ASSERT(result);
16512 supportTokenUnparsing = source_file->get_unparse_tokens();
16513 bool supportUnparseHeaders = source_file->get_unparseHeaderFiles();
16516 printf (
"supportTokenUnparsing = %s \n",supportTokenUnparsing ?
"true" :
"false");
16517 printf (
"supportUnparseHeaders = %s \n",supportUnparseHeaders ?
"true" :
"false");
16518 printf (
"source_file = %p \n",source_file);
16519 printf (
"global_scope = %p \n",global_scope);
16522 printf (
"Exiting as a test! \n");
16527 if (supportTokenUnparsing ==
false)
16536 if (supportUnparseHeaders ==
true)
16541 printf (
"physical_file_id = %d \n",physical_file_id);
16546 printf (
"Exiting as a test! \n");
16553 global_scope->prepend_statement(emptyDeclaration);
16557 printf (
"Exiting as a test! \n");
16558 ROSE_ASSERT(
false);
16569 bool supportTokenUnparsing =
false;
16575 printf (
"In SageInterface::insertHeader(): filename = %s \n",filename.c_str());
16576 printf (
" --- position = %s \n",PreprocessingInfo::relativePositionName(position).c_str());
16582 ROSE_ASSERT(scope);
16585 ROSE_ASSERT(globalScope != NULL);
16593 if (isSystemHeader)
16594 content =
"#include <" + filename +
"> \n";
16596 content =
"#include \"" + filename +
"\" \n";
16605 ROSE_ASSERT(sourceFile != NULL);
16607 supportTokenUnparsing = sourceFile->get_unparse_tokens();
16609 bool supportUnparseHeaders = sourceFile->get_unparseHeaderFiles();
16611 if (supportUnparseHeaders)
16614 string suffix = Rose::StringUtility ::fileNameSuffix(filename);
16617 if (suffix==
"h" ||suffix==
"hpp"|| suffix==
"hh"||suffix==
"H" ||suffix==
"hxx"||suffix==
"h++" ||suffix==
"tcc")
16622 printf (
"supportTokenUnparsing = %s \n",supportTokenUnparsing ?
"true" :
"false");
16623 printf (
"supportUnparseHeaders = %s \n",supportUnparseHeaders ?
"true" :
"false");
16624 printf (
"sourceFile = %p \n",sourceFile);
16625 printf (
"globalScope = %p \n",globalScope);
16628 printf (
"supportTokenUnparsing = %s \n",supportTokenUnparsing ?
"true" :
"false");
16631 printf (
"Exiting as a test! \n");
16635 SgDeclarationStatementPtrList & stmtList = globalScope->
get_declarations();
16638 printf (
"stmtList.size() = %zu \n",stmtList.size());
16641 if (stmtList.size() > 0)
16643 for (SgDeclarationStatementPtrList::iterator j = stmtList.begin (); j != stmtList.end (); j++)
16647 if ( ((*j)->get_file_info())->isSameFile(srcScope->
get_file_info ()) || ((*j)->get_file_info ())->isTransformation() )
16649 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration, content,
"Transformation generated",0, 0, 0, PreprocessingInfo::before);
16650 ROSE_ASSERT(result != NULL);
16652 printf (
"Building a PreprocessingInfo: result = %p \n",result);
16660 if (supportTokenUnparsing ==
false)
16662 (*j)->addToAttachedPreprocessingInfo(result,position);
16666 (*j)->addToAttachedPreprocessingInfo(result,position);
16668 printf (
"In SageInterface::insertHeader(): Calling set_containsTransformationToSurroundingWhitespace(true) \n");
16672 (*j)->set_containsTransformationToSurroundingWhitespace(
true);
16681 printf (
"In SageInterface::insertHeader(): declarationStatement = %p = %s \n",declarationStatement,declarationStatement->
class_name().c_str());
16682 printf (
"In SageInterface::insertHeader(): declarationStatement->get_containsTransformationToSurroundingWhitespace() = %s \n",
16683 declarationStatement->get_containsTransformationToSurroundingWhitespace() ?
"true" :
"false");
16690 if (supportUnparseHeaders ==
true)
16695 printf (
"physical_file_id = %d \n",physical_file_id);
16697 emptyDeclaration->get_startOfConstruct()->set_physical_file_id(physical_file_id);
16698 emptyDeclaration->get_endOfConstruct()->set_physical_file_id(physical_file_id);
16700 printf (
"Exiting as a test! \n");
16701 ROSE_ASSERT(
false);
16705 emptyDeclaration->addToAttachedPreprocessingInfo(result, position);
16711 printf (
"break out of for loop: result = %p \n",result);
16721 cerr<<
"SageInterface::insertHeader() Empty file is found!"<<endl;
16722 cerr<<
"#include xxx is preprocessing information which has to be attached to some other located node (a statement for example)"<<endl;
16723 cerr<<
"You may have to insert some statement first before inserting a header"<<endl;
16724 ROSE_ASSERT(
false);
16725 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration, content,
"Transformation generated",0, 0, 0, PreprocessingInfo::after);
16726 ROSE_ASSERT(result);
16737 if (result != NULL)
16748 printf (
"Exiting as a test! \n");
16749 ROSE_ASSERT(
false);
16753 printf (
"Leaving SageInterface::insertHeader(): filename = %s \n",filename.c_str());
16757 printf (
"Exiting as a test! \n");
16758 ROSE_ASSERT(
false);
16768 ROSE_ASSERT (stmt != NULL);
16769 ROSE_ASSERT (newheader != NULL);
16772 printf (
"In SageInterface::insertHeader (SgStatement* stmt, PreprocessingInfo* newheader, bool asLastHeader) \n");
16778 position = PreprocessingInfo::after;
16780 position = PreprocessingInfo::before;
16786 if (comments != NULL)
16795 AttachedPreprocessingInfoType::iterator i, firsti, lasti;
16796 for (i = comments->begin (); i != comments->end (); i++)
16803 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration)
16806 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration)
16808 if (firstExistingHeader == NULL)
16810 firstExistingHeader = (*i);
16814 lastExistingHeader = (*i);
16820 if ( (*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration ||
16821 (*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorEndifDeclaration )
16824 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration)
16826 if (firstExistingHeader == NULL)
16828 firstExistingHeader = (*i);
16832 lastExistingHeader = (*i);
16835 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorEndifDeclaration)
16837 if (firstExistingEndif == NULL)
16839 firstExistingEndif = (*i);
16854 if (lastExistingHeader == NULL)
16858 comments->insert (lasti+1, newheader);
16863 if (firstExistingHeader == NULL)
16867 comments->insert (firsti, newheader);
16875 printf (
"Exiting as a test! \n");
16876 ROSE_ASSERT(
false);
16885 ROSE_ASSERT (source_file != NULL);
16886 SgGlobal* globalScope = source_file->get_globalScope();
16887 ROSE_ASSERT (globalScope != NULL);
16891 if (isSystemHeader)
16892 content =
"#include <" + filename +
"> \n";
16894 content =
"#include \"" + filename +
"\" \n";
16901 position = PreprocessingInfo::after;
16903 position = PreprocessingInfo::before;
16906 SgDeclarationStatementPtrList & stmtList = globalScope->
get_declarations ();
16907 if (stmtList.size()>0)
16909 for (SgDeclarationStatementPtrList::iterator j = stmtList.begin (); j != stmtList.end (); j++)
16914 if ( (*j)->get_file_info()->isSameFile(globalScope->
get_file_info()) || (*j)->get_file_info()->isTransformation() )
16917 printf (
"In SageInterface::insertHeader(): Found statement to attached #include: *j = %p = %s \n",*j,(*j)->class_name().c_str());
16918 printf (
" --- unparseToString() = %s \n",(*j)->unparseToString().c_str());
16920 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration, content,
"Transformation generated",0, 0, 0, PreprocessingInfo::before);
16921 ROSE_ASSERT(result);
16925 printf (
"Exiting as a test! \n");
16934 cerr<<
"SageInterface::insertHeader() Empty file is found!"<<endl;
16935 cerr<<
"#include xxx is preprocessing information which has to be attached to some other located node (a statement for example)"<<endl;
16936 cerr<<
"You may have to insert some statement first before inserting a header"<<endl;
16939 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration,
16940 content,
"Transformation generated",0, 0, 0, PreprocessingInfo::after);
16941 ROSE_ASSERT(result);
16948 printf (
"In SageInterface::insertHeader(): Marking include file for filename = %s as a transformation \n",filename.c_str());
16958 printf (
"Exiting as a test! \n");
16959 ROSE_ASSERT(
false);
16977 ROSE_ASSERT(target != NULL);
16984 PreprocessingInfo::DirectiveType mytype = PreprocessingInfo::CpreprocessorIfDeclaration;
16987 printf (
"Warning: attachArbitraryText(): attaching arbitrary text to the AST as a #if declaration: text = %s \n",text.c_str());
16989 result =
new PreprocessingInfo (mytype,text,
"transformation-generated", 0, 0, 0, position);
16990 ROSE_ASSERT(result);
16997 target->addToAttachedPreprocessingInfo(result);
17011 ROSE_ASSERT(target != NULL);
17012 AttachedPreprocessingInfoType *info= target->getAttachedPreprocessingInfo ();
17013 if (info == NULL)
return;
17014 AttachedPreprocessingInfoType::iterator j;
17015 for (j = info->begin (); j != info->end (); j++)
17017 if ((*j)->getTypeOfDirective()==PreprocessingInfo::CMacroCall)
17019#ifndef ROSE_SKIP_COMPILATION_OF_WAVE
17021 std::ostringstream os;
17022 token_container tc = (*j)->get_macro_call()->expanded_macro;
17023 token_container::const_iterator iter;
17024 for (iter=tc.begin(); iter!=tc.end(); iter++)
17025 os<<(*iter).get_value();
17028 string pragmaText = target->get_pragma()->get_pragma();
17029 string targetString = (*j)->getString();
17030 string replacement = os.str();
17032 size_t pos1 = pragmaText.find(targetString);
17033 while (pos1 != string::npos)
17035 pragmaText.replace(pos1, targetString.size(), replacement);
17036 pos1 = pragmaText.find(targetString);
17038 delete target->get_pragma();
17052 if (isSgWhileStmt(loopOrSwitch) || isSgDoWhileStmt(loopOrSwitch) ||
17053 isSgForStatement(loopOrSwitch)) {
17055 }
else if (isSgSwitchStatement(loopOrSwitch)) {
17056 body = isSgSwitchStatement(loopOrSwitch)->
get_body();
17058 ROSE_ASSERT (body);
17060 if (!breaks.empty()) {
17061 static int breakLabelCounter = 0;
17066 isSgScopeStatement(loopOrSwitch->
get_parent()));
17068 for (
size_t j = 0; j < breaks.size(); ++j) {
17073 newGoto->
set_parent(breaks[j]->get_parent());
17080 ROSE_ASSERT(node!=NULL);
17090 ROSE_ASSERT(node!=NULL);
17103 ROSE_ASSERT(stmt_src != NULL);
17104 ROSE_ASSERT(stmt_dst != NULL);
17107 if (infoList == NULL)
17110 printf (
"In SageInterface::movePreprocessingInfo(): infoList == NULL: exiting movePreprocessingInfo() \n");
17115 AttachedPreprocessingInfoType* infoToRemoveList =
new AttachedPreprocessingInfoType();
17118 printf (
"In SageInterface::movePreprocessingInfo(): \n");
17119 printf (
" --- stmt_src = %p = %s src_position = %d \n",stmt_src,stmt_src->
class_name().c_str(),src_position);
17121 if (src_declarationStatement != NULL)
17124 printf (
"src_declarationStatement->get_definingDeclaration() = %p \n",src_declarationStatement->
get_definingDeclaration());
17126 printf (
" --- stmt_dst = %p = %s dst_position = %d \n",stmt_dst,stmt_dst->
class_name().c_str(),dst_position);
17128 if (dst_declarationStatement != NULL)
17131 printf (
"dst_declarationStatement->get_definingDeclaration() = %p \n",dst_declarationStatement->
get_definingDeclaration());
17133 printf (
" --- src_position = %s \n",PreprocessingInfo::relativePositionName(src_position).c_str());
17134 printf (
" --- dst_position = %s \n",PreprocessingInfo::relativePositionName(dst_position).c_str());
17135 printf (
" --- usePrepend = %s \n",usePrepend ?
"true" :
"false");
17137 printf (
" --- infoList = %p \n",infoList);
17138 printf (
" --- infoToRemoveList = %p \n",infoToRemoveList);
17141 printf (
" --- dst_infoList = %p \n",dst_infoList);
17144 printf (
"****************************************************************** \n");
17145 printf (
"In SageInterface::movePreprocessingInfo(): Attached comments and CPP directives: stmt_src \n");
17147 printf (
"In SageInterface::movePreprocessingInfo(): Attached comments and CPP directives: stmt_dst \n");
17149 printf (
"****************************************************************** \n");
17159 printf (
" --- infoList->size() = %zu \n",infoList->size());
17160 printf (
" --- infoToRemoveList->size() = %zu \n",infoToRemoveList->size());
17166 for (Rose_STL_Container<PreprocessingInfo*>::iterator i = (*infoList).begin(); i != (*infoList).end(); i++)
17169 ROSE_ASSERT(*i != NULL);
17174 ROSE_ASSERT(info != NULL);
17177 printf (
"counter = %d Processing PreprocessingInfo = %s \n",counter,info->getString().c_str());
17186 for (Rose_STL_Container<PreprocessingInfo*>::iterator i = (*infoList).begin(); i != (*infoList).end(); i++)
17188 ROSE_ASSERT(*i != NULL);
17191 ROSE_ASSERT(info != NULL);
17194 (info->getTypeOfDirective()==PreprocessingInfo::C_StyleComment)||
17195 (info->getTypeOfDirective()==PreprocessingInfo::CplusplusStyleComment)||
17196 (info->getTypeOfDirective()==PreprocessingInfo::FortranStyleComment)||
17197 (info->getTypeOfDirective()==PreprocessingInfo::F90StyleComment)||
17198 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIncludeDeclaration )||
17199 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIncludeNextDeclaration )||
17200 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorDefineDeclaration )||
17201 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorUndefDeclaration)||
17202 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIfdefDeclaration )||
17203 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIfndefDeclaration )||
17204 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIfDeclaration )||
17205 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorDeadIfDeclaration )||
17206 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorElseDeclaration )||
17207 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorElifDeclaration )||
17208 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorEndifDeclaration ) ||
17209 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorEnd_ifDeclaration ) ||
17210 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorLineDeclaration) ||
17211 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorErrorDeclaration) ||
17212 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorWarningDeclaration) ||
17214 (info->getTypeOfDirective()==PreprocessingInfo::ClinkageSpecificationStart) ||
17215 (info->getTypeOfDirective()==PreprocessingInfo::ClinkageSpecificationEnd)
17220 if ( src_position == PreprocessingInfo::undef || info->getRelativePosition() == src_position)
17222 if (usePrepend ==
true)
17225 if (prevItem == NULL)
17243 info->setAsTransformation();
17251 stmt_dst->set_containsTransformationToSurroundingWhitespace(
true);
17252 if (isMarkedAsModified ==
false)
17259 (*infoToRemoveList).push_back(*i);
17263 if (dst_position != PreprocessingInfo::undef)
17265 info->setRelativePosition(dst_position);
17271 AttachedPreprocessingInfoType::iterator j;
17272 for (j = (*infoToRemoveList).begin(); j != (*infoToRemoveList).end(); j++)
17274 infoList->erase( find(infoList->begin(),infoList->end(),*j) );
17310 return info && (info->getRelativePosition () != pos);
17320 return info && !isNotRelPos (info, pos);
17327 ASSERT_not_null(src_node);
17330 AttachedPreprocessingInfoType* info = src_node->get_attachedPreprocessingInfoPtr();
17334 remove_copy_if(info->begin(),
17336 back_inserter(save_buf),
17337 [pos](
auto x) {
return !isRelPos(x, pos); }
17341 AttachedPreprocessingInfoType::iterator
17342 new_end = remove_if(info->begin(),
17344 [pos](
auto x) { return isRelPos(x, pos); }
17346 info->erase(new_end, info->end());
17350static AttachedPreprocessingInfoType *
17354 AttachedPreprocessingInfoType* info_list = s->get_attachedPreprocessingInfoPtr ();
17357 info_list =
new AttachedPreprocessingInfoType;
17358 ROSE_ASSERT (info_list);
17359 s->set_attachedPreprocessingInfoPtr (info_list);
17363 ROSE_ASSERT (info_list);
17370 if (save_buf.size()==0)
return;
17372 AttachedPreprocessingInfoType* info = createInfoList (dst_node);
17373 ROSE_ASSERT (info);
17380 if (pos==PreprocessingInfo::before)
17382 for(AttachedPreprocessingInfoType::reverse_iterator i=save_buf.rbegin();i!=save_buf.rend();i++)
17383 info->insert(info->begin(),*i);
17386 else if (pos==PreprocessingInfo::after)
17387 copy (save_buf.begin (), save_buf.end (), back_inserter (*info));
17388 else if (pos==PreprocessingInfo::inside)
17390 copy (save_buf.begin (), save_buf.end (), back_inserter (*info));
17391 cerr<<
"SageInterface::pastePreprocessingInfo() pos==PreprocessingInfo::inside is not supported."<<endl;
17392 save_buf[0]->display(
"ttt");
17398 ROSE_ASSERT(locatedNode != NULL);
17399 AttachedPreprocessingInfoType *comments =
17402 if (comments != NULL)
17404 printf (
"-----------------------------------------------\n");
17405 printf (
"Found an IR node (at %p of type: %s) in file %s \n",
17406 locatedNode, locatedNode->
class_name ().c_str (),
17407 (locatedNode->
get_file_info ()->get_filenameString ()).c_str ());
17409 AttachedPreprocessingInfoType::iterator i;
17410 for (i = comments->begin (); i != comments->end (); i++)
17413 (
"with attached preprocessingInfo numbering #%d :------------- \nclassification= %s:\nString format:%s\n",
17415 PreprocessingInfo::directiveTypeName ((*i)->getTypeOfDirective ()).
17416 c_str (), (*i)->getString ().c_str ());
17417 if ((*i)->getRelativePosition () == PreprocessingInfo::inside)
17418 printf (
"relative position is: inside\n");
17420 printf (
"relative position is: %s\n", \
17421 ((*i)->getRelativePosition () == PreprocessingInfo::before) ?
"before" :
"after");
17426 printf (
"No attached preprocessing info. (at %p of type: %s): \n", locatedNode,
17442template <
class ParentNode>
17452 if (basicblock == NULL) {
17454 (stmt.*setter)(basicblock);
17458 ROSE_ASSERT (basicblock != NULL);
17465 if (!isSgBasicBlock(b)) {
17473 ROSE_ASSERT (isSgBasicBlock(b));
17474 return isSgBasicBlock(b);
17480 if (!isSgBasicBlock(b)) {
17488 ROSE_ASSERT (isSgBasicBlock(b));
17489 return isSgBasicBlock(b);
17495 if (!isSgBasicBlock(b)) {
17503 ROSE_ASSERT (isSgBasicBlock(b));
17504 return isSgBasicBlock(b);
17509 ROSE_ASSERT (fs != NULL);
17511 return ensureBasicBlock_aux(*fs, &SgUpcForAllStatement::get_loop_body, &SgUpcForAllStatement::set_loop_body);
17516 if (!isSgBasicBlock(b)) {
17524 ROSE_ASSERT (isSgBasicBlock(b));
17525 return isSgBasicBlock(b);
17530 if (!isSgBasicBlock(b)) {
17538 ROSE_ASSERT (isSgBasicBlock(b));
17539 return isSgBasicBlock(b);
17544 if (!isSgBasicBlock(b)) {
17552 ROSE_ASSERT (isSgBasicBlock(b));
17553 return isSgBasicBlock(b);
17558 if (!isSgBasicBlock(b)) {
17566 printf (
"In SageInterface::ensureBasicBlockAsTrueBodyOfIf(): Added SgBasicBlock b = %p to addedBasicBlockNodes.size() = %zu \n",b,addedBasicBlockNodes.size());
17569 ROSE_ASSERT (isSgBasicBlock(b));
17570 return isSgBasicBlock(b);
17580 ROSE_ASSERT(bb != NULL);
17581 addedBasicBlockNodes.push_back(bb);
17583 printf (
"In SageInterface::recordNormalizations(): Added SgBasicBlock = %p to addedBasicBlockNodes.size() = %zu \n",bb,addedBasicBlockNodes.size());
17594 printf (
"In SageInterface::cleanupNontransformedBasicBlockNode(): addedBasicBlockNodes.size() = %zu \n",addedBasicBlockNodes.size());
17597 for (vector<SgBasicBlock*>::iterator i = addedBasicBlockNodes.begin(); i != addedBasicBlockNodes.end(); i++)
17600 ROSE_ASSERT(b != NULL);
17604 printf (
"This SgBasicBlock can be denormalized: b = %p \n",b);
17607 ROSE_ASSERT(parentOfBlock != NULL);
17612 ROSE_ASSERT(s != NULL);
17614 switch (parentOfBlock->
variantT())
17618 SgIfStmt* ifStatement = isSgIfStmt(parentOfBlock);
17622 printf (
"Calling set_true_body on ifStatement = %p = %s \n",ifStatement,ifStatement->
class_name().c_str());
17627 printf (
"Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17632 printf (
"DONE: Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17641 printf (
"Calling set_false_body on ifStatement = %p = %s \n",ifStatement,ifStatement->
class_name().c_str());
17646 printf (
"Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17651 printf (
"DONE: Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17655 printf (
"Mark as NOT modified after calling set_false_body on ifStatement = %p = %n \n",ifStatement,ifStatement->
class_name().c_str());
17658 printf (
"Error: case not handled in case V_SgIfStmt: parentOfBlock = %p = %s \n",parentOfBlock,parentOfBlock->
class_name().c_str());
17666 case V_SgWhileStmt:
17668 SgWhileStmt* whileStatement = isSgWhileStmt(parentOfBlock);
17669 if (b == whileStatement->
get_body())
17678 case V_SgSwitchStatement:
17681 if (b == switchStatement->
get_body())
17690 case V_SgForStatement:
17702 case V_SgCaseOptionStmt:
17704 SgCaseOptionStmt* caseOptionStatement = isSgCaseOptionStmt(parentOfBlock);
17705 if (b == caseOptionStatement->
get_body())
17714 case V_SgDefaultOptionStmt:
17717 if (b == defaultOptionStatement->
get_body())
17719 defaultOptionStatement->
set_body(s);
17726 case V_SgDoWhileStmt:
17728 SgDoWhileStmt* doWhileStatement = isSgDoWhileStmt(parentOfBlock);
17729 if (b == doWhileStatement->
get_body())
17739 printf (
"Error: case not handled in switch: parentOfBlock = %p = %s \n",parentOfBlock,parentOfBlock->
class_name().c_str());
17745 if (wasPreviouslyModified ==
false)
17750 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());
17757 printf (
"Exiting as a test! \n");
17764 printf (
"Leaving SageInterface::cleanupNontransformedBasicBlockNode(): addedBasicBlockNodes.size() = %zu \n",addedBasicBlockNodes.size());
17772 if (!createEmptyBody && (b == NULL || isSgNullStatement(b)))
17774 if (!isSgBasicBlock(b)) {
17782 ROSE_ASSERT (isSgBasicBlock(b));
17783 return isSgBasicBlock(b);
17788 if (!isSgBasicBlock(b)) {
17793 ROSE_ASSERT (isSgBasicBlock(b));
17794 return isSgBasicBlock(b);
17800 if (!isSgBasicBlock(b)) {
17805 ROSE_ASSERT (isSgBasicBlock(b));
17806 return isSgBasicBlock(b);
17818 case V_SgForStatement:
17820 if (isSgForStatement(p)->get_loop_body() == s)
17824 case V_SgUpcForAllStatement:
17827 if (upcforall.get_loop_body() == s)
17831 case V_SgWhileStmt:
17833 if (isSgWhileStmt(p)->get_body() == s)
17837 case V_SgDoWhileStmt:
17839 if (isSgDoWhileStmt(p)->get_body() == s)
17843 case V_SgSwitchStatement:
17845 if (isSgSwitchStatement(p)->get_body() == s)
17849 case V_SgCaseOptionStmt:
17851 if (isSgCaseOptionStmt(p)->get_body() == s)
17855 case V_SgDefaultOptionStmt:
17857 if (isSgDefaultOptionStmt(p)->get_body() == s)
17861 case V_SgCatchOptionStmt:
17863 if (isSgCatchOptionStmt(p)->get_body() == s)
17869 if (isSgIfStmt(p)->get_true_body() == s)
17871 else if (isSgIfStmt(p)->get_false_body() == s)
17877 if (isSgOmpBodyStatement(p))
17889 ROSE_ASSERT (singleStmt != NULL);
17890 ROSE_ASSERT (isSgBasicBlock(singleStmt) == NULL);
17902 case V_SgForStatement:
17904 if (isSgForStatement(p)->get_loop_body() == s)
17908 case V_SgUpcForAllStatement:
17912 if (upcforall.get_loop_body() == s)
17916 case V_SgWhileStmt:
17918 if (isSgWhileStmt(p)->get_body() == s)
17922 case V_SgDoWhileStmt:
17924 if (isSgDoWhileStmt(p)->get_body() == s)
17928 case V_SgSwitchStatement:
17930 if (isSgSwitchStatement(p)->get_body() == s)
17934 case V_SgCaseOptionStmt:
17936 if (isSgCaseOptionStmt(p)->get_body() == s)
17940 case V_SgDefaultOptionStmt:
17942 if (isSgDefaultOptionStmt(p)->get_body() == s)
17946 case V_SgCatchOptionStmt:
17948 if (isSgCatchOptionStmt(p)->get_body() == s)
17954 if (isSgIfStmt(p)->get_true_body() == s)
17956 else if (isSgIfStmt(p)->get_false_body() == s)
17962 if (isSgOmpBodyStatement(p))
17969 ROSE_ASSERT (rt != NULL);
17983 case V_SgBasicBlock:
return isSgBasicBlock(p);
17984 case V_SgForStatement:
17986 if (isSgForStatement(p)->get_loop_body() == s)
17988 else if (isSgForStatement(p)->get_test() == s)
17991 else if (isSgForStatement(p)->get_for_init_stmt() == s)
17997 case V_SgUpcForAllStatement:
18001 if (upcforall.get_loop_body() == s)
18004 ROSE_ASSERT( (s == upcforall.get_for_init_stmt())
18005 || (s == upcforall.get_test())
18009 case V_SgWhileStmt:
18011 if (isSgWhileStmt(p)->get_body() == s)
18013 else if (isSgWhileStmt(p)->get_condition() == s)
18019 case V_SgDoWhileStmt:
18021 if (isSgDoWhileStmt(p)->get_body() == s)
18023 else if (isSgDoWhileStmt(p)->get_condition() == s)
18029 case V_SgSwitchStatement:
18031 if (isSgSwitchStatement(p)->get_body() == s)
18033 else if (isSgSwitchStatement(p)->get_item_selector() == s)
18039 case V_SgCatchOptionStmt:
18041 if (isSgCatchOptionStmt(p)->get_body() == s)
18043 else if (isSgCatchOptionStmt(p)->get_condition() == s)
18051 if (isSgIfStmt(p)->get_true_body() == s)
18053 else if (isSgIfStmt(p)->get_false_body() == s)
18055 else if (isSgIfStmt(p)->get_conditional() == s)
18063 if (isSgOmpBodyStatement(p))
18078 void SageInterface::changeAllLoopBodiesToBlocks(
SgNode* top) {
18079 cerr<<
"Warning: SageInterface::changeAllLoopBodiesToBlocks() is being replaced by SageInterface::changeAllBodiesToBlocks()."<<endl;
18080 cerr<<
"Please use SageInterface::changeAllBodiesToBlocks() if you can."<<endl;
18088 bool allowEmptyBody;
18089 Visitor (
bool flag):allowEmptyBody(flag) {}
18090 virtual void visit(
SgNode* n) {
18095 case V_SgForStatement: {
18099 case V_SgWhileStmt: {
18103 case V_SgDoWhileStmt: {
18107 case V_SgSwitchStatement: {
18116 printf (
"In changeAllBodiesToBlocks(): case SgIfStmt: n->get_isModified() = %s \n",n->
get_isModified() ?
"true" :
"false");
18123 printf (
"In changeAllBodiesToBlocks(): AFTER RESET: case SgIfStmt: n->get_isModified() = %s \n",n->
get_isModified() ?
"true" :
"false");
18128 case V_SgCatchOptionStmt: {
18132 case V_SgUpcForAllStatement: {
18139 if (isSgOmpBodyStatement(n))
18146 if (wasPreviouslyModified ==
false)
18151 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());
18160 Visitor(createEmptyBody).traverse(top, postorder);
18181#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
18182 SgStatement* enclosingStatement = getStatementOfExpression(from);
18183 SgExprStatement* exprStatement = isSgExprStatement(enclosingStatement);
18185 SgForStatement* forStatement = isSgForStatement(enclosingStatement);
18186 SgReturnStmt* returnStatement = isSgReturnStmt(enclosingStatement);
18192 ROSE_ASSERT (exprStatement || forStatement || returnStatement || varDeclarationStatement);
18194 if (varDeclarationStatement)
18201 ROSE_ASSERT (root);
18204 if (forStatement && forStatement->get_increment() == root)
18215 forStatement->get_increment()->
set_parent(incrStmt);
18219 forStatement->set_increment(ne);
18226 assert (enclosingStmtParent);
18227 SgWhileStmt* whileStatement = isSgWhileStmt(enclosingStmtParent);
18228 SgDoWhileStmt* doWhileStatement = isSgDoWhileStmt(enclosingStmtParent);
18229 SgIfStmt* ifStatement = isSgIfStmt(enclosingStmtParent);
18231 SgForStatement* enclosingForStatement = isSgForStatement(enclosingStmtParent);
18232 if (enclosingForStatement && enclosingForStatement->get_test() == exprStatement)
18244 pushTestIntoBody(enclosingForStatement);
18247 else if (whileStatement && whileStatement->
get_condition() == exprStatement)
18260 pushTestIntoBody(whileStatement);
18264 else if (doWhileStatement && doWhileStatement->
get_condition() == exprStatement)
18280 myStatementInsert(doWhileStatement, new_statement,
false);
18282 SgName varname =
"rose__temp1";
18287 varname,
buildBoolType(), assignInitializer, new_statement);
18290 initname->set_scope(new_statement);
18322 else if (ifStatement && ifStatement->
get_conditional() == exprStatement)
18328 myStatementInsert(ifStatement, new_statement,
false);
18330 SgName varname =
"rose__temp2";
18339 initname->set_scope(new_statement);
18364 else if (switchStatement && switchStatement->
get_item_selector() == exprStatement)
18366 SgExpression* switchCond = exprStatement->get_expression();
18367 ROSE_ASSERT (switchCond);
18372 myStatementInsert(switchStatement, new_statement,
false);
18374 SgName varname =
"rose__temp3";
18421#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
18422 SgStatement* stmt = getStatementOfExpression(from);
18424 if (isSgExprStatement(stmt))
18438 if (isSgAssignOp(top) && isSgAssignOp(top)->get_rhs_operand() == from)
18456 convertInitializerIntoAssignment(init);
18459 SgExprStatement* new_stmt = isSgExprStatement(getStatementOfExpression(from));
18460 assert (new_stmt != NULL);
18461 replaceAssignmentStmtWithStatement(new_stmt, to);
18478 ROSE_ASSERT(func&&s);
18480 Rose_STL_Container <SgNode* > stmts = NodeQuery::querySubTree(func, V_SgReturnStmt);
18482 Rose_STL_Container<SgNode*>::iterator i;
18483 for (i=stmts.begin();i!=stmts.end();i++)
18486 ROSE_ASSERT(cur_stmt);
18489 bool needRewrite = (exp != NULL) && !(isSgValueExp(exp));
18500 if (stmts.size()==0 )
18505 cout<<
"In instrumentEndOfFunction(), found an empty function body.! "<<endl;
18517 return ((stmt->get_declarationModifier()).get_storageModifier()).isStatic();
18524 return ((stmt->get_declarationModifier()).get_storageModifier()).setStatic();
18530 return ((stmt->get_declarationModifier()).get_storageModifier()).isExtern();
18538 return ((stmt->get_declarationModifier()).get_storageModifier()).setExtern();
18545 return name->get_storageModifier().isMutable();
18558 std::vector<SgInitializedName*> in_params;
18570 std::vector<SgInitializedName*> out_params;
18580 case V_SgCharVal:
return (
long long)(isSgCharVal(expr)->get_value());
18581 case V_SgSignedCharVal:
return (
long long)(isSgSignedCharVal(expr)->get_value());
18582 case V_SgUnsignedCharVal:
return isSgUnsignedCharVal(expr)->get_value();
18583 case V_SgShortVal:
return (
long long)(isSgShortVal(expr)->get_value());
18584 case V_SgUnsignedShortVal:
return isSgUnsignedShortVal(expr)->get_value();
18585 case V_SgIntVal:
return (
long long)(isSgIntVal(expr)->get_value());
18586 case V_SgUnsignedIntVal:
return isSgUnsignedIntVal(expr)->get_value();
18587 case V_SgLongIntVal:
return (
long long)(isSgLongIntVal(expr)->get_value());
18588 case V_SgUnsignedLongVal:
return isSgUnsignedLongVal(expr)->get_value();
18589 case V_SgLongLongIntVal:
return isSgLongLongIntVal(expr)->get_value();
18590 case V_SgUnsignedLongLongIntVal:
return isSgUnsignedLongLongIntVal(expr)->get_value();
18591 case V_SgBoolValExp:
return (
long long )(isSgBoolValExp(expr)->get_value());
18597 printf (
"ERROR: In SageInterface::getIntegerConstantValue(): default reached: expr = %p = %s \n",expr,expr->
class_name().c_str());
18598 ROSE_ASSERT (
false);
18603 ROSE_ASSERT (!
"Bad kind return in getIntegerConstantValue");
18608#ifdef ROSE_ENABLE_BINARY_ANALYSIS
18617 ROSE_ASSERT(binary!=NULL);
18622 if (1==headers.size()) {
18623 requisite_header = headers[0];
18625 for (SgAsmGenericHeaderPtrList::const_iterator hi=headers.begin(); hi!=headers.end(); ++hi) {
18626 if (isSgAsmPEFileHeader(*hi)) {
18627 requisite_header = isSgAsmPEFileHeader(*hi);
18632 ROSE_ASSERT(requisite_header!=NULL);
18635 const SgAsmInterpretationPtrList &interps = binary->get_interpretations()->
get_interpretations();
18636 for (SgAsmInterpretationPtrList::const_iterator ii=interps.begin(); ii!=interps.end(); ++ii) {
18637 const SgAsmGenericHeaderPtrList &headers = (*ii)->get_headers()->get_headers();
18638 for (SgAsmGenericHeaderPtrList::const_iterator hi=headers.begin(); hi!=headers.end(); ++hi) {
18639 if ((*hi)==requisite_header)
18644 ROSE_ASSERT(!
"no appropriate interpretation");
18657 SgNode* copy = n->copy(*
this);
18661 if (fileInfo != NULL)
18670 } collectDependentDeclarationsCopyType;
18678 vector<PreprocessingInfo*> cppDirectiveList;
18680 void visit(
SgNode *astNode);
18688 if (locatedNode != NULL)
18692 if (comments != NULL)
18695 printf (
"Found attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
sage_class_name());
18697 AttachedPreprocessingInfoType::iterator i;
18698 for (i = comments->begin(); i != comments->end(); i++)
18700 ROSE_ASSERT ( (*i) != NULL );
18702 printf (
" Attached Comment (relativePosition=%s): %s\n",
18703 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
18704 (*i)->getString().c_str());
18705 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
18706 (*i)->get_file_info()->display(
"comment/directive location");
18714 cppDirectiveList.push_back(*i);
18716 printf (
" Attached include directive (relativePosition=%s): %s\n",
18717 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
18718 (*i)->getString().c_str());
18726 printf (
"No attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
sage_class_name());
18737vector<PreprocessingInfo*>
18744 return t.cppDirectiveList;
18748vector<PreprocessingInfo*>
18755 return t.cppDirectiveList;
18760outputPreprocessingInfoList (
const vector<PreprocessingInfo*> & l )
18764 vector<PreprocessingInfo*>::const_iterator i = l.begin();
18765 while ( i != l.end() )
18767 printf (
" Attached include directive (relativePosition=%s): %s\n",
18768 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
18769 (*i)->getString().c_str());
18784 case V_SgNamespaceDefinitionStatement:
18787 declaration = namespaceDefinition->get_namespaceDeclaration();
18791 case V_SgClassDefinition:
18792 case V_SgTemplateInstantiationDefn:
18801 printf (
"Error: default reached in getAssociatedDeclaration(): scope = %p = %s \n",scope,scope->
class_name().c_str());
18807 ROSE_ASSERT(declaration != NULL);
18809 return declaration;
18818 vector<SgDeclarationStatement*> declarationList;
18822 vector<SgSymbol*> symbolList;
18825 set<SgDeclarationStatement*> alreadySavedDeclarations;
18828 void visit(
SgNode *astNode);
18844 ROSE_ASSERT(scope != NULL);
18849 SgGlobal* globalScope = isSgGlobal(scope);
18850 if (globalScope == NULL)
18857 ROSE_ASSERT(parentScope != NULL);
18858 while (globalScope == NULL)
18860 associatedDeclaration = getAssociatedDeclaration(parentScope);
18861 ROSE_ASSERT(associatedDeclaration != NULL);
18863 parentScope = parentScope->
get_scope();
18864 globalScope = isSgGlobal(parentScope);
18870 return returnDeclaration;
18876outputDeclarationList (
const vector<SgDeclarationStatement*> & l )
18881 vector<SgDeclarationStatement*>::const_iterator i = l.begin();
18882 while ( i != l.end() )
18884 printf (
"In outputDeclarationList(): list[%d] = %p = %s = %s \n",counter++,*i,(*i)->class_name().c_str(),
SageInterface::get_name(*i).c_str());
18892 if (declaration != NULL)
18901 if (alreadySavedDeclarations.find(dependentDeclaration) == alreadySavedDeclarations.end())
18904 printf (
"In CollectDependentDeclarationsTraversal::visit(): selected dependentDeclaration = %p = %s = %s \n",
18908 declarationList.push_back(dependentDeclaration);
18911 alreadySavedDeclarations.insert(dependentDeclaration);
18913 printf (
"In CollectDependentDeclarationsTraversal::visit(): astNode = %p = %s = %s \n",astNode,astNode->
class_name().c_str(),
SageInterface::get_name(astNode).c_str());
18914 printf (
"############### ADDING dependentDeclaration = %p = %s to alreadySavedDeclarations set (size = %" PRIuPTR
") \n",
18915 dependentDeclaration,dependentDeclaration->
class_name().c_str(),alreadySavedDeclarations.size());
18923 printf (
"In CollectDependentDeclarationsTraversal::visit(): astNode = %p = %s = %s \n",astNode,astNode->
class_name().c_str(),
SageInterface::get_name(astNode).c_str());
18924 printf (
"############### EXISTING dependentDeclaration = %p = %s found in alreadySavedDeclarations set (size = %" PRIuPTR
") \n",
18925 dependentDeclaration,dependentDeclaration->
class_name().c_str(),alreadySavedDeclarations.size());
18932static std::vector<SgTypedefDeclaration*> collectTypedefDeclarations(
SgType* type)
18934 ROSE_ASSERT(type != NULL);
18935 std::vector<SgTypedefDeclaration*> result;
18936 SgType* currentType = type;
18946 modType = isSgModifierType(currentType);
18949 currentType = modType->get_base_type();
18953 refType = isSgReferenceType(currentType);
18956 currentType = refType->get_base_type();
18960 pointType = isSgPointerType(currentType);
18963 currentType = pointType->get_base_type();
18967 arrayType = isSgArrayType(currentType);
18970 currentType = arrayType->get_base_type();
18974 typedefType = isSgTypedefType(currentType);
18985 result.push_back(decl);
18999 if (result.size()>0)
19001 cout<<
"------------Found a chain of typedef decls: count="<<result.size()<<endl;
19002 for (vector <SgTypedefDeclaration*>::const_iterator iter = result.begin();
19003 iter!=result.end(); iter ++)
19030 if (fileInfo != NULL && fileInfo->isFrontendSpecific() ==
false && (isSgStatement(astNode) != NULL) )
19032 printf (
"\n\nIn CollectDependentDeclarationsTraversal::visit(): astNode = %p = %s = %s \n",astNode,astNode->
class_name().c_str(),
SageInterface::get_name(astNode).c_str());
19035 printf (
"alreadySavedDeclarations.size() = %" PRIuPTR
" \n",alreadySavedDeclarations.size());
19036 for (set<SgDeclarationStatement*>::iterator i = alreadySavedDeclarations.begin(); i != alreadySavedDeclarations.end(); i++)
19038 printf (
"alreadySavedDeclarations %d: %p = %s \n",counter++,*i,(*i)->class_name().c_str());
19049 if (initializedname != NULL)
19051 SgType* type = initializedname->get_type();
19054 std::vector <SgTypedefDeclaration*> typedefVec = collectTypedefDeclarations(type);
19055 for (std::vector <SgTypedefDeclaration*>::const_iterator iter =typedefVec.begin();
19056 iter != typedefVec.end(); iter++)
19059 addDeclaration(typedef_decl);
19083 SgNamedType* namedType = isSgNamedType(strippedType);
19084 if (namedType != NULL)
19092 if (classDeclaration != NULL)
19099 if (declaration != NULL)
19102 addDeclaration(declaration);
19105 addDeclaration (classDeclaration);
19116 ROSE_ASSERT(classSymbol != NULL);
19119 symbolList.push_back(classSymbol);
19124 if (enum_decl != NULL)
19127 ROSE_ASSERT(declaration != NULL);
19128 addDeclaration(declaration);
19133 ROSE_ASSERT(esymbol!= NULL);
19134 symbolList.push_back(esymbol);
19138 printf (
"Found reference to type = %p = %s strippedType = %p = %s \n",type,type->
class_name().c_str(),strippedType,strippedType->
class_name().c_str());
19145 if (functionCallExp != NULL)
19150 if (declaration != NULL)
19151 addDeclaration(declaration);
19158 if (functionSymbol)
19159 symbolList.push_back(functionSymbol);
19164 SgEnumVal * eval = isSgEnumVal(astNode);
19167 declaration = eval->get_declaration();
19168 ROSE_ASSERT(declaration != NULL);
19169 addDeclaration(declaration);
19171 ROSE_ASSERT(symbol != NULL);
19172 symbolList.push_back(symbol);
19177static std::map<const SgStatement*, bool> visitedDeclMap;
19189 printf (
"\n\n********************************************************** \n");
19190 printf (
" Inside of getDependentDeclarations(stmt = %p = %s) \n",stmt,stmt->
class_name().c_str());
19191 printf (
"********************************************************** \n");
19193 visitedDeclMap[stmt]=
true;
19197 declarationList = t.declarationList;
19198 symbolList = t.symbolList;
19201 copy(t.declarationList.begin(),t.declarationList.end(), back_inserter(declarationList));
19202 copy(t.symbolList.begin(),t.symbolList.end(), back_inserter(symbolList));
19204 sort (declarationList.begin(), declarationList.end());
19205 vector<SgDeclarationStatement*>::iterator new_end = unique(declarationList.begin(), declarationList.end());
19206 declarationList.erase(new_end, declarationList.end());
19208 sort (symbolList.begin(), symbolList.end());
19209 vector<SgSymbol*>::iterator end2 = unique(symbolList.begin(), symbolList.end());
19210 symbolList.erase(end2, symbolList.end());
19214 for (vector<SgDeclarationStatement*>::const_iterator iter = t.declarationList.begin();
19215 iter !=t.declarationList.end(); iter++)
19218 SgType* base_type = NULL;
19223 if (isSgClassDeclaration(decl))
19225 base_type = isSgClassDeclaration(decl)->get_type();
19227 if (isSgTypedefDeclaration(decl))
19231 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);
19239 if (isSgClassType(base_type))
19241 SgClassDeclaration* class_decl = isSgClassDeclaration(isSgClassType(base_type)->get_declaration()->get_definingDeclaration());
19242 if (class_decl!=NULL)
19244 body_stmt = class_decl->get_definition();
19248 if ((body_stmt!=NULL) &&(!visitedDeclMap[body_stmt]))
19260vector<SgDeclarationStatement*>
19263 vector<SgDeclarationStatement*> sortedNode;
19265 if (nodevec.size()==0 )
19268 if (nodevec.size() ==1)
19272 Rose_STL_Container<SgNode*> queryResult = NodeQuery::querySubTree(project,V_SgDeclarationStatement);
19273 for (Rose_STL_Container<SgNode*>::const_iterator iter = queryResult.begin();
19274 iter!= queryResult.end(); iter++)
19277 SgNode* cur_node = *iter;
19279 ROSE_ASSERT(cur_stmt!=NULL);
19291 ROSE_ASSERT (cur_stmt != func_decl);
19294 vector<SgDeclarationStatement*>::const_iterator i = find (nodevec.begin(), nodevec.end(), cur_stmt);
19295 if (i!=nodevec.end())
19299 vector<SgDeclarationStatement*>::const_iterator j = find (sortedNode.begin(), sortedNode.end(), *i);
19300 if (j == sortedNode.end())
19301 sortedNode.push_back(*i);
19305 if (nodevec.size() != sortedNode.size())
19307 cerr<<
"Fatal error in sortSgNodeListBasedOnAppearanceOrderInSource(): nodevec.size() != sortedNode.size()"<<endl;
19308 cerr<<
"nodevec() have "<< nodevec.size()<<
" elements. They are:"<<endl;
19309 for (vector<SgDeclarationStatement*>::const_iterator iter = nodevec.begin(); iter != nodevec.end(); iter++)
19311 cerr<<(*iter)<<
" "<<(*iter)->class_name() <<
" "<<(*iter)->unparseToString()<<endl;
19313 cerr<<
"sortedNode() have " << sortedNode.size() <<
" elements. They are:"<<endl;
19314 for (vector<SgDeclarationStatement*>::const_iterator iter = sortedNode.begin(); iter != sortedNode.end(); iter++)
19316 cerr<<(*iter)<<
" "<<(*iter)->class_name() <<
" "<<(*iter)->unparseToString()<<endl;
19319 ROSE_ASSERT(nodevec.size() == sortedNode.size());
19326std::vector<SgDeclarationStatement*>
19332 printf (
"\n\n********************************************************** \n");
19333 printf (
" Inside of getDependentDeclarations(stmt = %p = %s) \n",stmt,stmt->
class_name().c_str());
19334 printf (
"********************************************************** \n");
19339 return t.declarationList;
19342 visitedDeclMap.clear();
19343 vector<SgDeclarationStatement*> declarationList;
19344 vector<SgSymbol*> symbolList;
19348 printf (
"\n\n ********************************************************** \n");
19349 cout<<
"Found dependent decl: count="<<declarationList.size()<<endl;
19350 for ( vector<SgDeclarationStatement*>::const_iterator iter = declarationList.begin();
19351 iter != declarationList.end(); iter++)
19353 cout<<
"\t"<<(*iter)->class_name()<<
" at line "<<(*iter)->get_file_info()->get_line()<<endl;
19354 if ((*iter)->variantT()== V_SgFunctionDeclaration)
19355 cout<<
"func name is:"<<isSgFunctionDeclaration(*iter)->get_name().getString()<<endl;
19358 printf (
"\n ********************************************************** \n");
19361 return declarationList;
19370 bool returnValue =
false;
19373 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());
19376 if (functionName.is_null() ==
false)
19379 if ( functionName ==
"operator++" || functionName ==
"operator--" || functionName ==
"operator&" ||
19380 functionName ==
"operator!" || functionName ==
"operator*" || functionName ==
"operator+" ||
19381 functionName ==
"operator-" || functionName ==
"operator+" || functionName ==
"operator~")
19383 returnValue =
true;
19387 return returnValue;
19399 bool returnValue =
false;
19406 size_t numberOfOperands = 0;
19408 if (memberFunctionRefExp != NULL)
19410 ROSE_ASSERT(functionRefExp == NULL);
19412 if (memberFunctionDeclaration != NULL)
19414 functionName = memberFunctionDeclaration->get_name();
19415 numberOfOperands = memberFunctionDeclaration->get_args().size();
19421 if (functionRefExp != NULL)
19424 if (functionDeclaration != NULL)
19426 functionName = functionDeclaration->get_name();
19427 numberOfOperands = functionDeclaration->get_args().size();
19433 printf (
"In SageInterface::isPrefixOperator(): unknown case of exp = %p = %s \n",exp,exp->
class_name().c_str());
19438 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);
19443 if (memberFunctionRefExp != NULL)
19446 ROSE_ASSERT(functionRefExp == NULL);
19447 if (numberOfOperands == 0)
19450 returnValue =
true;
19455 returnValue =
false;
19461 ROSE_ASSERT(functionRefExp != NULL);
19462 ROSE_ASSERT(memberFunctionRefExp == NULL);
19463 if (numberOfOperands == 1)
19466 returnValue =
true;
19471 ROSE_ASSERT(numberOfOperands == 2);
19472 returnValue =
false;
19478 printf (
"Leaving SageInterface::isPrefixOperator(): returnValue = %s \n",returnValue ?
"true" :
"false");
19481 return returnValue;
19497 bool returnValue =
false;
19499 if (memberFunctionRefExp == NULL)
19503 if (memberFunctionDeclaration != NULL)
19505 SgName functionName = memberFunctionDeclaration->get_name();
19506 if ( (functionName ==
"operator[]") && (isSgType(memberFunctionDeclaration->get_type()) != NULL) )
19508 returnValue =
true;
19512 if ( (functionName ==
"operator()") && (isSgType(memberFunctionDeclaration->get_type()) != NULL) )
19514 returnValue =
true;
19518 returnValue =
false;
19523 return returnValue;
19534 ROSE_ASSERT(scope != NULL);
19537 printf (
"In SageInterface::lastStatementOfScopeWithTokenInfo(): scope = %p = %s \n",scope,scope->
class_name().c_str());
19540 SgIfStmt* ifStatement = isSgIfStmt(scope);
19541 if (ifStatement != NULL)
19544 if (lastStatement == NULL || (tokenStreamSequenceMap.find(lastStatement) == tokenStreamSequenceMap.end() || tokenStreamSequenceMap[lastStatement] == NULL))
19547 if (lastStatement == NULL || (tokenStreamSequenceMap.find(lastStatement) == tokenStreamSequenceMap.end() || tokenStreamSequenceMap[lastStatement] == NULL))
19549 lastStatement = NULL;
19553 printf (
"Note: SgIfStmt scope in SageInterface::lastStatementOfScopeWithTokenInfo(): returning lastStatement = %p \n",lastStatement);
19554 if (lastStatement != NULL)
19556 printf (
" --- lastStatement = %p = %s \n",lastStatement,lastStatement->
class_name().c_str());
19559 return lastStatement;
19563 if (statementList.rbegin() != statementList.rend())
19566 SgStatementPtrList::reverse_iterator i = statementList.rbegin();
19568 while (i != statementList.rend() && (tokenStreamSequenceMap.find(*i) == tokenStreamSequenceMap.end() || tokenStreamSequenceMap[*i] == NULL) )
19573 if (i == statementList.rend())
19575 lastStatement = NULL;
19579 lastStatement = *i;
19583 return lastStatement;
19597 void visit (
SgNode* node)
19607 printf (
"Found declaration = %p = %s name = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
19608 if (decl != definingDeclaration && decl != firstNondefiningDeclaration)
19610 otherDeclaration = decl;
19613 if (definingDeclaration != NULL)
19615 definingDeclaration->get_declarationModifier().get_accessModifier().display(
"definingDeclaration: accessModifier");
19618 if (firstNondefiningDeclaration != NULL)
19620 firstNondefiningDeclaration->get_declarationModifier().get_accessModifier().display(
"firstNondefiningDeclaration: accessModifier");
19623 if (otherDeclaration != NULL)
19625 otherDeclaration->get_declarationModifier().get_accessModifier().display(
"otherDeclaration: accessModifier");
19635 DeclarationTraversal traversal;
19636 traversal.traverse(astNode, preorder);
19648 void visit (
SgNode* node)
19654 if (functionDefinition != NULL)
19657 ROSE_ASSERT(functionDeclaration != NULL);
19659 string functionName = functionDeclaration->get_name();
19661 printf (
"functionName = %s \n",functionName.c_str());
19663 if (functionName ==
"main")
19667 ROSE_ASSERT(functionBody != NULL);
19669 ROSE_ASSERT(symbolTable != NULL);
19672 symbolTable->
print();
19677 if (namespaceDefinition != NULL)
19680 ROSE_ASSERT(namespaceDeclaration != NULL);
19682 string namespaceName = namespaceDeclaration->
get_name();
19684 printf (
"namespaceName = %s \n",namespaceName.c_str());
19686 if (namespaceName ==
"B")
19689 ROSE_ASSERT(symbolTable != NULL);
19692 symbolTable->
print();
19700 ScopeTraversal traversal;
19701 traversal.traverse(astNode, preorder);
19709 if (fileInfo != NULL)
19715 if (locatedNode != NULL)
19724 printf (
"In markNodeToBeUnparsed(): physical_file_id = %d \n",physical_file_id);
19727 locatedNode->
get_file_info()->set_physical_file_id(physical_file_id);
19729 printf (
"Note: calling node markTransformationsForOutput(): node = %p = %s \n",node,node->
class_name().c_str());
19733 markTransformationsForOutput(node);
19738 printf (
"Note: node is not a SgLocatedNode: node = %p = %s \n",node,node->
class_name().c_str());
19745 printf (
"Note: no Sg_File_Info was found: node = %p = %s \n",node,node->
class_name().c_str());
19750 if (locatedNode != NULL)
19759 printf (
"In SageInterface::markNodeToBeUnparsed(): locatedNode = %p = %s calling set_physical_file_id(%d) \n",locatedNode,locatedNode->
class_name().c_str(),physical_file_id);
19761 locatedNode->
get_file_info()->set_physical_file_id(physical_file_id);
19766 printf (
"Note: no Sg_File_Info was found: node = %p = %s \n",node,node->
class_name().c_str());
19799 class InheritedAttribute
19802 int physical_file_id;
19803 bool isCastSubtree;
19804 InheritedAttribute(
int file_id): physical_file_id(file_id), isCastSubtree(
false) {}
19805 InheritedAttribute(
const InheritedAttribute & X)
19807 isCastSubtree = X.isCastSubtree;
19808 physical_file_id = X.physical_file_id;
19819 InheritedAttribute evaluateInheritedAttribute (
SgNode* node, InheritedAttribute inheritedAttribute)
19821 InheritedAttribute returnAttribute(inheritedAttribute);
19823 SgCastExp* castExpression = isSgCastExp(node);
19824 if (castExpression != NULL)
19826 returnAttribute.isCastSubtree =
true;
19829 if (returnAttribute.isCastSubtree ==
true)
19833 printf (
"In markSubtreeToBeUnparsedTreeTraversal(): subtree of a SgCastExp: node = %p = %s physical_file_id = %d \n",
19834 node,node->
class_name().c_str(),inheritedAttribute.physical_file_id);
19840 printf (
"In markSubtreeToBeUnparsedTreeTraversal(): Calling markNodeToBeUnparsed(): node = %p = %s physical_file_id = %d \n",
19841 node,node->
class_name().c_str(),inheritedAttribute.physical_file_id);
19847 return returnAttribute;
19851 InheritedAttribute inheritedAttribute(physical_file_id);
19854 SubtreeTraversal traversal;
19857 printf (
"\nIn markSubtreeToBeUnparsedTreeTraversal(): calling traverse \n");
19860 traversal.traverse(root, inheritedAttribute);
19862 printf (
"This function does not compile with GNU 4.9 or older compilers (part of ROSE used only with more modern compilers) \n");
19871vector<SgDeclarationStatement*>
19872generateCopiesOfDependentDeclarations (
const vector<SgDeclarationStatement*>& dependentDeclarations,
SgScopeStatement* targetScope)
19883 printf (
"\n\n********************************************************** \n");
19884 printf (
" Inside of generateCopiesOfDependentDeclarations(stmt = %p = %s) \n",stmt,stmt->
class_name().c_str());
19885 printf (
"********************************************************** \n");
19888 vector<SgDeclarationStatement*> copiesOfDependentDeclarations;
19893 printf (
"Output the dependentDeclarations: dependentDeclarations.size() = %" PRIuPTR
" \n",dependentDeclarations.size());
19894 outputDeclarationList(dependentDeclarations);
19897 printf (
"************************************************ \n");
19898 printf (
"*** Make all copies of dependentDeclarations *** \n");
19899 printf (
"************************************************ \n");
19903 ROSE_ASSERT(targetScope != NULL);
19906 ROSE_ASSERT(isSgGlobal(targetScope) != NULL);
19908 for (vector<SgDeclarationStatement*>::const_iterator i = dependentDeclarations.begin(); i != dependentDeclarations.end(); i++)
19911 printf (
"Copying declaration = %p = %s = %s \n",*i,(*i)->class_name().c_str(),
SageInterface::get_name(*i).c_str());
19915 SgNode* copy_node = NULL;
19920 if (functionDeclaration != NULL)
19929 printf (
"WARNING: In SageInterface -- generateCopiesOfDependentDeclarations(): I think this is the wrong lookup symbol function that is being used here! \n");
19936 printf (
"In generateCopiesOfDependentDeclarations(): Copy mechanism appied to SgFunctionDeclaration functionDeclaration->get_firstNondefiningDeclaration() = %p \n",functionDeclaration->
get_firstNondefiningDeclaration());
19938 printf (
"functionDeclaration = %p \n",functionDeclaration);
19939 printf (
"functionDeclaration->get_definingDeclaration() = %p \n",functionDeclaration->
get_definingDeclaration());
19941 printf (
"functionDeclaration->get_scope() = %p \n",functionDeclaration->
get_scope());
19942 printf (
"targetScope = %p \n",targetScope);
19945 assert(copy_functionDeclaration != NULL);
19947 copy_functionDeclaration->
set_parent(targetScope);
19957 assert(copy_functionDeclaration->
get_scope() != NULL);
19958 assert(copy_functionDeclaration->
get_scope() == targetScope);
19959 assert(copy_functionDeclaration->
get_scope()->lookup_function_symbol(copy_functionDeclaration->get_name(),
19960 copy_functionDeclaration->get_type()) != NULL);
19961 assert(copy_functionDeclaration->
get_scope()->lookup_function_symbol(copy_functionDeclaration->get_name(),
19964 copy_node = copy_functionDeclaration;
19966 printf (
"In generateCopiesOfDependentDeclarations(): DONE: Copy mechanism appied to SgFunctionDeclaration \n");
19980 cout<<
"Copying a defining typedef declaration:"<<tdecl->
unparseToString()<<endl;
19982 cout<<
"Copying a non-defining typedef declaration:"<<tdecl->
unparseToString()<<endl;
19986 tdecl_copy->set_typedefBaseTypeContainsDefiningDeclaration (
false);
19989 copy_node = (*i)->copy(collectDependentDeclarationsCopyType);
19993 ROSE_ASSERT(copy_declaration != NULL);
19997 copy_declaration->
set_scope(targetScope);
20009 ROSE_ASSERT(copy_node != NULL);
20018 ROSE_ASSERT(copy_definingDeclaration != NULL);
20020 ROSE_ASSERT( *i != NULL );
20021 ROSE_ASSERT(copy_definingDeclaration != NULL);
20024 if (copy_definingDeclaration->
get_parent() == NULL)
20026 copy_definingDeclaration->
set_parent(targetScope);
20028 ROSE_ASSERT(copy_definingDeclaration->
get_parent() != NULL);
20031 printf (
"DONE: Copying declaration: original scope = %p copied to scope = %p \n",(*i)->get_scope(),copy_definingDeclaration->
get_scope());
20041 ROSE_ASSERT(copy_definingDeclaration->
get_parent() == NULL);
20048 printf (
"copy_definingDeclaration = %p \n",copy_definingDeclaration);
20049 printf (
"copy_definingDeclaration->get_firstNondefiningDeclaration() == NULL \n");
20050 printf (
"copy_definingDeclaration->get_definingDeclaration() = %p \n",copy_definingDeclaration->
get_definingDeclaration());
20055 if ((*i)->get_firstNondefiningDeclaration() != NULL)
20063 copiesOfDependentDeclarations.push_back(copy_definingDeclaration);
20067 printf (
"****************************************************** \n");
20068 printf (
"*** DONE: Make all copies of dependentDeclarations *** \n");
20069 printf (
"****************************************************** \n");
20070 printf (
"copiesOfDependentDeclarations.size() = %" PRIuPTR
" \n",copiesOfDependentDeclarations.size());
20076 ROSE_ASSERT(copiesOfDependentDeclarations.size() <= dependentDeclarations.size());
20078 return copiesOfDependentDeclarations;
20083declarationContainsDependentDeclarations(
SgDeclarationStatement* decl, vector<SgDeclarationStatement*> & dependentDeclarationList )
20086 bool returnValue =
false;
20089 printf (
"\n\n********************************************************** \n");
20090 printf (
" Inside of declarationContainsDependentDeclarations(decl = %p = %s) \n",decl,decl->
class_name().c_str());
20091 printf (
"********************************************************** \n");
20099 for (
size_t i = 0; i < locallyDependentDeclarationList.size(); i++)
20105 vector<SgDeclarationStatement*>::iterator j = find(dependentDeclarationList.begin(),dependentDeclarationList.end(),d);
20106 if (j != dependentDeclarationList.end())
20111 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());
20113 returnValue =
true;
20118 printf (
"**************************************************************************** \n");
20119 printf (
" LEAVING: Inside of declarationContainsDependentDeclarations(decl = %p = %s) returnValue = %s \n",decl,decl->
class_name().c_str(),returnValue ?
"true" :
"false");
20120 printf (
"**************************************************************************** \n");
20123 return returnValue;
20128 ROSE_ASSERT (new_exp != NULL);
20129 ROSE_ASSERT (anchor_exp != NULL);
20130 ROSE_ASSERT (new_exp != anchor_exp);
20133 ROSE_ASSERT (parent != NULL);
20137 ROSE_ASSERT (result != NULL);
20149 ROSE_ASSERT (new_exp != NULL);
20150 ROSE_ASSERT (anchor_exp != NULL);
20151 ROSE_ASSERT (new_exp != anchor_exp);
20154 ROSE_ASSERT (parent != NULL);
20158 ROSE_ASSERT (t != NULL);
20160 ROSE_ASSERT (enclosing_stmt != NULL);
20167 ROSE_ASSERT (temp_sym != NULL);
20169 *temp_decl = t_decl;
20174 * temp_ref = first_ref;
20187 string fileName =
"separate-outlined-file";
20207 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl = %p \n",decl);
20208 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_parent() = %p \n",decl->
get_parent());
20209 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_scope() = %p \n",decl->
get_scope());
20210 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): original_statement = %p \n",original_statement);
20211 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): file (decl) = %s \n",TransformationSupport::getSourceFile(decl)->getFileName().c_str());
20212 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_firstNondefiningDeclaration() = %p \n",decl->
get_firstNondefiningDeclaration());
20214 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): file (first non-defining) = %s \n",TransformationSupport::getSourceFile(decl->
get_firstNondefiningDeclaration())->
getFileName().c_str());
20215 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_definingDeclaration() = %p \n",decl->
get_definingDeclaration());
20217 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): file (first non-defining) = %s \n",TransformationSupport::getSourceFile(decl->
get_definingDeclaration())->
getFileName().c_str());
20220#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
20252 vector<SgDeclarationStatement*> dependentDeclarationList_inOriginalFile;
20259 vector<SgDeclarationStatement*> dependentDeclarationList = generateCopiesOfDependentDeclarations(dependentDeclarationList_inOriginalFile,scope);
20260 ROSE_ASSERT(dependentDeclarationList.size() <= dependentDeclarationList_inOriginalFile.size());
20270 std::map<SgNode*, SgNode*> replacementMap;
20275 SgCopyHelp::copiedNodeMapType copyNodeMap = collectDependentDeclarationsCopyType.get_copiedNodeMap();
20276 SgCopyHelp::copiedNodeMapType::iterator copyNodeMapItrator = copyNodeMap.begin();
20277 while (copyNodeMapItrator != copyNodeMap.end())
20282 SgNode* first =
const_cast<SgNode*
>(copyNodeMapItrator->first);
20283 SgNode* second = copyNodeMapItrator->second;
20285 printf (
"copyNodeMapItrator.first = %p = %s second = %p = %s \n",first,first->
class_name().c_str(),second,second->
class_name().c_str());
20288 if (isSgSymbol(first) != NULL)
20293 replacementMap.insert(pair<SgNode*,SgNode*>(first,second));
20296 copyNodeMapItrator++;
20300 printf (
"Exiting after test of new functionality \n");
20306 SgSourceFile* sourceFile = TransformationSupport::getSourceFile(original_statement);
20307 vector<PreprocessingInfo*> requiredDirectivesList = collectCppDirectives(sourceFile);
20310 ROSE_ASSERT(outlinedFunctionDeclaration != NULL);
20311 SgGlobal* originalFileGlobalScope = TransformationSupport::getGlobalScope(original_statement);
20312 ROSE_ASSERT(originalFileGlobalScope != NULL);
20314 printf (
"WARNING: In SageInterface::appendStatementWithDependentDeclaration(): I think this is the wrong lookup symbol function that is being used here! \n");
20318 SgFunctionSymbol* outlinedFunctionSymbolFromOriginalFile = isSgFunctionSymbol(originalFileGlobalScope->lookup_symbol(outlinedFunctionDeclaration->get_name(),NULL,NULL));
20324 printf (
"outlinedFunctionSymbolFromOriginalFile = %p outlinedFunctionSymbolFromOutlinedFile = %p \n",outlinedFunctionSymbolFromOriginalFile,outlinedFunctionSymbolFromOutlinedFile);
20326 printf (
"TransformationSupport::getSourceFile(decl)->getFileName() = %s \n",TransformationSupport::getSourceFile(decl)->getFileName().c_str());
20327 printf (
"TransformationSupport::getSourceFile(decl->get_firstNondefiningDeclaration())->getFileName() = %s \n",TransformationSupport::getSourceFile(decl->
get_firstNondefiningDeclaration())->
getFileName().c_str());
20328 printf (
"TransformationSupport::getSourceFile(original_statement)->getFileName() = %s \n",TransformationSupport::getSourceFile(original_statement)->getFileName().c_str());
20331 ROSE_ASSERT(outlinedFunctionSymbolFromOriginalFile != NULL);
20332 ROSE_ASSERT(outlinedFunctionSymbolFromOutlinedFile != NULL);
20335 ROSE_ASSERT(outlinedFunctionSymbolFromOriginalFile == outlinedFunctionSymbolFromOutlinedFile);
20338 replacementMap.insert(pair<SgNode*,SgNode*>(originalFileGlobalScope,scope));
20341 SgFunctionDeclaration* outlinedNondefiningFunctionDeclarationFromOriginalFile = isSgFunctionDeclaration(outlinedFunctionSymbolFromOriginalFile->get_declaration());
20343 ROSE_ASSERT(outlinedNondefiningFunctionDeclarationFromOriginalFile != NULL);
20344 ROSE_ASSERT(outlinedNondefiningFunctionDeclarationFromOutlinedFile != NULL);
20345 replacementMap.insert(pair<SgNode*,SgNode*>(outlinedNondefiningFunctionDeclarationFromOriginalFile,outlinedNondefiningFunctionDeclarationFromOutlinedFile));
20354 for (
size_t i = 0; i < dependentDeclarationList.size(); i++)
20360 printf (
"originalDeclaration = %p \n",originalDeclaration);
20362 d->
get_file_info()->display(
"SageInterface::appendStatementWithDependentDeclaration()");
20370 ROSE_ASSERT(decl->
get_scope() == scope);
20376 printf (
"Add the required symbol information to the symbol table: scope = %p = %s \n",scope,scope->
class_name().c_str());
20383 case V_SgClassDeclaration:
20385 if ( declarationContainsDependentDeclarations(d,dependentDeclarationList) ==
true )
20386 printf (
"Warning: This class contains dependent declarations (not implemented) \n");
20390 case V_SgMemberFunctionDeclaration:
20391 printf (
"Sorry, support for dependent member function declarations not implemented! \n");
20394 case V_SgTemplateInstantiationDecl:
20395 printf (
"Sorry, not implemented: case SgTemplateInstantiationDecl not handled as dependent declaration \n");
20396 d->
get_file_info()->display(
"Sorry, not implemented: case SgTemplateInstantiationDecl not handled as dependent declaration");
20398 printf (
"Case of SgTemplateInstantiationDecl not implemented. \n");
20401 case V_SgNamespaceDeclarationStatement:
20402 if (declarationContainsDependentDeclarations(d,dependentDeclarationList) ==
true )
20403 printf (
"Warning: This namespace contains dependent declarations (not supported) \n");
20406 case V_SgFunctionDeclaration:
20407 case V_SgTypedefDeclaration:
20408 case V_SgEnumDeclaration:
20412 printf (
"default case in SageInterface::appendStatementWithDependentDeclaration() (handling dependentDeclarationList) d = %p = %s \n",d,d->
class_name().c_str());
20418 vector<PreprocessingInfo*> cppDirectivesAlreadyAttachedToDependentDeclarations = collectCppDirectives(d);
20421 printf (
"directives BEFORE excluding those already present in dependent declarations \n");
20422 outputPreprocessingInfoList(requiredDirectivesList);
20424 printf (
"directives already attached to dependent declarations \n");
20425 outputPreprocessingInfoList(cppDirectivesAlreadyAttachedToDependentDeclarations);
20429 vector<PreprocessingInfo*>::iterator j = cppDirectivesAlreadyAttachedToDependentDeclarations.begin();
20430 while ( j != cppDirectivesAlreadyAttachedToDependentDeclarations.end() )
20433 vector<PreprocessingInfo*>::iterator entry = find(requiredDirectivesList.begin(),requiredDirectivesList.end(),*j);
20434 ROSE_ASSERT(entry != requiredDirectivesList.end());
20436 requiredDirectivesList.erase(entry);
20442 printf (
"directives AFTER excluding those already present in dependent declarations \n");
20443 outputPreprocessingInfoList(requiredDirectivesList);
20452 if (dependentDeclarationList.empty() ==
true)
20454 firstStatmentInFile = decl;
20458 firstStatmentInFile = dependentDeclarationList[0];
20461 ROSE_ASSERT(firstStatmentInFile != NULL);
20469 if (excludeHeaderFiles ==
false)
20472 vector<PreprocessingInfo*>::reverse_iterator j = requiredDirectivesList.rbegin();
20473 while ( j != requiredDirectivesList.rend() )
20492 SgSourceFile* outlinedFile = TransformationSupport::getSourceFile(scope);
20493 ROSE_ASSERT(outlinedFile != NULL);
20499 printf (
"\n\n************************************************************\n");
20500 printf (
"Calling Utils::edgePointerReplacement() \n");
20506 printf (
"Calling Utils::edgePointerReplacement(): DONE \n");
20507 printf (
"************************************************************\n\n");
20509 printf (
"\n\n After replacementMapTraversal(): intermediateDeleteSet: \n");
20510 displaySet(intermediateDeleteSet,
"After Utils::edgePointerReplacement");
20514 ROSE_ASSERT(dependentDeclarationList.size() <= dependentDeclarationList_inOriginalFile.size());
20522 printf (
"replacementMap.size() = %" PRIuPTR
" dependentDeclarationList.size() = %" PRIuPTR
" \n",replacementMap.size(),dependentDeclarationList.size());
20538 int SgVariableSymbol_count;
20539 int SgFunctionSymbol_count;
20540 int SgClassDeclaration_count;
20541 int SgTypedefSymbol_count;
20542 int SgMemFuncSymbol_count;
20543 int SgTemplateSymbol_count;
20544 int SgEnumFieldSymbol_count;
20562 SgVariableSymbol_count = 0;
20563 SgVariableSymbolPtr = symbol;
20564 SgFunctionSymbolPtr =NULL;
20565 SgClassSymbolPtr =NULL;
20566 SgTypedefPtr = NULL;
20567 SgMemFuncSymbolPtr =NULL;
20568 class_defining = NULL;
20570 typedef_defining =NULL;
20571 function_decl = NULL;
20572 SgTemplateSymbolPtr = NULL;
20573 template_defining = NULL;
20574 SgEnumFieldSymbolPtr = NULL;
20575 templateInstantiate_defining =NULL;
20579 SgFunctionSymbol_count = 0;
20580 SgFunctionSymbolPtr = symbol;
20583 SgMemFuncSymbol_count =0;
20585 SgVariableSymbolPtr = NULL;
20586 SgClassSymbolPtr =NULL;
20587 SgTypedefPtr = NULL;
20588 SgMemFuncSymbolPtr =NULL;
20589 class_defining = NULL;
20591 typedef_defining =NULL;
20592 function_decl = NULL;
20593 SgTemplateSymbolPtr = NULL;
20594 template_defining = NULL;
20595 SgEnumFieldSymbolPtr = NULL;
20596 templateInstantiate_defining =NULL;
20600 SgClassDeclaration_count = 0;
20601 SgClassSymbolPtr = symbol;
20602 SgFunctionSymbolPtr = NULL;
20603 SgVariableSymbolPtr = NULL;
20604 SgTypedefPtr = NULL;
20605 SgMemFuncSymbolPtr =NULL;
20606 class_defining = NULL;
20608 typedef_defining =NULL;
20609 function_decl = NULL;
20610 SgTemplateSymbolPtr = NULL;
20611 template_defining = NULL;
20612 SgEnumFieldSymbolPtr = NULL;
20613 templateInstantiate_defining =NULL;
20617 SgTypedefSymbol_count =0;
20618 SgTypedefPtr = symbol;
20619 SgClassSymbolPtr = NULL;
20620 SgFunctionSymbolPtr = NULL;
20621 SgVariableSymbolPtr = NULL;
20622 SgMemFuncSymbolPtr =NULL;
20623 class_defining = NULL;
20625 typedef_defining =NULL;
20626 function_decl = NULL;
20627 SgTemplateSymbolPtr = NULL;
20628 template_defining = NULL;
20629 SgEnumFieldSymbolPtr = NULL;
20630 templateInstantiate_defining =NULL;
20634 SgMemFuncSymbolPtr = symbol;
20635 SgMemFuncSymbol_count =0;
20636 SgTypedefPtr = NULL;
20637 SgClassSymbolPtr = NULL;
20638 SgFunctionSymbolPtr = NULL;
20639 SgVariableSymbolPtr = NULL;
20640 class_defining = NULL;
20642 typedef_defining =NULL;
20643 function_decl = NULL;
20644 SgTemplateSymbolPtr = NULL;
20645 template_defining = NULL;
20646 SgEnumFieldSymbolPtr = NULL;
20647 templateInstantiate_defining =NULL;
20651 SgTemplateSymbolPtr = symbol;
20652 SgTemplateSymbol_count =0;
20653 SgMemFuncSymbolPtr = NULL;
20654 SgTypedefPtr = NULL;
20655 SgClassSymbolPtr = NULL;
20656 SgFunctionSymbolPtr = NULL;
20657 SgVariableSymbolPtr = NULL;
20658 class_defining = NULL;
20660 typedef_defining =NULL;
20661 function_decl = NULL;
20662 template_defining = NULL;
20663 SgEnumFieldSymbolPtr = NULL;
20664 templateInstantiate_defining =NULL;
20668 SgEnumFieldSymbolPtr = symbol;
20669 SgEnumFieldSymbol_count =0;
20670 SgTemplateSymbolPtr = NULL;
20671 SgMemFuncSymbolPtr = NULL;
20672 SgTypedefPtr = NULL;
20673 SgClassSymbolPtr = NULL;
20674 SgFunctionSymbolPtr = NULL;
20675 SgVariableSymbolPtr = NULL;
20676 class_defining = NULL;
20678 typedef_defining =NULL;
20679 function_decl = NULL;
20680 template_defining = NULL;
20681 templateInstantiate_defining =NULL;
20686 class_defining = node;
20687 SgMemFuncSymbolPtr = NULL;
20688 SgTypedefPtr = NULL;
20689 SgClassSymbolPtr = NULL;
20690 SgFunctionSymbolPtr = NULL;
20691 SgVariableSymbolPtr = NULL;
20693 typedef_defining =NULL;
20694 function_decl = NULL;
20695 SgTemplateSymbolPtr = NULL;
20696 template_defining = NULL;
20697 SgEnumFieldSymbolPtr = NULL;
20698 templateInstantiate_defining =NULL;
20702 template_defining = node;
20703 class_defining = NULL;
20704 SgMemFuncSymbolPtr = NULL;
20705 SgTypedefPtr = NULL;
20706 SgClassSymbolPtr = NULL;
20707 SgFunctionSymbolPtr = NULL;
20708 SgVariableSymbolPtr = NULL;
20710 typedef_defining =NULL;
20711 function_decl = NULL;
20712 SgTemplateSymbolPtr = NULL;
20713 SgEnumFieldSymbolPtr = NULL;
20714 templateInstantiate_defining =NULL;
20717 function_decl =node;
20718 class_defining = NULL;
20719 SgMemFuncSymbolPtr = NULL;
20720 SgTypedefPtr = NULL;
20721 SgClassSymbolPtr = NULL;
20722 SgFunctionSymbolPtr = NULL;
20723 SgVariableSymbolPtr = NULL;
20725 typedef_defining =NULL;
20726 SgTemplateSymbolPtr = NULL;
20727 template_defining = NULL;
20728 SgEnumFieldSymbolPtr = NULL;
20729 templateInstantiate_defining =NULL;
20734 function_decl =NULL;
20735 class_defining = NULL;
20736 SgMemFuncSymbolPtr = NULL;
20737 SgTypedefPtr = NULL;
20738 SgClassSymbolPtr = NULL;
20739 SgFunctionSymbolPtr = NULL;
20740 SgVariableSymbolPtr = NULL;
20741 typedef_defining =NULL;
20742 SgTemplateSymbolPtr = NULL;
20743 template_defining = NULL;
20744 SgEnumFieldSymbolPtr = NULL;
20745 templateInstantiate_defining =NULL;
20749 typedef_defining = node;
20751 function_decl =NULL;
20752 class_defining = NULL;
20753 SgMemFuncSymbolPtr = NULL;
20754 SgTypedefPtr = NULL;
20755 SgClassSymbolPtr = NULL;
20756 SgFunctionSymbolPtr = NULL;
20757 SgVariableSymbolPtr = NULL;
20758 SgTemplateSymbolPtr = NULL;
20759 template_defining = NULL;
20760 SgEnumFieldSymbolPtr = NULL;
20761 templateInstantiate_defining =NULL;
20765 templateInstantiate_defining =node;
20766 typedef_defining = NULL;
20768 function_decl =NULL;
20769 class_defining = NULL;
20770 SgMemFuncSymbolPtr = NULL;
20771 SgTypedefPtr = NULL;
20772 SgClassSymbolPtr = NULL;
20773 SgFunctionSymbolPtr = NULL;
20774 SgVariableSymbolPtr = NULL;
20775 SgTemplateSymbolPtr = NULL;
20776 template_defining = NULL;
20777 SgEnumFieldSymbolPtr = NULL;
20784 if(SgVariableSymbolPtr !=NULL)
20786 if(node->get_scope()!=NULL)
20792 if (isSgVariableSymbol(s) == SgVariableSymbolPtr) SgVariableSymbol_count++;
20797 if(SgEnumFieldSymbolPtr !=NULL)
20799 if(node->get_scope()!=NULL)
20805 if (isSgEnumFieldSymbol(s) == SgEnumFieldSymbolPtr) SgEnumFieldSymbol_count++;
20813 if(SgVariableSymbolPtr !=NULL){
20815 if (s == SgVariableSymbolPtr) SgVariableSymbol_count++;
20819 int get_num_variable_pointers(){
return SgVariableSymbol_count;}
20821 int get_num_EnumField_pointers(){
return SgEnumFieldSymbol_count;}
20826 if(SgFunctionSymbolPtr !=NULL){
20832 if ((
SgFunctionSymbol *)s == SgFunctionSymbolPtr) SgFunctionSymbol_count++;
20837 if(function_decl!=NULL){
20841 if(node!=function_decl && (define==function_decl || first_nondefine==function_decl))
delete node;
20850 printf (
"In visit(SgFunctionRefExp* node): SgFunctionSymbolPtr = %p \n",SgFunctionSymbolPtr);
20852 if (SgFunctionSymbolPtr !=NULL)
20855 if (isSgFunctionSymbol(s) == SgFunctionSymbolPtr)
20857 SgFunctionSymbol_count++;
20859 printf (
"Increment SgFunctionSymbol_count = %d \n",SgFunctionSymbol_count);
20869 printf (
"In visit(SgMemberFunctionRefExp* node): SgFunctionSymbolPtr = %p \n",SgFunctionSymbolPtr);
20871 if (SgFunctionSymbolPtr !=NULL)
20874 if (isSgFunctionSymbol(s) == SgFunctionSymbolPtr)
20876 SgFunctionSymbol_count++;
20878 printf (
"Increment SgFunctionSymbol_count = %d \n",SgFunctionSymbol_count);
20886 if (SgFunctionSymbolPtr !=NULL){
20888 if (isSgFunctionSymbol(s) == SgFunctionSymbolPtr) SgFunctionSymbol_count++;
20892 int get_num_Function_pointers(){
return SgFunctionSymbol_count;}
20897 if(SgClassSymbolPtr !=NULL){
20902 if (isSgClassSymbol(s) == SgClassSymbolPtr) SgClassDeclaration_count++;
20907 if(class_defining!=NULL) {
20911 if((class_decl==class_defining||class_decl1==class_defining) && node!=class_defining )
20919 if(SgClassSymbolPtr !=NULL){
20924 if (isSgClassSymbol(s) == SgClassSymbolPtr) SgClassDeclaration_count++;
20929 if(templateInstantiate_defining!=NULL) {
20936 if((template_decl==templateInstantiate_defining||template_decl1==templateInstantiate_defining) && node!=templateInstantiate_defining){
20956 if (SgClassSymbolPtr !=NULL){
20957 SgSymbol* s = node->get_class_symbol();
20958 if (s == SgClassSymbolPtr) SgClassDeclaration_count++;
20964 if (SgClassSymbolPtr !=NULL){
20966 if (isSgClassSymbol(s) == SgClassSymbolPtr) SgClassDeclaration_count++;
20971 int get_num_Class_pointers(){
return SgClassDeclaration_count;}
20977 if(memFunc !=NULL){
20979 if(func == memFunc){
20988 if (SgMemFuncSymbolPtr !=NULL){
20993 if(symbol == SgMemFuncSymbolPtr){
20994 SgMemFuncSymbol_count++;
21003 if (SgMemFuncSymbolPtr !=NULL){
21008 if(symbol == SgMemFuncSymbolPtr){
21009 SgMemFuncSymbol_count++;
21018 int get_num_memFunc_pointers(){
return SgMemFuncSymbol_count;}
21024 if(SgTypedefPtr!=NULL){
21033 if(typedef_defining!=NULL){
21035 if(typedef_define == typedef_defining && node != typedef_defining ) {
21041 int get_num_Typedef_pointers(){
return SgTypedefSymbol_count;}
21047 if (SgTemplateSymbolPtr !=NULL){
21052 if(symbol == SgTemplateSymbolPtr){
21053 SgTemplateSymbol_count++;
21059 if(template_defining !=NULL) {
21066 if((template_decl==template_defining||template_decl1==template_defining) && node!=template_defining) {
21076 int get_num_Template_pointers(){
return SgTemplateSymbol_count;}
21086 void visit (
SgNode* node)
21093 printf (
"In DeleteAST::visit(): node = %p = %s \n",node,node->
class_name().c_str());
21098 if (isSgScopeStatement(node) !=NULL)
21102 printf (
"Deleting the scopes type table: scope->get_type_table() = %p \n",scope->get_type_table());
21104 delete scope->get_type_table();
21110 if (isSgTypeTable(node) !=NULL)
21114 printf (
"Deleting the type table (SgSymbolTable): typeTable->get_type_table() = %p \n",typeTable->get_type_table());
21116 delete typeTable->get_type_table();
21119 if(isSgInitializedName(node) !=NULL){
21123 if(isSgVariableDefinition(var_def) !=NULL){
21130 if(isSgInitializedName(node)->get_scope()!=NULL){
21134 if(isSgVariableSymbol(symbol) !=NULL){
21136 traverseMemoryPoolVisitorPattern(visitor);
21137 if(visitor.get_num_variable_pointers()==1){
21144 if(isSgEnumFieldSymbol(symbol) !=NULL){
21146 traverseMemoryPoolVisitorPattern(visitor);
21147 if(visitor.get_num_EnumField_pointers()==1){
21158 if(isSgVarRefExp(node) !=NULL){
21160 ClassicVisitor visitor(symbol);
21161 traverseMemoryPoolVisitorPattern(visitor);
21162 if(visitor.get_num_variable_pointers()==1){
21174 SgFunctionDeclaration* funcDecl = isSgFunctionDeclaration(node);
21175 if (funcDecl != NULL){
21176 if (isSgMemberFunctionDeclaration(node) == NULL) {
21177 if (funcDecl->get_scope() != NULL) {
21178 if (funcDecl->get_scope()->get_symbol_table() != NULL) {
21179 SgSymbol* symbol = ((SgFunctionDeclaration*)node)->get_symbol_from_symbol_table();
21180 ClassicVisitor visitor((SgFunctionSymbol *)symbol);
21181 traverseMemoryPoolVisitorPattern(visitor);
21182 if (visitor.get_num_Function_pointers()==1) { //only one reference to this FunctionSymbol => safe to delete
21183 ((SgFunctionDeclaration*)node)->get_scope()->get_symbol_table()->remove(symbol);
21185 //printf("A SgFunctionSymbol was deleted\n");
21187 ClassicVisitor visitor1((SgFunctionDeclaration *)node);
21188 traverseMemoryPoolVisitorPattern(visitor1);
21195 if(isSgFunctionRefExp(node) !=NULL)
21198 SgFunctionRefExp* functionRefExp = isSgFunctionRefExp(node);
21199 ROSE_ASSERT(functionRefExp->get_symbol_i() != NULL);
21200 printf ("In DeleteAST::visit(): functionRefExp->get_symbol_i() = %p = %s \n",functionRefExp->get_symbol_i(),functionRefExp->get_symbol_i()->class_name().c_str());
21202 SgFunctionSymbol *symbol = ((SgFunctionRefExp*)node)->get_symbol_i();
21203 ClassicVisitor visitor(symbol);
21204 traverseMemoryPoolVisitorPattern(visitor);
21205 if(visitor.get_num_Function_pointers()==1)
21207 // only one reference to this FunctionSymbol => safe to delete
21208 //((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21210 //printf("A SgFunctionSymbol was deleted\n");
21215 if(isSgUserDefinedBinaryOp(node) !=NULL){
21216 SgFunctionSymbol *symbol = ((SgUserDefinedBinaryOp*)node)->get_symbol();
21217 ClassicVisitor visitor(symbol);
21218 traverseMemoryPoolVisitorPattern(visitor);
21219 if(visitor.get_num_Function_pointers()==1){ //only one reference to this FunctionSymbol => safe to delete
21220 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21222 //printf("A SgFunctionSymbol was deleted\n");
21230 if(isSgTypedefDeclaration(node) !=NULL){
21235 if(isSgTypedefSymbol(symbol)){
21237 traverseMemoryPoolVisitorPattern(visitor);
21238 if(visitor.get_num_Typedef_pointers()==1){
21249 traverseMemoryPoolVisitorPattern(visitor1);
21257 if(isSgNamespaceDeclarationStatement(node) !=NULL){
21258 if(((SgNamespaceDeclarationStatement*)node)->get_scope()!=NULL){
21259 if(((SgNamespaceDeclarationStatement*)node)->get_scope()->get_symbol_table()!=NULL)
21261 SgSymbol* symbol = ((SgNamespaceDeclarationStatement*)node)->get_symbol_from_symbol_table();
21262 if(isSgNamespaceSymbol(symbol)){
21263 ((SgNamespaceDeclarationStatement*)node)->get_scope()->get_symbol_table()->remove(symbol);
21265 //printf("A SgNamespaceSymbol was deleted\n");
21272 if(isSgNamespaceAliasDeclarationStatement(node) !=NULL){
21273 if(((SgNamespaceAliasDeclarationStatement*)node)->get_scope()!=NULL){
21274 if(((SgNamespaceAliasDeclarationStatement*)node)->get_scope()->get_symbol_table()!=NULL)
21276 SgSymbol* symbol = ((SgNamespaceAliasDeclarationStatement*)node)->get_symbol_from_symbol_table();
21277 if(isSgNamespaceSymbol(symbol)){
21278 ((SgNamespaceAliasDeclarationStatement*)node)->get_scope()->get_symbol_table()->remove(symbol);
21280 //printf("A SgNamespaceSymbol was deleted\n");
21291 if(isSgLabelStatement(node) !=NULL){
21296 if(isSgLabelSymbol(symbol)){
21305 if(isSgLabelRefExp(node) !=NULL){
21317 if(isSgEnumDeclaration(node) !=NULL){
21318 if(((SgEnumDeclaration*)node)->get_scope()!=NULL){
21319 if(((SgEnumDeclaration*)node)->get_scope()->get_symbol_table()!=NULL)
21321 SgSymbol* symbol = ((SgEnumDeclaration*)node)->get_symbol_from_symbol_table();
21322 if(isSgEnumSymbol(symbol) !=NULL){
21323 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21325 //printf("A SgEnumSymbol was deleted\n");
21329 SgEnumType* type= ((SgEnumDeclaration*)node)->get_type();
21332 //printf("A SgEnumType was deleted\n");
21341 if(isSgClassDeclaration(node) !=NULL && isSgTemplateInstantiationDecl(node) ==NULL){
21346 if(isSgClassSymbol(symbol) !=NULL){
21348 traverseMemoryPoolVisitorPattern(visitor);
21349 if(visitor.get_num_Class_pointers()==1){
21359 traverseMemoryPoolVisitorPattern(visitor);
21368 if(isSgThisExp(node) !=NULL){
21371 traverseMemoryPoolVisitorPattern(visitor);
21372 if(visitor.get_num_Class_pointers()==1){
21373 ((
SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21380 if(isSgClassNameRefExp(node) !=NULL){
21382 if(isSgClassSymbol(symbol) !=NULL)
21385 traverseMemoryPoolVisitorPattern(visitor);
21386 if(visitor.get_num_Class_pointers()==1){
21387 ((
SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21399 if(isSgMemberFunctionDeclaration(node) !=NULL){
21400 if(((SgMemberFunctionDeclaration*)node)->get_scope()!=NULL){
21401 if(((SgMemberFunctionDeclaration*)node)->get_scope()->get_symbol_table()!=NULL)
21403 SgSymbol* symbol = ((SgMemberFunctionDeclaration*)node)->get_symbol_from_symbol_table();
21404 if(isSgMemberFunctionSymbol(symbol)){
21405 ClassicVisitor visitor((SgMemberFunctionSymbol*)symbol);
21406 traverseMemoryPoolVisitorPattern(visitor);
21407 if(visitor.get_num_memFunc_pointers()==1){
21408 ((SgMemberFunctionDeclaration*)node)->get_scope()->get_symbol_table()->remove(symbol);
21410 //printf("A SgMemberFunctionSymbol was deleted\n");
21415 ClassicVisitor visitor((SgMemberFunctionDeclaration*) node);
21416 traverseMemoryPoolVisitorPattern(visitor);
21419//Tan: I have no idea why the codes below cannot work. Perhaps it conflicts with some prior works
21421 if(isSgMemberFunctionRefExp(node) !=NULL){
21422 SgMemberFunctionSymbol* symbol = ((SgMemberFunctionRefExp*)node)->get_symbol_i();
21423 ClassicVisitor visitor(symbol);
21424 traverseMemoryPoolVisitorPattern(visitor);
21425 if(visitor.get_num_memFunc_pointers()==1){ //only one reference to this symbol => safe to delete
21426 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21428 //printf("A SgClassSymbol was deleted\n");
21433 if(isSgFunctionType(node) !=NULL){
21434 SgSymbol* symbol = ((SgFunctionType*)node)->get_symbol_from_symbol_table();
21435 if(isSgFunctionTypeSymbol(symbol)){
21436 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21438 //printf("A SgFunctionTypeSymbol was deleted\n");
21447 if(isSgInterfaceStatement(node) !=NULL){
21452 if(isSgInterfaceSymbol(symbol)){
21463 if(isSgModuleStatement(node) !=NULL){
21468 if(isSgModuleSymbol(symbol)){
21481 if(isSgTemplateInstantiationMemberFunctionDecl(node) !=NULL){
21486 if(isSgMemberFunctionSymbol(symbol)){
21488 traverseMemoryPoolVisitorPattern(visitor);
21489 if(visitor.get_num_memFunc_pointers()==1){
21498 traverseMemoryPoolVisitorPattern(visitor);
21501 if(isSgTemplateDeclaration(node) !=NULL){
21507 traverseMemoryPoolVisitorPattern(visitor);
21508 if(visitor.get_num_Template_pointers()==1){
21511 printf(
"A SgTemplateSymbol was deleted\n");
21517 traverseMemoryPoolVisitorPattern(visitor1);
21522 if(isSgInterfaceStatement(node) !=NULL){
21527 if(isSgInterfaceSymbol(symbol)){
21538 if(isSgModuleStatement(node) !=NULL){
21543 if(isSgModuleSymbol(symbol)){
21553 if(isSgTemplateInstantiationDecl(node) !=NULL){
21558 if(isSgClassSymbol(symbol)){
21560 traverseMemoryPoolVisitorPattern(visitor);
21561 if(visitor.get_num_Class_pointers()==1){
21580 printf(
"SgTemplateArg in normal traversal\n");
21582 printf(
"SgTemplateInstantiationDecl in normal traversal\n");
21585 traverseMemoryPoolVisitorPattern(visitor);
21595 printf (
"After delete node: node = %p = %s \n",node,node->
class_name().c_str());
21601 DeleteAST deleteTree;
21604 deleteTree.traverse(n,postorder);
21607 printf (
"Leaving SageInterface::deleteAST(): n = %p = %s \n",n,n->
class_name().c_str());
21634 virtual void visit(
SgNode* n)
21637 if (expression != NULL)
21639 Visitor().traverse(expression->get_originalExpressionTree(), postorder);
21646 Visitor().traverse(root, postorder);
21658 SgSymbol* symbol = s_table->find(iname);
21659 ASSERT_not_null(symbol);
21664 ASSERT_not_null(sourceBlock);
21665 ASSERT_not_null(targetBlock);
21680 SgSymbol* symbol = s_table->find(iname);
21681 ASSERT_not_null(symbol);
21688 ASSERT_not_null(symbol);
21699 ASSERT_require(stmt->
get_parent() == targetBlock);
21714 func->set_scope(targetBlock);
21717 SgFunctionDeclaration* nondef_decl= isSgFunctionDeclaration(func->get_firstNondefiningDeclaration());
21718 if (func != nondef_decl)
21720 ASSERT_not_null(nondef_decl);
21727 else if (
auto labelStmt = isSgLabelStatement(stmt))
21729 if (labelStmt->get_scope() == sourceBlock) {
21730 labelStmt->set_scope(targetBlock);
21735 else if (isSgJovialTableStatement(stmt) || isSgTypedefDeclaration(stmt) || isSgEnumDeclaration(stmt))
21743 mlog[Rose::Diagnostics::WARN] <<
"test failing stmt->get_scope() == targetBlock in SageInterface::moveStatementsBetweenBlocks(): class: "
21750 if (declaration !=
nullptr)
21757 case V_SgVariableDeclaration:
21762 for (SgInitializedNamePtrList::iterator ii = l.begin(); ii != l.end(); ii++)
21772 SgType* var_type = init_name->get_type();
21775 var_type = mod_type->get_base_type();
21782 if (isSgEnumType(var_type))
21784 SgEnumType* enum_type = isSgEnumType(var_type);
21799 enumerator->set_scope(targetBlock);
21803 else if (isSgJovialTableType(var_type))
21819 SgVariableSymbol* var_sym = isSgVariableSymbol(init_name -> search_for_symbol_from_symbol_table ()) ;
21820 ASSERT_not_null(var_sym);
21823 if (old_scope != sourceBlock)
21825 old_scope->remove_symbol (var_sym);
21826 sourceBlock ->
insert_symbol(init_name->get_name(), var_sym);
21829 init_name->set_scope(targetBlock);
21830 initname_vec.push_back(init_name);
21834 case V_SgFunctionDeclaration:
21837 ASSERT_not_null(funcDecl);
21844 if (old_scope != sourceBlock)
21846 old_scope->remove_symbol (func_sym);
21854 case V_SgProgramHeaderStatement:
21855 case V_SgProcedureHeaderStatement:
21856 case V_SgClassDeclaration:
21857 case V_SgEnumDeclaration:
21860 ASSERT_not_null(nondef_decl);
21874 if (
auto proc = isSgProcedureHeaderStatement(nondef_decl)) {
21875 for (
auto arg : proc->get_parameterList()->get_args()) {
21876 if (arg->get_scope() != proc->get_scope()) {
21880 arg->set_scope(proc->get_scope());
21892 name->set_scope(targetBlock);
21897 case V_SgJovialTableStatement:
21901 ROSE_ASSERT (table);
21910 case V_SgTypedefDeclaration:
21914 ASSERT_not_null(typedef_decl);
21919 case V_SgAttributeSpecificationStatement:
21920 case V_SgEmptyDeclaration:
21921 case V_SgFortranIncludeLine:
21922 case V_SgImplicitStatement:
21923 case V_SgJovialDefineDeclaration:
21924 case V_SgJovialDirectiveStatement:
21925 case V_SgJovialLabelDeclaration:
21926 case V_SgJovialOverlayDeclaration:
21927 case V_SgPragmaDeclaration:
21928 case V_SgAdaAttributeClause:
21932 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());
21941template <
class T1,
class T2>
21942void moveDeclarationsBetweenScopes( T1* sourceBlock, T2* targetBlock)
21946 ROSE_ASSERT (sourceBlock && targetBlock);
21947 ROSE_ASSERT (sourceBlock->containsOnlyDeclarations() && targetBlock->containsOnlyDeclarations());
21948 if ((
void*)sourceBlock == (
void*)targetBlock)
21950 cerr<<
"warning: SageInterface::moveStatementsBetweenScopes() is skipped, "<<endl;
21951 cerr<<
" since program is trying to move statements from and to the identical scoped block. "<<endl;
21955 SgDeclarationStatementPtrList& srcStmts = sourceBlock->get_declarations ();
21956 std::vector <SgInitializedName*> initname_vec;
21958 for (
auto stmt : srcStmts)
21960 moveOneStatement(sourceBlock, targetBlock, stmt, initname_vec);
21965 ROSE_ASSERT(srcStmts.empty() ==
true);
21966 ROSE_ASSERT(sourceBlock->get_declarations().empty() ==
true);
21969 moveSymbolTableBetweenBlocks(sourceBlock, targetBlock, initname_vec);
21982template <
class T1,
class T2>
21983void moveStatementsBetweenScopes( T1* sourceBlock, T2* targetBlock)
21986 ROSE_ASSERT (sourceBlock && targetBlock);
21987 if ((
void*)sourceBlock == (
void*)targetBlock)
21989 cerr<<
"warning: SageInterface::moveStatementsBetweenScopes() is skipped, "<<endl;
21990 cerr<<
" since program is trying to move statements from and to the identical scoped block. "<<endl;
21994 SgStatementPtrList & srcStmts = sourceBlock->get_statements();
21995 std::vector <SgInitializedName*> initname_vec;
21999 moveOneStatement(sourceBlock, targetBlock, stmt, initname_vec);
22004 ROSE_ASSERT(srcStmts.empty() ==
true);
22005 ROSE_ASSERT(sourceBlock->get_statements().empty() ==
true);
22008 moveSymbolTableBetweenBlocks(sourceBlock, targetBlock, initname_vec);
22022 ASSERT_not_null(decl);
22026 ASSERT_require(local_def && global_def && (local_def!=global_def));
22028 for (
auto symbol : local_def->get_symbol_table()->get_symbols())
22030 SgSymbol *orig_sym = isSgSymbol(symbol);
22031 ASSERT_not_null(orig_sym);
22040 moveDeclarationsBetweenScopes(sourceBlock, targetBlock);
22042 createAliasSymbols(isSgNamespaceDeclarationStatement(targetBlock->
get_parent()));
22047 moveStatementsBetweenScopes(sourceBlock, targetBlock);
22049 createAliasSymbols(isSgNamespaceDeclarationStatement(targetBlock->
get_parent()));
22054 moveDeclarationsBetweenScopes(sourceBlock, targetBlock);
22060 moveStatementsBetweenScopes (sourceBlock, targetBlock);
22068 ROSE_ASSERT (func != NULL);
22070 ROSE_ASSERT (p != NULL);
22072 if (le && le->get_lambda_function() == func)
22085 #pragma message ("WARNING: MSVC does not handle isLambdaCapturedVariable() properly.")
22087 ROSE_ASSERT (varRef!= NULL);
22091 SgThisExp* te = isSgThisExp(p->get_lhs_operand_i());
22095 ROSE_ASSERT (csym!= NULL);
22098 ROSE_ASSERT (xdecl != NULL);
22102 if (le->get_lambda_closure_class() == xdecl )
22118 ROSE_ASSERT(current != NULL);
22120 if (isSgInitializedName(current))
22122 name = isSgInitializedName(current);
22124 else if (isSgPntrArrRefExp(current) != NULL)
22128 ROSE_ASSERT(exp != NULL);
22130 ROSE_ASSERT(suc ==
true);
22134 else if (isSgVarRefExp(current) != NULL)
22140 if (isSgDotExp(parent))
22142 if (isSgDotExp(parent)->get_rhs_operand() == current)
22148 if (isSgArrowExp(parent)->get_rhs_operand() == current)
22152 name = isSgVarRefExp(current)->get_symbol()->get_declaration();
22154 else if (isSgFunctionRefExp(current) != NULL ||
22155 isSgTemplateFunctionRefExp(current) != NULL ||
22156 isSgMemberFunctionRefExp(current) != NULL ||
22157 isSgTemplateMemberFunctionRefExp(current) != NULL)
22162 else if (isSgNonrealRefExp(current) != NULL)
22167 else if (isSgDotExp(current))
22174 ROSE_ASSERT(child);
22178 else if (isSgArrowExp(current))
22199 ROSE_ASSERT(child);
22204 else if (isSgThisExp(current))
22209 else if (isSgPointerDerefExp(current))
22213 else if(isSgUnaryOp(current)) {
22216 else if (isSgCastExp(current))
22222 else if (isSgAddOp(current))
22227 else if (isSgSubtractOp(current))
22238 else if (isSgIntVal(current))
22248 if (!isSgConstructorInitializer(current))
22250 mlog[Sawyer::Message::Common::WARN] <<
22251 "convertRefToInitializedName: " <<
22254 cerr<<
"In SageInterface::convertRefToInitializedName(): unhandled reference type:"<<current->
class_name()<<endl;
22265#ifdef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22266 printf (
"AbstractHandle support is disabled for ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT \n");
22272 size_t pos = input_string.find(
"SourceFile<");
22273 ROSE_ASSERT (pos != string::npos);
22274 string trimed_string = input_string.substr(pos);
22278 if (handle->getNode()!=NULL)
22283#pragma message ("WARNING: covariant return type for get_node() not supported in MSVC.")
22284 printf (
"ERROR: covariant return type for get_node() not supported in MSVC. \n");
22307 ROSE_ASSERT(node != NULL);
22310 cout<<
"///////////// begin of SageInterface::dumpInfo() ///////////////"<<endl;
22311 cout<<
"--------------base info. for SgNode---------------"<<endl;
22317 cout<<
"--------------source location info. for SgNode---------------"<<endl;
22325 cout<<
"--------------preprocessing info. for SgNode---------------"<<endl;
22326 AttachedPreprocessingInfoType::iterator i;
22327 cout<<
"Total attached preprocessingInfo count="<<comments->size()<<endl;
22328 for (i = comments->begin (); i != comments->end (); i++)
22331 pinfo->display(
"");
22334 cout<<
"--------------name info. for SgNode---------------"<<endl;
22338 cout<<
"\tqualified name="<<decl->get_qualified_name().getString()<<endl;
22341 cout<<
"\treferenced variable name= "<<varRef->get_symbol()->
get_name().getString()<<endl;
22348 cout<<
"///////////// end of SageInterface::dumpInfo() ///////////////"<<endl;
22359 bool retVal =
true;
22361 ROSE_ASSERT(stmt !=NULL);
22363#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22370 if (funcDecl != NULL)
22373 if (funcDecl == NULL)
22375 cerr<<
"In collectReadWriteRefs(): cannot proceed without a function body!"<<endl;
22378 stmt = funcDecl->get_definition()->
get_body();
22386 ROSE_ASSERT(funcDef != NULL);
22388 ROSE_ASSERT(funcBody!= NULL);
22391 AstInterfaceImpl faImpl(funcBody);
22392 AstInterface fa(&faImpl);
22393 ArrayAnnotation* annot = ArrayAnnotation::get_inst();
22394 if( useCachedDefUse ){
22395 ArrayInterface* array_interface = ArrayInterface::get_inst(*annot, fa, funcDef, AstNodePtrImpl(funcDef));
22396 LoopTransformInterface::set_arrayInfo(array_interface);
22398 ArrayInterface array_interface(*annot);
22401 array_interface.observe(fa);
22402 LoopTransformInterface::set_arrayInfo(&array_interface);
22404 LoopTransformInterface::set_astInterface(fa);
22406 LoopTransformInterface::set_sideEffectInfo(annot);
22409 DoublyLinkedListWrap<AstNodePtr> rRef1, wRef1;
22410 CollectDoublyLinkedList<AstNodePtr> crRef1(rRef1),cwRef1(wRef1);
22411 AstNodePtr s1 = AstNodePtrImpl(stmt);
22414 if (!AnalyzeStmtRefs(fa, s1, cwRef1, crRef1))
22419 mlog[Sawyer::Message::Common::DEBUG] <<
"Function: " << funcDef->get_declaration()->get_qualified_name() <<
" calls at least one function that has not been annotated." << endl;
22424 for (DoublyLinkedEntryWrap<AstNodePtr>* p = rRef1.First(); p != 0; )
22426 DoublyLinkedEntryWrap<AstNodePtr>* p1 = p;
22428 AstNodePtr cur = p1->GetEntry();
22429 SgNode* sgRef = AstNodePtrImpl(cur).get_ptr();
22430 ROSE_ASSERT(sgRef != NULL);
22431 readRefs.push_back(sgRef);
22436 for (DoublyLinkedEntryWrap<AstNodePtr>* p = wRef1.First(); p != 0; )
22438 DoublyLinkedEntryWrap<AstNodePtr>* p1 = p;
22440 AstNodePtr cur = p1->GetEntry();
22441 SgNode* sgRef = AstNodePtrImpl(cur).get_ptr();
22442 ROSE_ASSERT(sgRef != NULL);
22443 writeRefs.push_back(sgRef);
22456static bool skipSomeRefs(
SgNode* n)
22459 return (isSgThisExp(n)||isSgArrowExp(n)||isSgDotExp(n));
22465 ROSE_ASSERT(stmt != NULL);
22466 vector <SgNode* > readRefs, writeRefs;
22470 vector<SgNode*>::iterator iter = readRefs.begin();
22471 for (; iter!=readRefs.end();iter++)
22473 SgNode* current = *iter;
22476 ROSE_ASSERT (current != NULL);
22479 if (!name)
continue;
22482 readVars.insert(name);
22485 vector<SgNode*>::iterator iterw = writeRefs.begin();
22486 for (; iterw!=writeRefs.end();iterw++)
22488 SgNode* current = *iterw;
22489 ROSE_ASSERT (current != NULL);
22491 if (!name)
continue;
22495 writeVars.insert(name);
22503 ROSE_ASSERT(stmt != NULL);
22504 set<SgInitializedName*> readVars, writeVars;
22509 set_difference(readVars.begin(), readVars.end(),
22510 writeVars.begin(), writeVars.end(),
22511 std::inserter(readOnlyVars, readOnlyVars.begin()));
22521 readOnlyVars.insert (v_ref->get_symbol()->get_declaration());
22531 set<SgInitializedName*> temp;
22534 for (set<SgInitializedName*>::const_iterator iter = temp.begin();
22535 iter!=temp.end(); iter++)
22537 SgSymbol* symbol = (*iter)->get_symbol_from_symbol_table () ;
22538 ROSE_ASSERT(symbol != NULL );
22539 ROSE_ASSERT(isSgVariableSymbol(symbol));
22540 readOnlySymbols.insert(isSgVariableSymbol(symbol));
22548 bool result =
false;
22549 ROSE_ASSERT(ref != NULL);
22561 ROSE_ASSERT(grandparent);
22562 if (isSgFunctionCallExp(grandparent))
22568 size_t param_index = 0;
22570 SgExpressionPtrList expList = isSgExprListExp(ref->
get_parent())->get_expressions();
22571 Rose_STL_Container<SgExpression*>::const_iterator iter= expList.begin();
22572 for (; iter!=expList.end(); iter++)
22580 SgExpression* func_exp = isSgFunctionCallExp(grandparent)->get_function();
22581 ROSE_ASSERT (func_exp);
22586 SgInitializedNamePtrList nameList = funcDecl->get_args();
22591 if (param_index >= nameList.size() ||isSgTypeEllipse(nameList[param_index]->get_type()) )
22593 if (isSgReferenceType(ref))
22597 if (isSgReferenceType(nameList[param_index]->get_type()))
22602 else if (isSgDotExp (func_exp) || isSgArrowExp(func_exp))
22605 ROSE_ASSERT (binOp);
22607 ROSE_ASSERT (mfuncRef);
22609 ROSE_ASSERT (mfuncDecl);
22610 SgInitializedNamePtrList nameList = mfuncDecl->get_args();
22612 if (isSgReferenceType(nameList[param_index]->get_type()))
22627 Rose_STL_Container <SgNode*> var_refs = NodeQuery::querySubTree (
const_cast<SgStatement *
> (s), V_SgVarRefExp);
22629 Rose_STL_Container<SgNode*>::iterator iter = var_refs.begin();
22630 for (; iter!=var_refs.end(); iter++)
22633 ROSE_ASSERT(ref != NULL);
22640 varSetB.insert(ref);
22646 ROSE_ASSERT(grandparent);
22647 if (isSgFunctionCallExp(grandparent))
22650 int param_index =0;
22651 SgExpressionPtrList expList = isSgExprListExp(ref->
get_parent())->get_expressions();
22652 Rose_STL_Container<SgExpression*>::const_iterator iter= expList.begin();
22653 for (; iter!=expList.end(); iter++)
22661 SgFunctionRefExp * funcRef = isSgFunctionRefExp(isSgFunctionCallExp(grandparent)->get_function());
22663 SgInitializedNamePtrList nameList = funcDecl->get_args();
22665 if (isSgReferenceType(nameList[param_index]->get_type()))
22667 varSetB.insert(ref);
22673 varSetB.insert(ref);
22677#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22682 static LivenessAnalysis* liv = NULL;
22686 static DFAnalysis * defuse = NULL;
22690 ROSE_ASSERT(project != NULL);
22691 defuse =
new DefUseAnalysis(project);
22694 ROSE_ASSERT(defuse != NULL);
22695 defuse->run(debug);
22698 defuse->dfaToDOT();
22701 liv =
new LivenessAnalysis(debug,(DefUseAnalysis*)defuse);
22702 ROSE_ASSERT(liv != NULL);
22704 std::vector <FilteredCFGNode < IsDFAFilter > > dfaFunctions;
22705 NodeQuerySynthesizedAttributeType vars =
22706 NodeQuery::querySubTree(project, V_SgFunctionDefinition);
22707 NodeQuerySynthesizedAttributeType::const_iterator i;
22708 bool abortme=
false;
22710 for (i= vars.begin(); i!=vars.end();++i)
22713 ROSE_ASSERT(func != NULL);
22717 string funcName = func->get_declaration()->get_qualified_name().str();
22718 cout<<
" .. running liveness analysis for function: " << funcName << endl;
22720 FilteredCFGNode <IsDFAFilter> rem_source = liv->run(func,abortme);
22722 liv->fixupStatementsINOUT(func);
22723 if (rem_source.getNode()!=NULL)
22724 dfaFunctions.push_back(rem_source);
22730 cout <<
"Writing out liveness analysis results into var.dot... " << endl;
22731 std::ofstream f2(
"var.dot");
22732 dfaToDot(f2,
string(
"var"), dfaFunctions, (DefUseAnalysis*)defuse, liv);
22736 cerr<<
"Error: Liveness analysis is ABORTING ." << endl;
22744#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22748 ROSE_ASSERT(liv != NULL);
22749 ROSE_ASSERT(loop != NULL);
22751 std::vector<SgInitializedName*> liveIns0, liveOuts0;
22761 CFGNode cfgnode(forstmt,2);
22762 FilteredCFGNode<IsDFAFilter> filternode= FilteredCFGNode<IsDFAFilter> (cfgnode);
22766 ROSE_ASSERT(filternode.getNode()==forstmt);
22769 vector<FilteredCFGEdge < IsDFAFilter > > out_edges = filternode.outEdges();
22770 ROSE_ASSERT(out_edges.size()==2);
22771 vector<FilteredCFGEdge < IsDFAFilter > >::iterator iter= out_edges.begin();
22773 for (; iter!=out_edges.end();iter++)
22775 FilteredCFGEdge < IsDFAFilter > edge= *iter;
22779 if (edge.condition()==eckTrue)
22781 SgNode* firstnode= edge.target().getNode();
22782 liveIns0 = liv->getIn(firstnode);
22784 for (std::vector<SgInitializedName*>::iterator iter = liveIns0.begin();
22785 iter!=liveIns0.end(); iter++)
22788 liveIns.insert(*iter);
22793 else if (edge.condition()==eckFalse)
22795 SgNode* firstnode= edge.target().getNode();
22796 liveOuts0 = liv->getIn(firstnode);
22798 for (std::vector<SgInitializedName*>::iterator iter = liveOuts0.begin();
22799 iter!=liveOuts0.end(); iter++)
22803 liveOuts.insert(*iter);
22808 cerr<<
"Unexpected CFG out edge type for SgForStmt!"<<endl;
22817static bool isAssignReduction (
SgVarRefExp* ref_exp1,
SgVarRefExp* ref_exp2, OmpSupport::omp_construct_enum& optype)
22819 bool isReduction =
false;
22821 ROSE_ASSERT (ref_exp1!= NULL);
22822 ROSE_ASSERT (ref_exp2!= NULL);
22823 ROSE_ASSERT (ref_exp1-> get_symbol() == ref_exp2-> get_symbol());
22829 if (stmt != stmt2)
return false;
22836 if (exp_stmt && isSgAssignOp(exp_stmt->get_expression()))
22839 assign_lhs = isSgAssignOp(exp_stmt->get_expression())->
get_lhs_operand();
22840 assign_rhs = isSgAssignOp(exp_stmt->get_expression())->
get_rhs_operand();
22841 ROSE_ASSERT(assign_lhs && assign_rhs);
22849 SgBinaryOp * binop = isSgBinaryOp(assign_rhs);
22855 if( !((op_lhs==ref_exp1)||(op_lhs==ref_exp2))
22856 && !((op_rhs==ref_exp1)||(op_rhs==ref_exp2)))
22859 bool isOnLeft =
false;
22860 if ((op_lhs==ref_exp1)||
22861 (op_lhs==ref_exp2))
22867 optype = OmpSupport::e_reduction_plus;
22868 isReduction =
true;
22871 case V_SgMultiplyOp:
22873 optype = OmpSupport::e_reduction_mul;
22874 isReduction =
true;
22877 case V_SgSubtractOp:
22879 optype = OmpSupport::e_reduction_minus;
22882 isReduction =
true;
22888 optype = OmpSupport::e_reduction_bitand ;
22889 isReduction =
true;
22894 optype = OmpSupport::e_reduction_bitxor;
22895 isReduction =
true;
22900 optype = OmpSupport::e_reduction_bitor;
22901 isReduction =
true;
22906 optype = OmpSupport::e_reduction_logand;
22907 isReduction =
true;
22912 optype = OmpSupport::e_reduction_logor;
22913 isReduction =
true;
22922 return isReduction;
22931 bool matchStmt1 =
false;
22932 bool matchStmt2 =
false;
22939 ROSE_ASSERT (ref1 != NULL);
22940 ROSE_ASSERT (ref2 != NULL);
22941 ROSE_ASSERT (ref1-> get_symbol() == ref2-> get_symbol());
22949 if (stmt1 == stmt2)
return false;
22972 bool matchBody =
false;
22973 bool matchCondition=
false;
22974 if (
SgIfStmt * if_stmt = isSgIfStmt (if_cond_stmt->get_parent()) )
22976 if (
SgStatement* body = if_stmt->get_true_body())
22981 ROSE_ASSERT(stmt2 != NULL);
22982 if ( ((block->get_statements()).size() == 1) && stmt2->
get_scope() == block )
22993 if (
SgExprStatement* cond_exp_stmt = isSgExprStatement (if_stmt->get_conditional()) )
22995 SgExpression* cond_exp = cond_exp_stmt->get_expression();
22996 if (
SgBinaryOp * binop = isSgBinaryOp (cond_exp))
23001 if (isSgLessThanOp (binop))
23003 optype = OmpSupport::e_reduction_max;
23004 matchCondition=
true;
23006 else if (isSgGreaterThanOp(binop))
23008 optype = OmpSupport::e_reduction_min;
23009 matchCondition=
true;
23015 if (isSgLessThanOp (binop))
23017 optype = OmpSupport::e_reduction_min;
23018 matchCondition=
true;
23020 else if (isSgGreaterThanOp(binop))
23022 optype = OmpSupport::e_reduction_max;
23023 matchCondition=
true;
23030 matchStmt1 = matchBody && matchCondition;
23034 return (matchStmt2 && matchStmt1);
23041static bool isSingleAppearanceReduction(
SgVarRefExp* ref1, OmpSupport::omp_construct_enum& optype )
23043 bool isReduction =
false;
23045 ROSE_ASSERT (ref1 != NULL);
23051 if (isSgExprStatement(stmt))
23053 SgExpression* exp = isSgExprStatement(stmt)->get_expression();
23055 if (isSgPlusPlusOp(exp))
23058 optype = OmpSupport::e_reduction_plus;
23059 isReduction =
true;
23061 else if (isSgMinusMinusOp(exp))
23063 optype = OmpSupport::e_reduction_minus;
23064 isReduction =
true;
23075 case V_SgPlusAssignOp:
23077 optype = OmpSupport::e_reduction_plus;
23078 isReduction =
true;
23081 case V_SgMultAssignOp:
23083 optype = OmpSupport::e_reduction_mul;
23084 isReduction =
true;
23087 case V_SgMinusAssignOp:
23089 optype = OmpSupport::e_reduction_minus;
23090 isReduction =
true;
23093 case V_SgAndAssignOp:
23095 optype = OmpSupport::e_reduction_bitand;
23096 isReduction =
true;
23099 case V_SgXorAssignOp:
23101 optype = OmpSupport::e_reduction_bitxor;
23102 isReduction =
true;
23105 case V_SgIorAssignOp:
23107 optype = OmpSupport::e_reduction_bitor;
23108 isReduction =
true;
23117 return isReduction;
23149 std::set<SgInitializedName*> candidateVars;
23151 std::map <SgInitializedName*, vector<SgVarRefExp* > > var_references;
23153 Rose_STL_Container<SgNode*> reflist = NodeQuery::querySubTree(loop, V_SgVarRefExp);
23155 ROSE_ASSERT(lbody != NULL);
23156 Rose_STL_Container<SgNode*>::iterator iter = reflist.begin();
23157 for (; iter!=reflist.end(); iter++)
23166 ROSE_ASSERT(var_scope != NULL);
23167 if ((
isScalarType(initname->get_type())) &&(initname !=loopindex)
23170 candidateVars.insert(initname);
23171 var_references[initname].push_back(ref_exp);
23176 std::set<SgInitializedName*>::iterator niter=candidateVars.begin();
23177 for (; niter!=candidateVars.end(); niter++)
23180 bool isReduction =
false;
23181 OmpSupport::omp_construct_enum optype;
23183 if (var_references[initname].size()==1)
23185 mlog[Sawyer::Message::Common::DEBUG] <<
"Debug: SageInterface::ReductionRecognition() A candidate used once:"<<initname->get_name().getString()<<endl;
23186 SgVarRefExp* ref_exp = *(var_references[initname].begin());
23187 if (isSingleAppearanceReduction (ref_exp, optype))
23188 isReduction =
true;
23191 else if (var_references[initname].size()==2)
23193 mlog[Sawyer::Message::Common::DEBUG] <<
"Debug: A candidate used twice:"<<initname->get_name().getString()<<endl;
23194 SgVarRefExp* ref_exp1 = *(var_references[initname].begin());
23195 SgVarRefExp* ref_exp2 = *(++var_references[initname].begin());
23198 if (isAssignReduction (ref_exp1, ref_exp2, optype) || isIfReduction (ref_exp1, ref_exp2, optype) )
23200 isReduction =
true;
23206 results.insert(make_pair(initname,optype));
23213 ROSE_ASSERT(r!=NULL);
23214#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
23215 ConstantFolding::constantFoldingOptimization(r,
false);
23225 virtual void visit (
SgNode * n)
23232 ROSE_ASSERT (name_attribute != NULL);
23240 exampleTraversal.
traverse(project, preorder);
23272 const SgInitializedNamePtrList& orig_decls = params.
get_args();
23274 std::transform( orig_decls.begin(), orig_decls.end(), sg::sage_inserter(copy), sg::InitNameCloner(copy, fundef) );
23288 sg::swap_child(ll, rr, &SgFunctionDeclaration::get_definition, &SgFunctionDeclaration::set_definition);
23289 sg::swap_child(ll, rr, &SgFunctionDeclaration::get_parameterList, &SgFunctionDeclaration::set_parameterList);
23299 std::pair<SgStatement*, SgInitializedName*>
23313 SgType* result_type = definingDeclaration.get_type()->get_return_type();
23318 SgFunctionDeclaration* wrapperfn = SB::buildDefiningFunctionDeclaration(newName, result_type, ¶m_list, containing_scope);
23321 ROSE_ASSERT(wrapperdef);
23324 wrapperfn->set_exceptionSpecification(definingDeclaration.get_exceptionSpecification());
23328 swapDefiningElements(definingDeclaration, *wrapperfn);
23333 SgInitializedNamePtrList& param_decls = param_list.
get_args();
23335 std::transform( param_decls.begin(), param_decls.end(), sg::sage_inserter(*args), sg::VarRefBuilder(*wrapperdef) );
23337 SgFunctionCallExp* callWrapped = SB::buildFunctionCallExp( newName, result_type, args, body );
23342 if (!isSgTypeVoid(result_type))
23345 SgVariableDeclaration* res = SB::buildVariableDeclaration(
"res", result_type, SB::buildAssignInitializer(callWrapped), body );
23352 callStatement = res;
23359 callStatement = SB::buildExprStatement(callWrapped);
23363 ROSE_ASSERT(callStatement);
23367 SgFunctionDeclaration* wrapperfn_proto = SB::buildNondefiningFunctionDeclaration(wrapperfn, containing_scope, decorator_proto);
23373 return std::make_pair(callStatement, resultName);
23381 struct VarrefBuilder
23400 template <
class AstNode>
23401 struct VarrefCreator : VarrefBuilder
23406 VarrefCreator(AstNode& orig)
23410 SgVarRefExp*
get()
const {
return VarrefBuilder::build(origin); }
23413 template <
class AstNode>
23414 VarrefCreator<AstNode>
23415 varrefCreator(AstNode& n)
23417 return VarrefCreator<AstNode>(n);
23427 return SB::buildMultiplyOp(lhs, SI::deepCopy(rhs));
23430 std::pair<std::vector<SgExpression*>,
SgType*>
23431 get_C_array_dimensions_aux(
const SgArrayType& arr_type)
23437 std::vector<SgExpression*> indices;
23438 SgType* undertype = NULL;
23442 if (arrtype->get_index() == NULL)
23444 indices.push_back(SB::buildNullExpression());
23445 undertype = arrtype->get_base_type();
23446 arrtype = isSgArrayType(undertype);
23452 ROSE_ASSERT(indexexpr);
23454 indices.push_back(SI::deepCopy(indexexpr));
23455 undertype = arrtype->get_base_type();
23456 arrtype = isSgArrayType(undertype);
23459 ROSE_ASSERT((!indices.empty()) && undertype);
23460 return std::make_pair(indices, undertype);
23464 std::vector<SgExpression*>
23465 get_C_array_dimensions_aux(
const SgArrayType& arrtype,
const VarrefBuilder& varrefBuilder)
23469 std::pair<std::vector<SgExpression*>,
SgType*> res = get_C_array_dimensions_aux(arrtype);
23470 const std::vector<SgExpression*>::iterator first = res.first.begin();
23473 if (isSgNullExpression(*first))
23481 const std::vector<SgExpression*>::iterator aa = first+1;
23482 const std::vector<SgExpression*>::iterator zz = res.first.end();
23484 SgExpression* sz_undertype = SB::buildSizeOfOp(res.second);
23485 SgExpression* denominator = std::accumulate(aa, zz, sz_undertype, create_mulop);
23486 SgSizeOfOp* sz_var = SB::buildSizeOfOp(varrefBuilder.get());
23487 SgExpression* sz = SB::buildDivideOp(sz_var, denominator);
23489 std::swap(*first, sz);
23497 std::vector<SgExpression*>
23500 return get_C_array_dimensions_aux(arrtype).first;
23503 std::vector<SgExpression*>
23506 return get_C_array_dimensions_aux(arrtype, varrefCreator(varref));
23509 std::vector<SgExpression*>
23512 return get_C_array_dimensions_aux(arrtype, varrefCreator(initname));
23519 set<unsigned int> sourceSequenceSet;
23521 void visit (
SgNode* astNode );
23529 if (fileInfo != NULL)
23531 unsigned int source_sequence_number = fileInfo->get_source_sequence_number();
23533 printf (
"In CollectSourceSequenceNumbers::visit(): source_sequence_number = %" PRIuPTR
" \n",source_sequence_number);
23535 sourceSequenceSet.insert(source_sequence_number);
23545 traversal.
traverse(astNode,preorder);
23547 return traversal.sourceSequenceSet;
23634#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
23636 if (collapsing_factor <= 1)
23649 ROSE_ASSERT (global_scope != NULL);
23658 bool *isPlus =
new bool[collapsing_factor];
23662 std::vector<SgForStatement* > loops= SageInterface::querySubTree<SgForStatement>(target_loop,V_SgForStatement);
23663 ROSE_ASSERT(loops.size()>=collapsing_factor);
23679 ROSE_ASSERT(
getScope(target_loop)->get_parent()!= NULL);
23683 while(scope == NULL)
23685 parent = isSgStatement(parent->
get_parent());
23686 scope = isSgScopeStatement(parent);
23690 if (insert_target != NULL)
23695 ROSE_ASSERT(scope != NULL);
23698 for(
size_t i = 0; i < collapsing_factor; i ++)
23700 temp_target_loop = loops[i];
23705 if (!
isCanonicalForLoop(temp_target_loop, &ivar[i], &lb[i], &ub[i], &step[i], &orig_body[i], &isPlus[i]))
23707 cerr<<
"Error in SageInterface::loopCollapsing(): target loop is not canonical."<<endl;
23715 delete[] orig_body;
23716 delete[] total_iters;
23723 ROSE_ASSERT(ivar[i]&& lb[i] && ub[i] && step[i]);
23727 if(isPlus[i] ==
true)
23741 string iter_var_name=
"_total_iters";
23762 new_var_list->append_expression(isSgVarRefExp(ub_exp));
23765 for(
unsigned int i = 0; i < collapsing_factor; i++)
23768 for(
unsigned int j = collapsing_factor - 1; j > i; j--)
23777 new_var_list->append_expression(isSgVarRefExp(interval[i]));
23787 ROSE_ASSERT(insert_target != NULL);
23792 new_var_list->append_expression(clps_index_ref);
23798 ROSE_ASSERT(body != NULL);
23801 std::vector<SgStatement*> new_stmt_list;
23812 for(
unsigned int i = 0; i < collapsing_factor - 1; i ++)
23814 if(isPlus[i] ==
true)
23820 new_stmt_list.push_back(assign_stmt);
23823 if(i != collapsing_factor - 2){
23824 string remain_var_name=
"_remainder";
23825 remain_var_name =
"__"+ ivar[i]->get_name().getString() + remain_var_name;
23828 new_stmt_list.push_back(loop_index_decl);
23834 if(isPlus[collapsing_factor - 1] ==
true)
23838 new_stmt_list.push_back(assign_stmt);
23850 ROSE_ASSERT(cond_stmt != NULL);
23857 target_loop = new_loop;
23859 ConstantFolding::constantFoldingOptimization(scope->
get_parent(),
false);
23865 delete [] orig_body;
23866 delete [] total_iters;
23867 delete [] interval;
23872 return new_var_list;
23891 RoseAst ast_of_original(tree2);
23900 while (i_copy != ast_of_copy.
end())
23903 printf (
"*i_copy = %p = %s \n",*i_copy,(*i_copy)->class_name().c_str());
23904 printf (
"*i_original = %p = %s \n",*i_original,(*i_original)->class_name().c_str());
23908 if ((*i_copy)->variantT() != (*i_original)->variantT())
23911 printf (
"ERROR: return from SageInterface::isStructurallyEquivalentAST(): (*i_copy)->variantT() != (*i_original)->variantT() \n");
23914 printf (
"Making this an error! \n");
23924 ROSE_ASSERT(i_original != ast_of_original.
end());
23929 ROSE_ASSERT(i_copy == ast_of_copy.
end() && i_original == ast_of_original.
end());
23949 lower_bound = NULL;
23950 upper_bound = NULL;
23954 const std::vector<SgStatement *> & init_stmts = for_init_stmt->
get_init_stmt();
23955 assert(init_stmts.size() == 1);
23957 assert(init_stmt != NULL);
23960 SgAssignOp * assign_init = isSgAssignOp(init);
23961 assert(assign_init != NULL);
23963 assert(iterator_init_ref != NULL);
23964 iterator = iterator_init_ref->get_symbol();
23965 assert(iterator != NULL);
23968 SgExprStatement * test_stmt = isSgExprStatement(for_loop->get_test());
23969 assert(test_stmt != NULL);
23975 while (isSgCastExp(lhs_exp)) lhs_exp = ((
SgCastExp *)lhs_exp)->get_operand_i();
23976 SgVarRefExp * lhs_var_ref = isSgVarRefExp(lhs_exp);
23977 bool lhs_it = (lhs_var_ref != NULL) && (lhs_var_ref->get_symbol() == iterator);
23980 while (isSgCastExp(rhs_exp)) rhs_exp = ((
SgCastExp *)rhs_exp)->get_operand_i();
23981 SgVarRefExp * rhs_var_ref = isSgVarRefExp(rhs_exp);
23983 bool rhs_it = (rhs_var_ref != NULL) && (rhs_var_ref->get_symbol() == iterator);
23991 assert(lhs_it != rhs_it);
24000 case V_SgGreaterOrEqualOp:
24001 inclusive = lhs_it;
24004 case V_SgGreaterThanOp:
24005 inclusive = !lhs_it;
24008 case V_SgLessOrEqualOp:
24009 inclusive = lhs_it;
24010 reversed = !lhs_it;
24012 case V_SgLessThanOp:
24013 inclusive = !lhs_it;
24014 reversed = !lhs_it;
24016 case V_SgEqualityOp:
24017 case V_SgNotEqualOp:
24023 switch (increment->variantT()) {
24024 case V_SgPlusPlusOp:
24028 case V_SgMinusMinusOp:
24032 case V_SgPlusAssignOp:
24037 assert(var_ref_lhs != NULL && var_ref_lhs->get_symbol() == iterator);
24042 case V_SgMinusAssignOp:
24047 assert(var_ref_lhs != NULL && var_ref_lhs->get_symbol() == iterator);
24057 assert(inc_assign_lhs != NULL && inc_assign_lhs->get_symbol() == iterator);
24060 assert(inc_assign_rhs != NULL);
24062 if (inc_assign_rhs_lhs != NULL && inc_assign_rhs_lhs->get_symbol() == iterator)
24065 if (inc_assign_rhs_rhs != NULL && inc_assign_rhs_rhs->get_symbol() == iterator)
24086#ifdef ROSE_BUILD_JAVA_LANGUAGE_SUPPORT
24093 jstring temp_directory = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(::currentJavaTraversalClass, Rose::Frontend::Java::Ecj::getTempDirectoryMethod);
24095 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_directory, NULL);
24097 string directory_name = utf8;
24098 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_directory, utf8);
24100 list<string> sourcepath = project -> get_Java_sourcepath();
24101 sourcepath.push_back(directory_name);
24102 project -> set_Java_sourcepath(sourcepath);
24104 return directory_name;
24112 string command = string(
"rm -fr ") + directory_name;
24113 int status = system(command.c_str());
24114 ROSE_ASSERT(status == 0);
24125 project -> get_sourceFileNameList().push_back(filename);
24126 Rose_STL_Container<std::string> arg_list = project -> get_originalCommandLineArgumentList();
24127 arg_list.push_back(filename);
24130 int error_code = 0;
24131 SgFile *file = determineFileType(arg_list, error_code, project);
24133 ROSE_ASSERT(sourcefile);
24134 sourcefile -> set_parent(project);
24139 project -> get_fileList_ptr() -> get_listOfFiles().push_back(sourcefile);
24140 ROSE_ASSERT(sourcefile == isSgSourceFile((*project)[filename]));
24142 sourcefile -> build_Java_AST(arg_list, project -> get_originalCommandLineArgumentList());
24145 project -> get_fileList_ptr() -> get_listOfFiles().pop_back();
24146 ROSE_ASSERT(sourcefile != isSgSourceFile((*project)[filename]));
24150 ROSE_ASSERT(file->get_preprocessorDirectivesAndCommentsList() != NULL);
24161 string command =
"package " + package_name +
";";
24166 jstring temp_file = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
24167 Rose::Frontend::Java::Ecj::createTempFileMethod,
24168 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(command.c_str()));
24170 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_file, NULL);
24172 string filename = (string) utf8;
24173 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_file, utf8);
24177 return package_name;
24186 string command =
"import " + import_string +
";";
24191 jstring temp_file = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
24192 Rose::Frontend::Java::Ecj::createTempFileMethod,
24193 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(command.c_str()));
24195 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_file, NULL);
24197 string filename = (string) utf8;
24198 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_file, utf8);
24202 return import_string;
24214 jstring temp_file = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
24215 Rose::Frontend::Java::Ecj::createTempNamedFileMethod,
24216 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(file_name.c_str()),
24217 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(file_content.c_str()));
24219 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_file, NULL);
24221 string filename = (string) utf8;
24222 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_file, utf8);
24232 ROSE_ASSERT(scope);
24234 for (
int index = 0, length = package_name.size(); index < length; index++) {
24236 for (n = index; n < length; n++) {
24237 if (package_name[n] ==
'.') {
24241 string name = package_name.substr(index, n - index);
24243 SgClassSymbol *package_symbol = scope -> lookup_class_symbol(name);
24244 if (package_symbol == NULL) {
24248 SgJavaPackageDeclaration *package_declaration = isSgJavaPackageDeclaration(package_symbol -> get_declaration() -> get_definingDeclaration());
24249 ROSE_ASSERT(package_declaration);
24250 package_definition = package_declaration -> get_definition();
24251 ROSE_ASSERT(package_definition);
24252 scope = package_definition;
24257 return package_definition;
24265 SgGlobal *global_scope = project -> get_globalScopeAcrossFiles();
24267 if (package_definition == NULL) {
24273 if (create_directory) {
24274 Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
24275 Rose::Frontend::Java::Ecj::createTempNamedDirectoryMethod,
24276 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(package_name.c_str()));
24282 return package_definition;
24289 ROSE_ASSERT(package_definition);
24290 SgClassSymbol *class_symbol = package_definition -> lookup_class_symbol(class_name);
24293 : isSgClassDeclaration(class_symbol -> get_declaration() -> get_definingDeclaration()));
24294 if ((! class_declaration) || (! class_declaration -> attributeExists(
"complete"))) {
24295 string qualified_name = package_definition -> get_qualified_name().getString() +
"." + class_name;
24297 class_symbol = package_definition -> lookup_class_symbol(class_name);
24300 class_declaration = (class_symbol == NULL
24302 : isSgClassDeclaration(class_symbol -> get_declaration() -> get_definingDeclaration()));
24304 return class_declaration;
24320 SgClassDeclaration *class_declaration = isSgClassDeclaration(class_type -> get_declaration() -> get_definingDeclaration());
24321 ROSE_ASSERT(class_declaration);
24322 SgClassDefinition *scope = isSgClassDefinition(class_declaration -> get_scope());
24323 while (scope && (! isSgJavaPackageDeclaration(scope -> get_parent()))) {
24324 class_declaration = isSgClassDeclaration(scope -> get_parent());
24325 ROSE_ASSERT(class_declaration);
24326 scope = isSgClassDefinition(class_declaration -> get_scope());
24333 string class_name = class_declaration ->
get_name().getString();
24342 ROSE_ASSERT(class_definition);
24344 ROSE_ASSERT(type_list);
24346 ROSE_ASSERT(string_array_type);
24347 type_list -> append_argument(string_array_type);
24353 SgFunctionSymbol *method_symbol = class_definition -> lookup_function_symbol(
"main", member_function_type);
24355 return (method_symbol == NULL ? NULL : isSgMemberFunctionDeclaration(method_symbol -> get_declaration()));
24363 SgClassDeclaration *class_declaration = isSgClassDeclaration(class_type -> get_declaration() -> get_definingDeclaration());
24364 ROSE_ASSERT(class_declaration);
24377 ROSE_ASSERT (old_sym != NULL);
24378 ROSE_ASSERT (new_sym != NULL);
24379 ROSE_ASSERT (old_sym != new_sym);
24380 ROSE_ASSERT (scope != NULL);
24382 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(scope, V_SgVarRefExp);
24383 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
24386 if (vRef->get_symbol() == old_sym)
24387 vRef->set_symbol(new_sym);
24400 bool result =
true;
24402 bool includingSelf =
false;
24405 if (sourceFile == NULL)
24407 printf (
"In SageInterface::statementCanBeTransformed(): sourceFile not found \n");
24411 ROSE_ASSERT(sourceFile != NULL);
24413 if (sourceFile != NULL && sourceFile->get_unparse_tokens() ==
true && sourceFile->get_unparseHeaderFiles() ==
true)
24417 string source_filename = stmt->getFilenameString();
24419 printf (
"In SageInterface::statementCanBeTransformed(): source_filename = %s \n",source_filename.c_str());
24420 printf (
" --- Rose::includeFileMapForUnparsing.size() = %zu \n",Rose::includeFileMapForUnparsing.size());
24424 if (EDG_ROSE_Translation::edg_include_file_map.find(source_filename) != EDG_ROSE_Translation::edg_include_file_map.end())
24426 SgIncludeFile* include_file = EDG_ROSE_Translation::edg_include_file_map[source_filename];
24427 ROSE_ASSERT(include_file != NULL);
24429 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");
24431 if (include_file->get_can_be_supported_using_token_based_unparsing() ==
false)
24434 printf (
"NOTE: Transformations of this statement cannot be supported using the header file unparsing with token unparsing options! \n");
24444 printf (
"Not found in Rose::includeFileMapForUnparsing: source_filename = %s \n",source_filename.c_str());
24447 printf (
"Exiting as a test! \n");
24453 printf (
"Error: In statementCanBeTransformed(): this might be an issue! \n");
24466 ROSE_ASSERT (decl!= NULL);
24467 ROSE_ASSERT (target_scope != NULL);
24468 ROSE_ASSERT (target_scope != decl->
get_scope());
24475 if (isSgIfStmt (target_scope))
24478 if (target_scope == )
24488 case V_SgBasicBlock:
24500 case V_SgForStatement:
24504 ROSE_ASSERT(stmt != NULL);
24505 SgStatementPtrList& stmt_list = stmt->get_init_stmt();
24509 if (stmt_list.size() !=1)
24511 cerr<<
"Error in moveVariableDeclaration(): only single init statement is handled for SgForStatement now."<<endl;
24512 ROSE_ASSERT (stmt_list.size() ==1);
24515 ROSE_ASSERT (exp_stmt != NULL);
24516 SgAssignOp* assign_op = isSgAssignOp(exp_stmt->get_expression());
24517 ROSE_ASSERT (assign_op != NULL);
24527 if (init_name->get_initptr() != NULL)
24529 init_name->set_initptr(initor);
24532 stmt_list.insert (stmt_list.begin(), decl );
24538 cerr<<
"Error. Unhandled target scope type:"<<target_scope->
class_name()<<endl;
24539 ROSE_ASSERT (
false);
24545 ROSE_ASSERT(sym != NULL);
24547 if (orig_scope != target_scope)
24552 init_name->set_scope(target_scope);
24554 orig_scope->remove_symbol(sym);
24559 ROSE_ASSERT (target_scope->symbol_exists(sym));
24569 subtreeVal.hasValue_ =
true;
24571 if (isSgIntVal(valExp)) {
24572 subtreeVal.value_ = isSgIntVal(valExp)->get_value();
24573 }
else if (isSgLongIntVal(valExp)) {
24574 subtreeVal.value_ = isSgLongIntVal(valExp)->get_value();
24575 }
else if (isSgLongLongIntVal(valExp)) {
24576 subtreeVal.value_ = isSgLongLongIntVal(valExp)->get_value();
24577 }
else if (isSgShortVal(valExp)) {
24578 subtreeVal.value_ = isSgShortVal(valExp)->get_value();
24579 }
else if (isSgUnsignedIntVal(valExp)) {
24580 subtreeVal.value_ = isSgUnsignedIntVal(valExp)->get_value();
24581 }
else if (isSgUnsignedLongVal(valExp)) {
24582 subtreeVal.value_ = isSgUnsignedLongVal(valExp)->get_value();
24583 }
else if (isSgUnsignedLongLongIntVal(valExp)) {
24584 subtreeVal.value_ = isSgUnsignedLongLongIntVal(valExp)->get_value();
24585 }
else if (isSgUnsignedShortVal(valExp)) {
24586 subtreeVal.value_ = isSgUnsignedShortVal(valExp)->get_value();
24592 if (isSgModifierType(vRef->get_type()) == NULL) {
24595 val.hasValue_ =
false;
24598 if (isSgModifierType(vRef->get_type())->
get_typeModifier().get_constVolatileModifier().isConst()) {
24604 if (isSgAssignInitializer(ini)) {
24609 return variableEval.
traverse(rhs);
24613 val.hasValue_ =
false;
24619 if (isSgExpression(node) != NULL) {
24621 if (valueExp != NULL) {
24622 return this->getValueExpressionValue(valueExp);
24626 if (varRefExp != NULL) {
24628 return evaluateVariableReference(varRefExp);
24631 if (isSgAssignInitializer(node)) {
24632 if(synList.at(0).hasValue_){
24633 return synList.at(0);
24637 val.hasValue_ =
false;
24642 evaluatedValue.hasValue_ =
false;
24643 evaluatedValue.value_ = -1;
24645 if(synList.size() != 2){
24646 for(SynthesizedAttributesList::iterator it = synList.begin(); it != synList.end(); ++it){
24647 std::cout <<
"Node: " << node->unparseToString() <<
"\n" << (*it).value_ << std::endl;
24648 std::cout <<
"Parent: " << node->get_parent()->unparseToString() << std::endl;
24649 std::cout <<
"Parent, Parent: " << node->get_parent()->get_parent()->unparseToString() << std::endl;
24653 for (SynthesizedAttributesList::iterator it = synList.begin(); it != synList.end(); ++it) {
24654 if((*it).hasValue_){
24655 if (isSgAddOp(node)) {
24656 assert(synList.size() == 2);
24657 evaluatedValue.value_ = synList[0].value_ + synList[1].value_ ;
24658 evaluatedValue.hasValue_ =
true;
24659 }
else if (isSgSubtractOp(node)) {
24660 assert(synList.size() == 2);
24661 evaluatedValue.value_ = synList[0].value_ - synList[1].value_ ;
24662 evaluatedValue.hasValue_ =
true;
24663 }
else if (isSgMultiplyOp(node)) {
24664 assert(synList.size() == 2);
24665 evaluatedValue.value_ = synList[0].value_ * synList[1].value_ ;
24666 evaluatedValue.hasValue_ =
true;
24667 }
else if (isSgDivideOp(node)) {
24668 assert(synList.size() == 2);
24669 evaluatedValue.value_ = synList[0].value_ / synList[1].value_ ;
24670 evaluatedValue.hasValue_ =
true;
24671 }
else if (isSgModOp(node)) {
24672 assert(synList.size() == 2);
24673 evaluatedValue.value_ = synList[0].value_ % synList[1].value_ ;
24674 evaluatedValue.hasValue_ =
true;
24677 std::cerr <<
"Expression is not evaluatable" << std::endl;
24678 evaluatedValue.hasValue_ =
false;
24679 evaluatedValue.value_ = -1;
24680 return evaluatedValue;
24683 evaluatedValue.hasValue_ =
true;
24684 return evaluatedValue;
24687 evaluatedValue.hasValue_ =
false;
24688 evaluatedValue.value_ = -1;
24689 return evaluatedValue;
24702 class TypeEquivalenceChecker {
24704 TypeEquivalenceChecker(
bool profile,
bool useSemanticEquivalence)
24705 : profile_(profile), useSemanticEquivalence_(useSemanticEquivalence),
24706 namedType_(0), pointerType_(0), arrayType_(0), functionType_(0)
24712 if (isSgTypedefType(t)) {
24714 node = isSgTypedefType(t)->
stripType(SgType::STRIP_TYPEDEF_TYPE);
24716 if(useSemanticEquivalence_){
24717 if(isSgModifierType(t)){
24719 ROSE_ASSERT(modType != NULL);
24726 std::cout <<
"Hit volatile type, stripping of modifier type" << std::endl;
24727 node = modType->get_base_type();
24731 std::cout <<
"Hit restrict type, stripping of modifier type" << std::endl;
24732 node = modType->get_base_type();
24736 ROSE_ASSERT(node != NULL);
24741 bool equal =
false;
24742 if(t1 == NULL || t2 == NULL){
24743 std::string wasNull;
24749 std::cerr <<
"ERROR: " << wasNull <<
" was NULL" << std::endl;
24762 i != subT1.
end() && j != subT2.
end(); ++i, ++j) {
24767 nodeT1 = getBasetypeIfApplicable(nodeT1);
24768 nodeT2 = getBasetypeIfApplicable(nodeT2);
24772 if(isSgModifierType(nodeT1)){
24776 if(modT1.get_constVolatileModifier().isConst() != modT2.get_constVolatileModifier().isConst()){
24779 if(modT1.get_constVolatileModifier().isVolatile() != modT2.get_constVolatileModifier().isVolatile()){
24782 }
else if (isSgNamedType(nodeT1)) {
24786 i.skipChildrenOnForward();
24787 j.skipChildrenOnForward();
24793 if(!c1->get_autonomous_declaration()){
24796 if (!c2->get_autonomous_declaration()){
24805 }
else if (isSgPointerType(nodeT1)) {
24812 return typesAreEqual(t1->get_base_type(), t2->get_base_type());
24814 }
else if(isSgReferenceType(nodeT1)){
24818 return typesAreEqual(t1->get_base_type(), t2->get_base_type());
24819 }
else if (isSgArrayType(nodeT1)) {
24826 bool arrayBaseIsEqual = typesAreEqual(a1->get_base_type(), a2->get_base_type());
24830 bool arrayIndexExpressionIsEquivalent =
false;
24831 if(t1Index.hasValue_ && t2Index.hasValue_){
24832 if(t1Index.value_ == t2Index.value_){
24833 arrayIndexExpressionIsEquivalent =
true;
24836 bool arraysAreEqual = (arrayBaseIsEqual && arrayIndexExpressionIsEquivalent);
24837 return arraysAreEqual;
24838 }
else if (isSgFunctionType(nodeT1)) {
24846 if(typesAreEqual(funcTypeA->get_return_type(), funcTypeB->get_return_type())) {
24856 for(SgTypePtrList::const_iterator ii = funcTypeA->
get_arguments().begin(),
24863 if(!typesAreEqual((*ii), (*jj))) {
24883 std::cerr <<
"This feature for now is available with autotools only!" << std::endl;
24888int getNamedTypeCount() {
24892int getPointerTypeCount() {
24893 return pointerType_;
24896int getArrayTypeCount() {
24900int getFunctionTypeCount() {
24901 return functionType_;
24905 bool profile_, useSemanticEquivalence_;
24906 int namedType_, pointerType_, arrayType_, functionType_;
24909TypeEquivalenceChecker tec(
false,
false);
24910return tec.typesAreEqual(typeA, typeB);
24914std::set<SgStatement*>
24923 StatementTraversal() : count (0) {}
24924 void visit (
SgNode* node)
24929 returnset.insert(statement);
24935 std::set<SgStatement*> returnset;
24939 StatementTraversal traversal;
24940 traversal.traverse(node, preorder);
24942 return traversal.returnset;
24945std::set<SgStatement*>
24952 printf (
"In collectModifiedStatements(): node = %p = %s \n",node,node->
class_name().c_str());
24958 StatementTraversal() : count (0) {}
24959 void visit (
SgNode* node)
24964 returnset.insert(statement);
24970 std::set<SgStatement*> returnset;
24974 StatementTraversal traversal;
24975 traversal.traverse(node, preorder);
24977 return traversal.returnset;
24987 printf (
"In outputFileIds(): node = %p = %s \n",node,node->
class_name().c_str());
24993 LocatedNodeTraversal() {}
24994 void visit (
SgNode* node)
24997 if (locatedNode != NULL)
25000 printf (
"In outputFileIds(): isModified() == %s: locatedNode = %p = %s \n",locatedNode->
get_isModified() ?
"true" :
"false",locatedNode,locatedNode->
class_name().c_str());
25001 printf (
" --- file id = %d physical_file_id = %d \n",node->
get_file_info()->get_file_id(),node->
get_file_info()->get_physical_file_id());
25007 if (initializedName != NULL)
25009 printf (
"In outputFileIds(): isModified() == %s: initializedName = %p = %s \n",initializedName->
get_isModified() ?
"true" :
"false",initializedName,initializedName->
class_name().c_str());
25010 printf (
" --- file id = %d physical_file_id = %d \n",initializedName->
get_file_info()->get_file_id(),initializedName->
get_file_info()->get_physical_file_id());
25017 LocatedNodeTraversal traversal;
25018 traversal.traverse(node, preorder);
25021 printf (
"Exiting as a test! \n");
25027std::set<SgLocatedNode*>
25034 printf (
"In collectModifiedLocatedNodes(): node = %p = %s \n",node,node->
class_name().c_str());
25040 LocatedNodeTraversal() : count (0) {}
25041 void visit (
SgNode* node)
25044 if (locatedNode != NULL && locatedNode->
get_isModified() ==
true)
25047 printf (
"In collectModifiedLocatedNodes(): isModified() == true: locatedNode = %p = %s \n",locatedNode,locatedNode->
class_name().c_str());
25049 returnset.insert(locatedNode);
25055 std::set<SgLocatedNode*> returnset;
25059 LocatedNodeTraversal traversal;
25060 traversal.traverse(node, preorder);
25062 return traversal.returnset;
25073 printf (
"In resetModifiedLocatedNodes(): modifiedNodeSet.size() = %zu \n",modifiedNodeSet.size());
25076 std::set<SgLocatedNode*>::const_iterator i = modifiedNodeSet.begin();
25077 while (i != modifiedNodeSet.end())
25081 printf (
"Marking node = %p = %s as modified \n",node,node->
class_name().c_str());
25096 printf (
"\n\n##################################################### \n");
25097 printf (
"Report on modified statements: label = %s \n",label.c_str());
25100 if (sourceFile != NULL)
25102 printf (
" --- (SgSourceFile) filename = %s \n",sourceFile->
getFileName().c_str());
25106 SgGlobal* globalScope = isSgGlobal(node);
25107 if (globalScope != NULL)
25109 sourceFile = isSgSourceFile(globalScope->
get_parent());
25110 printf (
" --- (SgGlobal) filename = %s \n",sourceFile->
getFileName().c_str());
25114 ROSE_ASSERT(node != NULL);
25118 printf (
"In reportModifiedStatements(): collection.size() = %zu \n",collection.size());
25121 std::set<SgStatement*>::iterator i = collection.begin();
25122 while (i != collection.end())
25125 string filename = (*i)->get_file_info()->get_filename();
25128 if (filename ==
"transformation")
25131 printf (
" --- filename == transformation: sourceFile = %p using physical filename \n",sourceFile);
25134 SgSourceFile* sourceFile = TransformationSupport::getSourceFile(*i);
25135 if (sourceFile != NULL)
25141 printf (
" --- filename = %s modified statement = %p = %s \n",filename.c_str(),(*i),(*i)->class_name().c_str());
25149 printf (
"########################################################## \n");
25150 printf (
"reportModifiedStatements(): Called using label = %s \n",label.c_str());
25152 printf (
"########################################################## \n\n\n");
25155 printf (
"Exiting as a test! \n");
25156 ROSE_ASSERT(
false);
25168 printf (
"\n\n##################################################### \n");
25169 printf (
"Report on modified locatedNodes: label = %s \n",label.c_str());
25172 if (sourceFile != NULL)
25174 printf (
" --- (SgSourceFile) filename = %s \n",sourceFile->
getFileName().c_str());
25178 SgGlobal* globalScope = isSgGlobal(node);
25179 if (globalScope != NULL)
25181 sourceFile = isSgSourceFile(globalScope->
get_parent());
25182 printf (
" --- (SgGlobal) filename = %s \n",sourceFile->
getFileName().c_str());
25186 ROSE_ASSERT(node != NULL);
25190 printf (
"In reportModifiedLocatedNode(): collection.size() = %zu \n",collection.size());
25193 std::set<SgLocatedNode*>::iterator i = collection.begin();
25194 while (i != collection.end())
25197 string filename = (*i)->get_file_info()->get_filename();
25200 if (filename ==
"transformation")
25203 printf (
" --- filename == transformation: sourceFile = %p using physical filename \n",sourceFile);
25206 SgSourceFile* sourceFile = TransformationSupport::getSourceFile(*i);
25207 if (sourceFile != NULL)
25213 printf (
" --- filename = %s modified locatedNode = %p = %s \n",filename.c_str(),(*i),(*i)->class_name().c_str());
25221 printf (
"########################################################## \n");
25222 printf (
"reportModifiedLocatedNodes(): Called using label = %s \n",label.c_str());
25224 printf (
"########################################################## \n\n\n");
25227 printf (
"Exiting as a test! \n");
25228 ROSE_ASSERT(
false);
25242 ROSE_ASSERT(locatedNode != NULL);
25246 curprint (
"/* Inside of printOutComments() */");
25249 if (comments != NULL)
25252 printf (
"Found attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
class_name().c_str());
25253 curprint (
"/* Inside of printOutComments(): comments != NULL */");
25256 AttachedPreprocessingInfoType::iterator i;
25257 for (i = comments->begin(); i != comments->end(); i++)
25259 ROSE_ASSERT ( (*i) != NULL );
25260 printf (
" Attached Comment (relativePosition=%s): %s \n",
25263 PreprocessingInfo::relativePositionName((*i)->getRelativePosition()).c_str(),
25264 (*i)->getString().c_str());
25265 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
25269 (*i)->get_file_info()->display(
"comment/directive location");
25276 printf (
"In SageInterface::printOutComments(): No attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
class_name().c_str());
25286 bool returnValue =
false;
25288 ROSE_ASSERT(currentPreprocessingInfo != NULL);
25290 PreprocessingInfo::DirectiveType directive = currentPreprocessingInfo->getTypeOfDirective();
25292 if (directive == PreprocessingInfo::C_StyleComment ||
25293 directive == PreprocessingInfo::CplusplusStyleComment ||
25294 directive == PreprocessingInfo::FortranStyleComment ||
25295 directive == PreprocessingInfo::CpreprocessorBlankLine ||
25296 directive == PreprocessingInfo::ClinkageSpecificationStart ||
25297 directive == PreprocessingInfo::ClinkageSpecificationEnd)
25299 returnValue =
true;
25302 return returnValue;
25305std::vector<SgC_PreprocessorDirectiveStatement*>
25308 std::vector<SgC_PreprocessorDirectiveStatement*> directiveList;
25313 if (comments !=
nullptr)
25315 AttachedPreprocessingInfoType::iterator i;
25316 for (i = comments->begin (); i != comments->end(); i++)
25325 ROSE_ASSERT(directive != NULL);
25326 directiveList.push_back(directive);
25329 printf (
"directiveList.size() = %zu \n",directiveList.size());
25333 return directiveList;
25342 printf (
"In translateScopeToUseCppDeclarations(): declarationsOnly = %s scope = %p = %s \n",declarationsOnly ?
"true" :
"false",scope,scope->
class_name().c_str());
25344 std::map<SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> > directiveMap;
25346 if (declarationsOnly ==
true)
25350 SgDeclarationStatementPtrList::iterator i = declarationList.begin();
25351 while (i != declarationList.end())
25354 ROSE_ASSERT(declaration != NULL);
25358 printf (
"attachDirectives.size() = %zu \n",attachDirectives.size());
25360 if (attachDirectives.empty() ==
false)
25362 directiveMap.insert(std::pair<
SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> >(declaration,attachDirectives));
25374 SgStatementPtrList::iterator i = statementList.begin();
25375 while (i != statementList.end())
25378 ROSE_ASSERT(statement != NULL);
25382 printf (
"attachDirectives.size() = %zu \n",attachDirectives.size());
25384 if (attachDirectives.empty() ==
false)
25386 directiveMap.insert(std::pair<
SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> >(statement,attachDirectives));
25393 printf (
"directiveMap.size() = %zu \n",directiveMap.size());
25395 printf (
"Processing the directiveMap: \n");
25396 std::map<SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> >::iterator i = directiveMap.begin();
25397 while (i != directiveMap.end())
25400 std::vector<SgC_PreprocessorDirectiveStatement*> directives = i->second;
25402 printf (
"statement = %p = %s \n",statement,statement->
class_name().c_str());
25403 printf (
"directives.size() = %zu \n",directives.size());
25405 std::vector<SgC_PreprocessorDirectiveStatement*>::iterator j = directives.begin();
25406 while (j != directives.end())
25415 ROSE_ASSERT(comments != NULL);
25417 AttachedPreprocessingInfoType deleteList;
25422 AttachedPreprocessingInfoType::iterator k;
25423 for (k = comments->begin(); k != comments->end(); k++)
25426 ROSE_ASSERT ( (*k) != NULL );
25427 printf (
" Attached Comment (relativePosition=%s): %s\n",
25428 ((*k)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
25429 (*k)->getString().c_str());
25430 printf (
"translateScopeToUseCppDeclarations(): Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*k)->getNumberOfLines(),(*k)->getColumnNumberOfEndOfString());
25437 printf (
"Do NOT delete *k = %p = %s \n",*k,(*k)->getString().c_str());
25441 printf (
"DO delete *k = %p = %s \n",*k,(*k)->getString().c_str());
25443 deleteList.push_back(*k);
25449 printf (
"Iterate over the deleteList: deleteList.size() = %zu comments->size() = %zu \n",deleteList.size(),comments->size());
25450 AttachedPreprocessingInfoType::iterator m = deleteList.begin();
25451 while (m != deleteList.end())
25455 comments->erase(std::remove(comments->begin(), comments->end(), *m), comments->end());
25457 printf (
" --- comments->size() = %zu \n",comments->size());
25469 printf (
"Leaving translateScopeToUseCppDeclarations(): scope = %p = %s \n",scope,scope->
class_name().c_str());
25479 CppTranslationTraversal() {}
25480 void visit (
SgNode* node)
25482 printf (
"In CppTranslationTraversal::visit(): node = %p = %s \n",node,node->
class_name().c_str());
25485 SgGlobal* globalScope = isSgGlobal(scope);
25486 if (globalScope != NULL)
25488 printf (
"In CppTranslationTraversal::visit(): processing scope = %p = %s \n",scope,scope->
class_name().c_str());
25495 printf (
"In SageInterface::translateToUseCppDeclarations(): Currently skipping all but global scope! \n");
25502 CppTranslationTraversal traversal;
25504 printf (
"In translateToUseCppDeclarations(): Calling traversal.traverse() \n");
25508 traversal.traverse(n, postorder);
25510 printf (
"Leaving translateToUseCppDeclarations(): DONE: Calling traversal.traverse() \n");
25517 cout<<
"--------------"<<endl;
25521 cout<<
"file info:\t ";
25522 lnode->get_file_info()->display();
25523 cout<<
"\n unparseToString:\t ";
25524 lnode->unparseToString();
25535static void serialize(SgTemplateArgumentPtrList& plist,
string& prefix,
bool hasRemaining, ostringstream& out,
string& edgeLabel)
25538 out<< (hasRemaining?
"|---":
"|___");
25541 out<<
" "<<edgeLabel<<
" ->";
25543 out<<
"@"<<&plist<<
" "<<
"SgTemplateArgumentPtrList ";
25547 int last_non_null_child_idx =-1;
25548 for (
int i = (
int) (plist.size())-1; i>=0; i--)
25552 last_non_null_child_idx = i;
25557 for (
size_t i=0; i< plist.size(); i++ )
25559 bool n_hasRemaining=
false;
25561 if (i+1 < plist.size())
25562 n_hasRemaining=
true;
25564 if ((
int)i< last_non_null_child_idx) n_hasRemaining =
true;
25566 string suffix= hasRemaining?
"| " :
" ";
25567 string n_prefix = prefix+suffix;
25568 string n_edge_label=
"";
25570 serialize (plist[i], n_prefix, n_hasRemaining, out,n_edge_label);
25583 out<< (hasRemaining?
"|---":
"|___");
25585 out<<
" "<<edgeLabel<<
" ->";
25588 out<<
" NULL "<<endl;
25593 out<<
"@"<<node<<
" "<< node->
class_name()<<
" ";
25599 out<< lnode->get_file_info()->get_filename() <<
" "<<lnode->get_file_info()->get_line()<<
":"<<lnode->get_file_info()->get_col();
25601 AttachedPreprocessingInfoType *comments =
25602 lnode->getAttachedPreprocessingInfo ();
25604 if (comments != NULL)
25607 out<<
" AttachedPreprocessingInfoType@"<<comments;
25609 AttachedPreprocessingInfoType::iterator i;
25611 for (i = comments->begin (); i != comments->end (); i++)
25613 if (i!=comments->begin ())
25616 out<<counter++<<
" ";
25625 out<<*i<<
" classification="<<PreprocessingInfo::directiveTypeName((*i)->getTypeOfDirective ()). c_str ();
25626 out<<
" string="<<(*i)->getString ().c_str ();
25627 out<<
" relative pos=" ;
25629 if ((*i)->getRelativePosition () == PreprocessingInfo::inside)
25631 else if ((*i)->getRelativePosition () == PreprocessingInfo::before)
25645 out<<
" first nondefining decl@"<< v->get_firstNondefiningDeclaration();
25646 out<<
" defining decl@"<< v->get_definingDeclaration();
25650 out<<
" value="<< f->get_value() <<
" declaration="<<f->get_declaration() <<
" name="<< f->get_name().getString();
25657 out<<
" renamed_function "<< f->get_renamed_function();
25660 out<<
" name="<< f->get_name() <<
" renamed decl "<<f->get_renamed() ;
25672 out<<
" enumType="<< f->get_enumType();
25680 out<<
" is_general_access"<< v->get_is_general_access();
25683 out<<
" is_anonymous:"<< v->get_is_anonymous ();
25688 out<<
" is_protected"<< v->get_is_protected();
25694 out<<
" type@"<< v->get_type();
25695 out<<
" initializer@"<< v->get_initializer();
25696 out<<
" scope@"<< v->get_scope();
25702 out<<
" template class decl@"<< f->get_templateDeclaration();
25705 out<<
" assoc. class decl@"<< f->get_associatedClassDeclaration();
25709 out<<
" member function decl@"<< ctor->get_declaration();
25712 if (
SgIntVal* v= isSgIntVal(node))
25713 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25716 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25719 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25722 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25725 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25728 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25731 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25734 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25737 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25740 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25743 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25746 out<<
" init name@"<< var_ref->get_symbol()->get_declaration() <<
" symbol name="<<var_ref->get_symbol()->get_name();
25749 out<<
" member func decl@"<< func_ref->get_symbol_i()->get_declaration();
25752 out<<
" template member func decl@"<< cnode->get_templateDeclaration();
25757 out<<
" func decl@"<< sym->get_declaration() <<
" func sym name="<<sym->
get_name();
25763 out<<
" ada renaming decl@"<< renaming_decl;
25769 out<<
" base_type@"<< v->get_base_type();
25774 out<<
" base_type@"<< v->get_base_type();
25777 out<<
" base_type@"<< v->get_base_type();
25780 out<<
" type@"<< v->get_type();
25783 out<<
" attribute@"<< v->get_attribute();
25786 out<<
" namespaceDeclaration="<< v->get_namespaceDeclaration();
25792 int total_count = children.size();
25793 int current_index=0;
25796 int last_non_null_child_idx =-1;
25797 for (
int i = (
int) (children.size())-1; i>=0; i--)
25801 last_non_null_child_idx = i;
25809 if (isSgTemplateInstantiationDecl (node))
25816 SgTemplateArgumentPtrList& plist = sn->get_templateArguments();
25817 bool n_hasRemaining=
false;
25818 if (last_non_null_child_idx>-1) n_hasRemaining =
true;
25819 string suffix= hasRemaining?
"| " :
" ";
25820 string n_prefix = prefix+suffix;
25821 string n_edge_label=
"";
25822 serialize_list(plist,
"SgTemplateArgumentPtrList", n_prefix, n_hasRemaining, out, n_edge_label);
25826 SgExpressionPtrList& plist = import_stmt->get_import_list();
25827 bool n_hasRemaining=
false;
25828 if (last_non_null_child_idx>-1) n_hasRemaining =
true;
25829 string suffix= hasRemaining?
"| " :
" ";
25830 string n_prefix = prefix+suffix;
25831 string n_edge_label=
"";
25832 serialize_list(plist,
"SgExpressionPtrList", n_prefix, n_hasRemaining, out, n_edge_label);
25838 for (
size_t i =0; i< children.size(); i++)
25840 bool n_hasRemaining=
false;
25842 if (current_index+1<total_count)
25843 n_hasRemaining=
true;
25846 if ((
int)i<last_non_null_child_idx) n_hasRemaining =
true;
25848 string suffix= hasRemaining?
"| " :
" ";
25849 string n_prefix = prefix+suffix;
25851 serialize (children[i], n_prefix, n_hasRemaining, out, successorNames[i]);
25860 serialize(node, prefix,
false, oss, label);
25881 serialize(node, prefix,
false, oss, label);
25883 textfile.open(filename, ios::out);
25884 textfile<<oss.str();
25889 textfile<<
"Types encountered ...."<<endl;
25890 ostringstream oss2;
25891 VariantVector vv(V_SgType);
25892 Rose_STL_Container<SgNode*> tnodes= NodeQuery::queryMemoryPool(vv);
25893 for (Rose_STL_Container<SgNode*>::const_iterator i = tnodes.begin(); i != tnodes.end(); ++i)
25895 serialize (*i, prefix,
false, oss2, label);
25897 textfile<<oss2.str();
25905 saveToPDF(node,
string(
"temp.pdf.json") );
25911 ROSE_ASSERT(node != NULL);
25918 bool rtval =
false;
25919 ROSE_ASSERT (node != NULL);
25923 string fname = finfo->get_filenameString();
25924 string buildtree_str1 = string(
"include-staging/gcc_HEADERS");
25925 string buildtree_str2 = string(
"include-staging/g++_HEADERS");
25926 string installtree_str1 = string(
"include/edg/gcc_HEADERS");
25927 string installtree_str2 = string(
"include/edg/g++_HEADERS");
25928 string system_headers = string(
"/usr/include");
25930 if ((fname.find (buildtree_str1, 0) != string::npos) ||
25931 (fname.find (buildtree_str2, 0) != string::npos) ||
25932 (fname.find (installtree_str1, 0) != string::npos) ||
25933 (fname.find (installtree_str2, 0) != string::npos) ||
25934 (fname.find (system_headers, 0) != string::npos)
25947 bool returnValue =
false;
25950 ROSE_ASSERT(fileInfo != NULL);
25951 string filename = fileInfo->get_filenameString();
25954 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());
25959 if (EDG_ROSE_Translation::edg_include_file_map.find(filename) == EDG_ROSE_Translation::edg_include_file_map.end())
25962 printf (
"This is NOT in the EDG_ROSE_Translation::edg_include_file_map \n");
25968 printf (
"This IS in the EDG_ROSE_Translation::edg_include_file_map \n");
25970 returnValue =
true;
25973 return returnValue;
25980 ROSE_ASSERT(return_type != NULL);
25981 ROSE_ASSERT(typeList != NULL);
25983 ROSE_ASSERT(fTable);
25988 SgFunctionType* funcType = isSgFunctionType(fTable->lookup_function_type(typeName));
25998 ROSE_ASSERT (lhs != NULL);
25999 ROSE_ASSERT (rhs != NULL);
26004 SgType* rt1 = lhs->get_return_type();
26005 SgType* rt2 = rhs->get_return_type();
26012 if (f1_arg_types.size() == f2_arg_types.size())
26016 size_t counter = 0;
26019 for (
size_t i=0; i< f1_arg_types.size(); i++)
26027 if (counter == f1_arg_types.size())
26049 ROSE_ASSERT(lhs != NULL);
26050 ROSE_ASSERT(rhs != NULL);
26052 bool isSame =
false;
26055 static int counter = 0;
26057 const SgType & X = *lhs;
26058 const SgType & Y = *rhs;
26066#define DEBUG_TYPE_EQUIVALENCE 0
26068#if DEBUG_TYPE_EQUIVALENCE
26069 printf (
"In SageInterface::isEquivalentType(): evaluation of type equivalence for lhs and rhs: counter = %d \n",counter);
26074#if DEBUG_TYPE_EQUIVALENCE || 0
26077 printf (
"In SageInterface::isEquivalentType(): evaluation of type equivalence for lhs and rhs: counter = %d \n",counter);
26083#if DEBUG_TYPE_EQUIVALENCE || 0
26089 printf (
"Output of type chain for lhs: \n");
26090 for (
size_t i = 0; i < X_typeChain.size(); i++)
26092 SgType* element_type = X_typeChain[i];
26093 printf (
"X_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
26094 printf (
" --- X_element_type unparseToString: = %s \n",element_type->
unparseToString().c_str());
26096 if (modifierType != NULL)
26100 printf (
" --- type chain modifier: %s \n",s.c_str());
26101 printf (
" --- type chain modifier: unparseToString: %s \n",modifierType->
unparseToString().c_str());
26105 printf (
"Output of type chain for rhs: \n");
26106 for (
size_t i = 0; i < Y_typeChain.size(); i++)
26108 SgType* element_type = Y_typeChain[i];
26109 printf (
"Y_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
26110 printf (
" --- Y_element_type unparseToString: = %s \n",element_type->
unparseToString().c_str());
26112 if (modifierType != NULL)
26116 printf (
" --- type chain modifier: %s \n",s.c_str());
26117 printf (
" --- type chain modifier: unparseToString: %s \n",modifierType->
unparseToString().c_str());
26128 if (counter >= 280)
26131 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);
26143 printf (
"ERROR: In SageInterface::isEquivalentType(): recursive limit exceeded for : counter = %d \n",counter);
26154 SgReferenceType* X_referenceType = isSgReferenceType(X_element_type);
26155 SgReferenceType* Y_referenceType = isSgReferenceType(Y_element_type);
26157 if (X_referenceType != NULL && Y_referenceType != NULL)
26159 X_element_type = X_referenceType->get_base_type();
26160 Y_element_type = Y_referenceType->get_base_type();
26171 SgPointerType* X_pointerType = isSgPointerType(X_element_type);
26172 SgPointerType* Y_pointerType = isSgPointerType(Y_element_type);
26174 if (X_pointerType != NULL && Y_pointerType != NULL)
26176 X_element_type = X_pointerType->get_base_type();
26177 Y_element_type = Y_pointerType->get_base_type();
26188 SgArrayType* X_arrayType = isSgArrayType(X_element_type);
26189 SgArrayType* Y_arrayType = isSgArrayType(Y_element_type);
26192 if (X_arrayType != NULL && Y_arrayType != NULL)
26194 X_element_type = X_arrayType->get_base_type();
26195 Y_element_type = Y_arrayType->get_base_type();
26197 SgExpression* X_array_index_expression = X_arrayType->get_index();
26198 SgExpression* Y_array_index_expression = Y_arrayType->get_index();
26200 if (X_array_index_expression == Y_array_index_expression)
26202#if DEBUG_TYPE_EQUIVALENCE || 0
26203 printf (
"In SageInterface::isEquivalentType(): counter = %d: Need to check the array size for static equivalence \n",counter);
26214#if DEBUG_TYPE_EQUIVALENCE || 0
26215 printf (
"In SageInterface::isEquivalentType(): counter = %d Need more complex test for expression equivalence \n",counter);
26218 printf (
" --- array index expressions: str1 = %s str2 = %s \n",str1.c_str(),str2.c_str());
26230 SgNonrealType* X_templateType = isSgNonrealType(X_element_type);
26231 SgNonrealType* Y_templateType = isSgNonrealType(Y_element_type);
26234 if (X_templateType != NULL && Y_templateType != NULL)
26236 string X_name = X_templateType->
get_name();
26237 string Y_name = Y_templateType->
get_name();
26239 SgNonrealDecl* X_templateDecl = isSgNonrealDecl(X_templateType->get_declaration());
26240 ROSE_ASSERT(X_templateDecl != NULL);
26241 SgNonrealDecl* Y_templateDecl = isSgNonrealDecl(Y_templateType->get_declaration());
26242 ROSE_ASSERT(Y_templateDecl != NULL);
26244 int X_template_parameter_position = X_templateDecl->get_template_parameter_position();
26245 int Y_template_parameter_position = Y_templateDecl->get_template_parameter_position();
26250#if DEBUG_TYPE_EQUIVALENCE
26253 printf (
"In SageInterface::isEquivalentType(): case SgNonrealType:\n");
26254 printf (
" -- X_name = %s Y_name = %s\n", X_name.c_str(),Y_name.c_str());
26255 printf (
" -- X_template_parameter_position = %d Y_template_parameter_position = %d\n", X_template_parameter_position,Y_template_parameter_position);
26256 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() :
"");
26257 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() :
"");
26258 printf (
" -- X_templateDecl->get_mangled_name() = %s\n", X_templateDecl->get_mangled_name().str());
26259 printf (
" -- Y_templateDecl->get_mangled_name() = %s\n", Y_templateDecl->get_mangled_name().str());
26261 bool value = (X_parent == Y_parent);
26263 if (value && X_templateDecl->get_is_template_param() && Y_templateDecl->get_is_template_param()) {
26264 value = (X_template_parameter_position == Y_template_parameter_position);
26265 }
else if (value && X_templateDecl->get_is_class_member() && Y_templateDecl->get_is_class_member()) {
26266 value = (X_name == Y_name);
26278 printf (
"Nothing to do here since we have explored all uniform pairs of intermediate types possible: isSame = %s \n",isSame ?
"true" :
"false");
26284#if DEBUG_TYPE_EQUIVALENCE
26285 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");
26292 SgModifierType* X_modifierType = isSgModifierType(X_element_type);
26293 SgModifierType* Y_modifierType = isSgModifierType(Y_element_type);
26295#if DEBUG_TYPE_EQUIVALENCE
26296 printf (
"In SageInterface::isEquivalentType(): counter = %d: type chain X_element_type = %p = %s Y_element_type = %p = %s \n",
26297 counter,X_element_type,X_element_type->
class_name().c_str(),Y_element_type,Y_element_type->
class_name().c_str());
26300 if (X_modifierType != NULL && Y_modifierType != NULL)
26303#if DEBUG_TYPE_EQUIVALENCE
26304 printf (
"In SageInterface::isEquivalentType(): loop: these are the both SgModifierType nodes: isSame = %s \n",isSame ?
"true" :
"false");
26306 if (X_modifierType == Y_modifierType)
26309#if DEBUG_TYPE_EQUIVALENCE
26310 printf (
"In SageInterface::isEquivalentType(): loop: these are the same modifier type: isSame = %s \n",isSame ?
"true" :
"false");
26317#if DEBUG_TYPE_EQUIVALENCE
26318 printf (
"In SageInterface::isEquivalentType(): loop: these are equivalent modifiers: check the base type: isSame = %s \n",isSame ?
"true" :
"false");
26322 isSame =
isEquivalentType(X_modifierType->get_base_type(),Y_modifierType->get_base_type());
26326#if DEBUG_TYPE_EQUIVALENCE
26327 printf (
"In SageInterface::isEquivalentType(): loop: these are not equivalent modifier types: check for default settings: isSame = %s \n",isSame ?
"true" :
"false");
26330 bool skippingOverIdentityModifier =
false;
26334#if DEBUG_TYPE_EQUIVALENCE
26335 printf (
"In SageInterface::isEquivalentType(): loop: found self-similar setting for lhs: isSame = %s \n",isSame ?
"true" :
"false");
26337 X_element_type = X_modifierType->get_base_type();
26340 skippingOverIdentityModifier =
true;
26345#if DEBUG_TYPE_EQUIVALENCE
26346 printf (
"In SageInterface::isEquivalentType(): loop: found self-similar setting for rhs: isSame = %s \n",isSame ?
"true" :
"false");
26348 Y_element_type = Y_modifierType->get_base_type();
26351 skippingOverIdentityModifier =
true;
26355#if DEBUG_TYPE_EQUIVALENCE
26356 printf (
"In SageInterface::isEquivalentType(): loop: skippingOverIdentityModifier = %s \n",skippingOverIdentityModifier ?
"true" :
"false");
26361 if (skippingOverIdentityModifier ==
true)
26363#if DEBUG_TYPE_EQUIVALENCE
26364 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");
26373#if DEBUG_TYPE_EQUIVALENCE
26374 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");
26378#if DEBUG_TYPE_EQUIVALENCE
26379 printf (
"In SageInterface::isEquivalentType(): loop: these are different modifier types: after recursive call to compare base types: isSame = %s \n",isSame ?
"true" :
"false");
26388 if (X_modifierType != NULL || Y_modifierType != NULL)
26390 bool isReduceable =
false;
26392 if (X_modifierType != NULL && X_modifierType->
get_typeModifier().isIdentity() ==
true)
26394#if DEBUG_TYPE_EQUIVALENCE
26395 printf (
"In SageInterface::isEquivalentType(): loop: found default setting for lhs: isSame = %s \n",isSame ?
"true" :
"false");
26397 X_element_type = X_modifierType->get_base_type();
26398 isReduceable =
true;
26401 if (Y_modifierType != NULL && Y_modifierType->
get_typeModifier().isIdentity() ==
true)
26403#if DEBUG_TYPE_EQUIVALENCE
26404 printf (
"In SageInterface::isEquivalentType(): loop: found default setting for rhs: isSame = %s \n",isSame ?
"true" :
"false");
26406 Y_element_type = Y_modifierType->get_base_type();
26407 isReduceable =
true;
26411#if DEBUG_TYPE_EQUIVALENCE
26412 printf (
"In SageInterface::isEquivalentType(): loop: these are different modifier types: after recursive call to compare base types: isReduceable = %s \n",isReduceable ?
"true" :
"false");
26414 if (isReduceable ==
true)
26426#if DEBUG_TYPE_EQUIVALENCE
26427 printf (
"In SageInterface::isEquivalentType(): loop: these are different modifier types: after recursive call to compare base types: isReduceable = %s isSame = %s \n",
26428 isReduceable ?
"true" :
"false",isSame ?
"true" :
"false");
26437 if (X_element_type == Y_element_type)
26440#if DEBUG_TYPE_EQUIVALENCE || 0
26442 printf (
"In SageInterface::isEquivalentType(): resolved to equal types: isSame = %s lhs = %p = %s rhs = %p = %s \n",
26445#if DEBUG_TYPE_EQUIVALENCE || 0
26448 const SgTypedefType* lhs_typedefType = isSgTypedefType(lhs);
26449 const SgTypedefType* rhs_typedefType = isSgTypedefType(rhs);
26451 if (lhs_typedefType != NULL || rhs_typedefType != NULL)
26454 if (lhs_typedefType != NULL)
26456 printf (
"lhs was a typedef: lhs = %p = %s \n",lhs,lhs->
unparseToString().c_str());
26458 if (rhs_typedefType != NULL)
26460 printf (
"rhs was a typedef: rhs = %p = %s \n",rhs,rhs->
unparseToString().c_str());
26463 printf (
" --- one was a typedef: lhs = %p = %s \n",lhs,lhs->
unparseToString().c_str());
26464 printf (
" --- one was a typedef: rhs = %p = %s \n",rhs,rhs->
unparseToString().c_str());
26475 SgReferenceType* X_referenceType = isSgReferenceType(X_element_type);
26476 SgReferenceType* Y_referenceType = isSgReferenceType(Y_element_type);
26478 if (X_referenceType != NULL || Y_referenceType != NULL)
26481 if (X_referenceType != NULL)
26483 X_element_type = X_referenceType->get_base_type();
26487 isReduceable =
false;
26490 if (Y_referenceType != NULL)
26492 Y_element_type = Y_referenceType->get_base_type();
26496 isReduceable =
false;
26499 if (isReduceable ==
true)
26520#if DEBUG_TYPE_EQUIVALENCE
26521 printf (
"In SageInterface::isEquivalentType(): loop: evaluation of inner types: isSame = %s \n",isSame ?
"true" :
"false");
26525 SgPointerType* X_pointerType = isSgPointerType(X_element_type);
26526 SgPointerType* Y_pointerType = isSgPointerType(Y_element_type);
26528 if (X_pointerType != NULL || Y_pointerType != NULL)
26531 if (X_pointerType != NULL)
26533 X_element_type = X_pointerType->get_base_type();
26537 isReduceable =
false;
26540 if (Y_pointerType != NULL)
26542 Y_element_type = Y_pointerType->get_base_type();
26546 isReduceable =
false;
26549 if (isReduceable ==
true)
26570#if DEBUG_TYPE_EQUIVALENCE
26571 printf (
"In SageInterface::isEquivalentType(): loop: evaluation of inner types: isSame = %s \n",isSame ?
"true" :
"false");
26575 SgArrayType* X_arrayType = isSgArrayType(X_element_type);
26576 SgArrayType* Y_arrayType = isSgArrayType(Y_element_type);
26578 if (X_arrayType != NULL || Y_arrayType != NULL)
26581 if (X_arrayType != NULL)
26583 X_element_type = X_arrayType->get_base_type();
26587 isReduceable =
false;
26590 if (Y_arrayType != NULL)
26592 Y_element_type = Y_arrayType->get_base_type();
26596 isReduceable =
false;
26599 if (isReduceable ==
true)
26620#if DEBUG_TYPE_EQUIVALENCE
26621 printf (
"In SageInterface::isEquivalentType(): loop: evaluation of inner types: isSame = %s \n",isSame ?
"true" :
"false");
26625 SgFunctionType* X_functionType = isSgFunctionType(X_element_type);
26626 SgFunctionType* Y_functionType = isSgFunctionType(Y_element_type);
26628 if (X_functionType != NULL || Y_functionType != NULL)
26630 bool value = ( (X_functionType != NULL && Y_functionType != NULL) && (X_functionType == Y_functionType) );
26633#if DEBUG_TYPE_EQUIVALENCE || 0
26634 printf (
"In SageInterface::isEquivalentType(): loop: Process case of SgFunctionType: value = %s \n",value ?
"true" :
"false");
26652 if (X_memberFunctionType != NULL || Y_memberFunctionType != NULL)
26655 printf (
"This should be unreachable code \n");
26659 bool value = ( (X_memberFunctionType != NULL && Y_memberFunctionType != NULL) && (X_memberFunctionType == Y_memberFunctionType) );
26660#if DEBUG_TYPE_EQUIVALENCE || 0
26661 printf (
"In SageInterface::isEquivalentType(): loop: Process case of SgMemberFunctionType: value = %s \n",value ?
"true" :
"false");
26674 bool X_isReduceable =
true;
26675 if (isSgTypeSignedLong(X_element_type) != NULL ||
26676 isSgTypeUnsignedInt(X_element_type) != NULL ||
26677 isSgTypeBool(X_element_type) != NULL ||
26678 isSgTypeInt(X_element_type) != NULL)
26680 X_isReduceable =
false;
26683 bool Y_isReduceable =
true;
26684 if (isSgTypeSignedLong(Y_element_type) != NULL ||
26685 isSgTypeUnsignedInt(Y_element_type) != NULL ||
26686 isSgTypeBool(Y_element_type) != NULL ||
26687 isSgTypeInt(Y_element_type) != NULL)
26689 Y_isReduceable =
false;
26691#if DEBUG_TYPE_EQUIVALENCE || 0
26692 printf (
"In SageInterface::isEquivalentType(): loop: Process default case: X_isReduceable = %s Y_isReduceable = %s \n",
26693 X_isReduceable ?
"true" :
"false",Y_isReduceable ?
"true" :
"false");
26695 if (X_isReduceable ==
true || Y_isReduceable ==
true)
26709#if DEBUG_TYPE_EQUIVALENCE || 0
26710 printf (
"In SageInterface::isEquivalentType(): loop: Process default case: X_element_type = %p = %s Y_element_type = %p = %s \n",
26711 X_element_type,X_element_type->
class_name().c_str(),Y_element_type,Y_element_type->
class_name().c_str());
26716 isSame = (X_element_type == Y_element_type);
26736#if DEBUG_TYPE_EQUIVALENCE || 0
26737 printf (
"In SageInterface::isEquivalentType(): isSame = %s \n",isSame ?
"true" :
"false");
26740#if DEBUG_TYPE_EQUIVALENCE || 0
26741 if (counter == 1 && isSame ==
true)
26743 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());
26750 printf (
" --- Output of type chain for lhs: \n");
26751 for (
size_t i = 0; i < X_typeChain.size(); i++)
26753 SgType* element_type = X_typeChain[i];
26754 printf (
" --- --- X_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
26756 if (modifierType != NULL)
26760 printf (
" --- type chain modifier: %s \n",s.c_str());
26764 printf (
" --- Output of type chain for rhs: \n");
26765 for (
size_t i = 0; i < Y_typeChain.size(); i++)
26767 SgType* element_type = Y_typeChain[i];
26768 printf (
" --- --- Y_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
26770 if (modifierType != NULL)
26774 printf (
" --- --- type chain modifier: %s \n",s.c_str());
26783 if (isSame ==
true)
26786 printf (
" --- isSame = %s \n",isSame ?
"true" :
"false");
26789 printf (
" --- --- X_element_type = %p = %s = %s \n",X_element_type,X_element_type->
class_name().c_str(),X_element_type->
unparseToString().c_str());
26790 printf (
" --- --- Y_element_type = %p = %s = %s \n",Y_element_type,Y_element_type->
class_name().c_str(),Y_element_type->
unparseToString().c_str());
26795 printf (
" --- isSame = %s \n",isSame ?
"true" :
"false");
26800 printf (
" --- counter = %d \n",counter);
26817 bool retval =
false;
26826 retval = function->get_marked_as_edg_normalization();
26834 if (templateInstantiationFunction != NULL)
26839 if (templateFunctionDeclaration != NULL)
26850 printf (
" --- case of templateInstantiationFunction: retval = %s \n",retval ?
"true" :
"false");
26855 if (templateInstantiationMemberFunction != NULL)
26858 templateInstantiationMemberFunction = isSgTemplateInstantiationMemberFunctionDecl(templateInstantiationMemberFunction->
get_firstNondefiningDeclaration());
26860 if (templateMemberFunctionDeclaration != NULL)
26871 printf (
" --- case of templateInstantiationMemberFunction: retval = %s \n",retval ?
"true" :
"false");
26883 printf(
"In detectCycleInType():\n");
26884 printf(
" -- from = %s\n", from.c_str());
26885 printf(
" -- type = %p (%s)\n", type, type->
class_name().c_str());
26887 std::vector<SgType *> seen_types;
26889 while (type != NULL) {
26892 ROSE_ASSERT(type != NULL);
26894 std::vector<SgType *>::const_iterator it = std::find(seen_types.begin(), seen_types.end(), type);
26895 if (it != seen_types.end()) {
26896 printf(
"ERROR: Cycle found in type = %p (%s):\n", type, type->
class_name().c_str());
26898 for (; it != seen_types.end(); it++) {
26899 printf(
" [%zd] %p (%s)\n", i, *it, (*it)->class_name().c_str());
26902 printf(
"-> detectCycleInType() was called from: %s\n", from.c_str());
26905 seen_types.push_back(type);
26915 if (isSgPointerMemberType(type) != NULL)
26922 type = modType->get_base_type();
26923 }
else if ( refType ) {
26924 type = refType->get_base_type();
26925 }
else if ( pointType ) {
26926 type = pointType->get_base_type();
26929 }
else if ( arrayType ) {
26930 type = arrayType->get_base_type();
26931 }
else if ( typedefType ) {
26936 ROSE_ASSERT(type != NULL);
26957 std::vector<SgFunctionDeclaration*> functionList;
26960 string filenameWithPath;
26963 TransformFunctionDefinitionsTraversal(): sourceFile(NULL), sourceFileId(-99) {}
26965 void visit (
SgNode* node)
26968 printf (
"In convertFunctionDefinitionsToFunctionPrototypes visit(): node = %p = %s \n",node,node->
class_name().c_str());
26971 if (temp_sourceFile != NULL)
26973 sourceFile = temp_sourceFile;
26977 filenameWithPath = sourceFile->get_sourceFileNameWithPath();
26979 printf (
"Found source file: id = %d name = %s \n",sourceFileId,sourceFile->get_sourceFileNameWithPath().c_str());
26984 if (functionDeclaration != NULL)
26987 ROSE_ASSERT(sourceFile != NULL);
26990 if (functionDeclaration == definingFunctionDeclaration)
26993 printf (
"Found a defining function declaration: functionDeclaration = %p = %s name = %s \n",
26994 functionDeclaration,functionDeclaration->
class_name().c_str(),functionDeclaration->get_name().str());
26996 printf (
" --- recorded source file: id = %d name = %s \n",sourceFileId,sourceFile->get_sourceFileNameWithPath().c_str());
26997 printf (
" --- source file: file_info: id = %d name = %s \n",
27002 bool isInSourceFile = (filenameWithPath == functionDeclaration->
get_file_info()->get_filenameString());
27004 printf (
" --- isInSourceFile = %s \n",isInSourceFile ?
"true" :
"false");
27008 if (isInSourceFile ==
true && functionDeclarationScope != NULL)
27011 printf (
" --- Found a defining function declaration: functionDeclarationScope = %p = %s \n",
27012 functionDeclarationScope,functionDeclarationScope->
class_name().c_str());
27016 functionList.push_back(functionDeclaration);
27024 TransformFunctionDefinitionsTraversal traversal;
27025 traversal.traverse(node, preorder);
27027 std::vector<SgFunctionDeclaration*> & functionList = traversal.functionList;
27030 printf (
"In convertFunctionDefinitionsToFunctionPrototypes(): functionList.size() = %zu \n",functionList.size());
27033 std::vector<SgFunctionDeclaration*>::iterator i = functionList.begin();
27034 while (i != functionList.end())
27037 ROSE_ASSERT(functionDeclaration != NULL);
27040 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27043 printf (
" --- Removing function declaration: functionDeclaration = %p = %s name = %s \n",
27044 functionDeclaration,functionDeclaration->
class_name().c_str(),functionDeclaration->get_name().str());
27054 printf (
"In convertFunctionDefinitionsToFunctionPrototypes(): exiting as a test! \n");
27065 ROSE_ASSERT(scope != NULL);
27067 printf (
"Output the statements in scope = %p = %s \n",scope,scope->
class_name().c_str());
27071 for (
size_t i = 0; i < statementList.size(); i++)
27078 printf (
"Exiting as a test at the end of evaluation of global scope! \n");
27091 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration = %p = %s name = %s \n",
27092 functionDeclaration,functionDeclaration->
class_name().c_str(),functionDeclaration->get_name().str());
27096 bool isConstructor =
false;
27098 if (tmp_memberFunctionDeclaration != NULL)
27100 isConstructor = tmp_memberFunctionDeclaration->get_specialFunctionModifier().isConstructor();
27103 if (isConstructor ==
true)
27105 printf (
"Skipping case of constructors (in building prototype from defining function declaration) \n");
27115 SgName name = functionDeclaration->get_name();
27116 SgType* return_type = functionDeclaration->get_type()->get_return_type();
27124 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration = %p \n",functionDeclaration);
27125 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration->get_firstNondefiningDeclaration() = %p \n",functionDeclaration->
get_firstNondefiningDeclaration());
27126 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration->get_definingDeclaration() = %p \n",functionDeclaration->
get_definingDeclaration());
27130 for (
size_t i = 0; i < functionDeclaration->get_args().size(); i++)
27134 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration->get_args(): (i = %zu) arg = %p = %s isDefaultArgument = %s \n",
27135 i,arg,arg->get_name().str(),arg->
get_file_info()->isDefaultArgument() ?
"true" :
"false");
27136 printf (
" --- arg->get_initializer() = %p \n",arg->get_initializer());
27140 printf (
"NOTE: default argument (i = %zu) not reproduced in function prototype: arg = %p = %s \n",i,arg,arg->get_name().str());
27153 if (templateInstantiationFunctionDecl == NULL)
27160 if (templateInstantiationMemberFunctionDecl == NULL)
27169 bool isTemplateInstantiationMemberFunctionDecl =
false;
27174 bool buildTemplateInstantiation =
false;
27175 SgTemplateArgumentPtrList* templateArgumentsList = NULL;
27180 ROSE_ASSERT(param_list == NULL || param_list->
get_parent() == NULL);
27182 switch (functionDeclaration->
variantT())
27184 case V_SgTemplateMemberFunctionDeclaration:
27187 printf (
"This function to replace the defining declaration with a non-defining declaration does not yet support template member functions \n");
27190 ROSE_ASSERT(original_templateMemberFunctionDeclaration != NULL);
27194 unsigned int functionConstVolatileFlags = 0;
27196 ROSE_ASSERT(original_templateMemberFunctionDeclaration->get_type() != NULL);
27201 SgMemberFunctionType* memberFunctionType = isSgMemberFunctionType(original_templateMemberFunctionDeclaration->get_type());
27202 ROSE_ASSERT(memberFunctionType != NULL);
27204 functionConstVolatileFlags = memberFunctionType->get_mfunc_specifier();
27210 SgTemplateParameterPtrList templateParameterList = original_templateMemberFunctionDeclaration->get_templateParameters();
27213 templateMemberFunctionDeclaration =
27216 printf (
"ERROR: Template functions are not yet supported! \n");
27219 nondefiningFunctionDeclaration = templateMemberFunctionDeclaration;
27221 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27224 if (isConstructor ==
true)
27226 templateMemberFunctionDeclaration->get_specialFunctionModifier().setConstructor();
27232 case V_SgTemplateFunctionDeclaration:
27235 printf (
"This function to replace the defining declaration with a non-defining declaration does not yet support template functions \n");
27238 ROSE_ASSERT(original_templateFunctionDeclaration != NULL);
27246 SgTemplateParameterPtrList templateParameterList = original_templateFunctionDeclaration->get_templateParameters();
27250 printf (
"ERROR: Template functions are not yet supported! \n");
27253 nondefiningFunctionDeclaration = templateFunctionDeclaration;
27255 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27261 case V_SgTemplateInstantiationMemberFunctionDecl:
27263 buildTemplateInstantiation =
true;
27265 isTemplateInstantiationMemberFunctionDecl =
true;
27268 ROSE_ASSERT(templateInstantiationMemberFunctionDecl != NULL);
27271 printf (
"name from functionDeclaration->get_name(): name = %s \n",name.str());
27273 printf (
"name from templateInstantiationMemberFunctionDecl->get_templateName(): template_name = %s \n",templateInstantiationMemberFunctionDecl->
get_templateName().str());
27275 if (templateDeclaration != NULL)
27277 printf (
"name from templateInstantiationMemberFunctionDecl->get_template_declaration()->get_name(): template_name = %s \n",templateDeclaration->get_name().str());
27278 printf (
"name from templateInstantiationMemberFunctionDecl->get_template_declaration()->get_template_name(): template_name = %s \n",templateDeclaration->
get_template_name().str());
27285 printf (
"In case V_SgTemplateInstantiationMemberFunctionDecl: using name = %s \n",name.str());
27290 case V_SgMemberFunctionDeclaration:
27293 printf (
"This function to replace the defining declaration with a non-defining declaration does not yet support member functions \n");
27296 ROSE_ASSERT(original_memberFunctionDeclaration != NULL);
27304 unsigned int functionConstVolatileFlags = 0;
27306 ROSE_ASSERT(original_memberFunctionDeclaration->get_type() != NULL);
27315 bool buildPrototype = isTemplateInstantiationMemberFunctionDecl || original_memberFunctionDeclaration->
get_parent() == original_memberFunctionDeclaration->
get_scope();
27317 printf (
"In SageInterface::buildFunctionPrototype(): buildPrototype = %s \n",buildPrototype ?
"true" :
"false");
27319 if (buildPrototype ==
true)
27321 SgMemberFunctionType* memberFunctionType = isSgMemberFunctionType(original_memberFunctionDeclaration->get_type());
27322 ROSE_ASSERT(memberFunctionType != NULL);
27324 printf (
"original_memberFunctionDeclaration->get_parent() == original_memberFunctionDeclaration->get_scope() \n");
27326 functionConstVolatileFlags = memberFunctionType->get_mfunc_specifier();
27328 memberFunctionDeclaration =
27330 ( name, return_type, param_list, scope, python_decoratorList, functionConstVolatileFlags,
27331 buildTemplateInstantiation,templateArgumentsList );
27333 printf (
"ERROR: Member functions are not yet supported! \n");
27337 if (isConstructor ==
true)
27339 memberFunctionDeclaration->get_specialFunctionModifier().setConstructor();
27342 nondefiningFunctionDeclaration = memberFunctionDeclaration;
27344 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27350 printf (
"NOTE: Member functions defined outside of their class can not be output as member function prototypes (not allowed in C++) \n");
27354 nondefiningFunctionDeclaration = NULL;
27356 nondefiningFunctionDeclaration = NULL;
27358 replaceWithEmptyDeclaration =
true;
27360 ROSE_ASSERT(emptyDeclaration != NULL);
27369 printf (
"Exiting as a test! \n");
27379 case V_SgFunctionDeclaration:
27382 nondefiningFunctionDeclaration =
buildNondefiningFunctionDeclaration (name, return_type, param_list, scope, python_decoratorList, buildTemplateInstantiation,templateArgumentsList);
27383 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27388 case V_SgTemplateInstantiationFunctionDecl:
27391 buildTemplateInstantiation =
true;
27393 ROSE_ASSERT(templateInstantiationFunctionDecl != NULL);
27396 printf (
"name from functionDeclaration->get_name(): name = %s \n",name.str());
27398 printf (
"name from templateInstantiationFunctionDecl->get_templateName(): template_name = %s \n",templateInstantiationFunctionDecl->
get_templateName().str());
27400 if (templateDeclaration != NULL)
27402 printf (
"name from templateInstantiationFunctionDecl->get_template_declaration()->get_name(): template_name = %s \n",templateDeclaration->get_name().str());
27403 printf (
"name from templateInstantiationFunctionDecl->get_template_declaration()->get_template_name(): template_name = %s \n",templateDeclaration->
get_template_name().str());
27408 printf (
"In case V_SgTemplateInstantiationFunctionDecl: using name = %s \n",name.str());
27410 nondefiningFunctionDeclaration =
buildNondefiningFunctionDeclaration (name, return_type, param_list, scope, python_decoratorList, buildTemplateInstantiation,templateArgumentsList);
27411 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27430 ROSE_ASSERT(param_list == NULL || param_list->
get_parent() != NULL);
27436 if (nondefiningFunctionDeclaration != NULL)
27441 printf (
"Setting the firstNondefiningDeclaration \n");
27449 printf (
"Setting the definingDeclaration \n");
27458 if (nondefiningFunctionDeclaration != NULL)
27468 return nondefiningFunctionDeclaration;
27477 ROSE_ASSERT(functionDeclaration != NULL);
27480 printf (
"****************************************************************** \n");
27481 printf (
"Attached comments and CPP directives: defining functionDeclaration \n");
27483 printf (
"****************************************************************** \n");
27491 if (nondefiningFunctionDeclaration != NULL)
27502 if (templateInstantiationFunctionDecl == NULL)
27504 if (nondefiningFunctionDeclaration != NULL)
27507 nondefiningFunctionDeclaration->get_declarationModifier() = functionDeclaration->get_declarationModifier();
27510 nondefiningFunctionDeclaration->get_functionModifier() = functionDeclaration->get_functionModifier();
27511 nondefiningFunctionDeclaration->get_specialFunctionModifier() = functionDeclaration->get_specialFunctionModifier();
27513 nondefiningFunctionDeclaration->set_linkage( functionDeclaration->get_linkage() );
27514 nondefiningFunctionDeclaration->set_externBrace( functionDeclaration->get_externBrace() );
27516 ROSE_ASSERT(nondefiningFunctionDeclaration->get_forward() ==
true);
27519 int file_id = functionDeclaration->
get_file_info()->get_physical_file_id();
27520 nondefiningFunctionDeclaration->
get_file_info()->set_physical_file_id(file_id);
27536 ROSE_ASSERT(nondefiningFunctionDeclaration->
get_parent() != NULL);
27542 nondefiningFunctionDeclaration = NULL;
27546 if (functionDeclaration->get_declarationModifier().get_storageModifier().
isStatic() ==
true)
27548 ROSE_ASSERT(nondefiningFunctionDeclaration->get_declarationModifier().get_storageModifier().
isStatic() ==
true);
27552 return nondefiningFunctionDeclaration;
27556std::vector<SgFunctionDeclaration*>
27568 std::vector<SgFunctionDeclaration*> functionList;
27569 FunctionDefinitionsTraversal() {}
27571 void visit (
SgNode* node)
27574 if (functionDeclaration != NULL)
27580 if (functionDeclaration == definingFunctionDeclaration)
27584 if (functionDeclarationScope != NULL)
27586 functionList.push_back(functionDeclaration);
27594 FunctionDefinitionsTraversal traversal;
27596 traversal.traverseWithinFile(node, preorder);
27598 std::vector<SgFunctionDeclaration*> & functionList = traversal.functionList;
27600 return functionList;
27607 ROSE_ASSERT(node != NULL);
27610 std::vector<SgFunctionDeclaration*>::iterator i = functionList.begin();
27612 while (i != functionList.end())
27615 ROSE_ASSERT(functionDeclaration != NULL);
27633 ROSE_ASSERT(node !=
nullptr);
27639 void visit (
SgNode* node)
27642 if (variableDeclaration != NULL)
27645 SgExpression* initializer = initializedName->get_initializer();
27647 printf (
"variableDeclaration = %p initializedName = %p = %s initializer = %p \n",
27648 variableDeclaration,initializedName,initializedName->get_name().str(),initializer);
27650 if (initializer != NULL)
27652 printf (
" --- initializer = %s \n",initializer->
class_name().c_str());
27659 CheckInitializerTraversal traversal;
27660 traversal.traverse(node, preorder);
27668 void setResult(
SgType*) { }
27670 void handle(
SgNode& n,
SgNode&) { SG_UNEXPECTED_NODE(n); }
27672 template <
class SageDeclarationStatement>
27678 setResult(n.get_type());
27681 template <
class SageNode>
27682 void handle(SageNode& n)
27695 SgGlobal * gsaf = project->get_globalScopeAcrossFiles();
27696 ROSE_ASSERT(gsaf !=
nullptr);
27698 ROSE_ASSERT(st !=
nullptr);
27700 ROSE_ASSERT(hmm !=
nullptr);
27704 ROSE_ASSERT(st !=
nullptr);
27705 hmm = st->get_table();
27706 ROSE_ASSERT(hmm !=
nullptr);
27710 ROSE_ASSERT(st !=
nullptr);
27711 hmm = st->get_table();
27712 ROSE_ASSERT(hmm !=
nullptr);
27732 int match_count = 0;
27733 ROSE_ASSERT (root);
27737 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(root, V_SgArrowExp);
27741 boost::unordered::unordered_map <SgNode*, bool> visited;
27744 for (Rose_STL_Container<SgNode *>::reverse_iterator i = nodeList.rbegin(); i != nodeList.rend(); i++)
27747 if (visited.count(*i)==1)
27756 cerr<<
"SageInterface::normalizeArrowExpWithAddressOfLeftOperand() expects SgArrowExp while encountering "<<(*i)->class_name()<<
"@"<<(*i) <<endl;
27757 ROSE_ASSERT (a_exp);
27760 if (transformationGeneratedOnly)
27768 if (
SgVarRefExp* left = isSgVarRefExp(address_op->get_operand()))
27781 return match_count;
27791 Traversal() : found(
false) {}
27792 void visit (
SgNode* node)
27794 SgCastExp* castExpression = isSgCastExp(node);
27795 if (castExpression != NULL)
27799 if (initializer == NULL)
27804 printf (
" --- Found a SgCastExp marked as a transformation: castExpression = %p \n",castExpression);
27807 printf (
"Exiting as a test! \n");
27808 ROSE_ASSERT(
false);
27814 printf (
" --- SgCastExp (but not marked as a transformation) node = %p = %s \n",node,node->
class_name().c_str());
27822 printf (
" --- SgCastExp (but from an initializer) node = %p = %s \n",node,node->
class_name().c_str());
27829 printf (
" --- node = %p = %s \n",node,node->
class_name().c_str());
27836 printf (
"In findFirstSgCastExpMarkedAsTransformation(): s = %s \n",s.c_str());
27840 Traversal traversal;
27841 traversal.traverse(n, preorder);
27844 printf (
"In findFirstSgCastExpMarkedAsTransformation(): s = %s traversal.found = %s \n",s.c_str(),traversal.found ?
"true" :
"false");
27848 if (traversal.found ==
true)
27850 printf (
"In findFirstSgCastExpMarkedAsTransformation(): returning false \n");
27855 return traversal.found;
27866 ROSE_ASSERT (info != NULL);
27867 PreprocessingInfo::DirectiveType dtype= info->getTypeOfDirective();
27868 if (dtype == PreprocessingInfo::CpreprocessorIfdefDeclaration ||
27869 dtype == PreprocessingInfo::CpreprocessorIfndefDeclaration ||
27870 dtype == PreprocessingInfo::CpreprocessorIfDeclaration )
27874 else if (dtype==PreprocessingInfo::CpreprocessorElseDeclaration||
27875 dtype==PreprocessingInfo::CpreprocessorElifDeclaration)
27879 else if (dtype==PreprocessingInfo::CpreprocessorEndifDeclaration)
27888static void moveInofListToNewPlace(AttachedPreprocessingInfoType* infoList,
int cidx, set <AttachedPreprocessingInfoType*>& relatedInfoList,
SgLocatedNode* lnode,
int &retVal)
27893 relatedInfoList.insert (infoList);
27897 info->setRelativePosition(PreprocessingInfo::after);
27904 (*infoList)[cidx]= NULL;
27911 ROSE_ASSERT(lnode);
27917 vector < pair< AttachedPreprocessingInfoType*, int> > empty_entries;
27918 for(;ast_i!=ast.
end();++ast_i) {
27920 if (current ==NULL )
27924 if (infoList == NULL)
continue;
27926 int commentIndex=0;
27927 for (Rose_STL_Container<PreprocessingInfo*>::iterator ci = (*infoList).begin(); ci != (*infoList).end(); ci++)
27933 empty_entries.push_back( make_pair (infoList, commentIndex) );
27939 for (
auto ki = empty_entries.rbegin(); ki != empty_entries.rend(); ki ++)
27941 AttachedPreprocessingInfoType* infoList = (*ki).first;
27942 int cidx= (*ki).second;
27945 ROSE_ASSERT (info==NULL);
27948 AttachedPreprocessingInfoType::iterator k = infoList->begin();
27949 infoList->erase(k+cidx);
27959static std::unordered_map <PreprocessingInfo*, SageInterface::PreprocessingInfoData> infoMap;
27964 if (current == NULL)
27970 vector<PreprocessingInfo*> afterList;
27973 AttachedPreprocessingInfoType* comments = locatedNode->getAttachedPreprocessingInfo();
27975 if (comments !=
nullptr)
27977 AttachedPreprocessingInfoType::iterator i;
27979 for (i = comments->begin (); i != comments->end (); i++)
27985 data.container=comments;
27987 data.depth = depth;
27990 if (info->getRelativePosition () == PreprocessingInfo::before)
27992 infoList.push_back (info);
27993 infoMap[info] = data;
27998 else if (info->getRelativePosition () == PreprocessingInfo::after
27999 || info->getRelativePosition () == PreprocessingInfo::inside
28002 afterList.push_back (info);
28003 infoMap[info] = data;
28007 mlog[Sawyer::Message::Common::WARN] <<
"Warning: unhandled relative position value:" <<info->getRelativePosition () <<endl;
28018 for (
auto c: children)
28022 for (
auto fi : afterList)
28023 infoList.push_back(fi);
28037 ROSE_ASSERT(lnode);
28053 vector < pair< AttachedPreprocessingInfoType*, int> > keepers;
28057 unordered_map < PreprocessingInfo * , vector< pair<AttachedPreprocessingInfoType*, int>> > associated_directives;
28062 vector< pair<AttachedPreprocessingInfoType*, int>> associated_erase;
28070 vector<PreprocessingInfo*> candidateInfoList;
28075 for (
auto candidate: candidateInfoList)
28082 if (infoMap[info].depth ==0)
28085 int commentIndex = infoMap[info].index;
28086 AttachedPreprocessingInfoType* infoList = infoMap[info].container;
28089 if ( isBeginDirective(info) == 1)
28091 keepers.push_back(make_pair (infoList,commentIndex));
28094 else if (isBeginDirective(info) == 2)
28099 if (keepers.size()==0)
28100 keepers.push_back(make_pair (infoList, commentIndex));
28101 else if (isBeginDirective( (*(keepers.back().first))[keepers.back().second] )!=1 )
28103 keepers.push_back(make_pair (infoList,commentIndex));
28105 else if(isBeginDirective( (*(keepers.back().first))[keepers.back().second] )==1 )
28107 PreprocessingInfo* begin_info = (*(keepers.back().first))[keepers.back().second];
28109 associated_directives[begin_info].push_back(make_pair (infoList,commentIndex));
28113 else if ( isBeginDirective(info) == -1)
28115 bool neutralized =
false;
28117 if (keepers.size()>0)
28119 AttachedPreprocessingInfoType* comments = keepers.back().first;
28120 int idx = keepers.back().second;
28122 if(isBeginDirective( (*comments)[idx] )==1)
28124 keepers.pop_back();
28125 neutralized =
true;
28130 keepers.push_back(make_pair (infoList,commentIndex));
28138 for(;ast_i!=ast.
end();++ast_i) {
28140 if (current ==NULL )
28144 if (infoList == NULL)
continue;
28146 int commentIndex=0;
28147 for (Rose_STL_Container<PreprocessingInfo*>::iterator ci = (*infoList).begin(); ci != (*infoList).end(); ci++)
28149 ROSE_ASSERT(*ci != NULL);
28155 if ( isBeginDirective(info) == 1)
28157 keepers.push_back(make_pair (infoList,commentIndex));
28160 else if (isBeginDirective(info) == 2)
28165 if (keepers.size()==0)
28166 keepers.push_back(make_pair (infoList,commentIndex));
28167 else if (isBeginDirective( (*(keepers.back().first))[keepers.back().second] )!=1 )
28169 keepers.push_back(make_pair (infoList,commentIndex));
28171 else if(isBeginDirective( (*(keepers.back().first))[keepers.back().second] )==1 )
28173 PreprocessingInfo* begin_info = (*(keepers.back().first))[keepers.back().second];
28175 associated_directives[begin_info].push_back(make_pair (infoList,commentIndex));
28179 else if ( isBeginDirective(info) == -1)
28181 bool neutralized =
false;
28183 if (keepers.size()>0)
28185 AttachedPreprocessingInfoType* comments = keepers.back().first;
28186 int idx = keepers.back().second;
28188 if(isBeginDirective( (*comments)[idx] )==1)
28190 keepers.pop_back();
28191 neutralized =
true;
28196 keepers.push_back(make_pair (infoList,commentIndex));
28203 set <AttachedPreprocessingInfoType*> relatedInfoList;
28206 for (
auto ki = keepers.begin(); ki != keepers.end(); ki ++)
28208 AttachedPreprocessingInfoType* infoList = (*ki).first;
28209 int cidx= (*ki).second;
28211 relatedInfoList.insert (infoList);
28215 info->setRelativePosition(PreprocessingInfo::after);
28222 if (associated_directives.count (info)!=0)
28224 vector<pair<AttachedPreprocessingInfoType*,int>> a_list_vec = associated_directives[info];
28225 for (
auto vec_i = a_list_vec.rbegin(); vec_i != a_list_vec.rend(); vec_i ++ )
28227 AttachedPreprocessingInfoType* a_infoList = (*vec_i).first;
28228 int aidx= (*vec_i).second;
28229 moveInofListToNewPlace (a_infoList, aidx, relatedInfoList, lnode, retVal);
28230 associated_erase.push_back(make_pair (a_infoList, aidx));
28236 (*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 &)
Insert data into the digest.
uint64_t toU64()
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)
Converts a 64 bit int to base 62.
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 bool normalizeCaseAndDefaultBlocks(SgSwitchStatement *switchStmt)
Normalize the structure of case and default blocks within a switch statement.
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: