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;
85#include "rose_config.h"
88namespace EDG_ROSE_Translation
91#if defined(ROSE_BUILD_CXX_LANGUAGE_SUPPORT) && !defined(ROSE_USE_CLANG_FRONTEND)
93 extern std::map<std::string, SgIncludeFile*> edg_include_file_map;
96 std::map<std::string, SgIncludeFile*> edg_include_file_map;
103#include "detectMacroOrIncludeFileExpansions.h"
106 template<
class T>
void setSourcePositionToDefault( T* node );
110#ifdef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
111 #include "transformationSupport.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#define USING_PERFORMANCE_TRACING 0
6743#if USING_PERFORMANCE_TRACING
6745 TimingPerformance timer1 (
"SageInterface::lookupSymbolInParentScopesIgnoringAliasSymbols: whole function:");
6748 if (currentScope == NULL)
6753 ROSE_ASSERT(currentScope != NULL);
6755#define DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS 0
6757#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6758 printf (
"In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): currentScope = %p = %s (templateParameterList = %p templateArgumentList = %p) \n",
6759 currentScope,currentScope->
class_name().c_str(),templateParameterList,templateArgumentList);
6762 while ((currentScope != NULL) && (symbol == NULL))
6764#if USING_PERFORMANCE_TRACING
6766 TimingPerformance timer1 (
"SageInterface::lookupSymbolInParentScopesIgnoringAliasSymbols: in loop:");
6769#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6770 printf(
" --- In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): name = %s currentScope = %p = %s \n",
6771 name.str(),currentScope,currentScope->
class_name().c_str());
6776 symbol = currentScope->lookup_symbol(name,templateParameterList,templateArgumentList);
6778 if (isSgAliasSymbol(symbol) != NULL)
6780#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6781 printf (
"Found a SgAliasSymbol: reset to NULL: symbol = %p = %s \n",symbol,symbol->
class_name().c_str());
6786#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS && 1
6788 printf(
" --- In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): symbol = %p \n",symbol);
6789 currentScope->print_symboltable(
"In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): debug");
6792 currentScope = isSgGlobal(currentScope) ? NULL : currentScope->
get_scope();
6794 currentScope = NULL;
6796#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6797 printf (
" --- In SageInterface:: (base of loop) lookupSymbolInParentScopesIgnoringAliasSymbols(): cscope = %p symbol = %p \n\n",currentScope,symbol);
6803#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6804 printf (
"Warning: In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): could not locate the specified name %s in any outer symbol table (templateParameterList = %p templateArgumentList = %p) \n",
6805 name.str(),templateParameterList,templateArgumentList);
6811 printf (
"Support for lookupSymbolInParentScopesIgnoringAliasSymbols() is not yet implemented \n");
6833 ROSE_ASSERT(cscope);
6835 while ((cscope!=NULL)&&(symbol==NULL))
6837 symbol = cscope->lookup_symbol(name);
6841 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6867 printf (
"WARNING: SageInterface::lookupVariableSymbolInParentScopes() should be implemented similar to SageInterface::lookupClassSymbolInParentScopes() \n");
6873 if (isSgAliasSymbol(symbol) != NULL)
6875 printf (
"Error: This SageInterface::lookupVariableSymbolInParentScopes() function does not handle SgAliasSymbols \n");
6878 result = isSgVariableSymbol(symbol);
6886 ROSE_ASSERT(cscope != NULL);
6888 while ((cscope != NULL) && (symbol == NULL))
6891 symbol = cscope->lookup_variable_symbol(name);
6894 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6903#define DEBUG_LOOKUP_TEMPLATE_VARIABLE 0
6908#if DEBUG_LOOKUP_TEMPLATE_VARIABLE
6909 printf (
"In SageInterface::lookupTemplateVariableSymbolInParentScopes():\n");
6910 printf (
" -- name = %s\n", name.str());
6911 printf (
" -- tplparams = %p [%zd]\n", tplparams, tplparams ? tplparams->size() : 0);
6912 printf (
" -- tplargs = %p [%zd]\n", tplargs, tplargs ? tplargs->size() : 0);
6913 printf (
" -- cscope = %p (%s)\n", cscope, cscope ? cscope->
class_name().c_str() :
"");
6919 ROSE_ASSERT(cscope != NULL);
6921 while ((cscope != NULL) && (symbol == NULL))
6924 symbol = cscope->lookup_template_variable_symbol(name, tplparams, tplargs);
6927 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6943 ROSE_ASSERT(cscope != NULL);
6945 while ((cscope != NULL) && (symbol == NULL))
6949 symbol = cscope->lookup_class_symbol(name,templateArgumentList);
6952 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6966 ROSE_ASSERT(cscope != NULL);
6968 while ((cscope != NULL) && (symbol == NULL))
6970 symbol = cscope->lookup_nonreal_symbol(name,templateParameterList,templateArgumentList);
6973 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6988 ROSE_ASSERT(cscope != NULL);
6991 printf (
"In lookupTypedefSymbolInParentScopes(): name = %s starting with cscope = %p = %s \n",name.str(),cscope,cscope->
class_name().c_str());
6995 while ((cscope != NULL) && (symbol == NULL))
6998 symbol = cscope->lookup_typedef_symbol(name);
7001 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
7006 printf (
"In lookupTypedefSymbolInParentScopes(): symbol = %p next cscope = %p = %s \n",symbol,cscope,(cscope != NULL) ? cscope->
class_name().c_str() :
"null");
7011 printf (
"Leaving lookupTypedefSymbolInParentScopes(): symbol = %p \n",symbol);
7029 ROSE_ASSERT(cscope != NULL);
7031 while ((cscope != NULL) && (symbol == NULL))
7037 symbol = cscope->lookup_template_symbol(name,NULL,NULL);
7039 printf (
"In lookupTemplateSymbolInParentScopes(): Searching scope = %p = %s name = %s symbol = %p \n",cscope,cscope->
class_name().c_str(),name.str(),symbol);
7042 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
7059 ROSE_ASSERT(cscope != NULL);
7061 while ((cscope != NULL) && (symbol == NULL))
7067 symbol = cscope->lookup_template_class_symbol(name,templateParameterList,templateArgumentList);
7069 printf (
"In lookupTemplateSymbolInParentScopes(): Searching scope = %p = %s name = %s symbol = %p \n",cscope,cscope->
class_name().c_str(),name.str(),symbol);
7072 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
7089 ROSE_ASSERT(cscope != NULL);
7091 while ((cscope != NULL) && (symbol == NULL))
7094 symbol = cscope->lookup_enum_symbol(name);
7097 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
7112 ROSE_ASSERT(cscope != NULL);
7114 while ((cscope != NULL) && (symbol == NULL))
7117 symbol = cscope->lookup_namespace_symbol(name);
7120 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
7130SageInterface::setSourcePositionToDefault( T* node )
7148 ROSE_ASSERT(node != NULL);
7151 if (node->get_endOfConstruct() == NULL && node->get_startOfConstruct() == NULL)
7154 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());
7157 ROSE_ASSERT(node->get_endOfConstruct() == NULL);
7158 ROSE_ASSERT(node->get_startOfConstruct() == NULL);
7165 printf (
"In SageInterface::setSourcePositionToDefault(): Calling setSourcePositionUnavailableInFrontend() \n");
7167 start_fileInfo->setSourcePositionUnavailableInFrontend();
7168 end_fileInfo->setSourcePositionUnavailableInFrontend();
7172 printf (
"In SageInterface::setSourcePositionToDefault(): Calling setOutputInCodeGeneration() \n");
7178 node->set_startOfConstruct(start_fileInfo);
7179 node->set_endOfConstruct (end_fileInfo);
7181 node->get_startOfConstruct()->set_parent(node);
7182 node->get_endOfConstruct ()->set_parent(node);
7189 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());
7191 if (node->get_startOfConstruct() == NULL)
7193 printf (
"ERROR: startOfConstruct not set for locatedNode = %p = %s \n",node,node->class_name().c_str());
7195 if (node->get_endOfConstruct() == NULL)
7197 printf (
"ERROR: endOfConstruct not set for locatedNode = %p = %s \n",node,node->class_name().c_str());
7200 ROSE_ASSERT(node->get_startOfConstruct() != NULL);
7201 ROSE_ASSERT(node->get_endOfConstruct() != NULL);
7202 ROSE_ASSERT(node->get_endOfConstruct() != NULL && node->get_startOfConstruct() != NULL);
7223 if (expression != NULL)
7226 SgBinaryOp* binaryOp = isSgBinaryOp(expression);
7227 if (binaryOp != NULL)
7229 if (binaryOp->get_operatorPosition() == NULL)
7232 operator_fileInfo->setSourcePositionUnavailableInFrontend();
7234 binaryOp->set_operatorPosition(operator_fileInfo);
7237 binaryOp->get_operatorPosition()->
set_parent(binaryOp);
7242 if (expression->get_operatorPosition() == NULL)
7245 operator_fileInfo->setSourcePositionUnavailableInFrontend();
7247 expression->set_operatorPosition(operator_fileInfo);
7252 ROSE_ASSERT(expression->get_operatorPosition()->
get_parent() == expression);
7263#ifdef ROSE_DEBUG_NEW_EDG_ROSE_CONNECTION
7264 printf (
"+++++ Depricated function (use setSourcePositionAsTransformation() instead) (no using internal source position mode) \n");
7283 ROSE_ASSERT(node != NULL);
7292 SgPragma* pragma = isSgPragma(node);
7293 SgGlobal* global = isSgGlobal(node);
7298 printf (
"Debug, Found a variable definition: %p\n", v_d);
7301 if (locatedNode != NULL)
7313 if (expression!=NULL)
7316 expression->get_operatorPosition()->
set_parent(expression);
7335 printf (
"+++++ Depricated name setOneSourcePositionNull() (use setSourcePositionPointersToNull() instead) (no using internal source position mode) \n");
7353 ROSE_ASSERT(node != NULL);
7357 SgPragma* pragma = isSgPragma(node);
7358 SgGlobal* global = isSgGlobal(node);
7364 if (locatedNode != NULL)
7367 printf (
"WARNING: In SageInterface::setSourcePositionPointersToNull(): Memory leak of startOfConstruct Sg_File_Info object (setting Sg_File_Info pointers to NULL) \n");
7375 printf (
"WARNING: In SageInterface::setSourcePositionPointersToNull(): Memory leak of endOfConstruct Sg_File_Info object (setting Sg_File_Info pointers to NULL) \n");
7381 if (expression != NULL)
7383 if (expression->get_operatorPosition() != NULL)
7384 printf (
"WARNING: In SageInterface::setSourcePositionPointersToNull(): Memory leak of operatorPosition Sg_File_Info object (setting Sg_File_Info pointers to NULL) \n");
7386 expression->set_operatorPosition(NULL);
7393 printf (
"WARNING: In SageInterface::setSourcePositionPointersToNull(): Memory leak of Sg_File_Info object (setting Sg_File_Info pointers to NULL) \n");
7395 pragma->set_startOfConstruct(NULL);
7406 printf (
"+++++ Depricated name setSourcePositionForTransformation() (use setSourcePositionAtRootAndAllChildrenAsTransformation() instead) \n");
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++ )
7431SageInterface::setSourcePositionAtRootAndAllChildrenAsTransformation(
SgNode *root)
7433 Rose_STL_Container <SgNode*> nodeList= NodeQuery::querySubTree(root,V_SgNode);
7434 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i!=nodeList.end(); i++ )
7443SageInterface::setSourcePositionAtRootAndAllChildrenAsDefault(
SgNode *root)
7445 Rose_STL_Container <SgNode*> nodeList= NodeQuery::querySubTree(root,V_SgNode);
7446 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i!=nodeList.end(); i++ )
7448 setSourcePositionAsDefault(*i);
7458 Rose_STL_Container <SgNode*> nodeList = NodeQuery::querySubTree(root,V_SgNode);
7461 printf (
"In setSourcePositionAtRootAndAllChildren(): nodeList.size() = %" PRIuPTR
" \n",nodeList.size());
7464 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
7467 printf (
"In setSourcePositionAtRootAndAllChildren(): *i = %p = %s \n",*i,(*i)->class_name().c_str());
7486 printf (
"In SageInterface::setSourcePosition(): SourcePositionClassification scp = %s \n",
display(scp).c_str());
7491 case e_sourcePositionError:
7493 printf (
"Error: error value e_sourcePositionError in SageInterface::setSourcePosition() \n");
7500 printf (
"e_sourcePositionDefault in SageInterface::setSourcePosition() \n");
7503 if (locatedNode != NULL)
7505 setSourcePositionToDefault(locatedNode);
7510 printf (
"Error: can't call setSourcePosition() in mode e_sourcePositionDefault with non SgLocatedNode (node = %p = %s) \n",node,node->
class_name().c_str());
7519 printf (
"e_sourcePositionTransformation in SageInterface::setSourcePosition() \n");
7528 printf (
"e_sourcePositionCompilerGenerated in SageInterface::setSourcePosition() \n");
7530 printf (
"Sorry, not implemented \n");
7539 printf (
"e_sourcePositionNullPointers in SageInterface::setSourcePosition() \n");
7556 printf (
"e_sourcePositionFrontendConstruction in SageInterface::setSourcePosition() \n");
7559 if (locatedNode != NULL)
7562 setSourcePositionToDefault(locatedNode);
7567 SgPragma* pragma = isSgPragma(node);
7570 setSourcePositionToDefault(pragma);
7576 SgType* type = isSgType(node);
7584 if (functionParameterTypeList != NULL)
7590 printf (
"Error: can't call setSourcePosition() in mode e_sourcePositionFrontendConstruction with non SgLocatedNode (node = %p = %s) \n",node,node->
class_name().c_str());
7603 printf (
"Error: error value e_sourcePositionError in SageInterface::setSourcePosition() \n");
7609 printf (
"Error: default reached in SageInterface::setSourcePosition() \n");
7617 node->
get_file_info()->display(
"Leaving SageInterface::setSourcePosition()");
7624SageInterface::setSourcePositionForTransformation_memoryPool()
7629 printf (
"ERROR: In setSourcePositionForTransformation_memoryPool(): This seems like a very dangerous function to have, is it required? \n");
7632 VariantVector vv(V_SgNode);
7633 Rose_STL_Container<SgNode*> nodeList = NodeQuery::queryMemoryPool(vv);
7634 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++ )
7645 ROSE_ASSERT(project != NULL);
7648 ROSE_ASSERT(project->get_fileList().empty() ==
false);
7651 SgSourceFile* file = isSgSourceFile(project->get_fileList()[0]);
7652 SgGlobal* global = file->get_globalScope();
7655 SgFilePtrListPtr fileList = project->get_fileList();
7656 SgFilePtrList::const_iterator i= fileList->begin();
7658 SgGlobal* global = (*i)->get_globalScope();
7660 ROSE_ASSERT(global != NULL);
7681 if (declList.empty() ==
false)
7683 stmt = isSgStatement(declList.back());
7692 if (stmtList.empty() ==
false)
7694 stmt = stmtList.back();
7716 if (includingCompilerGenerated)
7720 if (declList.empty() ==
false)
7722 stmt = isSgStatement(declList.front());
7728 SgDeclarationStatementPtrList::iterator i=declList.begin();
7729 while (i != declList.end())
7756 if (includingCompilerGenerated)
7760 if (stmtList.empty() ==
false)
7762 stmt = stmtList.front();
7768 SgStatementPtrList::iterator i = stmtList.begin();
7769 while (i!=stmtList.end())
7804 SgDeclarationStatementPtrList::iterator i=declList.begin();
7805 while (i!=declList.end())
7829 SgStatementPtrList::iterator i=stmtList.begin();
7830 while (i!=stmtList.end())
7857 bool result =
false;
7860 if (isSgProgramHeaderStatement(n)) {
7865 if (isSgFunctionDeclaration(n) !=
nullptr) {
7866 bool either =
false;
7872 ROSE_ASSERT(stmnt !=
nullptr);
7879 ROSE_ASSERT(funcDefn !=
nullptr);
7880 if (funcDefn->get_name() ==
"main") {
7904 return isSgFunctionDeclaration(n);
7907 for (vector<SgNode*>::const_iterator i = children.begin();
7908 i != children.end(); ++i) {
7926 ROSE_ASSERT (scope != NULL);
7930 for (
size_t i = 0; i<stmt_list.size(); i++)
7934 if (isSgDeclarationStatement(cur_stmt))
7936 if (isSgPragmaDeclaration (cur_stmt))
7956 rt = n->copy (g_treeCopy);
7966 bool isC = TransformationSupport::getSourceFile(n)->get_outputLanguage() ==
SgFile::e_C_language;
7978#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
7980 for (std::vector<SgContinueStmt*>::iterator i = continues.begin(); i != continues.end(); ++i)
7985 LowLevelRewrite::replace(*i, make_unit_list( gotoStatement ) );
7991 printf (
"Not supported in mode: ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT (LowLevelRewrite::replace() is unavailable)");
7996#define DEBUG_TEMPLATE_ARG_EQUIVALENCE 0
8002#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8003 printf (
"In templateArgumentEquivalence(): same pointer to template argument: returning true \n");
8010#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8011 printf (
"In templateArgumentEquivalence(): different argumentType(): returning false \n");
8020 ROSE_ASSERT(arg1->
get_type() != NULL);
8021 ROSE_ASSERT(arg2->
get_type() != NULL);
8023#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8024 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::type_argument: checking for the same type: arg1->get_type() = %p = %s arg2->get_type() = %p = %s \n",
8032#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8033 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::type_argument: checking for the same type: returning true \n");
8046#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8047 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::type_argument: checking for the same type: pointers are different: returning typesAreEqual = %s \n",typesAreEqual ?
"true" :
"false");
8049 return typesAreEqual;
8057 if (expr1 == expr2) {
8058#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8059 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::nontype_argument: checking for the same expression: returning true \n");
8063#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8064 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::nontype_argument: same variant of expression: %s\n", expr1->
class_name().c_str());
8067 case V_SgLongIntVal: {
8071 case V_SgUnsignedLongVal:
8076 case V_SgBoolValExp:
8081 mlog[Sawyer::Message::Common::FATAL]
8082 <<
"FATAL: In templateArgumentEquivalence(): case SgTemplateArgument::nontype_argument: expression have the same variant "
8084 <<
" but comparison is not NIY!"
8090#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8091 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::nontype_argument: different variant of expression: returning false \n");
8099 if (arg1->get_templateDeclaration() == arg2->get_templateDeclaration())
8101#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8102 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::template_template_argument: checking for the same templateDeclaration: returning true \n");
8108 ROSE_ASSERT(!
"NIY: template template argument comparaison.");
8114 ROSE_ASSERT(!
"Try to compare template arguments of unknown type...");
8123 ROSE_ASSERT(!
"Try to compare template arguments of unknown type start_of_pack_expansion_argument");
8129 printf (
"Error: default case not handled! \n");
8137#define DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE 0
8141 if (list1.size() != list2.size())
8143#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8144 printf (
"In templateArgumentListEquivalence(): different list sizes: returning false \n");
8145 printf (
" --- list1.size() = %zu \n",list1.size());
8146 printf (
" --- list2.size() = %zu \n",list2.size());
8153#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8154 printf (
"In templateArgumentListEquivalence(): same list using STL equality operator: returning true \n");
8160 for (
size_t i = 0; i < list1.size(); i++)
8162#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8163 printf (
"In templateArgumentListEquivalence(): calling templateArgumentEquivalence() for i = %zu \n",i);
8168#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8169 printf (
"In templateArgumentListEquivalence(): calling templateArgumentEquivalence() for i = %zu --- returned false: returning false \n",i);
8175#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8176 printf (
"In templateArgumentListEquivalence(): reached base of function: returning true \n");
8196 SgName labelname =
"rose_label__";
8209 if (isSgNullExpression(f->get_increment()))
return;
8214 f->set_increment(ne);
8224 ROSE_ASSERT(condstmt);
8226 if (isSgNullStatement(condstmt))
return true;
8230 return isSgNullExpression(exprStmt->get_expression());
8239 bbStmts = initStmts;
8240 for (
size_t i = 0; i < bbStmts.size(); ++i) {
8241 bbStmts[i]->set_parent(bb);
8244 const bool testIsNull = hasEmptyCondition(f);
8254 Rose_STL_Container<SgNode*> fors = NodeQuery::querySubTree(top,
8256 for (
size_t i = 0; i < fors.size(); ++i) {
8264 Rose_STL_Container<SgNode*> allGotos = NodeQuery::querySubTree(scope, V_SgGotoStatement);
8266 vector<SgGotoStatement*> result;
8267 for (Rose_STL_Container<SgNode*>::const_iterator i = allGotos.begin(); i != allGotos.end(); ++i) {
8268 if (isSgGotoStatement(*i)->
get_label() == l) {
8269 result.push_back(isSgGotoStatement(*i));
8277 vector<SgReturnStmt*> SageInterface::findReturnStmts(
SgStatement* scope) {
8280 Rose_STL_Container<SgNode*> returns = NodeQuery::querySubTree(scope, V_SgReturnStmt);
8282 vector<SgReturnStmt*> result;
8283 for (Rose_STL_Container<SgNode*>::const_iterator i = returns.begin(); i != returns.end(); ++i) {
8284 result.push_back(isSgReturnStmt(*i));
8290static void getSwitchCasesHelper(
SgStatement* top, vector<SgStatement*>& result) {
8292 if (isSgSwitchStatement(top))
return;
8293 if (isSgCaseOptionStmt(top) || isSgDefaultOptionStmt(top)) {
8294 result.push_back(top);
8297 for (
unsigned int i = 0; i < children.size(); ++i) {
8298 if (isSgStatement(children[i])) {
8299 getSwitchCasesHelper(isSgStatement(children[i]), result);
8305 vector<SgStatement*> result;
8306 getSwitchCasesHelper(sw->
get_body(), result);
8336 if (
const SgSymbol* symbol = isSgSymbol(astNode))
8337 return symbol->get_scope();
8342 else if (
const SgQualifiedName* qualifiedName = isSgQualifiedName(astNode))
8346 const SgNode* parentNode = astNode;
8347 while (!isSgScopeStatement(parentNode))
8352 if (isSgFunctionParameterList(parentNode) || isSgCtorInitializerList(parentNode))
8355 ROSE_ASSERT(funcDeclaration != NULL);
8357 if (funcDeclaration != NULL)
8359 return funcDeclaration->get_definition();
8364 if (parentNode == NULL)
8372 if ( isSgScopeStatement(parentNode) == NULL &&
8373 dynamic_cast<const SgType*
>(parentNode) == NULL &&
8374 dynamic_cast<const SgSymbol*
>(parentNode) == NULL )
8376 printf (
"Error: In SageInterface::getScope(): could not trace back to SgScopeStatement node \n");
8381 if (
dynamic_cast<const SgType*
>(parentNode) != NULL ||
dynamic_cast<const SgSymbol*
>(parentNode) != NULL )
8383 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());
8391 ROSE_ASSERT (scopeStatement != NULL);
8394 if (isSgScopeStatement(astNode))
8395 if (isSgScopeStatement(parentNode))
8397 ROSE_ASSERT (astNode == parentNode);
8424 printf (
"In getVarSymFromName(): name->get_name() = %s \n",name->get_name().str());
8427 ROSE_ASSERT (scope != NULL);
8429 printf (
"In getVarSymFromName(): name->get_name() = %s scope = %p = %s \n",name->get_name().str(),scope,scope->
class_name().c_str());
8431 v_sym = scope->lookup_var_symbol (name->get_name());
8440 if (decl_scope != NULL)
8441 v_sym = decl_scope->lookup_var_symbol (name->get_name());
8444 cerr <<
"\t\t*** WARNING: Can't seem to find a symbol for '"
8445 << name->get_name ().str ()
8475getVarSym_const (
const SgNode* n)
8481 v_sym = isSgVarRefExp (n)->get_symbol ();
8483 case V_SgInitializedName:
8484 v_sym = getVarSymFromName_const (isSgInitializedName (n));
8510 if (!decl)
return 0;
8511 const SgInitializedNamePtrList& names = decl->
get_variables ();
8512 if (names.begin () != names.end ())
8515 return getVarSym_const (name);
8534 if (names.begin () != names.end ())
8535 return *(names.begin ());
8541static void findBreakStmtsHelper(
SgStatement* code,
const std::string& fortranLabel,
bool inOutermostBody, vector<SgBreakStmt*>& breakStmts) {
8542 if (isSgWhileStmt(code) || isSgDoWhileStmt(code) || isSgForStatement(code) || isSgSwitchStatement(code)) {
8543 if (fortranLabel ==
"") {
8548 inOutermostBody =
false;
8551 if (isSgBreakStmt(code)) {
8553 bool breakMatchesThisConstruct =
false;
8554 if (bs->get_do_string_label() ==
"") {
8556 breakMatchesThisConstruct = inOutermostBody;
8558 breakMatchesThisConstruct = (fortranLabel == bs->get_do_string_label());
8560 if (breakMatchesThisConstruct) {
8561 breakStmts.push_back(bs);
8566 for (
unsigned int i = 0; i < children.size(); ++i) {
8567 if (isSgStatement(children[i])) {
8568 findBreakStmtsHelper(isSgStatement(children[i]), fortranLabel, inOutermostBody, breakStmts);
8576 vector<SgBreakStmt*> result;
8577 findBreakStmtsHelper(code, fortranLabel,
true, result);
8582static void findContinueStmtsHelper(
SgStatement* code,
const std::string& fortranLabel,
bool inOutermostBody, vector<SgContinueStmt*>& continueStmts) {
8583 if (isSgWhileStmt(code) || isSgDoWhileStmt(code) || isSgForStatement(code)) {
8584 if (fortranLabel ==
"") {
8589 inOutermostBody =
false;
8592 if (isSgContinueStmt(code)) {
8594 bool continueMatchesThisConstruct =
false;
8595 if (cs->get_do_string_label() ==
"") {
8597 continueMatchesThisConstruct = inOutermostBody;
8599 continueMatchesThisConstruct = (fortranLabel == cs->get_do_string_label());
8601 if (continueMatchesThisConstruct) {
8602 continueStmts.push_back(cs);
8607 for (
unsigned int i = 0; i < children.size(); ++i) {
8609 if (stmnt != NULL) {
8610 findContinueStmtsHelper(stmnt, fortranLabel, inOutermostBody, continueStmts);
8618 vector<SgContinueStmt*> result;
8619 findContinueStmtsHelper(code, fortranLabel,
true, result);
8630 std::cout <<
"Starting getInitializerOfExpression on 0x" << std::hex << (int)n <<
", which has type " << n->
sage_class_name() << std::endl;
8632 while (!isSgInitializer(n)) {
8635 std::cout <<
"Continuing getInitializerOfExpression on 0x" << std::hex << (int)n;
8637 std::cout << std::endl;
8641 return isSgInitializer(n);
8649 std::vector<SgVariableSymbol*> symbols;
8651 virtual void visit(
SgNode* n) {
8652 if (isSgVarRefExp(n))
8653 symbols.push_back(isSgVarRefExp(n)->get_symbol());
8657 GetSymbolsUsedInExpressionVisitor vis;
8658 vis.traverse(expr, preorder);
8665 return getEnclosingNode<SgSourceFile>(n, includingSelf);
8671 return findDeclarationStatement<SgFunctionDeclaration> (root, name, scope, isDefining);
8682 return getEnclosingNode<SgFunctionDefinition>(n, includingSelf);
8688 return getEnclosingNode<SgFunctionDeclaration>(astNode, includingSelf);
8698 return getEnclosingNode<SgGlobal>(astNode,
true );
8703 return getEnclosingNode<SgClassDefinition>(astNode, includingSelf);
8711 return getEnclosingNode<SgClassDeclaration>(astNode,
true);
8716 return getEnclosingNode<SgExprListExp>(astNode, includingSelf);
8722 bool returnValue =
false;
8728 virtual void visit(
SgNode* n)
8730 if (n == expression_target)
8736 Visitor(
SgExpression* expr) : expression_target(expr), in_subtree(
false) {}
8739 Visitor traversal(exp);
8741 traversal.traverse(subtree, preorder);
8743 returnValue = traversal.in_subtree;
8757 ROSE_ASSERT (functionCallExp != NULL);
8759 SgExpression* expression = functionCallExp->get_function();
8760 ROSE_ASSERT (expression != NULL);
8764 SgDotExp* dotExp = isSgDotExp(expression);
8767 ROSE_ASSERT (dotExp != NULL);
8770 ROSE_ASSERT (rhsOperand != NULL);
8775 if (memberFunctionRefExp != NULL)
8782 if (functionReferenceExp != NULL)
8787 SgArrowExp* arrowExp = isSgArrowExp(expression);
8788 if ( arrowExp != NULL)
8790 ROSE_ASSERT (arrowExp != NULL);
8793 ROSE_ASSERT (rhsOperand != NULL);
8798 if (memberFunctionRefExp != NULL)
8804 return returnDeclaration;
8809std::list<SgClassType*>
8814#define DEBUG_DATA_MEMBER_TYPE_CHAIN 0
8820 ROSE_ASSERT(varRefExp != NULL || memberFunctionRefExp != NULL);
8822 std::list<SgClassType*> returnTypeChain;
8825 std::list<SgClassType*> classChain;
8830 if (varRefExp != NULL)
8836 ROSE_ASSERT(memberFunctionRefExp != NULL);
8841 ROSE_ASSERT(parent != NULL);
8843#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8844 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): parent = %p = %s \n",parent,parent->
class_name().c_str());
8848 SgDotExp* dotExp = isSgDotExp(parent);
8852 if (arrowExp != NULL)
8854#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8855 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): Found an arrow expression \n");
8857 binaryOperator = arrowExp;
8862#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8863 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): Found an dot expression \n");
8865 binaryOperator = dotExp;
8869 if (binaryOperator != NULL)
8872 ROSE_ASSERT(lhs != NULL);
8874#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8875 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs = %p = %s \n",lhs,lhs->
class_name().c_str());
8881 while (isSgCastExp(temp_lhs) != NULL)
8883 cast = isSgCastExp(temp_lhs);
8884 ROSE_ASSERT(cast != NULL);
8887#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8888 printf (
"Top of loop: processing cast = %p temp_lhs = %p = %s \n",cast,temp_lhs,temp_lhs->
class_name().c_str());
8890 ROSE_ASSERT(cast->
get_type() != NULL);
8892 if (classType == NULL)
8894#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8895 printf (
" --- looking for base type: In SageInterface::getClassTypeChainForDataMemberReference(): classType == NULL: cast->get_type() = %p = %s \n",
8898 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);
8899 ROSE_ASSERT(baseType != NULL);
8901#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8902 printf (
" --- baseType = %p = %s name = %s \n",baseType,baseType->
class_name().c_str(),
get_name(baseType).c_str());
8904 classType = isSgClassType(baseType);
8908 ROSE_ASSERT(temp_lhs != NULL);
8910#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8911 printf (
" --- temp_lhs = %p = %s name = %s \n",temp_lhs,temp_lhs->
class_name().c_str(),
get_name(temp_lhs).c_str());
8917 if (classType != NULL)
8919 classChain.push_front(classType);
8923 if (classType != NULL)
8934 ROSE_ASSERT(target_type != NULL);
8935 SgClassType* target_classType = isSgClassType(target_type);
8937 if (target_classType != NULL)
8940 ROSE_ASSERT(target_declaration != NULL);
8941 SgClassDeclaration* target_classDeclaration = isSgClassDeclaration(target_declaration);
8942 ROSE_ASSERT(target_classDeclaration != NULL);
8944 ROSE_ASSERT(target_definingClassDeclaration != NULL);
8945 SgScopeStatement* target_scope = target_definingClassDeclaration->get_definition();
8946 ROSE_ASSERT(target_scope != NULL);
8948#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8949 printf (
"target_classDeclaration = %p = %s name = %s target_scope = %p = %s \n",
8950 target_classDeclaration,target_classDeclaration->
class_name().c_str(),target_classDeclaration->get_name().str(),target_scope,target_scope->
class_name().c_str());
8953 ROSE_ASSERT(source_classType != NULL);
8955 ROSE_ASSERT(source_declaration != NULL);
8956 SgClassDeclaration* source_classDeclaration = isSgClassDeclaration(source_declaration);
8957 ROSE_ASSERT(source_classDeclaration != NULL);
8959 ROSE_ASSERT(source_definingClassDeclaration != NULL);
8960 SgScopeStatement* source_scope = source_definingClassDeclaration->get_definition();
8961 ROSE_ASSERT(source_scope != NULL);
8963#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8964 printf (
"source_classDeclaration = %p = %s name = %s source_scope = %p = %s \n",
8965 source_classDeclaration,source_classDeclaration->
class_name().c_str(),source_classDeclaration->get_name().str(),source_scope,source_scope->
class_name().c_str());
8968 while (tmp_scope != NULL && tmp_scope != target_scope)
8970#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8971 printf (
"tmp_scope = %p = %s \n",tmp_scope,tmp_scope->
class_name().c_str());
8974 ROSE_ASSERT(tmp_classDefinition != NULL);
8976 ROSE_ASSERT(tmp_classDeclaration != NULL);
8978#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8979 SgName scope_name = tmp_classDeclaration->get_name();
8980 printf (
"scope_name = %s \n",scope_name.str());
8982 SgClassType* tmp_classType = tmp_classDeclaration->get_type();
8983 ROSE_ASSERT(tmp_classType != NULL);
8986 classChain.push_front(tmp_classType);
8990 if (isSgGlobal(tmp_scope) != NULL)
8999 printf (
"In loop processing cast: target_type = %p = %s \n",target_type,target_type->
class_name().c_str());
9005#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9006 printf (
"Bottom of loop: processing cast = %p temp_lhs = %p = %s \n",cast,temp_lhs,temp_lhs->
class_name().c_str());
9012 ROSE_ASSERT(temp_lhs != NULL);
9014#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9015 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): temp_lhs = %p = %s \n",temp_lhs,temp_lhs->
class_name().c_str());
9018 SgVarRefExp* derivedClassVarRefExp = isSgVarRefExp(temp_lhs);
9019 if (derivedClassVarRefExp != NULL)
9021 SgVariableSymbol* derivedClassVariableSymbol = derivedClassVarRefExp->get_symbol();
9022 ROSE_ASSERT(derivedClassVariableSymbol != NULL);
9024 SgName derivedClassVariableName = derivedClassVariableSymbol->
get_name();
9026#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9027 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): derivedClassVariableName = %s \n",derivedClassVariableName.str());
9031 ROSE_ASSERT(type != NULL);
9033#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9034 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs type = %p = %s \n",type,type->
class_name().c_str());
9038 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);
9040#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9041 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs stripped_type = %p = %s \n",stripped_type,stripped_type->
class_name().c_str());
9045 SgClassType* classType = isSgClassType(stripped_type);
9048 if (classType != NULL)
9050#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9051 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs classType = %p = %s \n",classType,classType->
class_name().c_str());
9052 SgClassDeclaration* classDeclaration = isSgClassDeclaration(classType->get_declaration());
9053 ROSE_ASSERT(classDeclaration != NULL);
9054 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs classDeclaration = %p = %s name = %s \n",
9055 classDeclaration,classDeclaration->
class_name().c_str(),classDeclaration->get_name().str());
9060 classChain.push_front(classType);
9064#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9065 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs stripped_type is not a SgClassType \n");
9071#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9072 printf (
"Need to support alternative to SgVarRefExp: temp_lhs = %p = %s \n",temp_lhs,temp_lhs->
class_name().c_str());
9075 ROSE_ASSERT(type != NULL);
9077#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9078 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs type = %p = %s name = %s \n",type,type->
class_name().c_str(),
get_name(type).c_str());
9082 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);
9084#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9085 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());
9088 SgClassType* classType = isSgClassType(stripped_type);
9090 if (classType != NULL)
9092 classChain.push_front(classType);
9096#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9097 printf (
"classChain.size() = %zu \n",classChain.size());
9098 std::list<SgClassType*>::iterator iter = classChain.begin();
9099 while(iter != classChain.end())
9101 printf (
" --- *iter = %p = %s name = %s \n",*iter,(*iter)->class_name().c_str(),(*iter)->get_name().str());
9114 if (varRefExp != NULL)
9116 ROSE_ASSERT(varRefExp != NULL);
9117 ROSE_ASSERT(memberFunctionRefExp == NULL);
9119 referenceSymbol = varRefExp->get_symbol();
9123 ROSE_ASSERT(varRefExp == NULL);
9124 ROSE_ASSERT(memberFunctionRefExp != NULL);
9126 referenceSymbol = memberFunctionRefExp->get_symbol();
9128 ROSE_ASSERT(referenceSymbol != NULL);
9131#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9132 printf (
"referenceSymbol = %p = %s \n",referenceSymbol,referenceSymbol->
class_name().c_str());
9133 printf (
"symbolName = %s \n",symbolName.str());
9138 if (functionSymbol != NULL)
9143 if (templateInstantiationMemberFunctionDeclaration != NULL)
9145#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9146 printf (
"This is a template name, we want the name without template arguments \n");
9147 printf (
"templateInstantiationMemberFunctionDeclaration = %p \n",templateInstantiationMemberFunctionDeclaration);
9148 printf (
"templateInstantiationMemberFunctionDeclaration->get_name() = %s \n",templateInstantiationMemberFunctionDeclaration->get_name().str());
9155 isSgTemplateMemberFunctionDeclaration(templateInstantiationMemberFunctionDeclaration->
get_templateDeclaration());
9156 if (templateMemberFunctionDeclaration != NULL)
9158#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9159 printf (
"templateMemberFunctionDeclaration = %p \n",templateMemberFunctionDeclaration);
9160 printf (
"templateMemberFunctionDeclaration->get_name() = %s \n",templateMemberFunctionDeclaration->get_name().str());
9163 symbolName = templateMemberFunctionDeclaration->get_name();
9167#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9168 printf (
"templateMemberFunctionDeclaration == NULL: template declaration not available from template instantiation (rare, I think) \n");
9172 printf (
"Exiting as a test! \n");
9180 ROSE_ASSERT(declarationStatement != NULL);
9181#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9182 printf (
"functionSymbol != NULL: but declaration is not a member function: declarationStatement = %p = %s \n",declarationStatement,declarationStatement->
class_name().c_str());
9189 if (variableSymbol != NULL)
9195#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9196 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): NOTE: referenceSymbol is not a SgFunctionSymbol or SgVariableSymbol \n");
9199 printf (
"Exiting as a test! \n");
9206#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9207 printf (
"symbolName = %s \n",symbolName.str());
9216 std::list<SgClassType*> saveList;
9218#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9219 printf (
"classChain.size() = %zu \n",classChain.size());
9222 std::list<SgClassType*>::iterator i = classChain.begin();
9223 std::list<SgClassType*>::iterator save_iter = i;
9229 bool ambiguityDetectedSoSaveWholeChain =
false;
9231 while(i != classChain.end())
9233#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9234 printf (
"******** TOP OF WHILE LOOP ******** \n");
9235 printf (
" --- *i = %p = %s name = %s \n",*i,(*i)->class_name().c_str(),(*i)->get_name().str());
9236 printf (
" --- --- referenceSymbol = %p = %s \n",referenceSymbol,referenceSymbol->
class_name().c_str());
9238 bool ambiguityDetected =
false;
9241 ROSE_ASSERT(declarationStatement != NULL);
9243 if (definingDeclarationStatement != NULL)
9245 SgClassDeclaration* classDeclaration = isSgClassDeclaration(definingDeclarationStatement);
9246 ROSE_ASSERT(classDeclaration != NULL);
9249#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9250 printf (
" --- classDeclaration = %p = %s name = %s \n",classDeclaration,classDeclaration->
class_name().c_str(),classDeclaration->get_name().str());
9251 printf (
" --- classDefinition = %p = %s \n",classDefinition,classDefinition->
class_name().c_str());
9254 ambiguityDetected = classDefinition->hasAmbiguity(symbolName,referenceSymbol);
9256#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9257 printf (
" --- ambiguityDetected = %s \n",ambiguityDetected ?
"true" :
"false");
9262 if (ambiguityDetected ==
true || ambiguityDetectedSoSaveWholeChain ==
true)
9264 ambiguityDetectedSoSaveWholeChain =
true;
9266 if (save_iter != classChain.end())
9268#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9269 printf (
" --- add to saveList: *save_iter = %p \n",*save_iter);
9271 saveList.push_back(*save_iter);
9275#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9276 printf (
" --- save_iter == classChain.end() \n");
9281#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9282 printf (
"******** BOTTOM OF WHILE LOOP ******** \n");
9292#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9293 printf (
"saveList.size() = %zu \n",saveList.size());
9294 std::list<SgClassType*>::iterator saveList_iterator = saveList.begin();
9295 while (saveList_iterator != saveList.end())
9297 printf (
" --- *saveList_iterator = %p = %s name = %s \n",*saveList_iterator,(*saveList_iterator)->class_name().c_str(),(*saveList_iterator)->get_name().str());
9299 saveList_iterator++;
9303 returnTypeChain = saveList;
9308 return returnTypeChain;
9318#define DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE 0
9320 ROSE_ASSERT(memberFunctionRefExp != NULL);
9322 bool returnValue =
false;
9328 SgDotExp* dotExp = isSgDotExp(parent);
9335 if (arrowExp != NULL || dotExp != NULL || addressOfOp != NULL)
9339 ROSE_ASSERT(symbol != NULL);
9342 ROSE_ASSERT(functionDeclaration != NULL);
9345 if (functionDeclaration != NULL)
9347 bool isStatic = functionDeclaration->get_declarationModifier().get_storageModifier().
isStatic();
9348#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9349 printf (
"isStatic = %s \n",
isStatic ?
"true" :
"false");
9354 ROSE_ASSERT(scope != NULL);
9357 if (classDefinition != NULL)
9365#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9366 printf (
"In SageInterface::isMemberFunctionMemberReference(): memberFunctionRefExp is not associated with variableDeclaration (could not compute if it is static data member) \n");
9372#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9373 printf (
"In SageInterface::isMemberFunctionMemberReference(): memberFunctionRefExp parent is not a is not SgArrowExp or SgDotExp expression \n");
9377#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9378 printf (
"Leaving SageInterface::isMemberFunctionMemberReference(): returnValue = %s \n",returnValue ?
"true" :
"false");
9397#define DEBUG_IS_DATA_MEMBER_REFERENCE 0
9399 ROSE_ASSERT(varRefExp != NULL);
9401 bool returnValue =
false;
9407 SgDotExp* dotExp = isSgDotExp(parent);
9411 if (arrowExp != NULL || dotExp != NULL || addressOfOp != NULL)
9413 if (arrowExp != NULL)
9417 ROSE_ASSERT(parentOfArrowExp != NULL);
9418 SgSizeOfOp* sizeOfOp = isSgSizeOfOp(parentOfArrowExp);
9419 if (sizeOfOp != NULL && sizeOfOp->get_is_objectless_nonstatic_data_member_reference() ==
true)
9422#if DEBUG_IS_DATA_MEMBER_REFERENCE
9423 printf (
"In SageInterface::isDataMemberReference(): Found case of expression used in sizeof with objectless_nonstatic_data_member_reference \n");
9430 ROSE_ASSERT(symbol != NULL);
9433 ROSE_ASSERT(initializedName != NULL);
9437 if (variableDeclaration != NULL)
9439 bool isStatic = variableDeclaration->get_declarationModifier().get_storageModifier().
isStatic();
9443 ROSE_ASSERT(scope != NULL);
9446 if (classDefinition != NULL)
9454#if DEBUG_IS_DATA_MEMBER_REFERENCE
9455 printf (
"In SageInterface::isDataMemberReference(): varRefExp is not associated with variableDeclaration (could not compute if it is static data member) \n");
9461#if DEBUG_IS_DATA_MEMBER_REFERENCE
9462 printf (
"In SageInterface::isDataMemberReference(): varRefExp parent is not a is not SgArrowExp or SgDotExp expression \n");
9466#if DEBUG_IS_DATA_MEMBER_REFERENCE
9467 printf (
"Leaving SageInterface::isDataMemberReference(): returnValue = %s \n",returnValue ?
"true" :
"false");
9479 ROSE_ASSERT(varRefExp != NULL);
9481 bool returnValue =
false;
9485 if (addressOfOp != NULL)
9503 ROSE_ASSERT(varRefExp != NULL || memberFunctionRefExp != NULL);
9507 ROSE_ASSERT(refExp != NULL);
9509 bool returnValue =
false;
9514 if (addressOfOp != NULL)
9532 ROSE_ASSERT (astNode != NULL);
9536 ROSE_ASSERT (isSgProject(astNode) == NULL);
9538 SgNode* previous_parent = NULL;
9539 SgNode* previous_previous_parent = NULL;
9541 SgNode* parent = astNode;
9543 while ( (parent != NULL) && (isSgFile(parent) == NULL) && isSgJavaPackageDeclaration(parent) == NULL)
9546 printf (
"In getEnclosingFileNode(): parent = %p = %s \n",parent,parent->
class_name().c_str());
9548 previous_previous_parent = previous_parent;
9549 previous_parent = parent;
9554 if (previous_previous_parent != NULL && previous_parent != NULL && isSgJavaPackageDeclaration(parent) != NULL)
9558 printf (
"parent = %p = %s \n",parent,parent->
class_name().c_str());
9559 printf (
"previous_parent = %p = %s \n",previous_parent,previous_parent->
class_name().c_str());
9560 printf (
"previous_previous_parent = %p = %s \n",previous_previous_parent,previous_previous_parent->
class_name().c_str());
9562 SgClassDeclaration* classDeclaration = isSgClassDeclaration(previous_previous_parent);
9563 if (classDeclaration != NULL)
9566 printf (
"Class name = %p = %s = %s \n",classDeclaration,classDeclaration->
class_name().c_str(),classDeclaration->get_name().str());
9571 SgProject* project = TransformationSupport::getProject(parent);
9572 ROSE_ASSERT(project != NULL);
9573 SgFileList* fileList = project->get_fileList_ptr();
9574 ROSE_ASSERT(fileList != NULL);
9575 SgFilePtrList & vectorFile = fileList->get_listOfFiles();
9577 printf (
"Output list of files: \n");
9579 SgFilePtrList::iterator i = vectorFile.begin();
9580 while (i != vectorFile.end())
9583 ROSE_ASSERT(file != NULL);
9585 printf (
" --- filename = %s \n",file->
getFileName().c_str());
9588 string filenameWithoutPath = file->get_sourceFileNameWithoutPath();
9589 string classname = classDeclaration->get_name();
9590 string matchingfilename = classname +
".java";
9592 printf (
" --- --- filename = %s \n",filename.c_str());
9593 printf (
" --- --- filenameWithoutPath = %s \n",filenameWithoutPath.c_str());
9594 printf (
" --- --- classname = %s \n",classname.c_str());
9595 printf (
" --- --- matchingfilename = %s \n",matchingfilename.c_str());
9597 if (filenameWithoutPath == matchingfilename)
9600 printf (
" return file = %p \n",file);
9616 SgSourceFile *sourcefile = isSgSourceFile(attribute->getNode());
9617 ROSE_ASSERT(sourcefile != NULL);
9626 if (previous_parent == NULL && isSgJavaPackageDeclaration(parent) != NULL)
9629 ROSE_ASSERT(isSgJavaPackageDeclaration(astNode) != NULL);
9634 if (previous_previous_parent == NULL && isSgJavaPackageDeclaration(parent) != NULL)
9637 ROSE_ASSERT(isSgClassDefinition(astNode) != NULL);
9648 if (parent ==
nullptr)
9654 return isSgFile(parent);
9660 std::set<SgNode*> specific;
9661 std::set<SgNode*> non_specific;
9663 static void recursive_collect(
SgNode* node , std::set<SgNode *> & collection ) {
9665 if (node == NULL || !collection.insert(node).second)
return;
9668 for (std::vector<std::pair<SgNode*, std::string> >::iterator i = data_members.begin(); i != data_members.end(); ++i) {
9669 recursive_collect(i->first, collection);
9676 if (fileInfo != NULL) {
9677 if (fileInfo->isFrontendSpecific()) {
9679 recursive_collect(n, specific);
9681 non_specific.insert(n);
9682 recursive_collect(n, non_specific);
9685 fileInfo = isSg_File_Info(n);
9686 if (fileInfo != NULL) {
9687 if (fileInfo->isFrontendSpecific()) {
9690 non_specific.insert(n);
9696 std::set<SgNode*> apply() {
9697 traverseMemoryPool();
9699 std::set<SgNode*> result;
9701 std::set_difference(
9702 specific.begin(), specific.end(),
9703 non_specific.begin(), non_specific.end(),
9704 std::insert_iterator<set<SgNode*> >(result, result.begin())
9711 FrontendSpecificTraversal fst;
9724 void visit(
SgNode *astNode)
9726 ROSE_ASSERT(astNode != NULL);
9728 if (file_info != NULL)
9732 printf (
"Found shared node: astNode = %p = %s \n",astNode,astNode->
class_name().c_str());
9738 OutputSharedNodesTraversal tt;
9739 tt.traverse(node,preorder);
9747 while (n && !isSgStatement(n)) n = n->
get_parent();
9748 return isSgStatement(n);
9757SageInterface::DeferredTransformation::DeferredTransformation()
9758 : deferredTransformationKind(e_default),
9759 statementToRemove(NULL),
9760 statementToAdd(NULL),
9761 class_definition(NULL),
9762 target_class_member(NULL),
9763 new_function_prototype(NULL),
9765 locationToOverwriteWithTransformation(NULL),
9766 transformationToOverwriteFirstStatementInInterval(NULL),
9767 blockOfStatementsToOutline(NULL)
9771 printf (
"In SageInterface::DeferredTransformation default constructor called \n");
9779SageInterface::DeferredTransformation::DeferredTransformation(
9783 : deferredTransformationKind(e_outliner),
9784 statementToRemove(NULL),
9785 statementToAdd(NULL),
9786 class_definition(input_class_definition),
9787 target_class_member(input_target_class_member),
9788 new_function_prototype(input_new_function_prototype),
9790 locationToOverwriteWithTransformation(NULL),
9791 transformationToOverwriteFirstStatementInInterval(NULL),
9792 blockOfStatementsToOutline(NULL)
9796 printf (
"In SageInterface::DeferredTransformation constructor for outliner called \n");
9804 printf (
"In SageInterface::DeferredTransformation constructor for replaceDefiningFunctionDeclarationWithFunctionPrototype called \n");
9810 X.deferredTransformationKind = e_replaceDefiningFunctionDeclarationWithFunctionPrototype;
9811 X.statementToRemove = functionDeclaration;
9812 X.statementToAdd = NULL;
9813 X.class_definition = NULL;
9814 X.target_class_member = NULL;
9815 X.new_function_prototype = NULL;
9818 X.locationToOverwriteWithTransformation = NULL;
9819 X.transformationToOverwriteFirstStatementInInterval = NULL;
9820 X.blockOfStatementsToOutline = NULL;
9826SageInterface::DeferredTransformation::replaceStatement(
SgStatement* oldStmt,
SgStatement* newStmt,
bool )
9829 printf (
"In SageInterface::DeferredTransformation constructor for replaceStatement called \n");
9835 X.deferredTransformationKind = e_replaceStatement;
9836 X.statementToRemove = oldStmt;
9837 X.statementToAdd = newStmt;
9838 X.class_definition = NULL;
9839 X.target_class_member = NULL;
9840 X.new_function_prototype = NULL;
9843 X.locationToOverwriteWithTransformation = NULL;
9844 X.transformationToOverwriteFirstStatementInInterval = NULL;
9845 X.blockOfStatementsToOutline = NULL;
9850SageInterface::DeferredTransformation::DeferredTransformation (
const DeferredTransformation& X)
9852 : deferredTransformationKind(X.deferredTransformationKind),
9853 statementToRemove(X.statementToRemove),
9854 statementToAdd(X.StatementToAdd),
9855 class_definition(X.class_definition),
9856 target_class_member(X.target_class_member),
9857 new_function_prototype(X.new_function_prototype),
9858 targetClasses(X.targetClasses),
9859 targetFriends(X.targetFriends)
9865 printf (
"In SageInterface::DeferredTransformation copy constructor called \n");
9875 printf (
"Inside of SageInterface::DeferredTransformation::operator= (const DeferredTransformation& X) \n");
9880 targetFriends = X.targetFriends;
9881 targetClasses = X.targetClasses;
9887 transformationLabel = X.transformationLabel;
9890 deferredTransformationKind = X.deferredTransformationKind;
9891 statementToRemove = X.statementToRemove;
9892 statementToAdd = X.statementToAdd;
9894 class_definition = X.class_definition;
9895 target_class_member = X.target_class_member;
9896 new_function_prototype = X.new_function_prototype;
9897 targetClasses = X.targetClasses;
9898 targetFriends = X.targetFriends;
9901 statementInterval = X.statementInterval;
9902 locationToOverwriteWithTransformation = X.locationToOverwriteWithTransformation;
9903 transformationToOverwriteFirstStatementInInterval = X.transformationToOverwriteFirstStatementInInterval;
9906 blockOfStatementsToOutline = X.blockOfStatementsToOutline;
9917std::string SageInterface::DeferredTransformation::outputDeferredTransformationKind(
const TransformationKind & kind)
9919 string returnValue =
"uninitialized";
9922 case e_error: returnValue =
"e_error";
break;
9923 case e_default: returnValue =
"e_default";
break;
9924 case e_outliner: returnValue =
"e_outliner";
break;
9925 case e_replaceStatement: returnValue =
"e_replaceStatement";
break;
9926 case e_removeStatement: returnValue =
"e_removeStatement";
break;
9927 case e_replaceDefiningFunctionDeclarationWithFunctionPrototype: returnValue =
"e_replaceDefiningFunctionDeclarationWithFunctionPrototype";
break;
9928 case e_last: returnValue =
"e_last";
break;
9931 printf (
"Error: SageInterface::DeferredTransformation::get_deferredTransformationKind_string(): default reached \n");
9939void SageInterface::DeferredTransformation::display ( std::string label )
const
9941 printf (
"SageInterface::DeferredTransformation::display(): label = %s \n",label.c_str());
9946 printf (
" --- transformationLabel = %s \n",transformationLabel.c_str());
9948 printf (
" --- deferredTransformationKind = %s \n",outputDeferredTransformationKind(deferredTransformationKind).c_str());
9949 if (statementToRemove != NULL)
9951 printf (
" --- statementToRemove = %p = %s name = %s \n",statementToRemove,statementToRemove->class_name().c_str(),
get_name(statementToRemove).c_str());
9955 printf (
" --- statementToRemove == NULL \n");
9958 if (statementToAdd != NULL)
9960 printf (
" --- statementToAdd = %p = %s name = %s \n",statementToAdd,statementToAdd->class_name().c_str(),
get_name(statementToAdd).c_str());
9964 printf (
" --- statementToAdd == NULL \n");
9967 if (class_definition != NULL)
9970 printf (
" --- class_definition = %p \n",class_definition);
9973 if (target_class_member != NULL)
9975 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());
9978 if (new_function_prototype != NULL)
9980 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());
9984 if (locationToOverwriteWithTransformation != NULL)
9988 printf (
" --- locationToOverwriteWithTransformation = %p \n",locationToOverwriteWithTransformation);
9992 if (transformationToOverwriteFirstStatementInInterval != NULL)
9996 printf (
" --- transformationToOverwriteFirstStatementInInterval = %p \n",transformationToOverwriteFirstStatementInInterval);
10000 if (blockOfStatementsToOutline != NULL)
10002 printf (
" --- blockOfStatementsToOutline = %p \n",blockOfStatementsToOutline);
10005 printf (
"targetClasses.size() = %zu \n",targetClasses.size());
10006 printf (
"targetFriends.size() = %zu \n",targetFriends.size());
10009 printf (
"statementInterval.size() = %zu \n",statementInterval.size());
10019#define REMOVE_STATEMENT_DEBUG 0
10024#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
10035 ASSERT_not_null(targetStmt);
10043 bool isRemovable = (parentStatement != NULL) ? LowLevelRewrite::isRemovableStatement(targetStmt) :
false;
10045#if REMOVE_STATEMENT_DEBUG || 0
10046 printf (
"In SageInterface::removeStatement(): parentStatement = %p = %s remove targetStatement = %p = %s (isRemovable = %s) \n",
10047 parentStatement,parentStatement->
class_name().c_str(),targetStmt,targetStmt->
class_name().c_str(),isRemovable ?
"true" :
"false");
10050 if (isRemovable ==
true)
10057 if (autoRelocatePreprocessingInfo ==
true)
10067 if (comments !=
nullptr && isSgBasicBlock(targetStmt) ==
nullptr )
10069 vector<int> captureList;
10070#if REMOVE_STATEMENT_DEBUG
10071 printf (
"Found attached comments (removing %p = %s): comments->size() = %" PRIuPTR
" \n",targetStmt,targetStmt->
class_name().c_str(),comments->size());
10077 int commentIndex = 0;
10078 AttachedPreprocessingInfoType::iterator i;
10079 for (i = comments->begin(); i != comments->end(); i++)
10081 ROSE_ASSERT ( (*i) != NULL );
10082#if REMOVE_STATEMENT_DEBUG
10083 printf (
" Attached Comment (relativePosition=%s): %s\n",
10084 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
10085 (*i)->getString().c_str());
10086 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
10087 (*i)->get_file_info()->display(
"comment/directive location debug");
10089 captureList.push_back(commentIndex);
10093#if REMOVE_STATEMENT_DEBUG
10094 printf (
"captureList.size() = %" PRIuPTR
" \n",captureList.size());
10097 if (captureList.empty() ==
false)
10102 bool surroundingStatementPreceedsTargetStatement =
false;
10105 if (surroundingStatement !=
nullptr)
10108#if REMOVE_STATEMENT_DEBUG
10109 printf (
"In removeStatement(): surroundingStatementPreceedsTargetStatement = %s \n",surroundingStatementPreceedsTargetStatement ?
"true" :
"false");
10110 printf (
" --- moving comments from targetStmt = %p = %s name = %s \n",targetStmt,targetStmt->
class_name().c_str(),
get_name(targetStmt).c_str());
10111 printf (
" --- moving comments to surroundingStatement = %p = %s name = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str(),
get_name(surroundingStatement).c_str());
10126 printf (
"Error: This is not supported within Microsoft Windows (I forget why). \n");
10148 printf (
"In SageInterface::resetInternalMapsForTargetStatement(SgStatement*): sourceStatement = %p = %s \n",sourceStatement,sourceStatement->
class_name().c_str());
10157 printf (
"In SageInterface::resetInternalMapsForTargetStatement(SgStatement*): sourceFile = %p \n",sourceFile);
10160 if (sourceFile != NULL)
10162 std::map<SgStatement*,MacroExpansion*> & macroExpansionMap = sourceFile->get_macroExpansionMap();
10164 if (macroExpansionMap.find(sourceStatement) != macroExpansionMap.end())
10166 MacroExpansion* macroExpansion = macroExpansionMap[sourceStatement];
10167 ROSE_ASSERT(macroExpansion != NULL);
10169 printf (
"In resetInternalMapsForTargetStatement(): macroExpansion = %p = %s \n",macroExpansion,macroExpansion->macro_name.c_str());
10171 if (macroExpansion->isTransformed ==
false)
10174 std::vector<SgStatement*> & associatedStatementVector = macroExpansion->associatedStatementVector;
10176 for (
size_t i = 0; i < associatedStatementVector.size(); i++)
10179 SgStatement* statement = associatedStatementVector[i];
10181 printf (
"Mark as transformation to be output: statement = %p = %s \n",statement,statement->
class_name().c_str());
10205 macroExpansion->isTransformed =
true;
10222#if REMOVE_STATEMENT_DEBUG || 0
10223 printf (
"In moveCommentsToNewStatement(): destinationStatementProceedsSourceStatement = %s \n",destinationStatementProceedsSourceStatement ?
"true" :
"false");
10224 printf (
" --- sourceStatement = %p = %s name = %s \n",sourceStatement,sourceStatement->
class_name().c_str(),
get_name(sourceStatement).c_str());
10225 printf (
" --- destinationStatement = %p = %s name = %s \n",destinationStatement,destinationStatement->
class_name().c_str(),
get_name(destinationStatement).c_str());
10233#if REMOVE_STATEMENT_DEBUG
10234 printf (
"Output the comments attached to sourceStatement: \n");
10236 printf (
"Output the comments attached to destinationStatement: \n");
10241 vector<int>::const_iterator j = indexList.begin();
10243 while (j != indexList.end())
10246 ROSE_ASSERT(destinationStatement->
get_file_info() != NULL);
10247#if REMOVE_STATEMENT_DEBUG || 0
10248 printf (
"Attaching comments to destinationStatement = %p = %s on file = %s line %d \n",
10249 destinationStatement,destinationStatement->
class_name().c_str(),
10250 destinationStatement->
get_file_info()->get_filenameString().c_str(),
10253 printf (
"(*comments)[*j]->getRelativePosition() = %s \n",PreprocessingInfo::relativePositionName((*comments)[*j]->getRelativePosition()).c_str());
10265 if (destinationStatementProceedsSourceStatement ==
true || isSgGlobal(destinationStatement) != NULL )
10271 auto commentPosition = (*comments)[*j]->getRelativePosition();
10272 if (commentPosition == PreprocessingInfo::before)
10275 (*comments)[*j]->setRelativePosition(PreprocessingInfo::after);
10277 else if (commentPosition == PreprocessingInfo::after ||
10278 commentPosition == PreprocessingInfo::end_of)
10284 ROSE_ASSERT(
false &&
"Comment relative position neither, before, after, nor end_of");
10296 (*comments)[*j]->setRelativePosition(PreprocessingInfo::inside);
10307 if ((*comments)[*j]->getRelativePosition() == PreprocessingInfo::before)
10315 ASSERT_require((*comments)[*j]->getRelativePosition() == PreprocessingInfo::after||
10316 (*comments)[*j]->getRelativePosition() == PreprocessingInfo::end_of);
10317 (*comments)[*j]->setRelativePosition(PreprocessingInfo::before);
10326 if (targetInfoList==NULL)
10335 if( prevTargetAnchorComment==NULL)
10348 prevTargetAnchorComment = (*comments)[*j];
10353#if REMOVE_STATEMENT_DEBUG
10354 printf (
"Marking entry from comments list as NULL on sourceStatement = %p = %s \n",sourceStatement,sourceStatement->
class_name().c_str());
10356 (*comments)[*j] =
nullptr;
10363 for (
size_t n = 0; n < indexList.size(); n++)
10365#if REMOVE_STATEMENT_DEBUG || 0
10366 printf (
"Erase entry from comments list on comments->size() %" PRIuPTR
" \n",comments->size());
10368 bool modifiedList =
false;
10369 AttachedPreprocessingInfoType::iterator k = comments->begin();
10370 while (k != comments->end() && modifiedList ==
false)
10375 k = comments->erase(k);
10376 modifiedList =
true;
10398 ROSE_ASSERT(targetStmt != NULL);
10403#if REMOVE_STATEMENT_DEBUG || 0
10404 printf (
"TOP of findSurroundingStatementFromSameFile(): surroundingStatementPreceedsTargetStatement = %s \n",surroundingStatementPreceedsTargetStatement ?
"true" :
"false");
10407 std::set<SgStatement*> previousVisitedStatementSet;
10412 surroundingStatementPreceedsTargetStatement =
true;
10414#if REMOVE_STATEMENT_DEBUG
10415 printf (
" targetStmt->get_file_info()->get_file_id() = %d \n",targetStmt->
get_file_info()->get_file_id());
10417#if REMOVE_STATEMENT_DEBUG
10418 printf (
"Before loop: surroundingStatement = %p = %s name = %s surroundingStatement_fileId = %d \n",surroundingStatement,
10421 bool returningNullSurroundingStatement =
false;
10433#if REMOVE_STATEMENT_DEBUG
10434 printf (
"In loop: after getPreviousStatement(): surroundingStatement = %p = %s name = %s \n",surroundingStatement,
10438 if (surroundingStatement == NULL)
10441#if REMOVE_STATEMENT_DEBUG
10442 printf (
" surroundingStatement_fileId set to Sg_File_Info::BAD_FILE_ID \n");
10447 surroundingStatement_fileId = surroundingStatement->
get_file_info()->get_file_id();
10448#if REMOVE_STATEMENT_DEBUG
10449 printf (
" surroundingStatement = %p = %s surroundingStatement->get_file_info()->get_file_id() = %d \n",
10450 surroundingStatement,surroundingStatement->
class_name().c_str(),surroundingStatement->
get_file_info()->get_file_id());
10454#if REMOVE_STATEMENT_DEBUG
10455 if (surroundingStatement != NULL)
10457 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",
10458 surroundingStatement,surroundingStatement->
class_name().c_str(),
10459 surroundingStatement->
get_file_info()->get_filenameString().c_str(),
10465 printf (
"surroundingStatement == NULL \n");
10470 if (previousVisitedStatementSet.find(surroundingStatement) != previousVisitedStatementSet.end())
10472 printf (
"This statement has been previously visited: surroundingStatement = %p = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str());
10474 printf (
"ERROR: SageInterface::findSurroundingStatementFromSameFile(): cannot located surrounding statement from same file (return NULL) \n");
10476 surroundingStatement = NULL;
10482 previousVisitedStatementSet.insert(surroundingStatement);
10486 if (surroundingStatement == NULL || isSgGlobal(surroundingStatement) != NULL)
10489#if REMOVE_STATEMENT_DEBUG
10490 printf (
"We just ran off the start (top) of the file... targetStmt = %p = %s \n",targetStmt,targetStmt->
class_name().c_str());
10496 surroundingStatementPreceedsTargetStatement =
false;
10499 surroundingStatement = targetStmt;
10500 SgStatement* previousStatement = surroundingStatement;
10504 std::set<SgStatement*> forwardVisitedStatementSet;
10507 while ( (surroundingStatement != NULL) && (surroundingStatement_fileId != targetStmt->
get_file_info()->get_file_id()) )
10510 if (forwardVisitedStatementSet.find(surroundingStatement) != forwardVisitedStatementSet.end())
10512 printf (
"This statement has been previously visited: surroundingStatement = %p = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str());
10514 printf (
"ERROR: SageInterface::findSurroundingStatementFromSameFile(): cannot located surrounding statement from same file (return NULL) \n");
10516 surroundingStatement = NULL;
10522 forwardVisitedStatementSet.insert(surroundingStatement);
10525 previousStatement = surroundingStatement;
10528 if (surroundingStatement == NULL)
10531#if REMOVE_STATEMENT_DEBUG
10532 printf (
"We just ran off the end (bottom) of the file... \n");
10537 returningNullSurroundingStatement =
true;
10541 surroundingStatement_fileId = surroundingStatement->
get_file_info()->get_file_id();
10542#if REMOVE_STATEMENT_DEBUG
10543 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",
10544 surroundingStatement,surroundingStatement->
class_name().c_str(),
10545 surroundingStatement->
get_file_info()->get_filenameString().c_str(),
10552 if (surroundingStatement == NULL)
10554#if REMOVE_STATEMENT_DEBUG
10555 printf (
"Resetting the surroundingStatement to the previousStatement = %p = %s \n",previousStatement,previousStatement->
class_name().c_str());
10557 surroundingStatement = previousStatement;
10560 if (surroundingStatement == targetStmt)
10564#if REMOVE_STATEMENT_DEBUG
10565 printf (
"Setting the surroundingStatement to be global scope \n");
10567 surroundingStatement = TransformationSupport::getGlobalScope(targetStmt);
10573 ROSE_ASSERT(surroundingStatement != NULL);
10577 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());
10578 surroundingStatement = NULL;
10581#if REMOVE_STATEMENT_DEBUG
10582 printf (
"BOTTOM of findSurroundingStatementFromSameFile(): surroundingStatementPreceedsTargetStatement = %s surroundingStatement = %p \n",surroundingStatementPreceedsTargetStatement ?
"true" :
"false",surroundingStatement);
10583 if (surroundingStatement != NULL)
10585 printf (
"surroundingStatement = %p = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str());
10591 return surroundingStatement;
10601 virtual void visit(
SgNode* n) {
10605 Visitor().
traverse(root, postorder);
10615 ROSE_ASSERT(oldStmt);
10616 ROSE_ASSERT(newStmt);
10618 if (oldStmt == newStmt)
return;
10629 ROSE_ASSERT (f_do->get_body() == oldStmt);
10630 if (!isSgBasicBlock(newStmt))
10632 f_do->set_body(isSgBasicBlock(newStmt));
10649 printf (
"In SageInterface::replaceStatement(): physical_file_id = %d \n",physical_file_id);
10660 if (movePreprocessingInfoValue)
10668 printf (
"In SageInterface::replaceStatement(): calling moveUpPreprocessingInfo() changed to movePreprocessingInfo() \n");
10680 bool usePrepend =
true;
10682 movePreprocessingInfo ( oldStmt, newStmt, PreprocessingInfo::undef, PreprocessingInfo::undef, usePrepend );
10703 printf (
"In SageInterface::moveDeclarationToAssociatedNamespace(): declarationStatement = %p = %s \n",declarationStatement,declarationStatement->
class_name().c_str());
10704 printf (
" --- previousDeclarationStatement = %p = %s \n",previousDeclarationStatement,previousDeclarationStatement != NULL ? previousDeclarationStatement->
class_name().c_str() :
"null");
10705 printf (
" --- nextDeclarationStatement = %p \n",nextDeclarationStatement);
10706 printf (
" --- nextDeclarationStatement = %p = %s \n",nextDeclarationStatement, nextDeclarationStatement != NULL ? nextDeclarationStatement->
class_name().c_str() :
"null");
10710 if (previousDeclarationStatement != NULL)
10716 printf (
"There is no previous statement so there is no namespace to close off! \n");
10719 printf (
"Exiting as a test! \n");
10724 if (nextDeclarationStatement != NULL)
10731 printf (
"There is no next statement so there is no namespace to reopen! \n");
10735 printf (
"Exiting as a test! \n");
10740 if (previousDeclarationStatement != NULL && nextDeclarationStatement != NULL)
10744 printf (
"Identified the most common case... \n");
10749 printf (
"declarationScope = %p = %s \n",declarationScope,declarationScope->
class_name().c_str());
10753 printf (
"Exiting as a test! \n");
10759 if (previousDeclarationStatement != NULL && nextDeclarationStatement == NULL)
10763 printf (
"Found 2nd most common case: previousDeclarationStatement != NULL && nextDeclarationStatement == NULL \n");
10767 printf (
"Exiting as a test! \n");
10773 if (previousDeclarationStatement == NULL && nextDeclarationStatement == NULL)
10775 printf (
"This case should require no special handling, unless we are still in the wrong namespace \n");
10778 printf (
"Exiting as a test! \n");
10783 printf (
"This case should have been caught above! \n");
10786 printf (
"Exiting as a test! \n");
10793 if (declarationParent == NULL)
10796 printf (
"declarationStatement->get_parent() = %p = %s \n",declarationStatement->
get_parent(), (declarationStatement->
get_parent() != NULL) ? declarationStatement->
get_parent()->
class_name().c_str() :
"null");
10802 if (declarationParent != NULL)
10805 ROSE_ASSERT(declarationScope != NULL);
10808 if (namespaceDefinition != NULL)
10811 ROSE_ASSERT(namespaceDeclaration != NULL);
10813 printf (
"The declaration has been identified to be associuated with a valid namespace = %p = %s \n",namespaceDeclaration,namespaceDeclaration->
get_name().str());
10814 printf (
" --- declarationParent = %p = %s \n",declarationParent,declarationParent->
class_name().c_str());
10815 printf (
" --- Move declaration from scope = %p = %s to namespace = %p = %s \n",declarationParent,declarationParent->
class_name().c_str(),namespaceDeclaration,namespaceDeclaration->
get_name().str());
10818 printf (
"Exiting as a test! \n");
10825 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());
10832 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");
10844 if (isSgTemplateInstantiationDefn(node) != NULL)
10847 printf (
"Note: In SageInterface::isTemplateInstantiationNode(): skipping SgTemplateInstantiationDefn \n");
10851 return isSgTemplateInstantiationDecl(node)
10854 || isSgTemplateInstantiationDefn(node)
10855 || isSgTemplateInstantiationFunctionDecl(node)
10856 || isSgTemplateInstantiationMemberFunctionDecl(node)
10857 || isSgTemplateInstantiationTypedefDeclaration(node)
10858 || isSgTemplateInstantiationDirectiveStatement(node)
10867SageInterface::isTemplateDeclarationNode(
SgNode* node)
10870 if (isSgTemplateDefinition(node) != NULL)
10873 printf (
"Note: In SageInterface::isTemplateDeclarationNode(): skipping SgTemplateDefinition \n");
10877 return isSgTemplateInstantiationDecl(node)
10880 || isSgTemplateInstantiationDefn(node)
10881 || isSgTemplateInstantiationFunctionDecl(node)
10882 || isSgTemplateInstantiationMemberFunctionDecl(node)
10883 || isSgTemplateInstantiationTypedefDeclaration(node)
10884 || isSgTemplateInstantiationDirectiveStatement(node)
10897 std::vector<SgDeclarationStatement*> templateInstantiationVector;
10909 if (declaration != NULL)
10911 templateInstantiationVector.push_back(declaration);
10920 std::cerr <<
"This feature for now is available with autotools only!" << std::endl;
10924 std::vector<SgDeclarationStatement*>::iterator j = templateInstantiationVector.begin();
10925 while (j != templateInstantiationVector.end())
10939 SgExpression * pattern_exp = isSgExpression(new_pattern);
10940 ROSE_ASSERT (anchor_exp != NULL);
10941 ROSE_ASSERT (pattern_exp != NULL);
10944 Rose_STL_Container<SgNode*> opaque_exp_list = NodeQuery::querySubTree(pattern_exp,V_SgExpression);
10945 for (
size_t i = 0; i<opaque_exp_list.size(); i++)
10947 SgExpression* opaque_exp = isSgExpression(opaque_exp_list[i]);
10948 ROSE_ASSERT (opaque_exp != NULL);
10949 if (opaque_exp->
variantT() == V_SgVariantExpression)
10958 return new_pattern;
10965 static int counter = 0;
10968 bool collision =
false;
10971 name =
"__" + baseName + boost::lexical_cast<string > (counter++) +
"__";
10977 collision = (nameSymbol != NULL);
10980 Rose_STL_Container<SgNode*> childScopes = NodeQuery::querySubTree(scope, V_SgScopeStatement);
10982 BOOST_FOREACH(
SgNode* childScope, childScopes)
10988 nameSymbol = childScopeStatement->lookup_symbol(
SgName(name),NULL,NULL);
10990 collision = collision || (nameSymbol != NULL);
10992 }
while (collision);
11002 SgType* variableType = expressionType;
11009 SgType* expressionBaseType = expressionType->
stripType(SgType::STRIP_TYPEDEF_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE);
11014 if (
SgArrayType* arrayType=isSgArrayType(expressionType)) {
11015 if(
SgArrayType* strippedArrayType = isSgArrayType(arrayType->stripType(SgType::STRIP_TYPEDEF_TYPE))) {
11016 SgType* strippedArrayBaseType = strippedArrayType->get_base_type();
11022 if (isSgPointerDerefExp(expression))
11030 ROSE_ASSERT(tempVarInitExpression != NULL);
11041 if (initializeInDeclaration)
11048 ROSE_ASSERT(tempVarDeclaration != NULL);
11051 if (reEvaluate != NULL)
11065 return std::make_pair(tempVarDeclaration, varRefExpression);
11078 SgType* variableType = expressionType;
11081 if (
SgArrayType* arrayType=isSgArrayType(expressionType))
11083 if(
SgArrayType* strippedArrayType = isSgArrayType(arrayType->stripType(SgType::STRIP_TYPEDEF_TYPE))) {
11084 SgType* strippedArrayBaseType = strippedArrayType->get_base_type();
11098 ROSE_ASSERT(tempVarDeclaration != NULL);
11102 return std::make_pair(tempVarDeclaration, varRefExpression);
11109 replaceExpressionInSgExpressionPtrList(
SgExpression* oldExp,
SgExpression* newExp, SgExpressionPtrList& lst,
bool replAll =
false)
11111 SgExpressionPtrList::iterator lim = lst.end();
11112 SgExpressionPtrList::iterator pos = lst.begin();
11117 pos = std::find(pos, lim, oldExp);
11119 if (pos != lim) { *pos = newExp; ++pos; chg =
true; }
11120 }
while (replAll && (pos != lim));
11134 ROSE_ASSERT(oldExp);
11135 ROSE_ASSERT(newExp);
11136 if (oldExp==newExp)
return;
11138 if (isSgVarRefExp(newExp))
11142 ROSE_ASSERT(parent!=NULL);
11148 if (isSgExprStatement(parent)) {
11149 isSgExprStatement(parent)->set_expression(newExp);
11150 }
else if (isSgForStatement(parent)) {
11151 ROSE_ASSERT (isSgForStatement(parent)->get_increment() == oldExp);
11152 isSgForStatement(parent)->set_increment(newExp);
11155 if(matlabFor->get_index() == oldExp)
11156 matlabFor->set_index(newExp);
11157 else if(matlabFor->get_range() == oldExp)
11158 matlabFor->set_range(newExp);
11160 ROSE_ASSERT(!
"sub-expression not found");
11162 if(jovFor->get_initialization() == oldExp)
11163 jovFor->set_initialization(newExp);
11164 else if(jovFor->get_while_expression() == oldExp)
11165 jovFor->set_while_expression(newExp);
11166 else if(jovFor->get_by_or_then_expression() == oldExp)
11167 jovFor->set_by_or_then_expression(newExp);
11169 ROSE_ASSERT(!
"sub-expression not found");
11170 }
else if (
SgRangeExp* rngexp = isSgRangeExp(parent)) {
11171 if (rngexp->get_start() == oldExp)
11172 rngexp->set_start(newExp);
11173 else if (rngexp->get_end() == oldExp)
11174 rngexp->set_end(newExp);
11175 else if (rngexp->get_stride() == oldExp)
11176 rngexp->set_stride(newExp);
11178 ROSE_ASSERT(!
"sub-expression not found");
11179 }
else if (isSgReturnStmt(parent)) {
11180 isSgReturnStmt(parent)->set_expression(newExp);
11181 }
else if (isSgBinaryOp(parent)!=NULL) {
11182 if (oldExp==isSgBinaryOp(parent)->get_lhs_operand()) {
11184 }
else if (oldExp==isSgBinaryOp(parent)->get_rhs_operand()) {
11189 }
else if (isSgUnaryOp(parent)!=NULL){
11190 if (oldExp==isSgUnaryOp(parent)->get_operand_i())
11194 }
else if (isSgConditionalExp(parent) != NULL) {
11204 }
else if (isSgExprListExp(parent) != NULL) {
11205 SgExpressionPtrList& explist = isSgExprListExp(parent)->get_expressions();
11206 for (Rose_STL_Container<SgExpression*>::iterator i=explist.begin();i!=explist.end();i++) {
11207 if (isSgExpression(*i)==oldExp) {
11213 }
else if (isSgValueExp(parent)) {
11218 ROSE_ASSERT(oldExp == actexp->get_expression());
11219 actexp->set_expression(newExp);
11221 if (oldExp == attrexp->get_object()) {
11222 attrexp->set_object(newExp);
11223 }
else if (oldExp == attrexp->get_args()) {
11225 ASSERT_not_null(newLst);
11227 attrexp->set_args(newLst);
11232 }
else if ((parentExp=isSgExpression(parent)) != NULL) {
11235 ROSE_ASSERT (worked);
11236 }
else if (isSgInitializedName(parent)) {
11238 if (oldExp == initializedNameParent->get_initializer()) {
11240 ROSE_ASSERT(isSgInitializer(newExp));
11241 initializedNameParent->set_initializer(isSgInitializer(newExp));
11246 }
else if (isSgCaseOptionStmt(parent)) {
11248 if (oldExp == case_stmt->
get_key()) {
11250 }
else if(oldExp == case_stmt->get_key_range_end()) {
11251 case_stmt->set_key_range_end(newExp);
11255 }
else if (isSgProcessControlStatement(parent)) {
11257 if (oldExp == ctrl_stmt->get_quiet()) {
11258 ctrl_stmt->set_quiet(newExp);
11259 }
else if (oldExp == ctrl_stmt->get_code()) {
11260 ctrl_stmt->set_code(newExp);
11264 }
else if (isSgFortranDo(parent)) {
11266 if (oldExp == fortranDo->get_initialization()) {
11267 fortranDo->set_initialization(newExp);
11268 }
else if(oldExp == fortranDo->get_bound()) {
11269 fortranDo->set_bound(newExp);
11270 }
else if (oldExp == fortranDo->get_increment()) {
11271 fortranDo->set_increment(newExp);
11277 ROSE_ASSERT(oldExp == stm->get_condition());
11278 stm->set_condition(newExp);
11281 ROSE_ASSERT(oldExp == ptype->get_modexpr());
11282 ptype->set_modexpr(newExp);
11285 ROSE_ASSERT(oldExp == stm->get_time());
11286 stm->set_time(newExp);
11288 ROSE_ASSERT(oldExp == clause->get_size());
11289 clause->set_size(newExp);
11291 ROSE_ASSERT(oldExp == dcl->get_renamed());
11292 dcl->set_renamed(newExp);
11294 ROSE_ASSERT(oldExp == dcl->get_entryBarrier());
11295 dcl->set_entryBarrier(newExp);
11297 ROSE_ASSERT(oldExp == stm->get_guard());
11298 stm->set_guard(newExp);
11300 ROSE_ASSERT(oldExp == delc->get_delta());
11301 delc->set_delta(newExp);
11303 ROSE_ASSERT(oldExp == digc->get_digits());
11304 digc->set_digits(newExp);
11306 replaceExpressionInSgExpressionPtrList(oldExp, newExp, disc->get_discriminants());
11308 ROSE_ASSERT(oldExp == rngc->get_range());
11309 rngc->set_range(newExp);
11311 replaceExpressionInSgExpressionPtrList(oldExp, newExp, idxc->get_indexRanges());
11313 ROSE_ASSERT(oldExp == vtdcl->get_discriminant());
11314 vtdcl->set_discriminant(newExp);
11316 ROSE_ASSERT(oldExp == clause->get_alignment());
11317 clause->set_alignment(newExp);
11320 if (newLst && (oldExp == vtwhen->get_choices()))
11321 vtwhen->set_choices(newLst);
11325 if (oldExp == clause->get_offset())
11326 clause->set_offset(newExp);
11327 else if (oldExp == clause->get_range() && isSgRangeExp(newExp))
11328 clause->set_range(isSgRangeExp(newExp));
11329 else if (oldExp == clause->get_component() && isSgVarRefExp(newExp))
11330 clause->set_component(isSgVarRefExp(newExp));
11334 if (oldExp == rendcl->get_renamed_function())
11335 rendcl->set_renamed_function(newExp);
11339 cerr<<
"SageInterface::replaceExpression(). Unhandled parent expression type of SageIII enum value: " <<parent->
class_name()<<endl;
11354 return Rose::getNextStatement(currentStmt);
11363 return isSgIntVal(e) && isSgIntVal(e)->get_value() == value;
11368 ROSE_ASSERT(func1&& func2);
11369 bool result =
false;
11370 if (func1 == func2)
11376 if (func1->get_name() == func2->get_name())
11381 if (func1->get_qualified_name().getString() +
11382 func1->get_mangled_name().getString() ==
11383 func2->get_qualified_name().getString() +
11384 func2->get_mangled_name().getString()
11393 if (func1->get_name() == func2->get_name())
11398 cout<<
"Error: SageInterface::isSameFunction(): unhandled language"<<endl;
11409 bool result =
false;
11410 ROSE_ASSERT(stmt != NULL);
11412 ROSE_ASSERT(p_scope != NULL);
11417 if (stmtlist[stmtlist.size()-1] == stmt)
11423 if (stmtlist[stmtlist.size()-1] == stmt)
11428 if (stmtlist[stmtlist.size()-1] == stmt)
11440 virtual void visit(
SgNode* n) {
11442 if (valueExp != NULL) {
11443 valueExp->set_originalExpressionTree(NULL);
11447 if (cast_exp != NULL) {
11448 cast_exp->set_originalExpressionTree(NULL);
11453 Visitor().traverse(top, preorder);
11458 while (s && !isSgSwitchStatement(s)) {
11462 return isSgSwitchStatement(s);
11467 while (s && !isSgOmpClauseBodyStatement(s)) {
11473 return isSgOmpClauseBodyStatement(s);
11479 for (; s; s = isSgStatement(s->
get_parent())) {
11484 case V_SgDoWhileStmt: {
11485 if (label.empty()) {
11490 case V_SgForStatement: {
11491 if (label.empty()) {
11496 case V_SgFortranDo:
11497 case V_SgFortranNonblockedDo: {
11498 if (label.empty() ||
11499 label == isSgFortranDo(sc)->get_string_label()) {
11504 case V_SgWhileStmt: {
11505 if (label.empty() ||
11506 label == isSgWhileStmt(sc)->get_string_label()) {
11511 case V_SgSwitchStatement: {
11512 if (stopOnSwitches)
return sc;
11515 case V_SgJavaForEachStatement: {
11516 if (label.empty()) {
11521 case V_SgJavaLabelStatement: {
11522 if (label.empty() ||
11523 label == isSgJavaLabelStatement(sc)->get_label().getString()) {
11539 virtual void visit(
SgNode* n) {
11540 if (isSgBasicBlock(n)) {
11542 bool changes =
true;
11545 for (SgStatementPtrList::iterator i = bb->
get_statements().begin();
11547 if (isSgGotoStatement(*i)) {
11549 SgStatementPtrList::iterator inext = i;
11553 if (!isSgLabelStatement(*inext))
11568 RemoveJumpsToNextStatementVisitor().traverse(top, postorder);
11577 ROSE_ASSERT (parent);
11581 ROSE_ASSERT (bb || fis);
11582 SgStatementPtrList& siblings =
11584 SgStatementPtrList::iterator j =
11585 std::find(siblings.begin(), siblings.end(), stmt);
11586 ROSE_ASSERT (j != siblings.end());
11599 SgLabelStatementPtrSet& used;
11600 SgLabelStatementPtrSet& all;
11603 FindUsedAndAllLabelsVisitor(SgLabelStatementPtrSet& used,
11604 SgLabelStatementPtrSet& all):
11605 used(used), all(all) {}
11607 virtual void visit(
SgNode* n) {
11608 if (isSgGotoStatement(n)) {
11609 used.insert(isSgGotoStatement(n)->get_label());
11611 if (isSgLabelStatement(n)) {
11612 all.insert(isSgLabelStatement(n));
11617 SgLabelStatementPtrSet used;
11618 SgLabelStatementPtrSet unused;
11619 FindUsedAndAllLabelsVisitor(used, unused).traverse(top, preorder);
11621 for (SgLabelStatementPtrSet::iterator i = used.begin();
11622 i != used.end(); ++i) {
11623 assert (unused.find(*i) != unused.end());
11636 for (SgLabelStatementPtrSet::iterator i = unused.begin();
11637 i != unused.end(); ++i) {
11645 l_stmt->set_statement(NULL);
11655 if (isSgWhileStmt(loopStmt))
return isSgWhileStmt(loopStmt)->
get_body();
11656 if (isSgForStatement(loopStmt))
return isSgForStatement(loopStmt)->
get_loop_body();
11657 if (isSgDoWhileStmt(loopStmt))
return isSgDoWhileStmt(loopStmt)->
get_body();
11659 ROSE_ASSERT (!
"Bad loop kind");
11664 if (isSgWhileStmt(loopStmt)) {
11665 isSgWhileStmt(loopStmt)->
set_body(body);
11666 }
else if (isSgForStatement(loopStmt)) {
11668 }
else if (isSgDoWhileStmt(loopStmt)) {
11669 isSgDoWhileStmt(loopStmt)->
set_body(body);
11671 ROSE_ASSERT (!
"Bad loop kind");
11677 if (isSgWhileStmt(loopStmt))
return isSgWhileStmt(loopStmt)->
get_condition();
11678 if (isSgForStatement(loopStmt))
return isSgForStatement(loopStmt)->get_test();
11679 if (isSgDoWhileStmt(loopStmt))
return isSgDoWhileStmt(loopStmt)->
get_condition();
11681 ROSE_ASSERT (!
"Bad loop kind");
11686 if (isSgWhileStmt(loopStmt)) {
11688 }
else if (isSgForStatement(loopStmt)) {
11689 isSgForStatement(loopStmt)->set_test(cond);
11690 }
else if (isSgDoWhileStmt(loopStmt)) {
11693 ROSE_ASSERT (!
"Bad loop kind");
11702 SgCastExp* cast_exp = isSgCastExp(exp);
11703 if (cast_exp != NULL)
11706 assert(operand != 0);
11707 return SkipCasting(operand);
11716 ROSE_ASSERT(loop!=NULL);
11718 SgStatementPtrList &init = loop ->get_init_stmt();
11719 if (init.size() !=1)
11730 ROSE_ASSERT(ivarname != NULL);
11732 if (isSgAssignInitializer(initor))
11734 lbast = isSgAssignInitializer(initor)->
get_operand();
11749 ROSE_ASSERT(funcDef!=NULL);
11751 ROSE_ASSERT(funcBody!=NULL);
11753 std::ostringstream os;
11754 os<<ivarname->get_name().getString();
11759 if (visibleSym != NULL)
11770 Rose_STL_Container<SgNode*> varRefs = NodeQuery::querySubTree(loop,V_SgVarRefExp);
11771 for (Rose_STL_Container<SgNode *>::iterator i = varRefs.begin(); i != varRefs.end(); i++)
11774 if (vRef->get_symbol()==osymbol)
11775 vRef->set_symbol(nsymbol);
11780 init.push_back(ninit);
11787 trans_records.forLoopInitNormalizationTable[loop] =
true;
11788 trans_records.forLoopInitNormalizationRecord[loop] = make_pair (decl, ndecl) ;
11801 ROSE_ASSERT (loop != NULL);
11803 if (!trans_records.forLoopInitNormalizationTable[loop])
11808 ROSE_ASSERT (decl!= NULL);
11809 ROSE_ASSERT (ndecl!= NULL);
11813 SgStatementPtrList &init = loop ->get_init_stmt();
11814 ROSE_ASSERT(init.size() ==1);
11819 ROSE_ASSERT (exp_stmt != NULL);
11820 SgAssignOp* assign_op = isSgAssignOp(exp_stmt->get_expression());
11821 ROSE_ASSERT (assign_op != NULL);
11828 init.push_back(decl);
11839 Rose_STL_Container<SgNode*> varRefs = NodeQuery::querySubTree(loop,V_SgVarRefExp);
11840 for (Rose_STL_Container<SgNode *>::iterator i = varRefs.begin(); i != varRefs.end(); i++)
11843 if (vRef->get_symbol()==osymbol)
11844 vRef->set_symbol(nsymbol);
11848 trans_records.forLoopInitNormalizationTable[loop] =
false;
11854 ROSE_ASSERT(loop != NULL);
11861 if (test_stmt!=NULL)
11863 if (isSgNullStatement(test_stmt))
11869 if (isSgBinaryOp(test))
11873 ROSE_ASSERT(testlhs && testrhs);
11878 SgVarRefExp* testlhs_var = isSgVarRefExp(SkipCasting(testlhs));
11879 if (testlhs_var == NULL )
11882 if (var_symbol==NULL)
11886 case V_SgLessThanOp:
11891 case V_SgGreaterThanOp:
11895 case V_SgLessOrEqualOp:
11896 case V_SgGreaterOrEqualOp:
11897 case V_SgNotEqualOp:
11906 ROSE_ASSERT(loop != NULL);
11910 if (isSgBinaryOp(test))
11914 ROSE_ASSERT(testlhs && testrhs);
11919 SgVarRefExp* testlhs_var = isSgVarRefExp(SkipCasting(testlhs));
11920 if (testlhs_var == NULL )
11923 if (var_symbol==NULL)
11929 ROSE_ASSERT(incr != NULL);
11931 case V_SgPlusPlusOp:
11934 SgVarRefExp* incr_var = isSgVarRefExp(SkipCasting(isSgPlusPlusOp(incr)->get_operand()));
11935 if (incr_var == NULL)
return false;
11936 if ( incr_var->get_symbol() != var_symbol)
11942 case V_SgMinusMinusOp:
11945 SgVarRefExp* incr_var = isSgVarRefExp(SkipCasting(isSgMinusMinusOp(incr)->get_operand()));
11946 if (incr_var == NULL)
return false;
11947 if ( incr_var->get_symbol() != var_symbol)
11953 case V_SgMinusAssignOp:
11955 SgVarRefExp* incr_var = isSgVarRefExp(SkipCasting(isSgMinusAssignOp(incr)->get_lhs_operand()));
11957 ROSE_ASSERT (rhs != NULL);
11958 if (incr_var == NULL)
return false;
11959 if ( incr_var->get_symbol() != var_symbol)
11966 case V_SgPlusAssignOp:
12021 bool changed =
false;
12023 if (!switchStmt)
return changed;
12027 if (!bodyBlock)
return changed;
12031 std::vector<SgStatement*> stmts(stmtList.begin(), stmtList.end());
12032 int n =
static_cast<int>(stmts.size());
12036 for (
int i = 0; i < n; ) {
12041 auto processLabel = [&](
SgStatement* labelStmt) {
12045 std::vector<SgStatement*> toWrap;
12047 while (j < n && !isSgCaseOptionStmt(stmts[j]) && !isSgDefaultOptionStmt(stmts[j])) {
12048 toWrap.push_back(stmts[j]);
12055 if (toWrap.size() == 1
12056 && isSgBasicBlock(toWrap[0])
12057 && ((isSgCaseOptionStmt(labelStmt) && !isSgBasicBlock(isSgCaseOptionStmt(labelStmt)->get_body()))
12058 || (isSgDefaultOptionStmt(labelStmt) && !isSgBasicBlock(isSgDefaultOptionStmt(labelStmt)->get_body()))))
12064 if (
auto c = isSgCaseOptionStmt(labelStmt)) {
12065 c->set_body(moved);
12066 }
else if (
auto d = isSgDefaultOptionStmt(labelStmt)) {
12067 d->set_body(moved);
12073 else if (!toWrap.empty()) {
12088 if (
auto caseLabel = isSgCaseOptionStmt(labelStmt)) {
12089 caseLabel->set_body(newBlock);
12090 }
else if (
auto defaultLabel = isSgDefaultOptionStmt(labelStmt)) {
12091 defaultLabel->set_body(newBlock);
12095 for (
auto* w: toWrap) {
12108 if (
auto caseLabel = isSgCaseOptionStmt(curr)) {
12109 i = processLabel(caseLabel);
12110 }
else if (
auto defaultLabel = isSgDefaultOptionStmt(curr)) {
12111 i = processLabel(defaultLabel);
12125 ROSE_ASSERT(loop != NULL);
12143 ROSE_ASSERT(body!=NULL);
12161 ROSE_ASSERT (loop != NULL);
12163 if (isSgNullExpression(e_3))
12166 loop->set_increment(iv);
12181 ROSE_ASSERT(func!=NULL);
12182 AstInterfaceImpl faImpl(func->get_definition()->
get_body());
12183 AstInterface fa(&faImpl);
12184 ArrayAnnotation* annot = ArrayAnnotation::get_inst();
12185 ArrayInterface array_interface (*annot);
12186 array_interface.initialize(fa, AstNodePtrImpl(func->get_definition()));
12187 array_interface.observe(fa);
12188 LoopTransformInterface :: set_astInterface(fa);
12189 LoopTransformInterface :: set_arrayInterface(&array_interface);
12193 AstNodePtr result = AstNodePtrImpl(loop->
get_parent()) ;
12195 LoopUnrolling lu(unrolling_factor);
12198 result = lu(lpTrans, result);
12242#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
12244 if (unrolling_factor <= 1)
12265 cerr<<
"Error in SageInterface::loopUnrolling(): target loop is not canonical."<<endl;
12269 ROSE_ASSERT(ivar&& lb && ub && step);
12270 ROSE_ASSERT(isSgBasicBlock(orig_body));
12273 bool needFringe =
true;
12274 SgForStatement* fringe_loop = deepCopy<SgForStatement>(target_loop);
12292 ROSE_ASSERT(scope != NULL);
12296 attachComment(fringe_decl,
"iter_count = (ub-lb+1)%step ==0?(ub-lb+1)/step: (ub-lb+1)/step+1;");
12297 attachComment(fringe_decl,
"fringe = iter_count%unroll_factor==0 ? 0:unroll_factor*step");
12304 ConstantFolding::constantFoldingOptimization(fringe_decl,
false);
12306 ROSE_ASSERT(ivarname != NULL);
12310 if (isSgIntVal(init1->get_operand_i()))
12311 if (isSgIntVal(init1->get_operand_i())->get_value() == 0)
12312 needFringe =
false;
12316 ROSE_ASSERT(ub_bin_op);
12326 ROSE_ASSERT(step_bin_op != NULL);
12329 bool isPlus =
false;
12330 if (isSgPlusAssignOp(step_bin_op))
12332 else if (isSgMinusAssignOp(step_bin_op))
12336 cerr<<
"Error in SageInterface::loopUnrolling(): illegal incremental exp of a canonical loop"<<endl;
12342 for (
size_t i =1; i<unrolling_factor; i++)
12346 std::vector<SgVarRefExp*> refs = querySubTree<SgVarRefExp> (body, V_SgVarRefExp);
12347 for (std::vector<SgVarRefExp*>::iterator iter = refs.begin(); iter !=refs.end(); iter++)
12376 ConstantFolding::constantFoldingOptimization(scope,
false);
12388static size_t myfactorial (
size_t n)
12391 for (
size_t i=2; i<=n; i++)
12402std::vector<size_t> getPermutationOrder(
size_t n,
size_t lexicoOrder)
12404 size_t k = lexicoOrder;
12405 std::vector<size_t> s(n);
12407 for (
size_t i=0; i<n; i++)
12411 size_t factorial = myfactorial(n-1);
12413 if (k/n>=factorial)
12415 printf(
"Error: in getPermutationOrder(), lexicoOrder is larger than n!-1\n");
12431 for (
size_t j=0; j<n-1; j++)
12435 int tempj = (k/factorial) % (n - j);
12438 int temps = s[j+tempj];
12441 for (
size_t i=j+tempj; i>j; i--)
12448 factorial = factorial /(n-(j+1));
12451 for (
size_t i = 0; i<n; i++)
12483 ROSE_ASSERT(loopNest != NULL);
12484 ROSE_ASSERT(targetLevel >0);
12491 std::vector<SgForStatement* > loops= SageInterface::querySubTree<SgForStatement>(loopNest,V_SgForStatement);
12492 ROSE_ASSERT(loops.size()>=targetLevel);
12510 cerr<<
"Error in SageInterface::loopTiling(): target loop is not canonical."<<endl;
12514 ROSE_ASSERT(ivar&& lb && ub && step);
12522 parent = isSgLocatedNode(loopNest ->get_parent());
12524 ROSE_ASSERT(parent!= NULL);
12526 string ivar2_name =
"_lt_var_"+ivar->get_name().getString();
12536 if (isSgBinaryOp(orig_test))
12538 if (isSgLessOrEqualOp(orig_test))
12540 else if (isSgGreaterOrEqualOp(orig_test))
12546 cerr<<
"Error: illegal condition operator for a canonical loop"<<endl;
12553 cerr<<
"Error: illegal condition expression for a canonical loop"<<endl;
12557 ROSE_ASSERT(cond_stmt != NULL);
12562 SgExpression* orig_incr_exp = target_loop->get_increment();
12563 if( isSgPlusAssignOp(orig_incr_exp))
12567 else if (isSgMinusAssignOp(orig_incr_exp))
12573 cerr<<
"Error: illegal increment expression for a canonical loop"<<endl;
12585 ROSE_ASSERT(assign_op);
12589 ROSE_ASSERT(bin_op);
12609 if (lexicoOrder == 0)
12612 ROSE_ASSERT(loop != NULL);
12614 ROSE_ASSERT (depth >1);
12615 ROSE_ASSERT(lexicoOrder<myfactorial(depth));
12618 std::vector<SgForStatement* > loopNest = SageInterface::querySubTree<SgForStatement>(loop,V_SgForStatement);
12619 ROSE_ASSERT(loopNest.size()>=depth);
12620 std::vector<std::vector<SgNode*> > loopHeads;
12621 for (std::vector<SgForStatement* > ::iterator i = loopNest.begin(); i!= loopNest.end(); i++)
12624 std::vector<SgNode*> head;
12626 head.push_back(cur_loop->get_test());
12627 head.push_back(cur_loop->get_increment());
12628 loopHeads.push_back(head);
12632 std::vector<size_t> changedOrder = getPermutationOrder (depth, lexicoOrder);
12635 for (
size_t i=0; i<depth; i++)
12638 if (i != changedOrder[i])
12641 std::vector<SgNode*> newhead = loopHeads[changedOrder[i]];
12649 init->set_parent(cur_loop);
12654 cur_loop->set_test(test);
12662 cur_loop->set_increment(incr);
12676 ROSE_ASSERT(loop != NULL);
12682 SgAssignOp* assign_op = isSgAssignOp (do_loop->get_initialization());
12683 ROSE_ASSERT (assign_op != NULL);
12685 ROSE_ASSERT (var != NULL);
12686 ivarname = var->get_symbol()->get_declaration();
12687 ROSE_ASSERT (ivarname != NULL);
12701 SgStatementPtrList & init = fs->get_init_stmt();
12702 if (init.size() !=1)
12704 cerr<<
"SageInterface::getLoopIndexVariable(), no or more than one initialization statements are encountered. Not supported yet "<<endl;
12715 if (isSgVariableDeclaration(init1))
12719 ROSE_ASSERT(ivarname != NULL);
12726 SgVarRefExp* var = isSgVarRefExp(SkipCasting(ivarast));
12729 ivarname = var->get_symbol()->get_declaration();
12736 if (
SgCommaOpExp* comma_exp = isSgCommaOpExp(exp_stmt->get_expression()))
12743 SgVarRefExp* var = isSgVarRefExp(assign_op->get_lhs_operand());
12746 ivarname = var->get_symbol()->get_declaration();
12754 mlog[Sawyer::Message::Common::WARN] <<
"Warning: SageInterface::getLoopIndexVariable(). Unhandled init_stmt type of SgForStatement"<<endl;
12755 mlog[Sawyer::Message::Common::WARN] <<
"Init statement is :"<<init1->
class_name() <<
" " <<init1->
unparseToString()<<endl;
12773 ROSE_ASSERT (ivar != NULL);
12774 ROSE_ASSERT (subtree_root != NULL);
12775 bool result =
false;
12780 if (i_index == ivar)
12800 ROSE_ASSERT (loop !=NULL);
12801 SgStatementPtrList& stmt_list = loop->get_init_stmt();
12802 if (stmt_list.size() >1)
return true;
12803 if (stmt_list.size() == 0)
return false;
12808 if (decl_stmt != NULL)
12813 ROSE_ASSERT (exp_stmt != NULL);
12814 if (isSgCommaOpExp (exp_stmt->get_expression()) )
12824 ROSE_ASSERT(loop != NULL);
12832 SgAssignOp* init_assign = isSgAssignOp (init);
12837 bool isCase1=
false;
12842 ivarname = var->get_symbol()->get_declaration();
12844 if (ivarname && lbast )
12856 SgBinaryOp* test = isSgBinaryOp(fs->get_test_expr());
12860 case V_SgLessOrEqualOp:
12861 if (isInclusiveUpperBound != NULL)
12862 *isInclusiveUpperBound =
true;
12863 if (hasIncrementalIterationSpace != NULL)
12864 *hasIncrementalIterationSpace =
true;
12866 case V_SgLessThanOp:
12867 if (isInclusiveUpperBound != NULL)
12868 *isInclusiveUpperBound =
false;
12869 if (hasIncrementalIterationSpace != NULL)
12870 *hasIncrementalIterationSpace =
true;
12872 case V_SgGreaterOrEqualOp:
12873 if (isInclusiveUpperBound != NULL)
12874 *isInclusiveUpperBound =
true;
12875 if (hasIncrementalIterationSpace != NULL)
12876 *hasIncrementalIterationSpace =
false;
12878 case V_SgGreaterThanOp:
12879 if (isInclusiveUpperBound != NULL)
12880 *isInclusiveUpperBound =
false;
12881 if (hasIncrementalIterationSpace != NULL)
12882 *hasIncrementalIterationSpace =
false;
12891 if (testvar == NULL)
12897 ubast = loop->get_bound();
12899 if (isInclusiveUpperBound != NULL)
12900 *isInclusiveUpperBound =
true;
12903 ROSE_ASSERT (incr != NULL);
12904 if (isSgNullExpression(incr))
12906 cerr<<
"Error:isCanonicalDoLoop() found NULL increment expression. Please call doLoopNormalization() first!"<<endl;
12907 ROSE_ASSERT (
false);
12909 if (hasIncrementalIterationSpace != NULL)
12911 *hasIncrementalIterationSpace =
true;
12913 if (
SgIntVal* i_v = isSgIntVal(incr))
12915 if (i_v->get_value()<0)
12916 *hasIncrementalIterationSpace =
false;
12922 case V_SgPlusAssignOp:
12923 case V_SgMinusAssignOp:
12924 incr_var = isSgVarRefExp(SkipCasting(isSgBinaryOp(incr)->get_lhs_operand()));
12927 case V_SgPlusPlusOp:
12928 case V_SgMinusMinusOp:
12929 incr_var = isSgVarRefExp(SkipCasting(isSgUnaryOp(incr)->get_operand()));
12935 if (incr_var == NULL)
12949 if (body != NULL) {
12950 *body = fs->get_body();
12987 ROSE_ASSERT (s != NULL);
12990 std::set<SgNode*> bset = SgNodeHelper::loopRelevantBreakStmtNodes (s);
12991 if (bset.size()!=0 )
13005 ROSE_ASSERT(loop != NULL);
13016 SgStatementPtrList & init = fs->get_init_stmt();
13017 if (init.size() !=1)
13020 SgExpression* ivarast=NULL, *lbast=NULL, *ubast=NULL, *stepast=NULL;
13023 bool isCase1=
false, isCase2=
false;
13025 if (isSgVariableDeclaration(init1))
13029 ROSE_ASSERT(ivarname != NULL);
13031 if (isSgAssignInitializer(initor))
13033 lbast = isSgAssignInitializer(initor)->
get_operand();
13039 SgVarRefExp* var = isSgVarRefExp(SkipCasting(ivarast));
13042 ivarname = var->get_symbol()->get_declaration();
13047 ROSE_ASSERT(!(isCase1&&isCase2));
13049 if (!(isCase1||isCase2))
13061 case V_SgLessOrEqualOp:
13062 if (isInclusiveUpperBound != NULL)
13063 *isInclusiveUpperBound =
true;
13064 if (hasIncrementalIterationSpace != NULL)
13065 *hasIncrementalIterationSpace =
true;
13067 case V_SgLessThanOp:
13068 if (isInclusiveUpperBound != NULL)
13069 *isInclusiveUpperBound =
false;
13070 if (hasIncrementalIterationSpace != NULL)
13071 *hasIncrementalIterationSpace =
true;
13073 case V_SgGreaterOrEqualOp:
13074 if (isInclusiveUpperBound != NULL)
13075 *isInclusiveUpperBound =
true;
13076 if (hasIncrementalIterationSpace != NULL)
13077 *hasIncrementalIterationSpace =
false;
13079 case V_SgGreaterThanOp:
13080 if (isInclusiveUpperBound != NULL)
13081 *isInclusiveUpperBound =
false;
13082 if (hasIncrementalIterationSpace != NULL)
13083 *hasIncrementalIterationSpace =
false;
13092 if (testvar == NULL)
13116 case V_SgPlusAssignOp:
13117 case V_SgMinusAssignOp:
13118 incr_var = isSgVarRefExp(SkipCasting(isSgBinaryOp(incr)->get_lhs_operand()));
13121 case V_SgPlusPlusOp:
13122 case V_SgMinusMinusOp:
13123 incr_var = isSgVarRefExp(SkipCasting(isSgUnaryOp(incr)->get_operand()));
13126 case V_SgAssignOp: {
13127 incr_var=isSgVarRefExp(SkipCasting(isSgBinaryOp(incr)->get_lhs_operand()));
13128 if(incr_var == NULL)
13130 SgAddOp* addOp=isSgAddOp(SkipCasting(isSgBinaryOp(incr)->get_rhs_operand()));
13131 SgSubtractOp* subtractOp=isSgSubtractOp(SkipCasting(isSgBinaryOp(incr)->get_rhs_operand()));
13135 else if(subtractOp)
13136 arithOp=subtractOp;
13139 ROSE_ASSERT(arithOp!=0);
13140 if(
SgVarRefExp* varRefExp=isSgVarRefExp(SkipCasting(isSgBinaryOp(arithOp)->get_lhs_operand()))) {
13142 incr_var=varRefExp;
13144 }
else if(
SgVarRefExp* varRefExp=isSgVarRefExp(SkipCasting(isSgBinaryOp(arithOp)->get_rhs_operand()))) {
13145 if(isSgAddOp(arithOp)) {
13147 incr_var=varRefExp;
13157 if (incr_var == NULL)
13178 if (body != NULL) {
13187 ROSE_ASSERT(loop != NULL);
13188 ROSE_ASSERT(lb != NULL);
13193 if (forstmt != NULL)
13198 Rose_STL_Container<SgNode* > testList = NodeQuery::querySubTree( *((forstmt->get_init_stmt()).begin()), V_SgAssignOp);
13199 if (testList.size()>0)
13201 ROSE_ASSERT(testList.size()==1);
13202 SgAssignOp * assignop = isSgAssignOp((*testList.begin()));
13203 ROSE_ASSERT(assignop);
13213 Rose_STL_Container<SgNode* > testList = NodeQuery::querySubTree( *((forstmt->get_init_stmt()).begin()), V_SgAssignInitializer );
13214 ROSE_ASSERT(testList.size()==1);
13216 ROSE_ASSERT(init != NULL);
13217 init->set_operand(lb);
13222 else if (dostmt != NULL)
13225 ROSE_ASSERT (init != NULL);
13227 ROSE_ASSERT (a_op!=NULL);
13234 cerr<<
"Error. SageInterface::setLoopLowerBound(), illegal loop type:"<< loop->
class_name()<<endl;
13235 ROSE_ASSERT (
false);
13242 ROSE_ASSERT(loop != NULL);
13243 ROSE_ASSERT(ub != NULL);
13247 if (forstmt != NULL)
13250 SgBinaryOp * binop= isSgBinaryOp(isSgExprStatement(forstmt->get_test())->get_expression());
13251 ROSE_ASSERT(binop != NULL);
13255 else if (dostmt != NULL)
13257 dostmt->set_bound(ub);
13263 cerr<<
"Error. SageInterface::setLoopUpperBound(), illegal loop type:"<< loop->
class_name()<<endl;
13264 ROSE_ASSERT (
false);
13272 ROSE_ASSERT(loop != NULL);
13273 ROSE_ASSERT(stride != NULL);
13277 if (dostmt != NULL)
13279 dostmt->set_increment(stride);
13283 else if (forstmt != NULL)
13287 Rose_STL_Container<SgNode*> testList = NodeQuery::querySubTree( forstmt->get_increment(), V_SgPlusPlusOp);
13288 if (testList.size()>0)
13290 ROSE_ASSERT(testList.size() == 1);
13292 (isSgPlusPlusOp( *testList.begin())->
get_operand()));
13294 forstmt->set_increment(plusassignop);
13298 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgMinusMinusOp);
13299 if (testList.size()>0)
13301 ROSE_ASSERT(testList.size()==1);
13303 (isSgMinusMinusOp(*testList.begin())->
get_operand()));
13305 forstmt->set_increment(plusassignop);
13309 testList = NodeQuery::querySubTree( forstmt->get_increment(), V_SgPlusAssignOp);
13310 if (testList.size()>0)
13312 ROSE_ASSERT(testList.size()==1);
13313 SgPlusAssignOp * assignop = isSgPlusAssignOp(*(testList.begin()));
13314 ROSE_ASSERT(assignop!=NULL);
13319 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgMinusAssignOp);
13320 if (testList.size()>0)
13322 ROSE_ASSERT(testList.size()==1);
13325 SgExprStatement* exprstmt = isSgExprStatement((*testList.begin())->get_parent());
13326 ROSE_ASSERT(exprstmt !=NULL);
13328 exprstmt->set_expression(plusassignop);
13339 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgAddOp);
13340 if (testList.size()>0)
13342 ROSE_ASSERT(testList.size()==1);
13344 SgAddOp * addop = isSgAddOp(*(testList.begin()));
13345 ROSE_ASSERT(addop!=NULL);
13359 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgSubtractOp);
13360 if (testList.size()>0)
13362 ROSE_ASSERT(testList.size()==1);
13364 SgSubtractOp * subtractop = isSgSubtractOp(*(testList.begin()));
13365 ROSE_ASSERT(subtractop!=NULL);
13368 SgAssignOp *assignop = isSgAssignOp((*testList.begin())->get_parent());
13369 ROSE_ASSERT(assignop !=NULL);
13376 cerr<<
"Error. SageInterface::setLoopStride(), illegal loop type:"<< loop->
class_name()<<endl;
13377 ROSE_ASSERT (
false);
13388 SgExpression *exp = (n != 0)? n->get_expression() : isSgExpression(s);
13391 case V_SgPlusAssignOp:
13392 case V_SgMinusAssignOp:
13393 case V_SgAndAssignOp:
13394 case V_SgIorAssignOp:
13395 case V_SgMultAssignOp:
13396 case V_SgDivAssignOp:
13397 case V_SgModAssignOp:
13398 case V_SgXorAssignOp:
13406 if ( init->variantT() == V_SgAssignInitializer)
13407 init = isSgAssignInitializer(init)->
get_operand();
13411 *readlhs = (exp->
variantT() != V_SgAssignOp);
13425 Rose_STL_Container<SgNode*> gotos = NodeQuery::querySubTree(top,V_SgGotoStatement);
13426 for (
size_t i = 0; i < gotos.size(); ++i)
13431 if (!lsParent)
continue;
13434 size_t j = std::find(bbStatements.begin(), bbStatements.end(), ls) - bbStatements.begin();
13436 ROSE_ASSERT (j != bbStatements.size());
13438 while (j < bbStatements.size() - 1 && isSgLabelStatement(bbStatements[j + 1]))
13442 gs->
set_label(isSgLabelStatement(bbStatements[j]));
13458 ROSE_ASSERT(decl != NULL);
13459 ROSE_ASSERT(assign_stmt != NULL);
13462 SgAssignOp * assign_op = isSgAssignOp (assign_stmt->get_expression());
13463 if (assign_op == NULL)
13466 if (assign_op_var == NULL)
return false;
13470 if (decl_var->get_initptr()!= NULL )
return false;
13477 if (decl_var_symbol!=NULL)
13480 if (assign_op_var->get_symbol() != decl_var_symbol)
return false;
13485 if (assign_op_var->get_symbol()->
get_name() != decl_var ->get_name())
return false;
13499 if (removeAssignStmt)
13503 decl_var->set_initptr(initor);
13514 ROSE_ASSERT(assign_stmt != NULL);
13515 SgAssignOp * assign_op = isSgAssignOp (assign_stmt->get_expression());
13516 if (assign_op == NULL)
13519 if (assign_op_var == NULL)
13523 ROSE_ASSERT(decl != NULL);
13525 if (decl_var->get_initptr()!= NULL)
13532 ROSE_ASSERT(decl_var != NULL);
13534 if (decl_var_symbol != NULL) {
13536 if (assign_op_var->get_symbol() != decl_var_symbol)
13542 if (assign_op_var->get_symbol()->
get_name() != decl_var ->get_name())
13555 decl_var->set_initptr(initor);
13585 ROSE_ASSERT (decl != NULL);
13589 if (initor == NULL)
13596 rhs = ainitor->get_operand();
13602 decl_var->set_initptr(NULL);
13614 cerr<<
"SageInterface::splitVariableDeclaration() topLevelOnly == false is not yet implemented."<<endl;
13615 ROSE_ASSERT (
false);
13618 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(scope, V_SgVariableDeclaration);
13619 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
13624 ROSE_ASSERT(decl != NULL);
13637 ROSE_ASSERT (root != NULL);
13640 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(root, V_SgVarRefExp);
13644 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
13647 ROSE_ASSERT (vRef != NULL);
13648 result.push_back(vRef);
13655 ROSE_ASSERT (root != NULL);
13656 Rose_STL_Container<SgNode*> constructorList= NodeQuery::querySubTree(root, V_SgConstructorInitializer);
13657 for (
size_t i =0; i< constructorList.size(); i++)
13662 Rose_STL_Container<SgNode*> varList = NodeQuery::querySubTree (a_type->get_index(),V_SgVarRefExp);
13663 for (
size_t j =0 ; j< varList.size(); j++)
13665 SgVarRefExp* var_exp = isSgVarRefExp(varList[j]) ;
13666 currentVarRefList.push_back(var_exp);
13690 SgExpression* lhsCopy = isSgExpression(lhs->copy(treeCopy));
13691 ROSE_ASSERT (lhsCopy);
13715 SgExpression* lhsCopy = isSgExpression(lhs->copy(treeCopy));
13716 ROSE_ASSERT (lhsCopy);
13740 SgExpression* lhsCopy = isSgExpression(lhs->copy(treeCopy));
13741 ROSE_ASSERT (lhsCopy);
13758 ROSE_ASSERT(from != NULL);
13760#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
13764 ROSE_ASSERT (
false);
13769 SgStatement* stmt = getStatementOfExpression(from);
13771 if (!isSgForInitStatement(stmt->
get_parent())) {
13780 if (!parent && isSgForInitStatement(stmt->
get_parent()))
13786 SgName varname =
"rose_temp__";
13787 if (newName ==
"") {
13795 vector<SgExpression*> ancestors;
13796 for (
SgExpression *expr = from, *anc = isSgExpression(fromparent); anc != 0;
13797 expr = anc, anc = isSgExpression(anc->get_parent()))
13799 if ((isSgAndOp(anc) && expr != isSgAndOp(anc)->get_lhs_operand()) ||
13802 ancestors.push_back(anc);
13805 for (vector<SgExpression*>::reverse_iterator ai = ancestors.rbegin(); ai != ancestors.rend(); ++ai)
13808 switch ((*ai)->variantT()) {
13813 case V_SgConditionalExp:
13815 default: assert (!
"Should not happen"); abort();
13820 if (ancestors.size() != 0) {
13828 ROSE_ASSERT (initname);
13830 replaceExpressionWithExpression(from, varref);
13834 initname->set_initializer(ai);
13836 myStatementInsert(stmt, vardecl,
true);
13857 SplitStatementGenerator gen;
13863 Rose_STL_Container<SgNode*> gotos = NodeQuery::querySubTree(top,
13864 V_SgGotoStatement);
13865 map<SgLabelStatement*, SgLabelStatement*> labelsToReplace;
for
13866 (
size_t i = 0; i < gotos.size(); ++i) {
13869 if (!gsParent)
continue;
13871 size_t j = std::find(bbStatements.begin(), bbStatements.end(), gs)
13872 - bbStatements.begin();
13873 ROSE_ASSERT (j != bbStatements.size());
13874 if (j == 0)
continue;
13875 if (isSgLabelStatement(bbStatements[j - 1])) {
13876 labelsToReplace[isSgLabelStatement(bbStatements[j - 1])] =
13880 for (
size_t i = 0; i < gotos.size(); ++i) {
13883 while (labelsToReplace.find(oldLabel) != labelsToReplace.end()) {
13884 oldLabel = labelsToReplace[oldLabel];
13894 case V_SgBoolValExp:
return (isSgBoolValExp(e)->get_value() != 0);
13896 case V_SgBoolValExp:
return (isSgBoolValExp(e)->get_value() ==
true);
13898 case V_SgIntVal:
return isSgIntVal(e)->get_value() != 0;
13899 case V_SgCastExp:
return isConstantTrue(isSgCastExp(e)->get_operand());
13901 case V_SgAddressOfOp:
return true;
13902 default:
return false;
13908 case V_SgBoolValExp:
return isSgBoolValExp(e)->get_value() ==
false;
13909 case V_SgIntVal:
return isSgIntVal(e)->get_value() == 0;
13910 case V_SgCastExp:
return
13912 case V_SgNotOp:
return isConstantTrue(isSgNotOp(e)->get_operand());
13913 default:
return false;
13920 if (!fc)
return false;
13922 if (fr == NULL)
return false;
13923 return fr->get_symbol()->get_declaration() == decl;
13929 if (!fc)
return false;
13931 if (fr == NULL)
return false;
13933 fr->get_symbol()->get_declaration()->get_qualified_name().getString();
13934 return (name == qualifiedName &&
13935 fc->get_args()->get_expressions().size() == arity);
13940 ROSE_ASSERT( e != NULL);
13956 ROSE_ASSERT(expList);
13958 expList->append_expression(exp);
13964 for (
size_t i = 0; i < exp.size(); ++i)
13973template <
class actualFunction>
13983 ROSE_ASSERT(paralist);
13988 cerr <<
"Waring! Setting a used SgFunctionParameterList to function: "
13989 << (func->get_name()).getString()<<endl
13990 <<
" Sharing parameter lists can corrupt symbol tables!"<<endl
13991 <<
" Please use deepCopy() to get an exclusive parameter list for each function declaration!"<<endl;
13996 if (func->get_parameterList() != NULL)
13997 if (func->get_parameterList() != paralist)
13998 delete func->get_parameterList();
14000 func->set_parameterList(paralist);
14008 ROSE_ASSERT(paraList != NULL);
14009 ROSE_ASSERT(initName != NULL);
14011 if (isPrepend ==
true)
14012 paraList->prepend_arg(initName);
14014 paraList->append_arg(initName);
14021 ROSE_ASSERT(initName->
get_parent() == paraList);
14031 if (func_decl != NULL)
14037 ROSE_ASSERT(func_def);
14047 initName->set_declptr(func_decl);
14059 initName->set_scope(scope);
14079 return addArg(paraList,initName,
false);
14084 return addArg(paraList,initName,
true);
14090 ROSE_ASSERT(pragma);
14091 if (decl->get_pragma()!=NULL)
delete (decl->get_pragma());
14092 decl->set_pragma(pragma);
14103 void testAstForUniqueNodes (
SgNode* node );
14106 printf (
"In SageInterface::appendStatement(): stmt = %p = %s scope = %p \n",stmt,stmt->
class_name().c_str(),scope);
14115 printf (
" --- scope was not specified as input! \n");
14120 ROSE_ASSERT(stmt != NULL);
14121 ROSE_ASSERT(scope != NULL);
14124 printf (
"In SageInterface::appendStatement(): stmt = %p = %s scope = %p = %s \n",stmt,stmt->
class_name().c_str(),scope,scope->
class_name().c_str());
14131 if (declarationStatement != NULL)
14159 scope->insertStatementInScope(stmt,
false);
14163 bool skipAddingStatement =
false;
14165 if (classDeclaration != NULL)
14171 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());
14177 skipAddingStatement = (classDeclaration->get_isAutonomousDeclaration() ==
false);
14181 skipAddingStatement = (classDeclaration->get_isAutonomousDeclaration() ==
false) || (classDeclaration->
get_parent() != NULL);
14196 if (statementAlreadyExistsInScope ==
true)
14198 if (isSgTemplateInstantiationDecl(classDeclaration) != NULL)
14202#if PRINT_DEVELOPER_WARNINGS
14203 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",
14211 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",
14216 skipAddingStatement =
true;
14223 if (enumDeclaration != NULL)
14226 skipAddingStatement = (enumDeclaration->get_isAutonomousDeclaration() ==
false);
14235 if (skipAddingStatement ==
false && statementAlreadyExistsInScope ==
true)
14238 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",
14242 printf (
"Exiting as a test! \n");
14245 skipAddingStatement =
true;
14250 printf (
" --- skipAddingStatement = %s \n",skipAddingStatement ?
"true" :
"false");
14253 if (skipAddingStatement ==
false)
14265 printf (
" --- calling insertStatementInScope(): scope = %p = %s stmt = %p = %s \n",scope,scope->
class_name().c_str(),stmt,stmt->
class_name().c_str());
14267 scope->insertStatementInScope(stmt,
false);
14294 testAstForUniqueNodes(scope);
14303 ROSE_ASSERT (stmt != NULL);
14304 ROSE_ASSERT (for_init_stmt != NULL);
14307 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());
14316 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());
14324 for_init_stmt->append_init_stmt (stmt);
14330 for (
size_t i = 0; i < stmts.size(); ++i)
14333#ifdef ROSE_DEBUG_NEW_EDG_ROSE_CONNECTION
14334 printf (
"In appendStatementList(): stmts[i = %" PRIuPTR
"] = %p = %s \n",i,stmts[i],stmts[i]->class_name().c_str());
14340 if (stmts[i]->get_parent() != NULL)
14343#ifdef ROSE_DEBUG_NEW_EDG_ROSE_CONNECTION
14344 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());
14351 printf (
" --- WARNING: In appendStatementList(): stmts[i = %" PRIuPTR
"] not added to scope (because stmts[i]->get_parent() == NULL) \n",i);
14360 ROSE_ASSERT (stmt != NULL);
14363 printf (
"In SageInterface::prependStatement(): stmt = %p = %s scope = %p \n",stmt,stmt->
class_name().c_str(),scope);
14373 ROSE_ASSERT(scope != NULL);
14383 printf (
"In SageInterface::prependStatement(): stmt = %p = %s scope = %p = %s (resetInternalMapsForTargetStatement: stmt) \n",
14395 printf (
"In SageInterface::prependStatement(): stmt = %p = %s scope = %p = %s (resetInternalMapsForTargetStatement: scope) \n",
14407 printf (
"Calling insertStatementInScope() \n");
14413 scope->insertStatementInScope(stmt,
true);
14433 printf (
"Leaving SageInterface::prependStatement() \n");
14441 ROSE_ASSERT (stmt != NULL);
14442 ROSE_ASSERT (for_init_stmt != NULL);
14445 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());
14454 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());
14462 for_init_stmt->prepend_init_stmt (stmt);
14467 for (
size_t i = stmts.size(); i > 0; --i)
14479 ROSE_ASSERT (scope != NULL);
14482 case V_SgBasicBlock:
14483 case V_SgClassDefinition:
14484 case V_SgFunctionDefinition:
14486 case V_SgNamespaceDefinitionStatement:
14490 case V_SgAssociateStatement :
14491 case V_SgBlockDataStatement :
14492 case V_SgCatchOptionStmt:
14493 case V_SgDoWhileStmt:
14494 case V_SgForAllStatement:
14495 case V_SgForStatement:
14496 case V_SgFortranDo:
14498 case V_SgSwitchStatement:
14499 case V_SgUpcForAllStatement:
14500 case V_SgWhileStmt:
14505 cout<<
"unrecognized or unhandled scope type for SageInterface::hasSimpleChildrenList() "<<endl;
14518 SgDeclarationStatementPtrList & declarationList = globalScope->
get_declarations();
14521 SgDeclarationStatementPtrList::iterator i = declarationList.begin();
14523 while (i != declarationList.end() && (*i)->get_file_info() != NULL && (*i)->get_file_info()->isFrontendSpecific() ==
true)
14526 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");
14528 last_statement = *i;
14533 ROSE_ASSERT(last_statement != NULL);
14535 printf (
"last_statement = %p = %s \n",last_statement,last_statement->
class_name().c_str());
14538 printf (
"Exiting as a test! \n");
14542 return last_statement;
14551 ROSE_ASSERT(targetStmt &&newStmt);
14552 ROSE_ASSERT(targetStmt != newStmt);
14554 if (isSgGlobal(targetStmt) ||
14555 isSgClassDefinition(targetStmt)||
14556 isSgNamespaceDefinitionStatement(targetStmt)||
14557 isSgFunctionParameterList(targetStmt)||
14558 isSgFunctionDefinition(targetStmt)||
14559 isSgCtorInitializerList(targetStmt))
14561 string className = targetStmt->
class_name();
14562 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.";
14563 cerr<<err_msg<<endl;
14564 ROSE_ASSERT (
false);
14568 if (isSgCaseOptionStmt(targetStmt))
14570 if (!isSgCaseOptionStmt(newStmt))
14572 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;
14573 ROSE_ASSERT(
false);
14578 if (parent == NULL)
14580 cerr <<
"Empty parent pointer for target statement. May be caused by the wrong order of target and new statements in insertStatement(targetStmt, newStmt)"<<endl;
14581 ROSE_ASSERT(parent);
14607 cerr<<
"Error: you cannot insert a variable declaration stmt inside a case option statement without enclosing brances in between."<<endl;
14608 cerr<<
"parent of target is a case option stmt:"<<parent <<endl;
14609 cerr<<
"new statement is a variable statement:"<<newStmt <<endl;
14610 ASSERT_require(
false);
14614 if (isSgLabelStatement(parent) !=
nullptr)
14618 ROSE_ASSERT(isSgLabelStatement(parent) == NULL);
14621 if (isSgFunctionDefinition(parent) ||
14622 isSgTypedefDeclaration(parent) ||
14623 isSgSwitchStatement(parent) ||
14624 isSgVariableDeclaration(parent))
14627 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.";
14628 cerr<<err_msg<<endl;
14631 if (switch_stmt->get_item_selector() == targetStmt)
14633 cerr<<
"The target statement is the item selector of a switch statement. You cannot insert any statement before or after it."<<endl;
14637 ROSE_ASSERT (
false);
14641 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());
14659 ROSE_ASSERT(scope);
14662 printf (
"targetStmt = %p = %s \n",targetStmt,targetStmt->
class_name().c_str());
14663 printf (
"scope = %p = %s \n",scope,scope->
class_name().c_str());
14681 ROSE_ASSERT(isSgStatement(parent) != NULL);
14686 ROSE_ASSERT(targetStmt != NULL);
14690 printf (
"In SageInterface::insertStatement(): after checking for associated comments \n");
14691 reportNodesMarkedAsModified(scope);
14697 if (autoMovePreprocessingInfo)
14699 if (comments != NULL && isSgBasicBlock(newStmt) == NULL)
14701 vector<int> captureList;
14703 printf (
"Found attached comments (at %p = %s, inserting %p = %s insertBefore = %s): comments->size() = %" PRIuPTR
" \n",
14704 targetStmt,targetStmt->
class_name().c_str(),newStmt,newStmt->
class_name().c_str(),insertBefore ?
"true" :
"false",comments->size());
14711 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");
14716 int commentIndex = 0;
14717 AttachedPreprocessingInfoType::iterator i;
14718 for (i = comments->begin(); i != comments->end(); i++)
14720 ROSE_ASSERT ( (*i) != NULL );
14722 printf (
" Attached Comment (relativePosition=%s): %s\n",
14723 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
14724 (*i)->getString().c_str());
14725 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
14726 (*i)->get_file_info()->display(
"comment/directive location");
14729 if ((*i)->getRelativePosition() == relativePosition)
14732 captureList.push_back(commentIndex);
14739 if (captureList.empty() ==
false)
14745 ROSE_ASSERT(surroundingStatement != targetStmt);
14746 ROSE_ASSERT(surroundingStatement != NULL);
14748 if (surroundingStatement == NULL)
14751 surroundingStatement = (insertBefore ==
true) ? newStmt : newStmt;
14756 vector<int>::iterator j = captureList.begin();
14757 while (j != captureList.end())
14765 (*comments)[*j] = NULL;
14772 for (
size_t n = 0; n < captureList.size(); n++)
14774 AttachedPreprocessingInfoType::iterator k = comments->begin();
14775 while (k != comments->end())
14780 comments->erase(k);
14793 if (comments != NULL)
14795 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");
14802 printf (
"In SageInterface::insertStatement(): after processing associated comments \n");
14803 reportNodesMarkedAsModified(scope);
14806 if (isSgIfStmt(parent))
14808 if (isSgIfStmt(parent)->get_conditional()==targetStmt)
14814 if (isSgIfStmt(parent)->get_true_body()==targetStmt)
14834 if (isSgIfStmt(parent)->get_false_body()==targetStmt)
14848 if (isSgWhileStmt(parent))
14850 if (isSgWhileStmt(parent)->get_condition()==targetStmt)
14856 if (isSgWhileStmt(parent)->get_body()==targetStmt)
14859 isSgWhileStmt(parent)->
set_body(newparent);
14869 if (isSgDoWhileStmt(parent))
14871 if (isSgDoWhileStmt(parent)->get_condition()==targetStmt)
14877 if (isSgDoWhileStmt(parent)->get_body()==targetStmt)
14880 isSgDoWhileStmt(parent)->
set_body(newparent);
14890 if (isSgForStatement(parent))
14892 if (isSgForStatement(parent)->get_loop_body()==targetStmt)
14903 if (isSgForStatement(parent)->get_test()==targetStmt)
14924 p->set_body(newparent);
14932 ROSE_ASSERT(stmnt != NULL);
14954 printf (
"In SageInterface::insertStatement(): at BASE of function \n");
14955 reportNodesMarkedAsModified(scope);
14964 for (
size_t i = 0; i < newStmts.size(); ++i)
14971 for (
size_t i = newStmts.size(); i > 0; --i)
14980 insertStatement(targetStmt,newStmt,
false, autoMovePreprocessingInfo);
14991 ROSE_ASSERT (stmt != NULL);
14992 ROSE_ASSERT (scope != NULL);
15004 ROSE_ASSERT (scope != NULL);
15005 vector <SgStatement* >::iterator iter;
15007 for (iter= stmt_list.begin(); iter != stmt_list.end(); iter++)
15009 if (iter == stmt_list.begin())
15015 ROSE_ASSERT (prev_stmt != NULL);
15024 ROSE_ASSERT(newStmt!=NULL);
15025 ROSE_ASSERT(scope!=NULL);
15027 if (!isSgDeclarationStatement(targetStmt)) {
15037 ROSE_ASSERT(scope!=NULL);
15039 if (!isSgDeclarationStatement(targetStmt)) {
15062 ROSE_ASSERT(target);
15063 ROSE_ASSERT(operand);
15064 ROSE_ASSERT(target!=operand);
15065 switch (target->variantT())
15067 case V_SgActualArgumentExpression:
15068 isSgActualArgumentExpression(target)->set_expression(operand);
15071 isSgAsmOp(target)->set_expression(operand);
15074 isSgSizeOfOp(target)->set_operand_expr(operand);
15077 isSgTypeIdOp(target)->set_operand_expr(operand);
15080 isSgVarArgOp(target)->set_operand_expr(operand);
15082 case V_SgVarArgStartOneOperandOp:
15083 isSgVarArgStartOneOperandOp(target)->set_operand_expr(operand);
15085 case V_SgAssignInitializer:
15086 isSgAssignInitializer (target)->
set_operand(operand);
15089 if (isSgUnaryOp(target)!=NULL)
15093 cerr<<
"\tSageInterface::setOperand(): unhandled case for target expression of type "
15094 <<target->class_name()<<endl;
15099 markLhsValues(target);
15105 ROSE_ASSERT(target);
15107 ROSE_ASSERT(target!=lhs);
15108 bool hasrhs =
false;
15114 if (varargcopy!=NULL)
15116 varargcopy->set_lhs_operand(lhs);
15117 if( varargcopy->get_rhs_operand()!=NULL) hasrhs=
true;
15119 else if(varargstart!=NULL)
15121 varargstart->set_lhs_operand(lhs);
15122 if( varargstart->get_rhs_operand()!=NULL) hasrhs=
true;
15124 else if(binary!=NULL)
15131 cout<<
"SageInterface::setLhsOperand(): unhandled case for target expression of type "
15132 <<target->class_name()<<endl;
15139 markLhsValues(target);
15144 ROSE_ASSERT(target);
15146 ROSE_ASSERT(target!=rhs);
15147 bool haslhs =
false;
15153 if (varargcopy!=NULL)
15155 varargcopy->set_rhs_operand(rhs);
15156 if( varargcopy->get_lhs_operand()!=NULL) haslhs=
true;
15158 else if(varargstart!=NULL)
15160 varargstart->set_rhs_operand(rhs);
15161 if( varargstart->get_lhs_operand()!=NULL) haslhs=
true;
15163 else if(binary!=NULL)
15170 cout<<
"SageInterface::setRhsOperand(): unhandled case for target expression of type "
15171 <<target->class_name()<<endl;
15177 markLhsValues(target);
15196 ROSE_ASSERT(parentFileList != NULL);
15202 if (parentDirectory != NULL)
15205 parentDirectory->get_directoryList()->get_listOfDirectories().push_back(directory);
15212 project = isSgProject(parentFileList->
get_parent());
15213 ROSE_ASSERT(project != NULL);
15216 project->get_directoryList()->get_listOfDirectories().push_back(directory);
15223 directory->get_fileList()->get_listOfFiles().push_back(file);
15226 parentFileList->get_listOfFiles().erase(find(parentFileList->get_listOfFiles().begin(),parentFileList->get_listOfFiles().end(),file));
15236 ROSE_ASSERT(structDecl != NULL);
15237 ROSE_ASSERT(scope != NULL);
15239 ROSE_ASSERT(nondefdecl != NULL);
15265 SgName name = structDecl->get_name();
15279 if (mysymbol == NULL)
15281 printf (
"Note: SageInterface::fixStructDeclaration(): structDecl = %p nondefdecl = %p (mysymbol == NULL) \n",structDecl,nondefdecl);
15285 ROSE_ASSERT(structDecl->
get_scope() != NULL);
15290 ROSE_ASSERT(mysymbol);
15293 printf (
"############## DANGER:DANGER:DANGER ################\n");
15295 printf (
"In SageInterface::fixStructDeclaration(): Adding class symbol to scope = %p = %s \n",scope,scope->
class_name().c_str());
15303 printf (
"*** WARNING: In SageInterface::fixStructDeclaration(): (mysymbol == NULL) Commented out the setting of the parent to be the same as the scope \n");
15312 printf (
"In SageInterface::fixStructDeclaration(): (mysymbol == NULL) Skipped building an associated symbol! \n");
15317 ROSE_ASSERT(nondefdecl->get_type() != NULL);
15320 ROSE_ASSERT(nondefdecl->get_type()->
variantT() != V_SgNode);
15323 ROSE_ASSERT(isSgClassType(nondefdecl->get_type()) != NULL);
15327 if (nondefdecl->get_type() == NULL)
15331 ROSE_ASSERT (nondefdecl->get_type() != NULL);
15334 if (defdecl != NULL)
15337 ROSE_ASSERT(defdecl->get_type()->
variantT() != V_SgNode);
15340 ROSE_ASSERT(isSgClassType(defdecl->get_type()) != NULL);
15344 if (defdecl != NULL)
15347 ROSE_ASSERT(defdecl->get_type() != NULL);
15348 if (defdecl->get_type() != nondefdecl->get_type())
15350 printf (
"ERROR: defdecl->get_type() != nondefdecl->get_type(): what are these: \n");
15351 printf (
" defdecl->get_type() = %p = %s \n",defdecl ->get_type(),defdecl ->get_type()->class_name().c_str());
15352 SgNamedType* namedType_definingDecl = isSgNamedType(defdecl->get_type());
15353 if (namedType_definingDecl != NULL)
15355 printf (
"namedType_definingDecl->get_declaration() = %p = %s \n",namedType_definingDecl->get_declaration(),namedType_definingDecl->get_declaration()->
class_name().c_str());
15357 printf (
" nondefdecl->get_type() = %p = %s \n",nondefdecl->get_type(),nondefdecl->get_type()->
class_name().c_str());
15358 SgNamedType* namedType_nondefiningDecl = isSgNamedType(nondefdecl->get_type());
15359 if (namedType_nondefiningDecl != NULL)
15361 printf (
"namedType_nondefiningDecl->get_declaration() = %p = %s \n",namedType_nondefiningDecl->get_declaration(),namedType_nondefiningDecl->get_declaration()->
class_name().c_str());
15377 ROSE_ASSERT(structDecl);
15378 ROSE_ASSERT(scope);
15380 ROSE_ASSERT(nondefdecl);
15399 if (mysymbol==NULL)
15406 ROSE_ASSERT(mysymbol);
15408 printf (
"In SageInterface::fixNamespaceDeclaration(): inserting namespace symbol into scope = %p = %s \n",scope,scope->
class_name().c_str());
15412 ROSE_ASSERT(defdecl);
15422#define DEBUG__SageInterface__fixVariableDeclaration 0
15426 ROSE_ASSERT(varDecl != NULL);
15427 ROSE_ASSERT(scope != NULL);
15429 SgInitializedNamePtrList namelist = varDecl->
get_variables();
15434#if DEBUG__SageInterface__fixVariableDeclaration
15435 printf (
"In SageInterface::fixVariableDeclaration():\n");
15436 printf (
" varDecl = %p scope = %p = %s \n", varDecl);
15437 printf (
" scope = %p : %s \n", scope, scope->
class_name().c_str());
15440 ROSE_ASSERT(namelist.size() > 0);
15442 SgInitializedNamePtrList::iterator i;
15443 for (i = namelist.begin(); i != namelist.end(); i++)
15446 ROSE_ASSERT(initName != NULL);
15447#if DEBUG__SageInterface__fixVariableDeclaration
15448 printf (
" initName = %p\n", initName);
15449 printf (
" initName->get_scope() = %p : %s\n", initName->get_scope(), initName->get_scope() ? initName->get_scope()->
class_name().c_str() :
"");
15452 SgName name = initName->get_name();
15453#if DEBUG__SageInterface__fixVariableDeclaration
15454 printf (
" name = %s\n", name.str());
15459#if DEBUG__SageInterface__fixVariableDeclaration
15460 printf (
" name = %s\n", name.str());
15467 if (preAssociatedScope != NULL) {
15468 requiredScope = preAssociatedScope;
15472 initName->set_scope(requiredScope);
15477 ROSE_ASSERT(requiredScope != NULL);
15478 SgVariableSymbol* varSymbol = requiredScope->lookup_variable_symbol(name);
15479#if DEBUG__SageInterface__fixVariableDeclaration
15480 printf (
" varSymbol = %p (%s)\n", varSymbol, varSymbol ? varSymbol->
class_name().c_str() :
"");
15482 if (varSymbol == NULL) {
15483 if (scope == initName->get_scope()) {
15484 if (isSgTemplateVariableDeclaration(varDecl)) {
15489 ROSE_ASSERT(varSymbol);
15494 ROSE_ASSERT(prev_decl);
15495 if (initName != prev_decl) {
15496 initName->set_prev_decl_item(prev_decl);
15498 ROSE_ASSERT(initName->get_prev_decl_item() != initName);
15500#if DEBUG__SageInterface__fixVariableDeclaration
15501 printf (
" varSymbol = %p (%s)\n", varSymbol, varSymbol ? varSymbol->
class_name().c_str() :
"");
15519 Rose_STL_Container<SgNode*> varList;
15522 Rose_STL_Container<SgNode*> reflist = NodeQuery::querySubTree(root, V_SgVarRefExp);
15523 for (Rose_STL_Container<SgNode*>::iterator i=reflist.begin();i!=reflist.end();i++)
15525 varRef= isSgVarRefExp(*i);
15526 ROSE_ASSERT(varRef->get_symbol());
15529 ROSE_ASSERT (initname != NULL);
15532 SgName varName=initname->get_name();
15543 if (varRef == arrowExp->get_rhs_operand_i())
15547 SgType* lhs_type = arrowExp->get_lhs_operand_i()->get_type() ;
15548 lhs_type = lhs_type->
stripType(SgType::STRIP_MODIFIER_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE | SgType::STRIP_TYPEDEF_TYPE);
15550 ROSE_ASSERT(ptrType);
15551 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));
15552 ROSE_ASSERT(clsType);
15570 if (varRef == dotExp->get_rhs_operand_i())
15575 SgType* lhs_type = dotExp->get_lhs_operand_i()->get_type() ;
15576 lhs_type = lhs_type->
stripType(SgType::STRIP_MODIFIER_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE | SgType::STRIP_TYPEDEF_TYPE);
15578 ROSE_ASSERT(clsType);
15602 if (realSymbol==NULL)
15609 ROSE_ASSERT(realSymbol!=(varRef->get_symbol()));
15616 bool toDelete =
true;
15618 SgSymbol* symbolToDelete = varRef->get_symbol();
15619 varRef->set_symbol(isSgVariableSymbol(realSymbol));
15622 if (varList.empty())
15624 VariantVector vv(V_SgVarRefExp);
15625 varList = NodeQuery::queryMemoryPool(vv);
15628 for (Rose_STL_Container<SgNode*>::iterator i = varList.begin();
15629 i != varList.end(); ++i)
15633 if (var->get_symbol() == symbolToDelete)
15643 delete symbolToDelete;
15652 delete (varRef->get_symbol());
15656 varRef->set_symbol(isSgVariableSymbol(realSymbol));
15663 if (cleanUnusedSymbols)
15670 Rose_STL_Container<SgNode*> symbolList;
15671 VariantVector sym_vv(V_SgVariableSymbol);
15672 symbolList = NodeQuery::queryMemoryPool(sym_vv);
15674 Rose_STL_Container<SgNode*> varList;
15675 VariantVector var_vv(V_SgVarRefExp);
15679 varList = NodeQuery::querySubTree(root, V_SgVarRefExp);
15682 for (Rose_STL_Container<SgNode*>::iterator i = symbolList.begin();
15683 i != symbolList.end(); ++i)
15686 ROSE_ASSERT(symbolToDelete);
15690 bool toDelete =
true;
15694 for (Rose_STL_Container<SgNode*>::iterator j = varList.begin();
15695 j != varList.end(); ++j)
15700 if (var->get_symbol() == symbolToDelete)
15711 std::cout <<
"Symbol " << symbolToDelete->
get_name().str() <<
' ' << symbolToDelete <<
15712 ' ' << symbolToDelete->get_declaration() <<
" is deleted." << std::endl;
15714 delete symbolToDelete->get_declaration();
15715 delete symbolToDelete;
15728 ROSE_ASSERT(label_stmt);
15737 if (isSgFunctionDefinition(scope) !=
nullptr)
15739 ASSERT_not_null(label_scope);
15745 SgLabelSymbol* lsymbol = label_scope->lookup_label_symbol(name);
15747 if (lsymbol ==
nullptr)
15752 ASSERT_not_null(lsymbol);
15764 ROSE_ASSERT (stmt != NULL);
15765 ROSE_ASSERT (label_value >0 && label_value <=99999);
15768 if (label_scope == NULL)
15772 ROSE_ASSERT (label_scope != NULL);
15774 SgLabelSymbol * symbol = label_scope->lookup_label_symbol (label_name);
15775 if (symbol == NULL)
15781 ROSE_ASSERT(symbol != NULL);
15782 symbol->set_fortran_statement(stmt);
15783 symbol->set_numeric_label_value(label_value);
15788 cerr<<
"Error. SageInterface::setFortranNumericLabel() tries to set a duplicated label value!"<<endl;
15789 ROSE_ASSERT (
false);
15798 case SgLabelSymbol::e_start_label_type:
15800 stmt->set_numeric_label(ref_exp);
15803 case SgLabelSymbol::e_end_label_type:
15805 stmt->set_end_numeric_label(ref_exp);
15810 std::cerr <<
"SageInterface::setFortranNumericLabel: unimplemented for label_type " << label_type <<
"\n";
15822 ROSE_ASSERT (func_def != NULL);
15827 std::set<SgNode*>::iterator iter ;
15828 for (iter=symbols.begin(); iter !=symbols.end(); iter++)
15833 int cur_val = l_symbol->get_numeric_label_value();
15834 if (result <=cur_val)
15835 result = cur_val +10;
15839 ROSE_ASSERT (result <= 99999);
15850 ROSE_ASSERT(scope != NULL);
15855 ROSE_ASSERT(fTable != NULL);
15862 printf (
"WARNING: Skip setting the scope of the SgFunctionTypeTable scope = %p = %s \n",scope,scope->
class_name().c_str());
15868 printf (
"In SageInterface::fixStatement(): stmt = %p = %s \n",stmt,stmt->
class_name().c_str());
15881 if (tmfunc != NULL)
15882 assert(tmfunc->
variantT() == V_SgTemplateMemberFunctionDeclaration);
15883 else if (mfunc != NULL)
15884 assert(mfunc->
variantT() == V_SgMemberFunctionDeclaration || mfunc->
variantT() == V_SgTemplateInstantiationMemberFunctionDecl);
15885 else if (tfunc != NULL)
15886 assert(tfunc->
variantT() == V_SgTemplateFunctionDeclaration);
15887 else if (procfunc != NULL)
15888 assert(procfunc->
variantT() == V_SgProcedureHeaderStatement);
15889 else if (progfunc != NULL)
15890 assert(progfunc->
variantT() == V_SgProgramHeaderStatement);
15891 else if (func != NULL)
15892 assert(func->
variantT() == V_SgFunctionDeclaration || func->
variantT() == V_SgTemplateInstantiationFunctionDecl);
15896 printf (
"In SageInterface::fixStatement(): scope = %p = %s \n",scope,scope->
class_name().c_str());
15897 printf (
"In SageInterface::fixStatement(): stmt->get_scope() = %p \n",stmt->
get_scope());
15909 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());
15915 if (tmfunc != NULL)
15917 SgTemplateParameterPtrList & templateParameterList = tmfunc->get_templateParameters();
15920 func_symbol = scope->lookup_template_member_function_symbol (func->get_name(), func->get_type(),&templateParameterList);
15922 else if (mfunc != NULL)
15925 SgTemplateArgumentPtrList* templateArgumentList = (templateInstantiationMemberFunctionDecl != NULL) ? &(templateInstantiationMemberFunctionDecl->
get_templateArguments()) : NULL;
15927 func_symbol = scope->lookup_nontemplate_member_function_symbol (func->get_name(), func->get_type(),templateArgumentList);
15929 else if (tfunc != NULL)
15931 SgTemplateParameterPtrList & templateParameterList = tfunc->get_templateParameters();
15933 printf (
"In SageInterface::fixStatement(): templateParameterList.size() = %" PRIuPTR
" \n",templateParameterList.size());
15937 func_symbol = scope->lookup_template_function_symbol (func->get_name(), func->get_type(),&templateParameterList);
15939 else if (procfunc != NULL)
15942 printf (
"In SageInterface::fixStatement(): procfunc->get_name() = %s calling lookup_function_symbol() \n",procfunc->get_name().str());
15944 func_symbol = scope->lookup_function_symbol (procfunc->get_name(), procfunc->get_type());
15945 assert(func_symbol != NULL);
15947 else if (progfunc != NULL)
15949 func_symbol = scope->lookup_function_symbol (progfunc->get_name(), progfunc->get_type());
15950 assert(func_symbol != NULL);
15952 else if (func != NULL)
15955 printf (
"In SageInterface::fixStatement(): func->get_name() = %s calling lookup_function_symbol() \n",func->get_name().str());
15958 SgTemplateArgumentPtrList* templateArgumentList = (templateInstantiationFunctionDecl != NULL) ? &(templateInstantiationFunctionDecl->
get_templateArguments()) : NULL;
15960 func_symbol = scope->lookup_function_symbol (func->get_name(), func->get_type(),templateArgumentList);
15965 if (func_symbol == NULL)
15977 printf (
"In SageInterface::fixStatement(): func_symbol = %p \n",func_symbol);
15979 assert(func_symbol != NULL);
15990 printf (
"Need to handle SgTemplateDeclaration IR nodes as well...(implement later) \n");
15998 if (isSgVariableDeclaration(stmt))
16005 ROSE_ASSERT(classDeclaration !=
nullptr);
16008 else if (isSgClassDeclaration(stmt))
16012 else if (isSgLabelStatement(stmt))
16016 else if (isSgFunctionDeclaration(stmt))
16024 ROSE_ASSERT(fTable);
16033 printf (
"In SageInterface::fixStatement(): scope = %p = %s \n",scope,scope->
class_name().c_str());
16034 printf (
"In SageInterface::fixStatement(): stmt->get_scope() = %p \n",stmt->
get_scope());
16045 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());
16047 SgFunctionSymbol* func_symbol = scope->lookup_function_symbol (func->get_name(), func->get_type());
16049 printf (
"In SageInterface::fixStatement(): func_symbol = %p \n",func_symbol);
16050 if (func_symbol == NULL)
16062 ROSE_ASSERT (func_symbol != NULL);
16068 printf (
"In SageInterface::fixStatement(): found a valid function so no need to insert new symbol \n");
16076 if (local_symbol == NULL)
16081 if (func != src_func )
16091 else if (isSgTemplateDeclaration(stmt) != NULL)
16106 case V_SgEnumDeclaration:
16107 case V_SgTemplateDeclaration:
16108 case V_SgTypedefDeclaration:
16109 case V_SgFunctionDeclaration:
16110 case V_SgMemberFunctionDeclaration:
16111 case V_SgTemplateInstantiationFunctionDecl:
16126 printf (
"In SageInterface::fixStatement(): switch default case used (likely OK): stmt = %p = %s \n",stmt,stmt->
class_name().c_str());
16129 printf (
"switch case not handled properly: stmt = %p = %s \n",stmt,stmt->
class_name().c_str());
16161 ROSE_ASSERT(func != NULL && scope != NULL);
16163 ROSE_ASSERT(func != NULL);
16164 ROSE_ASSERT(scope != NULL);
16166 SgStatementPtrList stmtList, sameFuncList;
16173 SgDeclarationStatementPtrList::iterator i;
16174 for (i=declList.begin();i!=declList.end();i++)
16175 stmtList.push_back(*i);
16183 if (firstNondefiningFunctionDeclaration != NULL)
16188 printf (
"In SageInterface::updateDefiningNondefiningLinks(): func = %p Found a valid pointer to a firstNondefiningFunctionDeclaration = %p \n",func,firstNondefiningFunctionDeclaration);
16199 printf (
"WARNING: symbol for func->get_firstNondefiningDeclaration() = %p = %s = %s is not present in the scope = %p = %s associated with the firstNondefiningDeclaration \n",
16207 SgSymbol* functionSymbol = scope->lookup_function_symbol(func->get_name(),func->get_type());
16208 if (functionSymbol != NULL)
16210 printf (
"In SageInterface::updateDefiningNondefiningLinks(): func = %p Found a valid symbol = %p \n",func,functionSymbol);
16214 printf (
"In SageInterface::updateDefiningNondefiningLinks(): func = %p functionSymbol == NULL \n",func);
16219 SgStatementPtrList::iterator j;
16220 for (j = stmtList.begin(); j != stmtList.end(); j++)
16223 if (func_decl != NULL)
16230 sameFuncList.push_back(func_decl);
16236 printf (
"func = %p \n",func);
16240 ROSE_ASSERT(func != NULL);
16244 for (j = sameFuncList.begin(); j != sameFuncList.end(); j++)
16249 ROSE_ASSERT(func != NULL);
16252 ROSE_ASSERT(sameFuncList.empty() ==
false);
16254 if (func == isSgFunctionDeclaration(*(sameFuncList.begin())))
16256 for (j = sameFuncList.begin(); j != sameFuncList.end(); j++)
16260 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 1) Testing j = %p set_firstNondefiningDeclaration(%p) \n",*j,func);
16264 if (func_decl != func)
16271 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 1) Calling j = %p set_firstNondefiningDeclaration(%p) \n",*j,func);
16281 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 2) Testing func = %p set_firstNondefiningDeclaration(%p) \n",func,isSgFunctionDeclaration(*(sameFuncList.begin()))->
get_firstNondefiningDeclaration());
16288 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 2) Calling func = %p set_firstNondefiningDeclaration(%p) \n",func,isSgFunctionDeclaration(*(sameFuncList.begin()))->
get_firstNondefiningDeclaration());
16297 assert(source_file != NULL);
16298 assert(position == PreprocessingInfo::before || position == PreprocessingInfo::after);
16300 SgGlobal * global_scope = source_file->get_globalScope();
16303 ROSE_ASSERT(result);
16319 PreprocessingInfo::DirectiveType dtype )
16321 ASSERT_not_null(target);
16324 PreprocessingInfo::DirectiveType mytype=dtype;
16329 if (mytype == PreprocessingInfo::CpreprocessorUnknownDeclaration)
16335 mytype = PreprocessingInfo::C_StyleComment;
16340 mytype = PreprocessingInfo::CplusplusStyleComment;
16345 mytype = PreprocessingInfo::F90StyleComment;
16350 mytype = PreprocessingInfo::AdaStyleComment;
16355 mytype = PreprocessingInfo::JovialStyleComment;
16359 cout <<
"WARNING: SageInterface::attachComment(): Unknown programming language \n";
16365 bool resetPositionInfo =
false;
16368 case PreprocessingInfo::C_StyleComment: comment =
"/* " + content +
" */";
break;
16369 case PreprocessingInfo::CplusplusStyleComment: comment =
"// " + content;
break;
16370 case PreprocessingInfo::FortranStyleComment: comment =
" C " + content;
break;
16371 case PreprocessingInfo::F90StyleComment: comment =
"!" + content;
break;
16372 case PreprocessingInfo::AdaStyleComment: comment =
"-- " + content;
break;
16373 case PreprocessingInfo::JovialStyleComment:
16377 case PreprocessingInfo::CpreprocessorLineDeclaration:
16378 comment =
"#myline " + content;
16379 mytype = PreprocessingInfo::CplusplusStyleComment;
16380 resetPositionInfo =
true;
16382 case PreprocessingInfo::CpreprocessorIfndefDeclaration: comment =
"#ifndef " + content +
"\n";
break;
16383 case PreprocessingInfo::CpreprocessorDefineDeclaration: comment =
"#define " + content +
"\n";
break;
16384 case PreprocessingInfo::CpreprocessorEndifDeclaration: comment =
"#endif" + (content.empty() ?
"\n" : (
" /* " + content +
" */\n"));
break;
16385 case PreprocessingInfo::CpreprocessorEnd_ifDeclaration: comment =
"#end if" + (content.empty() ?
"\n" : (
" /* " + content +
" */\n"));
break;
16389 printf (
"Error: default in switch reached in SageInterface::attachComment() PreprocessingInfo::DirectiveType == %d \n",mytype);
16394 result =
new PreprocessingInfo (mytype,comment,
"transformation-generated", 0, 0, 0, position);
16397 if (resetPositionInfo ==
true)
16400 *(result->get_file_info()) = *(target->get_file_info());
16410 ASSERT_not_null(result);
16411 target->addToAttachedPreprocessingInfo(result);
16417 PreprocessingInfo::CpreprocessorIfDeclaration,
16419 "transformation-generated", 0, 0, 0,
16420 PreprocessingInfo::before
16422 target->addToAttachedPreprocessingInfo(if_macro);
16425 PreprocessingInfo::CpreprocessorEndifDeclaration,
16427 "transformation-generated", 0, 0, 0,
16428 PreprocessingInfo::after
16430 target->addToAttachedPreprocessingInfo(endif_macro);
16443static map<SgSourceFile*, map<string, PreprocessingInfo*> > fileHeaderDict;
16448 if (isSystemHeader)
16449 header_key=
"<"+header_file_name+
">";
16451 header_key=
"\""+header_file_name+
"\"";
16453 if (fileHeaderDict.count(source_file) && fileHeaderDict[source_file].count(header_key))
16454 return fileHeaderDict[source_file][header_key];
16456 vector<SgLocatedNode*> candidates;
16459 SgGlobal* global= source_file -> get_globalScope();
16461 candidates.push_back(global);
16464 SgDeclarationStatementPtrList decl_stmt_list = global->
get_declarations();
16465 for (SgDeclarationStatementPtrList::iterator iter= decl_stmt_list.begin(); iter!=decl_stmt_list.end(); iter++)
16466 candidates.push_back(*iter);
16468 bool found =
false;
16469 for (
size_t ci=0; ci<candidates.size(); ci++)
16474 if (comments == NULL)
continue;
16475 AttachedPreprocessingInfoType::iterator i;
16476 for (i = comments->begin (); i != comments->end (); i++)
16478 if ((*i)->getTypeOfDirective () != PreprocessingInfo::CpreprocessorIncludeDeclaration)
continue;
16479 string content = (*i)->getString ();
16480 if (content.find(header_key) != string::npos)
16482 fileHeaderDict[source_file][header_key] = *i;
16493 return fileHeaderDict[source_file][header_key];
16503 bool supportTokenUnparsing =
false;
16505 assert(source_file != NULL);
16506 assert(position == PreprocessingInfo::before || position == PreprocessingInfo::after);
16508 SgGlobal * global_scope = source_file->get_globalScope();
16511 if (isSystemHeader)
16512 content =
"#include <" + header_file_name +
"> \n";
16514 content =
"#include \"" + header_file_name +
"\" \n";
16517 ROSE_ASSERT(result);
16525 supportTokenUnparsing = source_file->get_unparse_tokens();
16526 bool supportUnparseHeaders = source_file->get_unparseHeaderFiles();
16529 printf (
"supportTokenUnparsing = %s \n",supportTokenUnparsing ?
"true" :
"false");
16530 printf (
"supportUnparseHeaders = %s \n",supportUnparseHeaders ?
"true" :
"false");
16531 printf (
"source_file = %p \n",source_file);
16532 printf (
"global_scope = %p \n",global_scope);
16535 printf (
"Exiting as a test! \n");
16540 if (supportTokenUnparsing ==
false)
16549 if (supportUnparseHeaders ==
true)
16554 printf (
"physical_file_id = %d \n",physical_file_id);
16559 printf (
"Exiting as a test! \n");
16566 global_scope->prepend_statement(emptyDeclaration);
16570 printf (
"Exiting as a test! \n");
16571 ROSE_ASSERT(
false);
16582 bool supportTokenUnparsing =
false;
16588 printf (
"In SageInterface::insertHeader(): filename = %s \n",filename.c_str());
16589 printf (
" --- position = %s \n",PreprocessingInfo::relativePositionName(position).c_str());
16595 ROSE_ASSERT(scope);
16598 ROSE_ASSERT(globalScope != NULL);
16606 if (isSystemHeader)
16607 content =
"#include <" + filename +
"> \n";
16609 content =
"#include \"" + filename +
"\" \n";
16618 ROSE_ASSERT(sourceFile != NULL);
16620 supportTokenUnparsing = sourceFile->get_unparse_tokens();
16622 bool supportUnparseHeaders = sourceFile->get_unparseHeaderFiles();
16624 if (supportUnparseHeaders)
16627 string suffix = Rose::StringUtility ::fileNameSuffix(filename);
16630 if (suffix==
"h" ||suffix==
"hpp"|| suffix==
"hh"||suffix==
"H" ||suffix==
"hxx"||suffix==
"h++" ||suffix==
"tcc")
16635 printf (
"supportTokenUnparsing = %s \n",supportTokenUnparsing ?
"true" :
"false");
16636 printf (
"supportUnparseHeaders = %s \n",supportUnparseHeaders ?
"true" :
"false");
16637 printf (
"sourceFile = %p \n",sourceFile);
16638 printf (
"globalScope = %p \n",globalScope);
16641 printf (
"supportTokenUnparsing = %s \n",supportTokenUnparsing ?
"true" :
"false");
16644 printf (
"Exiting as a test! \n");
16648 SgDeclarationStatementPtrList & stmtList = globalScope->
get_declarations();
16651 printf (
"stmtList.size() = %zu \n",stmtList.size());
16654 if (stmtList.size() > 0)
16656 for (SgDeclarationStatementPtrList::iterator j = stmtList.begin (); j != stmtList.end (); j++)
16660 if ( ((*j)->get_file_info())->isSameFile(srcScope->
get_file_info ()) || ((*j)->get_file_info ())->isTransformation() )
16662 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration, content,
"Transformation generated",0, 0, 0, PreprocessingInfo::before);
16663 ROSE_ASSERT(result != NULL);
16665 printf (
"Building a PreprocessingInfo: result = %p \n",result);
16673 if (supportTokenUnparsing ==
false)
16675 (*j)->addToAttachedPreprocessingInfo(result,position);
16679 (*j)->addToAttachedPreprocessingInfo(result,position);
16681 printf (
"In SageInterface::insertHeader(): Calling set_containsTransformationToSurroundingWhitespace(true) \n");
16685 (*j)->set_containsTransformationToSurroundingWhitespace(
true);
16694 printf (
"In SageInterface::insertHeader(): declarationStatement = %p = %s \n",declarationStatement,declarationStatement->
class_name().c_str());
16695 printf (
"In SageInterface::insertHeader(): declarationStatement->get_containsTransformationToSurroundingWhitespace() = %s \n",
16696 declarationStatement->get_containsTransformationToSurroundingWhitespace() ?
"true" :
"false");
16703 if (supportUnparseHeaders ==
true)
16708 printf (
"physical_file_id = %d \n",physical_file_id);
16710 emptyDeclaration->get_startOfConstruct()->set_physical_file_id(physical_file_id);
16711 emptyDeclaration->get_endOfConstruct()->set_physical_file_id(physical_file_id);
16713 printf (
"Exiting as a test! \n");
16714 ROSE_ASSERT(
false);
16718 emptyDeclaration->addToAttachedPreprocessingInfo(result, position);
16724 printf (
"break out of for loop: result = %p \n",result);
16734 cerr<<
"SageInterface::insertHeader() Empty file is found!"<<endl;
16735 cerr<<
"#include xxx is preprocessing information which has to be attached to some other located node (a statement for example)"<<endl;
16736 cerr<<
"You may have to insert some statement first before inserting a header"<<endl;
16737 ROSE_ASSERT(
false);
16738 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration, content,
"Transformation generated",0, 0, 0, PreprocessingInfo::after);
16739 ROSE_ASSERT(result);
16750 if (result != NULL)
16761 printf (
"Exiting as a test! \n");
16762 ROSE_ASSERT(
false);
16766 printf (
"Leaving SageInterface::insertHeader(): filename = %s \n",filename.c_str());
16770 printf (
"Exiting as a test! \n");
16771 ROSE_ASSERT(
false);
16781 ROSE_ASSERT (stmt != NULL);
16782 ROSE_ASSERT (newheader != NULL);
16785 printf (
"In SageInterface::insertHeader (SgStatement* stmt, PreprocessingInfo* newheader, bool asLastHeader) \n");
16791 position = PreprocessingInfo::after;
16793 position = PreprocessingInfo::before;
16799 if (comments != NULL)
16808 AttachedPreprocessingInfoType::iterator i, firsti, lasti;
16809 for (i = comments->begin (); i != comments->end (); i++)
16816 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration)
16819 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration)
16821 if (firstExistingHeader == NULL)
16823 firstExistingHeader = (*i);
16827 lastExistingHeader = (*i);
16833 if ( (*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration ||
16834 (*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorEndifDeclaration )
16837 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration)
16839 if (firstExistingHeader == NULL)
16841 firstExistingHeader = (*i);
16845 lastExistingHeader = (*i);
16848 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorEndifDeclaration)
16850 if (firstExistingEndif == NULL)
16852 firstExistingEndif = (*i);
16867 if (lastExistingHeader == NULL)
16871 comments->insert (lasti+1, newheader);
16876 if (firstExistingHeader == NULL)
16880 comments->insert (firsti, newheader);
16888 printf (
"Exiting as a test! \n");
16889 ROSE_ASSERT(
false);
16898 ROSE_ASSERT (source_file != NULL);
16899 SgGlobal* globalScope = source_file->get_globalScope();
16900 ROSE_ASSERT (globalScope != NULL);
16904 if (isSystemHeader)
16905 content =
"#include <" + filename +
"> \n";
16907 content =
"#include \"" + filename +
"\" \n";
16914 position = PreprocessingInfo::after;
16916 position = PreprocessingInfo::before;
16919 SgDeclarationStatementPtrList & stmtList = globalScope->
get_declarations ();
16920 if (stmtList.size()>0)
16922 for (SgDeclarationStatementPtrList::iterator j = stmtList.begin (); j != stmtList.end (); j++)
16927 if ( (*j)->get_file_info()->isSameFile(globalScope->
get_file_info()) || (*j)->get_file_info()->isTransformation() )
16930 printf (
"In SageInterface::insertHeader(): Found statement to attached #include: *j = %p = %s \n",*j,(*j)->class_name().c_str());
16931 printf (
" --- unparseToString() = %s \n",(*j)->unparseToString().c_str());
16933 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration, content,
"Transformation generated",0, 0, 0, PreprocessingInfo::before);
16934 ROSE_ASSERT(result);
16938 printf (
"Exiting as a test! \n");
16947 cerr<<
"SageInterface::insertHeader() Empty file is found!"<<endl;
16948 cerr<<
"#include xxx is preprocessing information which has to be attached to some other located node (a statement for example)"<<endl;
16949 cerr<<
"You may have to insert some statement first before inserting a header"<<endl;
16952 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration,
16953 content,
"Transformation generated",0, 0, 0, PreprocessingInfo::after);
16954 ROSE_ASSERT(result);
16961 printf (
"In SageInterface::insertHeader(): Marking include file for filename = %s as a transformation \n",filename.c_str());
16971 printf (
"Exiting as a test! \n");
16972 ROSE_ASSERT(
false);
16990 ROSE_ASSERT(target != NULL);
16997 PreprocessingInfo::DirectiveType mytype = PreprocessingInfo::CpreprocessorIfDeclaration;
17000 printf (
"Warning: attachArbitraryText(): attaching arbitrary text to the AST as a #if declaration: text = %s \n",text.c_str());
17002 result =
new PreprocessingInfo (mytype,text,
"transformation-generated", 0, 0, 0, position);
17003 ROSE_ASSERT(result);
17010 target->addToAttachedPreprocessingInfo(result);
17024 ROSE_ASSERT(target != NULL);
17025 AttachedPreprocessingInfoType *info= target->getAttachedPreprocessingInfo ();
17026 if (info == NULL)
return;
17027 AttachedPreprocessingInfoType::iterator j;
17028 for (j = info->begin (); j != info->end (); j++)
17030 if ((*j)->getTypeOfDirective()==PreprocessingInfo::CMacroCall)
17032#ifndef ROSE_SKIP_COMPILATION_OF_WAVE
17034 std::ostringstream os;
17035 token_container tc = (*j)->get_macro_call()->expanded_macro;
17036 token_container::const_iterator iter;
17037 for (iter=tc.begin(); iter!=tc.end(); iter++)
17038 os<<(*iter).get_value();
17041 string pragmaText = target->get_pragma()->get_pragma();
17042 string targetString = (*j)->getString();
17043 string replacement = os.str();
17045 size_t pos1 = pragmaText.find(targetString);
17046 while (pos1 != string::npos)
17048 pragmaText.replace(pos1, targetString.size(), replacement);
17049 pos1 = pragmaText.find(targetString);
17051 delete target->get_pragma();
17065 if (isSgWhileStmt(loopOrSwitch) || isSgDoWhileStmt(loopOrSwitch) ||
17066 isSgForStatement(loopOrSwitch)) {
17068 }
else if (isSgSwitchStatement(loopOrSwitch)) {
17069 body = isSgSwitchStatement(loopOrSwitch)->
get_body();
17071 ROSE_ASSERT (body);
17073 if (!breaks.empty()) {
17074 static int breakLabelCounter = 0;
17079 isSgScopeStatement(loopOrSwitch->
get_parent()));
17081 for (
size_t j = 0; j < breaks.size(); ++j) {
17086 newGoto->
set_parent(breaks[j]->get_parent());
17093 ROSE_ASSERT(node!=NULL);
17103 ROSE_ASSERT(node!=NULL);
17116 ROSE_ASSERT(stmt_src != NULL);
17117 ROSE_ASSERT(stmt_dst != NULL);
17120 if (infoList == NULL)
17123 printf (
"In SageInterface::movePreprocessingInfo(): infoList == NULL: exiting movePreprocessingInfo() \n");
17128 AttachedPreprocessingInfoType* infoToRemoveList =
new AttachedPreprocessingInfoType();
17131 printf (
"In SageInterface::movePreprocessingInfo(): \n");
17132 printf (
" --- stmt_src = %p = %s src_position = %d \n",stmt_src,stmt_src->
class_name().c_str(),src_position);
17134 if (src_declarationStatement != NULL)
17137 printf (
"src_declarationStatement->get_definingDeclaration() = %p \n",src_declarationStatement->
get_definingDeclaration());
17139 printf (
" --- stmt_dst = %p = %s dst_position = %d \n",stmt_dst,stmt_dst->
class_name().c_str(),dst_position);
17141 if (dst_declarationStatement != NULL)
17144 printf (
"dst_declarationStatement->get_definingDeclaration() = %p \n",dst_declarationStatement->
get_definingDeclaration());
17146 printf (
" --- src_position = %s \n",PreprocessingInfo::relativePositionName(src_position).c_str());
17147 printf (
" --- dst_position = %s \n",PreprocessingInfo::relativePositionName(dst_position).c_str());
17148 printf (
" --- usePrepend = %s \n",usePrepend ?
"true" :
"false");
17150 printf (
" --- infoList = %p \n",infoList);
17151 printf (
" --- infoToRemoveList = %p \n",infoToRemoveList);
17154 printf (
" --- dst_infoList = %p \n",dst_infoList);
17157 printf (
"****************************************************************** \n");
17158 printf (
"In SageInterface::movePreprocessingInfo(): Attached comments and CPP directives: stmt_src \n");
17160 printf (
"In SageInterface::movePreprocessingInfo(): Attached comments and CPP directives: stmt_dst \n");
17162 printf (
"****************************************************************** \n");
17172 printf (
" --- infoList->size() = %zu \n",infoList->size());
17173 printf (
" --- infoToRemoveList->size() = %zu \n",infoToRemoveList->size());
17179 for (Rose_STL_Container<PreprocessingInfo*>::iterator i = (*infoList).begin(); i != (*infoList).end(); i++)
17182 ROSE_ASSERT(*i != NULL);
17187 ROSE_ASSERT(info != NULL);
17190 printf (
"counter = %d Processing PreprocessingInfo = %s \n",counter,info->getString().c_str());
17199 for (Rose_STL_Container<PreprocessingInfo*>::iterator i = (*infoList).begin(); i != (*infoList).end(); i++)
17201 ROSE_ASSERT(*i != NULL);
17204 ROSE_ASSERT(info != NULL);
17207 (info->getTypeOfDirective()==PreprocessingInfo::C_StyleComment)||
17208 (info->getTypeOfDirective()==PreprocessingInfo::CplusplusStyleComment)||
17209 (info->getTypeOfDirective()==PreprocessingInfo::FortranStyleComment)||
17210 (info->getTypeOfDirective()==PreprocessingInfo::F90StyleComment)||
17211 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIncludeDeclaration )||
17212 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIncludeNextDeclaration )||
17213 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorDefineDeclaration )||
17214 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorUndefDeclaration)||
17215 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIfdefDeclaration )||
17216 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIfndefDeclaration )||
17217 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIfDeclaration )||
17218 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorDeadIfDeclaration )||
17219 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorElseDeclaration )||
17220 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorElifDeclaration )||
17221 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorEndifDeclaration ) ||
17222 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorEnd_ifDeclaration ) ||
17223 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorLineDeclaration) ||
17224 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorErrorDeclaration) ||
17225 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorWarningDeclaration) ||
17227 (info->getTypeOfDirective()==PreprocessingInfo::ClinkageSpecificationStart) ||
17228 (info->getTypeOfDirective()==PreprocessingInfo::ClinkageSpecificationEnd)
17233 if ( src_position == PreprocessingInfo::undef || info->getRelativePosition() == src_position)
17235 if (usePrepend ==
true)
17238 if (prevItem == NULL)
17256 info->setAsTransformation();
17264 stmt_dst->set_containsTransformationToSurroundingWhitespace(
true);
17265 if (isMarkedAsModified ==
false)
17272 (*infoToRemoveList).push_back(*i);
17276 if (dst_position != PreprocessingInfo::undef)
17278 info->setRelativePosition(dst_position);
17284 AttachedPreprocessingInfoType::iterator j;
17285 for (j = (*infoToRemoveList).begin(); j != (*infoToRemoveList).end(); j++)
17287 infoList->erase( find(infoList->begin(),infoList->end(),*j) );
17323 return info && (info->getRelativePosition () != pos);
17333 return info && !isNotRelPos (info, pos);
17340 ASSERT_not_null(src_node);
17343 AttachedPreprocessingInfoType* info = src_node->get_attachedPreprocessingInfoPtr();
17347 remove_copy_if(info->begin(),
17349 back_inserter(save_buf),
17350 [pos](
auto x) {
return !isRelPos(x, pos); }
17354 AttachedPreprocessingInfoType::iterator
17355 new_end = remove_if(info->begin(),
17357 [pos](
auto x) { return isRelPos(x, pos); }
17359 info->erase(new_end, info->end());
17363static AttachedPreprocessingInfoType *
17367 AttachedPreprocessingInfoType* info_list = s->get_attachedPreprocessingInfoPtr ();
17370 info_list =
new AttachedPreprocessingInfoType;
17371 ROSE_ASSERT (info_list);
17372 s->set_attachedPreprocessingInfoPtr (info_list);
17376 ROSE_ASSERT (info_list);
17383 if (save_buf.size()==0)
return;
17385 AttachedPreprocessingInfoType* info = createInfoList (dst_node);
17386 ROSE_ASSERT (info);
17393 if (pos==PreprocessingInfo::before)
17395 for(AttachedPreprocessingInfoType::reverse_iterator i=save_buf.rbegin();i!=save_buf.rend();i++)
17396 info->insert(info->begin(),*i);
17399 else if (pos==PreprocessingInfo::after)
17400 copy (save_buf.begin (), save_buf.end (), back_inserter (*info));
17401 else if (pos==PreprocessingInfo::inside)
17403 copy (save_buf.begin (), save_buf.end (), back_inserter (*info));
17404 cerr<<
"SageInterface::pastePreprocessingInfo() pos==PreprocessingInfo::inside is not supported."<<endl;
17405 save_buf[0]->display(
"ttt");
17411 ROSE_ASSERT(locatedNode != NULL);
17412 AttachedPreprocessingInfoType *comments =
17415 if (comments != NULL)
17417 printf (
"-----------------------------------------------\n");
17418 printf (
"Found an IR node (at %p of type: %s) in file %s \n",
17419 locatedNode, locatedNode->
class_name ().c_str (),
17420 (locatedNode->
get_file_info ()->get_filenameString ()).c_str ());
17422 AttachedPreprocessingInfoType::iterator i;
17423 for (i = comments->begin (); i != comments->end (); i++)
17426 (
"with attached preprocessingInfo numbering #%d :------------- \nclassification= %s:\nString format:%s\n",
17428 PreprocessingInfo::directiveTypeName ((*i)->getTypeOfDirective ()).
17429 c_str (), (*i)->getString ().c_str ());
17430 if ((*i)->getRelativePosition () == PreprocessingInfo::inside)
17431 printf (
"relative position is: inside\n");
17433 printf (
"relative position is: %s\n", \
17434 ((*i)->getRelativePosition () == PreprocessingInfo::before) ?
"before" :
"after");
17439 printf (
"No attached preprocessing info. (at %p of type: %s): \n", locatedNode,
17455template <
class ParentNode>
17465 if (basicblock == NULL) {
17467 (stmt.*setter)(basicblock);
17471 ROSE_ASSERT (basicblock != NULL);
17478 if (!isSgBasicBlock(b)) {
17486 ROSE_ASSERT (isSgBasicBlock(b));
17487 return isSgBasicBlock(b);
17493 if (!isSgBasicBlock(b)) {
17501 ROSE_ASSERT (isSgBasicBlock(b));
17502 return isSgBasicBlock(b);
17508 if (!isSgBasicBlock(b)) {
17516 ROSE_ASSERT (isSgBasicBlock(b));
17517 return isSgBasicBlock(b);
17522 ROSE_ASSERT (fs != NULL);
17524 return ensureBasicBlock_aux(*fs, &SgUpcForAllStatement::get_loop_body, &SgUpcForAllStatement::set_loop_body);
17529 if (!isSgBasicBlock(b)) {
17537 ROSE_ASSERT (isSgBasicBlock(b));
17538 return isSgBasicBlock(b);
17543 if (!isSgBasicBlock(b)) {
17551 ROSE_ASSERT (isSgBasicBlock(b));
17552 return isSgBasicBlock(b);
17557 if (!isSgBasicBlock(b)) {
17565 ROSE_ASSERT (isSgBasicBlock(b));
17566 return isSgBasicBlock(b);
17571 if (!isSgBasicBlock(b)) {
17579 printf (
"In SageInterface::ensureBasicBlockAsTrueBodyOfIf(): Added SgBasicBlock b = %p to addedBasicBlockNodes.size() = %zu \n",b,addedBasicBlockNodes.size());
17582 ROSE_ASSERT (isSgBasicBlock(b));
17583 return isSgBasicBlock(b);
17593 ROSE_ASSERT(bb != NULL);
17594 addedBasicBlockNodes.push_back(bb);
17596 printf (
"In SageInterface::recordNormalizations(): Added SgBasicBlock = %p to addedBasicBlockNodes.size() = %zu \n",bb,addedBasicBlockNodes.size());
17607 printf (
"In SageInterface::cleanupNontransformedBasicBlockNode(): addedBasicBlockNodes.size() = %zu \n",addedBasicBlockNodes.size());
17610 for (vector<SgBasicBlock*>::iterator i = addedBasicBlockNodes.begin(); i != addedBasicBlockNodes.end(); i++)
17613 ROSE_ASSERT(b != NULL);
17617 printf (
"This SgBasicBlock can be denormalized: b = %p \n",b);
17620 ROSE_ASSERT(parentOfBlock != NULL);
17625 ROSE_ASSERT(s != NULL);
17627 switch (parentOfBlock->
variantT())
17631 SgIfStmt* ifStatement = isSgIfStmt(parentOfBlock);
17635 printf (
"Calling set_true_body on ifStatement = %p = %s \n",ifStatement,ifStatement->
class_name().c_str());
17640 printf (
"Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17645 printf (
"DONE: Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17654 printf (
"Calling set_false_body on ifStatement = %p = %s \n",ifStatement,ifStatement->
class_name().c_str());
17659 printf (
"Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17664 printf (
"DONE: Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17668 printf (
"Mark as NOT modified after calling set_false_body on ifStatement = %p = %n \n",ifStatement,ifStatement->
class_name().c_str());
17671 printf (
"Error: case not handled in case V_SgIfStmt: parentOfBlock = %p = %s \n",parentOfBlock,parentOfBlock->
class_name().c_str());
17679 case V_SgWhileStmt:
17681 SgWhileStmt* whileStatement = isSgWhileStmt(parentOfBlock);
17682 if (b == whileStatement->
get_body())
17691 case V_SgSwitchStatement:
17694 if (b == switchStatement->
get_body())
17703 case V_SgForStatement:
17715 case V_SgCaseOptionStmt:
17717 SgCaseOptionStmt* caseOptionStatement = isSgCaseOptionStmt(parentOfBlock);
17718 if (b == caseOptionStatement->
get_body())
17727 case V_SgDefaultOptionStmt:
17730 if (b == defaultOptionStatement->
get_body())
17732 defaultOptionStatement->
set_body(s);
17739 case V_SgDoWhileStmt:
17741 SgDoWhileStmt* doWhileStatement = isSgDoWhileStmt(parentOfBlock);
17742 if (b == doWhileStatement->
get_body())
17752 printf (
"Error: case not handled in switch: parentOfBlock = %p = %s \n",parentOfBlock,parentOfBlock->
class_name().c_str());
17758 if (wasPreviouslyModified ==
false)
17763 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());
17770 printf (
"Exiting as a test! \n");
17777 printf (
"Leaving SageInterface::cleanupNontransformedBasicBlockNode(): addedBasicBlockNodes.size() = %zu \n",addedBasicBlockNodes.size());
17785 if (!createEmptyBody && (b == NULL || isSgNullStatement(b)))
17787 if (!isSgBasicBlock(b)) {
17795 ROSE_ASSERT (isSgBasicBlock(b));
17796 return isSgBasicBlock(b);
17801 if (!isSgBasicBlock(b)) {
17806 ROSE_ASSERT (isSgBasicBlock(b));
17807 return isSgBasicBlock(b);
17813 if (!isSgBasicBlock(b)) {
17818 ROSE_ASSERT (isSgBasicBlock(b));
17819 return isSgBasicBlock(b);
17831 case V_SgForStatement:
17833 if (isSgForStatement(p)->get_loop_body() == s)
17837 case V_SgUpcForAllStatement:
17840 if (upcforall.get_loop_body() == s)
17844 case V_SgWhileStmt:
17846 if (isSgWhileStmt(p)->get_body() == s)
17850 case V_SgDoWhileStmt:
17852 if (isSgDoWhileStmt(p)->get_body() == s)
17856 case V_SgSwitchStatement:
17858 if (isSgSwitchStatement(p)->get_body() == s)
17862 case V_SgCaseOptionStmt:
17864 if (isSgCaseOptionStmt(p)->get_body() == s)
17868 case V_SgDefaultOptionStmt:
17870 if (isSgDefaultOptionStmt(p)->get_body() == s)
17874 case V_SgCatchOptionStmt:
17876 if (isSgCatchOptionStmt(p)->get_body() == s)
17882 if (isSgIfStmt(p)->get_true_body() == s)
17884 else if (isSgIfStmt(p)->get_false_body() == s)
17890 if (isSgOmpBodyStatement(p))
17902 ROSE_ASSERT (singleStmt != NULL);
17903 ROSE_ASSERT (isSgBasicBlock(singleStmt) == NULL);
17915 case V_SgForStatement:
17917 if (isSgForStatement(p)->get_loop_body() == s)
17921 case V_SgUpcForAllStatement:
17925 if (upcforall.get_loop_body() == s)
17929 case V_SgWhileStmt:
17931 if (isSgWhileStmt(p)->get_body() == s)
17935 case V_SgDoWhileStmt:
17937 if (isSgDoWhileStmt(p)->get_body() == s)
17941 case V_SgSwitchStatement:
17943 if (isSgSwitchStatement(p)->get_body() == s)
17947 case V_SgCaseOptionStmt:
17949 if (isSgCaseOptionStmt(p)->get_body() == s)
17953 case V_SgDefaultOptionStmt:
17955 if (isSgDefaultOptionStmt(p)->get_body() == s)
17959 case V_SgCatchOptionStmt:
17961 if (isSgCatchOptionStmt(p)->get_body() == s)
17967 if (isSgIfStmt(p)->get_true_body() == s)
17969 else if (isSgIfStmt(p)->get_false_body() == s)
17975 if (isSgOmpBodyStatement(p))
17982 ROSE_ASSERT (rt != NULL);
17996 case V_SgBasicBlock:
return isSgBasicBlock(p);
17997 case V_SgForStatement:
17999 if (isSgForStatement(p)->get_loop_body() == s)
18001 else if (isSgForStatement(p)->get_test() == s)
18004 else if (isSgForStatement(p)->get_for_init_stmt() == s)
18010 case V_SgUpcForAllStatement:
18014 if (upcforall.get_loop_body() == s)
18017 ROSE_ASSERT( (s == upcforall.get_for_init_stmt())
18018 || (s == upcforall.get_test())
18022 case V_SgWhileStmt:
18024 if (isSgWhileStmt(p)->get_body() == s)
18026 else if (isSgWhileStmt(p)->get_condition() == s)
18032 case V_SgDoWhileStmt:
18034 if (isSgDoWhileStmt(p)->get_body() == s)
18036 else if (isSgDoWhileStmt(p)->get_condition() == s)
18042 case V_SgSwitchStatement:
18044 if (isSgSwitchStatement(p)->get_body() == s)
18046 else if (isSgSwitchStatement(p)->get_item_selector() == s)
18052 case V_SgCatchOptionStmt:
18054 if (isSgCatchOptionStmt(p)->get_body() == s)
18056 else if (isSgCatchOptionStmt(p)->get_condition() == s)
18064 if (isSgIfStmt(p)->get_true_body() == s)
18066 else if (isSgIfStmt(p)->get_false_body() == s)
18068 else if (isSgIfStmt(p)->get_conditional() == s)
18076 if (isSgOmpBodyStatement(p))
18091 void SageInterface::changeAllLoopBodiesToBlocks(
SgNode* top) {
18092 cerr<<
"Warning: SageInterface::changeAllLoopBodiesToBlocks() is being replaced by SageInterface::changeAllBodiesToBlocks()."<<endl;
18093 cerr<<
"Please use SageInterface::changeAllBodiesToBlocks() if you can."<<endl;
18101 bool allowEmptyBody;
18102 Visitor (
bool flag):allowEmptyBody(flag) {}
18103 virtual void visit(
SgNode* n) {
18108 case V_SgForStatement: {
18112 case V_SgWhileStmt: {
18116 case V_SgDoWhileStmt: {
18120 case V_SgSwitchStatement: {
18129 printf (
"In changeAllBodiesToBlocks(): case SgIfStmt: n->get_isModified() = %s \n",n->
get_isModified() ?
"true" :
"false");
18136 printf (
"In changeAllBodiesToBlocks(): AFTER RESET: case SgIfStmt: n->get_isModified() = %s \n",n->
get_isModified() ?
"true" :
"false");
18141 case V_SgCatchOptionStmt: {
18145 case V_SgUpcForAllStatement: {
18152 if (isSgOmpBodyStatement(n))
18159 if (wasPreviouslyModified ==
false)
18164 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());
18173 Visitor(createEmptyBody).traverse(top, postorder);
18194#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
18195 SgStatement* enclosingStatement = getStatementOfExpression(from);
18196 SgExprStatement* exprStatement = isSgExprStatement(enclosingStatement);
18198 SgForStatement* forStatement = isSgForStatement(enclosingStatement);
18199 SgReturnStmt* returnStatement = isSgReturnStmt(enclosingStatement);
18205 ROSE_ASSERT (exprStatement || forStatement || returnStatement || varDeclarationStatement);
18207 if (varDeclarationStatement)
18214 ROSE_ASSERT (root);
18217 if (forStatement && forStatement->get_increment() == root)
18228 forStatement->get_increment()->
set_parent(incrStmt);
18232 forStatement->set_increment(ne);
18239 assert (enclosingStmtParent);
18240 SgWhileStmt* whileStatement = isSgWhileStmt(enclosingStmtParent);
18241 SgDoWhileStmt* doWhileStatement = isSgDoWhileStmt(enclosingStmtParent);
18242 SgIfStmt* ifStatement = isSgIfStmt(enclosingStmtParent);
18244 SgForStatement* enclosingForStatement = isSgForStatement(enclosingStmtParent);
18245 if (enclosingForStatement && enclosingForStatement->get_test() == exprStatement)
18257 pushTestIntoBody(enclosingForStatement);
18260 else if (whileStatement && whileStatement->
get_condition() == exprStatement)
18273 pushTestIntoBody(whileStatement);
18277 else if (doWhileStatement && doWhileStatement->
get_condition() == exprStatement)
18293 myStatementInsert(doWhileStatement, new_statement,
false);
18295 SgName varname =
"rose__temp1";
18300 varname,
buildBoolType(), assignInitializer, new_statement);
18303 initname->set_scope(new_statement);
18335 else if (ifStatement && ifStatement->
get_conditional() == exprStatement)
18341 myStatementInsert(ifStatement, new_statement,
false);
18343 SgName varname =
"rose__temp2";
18352 initname->set_scope(new_statement);
18377 else if (switchStatement && switchStatement->
get_item_selector() == exprStatement)
18379 SgExpression* switchCond = exprStatement->get_expression();
18380 ROSE_ASSERT (switchCond);
18385 myStatementInsert(switchStatement, new_statement,
false);
18387 SgName varname =
"rose__temp3";
18434#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
18435 SgStatement* stmt = getStatementOfExpression(from);
18437 if (isSgExprStatement(stmt))
18451 if (isSgAssignOp(top) && isSgAssignOp(top)->get_rhs_operand() == from)
18469 convertInitializerIntoAssignment(init);
18472 SgExprStatement* new_stmt = isSgExprStatement(getStatementOfExpression(from));
18473 assert (new_stmt != NULL);
18474 replaceAssignmentStmtWithStatement(new_stmt, to);
18491 ROSE_ASSERT(func&&s);
18493 Rose_STL_Container <SgNode* > stmts = NodeQuery::querySubTree(func, V_SgReturnStmt);
18495 Rose_STL_Container<SgNode*>::iterator i;
18496 for (i=stmts.begin();i!=stmts.end();i++)
18499 ROSE_ASSERT(cur_stmt);
18502 bool needRewrite = (exp != NULL) && !(isSgValueExp(exp));
18513 if (stmts.size()==0 )
18518 cout<<
"In instrumentEndOfFunction(), found an empty function body.! "<<endl;
18530 return ((stmt->get_declarationModifier()).get_storageModifier()).isStatic();
18537 return ((stmt->get_declarationModifier()).get_storageModifier()).setStatic();
18543 return ((stmt->get_declarationModifier()).get_storageModifier()).isExtern();
18551 return ((stmt->get_declarationModifier()).get_storageModifier()).setExtern();
18558 return name->get_storageModifier().isMutable();
18571 std::vector<SgInitializedName*> in_params;
18583 std::vector<SgInitializedName*> out_params;
18593 case V_SgCharVal:
return (
long long)(isSgCharVal(expr)->get_value());
18594 case V_SgSignedCharVal:
return (
long long)(isSgSignedCharVal(expr)->get_value());
18595 case V_SgUnsignedCharVal:
return isSgUnsignedCharVal(expr)->get_value();
18596 case V_SgShortVal:
return (
long long)(isSgShortVal(expr)->get_value());
18597 case V_SgUnsignedShortVal:
return isSgUnsignedShortVal(expr)->get_value();
18598 case V_SgIntVal:
return (
long long)(isSgIntVal(expr)->get_value());
18599 case V_SgUnsignedIntVal:
return isSgUnsignedIntVal(expr)->get_value();
18600 case V_SgLongIntVal:
return (
long long)(isSgLongIntVal(expr)->get_value());
18601 case V_SgUnsignedLongVal:
return isSgUnsignedLongVal(expr)->get_value();
18602 case V_SgLongLongIntVal:
return isSgLongLongIntVal(expr)->get_value();
18603 case V_SgUnsignedLongLongIntVal:
return isSgUnsignedLongLongIntVal(expr)->get_value();
18604 case V_SgBoolValExp:
return (
long long )(isSgBoolValExp(expr)->get_value());
18610 printf (
"ERROR: In SageInterface::getIntegerConstantValue(): default reached: expr = %p = %s \n",expr,expr->
class_name().c_str());
18611 ROSE_ASSERT (
false);
18616 ROSE_ASSERT (!
"Bad kind return in getIntegerConstantValue");
18621#ifdef ROSE_ENABLE_BINARY_ANALYSIS
18630 ROSE_ASSERT(binary!=NULL);
18635 if (1==headers.size()) {
18636 requisite_header = headers[0];
18638 for (SgAsmGenericHeaderPtrList::const_iterator hi=headers.begin(); hi!=headers.end(); ++hi) {
18639 if (isSgAsmPEFileHeader(*hi)) {
18640 requisite_header = isSgAsmPEFileHeader(*hi);
18645 ROSE_ASSERT(requisite_header!=NULL);
18648 const SgAsmInterpretationPtrList &interps = binary->get_interpretations()->
get_interpretations();
18649 for (SgAsmInterpretationPtrList::const_iterator ii=interps.begin(); ii!=interps.end(); ++ii) {
18650 const SgAsmGenericHeaderPtrList &headers = (*ii)->get_headers()->get_headers();
18651 for (SgAsmGenericHeaderPtrList::const_iterator hi=headers.begin(); hi!=headers.end(); ++hi) {
18652 if ((*hi)==requisite_header)
18657 ROSE_ASSERT(!
"no appropriate interpretation");
18670 SgNode* copy = n->copy(*
this);
18674 if (fileInfo != NULL)
18683 } collectDependentDeclarationsCopyType;
18691 vector<PreprocessingInfo*> cppDirectiveList;
18693 void visit(
SgNode *astNode);
18701 if (locatedNode != NULL)
18705 if (comments != NULL)
18708 printf (
"Found attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
sage_class_name());
18710 AttachedPreprocessingInfoType::iterator i;
18711 for (i = comments->begin(); i != comments->end(); i++)
18713 ROSE_ASSERT ( (*i) != NULL );
18715 printf (
" Attached Comment (relativePosition=%s): %s\n",
18716 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
18717 (*i)->getString().c_str());
18718 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
18719 (*i)->get_file_info()->display(
"comment/directive location");
18727 cppDirectiveList.push_back(*i);
18729 printf (
" Attached include directive (relativePosition=%s): %s\n",
18730 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
18731 (*i)->getString().c_str());
18739 printf (
"No attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
sage_class_name());
18750vector<PreprocessingInfo*>
18757 return t.cppDirectiveList;
18761vector<PreprocessingInfo*>
18768 return t.cppDirectiveList;
18773outputPreprocessingInfoList (
const vector<PreprocessingInfo*> & l )
18777 vector<PreprocessingInfo*>::const_iterator i = l.begin();
18778 while ( i != l.end() )
18780 printf (
" Attached include directive (relativePosition=%s): %s\n",
18781 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
18782 (*i)->getString().c_str());
18797 case V_SgNamespaceDefinitionStatement:
18800 declaration = namespaceDefinition->get_namespaceDeclaration();
18804 case V_SgClassDefinition:
18805 case V_SgTemplateInstantiationDefn:
18814 printf (
"Error: default reached in getAssociatedDeclaration(): scope = %p = %s \n",scope,scope->
class_name().c_str());
18820 ROSE_ASSERT(declaration != NULL);
18822 return declaration;
18831 vector<SgDeclarationStatement*> declarationList;
18835 vector<SgSymbol*> symbolList;
18838 set<SgDeclarationStatement*> alreadySavedDeclarations;
18841 void visit(
SgNode *astNode);
18857 ROSE_ASSERT(scope != NULL);
18862 SgGlobal* globalScope = isSgGlobal(scope);
18863 if (globalScope == NULL)
18870 ROSE_ASSERT(parentScope != NULL);
18871 while (globalScope == NULL)
18873 associatedDeclaration = getAssociatedDeclaration(parentScope);
18874 ROSE_ASSERT(associatedDeclaration != NULL);
18876 parentScope = parentScope->
get_scope();
18877 globalScope = isSgGlobal(parentScope);
18883 return returnDeclaration;
18889outputDeclarationList (
const vector<SgDeclarationStatement*> & l )
18894 vector<SgDeclarationStatement*>::const_iterator i = l.begin();
18895 while ( i != l.end() )
18897 printf (
"In outputDeclarationList(): list[%d] = %p = %s = %s \n",counter++,*i,(*i)->class_name().c_str(),
SageInterface::get_name(*i).c_str());
18905 if (declaration != NULL)
18914 if (alreadySavedDeclarations.find(dependentDeclaration) == alreadySavedDeclarations.end())
18917 printf (
"In CollectDependentDeclarationsTraversal::visit(): selected dependentDeclaration = %p = %s = %s \n",
18921 declarationList.push_back(dependentDeclaration);
18924 alreadySavedDeclarations.insert(dependentDeclaration);
18926 printf (
"In CollectDependentDeclarationsTraversal::visit(): astNode = %p = %s = %s \n",astNode,astNode->
class_name().c_str(),
SageInterface::get_name(astNode).c_str());
18927 printf (
"############### ADDING dependentDeclaration = %p = %s to alreadySavedDeclarations set (size = %" PRIuPTR
") \n",
18928 dependentDeclaration,dependentDeclaration->
class_name().c_str(),alreadySavedDeclarations.size());
18936 printf (
"In CollectDependentDeclarationsTraversal::visit(): astNode = %p = %s = %s \n",astNode,astNode->
class_name().c_str(),
SageInterface::get_name(astNode).c_str());
18937 printf (
"############### EXISTING dependentDeclaration = %p = %s found in alreadySavedDeclarations set (size = %" PRIuPTR
") \n",
18938 dependentDeclaration,dependentDeclaration->
class_name().c_str(),alreadySavedDeclarations.size());
18945static std::vector<SgTypedefDeclaration*> collectTypedefDeclarations(
SgType* type)
18947 ROSE_ASSERT(type != NULL);
18948 std::vector<SgTypedefDeclaration*> result;
18949 SgType* currentType = type;
18959 modType = isSgModifierType(currentType);
18962 currentType = modType->get_base_type();
18966 refType = isSgReferenceType(currentType);
18969 currentType = refType->get_base_type();
18973 pointType = isSgPointerType(currentType);
18976 currentType = pointType->get_base_type();
18980 arrayType = isSgArrayType(currentType);
18983 currentType = arrayType->get_base_type();
18987 typedefType = isSgTypedefType(currentType);
18998 result.push_back(decl);
19012 if (result.size()>0)
19014 cout<<
"------------Found a chain of typedef decls: count="<<result.size()<<endl;
19015 for (vector <SgTypedefDeclaration*>::const_iterator iter = result.begin();
19016 iter!=result.end(); iter ++)
19043 if (fileInfo != NULL && fileInfo->isFrontendSpecific() ==
false && (isSgStatement(astNode) != NULL) )
19045 printf (
"\n\nIn CollectDependentDeclarationsTraversal::visit(): astNode = %p = %s = %s \n",astNode,astNode->
class_name().c_str(),
SageInterface::get_name(astNode).c_str());
19048 printf (
"alreadySavedDeclarations.size() = %" PRIuPTR
" \n",alreadySavedDeclarations.size());
19049 for (set<SgDeclarationStatement*>::iterator i = alreadySavedDeclarations.begin(); i != alreadySavedDeclarations.end(); i++)
19051 printf (
"alreadySavedDeclarations %d: %p = %s \n",counter++,*i,(*i)->class_name().c_str());
19062 if (initializedname != NULL)
19064 SgType* type = initializedname->get_type();
19067 std::vector <SgTypedefDeclaration*> typedefVec = collectTypedefDeclarations(type);
19068 for (std::vector <SgTypedefDeclaration*>::const_iterator iter =typedefVec.begin();
19069 iter != typedefVec.end(); iter++)
19072 addDeclaration(typedef_decl);
19096 SgNamedType* namedType = isSgNamedType(strippedType);
19097 if (namedType != NULL)
19105 if (classDeclaration != NULL)
19112 if (declaration != NULL)
19115 addDeclaration(declaration);
19118 addDeclaration (classDeclaration);
19129 ROSE_ASSERT(classSymbol != NULL);
19132 symbolList.push_back(classSymbol);
19137 if (enum_decl != NULL)
19140 ROSE_ASSERT(declaration != NULL);
19141 addDeclaration(declaration);
19146 ROSE_ASSERT(esymbol!= NULL);
19147 symbolList.push_back(esymbol);
19151 printf (
"Found reference to type = %p = %s strippedType = %p = %s \n",type,type->
class_name().c_str(),strippedType,strippedType->
class_name().c_str());
19158 if (functionCallExp != NULL)
19163 if (declaration != NULL)
19164 addDeclaration(declaration);
19171 if (functionSymbol)
19172 symbolList.push_back(functionSymbol);
19177 SgEnumVal * eval = isSgEnumVal(astNode);
19180 declaration = eval->get_declaration();
19181 ROSE_ASSERT(declaration != NULL);
19182 addDeclaration(declaration);
19184 ROSE_ASSERT(symbol != NULL);
19185 symbolList.push_back(symbol);
19190static std::map<const SgStatement*, bool> visitedDeclMap;
19202 printf (
"\n\n********************************************************** \n");
19203 printf (
" Inside of getDependentDeclarations(stmt = %p = %s) \n",stmt,stmt->
class_name().c_str());
19204 printf (
"********************************************************** \n");
19206 visitedDeclMap[stmt]=
true;
19210 declarationList = t.declarationList;
19211 symbolList = t.symbolList;
19214 copy(t.declarationList.begin(),t.declarationList.end(), back_inserter(declarationList));
19215 copy(t.symbolList.begin(),t.symbolList.end(), back_inserter(symbolList));
19217 sort (declarationList.begin(), declarationList.end());
19218 vector<SgDeclarationStatement*>::iterator new_end = unique(declarationList.begin(), declarationList.end());
19219 declarationList.erase(new_end, declarationList.end());
19221 sort (symbolList.begin(), symbolList.end());
19222 vector<SgSymbol*>::iterator end2 = unique(symbolList.begin(), symbolList.end());
19223 symbolList.erase(end2, symbolList.end());
19227 for (vector<SgDeclarationStatement*>::const_iterator iter = t.declarationList.begin();
19228 iter !=t.declarationList.end(); iter++)
19231 SgType* base_type = NULL;
19236 if (isSgClassDeclaration(decl))
19238 base_type = isSgClassDeclaration(decl)->get_type();
19240 if (isSgTypedefDeclaration(decl))
19244 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);
19252 if (isSgClassType(base_type))
19254 SgClassDeclaration* class_decl = isSgClassDeclaration(isSgClassType(base_type)->get_declaration()->get_definingDeclaration());
19255 if (class_decl!=NULL)
19257 body_stmt = class_decl->get_definition();
19261 if ((body_stmt!=NULL) &&(!visitedDeclMap[body_stmt]))
19273vector<SgDeclarationStatement*>
19276 vector<SgDeclarationStatement*> sortedNode;
19278 if (nodevec.size()==0 )
19281 if (nodevec.size() ==1)
19285 Rose_STL_Container<SgNode*> queryResult = NodeQuery::querySubTree(project,V_SgDeclarationStatement);
19286 for (Rose_STL_Container<SgNode*>::const_iterator iter = queryResult.begin();
19287 iter!= queryResult.end(); iter++)
19290 SgNode* cur_node = *iter;
19292 ROSE_ASSERT(cur_stmt!=NULL);
19304 ROSE_ASSERT (cur_stmt != func_decl);
19307 vector<SgDeclarationStatement*>::const_iterator i = find (nodevec.begin(), nodevec.end(), cur_stmt);
19308 if (i!=nodevec.end())
19312 vector<SgDeclarationStatement*>::const_iterator j = find (sortedNode.begin(), sortedNode.end(), *i);
19313 if (j == sortedNode.end())
19314 sortedNode.push_back(*i);
19318 if (nodevec.size() != sortedNode.size())
19320 cerr<<
"Fatal error in sortSgNodeListBasedOnAppearanceOrderInSource(): nodevec.size() != sortedNode.size()"<<endl;
19321 cerr<<
"nodevec() have "<< nodevec.size()<<
" elements. They are:"<<endl;
19322 for (vector<SgDeclarationStatement*>::const_iterator iter = nodevec.begin(); iter != nodevec.end(); iter++)
19324 cerr<<(*iter)<<
" "<<(*iter)->class_name() <<
" "<<(*iter)->unparseToString()<<endl;
19326 cerr<<
"sortedNode() have " << sortedNode.size() <<
" elements. They are:"<<endl;
19327 for (vector<SgDeclarationStatement*>::const_iterator iter = sortedNode.begin(); iter != sortedNode.end(); iter++)
19329 cerr<<(*iter)<<
" "<<(*iter)->class_name() <<
" "<<(*iter)->unparseToString()<<endl;
19332 ROSE_ASSERT(nodevec.size() == sortedNode.size());
19339std::vector<SgDeclarationStatement*>
19345 printf (
"\n\n********************************************************** \n");
19346 printf (
" Inside of getDependentDeclarations(stmt = %p = %s) \n",stmt,stmt->
class_name().c_str());
19347 printf (
"********************************************************** \n");
19352 return t.declarationList;
19355 visitedDeclMap.clear();
19356 vector<SgDeclarationStatement*> declarationList;
19357 vector<SgSymbol*> symbolList;
19361 printf (
"\n\n ********************************************************** \n");
19362 cout<<
"Found dependent decl: count="<<declarationList.size()<<endl;
19363 for ( vector<SgDeclarationStatement*>::const_iterator iter = declarationList.begin();
19364 iter != declarationList.end(); iter++)
19366 cout<<
"\t"<<(*iter)->class_name()<<
" at line "<<(*iter)->get_file_info()->get_line()<<endl;
19367 if ((*iter)->variantT()== V_SgFunctionDeclaration)
19368 cout<<
"func name is:"<<isSgFunctionDeclaration(*iter)->get_name().getString()<<endl;
19371 printf (
"\n ********************************************************** \n");
19374 return declarationList;
19383 bool returnValue =
false;
19386 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());
19389 if (functionName.is_null() ==
false)
19392 if ( functionName ==
"operator++" || functionName ==
"operator--" || functionName ==
"operator&" ||
19393 functionName ==
"operator!" || functionName ==
"operator*" || functionName ==
"operator+" ||
19394 functionName ==
"operator-" || functionName ==
"operator+" || functionName ==
"operator~")
19396 returnValue =
true;
19400 return returnValue;
19412 bool returnValue =
false;
19419 size_t numberOfOperands = 0;
19421 if (memberFunctionRefExp != NULL)
19423 ROSE_ASSERT(functionRefExp == NULL);
19425 if (memberFunctionDeclaration != NULL)
19427 functionName = memberFunctionDeclaration->get_name();
19428 numberOfOperands = memberFunctionDeclaration->get_args().size();
19434 if (functionRefExp != NULL)
19437 if (functionDeclaration != NULL)
19439 functionName = functionDeclaration->get_name();
19440 numberOfOperands = functionDeclaration->get_args().size();
19446 printf (
"In SageInterface::isPrefixOperator(): unknown case of exp = %p = %s \n",exp,exp->
class_name().c_str());
19451 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);
19456 if (memberFunctionRefExp != NULL)
19459 ROSE_ASSERT(functionRefExp == NULL);
19460 if (numberOfOperands == 0)
19463 returnValue =
true;
19468 returnValue =
false;
19474 ROSE_ASSERT(functionRefExp != NULL);
19475 ROSE_ASSERT(memberFunctionRefExp == NULL);
19476 if (numberOfOperands == 1)
19479 returnValue =
true;
19484 ROSE_ASSERT(numberOfOperands == 2);
19485 returnValue =
false;
19491 printf (
"Leaving SageInterface::isPrefixOperator(): returnValue = %s \n",returnValue ?
"true" :
"false");
19494 return returnValue;
19510 bool returnValue =
false;
19512 if (memberFunctionRefExp == NULL)
19516 if (memberFunctionDeclaration != NULL)
19518 SgName functionName = memberFunctionDeclaration->get_name();
19519 if ( (functionName ==
"operator[]") && (isSgType(memberFunctionDeclaration->get_type()) != NULL) )
19521 returnValue =
true;
19525 if ( (functionName ==
"operator()") && (isSgType(memberFunctionDeclaration->get_type()) != NULL) )
19527 returnValue =
true;
19531 returnValue =
false;
19536 return returnValue;
19547 ROSE_ASSERT(scope != NULL);
19550 printf (
"In SageInterface::lastStatementOfScopeWithTokenInfo(): scope = %p = %s \n",scope,scope->
class_name().c_str());
19553 SgIfStmt* ifStatement = isSgIfStmt(scope);
19554 if (ifStatement != NULL)
19557 if (lastStatement == NULL || (tokenStreamSequenceMap.find(lastStatement) == tokenStreamSequenceMap.end() || tokenStreamSequenceMap[lastStatement] == NULL))
19560 if (lastStatement == NULL || (tokenStreamSequenceMap.find(lastStatement) == tokenStreamSequenceMap.end() || tokenStreamSequenceMap[lastStatement] == NULL))
19562 lastStatement = NULL;
19566 printf (
"Note: SgIfStmt scope in SageInterface::lastStatementOfScopeWithTokenInfo(): returning lastStatement = %p \n",lastStatement);
19567 if (lastStatement != NULL)
19569 printf (
" --- lastStatement = %p = %s \n",lastStatement,lastStatement->
class_name().c_str());
19572 return lastStatement;
19576 if (statementList.rbegin() != statementList.rend())
19579 SgStatementPtrList::reverse_iterator i = statementList.rbegin();
19581 while (i != statementList.rend() && (tokenStreamSequenceMap.find(*i) == tokenStreamSequenceMap.end() || tokenStreamSequenceMap[*i] == NULL) )
19586 if (i == statementList.rend())
19588 lastStatement = NULL;
19592 lastStatement = *i;
19596 return lastStatement;
19610 void visit (
SgNode* node)
19620 printf (
"Found declaration = %p = %s name = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
19621 if (decl != definingDeclaration && decl != firstNondefiningDeclaration)
19623 otherDeclaration = decl;
19626 if (definingDeclaration != NULL)
19628 definingDeclaration->get_declarationModifier().get_accessModifier().display(
"definingDeclaration: accessModifier");
19631 if (firstNondefiningDeclaration != NULL)
19633 firstNondefiningDeclaration->get_declarationModifier().get_accessModifier().display(
"firstNondefiningDeclaration: accessModifier");
19636 if (otherDeclaration != NULL)
19638 otherDeclaration->get_declarationModifier().get_accessModifier().display(
"otherDeclaration: accessModifier");
19648 DeclarationTraversal traversal;
19649 traversal.traverse(astNode, preorder);
19661 void visit (
SgNode* node)
19667 if (functionDefinition != NULL)
19670 ROSE_ASSERT(functionDeclaration != NULL);
19672 string functionName = functionDeclaration->get_name();
19674 printf (
"functionName = %s \n",functionName.c_str());
19676 if (functionName ==
"main")
19680 ROSE_ASSERT(functionBody != NULL);
19682 ROSE_ASSERT(symbolTable != NULL);
19685 symbolTable->
print();
19690 if (namespaceDefinition != NULL)
19693 ROSE_ASSERT(namespaceDeclaration != NULL);
19695 string namespaceName = namespaceDeclaration->
get_name();
19697 printf (
"namespaceName = %s \n",namespaceName.c_str());
19699 if (namespaceName ==
"B")
19702 ROSE_ASSERT(symbolTable != NULL);
19705 symbolTable->
print();
19713 ScopeTraversal traversal;
19714 traversal.traverse(astNode, preorder);
19722 if (fileInfo != NULL)
19728 if (locatedNode != NULL)
19737 printf (
"In markNodeToBeUnparsed(): physical_file_id = %d \n",physical_file_id);
19740 locatedNode->
get_file_info()->set_physical_file_id(physical_file_id);
19742 printf (
"Note: calling node markTransformationsForOutput(): node = %p = %s \n",node,node->
class_name().c_str());
19746 markTransformationsForOutput(node);
19751 printf (
"Note: node is not a SgLocatedNode: node = %p = %s \n",node,node->
class_name().c_str());
19758 printf (
"Note: no Sg_File_Info was found: node = %p = %s \n",node,node->
class_name().c_str());
19763 if (locatedNode != NULL)
19772 printf (
"In SageInterface::markNodeToBeUnparsed(): locatedNode = %p = %s calling set_physical_file_id(%d) \n",locatedNode,locatedNode->
class_name().c_str(),physical_file_id);
19774 locatedNode->
get_file_info()->set_physical_file_id(physical_file_id);
19779 printf (
"Note: no Sg_File_Info was found: node = %p = %s \n",node,node->
class_name().c_str());
19812 class InheritedAttribute
19815 int physical_file_id;
19816 bool isCastSubtree;
19817 InheritedAttribute(
int file_id): physical_file_id(file_id), isCastSubtree(
false) {}
19818 InheritedAttribute(
const InheritedAttribute & X)
19820 isCastSubtree = X.isCastSubtree;
19821 physical_file_id = X.physical_file_id;
19832 InheritedAttribute evaluateInheritedAttribute (
SgNode* node, InheritedAttribute inheritedAttribute)
19834 InheritedAttribute returnAttribute(inheritedAttribute);
19836 SgCastExp* castExpression = isSgCastExp(node);
19837 if (castExpression != NULL)
19839 returnAttribute.isCastSubtree =
true;
19842 if (returnAttribute.isCastSubtree ==
true)
19846 printf (
"In markSubtreeToBeUnparsedTreeTraversal(): subtree of a SgCastExp: node = %p = %s physical_file_id = %d \n",
19847 node,node->
class_name().c_str(),inheritedAttribute.physical_file_id);
19853 printf (
"In markSubtreeToBeUnparsedTreeTraversal(): Calling markNodeToBeUnparsed(): node = %p = %s physical_file_id = %d \n",
19854 node,node->
class_name().c_str(),inheritedAttribute.physical_file_id);
19860 return returnAttribute;
19864 InheritedAttribute inheritedAttribute(physical_file_id);
19867 SubtreeTraversal traversal;
19870 printf (
"\nIn markSubtreeToBeUnparsedTreeTraversal(): calling traverse \n");
19873 traversal.traverse(root, inheritedAttribute);
19875 printf (
"This function does not compile with GNU 4.9 or older compilers (part of ROSE used only with more modern compilers) \n");
19884vector<SgDeclarationStatement*>
19885generateCopiesOfDependentDeclarations (
const vector<SgDeclarationStatement*>& dependentDeclarations,
SgScopeStatement* targetScope)
19896 printf (
"\n\n********************************************************** \n");
19897 printf (
" Inside of generateCopiesOfDependentDeclarations(stmt = %p = %s) \n",stmt,stmt->
class_name().c_str());
19898 printf (
"********************************************************** \n");
19901 vector<SgDeclarationStatement*> copiesOfDependentDeclarations;
19906 printf (
"Output the dependentDeclarations: dependentDeclarations.size() = %" PRIuPTR
" \n",dependentDeclarations.size());
19907 outputDeclarationList(dependentDeclarations);
19910 printf (
"************************************************ \n");
19911 printf (
"*** Make all copies of dependentDeclarations *** \n");
19912 printf (
"************************************************ \n");
19916 ROSE_ASSERT(targetScope != NULL);
19919 ROSE_ASSERT(isSgGlobal(targetScope) != NULL);
19921 for (vector<SgDeclarationStatement*>::const_iterator i = dependentDeclarations.begin(); i != dependentDeclarations.end(); i++)
19924 printf (
"Copying declaration = %p = %s = %s \n",*i,(*i)->class_name().c_str(),
SageInterface::get_name(*i).c_str());
19928 SgNode* copy_node = NULL;
19933 if (functionDeclaration != NULL)
19942 printf (
"WARNING: In SageInterface -- generateCopiesOfDependentDeclarations(): I think this is the wrong lookup symbol function that is being used here! \n");
19949 printf (
"In generateCopiesOfDependentDeclarations(): Copy mechanism appied to SgFunctionDeclaration functionDeclaration->get_firstNondefiningDeclaration() = %p \n",functionDeclaration->
get_firstNondefiningDeclaration());
19951 printf (
"functionDeclaration = %p \n",functionDeclaration);
19952 printf (
"functionDeclaration->get_definingDeclaration() = %p \n",functionDeclaration->
get_definingDeclaration());
19954 printf (
"functionDeclaration->get_scope() = %p \n",functionDeclaration->
get_scope());
19955 printf (
"targetScope = %p \n",targetScope);
19958 assert(copy_functionDeclaration != NULL);
19960 copy_functionDeclaration->
set_parent(targetScope);
19970 assert(copy_functionDeclaration->
get_scope() != NULL);
19971 assert(copy_functionDeclaration->
get_scope() == targetScope);
19972 assert(copy_functionDeclaration->
get_scope()->lookup_function_symbol(copy_functionDeclaration->get_name(),
19973 copy_functionDeclaration->get_type()) != NULL);
19974 assert(copy_functionDeclaration->
get_scope()->lookup_function_symbol(copy_functionDeclaration->get_name(),
19977 copy_node = copy_functionDeclaration;
19979 printf (
"In generateCopiesOfDependentDeclarations(): DONE: Copy mechanism appied to SgFunctionDeclaration \n");
19993 cout<<
"Copying a defining typedef declaration:"<<tdecl->
unparseToString()<<endl;
19995 cout<<
"Copying a non-defining typedef declaration:"<<tdecl->
unparseToString()<<endl;
19999 tdecl_copy->set_typedefBaseTypeContainsDefiningDeclaration (
false);
20002 copy_node = (*i)->copy(collectDependentDeclarationsCopyType);
20006 ROSE_ASSERT(copy_declaration != NULL);
20010 copy_declaration->
set_scope(targetScope);
20022 ROSE_ASSERT(copy_node != NULL);
20031 ROSE_ASSERT(copy_definingDeclaration != NULL);
20033 ROSE_ASSERT( *i != NULL );
20034 ROSE_ASSERT(copy_definingDeclaration != NULL);
20037 if (copy_definingDeclaration->
get_parent() == NULL)
20039 copy_definingDeclaration->
set_parent(targetScope);
20041 ROSE_ASSERT(copy_definingDeclaration->
get_parent() != NULL);
20044 printf (
"DONE: Copying declaration: original scope = %p copied to scope = %p \n",(*i)->get_scope(),copy_definingDeclaration->
get_scope());
20054 ROSE_ASSERT(copy_definingDeclaration->
get_parent() == NULL);
20061 printf (
"copy_definingDeclaration = %p \n",copy_definingDeclaration);
20062 printf (
"copy_definingDeclaration->get_firstNondefiningDeclaration() == NULL \n");
20063 printf (
"copy_definingDeclaration->get_definingDeclaration() = %p \n",copy_definingDeclaration->
get_definingDeclaration());
20068 if ((*i)->get_firstNondefiningDeclaration() != NULL)
20076 copiesOfDependentDeclarations.push_back(copy_definingDeclaration);
20080 printf (
"****************************************************** \n");
20081 printf (
"*** DONE: Make all copies of dependentDeclarations *** \n");
20082 printf (
"****************************************************** \n");
20083 printf (
"copiesOfDependentDeclarations.size() = %" PRIuPTR
" \n",copiesOfDependentDeclarations.size());
20089 ROSE_ASSERT(copiesOfDependentDeclarations.size() <= dependentDeclarations.size());
20091 return copiesOfDependentDeclarations;
20096declarationContainsDependentDeclarations(
SgDeclarationStatement* decl, vector<SgDeclarationStatement*> & dependentDeclarationList )
20099 bool returnValue =
false;
20102 printf (
"\n\n********************************************************** \n");
20103 printf (
" Inside of declarationContainsDependentDeclarations(decl = %p = %s) \n",decl,decl->
class_name().c_str());
20104 printf (
"********************************************************** \n");
20112 for (
size_t i = 0; i < locallyDependentDeclarationList.size(); i++)
20118 vector<SgDeclarationStatement*>::iterator j = find(dependentDeclarationList.begin(),dependentDeclarationList.end(),d);
20119 if (j != dependentDeclarationList.end())
20124 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());
20126 returnValue =
true;
20131 printf (
"**************************************************************************** \n");
20132 printf (
" LEAVING: Inside of declarationContainsDependentDeclarations(decl = %p = %s) returnValue = %s \n",decl,decl->
class_name().c_str(),returnValue ?
"true" :
"false");
20133 printf (
"**************************************************************************** \n");
20136 return returnValue;
20141 ROSE_ASSERT (new_exp != NULL);
20142 ROSE_ASSERT (anchor_exp != NULL);
20143 ROSE_ASSERT (new_exp != anchor_exp);
20146 ROSE_ASSERT (parent != NULL);
20150 ROSE_ASSERT (result != NULL);
20162 ROSE_ASSERT (new_exp != NULL);
20163 ROSE_ASSERT (anchor_exp != NULL);
20164 ROSE_ASSERT (new_exp != anchor_exp);
20167 ROSE_ASSERT (parent != NULL);
20171 ROSE_ASSERT (t != NULL);
20173 ROSE_ASSERT (enclosing_stmt != NULL);
20180 ROSE_ASSERT (temp_sym != NULL);
20182 *temp_decl = t_decl;
20187 * temp_ref = first_ref;
20200 string fileName =
"separate-outlined-file";
20220 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl = %p \n",decl);
20221 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_parent() = %p \n",decl->
get_parent());
20222 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_scope() = %p \n",decl->
get_scope());
20223 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): original_statement = %p \n",original_statement);
20224 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): file (decl) = %s \n",TransformationSupport::getSourceFile(decl)->getFileName().c_str());
20225 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_firstNondefiningDeclaration() = %p \n",decl->
get_firstNondefiningDeclaration());
20227 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): file (first non-defining) = %s \n",TransformationSupport::getSourceFile(decl->
get_firstNondefiningDeclaration())->
getFileName().c_str());
20228 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_definingDeclaration() = %p \n",decl->
get_definingDeclaration());
20230 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): file (first non-defining) = %s \n",TransformationSupport::getSourceFile(decl->
get_definingDeclaration())->
getFileName().c_str());
20233#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
20265 vector<SgDeclarationStatement*> dependentDeclarationList_inOriginalFile;
20272 vector<SgDeclarationStatement*> dependentDeclarationList = generateCopiesOfDependentDeclarations(dependentDeclarationList_inOriginalFile,scope);
20273 ROSE_ASSERT(dependentDeclarationList.size() <= dependentDeclarationList_inOriginalFile.size());
20283 std::map<SgNode*, SgNode*> replacementMap;
20288 SgCopyHelp::copiedNodeMapType copyNodeMap = collectDependentDeclarationsCopyType.get_copiedNodeMap();
20289 SgCopyHelp::copiedNodeMapType::iterator copyNodeMapItrator = copyNodeMap.begin();
20290 while (copyNodeMapItrator != copyNodeMap.end())
20295 SgNode* first =
const_cast<SgNode*
>(copyNodeMapItrator->first);
20296 SgNode* second = copyNodeMapItrator->second;
20298 printf (
"copyNodeMapItrator.first = %p = %s second = %p = %s \n",first,first->
class_name().c_str(),second,second->
class_name().c_str());
20301 if (isSgSymbol(first) != NULL)
20306 replacementMap.insert(pair<SgNode*,SgNode*>(first,second));
20309 copyNodeMapItrator++;
20313 printf (
"Exiting after test of new functionality \n");
20319 SgSourceFile* sourceFile = TransformationSupport::getSourceFile(original_statement);
20320 vector<PreprocessingInfo*> requiredDirectivesList = collectCppDirectives(sourceFile);
20323 ROSE_ASSERT(outlinedFunctionDeclaration != NULL);
20324 SgGlobal* originalFileGlobalScope = TransformationSupport::getGlobalScope(original_statement);
20325 ROSE_ASSERT(originalFileGlobalScope != NULL);
20327 printf (
"WARNING: In SageInterface::appendStatementWithDependentDeclaration(): I think this is the wrong lookup symbol function that is being used here! \n");
20331 SgFunctionSymbol* outlinedFunctionSymbolFromOriginalFile = isSgFunctionSymbol(originalFileGlobalScope->lookup_symbol(outlinedFunctionDeclaration->get_name(),NULL,NULL));
20337 printf (
"outlinedFunctionSymbolFromOriginalFile = %p outlinedFunctionSymbolFromOutlinedFile = %p \n",outlinedFunctionSymbolFromOriginalFile,outlinedFunctionSymbolFromOutlinedFile);
20339 printf (
"TransformationSupport::getSourceFile(decl)->getFileName() = %s \n",TransformationSupport::getSourceFile(decl)->getFileName().c_str());
20340 printf (
"TransformationSupport::getSourceFile(decl->get_firstNondefiningDeclaration())->getFileName() = %s \n",TransformationSupport::getSourceFile(decl->
get_firstNondefiningDeclaration())->
getFileName().c_str());
20341 printf (
"TransformationSupport::getSourceFile(original_statement)->getFileName() = %s \n",TransformationSupport::getSourceFile(original_statement)->getFileName().c_str());
20344 ROSE_ASSERT(outlinedFunctionSymbolFromOriginalFile != NULL);
20345 ROSE_ASSERT(outlinedFunctionSymbolFromOutlinedFile != NULL);
20348 ROSE_ASSERT(outlinedFunctionSymbolFromOriginalFile == outlinedFunctionSymbolFromOutlinedFile);
20351 replacementMap.insert(pair<SgNode*,SgNode*>(originalFileGlobalScope,scope));
20354 SgFunctionDeclaration* outlinedNondefiningFunctionDeclarationFromOriginalFile = isSgFunctionDeclaration(outlinedFunctionSymbolFromOriginalFile->get_declaration());
20356 ROSE_ASSERT(outlinedNondefiningFunctionDeclarationFromOriginalFile != NULL);
20357 ROSE_ASSERT(outlinedNondefiningFunctionDeclarationFromOutlinedFile != NULL);
20358 replacementMap.insert(pair<SgNode*,SgNode*>(outlinedNondefiningFunctionDeclarationFromOriginalFile,outlinedNondefiningFunctionDeclarationFromOutlinedFile));
20367 for (
size_t i = 0; i < dependentDeclarationList.size(); i++)
20373 printf (
"originalDeclaration = %p \n",originalDeclaration);
20375 d->
get_file_info()->display(
"SageInterface::appendStatementWithDependentDeclaration()");
20383 ROSE_ASSERT(decl->
get_scope() == scope);
20389 printf (
"Add the required symbol information to the symbol table: scope = %p = %s \n",scope,scope->
class_name().c_str());
20396 case V_SgClassDeclaration:
20398 if ( declarationContainsDependentDeclarations(d,dependentDeclarationList) ==
true )
20399 printf (
"Warning: This class contains dependent declarations (not implemented) \n");
20403 case V_SgMemberFunctionDeclaration:
20404 printf (
"Sorry, support for dependent member function declarations not implemented! \n");
20407 case V_SgTemplateInstantiationDecl:
20408 printf (
"Sorry, not implemented: case SgTemplateInstantiationDecl not handled as dependent declaration \n");
20409 d->
get_file_info()->display(
"Sorry, not implemented: case SgTemplateInstantiationDecl not handled as dependent declaration");
20411 printf (
"Case of SgTemplateInstantiationDecl not implemented. \n");
20414 case V_SgNamespaceDeclarationStatement:
20415 if (declarationContainsDependentDeclarations(d,dependentDeclarationList) ==
true )
20416 printf (
"Warning: This namespace contains dependent declarations (not supported) \n");
20419 case V_SgFunctionDeclaration:
20420 case V_SgTypedefDeclaration:
20421 case V_SgEnumDeclaration:
20425 printf (
"default case in SageInterface::appendStatementWithDependentDeclaration() (handling dependentDeclarationList) d = %p = %s \n",d,d->
class_name().c_str());
20431 vector<PreprocessingInfo*> cppDirectivesAlreadyAttachedToDependentDeclarations = collectCppDirectives(d);
20434 printf (
"directives BEFORE excluding those already present in dependent declarations \n");
20435 outputPreprocessingInfoList(requiredDirectivesList);
20437 printf (
"directives already attached to dependent declarations \n");
20438 outputPreprocessingInfoList(cppDirectivesAlreadyAttachedToDependentDeclarations);
20442 vector<PreprocessingInfo*>::iterator j = cppDirectivesAlreadyAttachedToDependentDeclarations.begin();
20443 while ( j != cppDirectivesAlreadyAttachedToDependentDeclarations.end() )
20446 vector<PreprocessingInfo*>::iterator entry = find(requiredDirectivesList.begin(),requiredDirectivesList.end(),*j);
20447 ROSE_ASSERT(entry != requiredDirectivesList.end());
20449 requiredDirectivesList.erase(entry);
20455 printf (
"directives AFTER excluding those already present in dependent declarations \n");
20456 outputPreprocessingInfoList(requiredDirectivesList);
20465 if (dependentDeclarationList.empty() ==
true)
20467 firstStatmentInFile = decl;
20471 firstStatmentInFile = dependentDeclarationList[0];
20474 ROSE_ASSERT(firstStatmentInFile != NULL);
20482 if (excludeHeaderFiles ==
false)
20485 vector<PreprocessingInfo*>::reverse_iterator j = requiredDirectivesList.rbegin();
20486 while ( j != requiredDirectivesList.rend() )
20505 SgSourceFile* outlinedFile = TransformationSupport::getSourceFile(scope);
20506 ROSE_ASSERT(outlinedFile != NULL);
20512 printf (
"\n\n************************************************************\n");
20513 printf (
"Calling Utils::edgePointerReplacement() \n");
20519 printf (
"Calling Utils::edgePointerReplacement(): DONE \n");
20520 printf (
"************************************************************\n\n");
20522 printf (
"\n\n After replacementMapTraversal(): intermediateDeleteSet: \n");
20523 displaySet(intermediateDeleteSet,
"After Utils::edgePointerReplacement");
20527 ROSE_ASSERT(dependentDeclarationList.size() <= dependentDeclarationList_inOriginalFile.size());
20535 printf (
"replacementMap.size() = %" PRIuPTR
" dependentDeclarationList.size() = %" PRIuPTR
" \n",replacementMap.size(),dependentDeclarationList.size());
20551 int SgVariableSymbol_count;
20552 int SgFunctionSymbol_count;
20553 int SgClassDeclaration_count;
20554 int SgTypedefSymbol_count;
20555 int SgMemFuncSymbol_count;
20556 int SgTemplateSymbol_count;
20557 int SgEnumFieldSymbol_count;
20575 SgVariableSymbol_count = 0;
20576 SgVariableSymbolPtr = symbol;
20577 SgFunctionSymbolPtr =NULL;
20578 SgClassSymbolPtr =NULL;
20579 SgTypedefPtr = NULL;
20580 SgMemFuncSymbolPtr =NULL;
20581 class_defining = NULL;
20583 typedef_defining =NULL;
20584 function_decl = NULL;
20585 SgTemplateSymbolPtr = NULL;
20586 template_defining = NULL;
20587 SgEnumFieldSymbolPtr = NULL;
20588 templateInstantiate_defining =NULL;
20592 SgFunctionSymbol_count = 0;
20593 SgFunctionSymbolPtr = symbol;
20596 SgMemFuncSymbol_count =0;
20598 SgVariableSymbolPtr = NULL;
20599 SgClassSymbolPtr =NULL;
20600 SgTypedefPtr = NULL;
20601 SgMemFuncSymbolPtr =NULL;
20602 class_defining = NULL;
20604 typedef_defining =NULL;
20605 function_decl = NULL;
20606 SgTemplateSymbolPtr = NULL;
20607 template_defining = NULL;
20608 SgEnumFieldSymbolPtr = NULL;
20609 templateInstantiate_defining =NULL;
20613 SgClassDeclaration_count = 0;
20614 SgClassSymbolPtr = symbol;
20615 SgFunctionSymbolPtr = NULL;
20616 SgVariableSymbolPtr = NULL;
20617 SgTypedefPtr = NULL;
20618 SgMemFuncSymbolPtr =NULL;
20619 class_defining = NULL;
20621 typedef_defining =NULL;
20622 function_decl = NULL;
20623 SgTemplateSymbolPtr = NULL;
20624 template_defining = NULL;
20625 SgEnumFieldSymbolPtr = NULL;
20626 templateInstantiate_defining =NULL;
20630 SgTypedefSymbol_count =0;
20631 SgTypedefPtr = symbol;
20632 SgClassSymbolPtr = NULL;
20633 SgFunctionSymbolPtr = NULL;
20634 SgVariableSymbolPtr = NULL;
20635 SgMemFuncSymbolPtr =NULL;
20636 class_defining = NULL;
20638 typedef_defining =NULL;
20639 function_decl = NULL;
20640 SgTemplateSymbolPtr = NULL;
20641 template_defining = NULL;
20642 SgEnumFieldSymbolPtr = NULL;
20643 templateInstantiate_defining =NULL;
20647 SgMemFuncSymbolPtr = symbol;
20648 SgMemFuncSymbol_count =0;
20649 SgTypedefPtr = NULL;
20650 SgClassSymbolPtr = NULL;
20651 SgFunctionSymbolPtr = NULL;
20652 SgVariableSymbolPtr = NULL;
20653 class_defining = NULL;
20655 typedef_defining =NULL;
20656 function_decl = NULL;
20657 SgTemplateSymbolPtr = NULL;
20658 template_defining = NULL;
20659 SgEnumFieldSymbolPtr = NULL;
20660 templateInstantiate_defining =NULL;
20664 SgTemplateSymbolPtr = symbol;
20665 SgTemplateSymbol_count =0;
20666 SgMemFuncSymbolPtr = NULL;
20667 SgTypedefPtr = NULL;
20668 SgClassSymbolPtr = NULL;
20669 SgFunctionSymbolPtr = NULL;
20670 SgVariableSymbolPtr = NULL;
20671 class_defining = NULL;
20673 typedef_defining =NULL;
20674 function_decl = NULL;
20675 template_defining = NULL;
20676 SgEnumFieldSymbolPtr = NULL;
20677 templateInstantiate_defining =NULL;
20681 SgEnumFieldSymbolPtr = symbol;
20682 SgEnumFieldSymbol_count =0;
20683 SgTemplateSymbolPtr = NULL;
20684 SgMemFuncSymbolPtr = NULL;
20685 SgTypedefPtr = NULL;
20686 SgClassSymbolPtr = NULL;
20687 SgFunctionSymbolPtr = NULL;
20688 SgVariableSymbolPtr = NULL;
20689 class_defining = NULL;
20691 typedef_defining =NULL;
20692 function_decl = NULL;
20693 template_defining = NULL;
20694 templateInstantiate_defining =NULL;
20699 class_defining = node;
20700 SgMemFuncSymbolPtr = NULL;
20701 SgTypedefPtr = NULL;
20702 SgClassSymbolPtr = NULL;
20703 SgFunctionSymbolPtr = NULL;
20704 SgVariableSymbolPtr = NULL;
20706 typedef_defining =NULL;
20707 function_decl = NULL;
20708 SgTemplateSymbolPtr = NULL;
20709 template_defining = NULL;
20710 SgEnumFieldSymbolPtr = NULL;
20711 templateInstantiate_defining =NULL;
20715 template_defining = node;
20716 class_defining = NULL;
20717 SgMemFuncSymbolPtr = NULL;
20718 SgTypedefPtr = NULL;
20719 SgClassSymbolPtr = NULL;
20720 SgFunctionSymbolPtr = NULL;
20721 SgVariableSymbolPtr = NULL;
20723 typedef_defining =NULL;
20724 function_decl = NULL;
20725 SgTemplateSymbolPtr = NULL;
20726 SgEnumFieldSymbolPtr = NULL;
20727 templateInstantiate_defining =NULL;
20730 function_decl =node;
20731 class_defining = NULL;
20732 SgMemFuncSymbolPtr = NULL;
20733 SgTypedefPtr = NULL;
20734 SgClassSymbolPtr = NULL;
20735 SgFunctionSymbolPtr = NULL;
20736 SgVariableSymbolPtr = NULL;
20738 typedef_defining =NULL;
20739 SgTemplateSymbolPtr = NULL;
20740 template_defining = NULL;
20741 SgEnumFieldSymbolPtr = NULL;
20742 templateInstantiate_defining =NULL;
20747 function_decl =NULL;
20748 class_defining = NULL;
20749 SgMemFuncSymbolPtr = NULL;
20750 SgTypedefPtr = NULL;
20751 SgClassSymbolPtr = NULL;
20752 SgFunctionSymbolPtr = NULL;
20753 SgVariableSymbolPtr = NULL;
20754 typedef_defining =NULL;
20755 SgTemplateSymbolPtr = NULL;
20756 template_defining = NULL;
20757 SgEnumFieldSymbolPtr = NULL;
20758 templateInstantiate_defining =NULL;
20762 typedef_defining = node;
20764 function_decl =NULL;
20765 class_defining = NULL;
20766 SgMemFuncSymbolPtr = NULL;
20767 SgTypedefPtr = NULL;
20768 SgClassSymbolPtr = NULL;
20769 SgFunctionSymbolPtr = NULL;
20770 SgVariableSymbolPtr = NULL;
20771 SgTemplateSymbolPtr = NULL;
20772 template_defining = NULL;
20773 SgEnumFieldSymbolPtr = NULL;
20774 templateInstantiate_defining =NULL;
20778 templateInstantiate_defining =node;
20779 typedef_defining = NULL;
20781 function_decl =NULL;
20782 class_defining = NULL;
20783 SgMemFuncSymbolPtr = NULL;
20784 SgTypedefPtr = NULL;
20785 SgClassSymbolPtr = NULL;
20786 SgFunctionSymbolPtr = NULL;
20787 SgVariableSymbolPtr = NULL;
20788 SgTemplateSymbolPtr = NULL;
20789 template_defining = NULL;
20790 SgEnumFieldSymbolPtr = NULL;
20797 if(SgVariableSymbolPtr !=NULL)
20799 if(node->get_scope()!=NULL)
20805 if (isSgVariableSymbol(s) == SgVariableSymbolPtr) SgVariableSymbol_count++;
20810 if(SgEnumFieldSymbolPtr !=NULL)
20812 if(node->get_scope()!=NULL)
20818 if (isSgEnumFieldSymbol(s) == SgEnumFieldSymbolPtr) SgEnumFieldSymbol_count++;
20826 if(SgVariableSymbolPtr !=NULL){
20828 if (s == SgVariableSymbolPtr) SgVariableSymbol_count++;
20832 int get_num_variable_pointers(){
return SgVariableSymbol_count;}
20834 int get_num_EnumField_pointers(){
return SgEnumFieldSymbol_count;}
20839 if(SgFunctionSymbolPtr !=NULL){
20845 if ((
SgFunctionSymbol *)s == SgFunctionSymbolPtr) SgFunctionSymbol_count++;
20850 if(function_decl!=NULL){
20854 if(node!=function_decl && (define==function_decl || first_nondefine==function_decl))
delete node;
20863 printf (
"In visit(SgFunctionRefExp* node): SgFunctionSymbolPtr = %p \n",SgFunctionSymbolPtr);
20865 if (SgFunctionSymbolPtr !=NULL)
20868 if (isSgFunctionSymbol(s) == SgFunctionSymbolPtr)
20870 SgFunctionSymbol_count++;
20872 printf (
"Increment SgFunctionSymbol_count = %d \n",SgFunctionSymbol_count);
20882 printf (
"In visit(SgMemberFunctionRefExp* node): SgFunctionSymbolPtr = %p \n",SgFunctionSymbolPtr);
20884 if (SgFunctionSymbolPtr !=NULL)
20887 if (isSgFunctionSymbol(s) == SgFunctionSymbolPtr)
20889 SgFunctionSymbol_count++;
20891 printf (
"Increment SgFunctionSymbol_count = %d \n",SgFunctionSymbol_count);
20899 if (SgFunctionSymbolPtr !=NULL){
20901 if (isSgFunctionSymbol(s) == SgFunctionSymbolPtr) SgFunctionSymbol_count++;
20905 int get_num_Function_pointers(){
return SgFunctionSymbol_count;}
20910 if(SgClassSymbolPtr !=NULL){
20915 if (isSgClassSymbol(s) == SgClassSymbolPtr) SgClassDeclaration_count++;
20920 if(class_defining!=NULL) {
20924 if((class_decl==class_defining||class_decl1==class_defining) && node!=class_defining )
20932 if(SgClassSymbolPtr !=NULL){
20937 if (isSgClassSymbol(s) == SgClassSymbolPtr) SgClassDeclaration_count++;
20942 if(templateInstantiate_defining!=NULL) {
20949 if((template_decl==templateInstantiate_defining||template_decl1==templateInstantiate_defining) && node!=templateInstantiate_defining){
20969 if (SgClassSymbolPtr !=NULL){
20970 SgSymbol* s = node->get_class_symbol();
20971 if (s == SgClassSymbolPtr) SgClassDeclaration_count++;
20977 if (SgClassSymbolPtr !=NULL){
20979 if (isSgClassSymbol(s) == SgClassSymbolPtr) SgClassDeclaration_count++;
20984 int get_num_Class_pointers(){
return SgClassDeclaration_count;}
20990 if(memFunc !=NULL){
20992 if(func == memFunc){
21001 if (SgMemFuncSymbolPtr !=NULL){
21006 if(symbol == SgMemFuncSymbolPtr){
21007 SgMemFuncSymbol_count++;
21016 if (SgMemFuncSymbolPtr !=NULL){
21021 if(symbol == SgMemFuncSymbolPtr){
21022 SgMemFuncSymbol_count++;
21031 int get_num_memFunc_pointers(){
return SgMemFuncSymbol_count;}
21037 if(SgTypedefPtr!=NULL){
21046 if(typedef_defining!=NULL){
21048 if(typedef_define == typedef_defining && node != typedef_defining ) {
21054 int get_num_Typedef_pointers(){
return SgTypedefSymbol_count;}
21060 if (SgTemplateSymbolPtr !=NULL){
21065 if(symbol == SgTemplateSymbolPtr){
21066 SgTemplateSymbol_count++;
21072 if(template_defining !=NULL) {
21079 if((template_decl==template_defining||template_decl1==template_defining) && node!=template_defining) {
21089 int get_num_Template_pointers(){
return SgTemplateSymbol_count;}
21099 void visit (
SgNode* node)
21106 printf (
"In DeleteAST::visit(): node = %p = %s \n",node,node->
class_name().c_str());
21111 if (isSgScopeStatement(node) !=NULL)
21115 printf (
"Deleting the scopes type table: scope->get_type_table() = %p \n",scope->get_type_table());
21117 delete scope->get_type_table();
21123 if (isSgTypeTable(node) !=NULL)
21127 printf (
"Deleting the type table (SgSymbolTable): typeTable->get_type_table() = %p \n",typeTable->get_type_table());
21129 delete typeTable->get_type_table();
21132 if(isSgInitializedName(node) !=NULL){
21136 if(isSgVariableDefinition(var_def) !=NULL){
21143 if(isSgInitializedName(node)->get_scope()!=NULL){
21147 if(isSgVariableSymbol(symbol) !=NULL){
21149 traverseMemoryPoolVisitorPattern(visitor);
21150 if(visitor.get_num_variable_pointers()==1){
21157 if(isSgEnumFieldSymbol(symbol) !=NULL){
21159 traverseMemoryPoolVisitorPattern(visitor);
21160 if(visitor.get_num_EnumField_pointers()==1){
21171 if(isSgVarRefExp(node) !=NULL){
21173 ClassicVisitor visitor(symbol);
21174 traverseMemoryPoolVisitorPattern(visitor);
21175 if(visitor.get_num_variable_pointers()==1){
21187 SgFunctionDeclaration* funcDecl = isSgFunctionDeclaration(node);
21188 if (funcDecl != NULL){
21189 if (isSgMemberFunctionDeclaration(node) == NULL) {
21190 if (funcDecl->get_scope() != NULL) {
21191 if (funcDecl->get_scope()->get_symbol_table() != NULL) {
21192 SgSymbol* symbol = ((SgFunctionDeclaration*)node)->get_symbol_from_symbol_table();
21193 ClassicVisitor visitor((SgFunctionSymbol *)symbol);
21194 traverseMemoryPoolVisitorPattern(visitor);
21195 if (visitor.get_num_Function_pointers()==1) { //only one reference to this FunctionSymbol => safe to delete
21196 ((SgFunctionDeclaration*)node)->get_scope()->get_symbol_table()->remove(symbol);
21198 //printf("A SgFunctionSymbol was deleted\n");
21200 ClassicVisitor visitor1((SgFunctionDeclaration *)node);
21201 traverseMemoryPoolVisitorPattern(visitor1);
21208 if(isSgFunctionRefExp(node) !=NULL)
21211 SgFunctionRefExp* functionRefExp = isSgFunctionRefExp(node);
21212 ROSE_ASSERT(functionRefExp->get_symbol_i() != NULL);
21213 printf ("In DeleteAST::visit(): functionRefExp->get_symbol_i() = %p = %s \n",functionRefExp->get_symbol_i(),functionRefExp->get_symbol_i()->class_name().c_str());
21215 SgFunctionSymbol *symbol = ((SgFunctionRefExp*)node)->get_symbol_i();
21216 ClassicVisitor visitor(symbol);
21217 traverseMemoryPoolVisitorPattern(visitor);
21218 if(visitor.get_num_Function_pointers()==1)
21220 // only one reference to this FunctionSymbol => safe to delete
21221 //((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21223 //printf("A SgFunctionSymbol was deleted\n");
21228 if(isSgUserDefinedBinaryOp(node) !=NULL){
21229 SgFunctionSymbol *symbol = ((SgUserDefinedBinaryOp*)node)->get_symbol();
21230 ClassicVisitor visitor(symbol);
21231 traverseMemoryPoolVisitorPattern(visitor);
21232 if(visitor.get_num_Function_pointers()==1){ //only one reference to this FunctionSymbol => safe to delete
21233 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21235 //printf("A SgFunctionSymbol was deleted\n");
21243 if(isSgTypedefDeclaration(node) !=NULL){
21248 if(isSgTypedefSymbol(symbol)){
21250 traverseMemoryPoolVisitorPattern(visitor);
21251 if(visitor.get_num_Typedef_pointers()==1){
21262 traverseMemoryPoolVisitorPattern(visitor1);
21270 if(isSgNamespaceDeclarationStatement(node) !=NULL){
21271 if(((SgNamespaceDeclarationStatement*)node)->get_scope()!=NULL){
21272 if(((SgNamespaceDeclarationStatement*)node)->get_scope()->get_symbol_table()!=NULL)
21274 SgSymbol* symbol = ((SgNamespaceDeclarationStatement*)node)->get_symbol_from_symbol_table();
21275 if(isSgNamespaceSymbol(symbol)){
21276 ((SgNamespaceDeclarationStatement*)node)->get_scope()->get_symbol_table()->remove(symbol);
21278 //printf("A SgNamespaceSymbol was deleted\n");
21285 if(isSgNamespaceAliasDeclarationStatement(node) !=NULL){
21286 if(((SgNamespaceAliasDeclarationStatement*)node)->get_scope()!=NULL){
21287 if(((SgNamespaceAliasDeclarationStatement*)node)->get_scope()->get_symbol_table()!=NULL)
21289 SgSymbol* symbol = ((SgNamespaceAliasDeclarationStatement*)node)->get_symbol_from_symbol_table();
21290 if(isSgNamespaceSymbol(symbol)){
21291 ((SgNamespaceAliasDeclarationStatement*)node)->get_scope()->get_symbol_table()->remove(symbol);
21293 //printf("A SgNamespaceSymbol was deleted\n");
21304 if(isSgLabelStatement(node) !=NULL){
21309 if(isSgLabelSymbol(symbol)){
21318 if(isSgLabelRefExp(node) !=NULL){
21330 if(isSgEnumDeclaration(node) !=NULL){
21331 if(((SgEnumDeclaration*)node)->get_scope()!=NULL){
21332 if(((SgEnumDeclaration*)node)->get_scope()->get_symbol_table()!=NULL)
21334 SgSymbol* symbol = ((SgEnumDeclaration*)node)->get_symbol_from_symbol_table();
21335 if(isSgEnumSymbol(symbol) !=NULL){
21336 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21338 //printf("A SgEnumSymbol was deleted\n");
21342 SgEnumType* type= ((SgEnumDeclaration*)node)->get_type();
21345 //printf("A SgEnumType was deleted\n");
21354 if(isSgClassDeclaration(node) !=NULL && isSgTemplateInstantiationDecl(node) ==NULL){
21359 if(isSgClassSymbol(symbol) !=NULL){
21361 traverseMemoryPoolVisitorPattern(visitor);
21362 if(visitor.get_num_Class_pointers()==1){
21372 traverseMemoryPoolVisitorPattern(visitor);
21381 if(isSgThisExp(node) !=NULL){
21384 traverseMemoryPoolVisitorPattern(visitor);
21385 if(visitor.get_num_Class_pointers()==1){
21386 ((
SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21393 if(isSgClassNameRefExp(node) !=NULL){
21395 if(isSgClassSymbol(symbol) !=NULL)
21398 traverseMemoryPoolVisitorPattern(visitor);
21399 if(visitor.get_num_Class_pointers()==1){
21400 ((
SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21412 if(isSgMemberFunctionDeclaration(node) !=NULL){
21413 if(((SgMemberFunctionDeclaration*)node)->get_scope()!=NULL){
21414 if(((SgMemberFunctionDeclaration*)node)->get_scope()->get_symbol_table()!=NULL)
21416 SgSymbol* symbol = ((SgMemberFunctionDeclaration*)node)->get_symbol_from_symbol_table();
21417 if(isSgMemberFunctionSymbol(symbol)){
21418 ClassicVisitor visitor((SgMemberFunctionSymbol*)symbol);
21419 traverseMemoryPoolVisitorPattern(visitor);
21420 if(visitor.get_num_memFunc_pointers()==1){
21421 ((SgMemberFunctionDeclaration*)node)->get_scope()->get_symbol_table()->remove(symbol);
21423 //printf("A SgMemberFunctionSymbol was deleted\n");
21428 ClassicVisitor visitor((SgMemberFunctionDeclaration*) node);
21429 traverseMemoryPoolVisitorPattern(visitor);
21432//Tan: I have no idea why the codes below cannot work. Perhaps it conflicts with some prior works
21434 if(isSgMemberFunctionRefExp(node) !=NULL){
21435 SgMemberFunctionSymbol* symbol = ((SgMemberFunctionRefExp*)node)->get_symbol_i();
21436 ClassicVisitor visitor(symbol);
21437 traverseMemoryPoolVisitorPattern(visitor);
21438 if(visitor.get_num_memFunc_pointers()==1){ //only one reference to this symbol => safe to delete
21439 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21441 //printf("A SgClassSymbol was deleted\n");
21446 if(isSgFunctionType(node) !=NULL){
21447 SgSymbol* symbol = ((SgFunctionType*)node)->get_symbol_from_symbol_table();
21448 if(isSgFunctionTypeSymbol(symbol)){
21449 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21451 //printf("A SgFunctionTypeSymbol was deleted\n");
21460 if(isSgInterfaceStatement(node) !=NULL){
21465 if(isSgInterfaceSymbol(symbol)){
21476 if(isSgModuleStatement(node) !=NULL){
21481 if(isSgModuleSymbol(symbol)){
21494 if(isSgTemplateInstantiationMemberFunctionDecl(node) !=NULL){
21499 if(isSgMemberFunctionSymbol(symbol)){
21501 traverseMemoryPoolVisitorPattern(visitor);
21502 if(visitor.get_num_memFunc_pointers()==1){
21511 traverseMemoryPoolVisitorPattern(visitor);
21514 if(isSgTemplateDeclaration(node) !=NULL){
21520 traverseMemoryPoolVisitorPattern(visitor);
21521 if(visitor.get_num_Template_pointers()==1){
21524 printf(
"A SgTemplateSymbol was deleted\n");
21530 traverseMemoryPoolVisitorPattern(visitor1);
21535 if(isSgInterfaceStatement(node) !=NULL){
21540 if(isSgInterfaceSymbol(symbol)){
21551 if(isSgModuleStatement(node) !=NULL){
21556 if(isSgModuleSymbol(symbol)){
21566 if(isSgTemplateInstantiationDecl(node) !=NULL){
21571 if(isSgClassSymbol(symbol)){
21573 traverseMemoryPoolVisitorPattern(visitor);
21574 if(visitor.get_num_Class_pointers()==1){
21593 printf(
"SgTemplateArg in normal traversal\n");
21595 printf(
"SgTemplateInstantiationDecl in normal traversal\n");
21598 traverseMemoryPoolVisitorPattern(visitor);
21608 printf (
"After delete node: node = %p = %s \n",node,node->
class_name().c_str());
21614 DeleteAST deleteTree;
21617 deleteTree.traverse(n,postorder);
21620 printf (
"Leaving SageInterface::deleteAST(): n = %p = %s \n",n,n->
class_name().c_str());
21647 virtual void visit(
SgNode* n)
21650 if (expression != NULL)
21652 Visitor().traverse(expression->get_originalExpressionTree(), postorder);
21659 Visitor().traverse(root, postorder);
21671 SgSymbol* symbol = s_table->find(iname);
21672 ASSERT_not_null(symbol);
21677 ASSERT_not_null(sourceBlock);
21678 ASSERT_not_null(targetBlock);
21693 SgSymbol* symbol = s_table->find(iname);
21694 ASSERT_not_null(symbol);
21701 ASSERT_not_null(symbol);
21712 ASSERT_require(stmt->
get_parent() == targetBlock);
21727 func->set_scope(targetBlock);
21730 SgFunctionDeclaration* nondef_decl= isSgFunctionDeclaration(func->get_firstNondefiningDeclaration());
21731 if (func != nondef_decl)
21733 ASSERT_not_null(nondef_decl);
21740 else if (
auto labelStmt = isSgLabelStatement(stmt))
21742 if (labelStmt->get_scope() == sourceBlock) {
21743 labelStmt->set_scope(targetBlock);
21748 else if (isSgJovialTableStatement(stmt) || isSgTypedefDeclaration(stmt) || isSgEnumDeclaration(stmt))
21756 mlog[Rose::Diagnostics::WARN] <<
"test failing stmt->get_scope() == targetBlock in SageInterface::moveStatementsBetweenBlocks(): class: "
21763 if (declaration !=
nullptr)
21770 case V_SgVariableDeclaration:
21775 for (SgInitializedNamePtrList::iterator ii = l.begin(); ii != l.end(); ii++)
21785 SgType* var_type = init_name->get_type();
21788 var_type = mod_type->get_base_type();
21795 if (isSgEnumType(var_type))
21797 SgEnumType* enum_type = isSgEnumType(var_type);
21812 enumerator->set_scope(targetBlock);
21816 else if (isSgJovialTableType(var_type))
21832 SgVariableSymbol* var_sym = isSgVariableSymbol(init_name -> search_for_symbol_from_symbol_table ()) ;
21833 ASSERT_not_null(var_sym);
21836 if (old_scope != sourceBlock)
21838 old_scope->remove_symbol (var_sym);
21839 sourceBlock ->
insert_symbol(init_name->get_name(), var_sym);
21842 init_name->set_scope(targetBlock);
21843 initname_vec.push_back(init_name);
21847 case V_SgFunctionDeclaration:
21850 ASSERT_not_null(funcDecl);
21857 if (old_scope != sourceBlock)
21859 old_scope->remove_symbol (func_sym);
21867 case V_SgProgramHeaderStatement:
21868 case V_SgProcedureHeaderStatement:
21869 case V_SgClassDeclaration:
21870 case V_SgEnumDeclaration:
21873 ASSERT_not_null(nondef_decl);
21887 if (
auto proc = isSgProcedureHeaderStatement(nondef_decl)) {
21888 for (
auto arg : proc->get_parameterList()->get_args()) {
21889 if (arg->get_scope() != proc->get_scope()) {
21893 arg->set_scope(proc->get_scope());
21905 name->set_scope(targetBlock);
21910 case V_SgJovialTableStatement:
21914 ROSE_ASSERT (table);
21923 case V_SgTypedefDeclaration:
21927 ASSERT_not_null(typedef_decl);
21932 case V_SgAttributeSpecificationStatement:
21933 case V_SgEmptyDeclaration:
21934 case V_SgFortranIncludeLine:
21935 case V_SgImplicitStatement:
21936 case V_SgJovialDefineDeclaration:
21937 case V_SgJovialDirectiveStatement:
21938 case V_SgJovialLabelDeclaration:
21939 case V_SgJovialOverlayDeclaration:
21940 case V_SgPragmaDeclaration:
21941 case V_SgAdaAttributeClause:
21945 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());
21954template <
class T1,
class T2>
21955void moveDeclarationsBetweenScopes( T1* sourceBlock, T2* targetBlock)
21959 ROSE_ASSERT (sourceBlock && targetBlock);
21960 ROSE_ASSERT (sourceBlock->containsOnlyDeclarations() && targetBlock->containsOnlyDeclarations());
21961 if ((
void*)sourceBlock == (
void*)targetBlock)
21963 cerr<<
"warning: SageInterface::moveStatementsBetweenScopes() is skipped, "<<endl;
21964 cerr<<
" since program is trying to move statements from and to the identical scoped block. "<<endl;
21968 SgDeclarationStatementPtrList& srcStmts = sourceBlock->get_declarations ();
21969 std::vector <SgInitializedName*> initname_vec;
21971 for (
auto stmt : srcStmts)
21973 moveOneStatement(sourceBlock, targetBlock, stmt, initname_vec);
21978 ROSE_ASSERT(srcStmts.empty() ==
true);
21979 ROSE_ASSERT(sourceBlock->get_declarations().empty() ==
true);
21982 moveSymbolTableBetweenBlocks(sourceBlock, targetBlock, initname_vec);
21995template <
class T1,
class T2>
21996void moveStatementsBetweenScopes( T1* sourceBlock, T2* targetBlock)
21999 ROSE_ASSERT (sourceBlock && targetBlock);
22000 if ((
void*)sourceBlock == (
void*)targetBlock)
22002 cerr<<
"warning: SageInterface::moveStatementsBetweenScopes() is skipped, "<<endl;
22003 cerr<<
" since program is trying to move statements from and to the identical scoped block. "<<endl;
22007 SgStatementPtrList & srcStmts = sourceBlock->get_statements();
22008 std::vector <SgInitializedName*> initname_vec;
22012 moveOneStatement(sourceBlock, targetBlock, stmt, initname_vec);
22017 ROSE_ASSERT(srcStmts.empty() ==
true);
22018 ROSE_ASSERT(sourceBlock->get_statements().empty() ==
true);
22021 moveSymbolTableBetweenBlocks(sourceBlock, targetBlock, initname_vec);
22035 ASSERT_not_null(decl);
22039 ASSERT_require(local_def && global_def && (local_def!=global_def));
22041 for (
auto symbol : local_def->get_symbol_table()->get_symbols())
22043 SgSymbol *orig_sym = isSgSymbol(symbol);
22044 ASSERT_not_null(orig_sym);
22053 moveDeclarationsBetweenScopes(sourceBlock, targetBlock);
22055 createAliasSymbols(isSgNamespaceDeclarationStatement(targetBlock->
get_parent()));
22060 moveStatementsBetweenScopes(sourceBlock, targetBlock);
22062 createAliasSymbols(isSgNamespaceDeclarationStatement(targetBlock->
get_parent()));
22067 moveDeclarationsBetweenScopes(sourceBlock, targetBlock);
22073 moveStatementsBetweenScopes (sourceBlock, targetBlock);
22081 ROSE_ASSERT (func != NULL);
22083 ROSE_ASSERT (p != NULL);
22085 if (le && le->get_lambda_function() == func)
22098 #pragma message ("WARNING: MSVC does not handle isLambdaCapturedVariable() properly.")
22100 ROSE_ASSERT (varRef!= NULL);
22104 SgThisExp* te = isSgThisExp(p->get_lhs_operand_i());
22108 ROSE_ASSERT (csym!= NULL);
22111 ROSE_ASSERT (xdecl != NULL);
22115 if (le->get_lambda_closure_class() == xdecl )
22131 ROSE_ASSERT(current != NULL);
22133 if (isSgInitializedName(current))
22135 name = isSgInitializedName(current);
22137 else if (isSgPntrArrRefExp(current) != NULL)
22141 ROSE_ASSERT(exp != NULL);
22143 ROSE_ASSERT(suc ==
true);
22147 else if (isSgVarRefExp(current) != NULL)
22153 if (isSgDotExp(parent))
22155 if (isSgDotExp(parent)->get_rhs_operand() == current)
22161 if (isSgArrowExp(parent)->get_rhs_operand() == current)
22165 name = isSgVarRefExp(current)->get_symbol()->get_declaration();
22167 else if (isSgFunctionRefExp(current) != NULL ||
22168 isSgTemplateFunctionRefExp(current) != NULL ||
22169 isSgMemberFunctionRefExp(current) != NULL ||
22170 isSgTemplateMemberFunctionRefExp(current) != NULL)
22175 else if (isSgNonrealRefExp(current) != NULL)
22180 else if (isSgDotExp(current))
22187 ROSE_ASSERT(child);
22191 else if (isSgArrowExp(current))
22212 ROSE_ASSERT(child);
22217 else if (isSgThisExp(current))
22222 else if (isSgPointerDerefExp(current))
22226 else if(isSgUnaryOp(current)) {
22229 else if (isSgCastExp(current))
22235 else if (isSgAddOp(current))
22240 else if (isSgSubtractOp(current))
22251 else if (isSgIntVal(current))
22261 if (!isSgConstructorInitializer(current))
22263 mlog[Sawyer::Message::Common::WARN] <<
22264 "convertRefToInitializedName: " <<
22267 cerr<<
"In SageInterface::convertRefToInitializedName(): unhandled reference type:"<<current->
class_name()<<endl;
22278#ifdef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22279 printf (
"AbstractHandle support is disabled for ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT \n");
22285 size_t pos = input_string.find(
"SourceFile<");
22286 ROSE_ASSERT (pos != string::npos);
22287 string trimed_string = input_string.substr(pos);
22291 if (handle->getNode()!=NULL)
22296#pragma message ("WARNING: covariant return type for get_node() not supported in MSVC.")
22297 printf (
"ERROR: covariant return type for get_node() not supported in MSVC. \n");
22320 ROSE_ASSERT(node != NULL);
22323 cout<<
"///////////// begin of SageInterface::dumpInfo() ///////////////"<<endl;
22324 cout<<
"--------------base info. for SgNode---------------"<<endl;
22330 cout<<
"--------------source location info. for SgNode---------------"<<endl;
22338 cout<<
"--------------preprocessing info. for SgNode---------------"<<endl;
22339 AttachedPreprocessingInfoType::iterator i;
22340 cout<<
"Total attached preprocessingInfo count="<<comments->size()<<endl;
22341 for (i = comments->begin (); i != comments->end (); i++)
22344 pinfo->display(
"");
22347 cout<<
"--------------name info. for SgNode---------------"<<endl;
22351 cout<<
"\tqualified name="<<decl->get_qualified_name().getString()<<endl;
22354 cout<<
"\treferenced variable name= "<<varRef->get_symbol()->
get_name().getString()<<endl;
22361 cout<<
"///////////// end of SageInterface::dumpInfo() ///////////////"<<endl;
22372 bool retVal =
true;
22374 ROSE_ASSERT(stmt !=NULL);
22376#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22383 if (funcDecl != NULL)
22386 if (funcDecl == NULL)
22388 cerr<<
"In collectReadWriteRefs(): cannot proceed without a function body!"<<endl;
22391 stmt = funcDecl->get_definition()->
get_body();
22399 ROSE_ASSERT(funcDef != NULL);
22401 ROSE_ASSERT(funcBody!= NULL);
22404 AstInterfaceImpl faImpl(funcBody);
22405 AstInterface fa(&faImpl);
22406 ArrayAnnotation* annot = ArrayAnnotation::get_inst();
22407 if( useCachedDefUse ){
22408 ArrayInterface* array_interface = ArrayInterface::get_inst(*annot, fa, funcDef, AstNodePtrImpl(funcDef));
22409 LoopTransformInterface::set_arrayInfo(array_interface);
22411 ArrayInterface array_interface(*annot);
22414 array_interface.observe(fa);
22415 LoopTransformInterface::set_arrayInfo(&array_interface);
22417 LoopTransformInterface::set_astInterface(fa);
22419 LoopTransformInterface::set_sideEffectInfo(annot);
22422 DoublyLinkedListWrap<AstNodePtr> rRef1, wRef1;
22423 CollectDoublyLinkedList<AstNodePtr> crRef1(rRef1),cwRef1(wRef1);
22424 AstNodePtr s1 = AstNodePtrImpl(stmt);
22427 if (!AnalyzeStmtRefs(fa, s1, cwRef1, crRef1))
22432 mlog[Sawyer::Message::Common::DEBUG] <<
"Function: " << funcDef->get_declaration()->get_qualified_name() <<
" calls at least one function that has not been annotated." << endl;
22437 for (DoublyLinkedEntryWrap<AstNodePtr>* p = rRef1.First(); p != 0; )
22439 DoublyLinkedEntryWrap<AstNodePtr>* p1 = p;
22441 AstNodePtr cur = p1->GetEntry();
22442 SgNode* sgRef = AstNodePtrImpl(cur).get_ptr();
22443 ROSE_ASSERT(sgRef != NULL);
22444 readRefs.push_back(sgRef);
22449 for (DoublyLinkedEntryWrap<AstNodePtr>* p = wRef1.First(); p != 0; )
22451 DoublyLinkedEntryWrap<AstNodePtr>* p1 = p;
22453 AstNodePtr cur = p1->GetEntry();
22454 SgNode* sgRef = AstNodePtrImpl(cur).get_ptr();
22455 ROSE_ASSERT(sgRef != NULL);
22456 writeRefs.push_back(sgRef);
22469static bool skipSomeRefs(
SgNode* n)
22472 return (isSgThisExp(n)||isSgArrowExp(n)||isSgDotExp(n));
22478 ROSE_ASSERT(stmt != NULL);
22479 vector <SgNode* > readRefs, writeRefs;
22483 vector<SgNode*>::iterator iter = readRefs.begin();
22484 for (; iter!=readRefs.end();iter++)
22486 SgNode* current = *iter;
22489 ROSE_ASSERT (current != NULL);
22492 if (!name)
continue;
22495 readVars.insert(name);
22498 vector<SgNode*>::iterator iterw = writeRefs.begin();
22499 for (; iterw!=writeRefs.end();iterw++)
22501 SgNode* current = *iterw;
22502 ROSE_ASSERT (current != NULL);
22504 if (!name)
continue;
22508 writeVars.insert(name);
22516 ROSE_ASSERT(stmt != NULL);
22517 set<SgInitializedName*> readVars, writeVars;
22522 set_difference(readVars.begin(), readVars.end(),
22523 writeVars.begin(), writeVars.end(),
22524 std::inserter(readOnlyVars, readOnlyVars.begin()));
22534 readOnlyVars.insert (v_ref->get_symbol()->get_declaration());
22544 set<SgInitializedName*> temp;
22547 for (set<SgInitializedName*>::const_iterator iter = temp.begin();
22548 iter!=temp.end(); iter++)
22550 SgSymbol* symbol = (*iter)->get_symbol_from_symbol_table () ;
22551 ROSE_ASSERT(symbol != NULL );
22552 ROSE_ASSERT(isSgVariableSymbol(symbol));
22553 readOnlySymbols.insert(isSgVariableSymbol(symbol));
22561 bool result =
false;
22562 ROSE_ASSERT(ref != NULL);
22574 ROSE_ASSERT(grandparent);
22575 if (isSgFunctionCallExp(grandparent))
22581 size_t param_index = 0;
22583 SgExpressionPtrList expList = isSgExprListExp(ref->
get_parent())->get_expressions();
22584 Rose_STL_Container<SgExpression*>::const_iterator iter= expList.begin();
22585 for (; iter!=expList.end(); iter++)
22593 SgExpression* func_exp = isSgFunctionCallExp(grandparent)->get_function();
22594 ROSE_ASSERT (func_exp);
22599 SgInitializedNamePtrList nameList = funcDecl->get_args();
22604 if (param_index >= nameList.size() ||isSgTypeEllipse(nameList[param_index]->get_type()) )
22606 if (isSgReferenceType(ref))
22610 if (isSgReferenceType(nameList[param_index]->get_type()))
22615 else if (isSgDotExp (func_exp) || isSgArrowExp(func_exp))
22618 ROSE_ASSERT (binOp);
22620 ROSE_ASSERT (mfuncRef);
22622 ROSE_ASSERT (mfuncDecl);
22623 SgInitializedNamePtrList nameList = mfuncDecl->get_args();
22625 if (isSgReferenceType(nameList[param_index]->get_type()))
22640 Rose_STL_Container <SgNode*> var_refs = NodeQuery::querySubTree (
const_cast<SgStatement *
> (s), V_SgVarRefExp);
22642 Rose_STL_Container<SgNode*>::iterator iter = var_refs.begin();
22643 for (; iter!=var_refs.end(); iter++)
22646 ROSE_ASSERT(ref != NULL);
22653 varSetB.insert(ref);
22659 ROSE_ASSERT(grandparent);
22660 if (isSgFunctionCallExp(grandparent))
22663 int param_index =0;
22664 SgExpressionPtrList expList = isSgExprListExp(ref->
get_parent())->get_expressions();
22665 Rose_STL_Container<SgExpression*>::const_iterator iter= expList.begin();
22666 for (; iter!=expList.end(); iter++)
22674 SgFunctionRefExp * funcRef = isSgFunctionRefExp(isSgFunctionCallExp(grandparent)->get_function());
22676 SgInitializedNamePtrList nameList = funcDecl->get_args();
22678 if (isSgReferenceType(nameList[param_index]->get_type()))
22680 varSetB.insert(ref);
22686 varSetB.insert(ref);
22690#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22695 static LivenessAnalysis* liv = NULL;
22699 static DFAnalysis * defuse = NULL;
22703 ROSE_ASSERT(project != NULL);
22704 defuse =
new DefUseAnalysis(project);
22707 ROSE_ASSERT(defuse != NULL);
22708 defuse->run(debug);
22711 defuse->dfaToDOT();
22714 liv =
new LivenessAnalysis(debug,(DefUseAnalysis*)defuse);
22715 ROSE_ASSERT(liv != NULL);
22717 std::vector <FilteredCFGNode < IsDFAFilter > > dfaFunctions;
22718 NodeQuerySynthesizedAttributeType vars =
22719 NodeQuery::querySubTree(project, V_SgFunctionDefinition);
22720 NodeQuerySynthesizedAttributeType::const_iterator i;
22721 bool abortme=
false;
22723 for (i= vars.begin(); i!=vars.end();++i)
22726 ROSE_ASSERT(func != NULL);
22730 string funcName = func->get_declaration()->get_qualified_name().str();
22731 cout<<
" .. running liveness analysis for function: " << funcName << endl;
22733 FilteredCFGNode <IsDFAFilter> rem_source = liv->run(func,abortme);
22735 liv->fixupStatementsINOUT(func);
22736 if (rem_source.getNode()!=NULL)
22737 dfaFunctions.push_back(rem_source);
22743 cout <<
"Writing out liveness analysis results into var.dot... " << endl;
22744 std::ofstream f2(
"var.dot");
22745 dfaToDot(f2,
string(
"var"), dfaFunctions, (DefUseAnalysis*)defuse, liv);
22749 cerr<<
"Error: Liveness analysis is ABORTING ." << endl;
22757#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22761 ROSE_ASSERT(liv != NULL);
22762 ROSE_ASSERT(loop != NULL);
22764 std::vector<SgInitializedName*> liveIns0, liveOuts0;
22774 CFGNode cfgnode(forstmt,2);
22775 FilteredCFGNode<IsDFAFilter> filternode= FilteredCFGNode<IsDFAFilter> (cfgnode);
22779 ROSE_ASSERT(filternode.getNode()==forstmt);
22782 vector<FilteredCFGEdge < IsDFAFilter > > out_edges = filternode.outEdges();
22783 ROSE_ASSERT(out_edges.size()==2);
22784 vector<FilteredCFGEdge < IsDFAFilter > >::iterator iter= out_edges.begin();
22786 for (; iter!=out_edges.end();iter++)
22788 FilteredCFGEdge < IsDFAFilter > edge= *iter;
22792 if (edge.condition()==eckTrue)
22794 SgNode* firstnode= edge.target().getNode();
22795 liveIns0 = liv->getIn(firstnode);
22797 for (std::vector<SgInitializedName*>::iterator iter = liveIns0.begin();
22798 iter!=liveIns0.end(); iter++)
22801 liveIns.insert(*iter);
22806 else if (edge.condition()==eckFalse)
22808 SgNode* firstnode= edge.target().getNode();
22809 liveOuts0 = liv->getIn(firstnode);
22811 for (std::vector<SgInitializedName*>::iterator iter = liveOuts0.begin();
22812 iter!=liveOuts0.end(); iter++)
22816 liveOuts.insert(*iter);
22821 cerr<<
"Unexpected CFG out edge type for SgForStmt!"<<endl;
22830static bool isAssignReduction (
SgVarRefExp* ref_exp1,
SgVarRefExp* ref_exp2, OmpSupport::omp_construct_enum& optype)
22832 bool isReduction =
false;
22834 ROSE_ASSERT (ref_exp1!= NULL);
22835 ROSE_ASSERT (ref_exp2!= NULL);
22836 ROSE_ASSERT (ref_exp1-> get_symbol() == ref_exp2-> get_symbol());
22842 if (stmt != stmt2)
return false;
22849 if (exp_stmt && isSgAssignOp(exp_stmt->get_expression()))
22852 assign_lhs = isSgAssignOp(exp_stmt->get_expression())->
get_lhs_operand();
22853 assign_rhs = isSgAssignOp(exp_stmt->get_expression())->
get_rhs_operand();
22854 ROSE_ASSERT(assign_lhs && assign_rhs);
22862 SgBinaryOp * binop = isSgBinaryOp(assign_rhs);
22868 if( !((op_lhs==ref_exp1)||(op_lhs==ref_exp2))
22869 && !((op_rhs==ref_exp1)||(op_rhs==ref_exp2)))
22872 bool isOnLeft =
false;
22873 if ((op_lhs==ref_exp1)||
22874 (op_lhs==ref_exp2))
22880 optype = OmpSupport::e_reduction_plus;
22881 isReduction =
true;
22884 case V_SgMultiplyOp:
22886 optype = OmpSupport::e_reduction_mul;
22887 isReduction =
true;
22890 case V_SgSubtractOp:
22892 optype = OmpSupport::e_reduction_minus;
22895 isReduction =
true;
22901 optype = OmpSupport::e_reduction_bitand ;
22902 isReduction =
true;
22907 optype = OmpSupport::e_reduction_bitxor;
22908 isReduction =
true;
22913 optype = OmpSupport::e_reduction_bitor;
22914 isReduction =
true;
22919 optype = OmpSupport::e_reduction_logand;
22920 isReduction =
true;
22925 optype = OmpSupport::e_reduction_logor;
22926 isReduction =
true;
22935 return isReduction;
22944 bool matchStmt1 =
false;
22945 bool matchStmt2 =
false;
22952 ROSE_ASSERT (ref1 != NULL);
22953 ROSE_ASSERT (ref2 != NULL);
22954 ROSE_ASSERT (ref1-> get_symbol() == ref2-> get_symbol());
22962 if (stmt1 == stmt2)
return false;
22985 bool matchBody =
false;
22986 bool matchCondition=
false;
22987 if (
SgIfStmt * if_stmt = isSgIfStmt (if_cond_stmt->get_parent()) )
22989 if (
SgStatement* body = if_stmt->get_true_body())
22994 ROSE_ASSERT(stmt2 != NULL);
22995 if ( ((block->get_statements()).size() == 1) && stmt2->
get_scope() == block )
23006 if (
SgExprStatement* cond_exp_stmt = isSgExprStatement (if_stmt->get_conditional()) )
23008 SgExpression* cond_exp = cond_exp_stmt->get_expression();
23009 if (
SgBinaryOp * binop = isSgBinaryOp (cond_exp))
23014 if (isSgLessThanOp (binop))
23016 optype = OmpSupport::e_reduction_max;
23017 matchCondition=
true;
23019 else if (isSgGreaterThanOp(binop))
23021 optype = OmpSupport::e_reduction_min;
23022 matchCondition=
true;
23028 if (isSgLessThanOp (binop))
23030 optype = OmpSupport::e_reduction_min;
23031 matchCondition=
true;
23033 else if (isSgGreaterThanOp(binop))
23035 optype = OmpSupport::e_reduction_max;
23036 matchCondition=
true;
23043 matchStmt1 = matchBody && matchCondition;
23047 return (matchStmt2 && matchStmt1);
23054static bool isSingleAppearanceReduction(
SgVarRefExp* ref1, OmpSupport::omp_construct_enum& optype )
23056 bool isReduction =
false;
23058 ROSE_ASSERT (ref1 != NULL);
23064 if (isSgExprStatement(stmt))
23066 SgExpression* exp = isSgExprStatement(stmt)->get_expression();
23068 if (isSgPlusPlusOp(exp))
23071 optype = OmpSupport::e_reduction_plus;
23072 isReduction =
true;
23074 else if (isSgMinusMinusOp(exp))
23076 optype = OmpSupport::e_reduction_minus;
23077 isReduction =
true;
23088 case V_SgPlusAssignOp:
23090 optype = OmpSupport::e_reduction_plus;
23091 isReduction =
true;
23094 case V_SgMultAssignOp:
23096 optype = OmpSupport::e_reduction_mul;
23097 isReduction =
true;
23100 case V_SgMinusAssignOp:
23102 optype = OmpSupport::e_reduction_minus;
23103 isReduction =
true;
23106 case V_SgAndAssignOp:
23108 optype = OmpSupport::e_reduction_bitand;
23109 isReduction =
true;
23112 case V_SgXorAssignOp:
23114 optype = OmpSupport::e_reduction_bitxor;
23115 isReduction =
true;
23118 case V_SgIorAssignOp:
23120 optype = OmpSupport::e_reduction_bitor;
23121 isReduction =
true;
23130 return isReduction;
23162 std::set<SgInitializedName*> candidateVars;
23164 std::map <SgInitializedName*, vector<SgVarRefExp* > > var_references;
23166 Rose_STL_Container<SgNode*> reflist = NodeQuery::querySubTree(loop, V_SgVarRefExp);
23168 ROSE_ASSERT(lbody != NULL);
23169 Rose_STL_Container<SgNode*>::iterator iter = reflist.begin();
23170 for (; iter!=reflist.end(); iter++)
23179 ROSE_ASSERT(var_scope != NULL);
23180 if ((
isScalarType(initname->get_type())) &&(initname !=loopindex)
23183 candidateVars.insert(initname);
23184 var_references[initname].push_back(ref_exp);
23189 std::set<SgInitializedName*>::iterator niter=candidateVars.begin();
23190 for (; niter!=candidateVars.end(); niter++)
23193 bool isReduction =
false;
23194 OmpSupport::omp_construct_enum optype;
23196 if (var_references[initname].size()==1)
23198 mlog[Sawyer::Message::Common::DEBUG] <<
"Debug: SageInterface::ReductionRecognition() A candidate used once:"<<initname->get_name().getString()<<endl;
23199 SgVarRefExp* ref_exp = *(var_references[initname].begin());
23200 if (isSingleAppearanceReduction (ref_exp, optype))
23201 isReduction =
true;
23204 else if (var_references[initname].size()==2)
23206 mlog[Sawyer::Message::Common::DEBUG] <<
"Debug: A candidate used twice:"<<initname->get_name().getString()<<endl;
23207 SgVarRefExp* ref_exp1 = *(var_references[initname].begin());
23208 SgVarRefExp* ref_exp2 = *(++var_references[initname].begin());
23211 if (isAssignReduction (ref_exp1, ref_exp2, optype) || isIfReduction (ref_exp1, ref_exp2, optype) )
23213 isReduction =
true;
23219 results.insert(make_pair(initname,optype));
23226 ROSE_ASSERT(r!=NULL);
23227#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
23228 ConstantFolding::constantFoldingOptimization(r,
false);
23238 virtual void visit (
SgNode * n)
23245 ROSE_ASSERT (name_attribute != NULL);
23253 exampleTraversal.
traverse(project, preorder);
23285 const SgInitializedNamePtrList& orig_decls = params.
get_args();
23287 std::transform( orig_decls.begin(), orig_decls.end(), sg::sage_inserter(copy), sg::InitNameCloner(copy, fundef) );
23301 sg::swap_child(ll, rr, &SgFunctionDeclaration::get_definition, &SgFunctionDeclaration::set_definition);
23302 sg::swap_child(ll, rr, &SgFunctionDeclaration::get_parameterList, &SgFunctionDeclaration::set_parameterList);
23312 std::pair<SgStatement*, SgInitializedName*>
23326 SgType* result_type = definingDeclaration.get_type()->get_return_type();
23331 SgFunctionDeclaration* wrapperfn = SB::buildDefiningFunctionDeclaration(newName, result_type, ¶m_list, containing_scope);
23334 ROSE_ASSERT(wrapperdef);
23337 wrapperfn->set_exceptionSpecification(definingDeclaration.get_exceptionSpecification());
23341 swapDefiningElements(definingDeclaration, *wrapperfn);
23346 SgInitializedNamePtrList& param_decls = param_list.
get_args();
23348 std::transform( param_decls.begin(), param_decls.end(), sg::sage_inserter(*args), sg::VarRefBuilder(*wrapperdef) );
23350 SgFunctionCallExp* callWrapped = SB::buildFunctionCallExp( newName, result_type, args, body );
23355 if (!isSgTypeVoid(result_type))
23358 SgVariableDeclaration* res = SB::buildVariableDeclaration(
"res", result_type, SB::buildAssignInitializer(callWrapped), body );
23365 callStatement = res;
23372 callStatement = SB::buildExprStatement(callWrapped);
23376 ROSE_ASSERT(callStatement);
23380 SgFunctionDeclaration* wrapperfn_proto = SB::buildNondefiningFunctionDeclaration(wrapperfn, containing_scope, decorator_proto);
23386 return std::make_pair(callStatement, resultName);
23394 struct VarrefBuilder
23413 template <
class AstNode>
23414 struct VarrefCreator : VarrefBuilder
23419 VarrefCreator(AstNode& orig)
23423 SgVarRefExp*
get()
const {
return VarrefBuilder::build(origin); }
23426 template <
class AstNode>
23427 VarrefCreator<AstNode>
23428 varrefCreator(AstNode& n)
23430 return VarrefCreator<AstNode>(n);
23440 return SB::buildMultiplyOp(lhs, SI::deepCopy(rhs));
23443 std::pair<std::vector<SgExpression*>,
SgType*>
23444 get_C_array_dimensions_aux(
const SgArrayType& arr_type)
23450 std::vector<SgExpression*> indices;
23451 SgType* undertype = NULL;
23455 if (arrtype->get_index() == NULL)
23457 indices.push_back(SB::buildNullExpression());
23458 undertype = arrtype->get_base_type();
23459 arrtype = isSgArrayType(undertype);
23465 ROSE_ASSERT(indexexpr);
23467 indices.push_back(SI::deepCopy(indexexpr));
23468 undertype = arrtype->get_base_type();
23469 arrtype = isSgArrayType(undertype);
23472 ROSE_ASSERT((!indices.empty()) && undertype);
23473 return std::make_pair(indices, undertype);
23477 std::vector<SgExpression*>
23478 get_C_array_dimensions_aux(
const SgArrayType& arrtype,
const VarrefBuilder& varrefBuilder)
23482 std::pair<std::vector<SgExpression*>,
SgType*> res = get_C_array_dimensions_aux(arrtype);
23483 const std::vector<SgExpression*>::iterator first = res.first.begin();
23486 if (isSgNullExpression(*first))
23494 const std::vector<SgExpression*>::iterator aa = first+1;
23495 const std::vector<SgExpression*>::iterator zz = res.first.end();
23497 SgExpression* sz_undertype = SB::buildSizeOfOp(res.second);
23498 SgExpression* denominator = std::accumulate(aa, zz, sz_undertype, create_mulop);
23499 SgSizeOfOp* sz_var = SB::buildSizeOfOp(varrefBuilder.get());
23500 SgExpression* sz = SB::buildDivideOp(sz_var, denominator);
23502 std::swap(*first, sz);
23510 std::vector<SgExpression*>
23513 return get_C_array_dimensions_aux(arrtype).first;
23516 std::vector<SgExpression*>
23519 return get_C_array_dimensions_aux(arrtype, varrefCreator(varref));
23522 std::vector<SgExpression*>
23525 return get_C_array_dimensions_aux(arrtype, varrefCreator(initname));
23532 set<unsigned int> sourceSequenceSet;
23534 void visit (
SgNode* astNode );
23542 if (fileInfo != NULL)
23544 unsigned int source_sequence_number = fileInfo->get_source_sequence_number();
23546 printf (
"In CollectSourceSequenceNumbers::visit(): source_sequence_number = %" PRIuPTR
" \n",source_sequence_number);
23548 sourceSequenceSet.insert(source_sequence_number);
23558 traversal.
traverse(astNode,preorder);
23560 return traversal.sourceSequenceSet;
23647#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
23649 if (collapsing_factor <= 1)
23662 ROSE_ASSERT (global_scope != NULL);
23671 bool *isPlus =
new bool[collapsing_factor];
23675 std::vector<SgForStatement* > loops= SageInterface::querySubTree<SgForStatement>(target_loop,V_SgForStatement);
23676 ROSE_ASSERT(loops.size()>=collapsing_factor);
23692 ROSE_ASSERT(
getScope(target_loop)->get_parent()!= NULL);
23696 while(scope == NULL)
23698 parent = isSgStatement(parent->
get_parent());
23699 scope = isSgScopeStatement(parent);
23703 if (insert_target != NULL)
23708 ROSE_ASSERT(scope != NULL);
23711 for(
size_t i = 0; i < collapsing_factor; i ++)
23713 temp_target_loop = loops[i];
23718 if (!
isCanonicalForLoop(temp_target_loop, &ivar[i], &lb[i], &ub[i], &step[i], &orig_body[i], &isPlus[i]))
23720 cerr<<
"Error in SageInterface::loopCollapsing(): target loop is not canonical."<<endl;
23728 delete[] orig_body;
23729 delete[] total_iters;
23736 ROSE_ASSERT(ivar[i]&& lb[i] && ub[i] && step[i]);
23740 if(isPlus[i] ==
true)
23754 string iter_var_name=
"_total_iters";
23775 new_var_list->append_expression(isSgVarRefExp(ub_exp));
23778 for(
unsigned int i = 0; i < collapsing_factor; i++)
23781 for(
unsigned int j = collapsing_factor - 1; j > i; j--)
23790 new_var_list->append_expression(isSgVarRefExp(interval[i]));
23800 ROSE_ASSERT(insert_target != NULL);
23805 new_var_list->append_expression(clps_index_ref);
23811 ROSE_ASSERT(body != NULL);
23814 std::vector<SgStatement*> new_stmt_list;
23825 for(
unsigned int i = 0; i < collapsing_factor - 1; i ++)
23827 if(isPlus[i] ==
true)
23833 new_stmt_list.push_back(assign_stmt);
23836 if(i != collapsing_factor - 2){
23837 string remain_var_name=
"_remainder";
23838 remain_var_name =
"__"+ ivar[i]->get_name().getString() + remain_var_name;
23841 new_stmt_list.push_back(loop_index_decl);
23847 if(isPlus[collapsing_factor - 1] ==
true)
23851 new_stmt_list.push_back(assign_stmt);
23863 ROSE_ASSERT(cond_stmt != NULL);
23870 target_loop = new_loop;
23872 ConstantFolding::constantFoldingOptimization(scope->
get_parent(),
false);
23878 delete [] orig_body;
23879 delete [] total_iters;
23880 delete [] interval;
23885 return new_var_list;
23904 RoseAst ast_of_original(tree2);
23913 while (i_copy != ast_of_copy.
end())
23916 printf (
"*i_copy = %p = %s \n",*i_copy,(*i_copy)->class_name().c_str());
23917 printf (
"*i_original = %p = %s \n",*i_original,(*i_original)->class_name().c_str());
23921 if ((*i_copy)->variantT() != (*i_original)->variantT())
23924 printf (
"ERROR: return from SageInterface::isStructurallyEquivalentAST(): (*i_copy)->variantT() != (*i_original)->variantT() \n");
23927 printf (
"Making this an error! \n");
23937 ROSE_ASSERT(i_original != ast_of_original.
end());
23942 ROSE_ASSERT(i_copy == ast_of_copy.
end() && i_original == ast_of_original.
end());
23962 lower_bound = NULL;
23963 upper_bound = NULL;
23967 const std::vector<SgStatement *> & init_stmts = for_init_stmt->
get_init_stmt();
23968 assert(init_stmts.size() == 1);
23970 assert(init_stmt != NULL);
23973 SgAssignOp * assign_init = isSgAssignOp(init);
23974 assert(assign_init != NULL);
23976 assert(iterator_init_ref != NULL);
23977 iterator = iterator_init_ref->get_symbol();
23978 assert(iterator != NULL);
23981 SgExprStatement * test_stmt = isSgExprStatement(for_loop->get_test());
23982 assert(test_stmt != NULL);
23988 while (isSgCastExp(lhs_exp)) lhs_exp = ((
SgCastExp *)lhs_exp)->get_operand_i();
23989 SgVarRefExp * lhs_var_ref = isSgVarRefExp(lhs_exp);
23990 bool lhs_it = (lhs_var_ref != NULL) && (lhs_var_ref->get_symbol() == iterator);
23993 while (isSgCastExp(rhs_exp)) rhs_exp = ((
SgCastExp *)rhs_exp)->get_operand_i();
23994 SgVarRefExp * rhs_var_ref = isSgVarRefExp(rhs_exp);
23996 bool rhs_it = (rhs_var_ref != NULL) && (rhs_var_ref->get_symbol() == iterator);
24004 assert(lhs_it != rhs_it);
24013 case V_SgGreaterOrEqualOp:
24014 inclusive = lhs_it;
24017 case V_SgGreaterThanOp:
24018 inclusive = !lhs_it;
24021 case V_SgLessOrEqualOp:
24022 inclusive = lhs_it;
24023 reversed = !lhs_it;
24025 case V_SgLessThanOp:
24026 inclusive = !lhs_it;
24027 reversed = !lhs_it;
24029 case V_SgEqualityOp:
24030 case V_SgNotEqualOp:
24036 switch (increment->variantT()) {
24037 case V_SgPlusPlusOp:
24041 case V_SgMinusMinusOp:
24045 case V_SgPlusAssignOp:
24050 assert(var_ref_lhs != NULL && var_ref_lhs->get_symbol() == iterator);
24055 case V_SgMinusAssignOp:
24060 assert(var_ref_lhs != NULL && var_ref_lhs->get_symbol() == iterator);
24070 assert(inc_assign_lhs != NULL && inc_assign_lhs->get_symbol() == iterator);
24073 assert(inc_assign_rhs != NULL);
24075 if (inc_assign_rhs_lhs != NULL && inc_assign_rhs_lhs->get_symbol() == iterator)
24078 if (inc_assign_rhs_rhs != NULL && inc_assign_rhs_rhs->get_symbol() == iterator)
24099#ifdef ROSE_BUILD_JAVA_LANGUAGE_SUPPORT
24106 jstring temp_directory = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(::currentJavaTraversalClass, Rose::Frontend::Java::Ecj::getTempDirectoryMethod);
24108 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_directory, NULL);
24110 string directory_name = utf8;
24111 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_directory, utf8);
24113 list<string> sourcepath = project -> get_Java_sourcepath();
24114 sourcepath.push_back(directory_name);
24115 project -> set_Java_sourcepath(sourcepath);
24117 return directory_name;
24125 string command = string(
"rm -fr ") + directory_name;
24126 int status = system(command.c_str());
24127 ROSE_ASSERT(status == 0);
24138 project -> get_sourceFileNameList().push_back(filename);
24139 Rose_STL_Container<std::string> arg_list = project -> get_originalCommandLineArgumentList();
24140 arg_list.push_back(filename);
24143 int error_code = 0;
24144 SgFile *file = determineFileType(arg_list, error_code, project);
24146 ROSE_ASSERT(sourcefile);
24147 sourcefile -> set_parent(project);
24152 project -> get_fileList_ptr() -> get_listOfFiles().push_back(sourcefile);
24153 ROSE_ASSERT(sourcefile == isSgSourceFile((*project)[filename]));
24155 sourcefile -> build_Java_AST(arg_list, project -> get_originalCommandLineArgumentList());
24158 project -> get_fileList_ptr() -> get_listOfFiles().pop_back();
24159 ROSE_ASSERT(sourcefile != isSgSourceFile((*project)[filename]));
24163 ROSE_ASSERT(file->get_preprocessorDirectivesAndCommentsList() != NULL);
24174 string command =
"package " + package_name +
";";
24179 jstring temp_file = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
24180 Rose::Frontend::Java::Ecj::createTempFileMethod,
24181 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(command.c_str()));
24183 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_file, NULL);
24185 string filename = (string) utf8;
24186 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_file, utf8);
24190 return package_name;
24199 string command =
"import " + import_string +
";";
24204 jstring temp_file = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
24205 Rose::Frontend::Java::Ecj::createTempFileMethod,
24206 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(command.c_str()));
24208 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_file, NULL);
24210 string filename = (string) utf8;
24211 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_file, utf8);
24215 return import_string;
24227 jstring temp_file = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
24228 Rose::Frontend::Java::Ecj::createTempNamedFileMethod,
24229 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(file_name.c_str()),
24230 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(file_content.c_str()));
24232 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_file, NULL);
24234 string filename = (string) utf8;
24235 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_file, utf8);
24245 ROSE_ASSERT(scope);
24247 for (
int index = 0, length = package_name.size(); index < length; index++) {
24249 for (n = index; n < length; n++) {
24250 if (package_name[n] ==
'.') {
24254 string name = package_name.substr(index, n - index);
24256 SgClassSymbol *package_symbol = scope -> lookup_class_symbol(name);
24257 if (package_symbol == NULL) {
24261 SgJavaPackageDeclaration *package_declaration = isSgJavaPackageDeclaration(package_symbol -> get_declaration() -> get_definingDeclaration());
24262 ROSE_ASSERT(package_declaration);
24263 package_definition = package_declaration -> get_definition();
24264 ROSE_ASSERT(package_definition);
24265 scope = package_definition;
24270 return package_definition;
24278 SgGlobal *global_scope = project -> get_globalScopeAcrossFiles();
24280 if (package_definition == NULL) {
24286 if (create_directory) {
24287 Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
24288 Rose::Frontend::Java::Ecj::createTempNamedDirectoryMethod,
24289 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(package_name.c_str()));
24295 return package_definition;
24302 ROSE_ASSERT(package_definition);
24303 SgClassSymbol *class_symbol = package_definition -> lookup_class_symbol(class_name);
24306 : isSgClassDeclaration(class_symbol -> get_declaration() -> get_definingDeclaration()));
24307 if ((! class_declaration) || (! class_declaration -> attributeExists(
"complete"))) {
24308 string qualified_name = package_definition -> get_qualified_name().getString() +
"." + class_name;
24310 class_symbol = package_definition -> lookup_class_symbol(class_name);
24313 class_declaration = (class_symbol == NULL
24315 : isSgClassDeclaration(class_symbol -> get_declaration() -> get_definingDeclaration()));
24317 return class_declaration;
24333 SgClassDeclaration *class_declaration = isSgClassDeclaration(class_type -> get_declaration() -> get_definingDeclaration());
24334 ROSE_ASSERT(class_declaration);
24335 SgClassDefinition *scope = isSgClassDefinition(class_declaration -> get_scope());
24336 while (scope && (! isSgJavaPackageDeclaration(scope -> get_parent()))) {
24337 class_declaration = isSgClassDeclaration(scope -> get_parent());
24338 ROSE_ASSERT(class_declaration);
24339 scope = isSgClassDefinition(class_declaration -> get_scope());
24346 string class_name = class_declaration ->
get_name().getString();
24355 ROSE_ASSERT(class_definition);
24357 ROSE_ASSERT(type_list);
24359 ROSE_ASSERT(string_array_type);
24360 type_list -> append_argument(string_array_type);
24366 SgFunctionSymbol *method_symbol = class_definition -> lookup_function_symbol(
"main", member_function_type);
24368 return (method_symbol == NULL ? NULL : isSgMemberFunctionDeclaration(method_symbol -> get_declaration()));
24376 SgClassDeclaration *class_declaration = isSgClassDeclaration(class_type -> get_declaration() -> get_definingDeclaration());
24377 ROSE_ASSERT(class_declaration);
24390 ROSE_ASSERT (old_sym != NULL);
24391 ROSE_ASSERT (new_sym != NULL);
24392 ROSE_ASSERT (old_sym != new_sym);
24393 ROSE_ASSERT (scope != NULL);
24395 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(scope, V_SgVarRefExp);
24396 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
24399 if (vRef->get_symbol() == old_sym)
24400 vRef->set_symbol(new_sym);
24413 bool result =
true;
24415 bool includingSelf =
false;
24418 if (sourceFile == NULL)
24420 printf (
"In SageInterface::statementCanBeTransformed(): sourceFile not found \n");
24424 ROSE_ASSERT(sourceFile != NULL);
24426 if (sourceFile != NULL && sourceFile->get_unparse_tokens() ==
true && sourceFile->get_unparseHeaderFiles() ==
true)
24430 string source_filename = stmt->getFilenameString();
24432 printf (
"In SageInterface::statementCanBeTransformed(): source_filename = %s \n",source_filename.c_str());
24433 printf (
" --- Rose::includeFileMapForUnparsing.size() = %zu \n",Rose::includeFileMapForUnparsing.size());
24437 if (EDG_ROSE_Translation::edg_include_file_map.find(source_filename) != EDG_ROSE_Translation::edg_include_file_map.end())
24439 SgIncludeFile* include_file = EDG_ROSE_Translation::edg_include_file_map[source_filename];
24440 ROSE_ASSERT(include_file != NULL);
24442 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");
24444 if (include_file->get_can_be_supported_using_token_based_unparsing() ==
false)
24447 printf (
"NOTE: Transformations of this statement cannot be supported using the header file unparsing with token unparsing options! \n");
24457 printf (
"Not found in Rose::includeFileMapForUnparsing: source_filename = %s \n",source_filename.c_str());
24460 printf (
"Exiting as a test! \n");
24466 printf (
"Error: In statementCanBeTransformed(): this might be an issue! \n");
24479 ROSE_ASSERT (decl!= NULL);
24480 ROSE_ASSERT (target_scope != NULL);
24481 ROSE_ASSERT (target_scope != decl->
get_scope());
24488 if (isSgIfStmt (target_scope))
24491 if (target_scope == )
24501 case V_SgBasicBlock:
24513 case V_SgForStatement:
24517 ROSE_ASSERT(stmt != NULL);
24518 SgStatementPtrList& stmt_list = stmt->get_init_stmt();
24522 if (stmt_list.size() !=1)
24524 cerr<<
"Error in moveVariableDeclaration(): only single init statement is handled for SgForStatement now."<<endl;
24525 ROSE_ASSERT (stmt_list.size() ==1);
24528 ROSE_ASSERT (exp_stmt != NULL);
24529 SgAssignOp* assign_op = isSgAssignOp(exp_stmt->get_expression());
24530 ROSE_ASSERT (assign_op != NULL);
24540 if (init_name->get_initptr() != NULL)
24542 init_name->set_initptr(initor);
24545 stmt_list.insert (stmt_list.begin(), decl );
24551 cerr<<
"Error. Unhandled target scope type:"<<target_scope->
class_name()<<endl;
24552 ROSE_ASSERT (
false);
24558 ROSE_ASSERT(sym != NULL);
24560 if (orig_scope != target_scope)
24565 init_name->set_scope(target_scope);
24567 orig_scope->remove_symbol(sym);
24572 ROSE_ASSERT (target_scope->symbol_exists(sym));
24582 subtreeVal.hasValue_ =
true;
24584 if (isSgIntVal(valExp)) {
24585 subtreeVal.value_ = isSgIntVal(valExp)->get_value();
24586 }
else if (isSgLongIntVal(valExp)) {
24587 subtreeVal.value_ = isSgLongIntVal(valExp)->get_value();
24588 }
else if (isSgLongLongIntVal(valExp)) {
24589 subtreeVal.value_ = isSgLongLongIntVal(valExp)->get_value();
24590 }
else if (isSgShortVal(valExp)) {
24591 subtreeVal.value_ = isSgShortVal(valExp)->get_value();
24592 }
else if (isSgUnsignedIntVal(valExp)) {
24593 subtreeVal.value_ = isSgUnsignedIntVal(valExp)->get_value();
24594 }
else if (isSgUnsignedLongVal(valExp)) {
24595 subtreeVal.value_ = isSgUnsignedLongVal(valExp)->get_value();
24596 }
else if (isSgUnsignedLongLongIntVal(valExp)) {
24597 subtreeVal.value_ = isSgUnsignedLongLongIntVal(valExp)->get_value();
24598 }
else if (isSgUnsignedShortVal(valExp)) {
24599 subtreeVal.value_ = isSgUnsignedShortVal(valExp)->get_value();
24605 if (isSgModifierType(vRef->get_type()) == NULL) {
24608 val.hasValue_ =
false;
24611 if (isSgModifierType(vRef->get_type())->
get_typeModifier().get_constVolatileModifier().isConst()) {
24617 if (isSgAssignInitializer(ini)) {
24622 return variableEval.
traverse(rhs);
24626 val.hasValue_ =
false;
24632 if (isSgExpression(node) != NULL) {
24634 if (valueExp != NULL) {
24635 return this->getValueExpressionValue(valueExp);
24639 if (varRefExp != NULL) {
24641 return evaluateVariableReference(varRefExp);
24644 if (isSgAssignInitializer(node)) {
24645 if(synList.at(0).hasValue_){
24646 return synList.at(0);
24650 val.hasValue_ =
false;
24655 evaluatedValue.hasValue_ =
false;
24656 evaluatedValue.value_ = -1;
24658 if(synList.size() != 2){
24659 for(SynthesizedAttributesList::iterator it = synList.begin(); it != synList.end(); ++it){
24660 std::cout <<
"Node: " << node->unparseToString() <<
"\n" << (*it).value_ << std::endl;
24661 std::cout <<
"Parent: " << node->get_parent()->unparseToString() << std::endl;
24662 std::cout <<
"Parent, Parent: " << node->get_parent()->get_parent()->unparseToString() << std::endl;
24666 for (SynthesizedAttributesList::iterator it = synList.begin(); it != synList.end(); ++it) {
24667 if((*it).hasValue_){
24668 if (isSgAddOp(node)) {
24669 assert(synList.size() == 2);
24670 evaluatedValue.value_ = synList[0].value_ + synList[1].value_ ;
24671 evaluatedValue.hasValue_ =
true;
24672 }
else if (isSgSubtractOp(node)) {
24673 assert(synList.size() == 2);
24674 evaluatedValue.value_ = synList[0].value_ - synList[1].value_ ;
24675 evaluatedValue.hasValue_ =
true;
24676 }
else if (isSgMultiplyOp(node)) {
24677 assert(synList.size() == 2);
24678 evaluatedValue.value_ = synList[0].value_ * synList[1].value_ ;
24679 evaluatedValue.hasValue_ =
true;
24680 }
else if (isSgDivideOp(node)) {
24681 assert(synList.size() == 2);
24682 evaluatedValue.value_ = synList[0].value_ / synList[1].value_ ;
24683 evaluatedValue.hasValue_ =
true;
24684 }
else if (isSgModOp(node)) {
24685 assert(synList.size() == 2);
24686 evaluatedValue.value_ = synList[0].value_ % synList[1].value_ ;
24687 evaluatedValue.hasValue_ =
true;
24690 std::cerr <<
"Expression is not evaluatable" << std::endl;
24691 evaluatedValue.hasValue_ =
false;
24692 evaluatedValue.value_ = -1;
24693 return evaluatedValue;
24696 evaluatedValue.hasValue_ =
true;
24697 return evaluatedValue;
24700 evaluatedValue.hasValue_ =
false;
24701 evaluatedValue.value_ = -1;
24702 return evaluatedValue;
24715 class TypeEquivalenceChecker {
24717 TypeEquivalenceChecker(
bool profile,
bool useSemanticEquivalence)
24718 : profile_(profile), useSemanticEquivalence_(useSemanticEquivalence),
24719 namedType_(0), pointerType_(0), arrayType_(0), functionType_(0)
24725 if (isSgTypedefType(t)) {
24727 node = isSgTypedefType(t)->
stripType(SgType::STRIP_TYPEDEF_TYPE);
24729 if(useSemanticEquivalence_){
24730 if(isSgModifierType(t)){
24732 ROSE_ASSERT(modType != NULL);
24739 std::cout <<
"Hit volatile type, stripping of modifier type" << std::endl;
24740 node = modType->get_base_type();
24744 std::cout <<
"Hit restrict type, stripping of modifier type" << std::endl;
24745 node = modType->get_base_type();
24749 ROSE_ASSERT(node != NULL);
24754 bool equal =
false;
24755 if(t1 == NULL || t2 == NULL){
24756 std::string wasNull;
24762 std::cerr <<
"ERROR: " << wasNull <<
" was NULL" << std::endl;
24775 i != subT1.
end() && j != subT2.
end(); ++i, ++j) {
24780 nodeT1 = getBasetypeIfApplicable(nodeT1);
24781 nodeT2 = getBasetypeIfApplicable(nodeT2);
24785 if(isSgModifierType(nodeT1)){
24789 if(modT1.get_constVolatileModifier().isConst() != modT2.get_constVolatileModifier().isConst()){
24792 if(modT1.get_constVolatileModifier().isVolatile() != modT2.get_constVolatileModifier().isVolatile()){
24795 }
else if (isSgNamedType(nodeT1)) {
24799 i.skipChildrenOnForward();
24800 j.skipChildrenOnForward();
24806 if(!c1->get_autonomous_declaration()){
24809 if (!c2->get_autonomous_declaration()){
24818 }
else if (isSgPointerType(nodeT1)) {
24825 return typesAreEqual(t1->get_base_type(), t2->get_base_type());
24827 }
else if(isSgReferenceType(nodeT1)){
24831 return typesAreEqual(t1->get_base_type(), t2->get_base_type());
24832 }
else if (isSgArrayType(nodeT1)) {
24839 bool arrayBaseIsEqual = typesAreEqual(a1->get_base_type(), a2->get_base_type());
24843 bool arrayIndexExpressionIsEquivalent =
false;
24844 if(t1Index.hasValue_ && t2Index.hasValue_){
24845 if(t1Index.value_ == t2Index.value_){
24846 arrayIndexExpressionIsEquivalent =
true;
24849 bool arraysAreEqual = (arrayBaseIsEqual && arrayIndexExpressionIsEquivalent);
24850 return arraysAreEqual;
24851 }
else if (isSgFunctionType(nodeT1)) {
24859 if(typesAreEqual(funcTypeA->get_return_type(), funcTypeB->get_return_type())) {
24869 for(SgTypePtrList::const_iterator ii = funcTypeA->
get_arguments().begin(),
24876 if(!typesAreEqual((*ii), (*jj))) {
24896 std::cerr <<
"This feature for now is available with autotools only!" << std::endl;
24901int getNamedTypeCount() {
24905int getPointerTypeCount() {
24906 return pointerType_;
24909int getArrayTypeCount() {
24913int getFunctionTypeCount() {
24914 return functionType_;
24918 bool profile_, useSemanticEquivalence_;
24919 int namedType_, pointerType_, arrayType_, functionType_;
24922TypeEquivalenceChecker tec(
false,
false);
24923return tec.typesAreEqual(typeA, typeB);
24927std::set<SgStatement*>
24936 StatementTraversal() : count (0) {}
24937 void visit (
SgNode* node)
24942 returnset.insert(statement);
24948 std::set<SgStatement*> returnset;
24952 StatementTraversal traversal;
24953 traversal.traverse(node, preorder);
24955 return traversal.returnset;
24958std::set<SgStatement*>
24965 printf (
"In collectModifiedStatements(): node = %p = %s \n",node,node->
class_name().c_str());
24971 StatementTraversal() : count (0) {}
24972 void visit (
SgNode* node)
24977 returnset.insert(statement);
24983 std::set<SgStatement*> returnset;
24987 StatementTraversal traversal;
24988 traversal.traverse(node, preorder);
24990 return traversal.returnset;
25000 printf (
"In outputFileIds(): node = %p = %s \n",node,node->
class_name().c_str());
25006 LocatedNodeTraversal() {}
25007 void visit (
SgNode* node)
25010 if (locatedNode != NULL)
25013 printf (
"In outputFileIds(): isModified() == %s: locatedNode = %p = %s \n",locatedNode->
get_isModified() ?
"true" :
"false",locatedNode,locatedNode->
class_name().c_str());
25014 printf (
" --- file id = %d physical_file_id = %d \n",node->
get_file_info()->get_file_id(),node->
get_file_info()->get_physical_file_id());
25020 if (initializedName != NULL)
25022 printf (
"In outputFileIds(): isModified() == %s: initializedName = %p = %s \n",initializedName->
get_isModified() ?
"true" :
"false",initializedName,initializedName->
class_name().c_str());
25023 printf (
" --- file id = %d physical_file_id = %d \n",initializedName->
get_file_info()->get_file_id(),initializedName->
get_file_info()->get_physical_file_id());
25030 LocatedNodeTraversal traversal;
25031 traversal.traverse(node, preorder);
25034 printf (
"Exiting as a test! \n");
25040std::set<SgLocatedNode*>
25047 printf (
"In collectModifiedLocatedNodes(): node = %p = %s \n",node,node->
class_name().c_str());
25053 LocatedNodeTraversal() : count (0) {}
25054 void visit (
SgNode* node)
25057 if (locatedNode != NULL && locatedNode->
get_isModified() ==
true)
25060 printf (
"In collectModifiedLocatedNodes(): isModified() == true: locatedNode = %p = %s \n",locatedNode,locatedNode->
class_name().c_str());
25062 returnset.insert(locatedNode);
25068 std::set<SgLocatedNode*> returnset;
25072 LocatedNodeTraversal traversal;
25073 traversal.traverse(node, preorder);
25075 return traversal.returnset;
25086 printf (
"In resetModifiedLocatedNodes(): modifiedNodeSet.size() = %zu \n",modifiedNodeSet.size());
25089 std::set<SgLocatedNode*>::const_iterator i = modifiedNodeSet.begin();
25090 while (i != modifiedNodeSet.end())
25094 printf (
"Marking node = %p = %s as modified \n",node,node->
class_name().c_str());
25109 printf (
"\n\n##################################################### \n");
25110 printf (
"Report on modified statements: label = %s \n",label.c_str());
25113 if (sourceFile != NULL)
25115 printf (
" --- (SgSourceFile) filename = %s \n",sourceFile->
getFileName().c_str());
25119 SgGlobal* globalScope = isSgGlobal(node);
25120 if (globalScope != NULL)
25122 sourceFile = isSgSourceFile(globalScope->
get_parent());
25123 printf (
" --- (SgGlobal) filename = %s \n",sourceFile->
getFileName().c_str());
25127 ROSE_ASSERT(node != NULL);
25131 printf (
"In reportModifiedStatements(): collection.size() = %zu \n",collection.size());
25134 std::set<SgStatement*>::iterator i = collection.begin();
25135 while (i != collection.end())
25138 string filename = (*i)->get_file_info()->get_filename();
25141 if (filename ==
"transformation")
25144 printf (
" --- filename == transformation: sourceFile = %p using physical filename \n",sourceFile);
25147 SgSourceFile* sourceFile = TransformationSupport::getSourceFile(*i);
25148 if (sourceFile != NULL)
25154 printf (
" --- filename = %s modified statement = %p = %s \n",filename.c_str(),(*i),(*i)->class_name().c_str());
25162 printf (
"########################################################## \n");
25163 printf (
"reportModifiedStatements(): Called using label = %s \n",label.c_str());
25165 printf (
"########################################################## \n\n\n");
25168 printf (
"Exiting as a test! \n");
25169 ROSE_ASSERT(
false);
25181 printf (
"\n\n##################################################### \n");
25182 printf (
"Report on modified locatedNodes: label = %s \n",label.c_str());
25185 if (sourceFile != NULL)
25187 printf (
" --- (SgSourceFile) filename = %s \n",sourceFile->
getFileName().c_str());
25191 SgGlobal* globalScope = isSgGlobal(node);
25192 if (globalScope != NULL)
25194 sourceFile = isSgSourceFile(globalScope->
get_parent());
25195 printf (
" --- (SgGlobal) filename = %s \n",sourceFile->
getFileName().c_str());
25199 ROSE_ASSERT(node != NULL);
25203 printf (
"In reportModifiedLocatedNode(): collection.size() = %zu \n",collection.size());
25206 std::set<SgLocatedNode*>::iterator i = collection.begin();
25207 while (i != collection.end())
25210 string filename = (*i)->get_file_info()->get_filename();
25213 if (filename ==
"transformation")
25216 printf (
" --- filename == transformation: sourceFile = %p using physical filename \n",sourceFile);
25219 SgSourceFile* sourceFile = TransformationSupport::getSourceFile(*i);
25220 if (sourceFile != NULL)
25226 printf (
" --- filename = %s modified locatedNode = %p = %s \n",filename.c_str(),(*i),(*i)->class_name().c_str());
25234 printf (
"########################################################## \n");
25235 printf (
"reportModifiedLocatedNodes(): Called using label = %s \n",label.c_str());
25237 printf (
"########################################################## \n\n\n");
25240 printf (
"Exiting as a test! \n");
25241 ROSE_ASSERT(
false);
25255 ROSE_ASSERT(locatedNode != NULL);
25259 curprint (
"/* Inside of printOutComments() */");
25262 if (comments != NULL)
25265 printf (
"Found attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
class_name().c_str());
25266 curprint (
"/* Inside of printOutComments(): comments != NULL */");
25269 AttachedPreprocessingInfoType::iterator i;
25270 for (i = comments->begin(); i != comments->end(); i++)
25272 ROSE_ASSERT ( (*i) != NULL );
25273 printf (
" Attached Comment (relativePosition=%s): %s \n",
25276 PreprocessingInfo::relativePositionName((*i)->getRelativePosition()).c_str(),
25277 (*i)->getString().c_str());
25278 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
25282 (*i)->get_file_info()->display(
"comment/directive location");
25289 printf (
"In SageInterface::printOutComments(): No attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
class_name().c_str());
25299 bool returnValue =
false;
25301 ROSE_ASSERT(currentPreprocessingInfo != NULL);
25303 PreprocessingInfo::DirectiveType directive = currentPreprocessingInfo->getTypeOfDirective();
25305 if (directive == PreprocessingInfo::C_StyleComment ||
25306 directive == PreprocessingInfo::CplusplusStyleComment ||
25307 directive == PreprocessingInfo::FortranStyleComment ||
25308 directive == PreprocessingInfo::CpreprocessorBlankLine ||
25309 directive == PreprocessingInfo::ClinkageSpecificationStart ||
25310 directive == PreprocessingInfo::ClinkageSpecificationEnd)
25312 returnValue =
true;
25315 return returnValue;
25318std::vector<SgC_PreprocessorDirectiveStatement*>
25321 std::vector<SgC_PreprocessorDirectiveStatement*> directiveList;
25326 if (comments !=
nullptr)
25328 AttachedPreprocessingInfoType::iterator i;
25329 for (i = comments->begin (); i != comments->end(); i++)
25338 ROSE_ASSERT(directive != NULL);
25339 directiveList.push_back(directive);
25342 printf (
"directiveList.size() = %zu \n",directiveList.size());
25346 return directiveList;
25355 printf (
"In translateScopeToUseCppDeclarations(): declarationsOnly = %s scope = %p = %s \n",declarationsOnly ?
"true" :
"false",scope,scope->
class_name().c_str());
25357 std::map<SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> > directiveMap;
25359 if (declarationsOnly ==
true)
25363 SgDeclarationStatementPtrList::iterator i = declarationList.begin();
25364 while (i != declarationList.end())
25367 ROSE_ASSERT(declaration != NULL);
25371 printf (
"attachDirectives.size() = %zu \n",attachDirectives.size());
25373 if (attachDirectives.empty() ==
false)
25375 directiveMap.insert(std::pair<
SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> >(declaration,attachDirectives));
25387 SgStatementPtrList::iterator i = statementList.begin();
25388 while (i != statementList.end())
25391 ROSE_ASSERT(statement != NULL);
25395 printf (
"attachDirectives.size() = %zu \n",attachDirectives.size());
25397 if (attachDirectives.empty() ==
false)
25399 directiveMap.insert(std::pair<
SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> >(statement,attachDirectives));
25406 printf (
"directiveMap.size() = %zu \n",directiveMap.size());
25408 printf (
"Processing the directiveMap: \n");
25409 std::map<SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> >::iterator i = directiveMap.begin();
25410 while (i != directiveMap.end())
25413 std::vector<SgC_PreprocessorDirectiveStatement*> directives = i->second;
25415 printf (
"statement = %p = %s \n",statement,statement->
class_name().c_str());
25416 printf (
"directives.size() = %zu \n",directives.size());
25418 std::vector<SgC_PreprocessorDirectiveStatement*>::iterator j = directives.begin();
25419 while (j != directives.end())
25428 ROSE_ASSERT(comments != NULL);
25430 AttachedPreprocessingInfoType deleteList;
25435 AttachedPreprocessingInfoType::iterator k;
25436 for (k = comments->begin(); k != comments->end(); k++)
25439 ROSE_ASSERT ( (*k) != NULL );
25440 printf (
" Attached Comment (relativePosition=%s): %s\n",
25441 ((*k)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
25442 (*k)->getString().c_str());
25443 printf (
"translateScopeToUseCppDeclarations(): Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*k)->getNumberOfLines(),(*k)->getColumnNumberOfEndOfString());
25450 printf (
"Do NOT delete *k = %p = %s \n",*k,(*k)->getString().c_str());
25454 printf (
"DO delete *k = %p = %s \n",*k,(*k)->getString().c_str());
25456 deleteList.push_back(*k);
25462 printf (
"Iterate over the deleteList: deleteList.size() = %zu comments->size() = %zu \n",deleteList.size(),comments->size());
25463 AttachedPreprocessingInfoType::iterator m = deleteList.begin();
25464 while (m != deleteList.end())
25468 comments->erase(std::remove(comments->begin(), comments->end(), *m), comments->end());
25470 printf (
" --- comments->size() = %zu \n",comments->size());
25482 printf (
"Leaving translateScopeToUseCppDeclarations(): scope = %p = %s \n",scope,scope->
class_name().c_str());
25492 CppTranslationTraversal() {}
25493 void visit (
SgNode* node)
25495 printf (
"In CppTranslationTraversal::visit(): node = %p = %s \n",node,node->
class_name().c_str());
25498 SgGlobal* globalScope = isSgGlobal(scope);
25499 if (globalScope != NULL)
25501 printf (
"In CppTranslationTraversal::visit(): processing scope = %p = %s \n",scope,scope->
class_name().c_str());
25508 printf (
"In SageInterface::translateToUseCppDeclarations(): Currently skipping all but global scope! \n");
25515 CppTranslationTraversal traversal;
25517 printf (
"In translateToUseCppDeclarations(): Calling traversal.traverse() \n");
25521 traversal.traverse(n, postorder);
25523 printf (
"Leaving translateToUseCppDeclarations(): DONE: Calling traversal.traverse() \n");
25530 cout<<
"--------------"<<endl;
25534 cout<<
"file info:\t ";
25535 lnode->get_file_info()->display();
25536 cout<<
"\n unparseToString:\t ";
25537 lnode->unparseToString();
25548static void serialize(SgTemplateArgumentPtrList& plist,
string& prefix,
bool hasRemaining, ostringstream& out,
string& edgeLabel)
25551 out<< (hasRemaining?
"|---":
"|___");
25554 out<<
" "<<edgeLabel<<
" ->";
25556 out<<
"@"<<&plist<<
" "<<
"SgTemplateArgumentPtrList ";
25560 int last_non_null_child_idx =-1;
25561 for (
int i = (
int) (plist.size())-1; i>=0; i--)
25565 last_non_null_child_idx = i;
25570 for (
size_t i=0; i< plist.size(); i++ )
25572 bool n_hasRemaining=
false;
25574 if (i+1 < plist.size())
25575 n_hasRemaining=
true;
25577 if ((
int)i< last_non_null_child_idx) n_hasRemaining =
true;
25579 string suffix= hasRemaining?
"| " :
" ";
25580 string n_prefix = prefix+suffix;
25581 string n_edge_label=
"";
25583 serialize (plist[i], n_prefix, n_hasRemaining, out,n_edge_label);
25596 out<< (hasRemaining?
"|---":
"|___");
25598 out<<
" "<<edgeLabel<<
" ->";
25601 out<<
" NULL "<<endl;
25606 out<<
"@"<<node<<
" "<< node->
class_name()<<
" ";
25612 out<< lnode->get_file_info()->get_filename() <<
" "<<lnode->get_file_info()->get_line()<<
":"<<lnode->get_file_info()->get_col();
25614 AttachedPreprocessingInfoType *comments =
25615 lnode->getAttachedPreprocessingInfo ();
25617 if (comments != NULL)
25620 out<<
" AttachedPreprocessingInfoType@"<<comments;
25622 AttachedPreprocessingInfoType::iterator i;
25624 for (i = comments->begin (); i != comments->end (); i++)
25626 if (i!=comments->begin ())
25629 out<<counter++<<
" ";
25638 out<<*i<<
" classification="<<PreprocessingInfo::directiveTypeName((*i)->getTypeOfDirective ()). c_str ();
25639 out<<
" string="<<(*i)->getString ().c_str ();
25640 out<<
" relative pos=" ;
25642 if ((*i)->getRelativePosition () == PreprocessingInfo::inside)
25644 else if ((*i)->getRelativePosition () == PreprocessingInfo::before)
25658 out<<
" first nondefining decl@"<< v->get_firstNondefiningDeclaration();
25659 out<<
" defining decl@"<< v->get_definingDeclaration();
25663 out<<
" value="<< f->get_value() <<
" declaration="<<f->get_declaration() <<
" name="<< f->get_name().getString();
25670 out<<
" renamed_function "<< f->get_renamed_function();
25673 out<<
" name="<< f->get_name() <<
" renamed decl "<<f->get_renamed() ;
25685 out<<
" enumType="<< f->get_enumType();
25693 out<<
" is_general_access"<< v->get_is_general_access();
25696 out<<
" is_anonymous:"<< v->get_is_anonymous ();
25701 out<<
" is_protected"<< v->get_is_protected();
25707 out<<
" type@"<< v->get_type();
25708 out<<
" initializer@"<< v->get_initializer();
25709 out<<
" scope@"<< v->get_scope();
25715 out<<
" template class decl@"<< f->get_templateDeclaration();
25718 out<<
" assoc. class decl@"<< f->get_associatedClassDeclaration();
25722 out<<
" member function decl@"<< ctor->get_declaration();
25725 if (
SgIntVal* v= isSgIntVal(node))
25726 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25729 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25732 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25735 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25738 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25741 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25744 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25747 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25750 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25753 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25756 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25759 out<<
" init name@"<< var_ref->get_symbol()->get_declaration() <<
" symbol name="<<var_ref->get_symbol()->get_name();
25762 out<<
" member func decl@"<< func_ref->get_symbol_i()->get_declaration();
25765 out<<
" template member func decl@"<< cnode->get_templateDeclaration();
25770 out<<
" func decl@"<< sym->get_declaration() <<
" func sym name="<<sym->
get_name();
25776 out<<
" ada renaming decl@"<< renaming_decl;
25782 out<<
" base_type@"<< v->get_base_type();
25787 out<<
" base_type@"<< v->get_base_type();
25790 out<<
" base_type@"<< v->get_base_type();
25793 out<<
" type@"<< v->get_type();
25796 out<<
" attribute@"<< v->get_attribute();
25799 out<<
" namespaceDeclaration="<< v->get_namespaceDeclaration();
25805 int total_count = children.size();
25806 int current_index=0;
25809 int last_non_null_child_idx =-1;
25810 for (
int i = (
int) (children.size())-1; i>=0; i--)
25814 last_non_null_child_idx = i;
25822 if (isSgTemplateInstantiationDecl (node))
25829 SgTemplateArgumentPtrList& plist = sn->get_templateArguments();
25830 bool n_hasRemaining=
false;
25831 if (last_non_null_child_idx>-1) n_hasRemaining =
true;
25832 string suffix= hasRemaining?
"| " :
" ";
25833 string n_prefix = prefix+suffix;
25834 string n_edge_label=
"";
25835 serialize_list(plist,
"SgTemplateArgumentPtrList", n_prefix, n_hasRemaining, out, n_edge_label);
25839 SgExpressionPtrList& plist = import_stmt->get_import_list();
25840 bool n_hasRemaining=
false;
25841 if (last_non_null_child_idx>-1) n_hasRemaining =
true;
25842 string suffix= hasRemaining?
"| " :
" ";
25843 string n_prefix = prefix+suffix;
25844 string n_edge_label=
"";
25845 serialize_list(plist,
"SgExpressionPtrList", n_prefix, n_hasRemaining, out, n_edge_label);
25851 for (
size_t i =0; i< children.size(); i++)
25853 bool n_hasRemaining=
false;
25855 if (current_index+1<total_count)
25856 n_hasRemaining=
true;
25859 if ((
int)i<last_non_null_child_idx) n_hasRemaining =
true;
25861 string suffix= hasRemaining?
"| " :
" ";
25862 string n_prefix = prefix+suffix;
25864 serialize (children[i], n_prefix, n_hasRemaining, out, successorNames[i]);
25873 serialize(node, prefix,
false, oss, label);
25894 serialize(node, prefix,
false, oss, label);
25896 textfile.open(filename, ios::out);
25897 textfile<<oss.str();
25902 textfile<<
"Types encountered ...."<<endl;
25903 ostringstream oss2;
25904 VariantVector vv(V_SgType);
25905 Rose_STL_Container<SgNode*> tnodes= NodeQuery::queryMemoryPool(vv);
25906 for (Rose_STL_Container<SgNode*>::const_iterator i = tnodes.begin(); i != tnodes.end(); ++i)
25908 serialize (*i, prefix,
false, oss2, label);
25910 textfile<<oss2.str();
25918 saveToPDF(node,
string(
"temp.pdf.json") );
25924 ROSE_ASSERT(node != NULL);
25931 bool rtval =
false;
25932 ROSE_ASSERT (node != NULL);
25936 string fname = finfo->get_filenameString();
25937 string buildtree_str1 = string(
"include-staging/gcc_HEADERS");
25938 string buildtree_str2 = string(
"include-staging/g++_HEADERS");
25939 string installtree_str1 = string(
"include/edg/gcc_HEADERS");
25940 string installtree_str2 = string(
"include/edg/g++_HEADERS");
25941 string system_headers = string(
"/usr/include");
25943 if ((fname.find (buildtree_str1, 0) != string::npos) ||
25944 (fname.find (buildtree_str2, 0) != string::npos) ||
25945 (fname.find (installtree_str1, 0) != string::npos) ||
25946 (fname.find (installtree_str2, 0) != string::npos) ||
25947 (fname.find (system_headers, 0) != string::npos)
25960 bool returnValue =
false;
25963 ROSE_ASSERT(fileInfo != NULL);
25964 string filename = fileInfo->get_filenameString();
25967 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());
25972 if (EDG_ROSE_Translation::edg_include_file_map.find(filename) == EDG_ROSE_Translation::edg_include_file_map.end())
25975 printf (
"This is NOT in the EDG_ROSE_Translation::edg_include_file_map \n");
25981 printf (
"This IS in the EDG_ROSE_Translation::edg_include_file_map \n");
25983 returnValue =
true;
25986 return returnValue;
25993 ROSE_ASSERT(return_type != NULL);
25994 ROSE_ASSERT(typeList != NULL);
25996 ROSE_ASSERT(fTable);
26001 SgFunctionType* funcType = isSgFunctionType(fTable->lookup_function_type(typeName));
26011 ROSE_ASSERT (lhs != NULL);
26012 ROSE_ASSERT (rhs != NULL);
26017 SgType* rt1 = lhs->get_return_type();
26018 SgType* rt2 = rhs->get_return_type();
26025 if (f1_arg_types.size() == f2_arg_types.size())
26029 size_t counter = 0;
26032 for (
size_t i=0; i< f1_arg_types.size(); i++)
26040 if (counter == f1_arg_types.size())
26062 ROSE_ASSERT(lhs != NULL);
26063 ROSE_ASSERT(rhs != NULL);
26065 bool isSame =
false;
26068 static int counter = 0;
26070 const SgType & X = *lhs;
26071 const SgType & Y = *rhs;
26079#define DEBUG_TYPE_EQUIVALENCE 0
26081#if DEBUG_TYPE_EQUIVALENCE
26082 printf (
"In SageInterface::isEquivalentType(): evaluation of type equivalence for lhs and rhs: counter = %d \n",counter);
26087#if DEBUG_TYPE_EQUIVALENCE || 0
26090 printf (
"In SageInterface::isEquivalentType(): evaluation of type equivalence for lhs and rhs: counter = %d \n",counter);
26096#if DEBUG_TYPE_EQUIVALENCE || 0
26102 printf (
"Output of type chain for lhs: \n");
26103 for (
size_t i = 0; i < X_typeChain.size(); i++)
26105 SgType* element_type = X_typeChain[i];
26106 printf (
"X_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
26107 printf (
" --- X_element_type unparseToString: = %s \n",element_type->
unparseToString().c_str());
26109 if (modifierType != NULL)
26113 printf (
" --- type chain modifier: %s \n",s.c_str());
26114 printf (
" --- type chain modifier: unparseToString: %s \n",modifierType->
unparseToString().c_str());
26118 printf (
"Output of type chain for rhs: \n");
26119 for (
size_t i = 0; i < Y_typeChain.size(); i++)
26121 SgType* element_type = Y_typeChain[i];
26122 printf (
"Y_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
26123 printf (
" --- Y_element_type unparseToString: = %s \n",element_type->
unparseToString().c_str());
26125 if (modifierType != NULL)
26129 printf (
" --- type chain modifier: %s \n",s.c_str());
26130 printf (
" --- type chain modifier: unparseToString: %s \n",modifierType->
unparseToString().c_str());
26141 if (counter >= 280)
26144 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);
26156 printf (
"ERROR: In SageInterface::isEquivalentType(): recursive limit exceeded for : counter = %d \n",counter);
26167 SgReferenceType* X_referenceType = isSgReferenceType(X_element_type);
26168 SgReferenceType* Y_referenceType = isSgReferenceType(Y_element_type);
26170 if (X_referenceType != NULL && Y_referenceType != NULL)
26172 X_element_type = X_referenceType->get_base_type();
26173 Y_element_type = Y_referenceType->get_base_type();
26184 SgPointerType* X_pointerType = isSgPointerType(X_element_type);
26185 SgPointerType* Y_pointerType = isSgPointerType(Y_element_type);
26187 if (X_pointerType != NULL && Y_pointerType != NULL)
26189 X_element_type = X_pointerType->get_base_type();
26190 Y_element_type = Y_pointerType->get_base_type();
26201 SgArrayType* X_arrayType = isSgArrayType(X_element_type);
26202 SgArrayType* Y_arrayType = isSgArrayType(Y_element_type);
26205 if (X_arrayType != NULL && Y_arrayType != NULL)
26207 X_element_type = X_arrayType->get_base_type();
26208 Y_element_type = Y_arrayType->get_base_type();
26210 SgExpression* X_array_index_expression = X_arrayType->get_index();
26211 SgExpression* Y_array_index_expression = Y_arrayType->get_index();
26213 if (X_array_index_expression == Y_array_index_expression)
26215#if DEBUG_TYPE_EQUIVALENCE || 0
26216 printf (
"In SageInterface::isEquivalentType(): counter = %d: Need to check the array size for static equivalence \n",counter);
26227#if DEBUG_TYPE_EQUIVALENCE || 0
26228 printf (
"In SageInterface::isEquivalentType(): counter = %d Need more complex test for expression equivalence \n",counter);
26231 printf (
" --- array index expressions: str1 = %s str2 = %s \n",str1.c_str(),str2.c_str());
26243 SgNonrealType* X_templateType = isSgNonrealType(X_element_type);
26244 SgNonrealType* Y_templateType = isSgNonrealType(Y_element_type);
26247 if (X_templateType != NULL && Y_templateType != NULL)
26249 string X_name = X_templateType->
get_name();
26250 string Y_name = Y_templateType->
get_name();
26252 SgNonrealDecl* X_templateDecl = isSgNonrealDecl(X_templateType->get_declaration());
26253 ROSE_ASSERT(X_templateDecl != NULL);
26254 SgNonrealDecl* Y_templateDecl = isSgNonrealDecl(Y_templateType->get_declaration());
26255 ROSE_ASSERT(Y_templateDecl != NULL);
26257 int X_template_parameter_position = X_templateDecl->get_template_parameter_position();
26258 int Y_template_parameter_position = Y_templateDecl->get_template_parameter_position();
26263#if DEBUG_TYPE_EQUIVALENCE
26266 printf (
"In SageInterface::isEquivalentType(): case SgNonrealType:\n");
26267 printf (
" -- X_name = %s Y_name = %s\n", X_name.c_str(),Y_name.c_str());
26268 printf (
" -- X_template_parameter_position = %d Y_template_parameter_position = %d\n", X_template_parameter_position,Y_template_parameter_position);
26269 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() :
"");
26270 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() :
"");
26271 printf (
" -- X_templateDecl->get_mangled_name() = %s\n", X_templateDecl->get_mangled_name().str());
26272 printf (
" -- Y_templateDecl->get_mangled_name() = %s\n", Y_templateDecl->get_mangled_name().str());
26274 bool value = (X_parent == Y_parent);
26276 if (value && X_templateDecl->get_is_template_param() && Y_templateDecl->get_is_template_param()) {
26277 value = (X_template_parameter_position == Y_template_parameter_position);
26278 }
else if (value && X_templateDecl->get_is_class_member() && Y_templateDecl->get_is_class_member()) {
26279 value = (X_name == Y_name);
26291 printf (
"Nothing to do here since we have explored all uniform pairs of intermediate types possible: isSame = %s \n",isSame ?
"true" :
"false");
26297#if DEBUG_TYPE_EQUIVALENCE
26298 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");
26305 SgModifierType* X_modifierType = isSgModifierType(X_element_type);
26306 SgModifierType* Y_modifierType = isSgModifierType(Y_element_type);
26308#if DEBUG_TYPE_EQUIVALENCE
26309 printf (
"In SageInterface::isEquivalentType(): counter = %d: type chain X_element_type = %p = %s Y_element_type = %p = %s \n",
26310 counter,X_element_type,X_element_type->
class_name().c_str(),Y_element_type,Y_element_type->
class_name().c_str());
26313 if (X_modifierType != NULL && Y_modifierType != NULL)
26316#if DEBUG_TYPE_EQUIVALENCE
26317 printf (
"In SageInterface::isEquivalentType(): loop: these are the both SgModifierType nodes: isSame = %s \n",isSame ?
"true" :
"false");
26319 if (X_modifierType == Y_modifierType)
26322#if DEBUG_TYPE_EQUIVALENCE
26323 printf (
"In SageInterface::isEquivalentType(): loop: these are the same modifier type: isSame = %s \n",isSame ?
"true" :
"false");
26330#if DEBUG_TYPE_EQUIVALENCE
26331 printf (
"In SageInterface::isEquivalentType(): loop: these are equivalent modifiers: check the base type: isSame = %s \n",isSame ?
"true" :
"false");
26335 isSame =
isEquivalentType(X_modifierType->get_base_type(),Y_modifierType->get_base_type());
26339#if DEBUG_TYPE_EQUIVALENCE
26340 printf (
"In SageInterface::isEquivalentType(): loop: these are not equivalent modifier types: check for default settings: isSame = %s \n",isSame ?
"true" :
"false");
26343 bool skippingOverIdentityModifier =
false;
26347#if DEBUG_TYPE_EQUIVALENCE
26348 printf (
"In SageInterface::isEquivalentType(): loop: found self-similar setting for lhs: isSame = %s \n",isSame ?
"true" :
"false");
26350 X_element_type = X_modifierType->get_base_type();
26353 skippingOverIdentityModifier =
true;
26358#if DEBUG_TYPE_EQUIVALENCE
26359 printf (
"In SageInterface::isEquivalentType(): loop: found self-similar setting for rhs: isSame = %s \n",isSame ?
"true" :
"false");
26361 Y_element_type = Y_modifierType->get_base_type();
26364 skippingOverIdentityModifier =
true;
26368#if DEBUG_TYPE_EQUIVALENCE
26369 printf (
"In SageInterface::isEquivalentType(): loop: skippingOverIdentityModifier = %s \n",skippingOverIdentityModifier ?
"true" :
"false");
26374 if (skippingOverIdentityModifier ==
true)
26376#if DEBUG_TYPE_EQUIVALENCE
26377 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");
26386#if DEBUG_TYPE_EQUIVALENCE
26387 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");
26391#if DEBUG_TYPE_EQUIVALENCE
26392 printf (
"In SageInterface::isEquivalentType(): loop: these are different modifier types: after recursive call to compare base types: isSame = %s \n",isSame ?
"true" :
"false");
26401 if (X_modifierType != NULL || Y_modifierType != NULL)
26403 bool isReduceable =
false;
26405 if (X_modifierType != NULL && X_modifierType->
get_typeModifier().isIdentity() ==
true)
26407#if DEBUG_TYPE_EQUIVALENCE
26408 printf (
"In SageInterface::isEquivalentType(): loop: found default setting for lhs: isSame = %s \n",isSame ?
"true" :
"false");
26410 X_element_type = X_modifierType->get_base_type();
26411 isReduceable =
true;
26414 if (Y_modifierType != NULL && Y_modifierType->
get_typeModifier().isIdentity() ==
true)
26416#if DEBUG_TYPE_EQUIVALENCE
26417 printf (
"In SageInterface::isEquivalentType(): loop: found default setting for rhs: isSame = %s \n",isSame ?
"true" :
"false");
26419 Y_element_type = Y_modifierType->get_base_type();
26420 isReduceable =
true;
26424#if DEBUG_TYPE_EQUIVALENCE
26425 printf (
"In SageInterface::isEquivalentType(): loop: these are different modifier types: after recursive call to compare base types: isReduceable = %s \n",isReduceable ?
"true" :
"false");
26427 if (isReduceable ==
true)
26439#if DEBUG_TYPE_EQUIVALENCE
26440 printf (
"In SageInterface::isEquivalentType(): loop: these are different modifier types: after recursive call to compare base types: isReduceable = %s isSame = %s \n",
26441 isReduceable ?
"true" :
"false",isSame ?
"true" :
"false");
26450 if (X_element_type == Y_element_type)
26453#if DEBUG_TYPE_EQUIVALENCE || 0
26455 printf (
"In SageInterface::isEquivalentType(): resolved to equal types: isSame = %s lhs = %p = %s rhs = %p = %s \n",
26458#if DEBUG_TYPE_EQUIVALENCE || 0
26461 const SgTypedefType* lhs_typedefType = isSgTypedefType(lhs);
26462 const SgTypedefType* rhs_typedefType = isSgTypedefType(rhs);
26464 if (lhs_typedefType != NULL || rhs_typedefType != NULL)
26467 if (lhs_typedefType != NULL)
26469 printf (
"lhs was a typedef: lhs = %p = %s \n",lhs,lhs->
unparseToString().c_str());
26471 if (rhs_typedefType != NULL)
26473 printf (
"rhs was a typedef: rhs = %p = %s \n",rhs,rhs->
unparseToString().c_str());
26476 printf (
" --- one was a typedef: lhs = %p = %s \n",lhs,lhs->
unparseToString().c_str());
26477 printf (
" --- one was a typedef: rhs = %p = %s \n",rhs,rhs->
unparseToString().c_str());
26488 SgReferenceType* X_referenceType = isSgReferenceType(X_element_type);
26489 SgReferenceType* Y_referenceType = isSgReferenceType(Y_element_type);
26491 if (X_referenceType != NULL || Y_referenceType != NULL)
26494 if (X_referenceType != NULL)
26496 X_element_type = X_referenceType->get_base_type();
26500 isReduceable =
false;
26503 if (Y_referenceType != NULL)
26505 Y_element_type = Y_referenceType->get_base_type();
26509 isReduceable =
false;
26512 if (isReduceable ==
true)
26533#if DEBUG_TYPE_EQUIVALENCE
26534 printf (
"In SageInterface::isEquivalentType(): loop: evaluation of inner types: isSame = %s \n",isSame ?
"true" :
"false");
26538 SgPointerType* X_pointerType = isSgPointerType(X_element_type);
26539 SgPointerType* Y_pointerType = isSgPointerType(Y_element_type);
26541 if (X_pointerType != NULL || Y_pointerType != NULL)
26544 if (X_pointerType != NULL)
26546 X_element_type = X_pointerType->get_base_type();
26550 isReduceable =
false;
26553 if (Y_pointerType != NULL)
26555 Y_element_type = Y_pointerType->get_base_type();
26559 isReduceable =
false;
26562 if (isReduceable ==
true)
26583#if DEBUG_TYPE_EQUIVALENCE
26584 printf (
"In SageInterface::isEquivalentType(): loop: evaluation of inner types: isSame = %s \n",isSame ?
"true" :
"false");
26588 SgArrayType* X_arrayType = isSgArrayType(X_element_type);
26589 SgArrayType* Y_arrayType = isSgArrayType(Y_element_type);
26591 if (X_arrayType != NULL || Y_arrayType != NULL)
26594 if (X_arrayType != NULL)
26596 X_element_type = X_arrayType->get_base_type();
26600 isReduceable =
false;
26603 if (Y_arrayType != NULL)
26605 Y_element_type = Y_arrayType->get_base_type();
26609 isReduceable =
false;
26612 if (isReduceable ==
true)
26633#if DEBUG_TYPE_EQUIVALENCE
26634 printf (
"In SageInterface::isEquivalentType(): loop: evaluation of inner types: isSame = %s \n",isSame ?
"true" :
"false");
26638 SgFunctionType* X_functionType = isSgFunctionType(X_element_type);
26639 SgFunctionType* Y_functionType = isSgFunctionType(Y_element_type);
26641 if (X_functionType != NULL || Y_functionType != NULL)
26643 bool value = ( (X_functionType != NULL && Y_functionType != NULL) && (X_functionType == Y_functionType) );
26646#if DEBUG_TYPE_EQUIVALENCE || 0
26647 printf (
"In SageInterface::isEquivalentType(): loop: Process case of SgFunctionType: value = %s \n",value ?
"true" :
"false");
26665 if (X_memberFunctionType != NULL || Y_memberFunctionType != NULL)
26668 printf (
"This should be unreachable code \n");
26672 bool value = ( (X_memberFunctionType != NULL && Y_memberFunctionType != NULL) && (X_memberFunctionType == Y_memberFunctionType) );
26673#if DEBUG_TYPE_EQUIVALENCE || 0
26674 printf (
"In SageInterface::isEquivalentType(): loop: Process case of SgMemberFunctionType: value = %s \n",value ?
"true" :
"false");
26687 bool X_isReduceable =
true;
26688 if (isSgTypeSignedLong(X_element_type) != NULL ||
26689 isSgTypeUnsignedInt(X_element_type) != NULL ||
26690 isSgTypeBool(X_element_type) != NULL ||
26691 isSgTypeInt(X_element_type) != NULL)
26693 X_isReduceable =
false;
26696 bool Y_isReduceable =
true;
26697 if (isSgTypeSignedLong(Y_element_type) != NULL ||
26698 isSgTypeUnsignedInt(Y_element_type) != NULL ||
26699 isSgTypeBool(Y_element_type) != NULL ||
26700 isSgTypeInt(Y_element_type) != NULL)
26702 Y_isReduceable =
false;
26704#if DEBUG_TYPE_EQUIVALENCE || 0
26705 printf (
"In SageInterface::isEquivalentType(): loop: Process default case: X_isReduceable = %s Y_isReduceable = %s \n",
26706 X_isReduceable ?
"true" :
"false",Y_isReduceable ?
"true" :
"false");
26708 if (X_isReduceable ==
true || Y_isReduceable ==
true)
26722#if DEBUG_TYPE_EQUIVALENCE || 0
26723 printf (
"In SageInterface::isEquivalentType(): loop: Process default case: X_element_type = %p = %s Y_element_type = %p = %s \n",
26724 X_element_type,X_element_type->
class_name().c_str(),Y_element_type,Y_element_type->
class_name().c_str());
26729 isSame = (X_element_type == Y_element_type);
26749#if DEBUG_TYPE_EQUIVALENCE || 0
26750 printf (
"In SageInterface::isEquivalentType(): isSame = %s \n",isSame ?
"true" :
"false");
26753#if DEBUG_TYPE_EQUIVALENCE || 0
26754 if (counter == 1 && isSame ==
true)
26756 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());
26763 printf (
" --- Output of type chain for lhs: \n");
26764 for (
size_t i = 0; i < X_typeChain.size(); i++)
26766 SgType* element_type = X_typeChain[i];
26767 printf (
" --- --- X_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
26769 if (modifierType != NULL)
26773 printf (
" --- type chain modifier: %s \n",s.c_str());
26777 printf (
" --- Output of type chain for rhs: \n");
26778 for (
size_t i = 0; i < Y_typeChain.size(); i++)
26780 SgType* element_type = Y_typeChain[i];
26781 printf (
" --- --- Y_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
26783 if (modifierType != NULL)
26787 printf (
" --- --- type chain modifier: %s \n",s.c_str());
26796 if (isSame ==
true)
26799 printf (
" --- isSame = %s \n",isSame ?
"true" :
"false");
26802 printf (
" --- --- X_element_type = %p = %s = %s \n",X_element_type,X_element_type->
class_name().c_str(),X_element_type->
unparseToString().c_str());
26803 printf (
" --- --- Y_element_type = %p = %s = %s \n",Y_element_type,Y_element_type->
class_name().c_str(),Y_element_type->
unparseToString().c_str());
26808 printf (
" --- isSame = %s \n",isSame ?
"true" :
"false");
26813 printf (
" --- counter = %d \n",counter);
26830 bool retval =
false;
26839 retval = function->get_marked_as_edg_normalization();
26847 if (templateInstantiationFunction != NULL)
26852 if (templateFunctionDeclaration != NULL)
26863 printf (
" --- case of templateInstantiationFunction: retval = %s \n",retval ?
"true" :
"false");
26868 if (templateInstantiationMemberFunction != NULL)
26871 templateInstantiationMemberFunction = isSgTemplateInstantiationMemberFunctionDecl(templateInstantiationMemberFunction->
get_firstNondefiningDeclaration());
26873 if (templateMemberFunctionDeclaration != NULL)
26884 printf (
" --- case of templateInstantiationMemberFunction: retval = %s \n",retval ?
"true" :
"false");
26896 printf(
"In detectCycleInType():\n");
26897 printf(
" -- from = %s\n", from.c_str());
26898 printf(
" -- type = %p (%s)\n", type, type->
class_name().c_str());
26900 std::vector<SgType *> seen_types;
26902 while (type != NULL) {
26905 ROSE_ASSERT(type != NULL);
26907 std::vector<SgType *>::const_iterator it = std::find(seen_types.begin(), seen_types.end(), type);
26908 if (it != seen_types.end()) {
26909 printf(
"ERROR: Cycle found in type = %p (%s):\n", type, type->
class_name().c_str());
26911 for (; it != seen_types.end(); it++) {
26912 printf(
" [%zd] %p (%s)\n", i, *it, (*it)->class_name().c_str());
26915 printf(
"-> detectCycleInType() was called from: %s\n", from.c_str());
26918 seen_types.push_back(type);
26928 if (isSgPointerMemberType(type) != NULL)
26935 type = modType->get_base_type();
26936 }
else if ( refType ) {
26937 type = refType->get_base_type();
26938 }
else if ( pointType ) {
26939 type = pointType->get_base_type();
26942 }
else if ( arrayType ) {
26943 type = arrayType->get_base_type();
26944 }
else if ( typedefType ) {
26949 ROSE_ASSERT(type != NULL);
26970 std::vector<SgFunctionDeclaration*> functionList;
26973 string filenameWithPath;
26976 TransformFunctionDefinitionsTraversal(): sourceFile(NULL), sourceFileId(-99) {}
26978 void visit (
SgNode* node)
26981 printf (
"In convertFunctionDefinitionsToFunctionPrototypes visit(): node = %p = %s \n",node,node->
class_name().c_str());
26984 if (temp_sourceFile != NULL)
26986 sourceFile = temp_sourceFile;
26990 filenameWithPath = sourceFile->get_sourceFileNameWithPath();
26992 printf (
"Found source file: id = %d name = %s \n",sourceFileId,sourceFile->get_sourceFileNameWithPath().c_str());
26997 if (functionDeclaration != NULL)
27000 ROSE_ASSERT(sourceFile != NULL);
27003 if (functionDeclaration == definingFunctionDeclaration)
27006 printf (
"Found a defining function declaration: functionDeclaration = %p = %s name = %s \n",
27007 functionDeclaration,functionDeclaration->
class_name().c_str(),functionDeclaration->get_name().str());
27009 printf (
" --- recorded source file: id = %d name = %s \n",sourceFileId,sourceFile->get_sourceFileNameWithPath().c_str());
27010 printf (
" --- source file: file_info: id = %d name = %s \n",
27015 bool isInSourceFile = (filenameWithPath == functionDeclaration->
get_file_info()->get_filenameString());
27017 printf (
" --- isInSourceFile = %s \n",isInSourceFile ?
"true" :
"false");
27021 if (isInSourceFile ==
true && functionDeclarationScope != NULL)
27024 printf (
" --- Found a defining function declaration: functionDeclarationScope = %p = %s \n",
27025 functionDeclarationScope,functionDeclarationScope->
class_name().c_str());
27029 functionList.push_back(functionDeclaration);
27037 TransformFunctionDefinitionsTraversal traversal;
27038 traversal.traverse(node, preorder);
27040 std::vector<SgFunctionDeclaration*> & functionList = traversal.functionList;
27043 printf (
"In convertFunctionDefinitionsToFunctionPrototypes(): functionList.size() = %zu \n",functionList.size());
27046 std::vector<SgFunctionDeclaration*>::iterator i = functionList.begin();
27047 while (i != functionList.end())
27050 ROSE_ASSERT(functionDeclaration != NULL);
27053 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27056 printf (
" --- Removing function declaration: functionDeclaration = %p = %s name = %s \n",
27057 functionDeclaration,functionDeclaration->
class_name().c_str(),functionDeclaration->get_name().str());
27067 printf (
"In convertFunctionDefinitionsToFunctionPrototypes(): exiting as a test! \n");
27078 ROSE_ASSERT(scope != NULL);
27080 printf (
"Output the statements in scope = %p = %s \n",scope,scope->
class_name().c_str());
27084 for (
size_t i = 0; i < statementList.size(); i++)
27091 printf (
"Exiting as a test at the end of evaluation of global scope! \n");
27104 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration = %p = %s name = %s \n",
27105 functionDeclaration,functionDeclaration->
class_name().c_str(),functionDeclaration->get_name().str());
27109 bool isConstructor =
false;
27111 if (tmp_memberFunctionDeclaration != NULL)
27113 isConstructor = tmp_memberFunctionDeclaration->get_specialFunctionModifier().isConstructor();
27116 if (isConstructor ==
true)
27118 printf (
"Skipping case of constructors (in building prototype from defining function declaration) \n");
27128 SgName name = functionDeclaration->get_name();
27129 SgType* return_type = functionDeclaration->get_type()->get_return_type();
27137 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration = %p \n",functionDeclaration);
27138 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration->get_firstNondefiningDeclaration() = %p \n",functionDeclaration->
get_firstNondefiningDeclaration());
27139 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration->get_definingDeclaration() = %p \n",functionDeclaration->
get_definingDeclaration());
27143 for (
size_t i = 0; i < functionDeclaration->get_args().size(); i++)
27147 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration->get_args(): (i = %zu) arg = %p = %s isDefaultArgument = %s \n",
27148 i,arg,arg->get_name().str(),arg->
get_file_info()->isDefaultArgument() ?
"true" :
"false");
27149 printf (
" --- arg->get_initializer() = %p \n",arg->get_initializer());
27153 printf (
"NOTE: default argument (i = %zu) not reproduced in function prototype: arg = %p = %s \n",i,arg,arg->get_name().str());
27166 if (templateInstantiationFunctionDecl == NULL)
27173 if (templateInstantiationMemberFunctionDecl == NULL)
27182 bool isTemplateInstantiationMemberFunctionDecl =
false;
27187 bool buildTemplateInstantiation =
false;
27188 SgTemplateArgumentPtrList* templateArgumentsList = NULL;
27193 ROSE_ASSERT(param_list == NULL || param_list->
get_parent() == NULL);
27195 switch (functionDeclaration->
variantT())
27197 case V_SgTemplateMemberFunctionDeclaration:
27200 printf (
"This function to replace the defining declaration with a non-defining declaration does not yet support template member functions \n");
27203 ROSE_ASSERT(original_templateMemberFunctionDeclaration != NULL);
27207 unsigned int functionConstVolatileFlags = 0;
27209 ROSE_ASSERT(original_templateMemberFunctionDeclaration->get_type() != NULL);
27214 SgMemberFunctionType* memberFunctionType = isSgMemberFunctionType(original_templateMemberFunctionDeclaration->get_type());
27215 ROSE_ASSERT(memberFunctionType != NULL);
27217 functionConstVolatileFlags = memberFunctionType->get_mfunc_specifier();
27223 SgTemplateParameterPtrList templateParameterList = original_templateMemberFunctionDeclaration->get_templateParameters();
27226 templateMemberFunctionDeclaration =
27229 printf (
"ERROR: Template functions are not yet supported! \n");
27232 nondefiningFunctionDeclaration = templateMemberFunctionDeclaration;
27234 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27237 if (isConstructor ==
true)
27239 templateMemberFunctionDeclaration->get_specialFunctionModifier().setConstructor();
27245 case V_SgTemplateFunctionDeclaration:
27248 printf (
"This function to replace the defining declaration with a non-defining declaration does not yet support template functions \n");
27251 ROSE_ASSERT(original_templateFunctionDeclaration != NULL);
27259 SgTemplateParameterPtrList templateParameterList = original_templateFunctionDeclaration->get_templateParameters();
27263 printf (
"ERROR: Template functions are not yet supported! \n");
27266 nondefiningFunctionDeclaration = templateFunctionDeclaration;
27268 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27274 case V_SgTemplateInstantiationMemberFunctionDecl:
27276 buildTemplateInstantiation =
true;
27278 isTemplateInstantiationMemberFunctionDecl =
true;
27281 ROSE_ASSERT(templateInstantiationMemberFunctionDecl != NULL);
27284 printf (
"name from functionDeclaration->get_name(): name = %s \n",name.str());
27286 printf (
"name from templateInstantiationMemberFunctionDecl->get_templateName(): template_name = %s \n",templateInstantiationMemberFunctionDecl->
get_templateName().str());
27288 if (templateDeclaration != NULL)
27290 printf (
"name from templateInstantiationMemberFunctionDecl->get_template_declaration()->get_name(): template_name = %s \n",templateDeclaration->get_name().str());
27291 printf (
"name from templateInstantiationMemberFunctionDecl->get_template_declaration()->get_template_name(): template_name = %s \n",templateDeclaration->
get_template_name().str());
27298 printf (
"In case V_SgTemplateInstantiationMemberFunctionDecl: using name = %s \n",name.str());
27303 case V_SgMemberFunctionDeclaration:
27306 printf (
"This function to replace the defining declaration with a non-defining declaration does not yet support member functions \n");
27309 ROSE_ASSERT(original_memberFunctionDeclaration != NULL);
27317 unsigned int functionConstVolatileFlags = 0;
27319 ROSE_ASSERT(original_memberFunctionDeclaration->get_type() != NULL);
27328 bool buildPrototype = isTemplateInstantiationMemberFunctionDecl || original_memberFunctionDeclaration->
get_parent() == original_memberFunctionDeclaration->
get_scope();
27330 printf (
"In SageInterface::buildFunctionPrototype(): buildPrototype = %s \n",buildPrototype ?
"true" :
"false");
27332 if (buildPrototype ==
true)
27334 SgMemberFunctionType* memberFunctionType = isSgMemberFunctionType(original_memberFunctionDeclaration->get_type());
27335 ROSE_ASSERT(memberFunctionType != NULL);
27337 printf (
"original_memberFunctionDeclaration->get_parent() == original_memberFunctionDeclaration->get_scope() \n");
27339 functionConstVolatileFlags = memberFunctionType->get_mfunc_specifier();
27341 memberFunctionDeclaration =
27343 ( name, return_type, param_list, scope, python_decoratorList, functionConstVolatileFlags,
27344 buildTemplateInstantiation,templateArgumentsList );
27346 printf (
"ERROR: Member functions are not yet supported! \n");
27350 if (isConstructor ==
true)
27352 memberFunctionDeclaration->get_specialFunctionModifier().setConstructor();
27355 nondefiningFunctionDeclaration = memberFunctionDeclaration;
27357 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27363 printf (
"NOTE: Member functions defined outside of their class can not be output as member function prototypes (not allowed in C++) \n");
27367 nondefiningFunctionDeclaration = NULL;
27369 nondefiningFunctionDeclaration = NULL;
27371 replaceWithEmptyDeclaration =
true;
27373 ROSE_ASSERT(emptyDeclaration != NULL);
27382 printf (
"Exiting as a test! \n");
27392 case V_SgFunctionDeclaration:
27395 nondefiningFunctionDeclaration =
buildNondefiningFunctionDeclaration (name, return_type, param_list, scope, python_decoratorList, buildTemplateInstantiation,templateArgumentsList);
27396 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27401 case V_SgTemplateInstantiationFunctionDecl:
27404 buildTemplateInstantiation =
true;
27406 ROSE_ASSERT(templateInstantiationFunctionDecl != NULL);
27409 printf (
"name from functionDeclaration->get_name(): name = %s \n",name.str());
27411 printf (
"name from templateInstantiationFunctionDecl->get_templateName(): template_name = %s \n",templateInstantiationFunctionDecl->
get_templateName().str());
27413 if (templateDeclaration != NULL)
27415 printf (
"name from templateInstantiationFunctionDecl->get_template_declaration()->get_name(): template_name = %s \n",templateDeclaration->get_name().str());
27416 printf (
"name from templateInstantiationFunctionDecl->get_template_declaration()->get_template_name(): template_name = %s \n",templateDeclaration->
get_template_name().str());
27421 printf (
"In case V_SgTemplateInstantiationFunctionDecl: using name = %s \n",name.str());
27423 nondefiningFunctionDeclaration =
buildNondefiningFunctionDeclaration (name, return_type, param_list, scope, python_decoratorList, buildTemplateInstantiation,templateArgumentsList);
27424 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27443 ROSE_ASSERT(param_list == NULL || param_list->
get_parent() != NULL);
27449 if (nondefiningFunctionDeclaration != NULL)
27454 printf (
"Setting the firstNondefiningDeclaration \n");
27462 printf (
"Setting the definingDeclaration \n");
27471 if (nondefiningFunctionDeclaration != NULL)
27481 return nondefiningFunctionDeclaration;
27490 ROSE_ASSERT(functionDeclaration != NULL);
27493 printf (
"****************************************************************** \n");
27494 printf (
"Attached comments and CPP directives: defining functionDeclaration \n");
27496 printf (
"****************************************************************** \n");
27504 if (nondefiningFunctionDeclaration != NULL)
27515 if (templateInstantiationFunctionDecl == NULL)
27517 if (nondefiningFunctionDeclaration != NULL)
27520 nondefiningFunctionDeclaration->get_declarationModifier() = functionDeclaration->get_declarationModifier();
27523 nondefiningFunctionDeclaration->get_functionModifier() = functionDeclaration->get_functionModifier();
27524 nondefiningFunctionDeclaration->get_specialFunctionModifier() = functionDeclaration->get_specialFunctionModifier();
27526 nondefiningFunctionDeclaration->set_linkage( functionDeclaration->get_linkage() );
27527 nondefiningFunctionDeclaration->set_externBrace( functionDeclaration->get_externBrace() );
27529 ROSE_ASSERT(nondefiningFunctionDeclaration->get_forward() ==
true);
27532 int file_id = functionDeclaration->
get_file_info()->get_physical_file_id();
27533 nondefiningFunctionDeclaration->
get_file_info()->set_physical_file_id(file_id);
27549 ROSE_ASSERT(nondefiningFunctionDeclaration->
get_parent() != NULL);
27555 nondefiningFunctionDeclaration = NULL;
27559 if (functionDeclaration->get_declarationModifier().get_storageModifier().
isStatic() ==
true)
27561 ROSE_ASSERT(nondefiningFunctionDeclaration->get_declarationModifier().get_storageModifier().
isStatic() ==
true);
27565 return nondefiningFunctionDeclaration;
27569std::vector<SgFunctionDeclaration*>
27581 std::vector<SgFunctionDeclaration*> functionList;
27582 FunctionDefinitionsTraversal() {}
27584 void visit (
SgNode* node)
27587 if (functionDeclaration != NULL)
27593 if (functionDeclaration == definingFunctionDeclaration)
27597 if (functionDeclarationScope != NULL)
27599 functionList.push_back(functionDeclaration);
27607 FunctionDefinitionsTraversal traversal;
27609 traversal.traverseWithinFile(node, preorder);
27611 std::vector<SgFunctionDeclaration*> & functionList = traversal.functionList;
27613 return functionList;
27620 ROSE_ASSERT(node != NULL);
27623 std::vector<SgFunctionDeclaration*>::iterator i = functionList.begin();
27625 while (i != functionList.end())
27628 ROSE_ASSERT(functionDeclaration != NULL);
27646 ROSE_ASSERT(node !=
nullptr);
27652 void visit (
SgNode* node)
27655 if (variableDeclaration != NULL)
27658 SgExpression* initializer = initializedName->get_initializer();
27660 printf (
"variableDeclaration = %p initializedName = %p = %s initializer = %p \n",
27661 variableDeclaration,initializedName,initializedName->get_name().str(),initializer);
27663 if (initializer != NULL)
27665 printf (
" --- initializer = %s \n",initializer->
class_name().c_str());
27672 CheckInitializerTraversal traversal;
27673 traversal.traverse(node, preorder);
27681 void setResult(
SgType*) { }
27683 void handle(
SgNode& n,
SgNode&) { SG_UNEXPECTED_NODE(n); }
27685 template <
class SageDeclarationStatement>
27691 setResult(n.get_type());
27694 template <
class SageNode>
27695 void handle(SageNode& n)
27708 SgGlobal * gsaf = project->get_globalScopeAcrossFiles();
27709 ROSE_ASSERT(gsaf !=
nullptr);
27711 ROSE_ASSERT(st !=
nullptr);
27713 ROSE_ASSERT(hmm !=
nullptr);
27717 ROSE_ASSERT(st !=
nullptr);
27718 hmm = st->get_table();
27719 ROSE_ASSERT(hmm !=
nullptr);
27723 ROSE_ASSERT(st !=
nullptr);
27724 hmm = st->get_table();
27725 ROSE_ASSERT(hmm !=
nullptr);
27745 int match_count = 0;
27746 ROSE_ASSERT (root);
27750 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(root, V_SgArrowExp);
27754 boost::unordered::unordered_map <SgNode*, bool> visited;
27757 for (Rose_STL_Container<SgNode *>::reverse_iterator i = nodeList.rbegin(); i != nodeList.rend(); i++)
27760 if (visited.count(*i)==1)
27769 cerr<<
"SageInterface::normalizeArrowExpWithAddressOfLeftOperand() expects SgArrowExp while encountering "<<(*i)->class_name()<<
"@"<<(*i) <<endl;
27770 ROSE_ASSERT (a_exp);
27773 if (transformationGeneratedOnly)
27781 if (
SgVarRefExp* left = isSgVarRefExp(address_op->get_operand()))
27794 return match_count;
27804 Traversal() : found(
false) {}
27805 void visit (
SgNode* node)
27807 SgCastExp* castExpression = isSgCastExp(node);
27808 if (castExpression != NULL)
27812 if (initializer == NULL)
27817 printf (
" --- Found a SgCastExp marked as a transformation: castExpression = %p \n",castExpression);
27820 printf (
"Exiting as a test! \n");
27821 ROSE_ASSERT(
false);
27827 printf (
" --- SgCastExp (but not marked as a transformation) node = %p = %s \n",node,node->
class_name().c_str());
27835 printf (
" --- SgCastExp (but from an initializer) node = %p = %s \n",node,node->
class_name().c_str());
27842 printf (
" --- node = %p = %s \n",node,node->
class_name().c_str());
27849 printf (
"In findFirstSgCastExpMarkedAsTransformation(): s = %s \n",s.c_str());
27853 Traversal traversal;
27854 traversal.traverse(n, preorder);
27857 printf (
"In findFirstSgCastExpMarkedAsTransformation(): s = %s traversal.found = %s \n",s.c_str(),traversal.found ?
"true" :
"false");
27861 if (traversal.found ==
true)
27863 printf (
"In findFirstSgCastExpMarkedAsTransformation(): returning false \n");
27868 return traversal.found;
27879 ROSE_ASSERT (info != NULL);
27880 PreprocessingInfo::DirectiveType dtype= info->getTypeOfDirective();
27881 if (dtype == PreprocessingInfo::CpreprocessorIfdefDeclaration ||
27882 dtype == PreprocessingInfo::CpreprocessorIfndefDeclaration ||
27883 dtype == PreprocessingInfo::CpreprocessorIfDeclaration )
27887 else if (dtype==PreprocessingInfo::CpreprocessorElseDeclaration||
27888 dtype==PreprocessingInfo::CpreprocessorElifDeclaration)
27892 else if (dtype==PreprocessingInfo::CpreprocessorEndifDeclaration)
27901static void moveInofListToNewPlace(AttachedPreprocessingInfoType* infoList,
int cidx, set <AttachedPreprocessingInfoType*>& relatedInfoList,
SgLocatedNode* lnode,
int &retVal)
27906 relatedInfoList.insert (infoList);
27910 info->setRelativePosition(PreprocessingInfo::after);
27917 (*infoList)[cidx]= NULL;
27924 ROSE_ASSERT(lnode);
27930 vector < pair< AttachedPreprocessingInfoType*, int> > empty_entries;
27931 for(;ast_i!=ast.
end();++ast_i) {
27933 if (current ==NULL )
27937 if (infoList == NULL)
continue;
27939 int commentIndex=0;
27940 for (Rose_STL_Container<PreprocessingInfo*>::iterator ci = (*infoList).begin(); ci != (*infoList).end(); ci++)
27946 empty_entries.push_back( make_pair (infoList, commentIndex) );
27952 for (
auto ki = empty_entries.rbegin(); ki != empty_entries.rend(); ki ++)
27954 AttachedPreprocessingInfoType* infoList = (*ki).first;
27955 int cidx= (*ki).second;
27958 ROSE_ASSERT (info==NULL);
27961 AttachedPreprocessingInfoType::iterator k = infoList->begin();
27962 infoList->erase(k+cidx);
27972static std::unordered_map <PreprocessingInfo*, SageInterface::PreprocessingInfoData> infoMap;
27977 if (current == NULL)
27983 vector<PreprocessingInfo*> afterList;
27986 AttachedPreprocessingInfoType* comments = locatedNode->getAttachedPreprocessingInfo();
27988 if (comments !=
nullptr)
27990 AttachedPreprocessingInfoType::iterator i;
27992 for (i = comments->begin (); i != comments->end (); i++)
27998 data.container=comments;
28000 data.depth = depth;
28003 if (info->getRelativePosition () == PreprocessingInfo::before)
28005 infoList.push_back (info);
28006 infoMap[info] = data;
28011 else if (info->getRelativePosition () == PreprocessingInfo::after
28012 || info->getRelativePosition () == PreprocessingInfo::inside
28015 afterList.push_back (info);
28016 infoMap[info] = data;
28020 mlog[Sawyer::Message::Common::WARN] <<
"Warning: unhandled relative position value:" <<info->getRelativePosition () <<endl;
28031 for (
auto c: children)
28035 for (
auto fi : afterList)
28036 infoList.push_back(fi);
28050 ROSE_ASSERT(lnode);
28066 vector < pair< AttachedPreprocessingInfoType*, int> > keepers;
28070 unordered_map < PreprocessingInfo * , vector< pair<AttachedPreprocessingInfoType*, int>> > associated_directives;
28075 vector< pair<AttachedPreprocessingInfoType*, int>> associated_erase;
28083 vector<PreprocessingInfo*> candidateInfoList;
28088 for (
auto candidate: candidateInfoList)
28095 if (infoMap[info].depth ==0)
28098 int commentIndex = infoMap[info].index;
28099 AttachedPreprocessingInfoType* infoList = infoMap[info].container;
28102 if ( isBeginDirective(info) == 1)
28104 keepers.push_back(make_pair (infoList,commentIndex));
28107 else if (isBeginDirective(info) == 2)
28112 if (keepers.size()==0)
28113 keepers.push_back(make_pair (infoList, commentIndex));
28114 else if (isBeginDirective( (*(keepers.back().first))[keepers.back().second] )!=1 )
28116 keepers.push_back(make_pair (infoList,commentIndex));
28118 else if(isBeginDirective( (*(keepers.back().first))[keepers.back().second] )==1 )
28120 PreprocessingInfo* begin_info = (*(keepers.back().first))[keepers.back().second];
28122 associated_directives[begin_info].push_back(make_pair (infoList,commentIndex));
28126 else if ( isBeginDirective(info) == -1)
28128 bool neutralized =
false;
28130 if (keepers.size()>0)
28132 AttachedPreprocessingInfoType* comments = keepers.back().first;
28133 int idx = keepers.back().second;
28135 if(isBeginDirective( (*comments)[idx] )==1)
28137 keepers.pop_back();
28138 neutralized =
true;
28143 keepers.push_back(make_pair (infoList,commentIndex));
28151 for(;ast_i!=ast.
end();++ast_i) {
28153 if (current ==NULL )
28157 if (infoList == NULL)
continue;
28159 int commentIndex=0;
28160 for (Rose_STL_Container<PreprocessingInfo*>::iterator ci = (*infoList).begin(); ci != (*infoList).end(); ci++)
28162 ROSE_ASSERT(*ci != NULL);
28168 if ( isBeginDirective(info) == 1)
28170 keepers.push_back(make_pair (infoList,commentIndex));
28173 else if (isBeginDirective(info) == 2)
28178 if (keepers.size()==0)
28179 keepers.push_back(make_pair (infoList,commentIndex));
28180 else if (isBeginDirective( (*(keepers.back().first))[keepers.back().second] )!=1 )
28182 keepers.push_back(make_pair (infoList,commentIndex));
28184 else if(isBeginDirective( (*(keepers.back().first))[keepers.back().second] )==1 )
28186 PreprocessingInfo* begin_info = (*(keepers.back().first))[keepers.back().second];
28188 associated_directives[begin_info].push_back(make_pair (infoList,commentIndex));
28192 else if ( isBeginDirective(info) == -1)
28194 bool neutralized =
false;
28196 if (keepers.size()>0)
28198 AttachedPreprocessingInfoType* comments = keepers.back().first;
28199 int idx = keepers.back().second;
28201 if(isBeginDirective( (*comments)[idx] )==1)
28203 keepers.pop_back();
28204 neutralized =
true;
28209 keepers.push_back(make_pair (infoList,commentIndex));
28216 set <AttachedPreprocessingInfoType*> relatedInfoList;
28219 for (
auto ki = keepers.begin(); ki != keepers.end(); ki ++)
28221 AttachedPreprocessingInfoType* infoList = (*ki).first;
28222 int cidx= (*ki).second;
28224 relatedInfoList.insert (infoList);
28228 info->setRelativePosition(PreprocessingInfo::after);
28235 if (associated_directives.count (info)!=0)
28237 vector<pair<AttachedPreprocessingInfoType*,int>> a_list_vec = associated_directives[info];
28238 for (
auto vec_i = a_list_vec.rbegin(); vec_i != a_list_vec.rend(); vec_i ++ )
28240 AttachedPreprocessingInfoType* a_infoList = (*vec_i).first;
28241 int aidx= (*vec_i).second;
28242 moveInofListToNewPlace (a_infoList, aidx, relatedInfoList, lnode, retVal);
28243 associated_erase.push_back(make_pair (a_infoList, aidx));
28249 (*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: