3#include "markLhsValues.h"
5#include "FileUtility.h"
6#include <Sawyer/Message.h>
8#include "AstJSONGeneration.h"
10#include "SgNodeHelper.h"
12#include "Rose/AST/Utility.h"
14#include "sageInterface.h"
15#include "Combinatorics.h"
18#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
19#include "replaceExpressionWithStatement.h"
21#include "constantFolding.h"
28#include "sageBuilder.h"
34#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
37#include "AstInterface_ROSE.h"
38#include "LoopTransformInterface.h"
40#include "DepInfoAnal.h"
41#include "ArrayAnnot.h"
42#include "ArrayInterface.h"
44#include "LoopUnroll.h"
45#include "abstract_handle.h"
46#include "roseAdapter.h"
49#include <boost/lexical_cast.hpp>
50#include <boost/foreach.hpp>
56#include <unordered_map>
58#ifdef ROSE_BUILD_JAVA_LANGUAGE_SUPPORT
66 extern jclass currentJavaTraversalClass;
67 extern JNIEnv *currentEnvironment;
68 extern jmethodID mainMethod;
69 extern jmethodID hasConflictsMethod;
70 extern jmethodID getTempDirectoryMethod;
71 extern jmethodID createTempFileMethod;
72 extern jmethodID createTempNamedFileMethod;
73 extern jmethodID createTempNamedDirectoryMethod;
80using namespace Rose::Frontend::Java::Ecj;
86namespace EDG_ROSE_Translation
89#if defined(ROSE_BUILD_CXX_LANGUAGE_SUPPORT) && !defined(ROSE_USE_CLANG_FRONTEND)
91 extern std::map<std::string, SgIncludeFile*> edg_include_file_map;
94 std::map<std::string, SgIncludeFile*> edg_include_file_map;
101#include "detectMacroOrIncludeFileExpansions.h"
104 template<
class T>
void setSourcePositionToDefault( T* node );
108#ifdef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
109 #include "transformationSupport.h"
113#include "rose_config.h"
119#include "AST_FILE_IO.h"
124#define OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS 1
134typedef std::set<SgLabelStatement*> SgLabelStatementPtrSet;
153 vector<SgBasicBlock*> addedBasicBlockNodes;
170 std::vector<SgNode*> resultlist;
171 void visit (
SgNode* node)
174 ROSE_ASSERT(result != NULL);
176 printf (
"In SageInterface::deleteAllNodes(): result = %p = %s \n",result,result->
class_name().c_str());
181 resultlist.push_back(result);
184 resultlist.push_back(result);
188 virtual ~MyTraversal() {}
192 size_t numberOfNodes_before = numberOfNodes();
194 MyTraversal my_traversal;
198 my_traversal.traverseMemoryPool();
204 vector<SgNode*> & nodeList = my_traversal.resultlist;
206 printf (
"In SageInterface::deleteAllNodes(): get list of SgNode: nodeList.size() = %zu \n",nodeList.size());
208 vector<SgNode*>::iterator i = nodeList.begin();
211 while (i != nodeList.end())
217 printf (
" --- calling delete (and thus the destructor) node = %p = %s \n",node,node->
class_name().c_str());
227 vector<SgFunctionDeclaration*> functionDeclarationList = getSgNodeListFromMemoryPool<SgFunctionDeclaration>();
228 printf (
"In SageInterface::deleteAllNodes(): get list of SgFunctionDeclaration: functionDeclarationList.size() = %zu \n",functionDeclarationList.size());
232 AST_FILE_IO::clearAllMemoryPools();
234 size_t numberOfNodes_after = numberOfNodes();
237 printf (
"Leaving SageInterface::deleteAllNodes(): numberOfNodes_before = %zu numberOfNodes_after = %zu \n",numberOfNodes_before,numberOfNodes_after);
266 void visit (
SgNode* node)
273 resultlist.push_back(result);
276 virtual ~MyTraversal() {}
280 size_t numberOfNodes_before = numberOfNodes();
282 MyTraversal my_traversal;
286 my_traversal.traverseMemoryPool();
295 ASSERT_not_null(decl);
298 printf (
"TOP of SageInterface::DeclarationSets::addDeclaration(): decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
303 if (firstNondefiningDeclaration ==
nullptr)
307 printf (
"WARNING: SageInterface::DeclarationSets::addDeclaration(): firstNondefiningDeclaration == NULL: decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
311 ASSERT_not_null(firstNondefiningDeclaration);
313 if (decl == firstNondefiningDeclaration)
316 if (isSgTypedefDeclaration(decl) !=
nullptr)
318 printf (
"TOP of SageInterface::DeclarationSets::addDeclaration(): decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
321 if (declarationMap.find(firstNondefiningDeclaration) == declarationMap.end())
324 printf (
"In SageInterface::DeclarationSets::addDeclaration(): Add a set for decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
327 if (isSgTypedefDeclaration(decl) !=
nullptr)
329 printf (
"In SageInterface::DeclarationSets::addDeclaration(): Add a set for decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
333 declarationMap[decl] =
new set<SgDeclarationStatement*>();
335 ROSE_ASSERT (declarationMap.find(firstNondefiningDeclaration) != declarationMap.end());
336 ROSE_ASSERT(declarationMap[decl] !=
nullptr);
339 declarationMap[firstNondefiningDeclaration]->insert(decl);
343 if (declarationMap[firstNondefiningDeclaration]->find(decl) == declarationMap[firstNondefiningDeclaration]->end())
346 printf (
"In SageInterface::DeclarationSets::addDeclaration(): Add the declaration to the existing set: decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
349 if (isSgTypedefDeclaration(decl) !=
nullptr)
351 printf (
"In SageInterface::DeclarationSets::addDeclaration(): Add the declaration to the existing set: decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
355 declarationMap[firstNondefiningDeclaration]->insert(decl);
360 printf (
"WARNING: SageInterface::DeclarationSets::addDeclaration(): A set already exists for decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
364 bool ignore_error = (isSgFunctionParameterList(decl) !=
nullptr);
375 bool isInTemplateFunctionDeclaration = enclosingFunction !=
nullptr && (isSgTemplateMemberFunctionDeclaration(enclosingFunction) || isSgTemplateFunctionDeclaration(enclosingFunction));
379 bool isInTemplateClassDefinition = enclosingClassDefinition !=
nullptr && isSgTemplateClassDefinition(enclosingClassDefinition);
381 bool isInTemplateDeclaration = isInTemplateFunctionDeclaration || isInTemplateClassDefinition;
383 ignore_error = ignore_error || (isSgTypedefDeclaration(decl) !=
nullptr) || (isSgTemplateInstantiationDecl(decl) !=
nullptr) || (isInTemplateDeclaration ==
true);
388 if (isSgClassDeclaration(decl) !=
nullptr)
390 ignore_error = ignore_error || (isSgClassDeclaration(decl)->get_isUnNamed() ==
true);
398 if (declarationMap.find(firstNondefiningDeclaration) != declarationMap.end())
401 ROSE_ASSERT (declarationMap[firstNondefiningDeclaration] !=
nullptr);
402 if (declarationMap[firstNondefiningDeclaration]->find(decl) == declarationMap[firstNondefiningDeclaration]->end())
405 declarationMap[firstNondefiningDeclaration]->insert(decl);
410 printf (
"This declaration is already in the set (skip adding it twice): decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
419 printf (
"In SageInterface::DeclarationSets::addDeclaration(): Adding set and declaration for the firstNondefiningDeclaration = %p = %s = %s \n",
420 firstNondefiningDeclaration,firstNondefiningDeclaration->
class_name().c_str(),
get_name(firstNondefiningDeclaration).c_str());
427 declarationMap[firstNondefiningDeclaration] =
new set<SgDeclarationStatement*>();
429 ROSE_ASSERT (declarationMap.find(firstNondefiningDeclaration) != declarationMap.end());
433 declarationMap[firstNondefiningDeclaration]->insert(decl);
436 ROSE_ASSERT(declarationMap[firstNondefiningDeclaration]->find(decl) != declarationMap[firstNondefiningDeclaration]->end());
438 printf (
"SageInterface::DeclarationSets::addDeclaration(): No set exists for the firstNondefiningDeclaration = %p = %s = %s \n",firstNondefiningDeclaration,firstNondefiningDeclaration->
class_name().c_str(),
get_name(firstNondefiningDeclaration).c_str());
445 printf (
"Leaving SageInterface::DeclarationSets::addDeclaration(): decl = %p = %s = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
449const std::set<SgDeclarationStatement*>*
455 ROSE_ASSERT(declarationMap.find(firstNondefiningDeclaration) != declarationMap.end());
457 const set<SgDeclarationStatement*>* declarationSet = declarationMap[firstNondefiningDeclaration];
460 return declarationSet;
463std::map<SgDeclarationStatement*,std::set<SgDeclarationStatement*>* > &
464SageInterface::DeclarationSets::getDeclarationMap()
466 return declarationMap;
482#define DEBUG_LOCATED_IN_DEFINING_SCOPE 0
485 ROSE_ASSERT(firstNondefiningDeclaration !=
nullptr);
487 set<SgDeclarationStatement*>* declarationSet = declarationMap[firstNondefiningDeclaration];
488 ROSE_ASSERT(declarationSet !=
nullptr);
490 set<SgDeclarationStatement*>::iterator i = declarationSet->begin();
492 bool isDefinedInNamedScope =
false;
494#if DEBUG_LOCATED_IN_DEFINING_SCOPE
495 printf (
"In DeclarationSets::isLocatedInDefiningScope(): decl = %p = %s \n",decl,decl->
class_name().c_str());
496 printf (
" --- declarationSet->size() = %" PRIuPTR
" \n",declarationSet->size());
499 while (isDefinedInNamedScope ==
false && i != declarationSet->end())
501 ROSE_ASSERT(*i !=
nullptr);
502#if DEBUG_LOCATED_IN_DEFINING_SCOPE
503 printf (
" --- *i = %p = %s \n",*i,(*i)->class_name().c_str());
507 SgScopeStatement* structural_scope = isSgScopeStatement((*i)->get_parent());
509#if DEBUG_LOCATED_IN_DEFINING_SCOPE
510 printf (
" --- semantic_scope = %p = %s \n",semantic_scope,semantic_scope->
class_name().c_str());
511 printf (
" --- structural_scope = %p = %s \n",structural_scope,structural_scope->
class_name().c_str());
514 SgScopeStatement* scope = isSgClassDefinition(semantic_scope) !=
nullptr ? semantic_scope : structural_scope;
515 ASSERT_not_null(scope);
517#if DEBUG_LOCATED_IN_DEFINING_SCOPE
518 printf (
" --- scope = %p = %s \n",scope,scope->
class_name().c_str());
519 printf (
" --- scope->isNamedScope() = %s \n",scope->
isNamedScope() ?
"true" :
"false");
521 SgGlobal* globalScope = isSgGlobal(scope);
524 if (globalScope !=
nullptr || (scope->
isNamedScope() ==
true && isSgClassDefinition(structural_scope) ==
nullptr) )
527 bool willBeOutput = ((*i)->get_file_info()->isCompilerGenerated() ==
false ||
528 ((*i)->get_file_info()->isCompilerGenerated() &&
529 (*i)->get_file_info()->isOutputInCodeGeneration()) );
530#if DEBUG_LOCATED_IN_DEFINING_SCOPE
531 printf (
" --- before: willBeOutput = %s \n",willBeOutput ?
"true" :
"false");
534 willBeOutput = willBeOutput && scope == structural_scope;
536#if DEBUG_LOCATED_IN_DEFINING_SCOPE
537 printf (
" --- after: willBeOutput = %s \n",willBeOutput ?
"true" :
"false");
543 isDefinedInNamedScope = willBeOutput;
549#if DEBUG_LOCATED_IN_DEFINING_SCOPE
550 if (associatedDeclaration !=
nullptr)
552 printf (
"Leaving DeclarationSets::isLocatedInDefiningScope(): associatedDeclaration = %p = %s \n",associatedDeclaration,
associatedDeclaration->
class_name().c_str());
556 printf (
"Leaving DeclarationSets::isLocatedInDefiningScope(): associatedDeclaration = %p \n",associatedDeclaration);
560 return isDefinedInNamedScope;
564SageInterface::buildDeclarationSets(
SgNode* n)
566 DeclarationSets* declarationSet =
new DeclarationSets();
571 DeclarationSets* declarationSet;
574 DeclarationSetTraversal(DeclarationSets* ds) : declarationSet(ds) {}
580 declarationSet->addDeclaration(decl);
586 DeclarationSetTraversal traversal(declarationSet);
587 traversal.traverse(n, preorder);
589 return declarationSet;
596string getVariantName ( VariantT v )
598 ROSE_ASSERT(
int(v) <
int(V_SgNumVariants));
605 extern const char* roseGlobalVariantNameList[];
606 return string(roseGlobalVariantNameList[v]);
613 bool usingTemplateSyntax =
false;
614 string nameString = name.getString();
617 usingTemplateSyntax = (nameString.find(
'<') != string::npos) && (nameString.find(
'>') != string::npos);
621 if (nameString ==
"<unnamed>")
623 printf (
"In SageInterface::hasTemplateSyntax(): Identified case of name == <unnamed> \n");
625 usingTemplateSyntax =
false;
629 return usingTemplateSyntax;
641 ROSE_ASSERT(node != NULL);
645 ROSE_ASSERT(isSgFile(node) == NULL);
646 ROSE_ASSERT(isSgFileList(node) == NULL);
647 ROSE_ASSERT(isSgProject(node) == NULL);
652 while (parent !=
nullptr && isSgFileList(parent) ==
nullptr)
656 printf (
"--- parent = %p = %s \n",parent,parent->
class_name().c_str());
659 parent->
get_file_info()->display(
"In SageInterface::whereAmI() diagnostics support");
686 ifstmt->setCaseInsensitive(
true);
689 if (conditional) conditional->
set_parent(ifstmt);
691 if (false_body) false_body->
set_parent(ifstmt);
698 ROSE_ASSERT(switchStatement != NULL);
702 switchStatement->setCaseInsensitive(
true);
707 if (switchStatement->
get_body() ==
nullptr)
711 if (item_selector !=
nullptr)
721 ROSE_ASSERT(whileStatement);
725 whileStatement->setCaseInsensitive(
true);
729 if (whileStatement->
get_body() ==
nullptr)
733 if (whileStatement->get_else_body() ==
nullptr)
734 whileStatement->set_else_body(else_body);
737 if (condition) condition->
set_parent(whileStatement);
741 if (else_body !=
nullptr)
743 whileStatement->set_else_body(else_body);
764 ROSE_ASSERT(declaration != NULL);
768 while ( isSgNamespaceDefinitionStatement(tempScope) ==
nullptr && isSgGlobal(tempScope) ==
nullptr )
771 ROSE_ASSERT(tempScope != NULL);
778 return namespaceScope;
792 ASSERT_not_null(defn);
796 ASSERT_not_null(templateDeclaration);
802 if (templateInstatiationClassDefinition !=
nullptr)
806 ASSERT_not_null(parentTemplateInstantiationDefinition);
808 ASSERT_not_null(parentTemplateInstantiationDeclaration);
811 ASSERT_not_null(parentDeclaration);
813 else if (cdefn !=
nullptr)
817 ASSERT_not_null(parentDeclaration);
819 else if (nrscope !=
nullptr)
821 parentDeclaration = isSgDeclarationStatement(nrscope->
get_parent());
822 ASSERT_not_null(parentDeclaration);
829 return parentDeclaration;
838 ASSERT_not_null(var_decl);
839 ASSERT_not_null(base_decl);
853 if (find(stmt_list.begin(), stmt_list.end(), base_decl) != stmt_list.end())
858 var_decl->set_baseTypeDefiningDeclaration(base_decl);
864 t1.traverseMemoryPool();
873 bool foundExistingPrototype =
false;
875 ROSE_ASSERT(scope != NULL);
876 ROSE_ASSERT(functionDeclaration != NULL);
877 ROSE_ASSERT(startingAtDeclaration != NULL);
880 if (isSgDeclarationScope(scope)) {
881 printf(
"TODO: SgDeclarationScope handling in SageInterface::isPrototypeInScope see ROSE-1378\n");
892 SgDeclarationStatementPtrList::iterator startingLocation = find(declarationList.begin(),declarationList.end(),startingAtDeclaration);
894 if (startingLocation != declarationList.end())
897 printf (
"startingLocation = %p = %s = %s \n",*startingLocation,(*startingLocation)->class_name().c_str(),
SageInterface::get_name(*startingLocation).c_str());
900 SgDeclarationStatementPtrList::iterator i = startingLocation;
902 SgName targetName = functionDeclaration->get_name();
904 while (i != declarationList.end())
910 if (templateMemberFunction !=
nullptr)
913 if (targetScope == templateMemberFunction->
get_scope())
915 if (targetName == templateMemberFunction->get_name())
918 if (templateMemberFunction->
isForward() ==
true)
920 foundExistingPrototype =
true;
933 return foundExistingPrototype;
939 ROSE_ASSERT(node1 && node2);
949 }
while( (curnode!=
nullptr) && (curnode!=node1));
966#define DEBUG_HAS_SAME_SCOPE 0
968#if DEBUG_HAS_SAME_SCOPE
969 printf (
"In SageInterface::hasSameGlobalScope(): \n");
970 printf (
" --- statement_1 = %p = %s \n",statement_1,statement_1->
class_name().c_str());
971 printf (
" --- statement_2 = %p = %s \n",statement_2,statement_2->
class_name().c_str());
974 bool includingSelf =
true;
975 SgGlobal* global_scope_1 = getEnclosingNode<SgGlobal>(statement_1,includingSelf);
976 SgGlobal* global_scope_2 = getEnclosingNode<SgGlobal>(statement_2,includingSelf);
978#if DEBUG_HAS_SAME_SCOPE
979 printf (
" --- global_scope_1 = %p = %s \n",global_scope_1,global_scope_1->
class_name().c_str());
981 printf (
" --- --- sourcefile_1 = %p filename = %s \n",sourcefile_1,sourcefile_1->
getFileName().c_str());
983 printf (
" --- global_scope_2 = %p = %s \n",global_scope_2,global_scope_2->
class_name().c_str());
985 printf (
" --- --- sourcefile_2 = %p filename = %s \n",sourcefile_2,sourcefile_2->
getFileName().c_str());
988 bool returnResult = (global_scope_1 == global_scope_2);
990#if DEBUG_HAS_SAME_SCOPE
991 printf (
"Leaving SageInterface::hasSameGlobalScope(): returning: %s \n",returnResult ?
"true" :
"false");
1001 std::vector<SgNode*> intersectionSet;
1004 std::vector<SgNode*> AST_original = NodeQuery::querySubTree (original,V_SgNode);
1005 std::vector<SgNode*> AST_copy = NodeQuery::querySubTree (copy,V_SgNode);
1007 int AST_original_size = AST_original.size();
1008 int AST_copy_size = AST_copy.size();
1012 printf (
"Original AST size = %d \n",AST_original_size);
1013 printf (
"Copy of original AST size = %d \n",AST_copy_size);
1016 int differenceInSizes = AST_original_size - AST_copy_size;
1017 if (differenceInSizes == 0)
1020 printf (
"Copied AST is the SAME size as the original (size = %d) \n",AST_original_size);
1024 printf (
"Warning: Copied AST and the original are DIFFERENT sizes (original size = %d copyied size = %d) \n",AST_original_size,AST_copy_size);
1029 std::set<SgNode*> AST_set_original;
1030 for (
int i = 0; i < AST_original_size; i++)
1032 AST_set_original.insert(AST_original[i]);
1035 std::set<SgNode*> AST_set_copy;
1036 for (
int i = 0; i < AST_copy_size; i++)
1038 AST_set_copy.insert(AST_copy[i]);
1041 int size = AST_original_size;
1042 std::vector<SgNode*> intersectionList(size);
1045 std::vector<SgNode*>::iterator end = set_intersection(AST_set_original.begin(),AST_set_original.end(),AST_set_copy.begin(),AST_set_copy.end(),intersectionList.begin());
1048 std::vector<SgNode*> meaningIntersectionList = std::vector<SgNode*>(intersectionList.begin(),end);
1049 std::vector<SgNode*> deleteList;
1050 for (
int i = 0; i < (int)meaningIntersectionList.size(); i++)
1052 if (meaningIntersectionList[i] !=
nullptr && isSgType(meaningIntersectionList[i]) !=
nullptr)
1054 deleteList.push_back(meaningIntersectionList[i]);
1060 printf (
"Remove the types that are allowed to be shared: deleteList.size() = %ld \n",(
long)deleteList.size());
1062 for (std::vector<SgNode*>::iterator i = deleteList.begin(); i != deleteList.end(); i++)
1064 meaningIntersectionList.erase(find(meaningIntersectionList.begin(),meaningIntersectionList.end(),*i));
1068 printf (
"After removing the types there are meaningIntersectionList.size() = %ld \n",(
long)meaningIntersectionList.size());
1070 for (
int i = 0; i < (int)meaningIntersectionList.size(); i++)
1072 printf (
" meaningIntersectionList[%d] = %p = %s = %s \n",i,meaningIntersectionList[i],meaningIntersectionList[i]->class_name().c_str(),
get_name(meaningIntersectionList[i]).c_str());
1075 int unmatchedIRnodes = 0;
1076 if (help !=
nullptr)
1078 std::vector<SgNode*> tmp_AST_original;
1079 std::vector<SgNode*> tmp_AST_copy;
1081 int AST_original_size = AST_original.size();
1082 for (
int j = 0; j < AST_original_size; j++)
1084 if (AST_original[j] != NULL && isSgType(AST_original[j]) == NULL)
1086 tmp_AST_original.push_back(AST_original[j]);
1090 int AST_copy_size = AST_copy.size();
1091 for (
int j = 0; j < AST_copy_size; j++)
1093 if (AST_copy[j] != NULL && isSgType(AST_copy[j]) == NULL)
1095 tmp_AST_copy.push_back(AST_copy[j]);
1099 std::vector<SgNode*> deleteList_original;
1100 std::vector<SgNode*> deleteList_copy;
1101 for (
int j = 0; j < (int)tmp_AST_original.size(); j++)
1104 SgCopyHelp::copiedNodeMapTypeIterator i = help->get_copiedNodeMap().find(tmp_AST_original[j]);
1106 if (i != help->get_copiedNodeMap().end())
1109 SgNode* associated_node_copy = i->second;
1110 ROSE_ASSERT(associated_node_copy != NULL);
1111 deleteList_original.push_back(tmp_AST_original[j]);
1112 deleteList_copy.push_back(associated_node_copy);
1117 if (templateMemberFunction != NULL)
1119 printf (
"In SageInterface::astIntersection(): Found a SgTemplateInstantiationMemberFunctionDecl = %p copy = %p \n",templateMemberFunction,associated_node_copy);
1127 int deleteList_original_size = deleteList_original.size();
1128 for (
int j = 0; j < deleteList_original_size; j++)
1131 std::vector<SgNode*>::iterator k = find(tmp_AST_original.begin(),tmp_AST_original.end(),deleteList_original[j]);
1132 if (k != tmp_AST_original.end())
1134 tmp_AST_original.erase(k);
1139 printf (
"IR nodes different between the original AST and the copy of the AST = %" PRIuPTR
" \n",tmp_AST_original.size());
1141 for (
int j = 0; j < (int)tmp_AST_original.size(); j++)
1143 printf (
"non matched IR node = %p = %s = %s \n",tmp_AST_original[j],tmp_AST_original[j]->class_name().c_str(),
get_name(tmp_AST_original[j]).c_str());
1147 unmatchedIRnodes = (int)tmp_AST_original.size();
1151 if (differenceInSizes != 0)
1153 SgProject* originalProject = isSgProject(original);
1154 if (originalProject != NULL)
1156 printf (
"In %s Copied AST and the original are DIFFERENT sizes (original size = %d copyied size = %d) IR nodes different = %d \n",
1157 (*originalProject)[0]->get_sourceFileNameWithoutPath().c_str(),AST_original_size,AST_copy_size,unmatchedIRnodes);
1160 if (unmatchedIRnodes > 0)
1162 printf (
"Make this an error under stricter testing \n");
1167 return intersectionSet;
1177 ROSE_ASSERT(initializedNameNode != NULL);
1179#define DEBUG_SET_NAME 0
1183 printf (
"In SageInterface::set_name(): initializedNameNode = %p name = %s new_name = %s \n",initializedNameNode,initializedNameNode->get_name().str(),new_name.str());
1190 while((node!=NULL) && ( isSgScopeStatement(node)==NULL))
1193 ROSE_ASSERT(node!=NULL);
1201 if (isSgEnumDeclaration(initializedNameNode->
get_parent()) != NULL)
1203 ROSE_ASSERT(scope_stmt != NULL);
1204 printf (
"scope_stmt = %p = %s \n",scope_stmt,scope_stmt->
class_name().c_str());
1206 printf (
"Detected isSgEnumDeclaration as parent: exiting as a test in SageInterface::set_name() \n");
1211 ROSE_ASSERT(scope_stmt != NULL);
1217 ROSE_ASSERT(parent_declaration != NULL);
1220 std::pair<SgSymbolTable::hash_iterator,SgSymbolTable::hash_iterator> pair_it = scope_stmt->
get_symbol_table()->get_table()->equal_range(initializedNameNode->get_name());
1222 SgSymbolTable::hash_iterator found_it = scope_stmt->
get_symbol_table()->get_table()->end();
1224 for (SgSymbolTable::hash_iterator it = pair_it.first; it != pair_it.second; ++it)
1227 printf (
"Looking for symbol in scope = %p = %s \n",scope_stmt,scope_stmt->
class_name().c_str());
1228 printf (
" --- *it = %p = %s \n",(*it).second,(*it).second->class_name().c_str());
1230 switch(parent_declaration->
variantT())
1232 case V_SgFunctionParameterList:
1233 case V_SgVariableDeclaration:
1235 if (isSgVariableSymbol((*it).second) != NULL)
1240 case V_SgClassDeclaration:
1242 if (isSgClassSymbol((*it).second) != NULL)
1247 case V_SgFunctionDeclaration:
1249 if (isSgFunctionSymbol((*it).second) != NULL)
1255 case V_SgEnumDeclaration:
1257 if (isSgEnumFieldSymbol((*it).second) != NULL)
1264 printf (
"Default reached in switch in SageInterface::set_name() \n");
1272 printf (
"Warning: There is no Variable, Class, Function, or EnumValue symbol associated with p_name \n");
1279 printf (
"WARNING: SageInterface::set_name(): This statement can not be transformed because it is part of a header file specific more then once with different include file syntax \n");
1285 printf (
"In SageInterface::set_name(): This statement can be transformed! parent_declaration = %p = %s \n",parent_declaration,
get_name(parent_declaration).c_str());
1290 printf (
"Exiting as a test! \n");
1295 SgSymbol * associated_symbol = (*found_it).second;
1310 found_it = scope_stmt->
get_symbol_table()->get_table()->insert(pair<SgName,SgSymbol*> ( new_name,associated_symbol));
1312 found_it = scope_stmt->
get_symbol_table()->get_table()->insert(pair<SgName,SgSymbol*> ( new_name,associated_symbol));
1317 printf (
"Warning: insertion of new symbol failed \n");
1323 printf (
"Reset initializedNameNode->get_name() = %s to new_name = %s \n",initializedNameNode->get_name().str(),new_name.str());
1327 initializedNameNode->set_name(new_name);
1332 ROSE_ASSERT(enclosingStatement != NULL);
1348 void visit (
SgNode* node)
1353 ROSE_ASSERT(varRefExp != NULL);
1354 ROSE_ASSERT(variableSymbol != NULL);
1356 if (varRefExp->get_symbol() == variableSymbol)
1359 printf (
"In SageInterface::set_name(): Found associated SgVarRefExp varRefExp = %p to symbol associated_symbol = %p \n",varRefExp,variableSymbol);
1362 printf (
"Exiting as a test! \n");
1373 printf (
"In SageInterface::set_name(): When unparsing header files, we need to set the physical file id to the correct file \n");
1378 ROSE_ASSERT(associatedStatement != NULL);
1384 ROSE_ASSERT(associatedStatement != NULL);
1392 RoseVisitor(
SgSymbol* symbol_parmeter) : counter(0), symbol(symbol_parmeter)
1395 printf (
"roseVisitor::visit: counter %4d node = %s \n",counter,symbol_parmeter->
class_name().c_str());
1403 RoseVisitor t1(associated_symbol);
1408 printf (
"Leaving SageInterface::set_name(): initializedNameNode = %p name = %s new_name = %s (return 1) \n",initializedNameNode,initializedNameNode->get_name().str(),new_name.str());
1420 printf (
"In SageInterface::listHeaderFiles(): includeFile filename = %s \n",includeFile->get_filename().str());
1426 void visit (
SgNode* node)
1428 printf (
"In listHeaderFiles visit(): node = %p = %s \n",node,node->
class_name().c_str());
1430 if (includeFile != NULL)
1432 printf (
"include file: filename = %s \n",includeFile->get_filename().str());
1438 PrefixTraversal traversal;
1439 traversal.traverse(includeFile, preorder);
1458 ROSE_ASSERT(scope != NULL);
1459 int scope_file_id = scope->
get_file_info()->get_physical_file_id();
1461 bool return_value =
false;
1465 SgDeclarationStatementPtrList & declarationStatementList = scope->
getDeclarationList();
1467 printf (
"In scopeHasStatementsFromSameFile(): DeclarationStatementList not implemented \n");
1470 printf (
"declarationStatementList.size() = %zu \n",declarationStatementList.size());
1472 SgDeclarationStatementPtrList::iterator i = declarationStatementList.begin();
1474 while (i != declarationStatementList.end() && return_value ==
false)
1477 int statement_file_id = statement->
get_file_info()->get_physical_file_id();
1479 if (statement_file_id == scope_file_id)
1481 return_value =
true;
1487 printf (
"Exiting as a test! \n");
1495 printf (
"In scopeHasStatementsFromSameFile(): StatementList not implemented \n");
1497 SgStatementPtrList::iterator i = statementList.begin();
1499 while (i != statementList.end() && return_value ==
false)
1502 int statement_file_id = statement->
get_file_info()->get_physical_file_id();
1504 if (statement_file_id == scope_file_id)
1506 return_value =
true;
1513 return return_value;
1519 template <
class SageDecl>
1520 std::string genericGetName(SageDecl* dcl)
1523 return dcl->get_name();
1533 string name =
"undefined_name";
1535 ROSE_ASSERT(directive != NULL);
1544 case V_SgIncludeDirectiveStatement:
1545 case V_SgDefineDirectiveStatement:
1546 case V_SgUndefDirectiveStatement:
1547 case V_SgIfdefDirectiveStatement:
1548 case V_SgIfndefDirectiveStatement:
1549 case V_SgDeadIfDirectiveStatement:
1550 case V_SgIfDirectiveStatement:
1551 case V_SgElseDirectiveStatement:
1552 case V_SgElseifDirectiveStatement:
1553 case V_SgLineDirectiveStatement:
1554 case V_SgWarningDirectiveStatement:
1555 case V_SgErrorDirectiveStatement:
1556 case V_SgEmptyDirectiveStatement:
1563 case V_SgClinkageStartStatement:
1564 case V_SgClinkageEndStatement:
1570 case V_SgFortranIncludeLine:
1578 printf (
"Warning: default case reached in SageInterface::get_name ( const SgC_PreprocessorDirectiveStatement* directive ), directive = %p = %s \n",
1582 name =
"directive_default_name_case_reached_not_handled";
1594 string name =
"undefined_name";
1596 ROSE_ASSERT(declaration != NULL);
1600 if (directive != NULL)
1607 case V_SgTemplateMemberFunctionDeclaration:
1608 name = isSgTemplateMemberFunctionDeclaration(declaration)->get_name().str();
1611 case V_SgTemplateFunctionDeclaration:
1612 name = isSgTemplateFunctionDeclaration(declaration)->get_name().str();
1615 case V_SgTemplateClassDeclaration:
1616 name = isSgTemplateClassDeclaration(declaration)->get_name().str();
1619 case V_SgTemplateDeclaration:
1620 name = isSgTemplateDeclaration(declaration)->
get_name().str();
1623 case V_SgTemplateInstantiationDecl:
1624 name = isSgTemplateInstantiationDecl(declaration)->
get_templateName().str();
1627 case V_SgClassDeclaration:
1628 case V_SgDerivedTypeStatement:
1629 case V_SgJovialTableStatement:
1630 name = isSgClassDeclaration(declaration)->get_name().str();
1635 case V_SgJovialDefineDeclaration:
1636 case V_SgJovialDirectiveStatement:
1637 case V_SgJovialCompoolStatement:
1638 name =
"__" + declaration->
class_name() +
"_";
1642 case V_SgJovialLabelDeclaration:
1643 name = isSgJovialLabelDeclaration(declaration)->get_label();
1646 case V_SgEnumDeclaration:
1647 name = isSgEnumDeclaration(declaration)->
get_name().str();
1651 case V_SgTemplateInstantiationTypedefDeclaration:
1653 case V_SgTemplateTypedefDeclaration:
1654 case V_SgTypedefDeclaration:
1655 name = isSgTypedefDeclaration(declaration)->get_name().str();
1658 case V_SgFunctionDeclaration:
1659 case V_SgProgramHeaderStatement:
1660 case V_SgProcedureHeaderStatement:
1661 case V_SgMemberFunctionDeclaration:
1662 case V_SgTemplateInstantiationFunctionDecl:
1663 case V_SgTemplateInstantiationMemberFunctionDecl:
1664 case V_SgAdaFunctionRenamingDecl:
1665 case V_SgAdaEntryDecl:
1666 name = isSgFunctionDeclaration(declaration)->get_name().str();
1669 case V_SgNamespaceDeclarationStatement:
1670 name = isSgNamespaceDeclarationStatement(declaration)->
get_name().str();
1674 case V_SgFunctionParameterList:
1677 ROSE_ASSERT(declaration->
get_parent() != NULL);
1681 name =
get_name(functionDeclaration);
1689 name +=
"_parameter_list_";
1694 case V_SgTemplateVariableDeclaration:
1695 case V_SgTemplateVariableInstantiation:
1698 case V_SgVariableDeclaration:
1702 name =
"_variable_declaration_";
1704 ROSE_ASSERT(variableDeclaration != NULL);
1705 SgInitializedNamePtrList::const_iterator i = variableDeclaration->
get_variables().begin();
1708 ROSE_ASSERT(i != variableDeclaration->
get_variables().end());
1711 name += string((*i)->get_name().str());
1720 case V_SgVariableDefinition:
1724 name =
"_variable_definition_";
1726 ROSE_ASSERT(variableDefinition != NULL);
1729 ROSE_ASSERT(variableDefinition->
get_vardefn() != NULL);
1735 case V_SgPragmaDeclaration:
1737 name =
"_pragma_declaration_";
1739 ROSE_ASSERT(pragmaDeclaration != NULL);
1740 ROSE_ASSERT(pragmaDeclaration->get_pragma() != NULL);
1741 name +=
get_name(pragmaDeclaration->get_pragma());
1746 case V_SgUsingDirectiveStatement:
1748 name =
"_using_directive_statement_";
1750 ROSE_ASSERT(usingDeclaration != NULL);
1757 case V_SgNamespaceAliasDeclarationStatement:
1759 name =
"_namespace_alias_directive_statement_";
1761 ROSE_ASSERT(namespaceAliasDeclaration != NULL);
1762 ROSE_ASSERT(namespaceAliasDeclaration->
get_name().is_null() ==
false);
1763 name += namespaceAliasDeclaration->
get_name();
1768 case V_SgUsingDeclarationStatement:
1770 name =
"_using_declaration_statement_";
1772 ROSE_ASSERT(usingDeclaration != NULL);
1786 case V_SgTemplateInstantiationDirectiveStatement:
1788 name =
"_template_instantiation_directive_statement_";
1789 ROSE_ASSERT(declaration != NULL);
1791 ROSE_ASSERT(templateInstantiationDirective != NULL);
1792 ROSE_ASSERT(templateInstantiationDirective->
get_declaration() != NULL);
1800 case V_SgCtorInitializerList:
1802 name =
"_ctor_list_";
1804 ROSE_ASSERT(ctorDeclaration != NULL);
1805 ROSE_ASSERT(ctorDeclaration->
get_parent() != NULL);
1813 name =
"_asm_stmt_";
1814 const SgAsmStmt* asmStatement = isSgAsmStmt(declaration);
1815 ROSE_ASSERT(asmStatement != NULL);
1816 ROSE_ASSERT(asmStatement->
get_parent() != NULL);
1822 case V_SgImplicitStatement:
1824 name =
"_fortran_implicit_";
1826 ROSE_ASSERT(implicitStatement != NULL);
1827 ROSE_ASSERT(implicitStatement->
get_parent() != NULL);
1833 case V_SgNamelistStatement:
1835 name =
"_fortran_namelist_";
1837 ROSE_ASSERT(namelistStatement != NULL);
1838 ROSE_ASSERT(namelistStatement->
get_parent() != NULL);
1844 case V_SgEquivalenceStatement:
1846 name =
"_fortran_equivalence_";
1848 ROSE_ASSERT(equivalenceStatement != NULL);
1849 ROSE_ASSERT(equivalenceStatement->
get_parent() != NULL);
1856 case V_SgCommonBlock:
1858 name =
"_fortran_common_block_";
1859 const SgCommonBlock* commonBlockStatement = isSgCommonBlock(declaration);
1860 ROSE_ASSERT(commonBlockStatement != NULL);
1861 ROSE_ASSERT(commonBlockStatement->
get_parent() != NULL);
1867 case V_SgImportStatement:
1869 name =
"_fortran_import_stmt_";
1871 ROSE_ASSERT(importStatement != NULL);
1872 ROSE_ASSERT(importStatement->
get_parent() != NULL);
1878 case V_SgFormatStatement:
1880 name =
"_fortran_format_stmt_";
1882 ROSE_ASSERT(formatStatement != NULL);
1883 ROSE_ASSERT(formatStatement->
get_parent() != NULL);
1889 case V_SgModuleStatement:
1891 name =
"_fortran_module_stmt_";
1893 ROSE_ASSERT(moduleStatement != NULL);
1894 ROSE_ASSERT(moduleStatement->
get_parent() != NULL);
1900 case V_SgUseStatement:
1902 name =
"_fortran_use_stmt_";
1903 const SgUseStatement* useStatement = isSgUseStatement(declaration);
1904 ROSE_ASSERT(useStatement != NULL);
1905 ROSE_ASSERT(useStatement->
get_parent() != NULL);
1911 case V_SgContainsStatement:
1913 name =
"_fortran_contains_stmt_";
1915 ROSE_ASSERT(containsStatement != NULL);
1916 ROSE_ASSERT(containsStatement->
get_parent() != NULL);
1922 case V_SgEntryStatement:
1924 name =
"_fortran_entry_stmt_";
1926 ROSE_ASSERT(entryStatement != NULL);
1927 ROSE_ASSERT(entryStatement->
get_parent() != NULL);
1933 case V_SgAttributeSpecificationStatement:
1935 name =
"_fortran_attribute_specification_stmt_";
1937 ROSE_ASSERT(statement != NULL);
1938 ROSE_ASSERT(statement->
get_parent() != NULL);
1943 case V_SgInterfaceStatement:
1945 name =
"_fortran_interface_stmt_";
1947 ROSE_ASSERT(statement != NULL);
1948 ROSE_ASSERT(statement->
get_parent() != NULL);
1953 case V_SgFortranIncludeLine:
1955 name =
"_fortran_include_line_stmt_";
1957 ROSE_ASSERT(statement != NULL);
1958 ROSE_ASSERT(statement->
get_parent() != NULL);
1964 case V_SgJavaImportStatement:
1966 name =
"_java_import_stmt_";
1968 ROSE_ASSERT(statement != NULL);
1969 ROSE_ASSERT(statement->
get_parent() != NULL);
1974 case V_SgJavaPackageDeclaration:
1976 name =
"_java_package_declaration_";
1978 ROSE_ASSERT(package_declaration != NULL);
1979 ROSE_ASSERT(package_declaration->
get_parent() != NULL);
1984 case V_SgJavaPackageStatement:
1986 name =
"_java_package_stmt_";
1988 ROSE_ASSERT(statement != NULL);
1989 ROSE_ASSERT(statement->
get_parent() != NULL);
1995 case V_SgStaticAssertionDeclaration:
1997 name =
"_static_assertion_declaration_stmt_";
1999 ROSE_ASSERT(statement != NULL);
2000 ROSE_ASSERT(statement->
get_parent() != NULL);
2005 case V_SgNonrealDecl:
2007 const SgNonrealDecl * nrdecl = isSgNonrealDecl(declaration);
2008 ROSE_ASSERT(nrdecl != NULL);
2009 name = nrdecl->get_name();
2014 case V_SgEmptyDeclaration:
2017 ROSE_ASSERT(emptyDeclaration != NULL);
2022 case V_SgAdaPackageSpecDecl:
2024 name = genericGetName(isSgAdaPackageSpecDecl(declaration));
2028 case V_SgAdaPackageBodyDecl:
2030 name = genericGetName(isSgAdaPackageBodyDecl(declaration));
2034 case V_SgAdaFormalTypeDecl:
2036 name = genericGetName(isSgAdaFormalTypeDecl(declaration));
2040 case V_SgAdaGenericDecl:
2044 name =
get_name(gendcl->get_declaration());
2047 if (isSgFunctionDeclaration(dcl->get_declaration())) {
2048 name =
"_ada_generic_decl_" + genericGetName(isSgFunctionDeclaration(dcl->get_declaration()));
2051 if (isSgAdaPackageSpecDecl(dcl->get_declaration())) {
2052 name =
"_ada_generic_decl_" + genericGetName(isSgAdaPackageSpecDecl(dcl->get_declaration()));
2062 case V_SgAdaDiscriminatedTypeDecl:
2073 name =
"_incomplete_Ada_discriminated_type_";
2079 case V_SgAdaVariantDecl:
2081 name =
"_ada_variant_decl_";
2085 case V_SgAdaAttributeClause:
2087 name =
"_ada_attribute_clause_";
2091 case V_SgAdaRepresentationClause:
2093 name =
"_ada_representation_clause_";
2097 case V_SgAdaEnumRepresentationClause:
2099 name =
"_ada_enum_representation_clause_";
2103 case V_SgAdaComponentClause:
2105 name =
"_ada_component_clause_";
2109 case V_SgAdaTaskTypeDecl:
2111 name = genericGetName(isSgAdaTaskTypeDecl(declaration));
2115 case V_SgAdaProtectedTypeDecl:
2117 name = genericGetName(isSgAdaProtectedTypeDecl(declaration));
2121 case V_SgAdaTaskBodyDecl:
2123 name = genericGetName(isSgAdaTaskBodyDecl(declaration));
2127 case V_SgAdaProtectedBodyDecl:
2129 name = genericGetName(isSgAdaProtectedBodyDecl(declaration));
2133 case V_SgAdaRenamingDecl:
2135 name = genericGetName(isSgAdaRenamingDecl(declaration));
2139 case V_SgAdaTaskSpecDecl:
2141 name = genericGetName(isSgAdaTaskSpecDecl(declaration));
2145 case V_SgAdaProtectedSpecDecl:
2147 name = genericGetName(isSgAdaProtectedSpecDecl(declaration));
2151 case V_SgAdaGenericInstanceDecl:
2153 name = genericGetName(isSgAdaGenericInstanceDecl(declaration));
2157 case V_SgAdaFormalPackageDecl:
2159 name = genericGetName(isSgAdaFormalPackageDecl(declaration));
2163 case V_SgAdaParameterList:
2168 name = std::accumulate( plst->get_parameters().begin(), plst->get_parameters().end(),
2169 std::string{
"_ada_parameter_list_"},
2172 n += SageInterface::get_name(rhs);
2181 printf (
"Warning: default case reached in SageInterface::get_name ( const SgDeclarationStatement* declaration ), declaration = %p = %s \n",
2182 declaration,declaration->
class_name().c_str());
2192 string name =
"undefined_name";
2194 ROSE_ASSERT(scope != NULL);
2199 case V_SgTemplateClassDefinition:
2200 name =
get_name(isSgTemplateClassDefinition(scope)->get_declaration());
2203 case V_SgClassDefinition:
2204 case V_SgTemplateInstantiationDefn:
2205 name =
get_name(isSgClassDefinition(scope)->get_declaration());
2209 case V_SgTemplateFunctionDefinition:
2210 case V_SgFunctionDefinition:
2211 name =
get_name(isSgFunctionDefinition(scope)->get_declaration());
2214 case V_SgNamespaceDefinitionStatement:
2215 name =
get_name(isSgNamespaceDefinitionStatement(scope)->get_namespaceDeclaration());
2217 case V_SgJavaLabelStatement:
2218 name = (isSgJavaLabelStatement(scope)->get_label()).getString();
2222 case V_SgDeclarationScope:
2225 case V_SgAssociateStatement:
2226 case V_SgJavaForEachStatement:
2228 case V_SgFunctionParameterScope:
2229 case V_SgAdaPackageSpec:
2230 case V_SgAdaPackageBody:
2231 case V_SgAdaTaskSpec:
2232 case V_SgAdaTaskBody:
2233 case V_SgAdaProtectedSpec:
2234 case V_SgAdaProtectedBody:
2235 case V_SgAdaGenericDefn:
2236 case V_SgAdaAcceptStmt:
2237 case V_SgJovialForThenStatement:
2238 case V_SgMatlabForStatement:
2239 case V_SgBasicBlock:
2240 case V_SgCatchOptionStmt:
2241 case V_SgDoWhileStmt:
2242 case V_SgForStatement:
2245 case V_SgSwitchStatement:
2248 case V_SgForAllStatement:
2249 case V_SgRangeBasedForStatement:
2254 printf (
"Error: undefined case (SgScopeStatement) in SageInterface::get_name(): node = %s \n",scope->
class_name().c_str());
2264 string name =
"undefined_name";
2266 ROSE_ASSERT(stmt != NULL);
2269 if (declaration != NULL)
2287 case V_SgCaseOptionStmt:
2288 case V_SgCatchStatementSeq:
2289 case V_SgClinkageStartStatement:
2290 case V_SgContinueStmt:
2291 case V_SgDefaultOptionStmt:
2293 case V_SgForInitStmt:
2294 case V_SgFunctionTypeTable:
2295 case V_SgGotoStatement:
2296 case V_SgReturnStmt:
2302 case V_SgLabelStatement:
2305 name = labelStatement->
get_label().str();
2328 ROSE_ASSERT(node != NULL);
2330 string name =
"undefined_name";
2332 ROSE_ASSERT(node != NULL);
2336 case V_SgInitializedName:
2339 if (initializedName != NULL)
2341 name = initializedName->get_name().str();
2349 name =
"_pragma_string_";
2350 const SgPragma* pragma = isSgPragma(node);
2351 ROSE_ASSERT(pragma != NULL);
2352 name += pragma->get_pragma();
2366 case V_SgSourceFile:
2367#ifdef ROSE_ENABLE_BINARY_ANALYSIS
2368 case V_SgBinaryComposite:
2374 const SgFile* file = isSgFile(node);
2375 ROSE_ASSERT(file != NULL);
2382 case V_SgSymbolTable:
2384 name =
"_symbol_table_";
2389 case V_SgStorageModifier:
2391 name =
"_storage_modifier_";
2397 case V_Sg_File_Info:
2399 name =
"_file_info_";
2404 case V_SgTemplateArgument:
2406 name =
"_template_argument_";
2408 ROSE_ASSERT(templateArgument != NULL);
2414 ROSE_ASSERT(t != NULL);
2428 ROSE_ASSERT(templateArgument->get_initializedName() == NULL);
2433 ROSE_ASSERT(t == NULL);
2435 ROSE_ASSERT(initializedName != NULL);
2446 ROSE_ASSERT(t != NULL);
2453 printf (
"Error: default case reached in switch on templateArgument->get_argumentType() \n");
2462 case V_SgTypeModifier:
2465 ROSE_ASSERT(typeModifier != NULL);
2466 name =
"_type_modifier_" + typeModifier->displayString();
2473 const SgNameGroup* nameGroup = isSgNameGroup(node);
2474 ROSE_ASSERT(nameGroup != NULL);
2475 name =
"_name_group_" + nameGroup->get_group_name();
2480 case V_SgDataStatementGroup:
2483 ROSE_ASSERT(dataGroup != NULL);
2484 name =
"_data_statement_group_";
2489 case V_SgDataStatementObject:
2492 ROSE_ASSERT(dataObject != NULL);
2493 name =
"_data_statement_object_";
2498 case V_SgDataStatementValue:
2501 ROSE_ASSERT(dataValue != NULL);
2502 name =
"_data_statement_value_";
2507 case V_SgCommonBlockObject:
2510 ROSE_ASSERT(commonBlockObject != NULL);
2511 name =
"_common_block_object_" + commonBlockObject->get_block_name();
2516 case V_SgFormatItem:
2519 ROSE_ASSERT(formatItem != NULL);
2520 name =
"_format_item_";
2525 case V_SgFormatItemList:
2528 ROSE_ASSERT(formatItemList != NULL);
2529 name =
"_format_item_list_";
2534 case V_SgRenamePair:
2537 ROSE_ASSERT(renamePair != NULL);
2538 name = renamePair->get_local_name() +
"__" + renamePair->get_use_name() +
"_rename_pair_";
2545 const SgName* name_node = isSgName(node);
2546 ROSE_ASSERT(name_node != NULL);
2547 name =
"_name_" + name_node->getString();
2552 case V_SgTemplateParameter:
2555 ROSE_ASSERT(template_parameter_node != NULL);
2556 name =
"_template_parameter_";
2558 switch(template_parameter_node->get_parameterType())
2562 name +=
"type_parameter_";
2568 name +=
"nontype_parameter_";
2572 if (template_parameter_node->get_expression() != NULL)
2578 ROSE_ASSERT(template_parameter_node->get_initializedName() != NULL);
2584 name += template_parameter_node->get_initializedName()->
unparseToString();
2592 name +=
"template_parameter_";
2598 printf (
"Error: default reached \n");
2608 const SgBaseClass* base_class_node = isSgBaseClass(node);
2609 ROSE_ASSERT(base_class_node != NULL);
2610 ROSE_ASSERT(base_class_node->get_base_class() != NULL);
2615 ROSE_ASSERT(baseClassModifier != NULL);
2616 access = baseClassModifier->displayString();
2618 name =
"_base_class_" + access +
"_" +
get_name(base_class_node->get_base_class());
2624 printf (
"Default reached in switch for SgSupport IR node = %s \n",node->
class_name().c_str());
2625 name =
"default name";
2640 ROSE_ASSERT(symbol != NULL);
2642 string aliasSymbolPrefix =
"";
2643 if (isSgAliasSymbol(symbol) != NULL)
2645 aliasSymbolPrefix =
"_ALIAS";
2652 return symbol->
get_name() + aliasSymbolPrefix +
"_symbol_";
2660 ROSE_ASSERT(type != NULL);
2664 const SgNamedType* namedType = isSgNamedType(type);
2665 if (namedType != NULL)
2667 returnName =
"named_type_";
2668 returnName = namedType->
get_name().getString();
2674 case V_SgPointerType:
2677 returnName =
"pointer_to_";
2678 returnName +=
get_name(pointerType->get_base_type());
2682 case V_SgReferenceType:
2685 returnName =
"reference_to_";
2686 returnName +=
get_name(referenceType->get_base_type());
2692 const SgArrayType* arrayType = isSgArrayType(type);
2693 returnName =
"array_of_";
2694 returnName +=
get_name(arrayType->get_base_type());
2698 case V_SgModifierType:
2702 returnName +=
get_name(modifierType->get_base_type());
2707 case V_SgTemplateType:
2710 returnName =
"templateType_";
2711 returnName += templateType->get_name();
2728 string name =
"undefined_name";
2736 name =
"var_ref_of_";
2737 ROSE_ASSERT(varRef != NULL);
2738 ROSE_ASSERT(varRef->get_symbol() != NULL);
2739 name += varRef->get_symbol()->
get_name();
2744 case V_SgLabelRefExp:
2747 name =
"label_ref_of_";
2748 ROSE_ASSERT(labelRef != NULL);
2749 ROSE_ASSERT(labelRef->get_symbol() != NULL);
2750 name += labelRef->get_symbol()->
get_name();
2754 case V_SgPntrArrRefExp:
2757 name =
"array_ref_of_";
2764 case V_SgFunctionCallExp:
2767 name =
"function_call_";
2768 name +=
get_name(functionCall->get_function());
2772 case V_SgFunctionRefExp:
2775 name =
"function_ref_";
2776 name += functionRefExp->get_symbol()->
get_name();
2781 case V_SgMemberFunctionRefExp:
2784 name =
"member_function_ref_";
2785 name += memberFunctionRefExp->get_symbol()->
get_name();
2791 const SgIntVal* valueExp = isSgIntVal(expr);
2792 name =
"integer_value_exp_";
2799 const SgStringVal* valueExp = isSgStringVal(expr);
2800 name =
"string_value_exp_";
2801 name += valueExp->get_value();
2805 case V_SgSubscriptExpression:
2808 name =
"subscript_exp_";
2810 name +=
get_name(subscriptExpression->get_lowerBound());
2813 name +=
get_name(subscriptExpression->get_upperBound());
2816 name +=
get_name(subscriptExpression->get_stride());
2820 case V_SgNullExpression:
2822 name =
"null_expression";
2827 case V_SgExprListExp:
2830 name =
"expr_list_exp_";
2831 for (
size_t i = 0; i < exprListExp->get_expressions().size(); i++)
2833 name +=
get_name(exprListExp->get_expressions()[i]);
2839 case V_SgActualArgumentExpression:
2842 name =
"actual_arg_exp_name_";
2843 name += actualArgExp->get_argument_name();
2845 name +=
get_name(actualArgExp->get_expression());
2850 case V_SgTemplateParameterVal:
2853 name =
"template_parameter_value_expression_number_";
2863 const SgDotExp* dotExp = isSgDotExp(expr);
2864 ROSE_ASSERT(dotExp != NULL);
2866 name =
"_dot_exp_lhs_";
2868 name +=
"_dot_exp_rhs_";
2877 const SgLambdaExp* lambdaExp = isSgLambdaExp(expr);
2878 ROSE_ASSERT (lambdaExp != NULL);
2879 name =
"lambda_expression_";
2886 const SgThisExp* thisExp = isSgThisExp(expr);
2887 ROSE_ASSERT(thisExp != NULL);
2889 name =
"_this_exp_for_";
2892 ROSE_ASSERT(classSymbol != NULL);
2905 printf (
"Note: default reached in get_name() expr = %p = %s \n",expr,expr->
class_name().c_str());
2924 ROSE_ASSERT(node != NULL);
2930 case V_SgRenamePair:
2933 returnName =
"rename_pair_";
2934 returnName += n->get_local_name().str();
2935 returnName +=
"_from_";
2936 returnName += n->get_use_name().str();
2940 case V_SgInitializedName:
2943 ROSE_ASSERT (n != NULL);
2944 returnName =
"initialized_name_";
2945 returnName += n->get_name().str();
2950 case V_SgLambdaCapture:
2953 ROSE_ASSERT (n != NULL);
2954 returnName =
"lambda_capture_";
2960 case V_SgInterfaceBody:
2963 returnName =
"interface_body";
2983 string name =
"undefined_name";
2985 ROSE_ASSERT(node != NULL);
2988 if (locatedNode != NULL)
2990 const SgStatement* statement = isSgStatement(node);
2991 if (statement != NULL)
2998 if (expression != NULL)
3005 if (locatedNodeSupport != NULL)
3007 name =
get_name(locatedNodeSupport);
3011 const SgToken* token = isSgToken(node);
3018 printf (
"Unknown SgLocatedNode = %p = %s \n",node,node->
class_name().c_str());
3027 const SgSupport* supportNode = isSgSupport(node);
3028 if (supportNode != NULL)
3035 const SgSymbol* symbol = isSgSymbol(node);
3043 const SgType* type = isSgType(node);
3064 string name =
"undefined_name";
3066 ROSE_ASSERT(token != NULL);
3067 name = token->get_lexeme_string();
3072 else if (name ==
"\n")
3074 else if (name ==
"\t")
3116 case V_SgClassDeclaration:
3117 case V_SgTemplateClassDeclaration:
3121 ROSE_ASSERT(classDeclaration != NULL);
3123 string type_name = classDeclaration->get_name();
3125 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier_support(): case class or template type: type_name = %s \n",type_name.c_str());
3127 string className = string(
"scope_") + scope +
"_type_name_" + type_name;
3129 printf (
"classDeclaration->get_scope() = %p = %s scope = %s \n",classDeclaration->
get_scope(),classDeclaration->
get_scope()->
class_name().c_str(),scope.c_str());
3136 case V_SgTemplateInstantiationDecl:
3139 ROSE_ASSERT(templateInstantiationDeclaration != NULL);
3145 string type_name = templateInstantiationDeclaration->get_name();
3147 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier_support(): case SgTemplateInstantiationDecl: type_name = %s \n",type_name.c_str());
3149 string className = string(
"scope_") + scope +
"_type_name_" + type_name;
3164 printf (
"className = %s compressedClassName = %s \n",className.c_str(),compressedClassName.c_str());
3167 printf (
"templateInstantiationDeclaration->get_scope() = %p = %s scope = %s \n",
3171 s = compressedClassName;
3173 printf (
"Exiting as a test! \n");
3179 case V_SgFunctionDeclaration:
3180 case V_SgTemplateFunctionDeclaration:
3181 case V_SgTemplateInstantiationFunctionDecl:
3184 ROSE_ASSERT(functionDeclaration != NULL);
3186 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier_support(): case SgFunctionDeclaration: not implemented \n");
3189 string original_name = functionDeclaration->get_name();
3191 string function_name_part = mangleFunctionName(original_name,
"return_type");
3192 string function_name = string(
"scope_") + scope +
"_function_name_" + function_name_part;
3206 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier(): Collision count = %d \n",count);
3213 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier(): case SgFunctionDeclaration: Exiting as a test! \n");
3219 case V_SgMemberFunctionDeclaration:
3220 case V_SgTemplateMemberFunctionDeclaration:
3221 case V_SgTemplateInstantiationMemberFunctionDecl:
3224 ROSE_ASSERT(memberFunctionDeclaration != NULL);
3226 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier_support(): case SgMemberFunctionDeclaration: not implemented \n");
3229 string original_name = memberFunctionDeclaration->get_name();
3235 string member_function_name_part = mangleFunctionName(original_name,
"return_type");
3237 string member_function_name = string(
"scope_") + scope +
"_member_function_name_" + member_function_name_part;
3251 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier(): Collision count = %d \n",count);
3256 s = member_function_name;
3258 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier(): case SgMemberFunctionDeclaration: Exiting as a test! \n");
3266 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier(): Unsupported declaration = %p = %s \n",declaration,declaration->
class_name().c_str());
3272 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier(): s = %s \n",s.c_str());
3277 printf (
"In SageInterface::generateUniqueNameForUseAsIdentifier(): s = %s \n",s.c_str());
3282 printf (
"Exiting as a test! \n");
3301 printf (
"In generateUniqueNameForUseAsIdentifier(): evaluating declaration = %p = %s \n",declaration,declaration->
class_name().c_str());
3314 if (definingDeclaration != NULL)
3317 printf (
"In generateUniqueName(): Using the defining declaration = %p since %p was not in the map \n",definingDeclaration,declaration);
3325 printf (
"Warning: defining declaration not in SageInterface::local_node_to_name_map: declaration = %p = %s using name = %s \n",
3332 ROSE_ASSERT(nondefiningDeclaration != NULL);
3338 printf (
"Exiting as a test! \n");
3349 ROSE_ASSERT(astNode != NULL);
3359 void visit (
SgNode* node)
3366 if (classDeclaration != NULL || functionDeclaration != NULL)
3377 UniqueNameTraversal traversal;
3378 traversal.traverse(astNode, preorder);
3388 ROSE_ASSERT(classDeclaration != NULL);
3390 ROSE_ASSERT(definingDeclaration != NULL);
3391 SgClassDeclaration* definingClassDeclaration = isSgClassDeclaration(definingDeclaration);
3395 if (definingClassDeclaration != NULL)
3397 SgClassDefinition* classDefinition = definingClassDeclaration->get_definition();
3398 ROSE_ASSERT(classDefinition != NULL);
3400 SgDeclarationStatementPtrList::iterator i = classDefinition->
get_members().begin();
3401 while ( i != classDefinition->
get_members().end() )
3404 ROSE_ASSERT( (*i)->get_parent() != NULL);
3405 ROSE_ASSERT( (*i)->get_parent() == classDefinition);
3408 if (memberFunction != NULL)
3411 if ( memberFunction->get_specialFunctionModifier().isConstructor() ==
true )
3412 defaultConstructor = memberFunction;
3423 return defaultConstructor;
3431 ROSE_ASSERT(classDeclaration != NULL);
3433 if (definingDeclaration != NULL)
3435 ROSE_ASSERT(definingDeclaration != NULL);
3436 SgClassDeclaration* definingClassDeclaration = isSgClassDeclaration(definingDeclaration);
3440 if (definingClassDeclaration != NULL)
3442 SgClassDefinition* classDefinition = definingClassDeclaration->get_definition();
3443 ROSE_ASSERT(classDefinition != NULL);
3445 SgDeclarationStatementPtrList::iterator i = classDefinition->
get_members().begin();
3446 while ( i != classDefinition->
get_members().end() )
3450 ROSE_ASSERT(i_parent != NULL);
3455 if ( i_parent != classDefinition )
3457 printf (
"Error: (*i)->get_parent() = %p = %s \n",i_parent,i_parent->
class_name().c_str());
3458 printf (
"(*i) = %p = %s = %s \n",*i,(*i)->class_name().c_str(),(*i)->unparseToString().c_str());
3459 (*i)->get_file_info()->display(
"Called from SageInterface::getDefaultDestructor: debug");
3461 ROSE_ASSERT( i_parent == classDefinition);
3464 if (memberFunction != NULL)
3466 if ( memberFunction->get_specialFunctionModifier().isDestructor() ==
true )
3467 defaultDestructor = memberFunction;
3476 return defaultDestructor;
3488#define DEBUG_ADD_DEFAULT_CONSTRUCTOR 0
3492 ASSERT_not_null(classType);
3494 bool returnValue =
false;
3497 SgClassDeclaration* classDeclaration = isSgClassDeclaration(classType->get_declaration());
3498 ROSE_ASSERT(classDeclaration != NULL);
3500 ROSE_ASSERT(definingClassDeclaration != NULL);
3501 SgClassDefinition* classDefinition = definingClassDeclaration->get_definition();
3502 ROSE_ASSERT(classDefinition != NULL);
3504 SgDeclarationStatementPtrList & declarationList = classDefinition->
get_members();
3506 bool foundConstructor =
false;
3507 bool foundDefaultConstructor =
false;
3509#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3510 printf (
"In addDefaultConstructorIfRequired(): class name = %s \n",classDeclaration->get_name().str());
3513 SgDeclarationStatementPtrList::iterator i = declarationList.begin();
3514 while (i != declarationList.end())
3517 if (memberFunctionDeclaration != NULL)
3519 bool isConstructor = memberFunctionDeclaration->get_specialFunctionModifier().isConstructor();
3520 if (isConstructor ==
true)
3522 foundConstructor =
true;
3524#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3525 printf (
"Found a constructor! \n");
3528 ROSE_ASSERT(functionParameterList != NULL);
3532 foundDefaultConstructor = ((foundDefaultConstructor ==
true) || (functionParameterList->
get_args().size() == 0));
3534#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3535 if (foundDefaultConstructor ==
true)
3537 printf (
"Found a default constructor! \n");
3541 printf (
"This is not a default constructor: functionParameterList->get_args().size() = %zu \n",functionParameterList->
get_args().size());
3547#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3548 printf (
"This is not a constructor \n");
3556#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3557 printf (
"foundConstructor = %s \n",foundConstructor ?
"true" :
"false");
3558 printf (
"foundDefaultConstructor = %s \n",foundDefaultConstructor ?
"true" :
"false");
3561 if (foundConstructor ==
true)
3564#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3565 printf (
"Since there is at least one constructor, we can't rely on compiler generated constructors \n");
3567 if (foundDefaultConstructor ==
true)
3570#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3571 printf (
"We can use the existing default constructor (no need to build one) \n");
3578#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3579 printf (
"########################################################### \n");
3580 printf (
"Need to build a default constructor in the associated class \n");
3583 ROSE_ASSERT(constructorDeclaration != NULL);
3585#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3586 printf (
" --- constructorDeclaration = %p = %s name = %s \n",constructorDeclaration,constructorDeclaration->
class_name().c_str(),constructorDeclaration->get_name().str());
3588 ROSE_ASSERT (constructorDeclaration->get_declarationModifier().get_accessModifier().isPublic() ==
true);
3590 classDefinition->prepend_statement(constructorDeclaration);
3593 ROSE_ASSERT(constructorDeclaration->
get_parent() != NULL);
3601 constructorDeclaration->
get_endOfConstruct ()->set_physical_file_id(physical_file_id);
3605 ROSE_ASSERT(constructorDeclaration->get_definition() != NULL);
3608 constructorDeclaration->get_definition()->
get_startOfConstruct()->set_physical_file_id(physical_file_id);
3609 constructorDeclaration->get_definition()->
get_endOfConstruct ()->set_physical_file_id(physical_file_id);
3612#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3613 printf (
"DONE: Need to build a default constructor in the associated class \n");
3614 printf (
"################################################################# \n");
3617 printf (
"Exiting as a test! \n");
3626#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3627 printf (
"No constructors found, so we don't need to add an explicit default constructor \n");
3631#if DEBUG_ADD_DEFAULT_CONSTRUCTOR
3632 printf (
"Leaving addDefaultConstructorIfRequired(): returnValue = %s \n",returnValue ?
"true" :
"false");
3664 astTraversal.
traverse(node,preorder);
3674 printf (
"Exiting as a test! \n");
3684 printf (
"Symbol Table from %p = %s at: \n",scope,scope->
sage_class_name());
3685 scope->
get_file_info()->display(
"Symbol Table Location (Called from SageInterface::OutputLocalSymbolTables::visit())");
3687 scope->print_symboltable(
"Called from SageInterface::OutputLocalSymbolTables::visit()");
3702 bool result =
false;
3717 bool result =
false;
3721 if (isTemplateMemberFunction(memberFunctionDeclaration) ==
true)
3724 printf (
"templateDeclaration = %p parent of templateDeclaration = %p \n",templateDeclaration,templateDeclaration->
get_parent());
3727 SgClassDeclaration* classDeclaration = memberFunctionDeclaration->get_class_scope()->get_declaration();
3728 ROSE_ASSERT(classDeclaration != NULL);
3731 if (classTemplateInstantiation != NULL)
3734 if (classTemplateDeclaration != NULL && classTemplateDeclaration != templateDeclaration)
3748 if (templateDeclaration != NULL && templateDeclaration->
get_parent() != NULL)
3751 if (isSgClassDefinition(parentScope) != NULL)
3764 printf (
"Error: This is no longer used. \n");
3777 if (firstNondefiningDeclaration != NULL)
3778 keyDeclaration = firstNondefiningDeclaration;
3780 keyDeclaration = definingDeclaration;
3781 ROSE_ASSERT(keyDeclaration != NULL);
3783 return keyDeclaration;
3789 string pragmaString = pragmaDeclaration->get_pragma()->get_pragma();
3790 istringstream istr(pragmaString);
3800 ROSE_ASSERT (n != NULL);
3801 bool result =
false;
3802 if (isSgOmpBarrierStatement(n)||
3803 isSgOmpBodyStatement(n)||
3804 isSgOmpDeclareSimdStatement(n) ||
3805 isSgOmpFlushStatement(n)||
3806 isSgOmpThreadprivateStatement(n)||
3807 isSgOmpTaskwaitStatement(n) )
3835 if (memberFunctionDeclaration != NULL)
3845 ROSE_ASSERT(scope != NULL);
3848 if (isSgDeclarationScope(scope)) {
3849 printf(
"TODO SageInterface::isOverloaded case when scope is SgDeclarationScope. See ROSE-1378.\n");
3855 isSgClassDefinition(memberFunctionDeclaration->
get_scope());
3856 ROSE_ASSERT(classDefinition != NULL);
3860 ROSE_ASSERT(classDeclaration != NULL);
3863 SgDeclarationStatementPtrList & memberList = classDefinition->
get_members();
3866 printf (
" memberList.size() = %" PRIuPTR
" \n",memberList.size());
3868 for (SgDeclarationStatementPtrList::iterator i = memberList.begin(); i != memberList.end(); i++)
3871 printf (
" counter = %d declaration = %p = %s \n",counter,*i,(*i)->class_name().c_str());
3877 if (tempMemberFunction != NULL)
3882 if ( keyDeclaration == generateUniqueDeclaration(tempMemberFunction) )
3885 printf (
"Skipping the case of keyDeclaration == generateUniqueDeclaration(tempMemberFunction) = %p \n",keyDeclaration);
3890 ROSE_ASSERT(tempMemberFunction->get_name() !=
"");
3892 printf (
" tempMemberFunction = (name) %s = (qualified) %s \n",
3893 tempMemberFunction->get_name().str(),
3894 tempMemberFunction->get_qualified_name().str());
3896 if (tempMemberFunction->get_name() == memberFunctionDeclaration->get_name())
3899 printf (
" Found a matching overloaded member function! \n");
3908 if (tempTemplateDeclaration != NULL)
3914 printf (
"tempTemplateDeclaration->get_name() = %s \n",tempTemplateDeclaration->
get_name().str());
3916 if (memberFunctionDeclaration->get_name() == tempTemplateDeclaration->
get_name())
3919 printf (
" Found a matching overloaded member function! \n");
3928 if (functionDeclaration->
variantT() == V_SgFunctionDeclaration)
3930 printf (
"In SageInterface::isOverloaded(): could friend functions be overloaded in a class? \n");
3943 printf (
"In SageInterface::isOverloaded(): case of non-member function not yet implemented! \n");
3950 return (counter > 1);
3965 ROSE_ASSERT(memberFunctionInstantiation != NULL);
3968 printf (
"buildForwardFunctionDeclaration: Member function = %p = %s = definition = %p \n",
3969 memberFunctionInstantiation,
3970 memberFunctionInstantiation->get_name().str(),
3971 memberFunctionInstantiation->get_definition());
3972 memberFunctionInstantiation->
get_file_info()->display(
"memberFunctionInstantiation: debug");
3978 class NondefiningFunctionDeclarationCopyType :
public SgCopyHelp
3988 SgNode* returnValue = NULL;
3996 case V_SgFunctionDeclaration:
3997 case V_SgMemberFunctionDeclaration:
3998 case V_SgTemplateInstantiationFunctionDecl:
3999 case V_SgTemplateInstantiationMemberFunctionDecl:
4003 ROSE_ASSERT(functionDeclaration != NULL);
4009 returnValue =
const_cast<SgNode *
>(n);
4021 case V_SgFunctionDefinition:
4023 printf (
"Skip copying the function definition if it is present \n");
4025 returnValue =
const_cast<SgNode *
>(n);
4039 if (returnValue == NULL)
4040 returnValue = n->copy(*
this);
4042 ROSE_ASSERT(returnValue != NULL);
4045 } nondefiningFunctionDeclarationCopy;
4050 if (memberFunctionInstantiation->get_definition() != NULL)
4052 printf (
"\n\nNEED TO REMOVE POINTERS IN THE NON-DEFINING DECLARATION TO THE SgClassDefinition objects. \n");
4057 memberFunctionInstantiation->set_definition(NULL);
4059 SgNode* copyOfMemberFunctionNode = memberFunctionInstantiation->copy(nondefiningFunctionDeclarationCopy);
4078 printf (
"copyOfMemberFunction->isForward() = %s \n",copyOfMemberFunction->
isForward() ?
"true" :
"false");
4079 printf (
"memberFunctionInstantiation->isForward() = %s \n",memberFunctionInstantiation->
isForward() ?
"true" :
"false");
4082 printf (
"memberFunctionInstantiation->isSpecialization() = %s \n",memberFunctionInstantiation->isSpecialization() ?
"true" :
"false");
4083 printf (
"copyOfMemberFunctionNode = %p = %s = %s memberFunctionInstantiation->isSpecialization() = %s \n",
4084 copyOfMemberFunction,copyOfMemberFunction->
class_name().c_str(),
SageInterface::get_name(copyOfMemberFunction).c_str(),copyOfMemberFunction->isSpecialization() ?
"true" :
"false");
4085 copyOfMemberFunction->
get_file_info()->display(
"copyOfMemberFunction: debug");
4089 ROSE_ASSERT(memberFunctionInstantiation->get_args().size() == copyOfMemberFunction->get_args().size());
4095 ROSE_ASSERT(copyOfMemberFunction != NULL);
4096 return copyOfMemberFunction;
4105 ROSE_ASSERT(declarationForType != NULL);
4108 switch(declarationForType->
variantT())
4111 case V_SgTemplateInstantiationDecl:
4112 case V_SgTemplateClassDeclaration:
4114 case V_SgClassDeclaration:
4119 if (isSgTemplateClassDeclaration(declarationForType) != NULL)
4128 ROSE_ASSERT(symbol != NULL);
4129 SgName name = classDeclaration->get_name();
4130 symbolTable->insert(name,symbol);
4134 case V_SgEnumDeclaration:
4138 ROSE_ASSERT(symbol != NULL);
4140 symbolTable->insert(name,symbol);
4144 case V_SgFunctionDeclaration:
4148 ROSE_ASSERT(symbol != NULL);
4149 SgName name = functionDeclaration->get_name();
4150 symbolTable->insert(name,symbol);
4154 case V_SgMemberFunctionDeclaration:
4158 ROSE_ASSERT(symbol != NULL);
4162 SgName name = functionDeclaration->get_name();
4163 symbolTable->insert(name,symbol);
4169 printf (
"Default reached in evaluation of typedef inner definition = %p = %s and building a symbol for it for the symbol table \n",declarationForType,declarationForType->
class_name().c_str());
4180 SgInitializedNamePtrList::iterator i = variableList.begin();
4181 while (i != variableList.end())
4185 if (
variable->get_scope() == scope)
4193 printf (
"WARNING: Scopes do NOT match! variable = %p = %s (could this be a static variable, or has the symbol table been setup before the scopes have been set?) \n",
variable,
variable->get_name().str());
4198 ROSE_ASSERT(symbol != NULL);
4200 symbolTable->insert(name,symbol);
4208SageInterface::supportForInitializedNameLists (
SgScopeStatement* scope, SgInitializedNamePtrList & variableList )
4211 ROSE_ASSERT(symbolTable != NULL);
4213 supportForVariableLists(scope,symbolTable,variableList);
4221 SgInitializedNamePtrList & variableList = variableDeclaration->
get_variables();
4222 supportForVariableLists(scope,symbolTable,variableList);
4230 ROSE_ASSERT(symbolTable != NULL);
4241 std::vector<SgNode*> labelList = NodeQuery::querySubTree (scope,V_SgLabelStatement);
4243 int numberOfLabels = labelList.size();
4244 for (
int i=0; i < numberOfLabels; i++)
4248 ROSE_ASSERT(labelStatement != NULL);
4249 ROSE_ASSERT(labelStatement->
get_scope() == scope);
4252 ROSE_ASSERT(symbol != NULL);
4256 SgName name = labelStatement->get_name();
4257 symbolTable->insert(name,symbol);
4267 ROSE_ASSERT(scope != NULL);
4269 printf (
"In SageInterface::rebuildSymbolTable(): Symbol Table from %p = %s \n",scope,scope->
class_name().c_str());
4272 printf (
"Exiting as a test \n");
4278 if (symbolTable != NULL)
4281 if (symbolTable->
size() != 0)
4283 printf (
"symbolTable->size() = %d \n",symbolTable->
size());
4285 ROSE_ASSERT(symbolTable->
size() == 0);
4287 printf (
"Symbol Table from %p = %s of size = %" PRIuPTR
" \n",scope,scope->
class_name().c_str(),symbolTable->
size());
4288 symbolTable->
print(
"Called from SageInterface::rebuildSymbolTable()");
4294 printf (
"In SageInterface::rebuildSymbolTable(): No symbol table found \n");
4296 ROSE_ASSERT(symbolTable == NULL);
4301 ROSE_ASSERT(symbolTable != NULL);
4302 ROSE_ASSERT(symbolTable->get_table() != NULL);
4306 ROSE_ASSERT(symbolTable->
get_parent() != NULL);
4319 case V_SgForStatement:
4326 SgStatementPtrList::iterator i = forStatement->get_init_stmt().begin();
4330 while (i != forStatement->get_init_stmt().end())
4334 if (variableDeclarationInitializer != NULL)
4339 supportForVariableDeclarations ( scope, symbolTable, variableDeclarationInitializer );
4345 SgVariableDeclaration* variableDeclarationCondition = isSgVariableDeclaration(forStatement->get_test());
4346 if (variableDeclarationCondition != NULL)
4351 supportForVariableDeclarations ( scope, symbolTable, variableDeclarationCondition );
4358 case V_SgJovialForThenStatement:
4359 case V_SgMatlabForStatement:
4367 case V_SgTemplateFunctionDefinition:
4369 case V_SgFunctionDefinition:
4376 if (functionDefinition != NULL)
4382 if (functionDeclaration != NULL)
4385 if (functionDeclaration->
isForward() ==
true)
4387 printf (
"ERROR: functionDeclaration = %p = %s = %s \n",functionDeclaration,functionDeclaration->
class_name().c_str(),functionDeclaration->get_name().str());
4388 printf (
" --- functionDeclaration (get_name()) = %s \n",
get_name(functionDeclaration).c_str());
4389 printf (
" --- functionDeclaration (mangled name) = %s \n",functionDeclaration->get_mangled_name().str());
4391 if (memberFunctionDeclaration != NULL)
4393 printf (
"memberFunctionDeclaration != NULL \n");
4396 ROSE_ASSERT(functionDeclaration->
isForward() ==
false);
4397 SgInitializedNamePtrList & argumentList = functionDeclaration->get_args();
4398 supportForVariableLists(scope,symbolTable,argumentList);
4411 supportForLabelStatements(scope,symbolTable);
4422 SgIfStmt* ifStatement = isSgIfStmt(scope);
4424 if (variableDeclarationCondition != NULL)
4429 supportForVariableDeclarations ( scope, symbolTable, variableDeclarationCondition );
4435 case V_SgSwitchStatement:
4442 if (variableDeclarationSelector != NULL)
4447 supportForVariableDeclarations ( scope, symbolTable, variableDeclarationSelector );
4459 SgWhileStmt* whileStatement = isSgWhileStmt(scope);
4461 if (variableDeclarationCondition != NULL)
4467 supportForVariableDeclarations ( scope, symbolTable, variableDeclarationCondition );
4473 case V_SgCatchOptionStmt:
4474 case V_SgDoWhileStmt:
4483 case V_SgTemplateClassDefinition:
4485 case V_SgBasicBlock:
4486 case V_SgClassDefinition:
4487 case V_SgTemplateInstantiationDefn:
4489 case V_SgNamespaceDefinitionStatement:
4497 case V_SgJavaForEachStatement:
4500 SgVariableDeclaration* variableDeclarationCondition = isSgVariableDeclaration(javaForEachStatement->get_element());
4501 if (variableDeclarationCondition != NULL)
4507 supportForVariableDeclarations ( scope, symbolTable, variableDeclarationCondition );
4515 printf (
"Default reached in SageInterface::rebuildSymbolTable() scope = %p = %s \n",scope,scope->
class_name().c_str());
4521 printf (
"In SageInterface::rebuildSymbolTable(): fixup declarations in Symbol Table from %p = %s \n",scope,scope->
class_name().c_str());
4529 for (SgStatementPtrList::iterator i = statementList.begin(); i != statementList.end(); i++)
4536 if (declaration != NULL)
4542 list<SgSymbol*> symbolList;
4545 case V_SgTemplateInstantiationMemberFunctionDecl:
4549 if (scope == derivedDeclaration->
get_scope())
4552 ROSE_ASSERT(symbol != NULL);
4558 SgName name = derivedDeclaration->get_name();
4559 symbolTable->insert(name,symbol);
4570 ROSE_ASSERT(derivedDeclarationScope != NULL);
4577 ROSE_ASSERT(templateDeclaration != NULL);
4585 SgType* functionType = templateDeclaration->get_type();
4586 SgTemplateParameterPtrList & templateParameterList = templateDeclaration->get_templateParameters();
4589 if (templateSymbol != NULL)
4593 printf (
"Building a symbol for derivedDeclaration = %p = %s to an alternative symbol table in derivedDeclarationScope = %p \n",
4594 derivedDeclaration,
get_name(derivedDeclaration).c_str(),derivedDeclarationScope);
4597 ROSE_ASSERT(symbol != NULL);
4598 SgName name = derivedDeclaration->get_name();
4610 case V_SgTemplateMemberFunctionDeclaration:
4612 case V_SgMemberFunctionDeclaration:
4617 if (scope == derivedDeclaration->
get_scope())
4621 if (isSgTemplateFunctionDeclaration(declaration) != NULL)
4626 ROSE_ASSERT(symbol != NULL);
4630 SgName name = derivedDeclaration->get_name();
4631 symbolTable->insert(name,symbol);
4642 case V_SgTemplateInstantiationFunctionDecl:
4646 if (scope == derivedDeclaration->
get_scope())
4649 ROSE_ASSERT(symbol != NULL);
4650 SgName name = derivedDeclaration->get_name();
4651 symbolTable->insert(name,symbol);
4655 if (derivedDeclaration->get_declarationModifier().
isFriend() ==
false)
4657#if PRINT_DEVELOPER_WARNINGS
4658 printf (
"Shouldn't this be a friend declaration = %p = %s \n",derivedDeclaration,derivedDeclaration->
class_name().c_str());
4667 case V_SgTemplateFunctionDeclaration:
4669 case V_SgFunctionDeclaration:
4675 if (useThisDeclaration ==
true)
4677 if (scope == derivedDeclaration->
get_scope())
4682 if (isSgTemplateFunctionDeclaration(declaration) != NULL)
4687 ROSE_ASSERT(symbol != NULL);
4688 SgName name = derivedDeclaration->get_name();
4689 symbolTable->insert(name,symbol);
4693 if (derivedDeclaration->get_declarationModifier().
isFriend() ==
false)
4695#if PRINT_DEVELOPER_WARNINGS
4696 printf (
"Shouldn't this be a friend declaration = %p = %s \n",derivedDeclaration,derivedDeclaration->
class_name().c_str());
4705 case V_SgTemplateVariableDeclaration:
4707 case V_SgVariableDeclaration:
4710 SgInitializedNamePtrList & variableList = derivedDeclaration->
get_variables();
4711 SgInitializedNamePtrList::iterator i = variableList.begin();
4712 while ( i != variableList.end() )
4718 if (
variable->get_scope() == scope)
4721 ROSE_ASSERT(symbol != NULL);
4726 symbolTable->insert(name,symbol);
4743 ROSE_ASSERT(symbolTable != NULL);
4752 case V_SgTemplateInstantiationDecl:
4759 if (scope == derivedDeclaration->
get_scope())
4763 ROSE_ASSERT(symbol != NULL);
4764 SgName name = derivedDeclaration->get_name();
4767 if (scope != derivedDeclaration->
get_scope())
4769 printf (
"Error: scopes don't match for derivedDeclaration = %p = %s \n",derivedDeclaration,derivedDeclaration->
class_name().c_str());
4771 ROSE_ASSERT(scope == derivedDeclaration->
get_scope());
4773 symbolTable->insert(name,symbol);
4779 if (derivedDeclaration->get_declarationModifier().
isFriend() ==
false)
4781#if PRINT_DEVELOPER_WARNINGS
4782 printf (
"Shouldn't this be a friend declaration = %p = %s \n",derivedDeclaration,derivedDeclaration->
class_name().c_str());
4788 ROSE_ASSERT(symbol != NULL);
4789 SgName name = derivedDeclaration->get_name();
4790 symbolTable->insert(name,symbol);
4797 case V_SgTemplateClassDeclaration:
4799 case V_SgClassDeclaration:
4803 if (scope == derivedDeclaration->
get_scope())
4806 if (isSgTemplateClassDeclaration(declaration) != NULL)
4811 ROSE_ASSERT(symbol != NULL);
4812 SgName name = derivedDeclaration->get_name();
4813 symbolTable->insert(name,symbol);
4817 if (derivedDeclaration->get_declarationModifier().
isFriend() ==
false)
4819#if PRINT_DEVELOPER_WARNINGS
4820 printf (
"Shouldn't this be a friend declaration = %p = %s \n",derivedDeclaration,derivedDeclaration->
class_name().c_str());
4826 ROSE_ASSERT(symbol != NULL);
4827 SgName name = derivedDeclaration->get_name();
4828 symbolTable->insert(name,symbol);
4833 case V_SgEnumDeclaration:
4836 ROSE_ASSERT(derivedDeclaration != NULL);
4838 ROSE_ASSERT(symbol != NULL);
4840 symbolTable->insert(name,symbol);
4843 SgInitializedNamePtrList & enumFieldList = derivedDeclaration->
get_enumerators();
4844 SgInitializedNamePtrList::iterator i = enumFieldList.begin();
4847 while (i != enumFieldList.end())
4850 ROSE_ASSERT(enum_field_symbol != NULL);
4851 SgName enum_field_name = (*i)->get_name();
4852 symbolTable->insert(enum_field_name,enum_field_symbol);
4862 case V_SgTemplateTypedefDeclaration:
4864 case V_SgTypedefDeclaration:
4868 ROSE_ASSERT(symbol != NULL);
4869 SgName name = derivedDeclaration->get_name();
4870 symbolTable->insert(name,symbol);
4872 printf (
"In SageInterface::rebuildSymbolTable(): case of SgTypedefDeclaration \n");
4877 if (derivedDeclaration->get_typedefBaseTypeContainsDefiningDeclaration() ==
true)
4880 ROSE_ASSERT(symbolTable != NULL);
4883 printf (
"In SageInterface::rebuildSymbolTable(): case of SgTypedefDeclaration: typedefBaseTypeContainsDefiningDeclaration == true calling supportForBaseTypeDefiningDeclaration() \n");
4891 if (declaration != NULL)
4894 printf (
"In SageInterface::rebuildSymbolTable(): case of SgTypedefDeclaration: typedefBaseTypeContainsDefiningDeclaration == false calling supportForBaseTypeDefiningDeclaration() \n");
4899 printf (
"In SageInterface::rebuildSymbolTable(): case of SgTypedefDeclaration: typedefBaseTypeContainsDefiningDeclaration == false: skipping call to supportForBaseTypeDefiningDeclaration() \n");
4903 printf (
"In SageInterface::rebuildSymbolTable(): Leaving case of SgTypedefDeclaration \n");
4908 case V_SgTemplateDeclaration:
4914 printf (
"case V_SgTemplateDeclaration: derivedDeclaration = %p \n",derivedDeclaration);
4915 printf (
"case V_SgTemplateDeclaration: derivedDeclaration->get_declarationModifier().isFriend() = %s \n",derivedDeclaration->get_declarationModifier().
isFriend() ?
"true" :
"false");
4916 printf (
"case V_SgTemplateDeclaration: derivedDeclaration->get_name() = %s \n",derivedDeclaration->
get_name().str());
4917 printf (
"case V_SgTemplateDeclaration: derivedDeclaration->get_string() = %s \n",derivedDeclaration->
get_string().str());
4919 if (scope == derivedDeclaration->
get_scope())
4922 ROSE_ASSERT(symbol != NULL);
4924 symbolTable->insert(name,symbol);
4928 if (derivedDeclaration->get_declarationModifier().
isFriend() ==
false)
4930#if PRINT_DEVELOPER_WARNINGS
4931 printf (
"Shouldn't this be a friend declaration = %p = %s \n",derivedDeclaration,derivedDeclaration->
class_name().c_str());
4938 ROSE_ASSERT(symbol != NULL);
4940 symbolTable->insert(name,symbol);
4947 case V_SgNamespaceAliasDeclarationStatement:
4950 ROSE_ASSERT(aliasDeclaration != NULL);
4954 ROSE_ASSERT(derivedDeclaration != NULL);
4958 ROSE_ASSERT(symbol != NULL);
4960 symbolTable->insert(name,symbol);
4968 case V_SgNamespaceDeclarationStatement:
4971 ROSE_ASSERT(derivedDeclaration != NULL);
4975 ROSE_ASSERT(symbol != NULL);
4977 symbolTable->insert(name,symbol);
4983 case V_SgUsingDirectiveStatement:
4984 case V_SgPragmaDeclaration:
4985 case V_SgTemplateInstantiationDirectiveStatement:
4986 case V_SgUsingDeclarationStatement:
4990 printf (
"This declaration is ignored in rebuilding symbol table %p = %s = %s \n",*i,(*i)->class_name().c_str(),
get_name(*i).c_str());
4999 printf (
"An ASM statement (SgAsmStmt) declaration is not really a declaration %p = %s = %s \n",*i,(*i)->class_name().c_str(),
get_name(*i).c_str());
5005 case V_SgVariableDefinition:
5006 case V_SgFunctionParameterList:
5007 case V_SgCtorInitializerList:
5010 printf (
"Special cases not handled %p = %s = %s \n",*i,(*i)->class_name().c_str(),
get_name(*i).c_str());
5014 case V_SgStaticAssertionDeclaration:
5018 printf (
"A static assertion statement (SgStaticAssertionDeclaration) declaration is not really a declaration %p = %s = %s \n",*i,(*i)->class_name().c_str(),
get_name(*i).c_str());
5025 printf (
"Error: Default reached in rebuildSymbolTable declaration = %p = %s \n",declaration,declaration->
class_name().c_str());
5030 ROSE_ASSERT(symbolTable != NULL);
5031 ROSE_ASSERT(symbolTable->get_table() != NULL);
5037 ROSE_ASSERT(symbolTable != NULL);
5038 ROSE_ASSERT(symbolTable->get_table() != NULL);
5041 printf (
"Leaving SageInterface::rebuildSymbolTable(): fixup declarations in Symbol Table from %p = %s \n",scope,scope->
class_name().c_str());
5045 printf (
"Symbol Table from %p = %s at: \n",scope,scope->
class_name().c_str());
5047 symbolTable->
print(
"Called from SageInterface::rebuildSymbolTable()");
5062#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
5063 ROSE_ASSERT(this_scope != NULL);
5064 ROSE_ASSERT(copy_scope != NULL);
5067 printf (
"In fixupReferencesToSymbols(this_scope = %p = %s = %s, copy_scope = %p = %s = %s) \n",
5075 printf (
"Before fixup: this scope = %p = %s this_symbolTable->get_table()->size() = %" PRIuPTR
" \n",this_scope,this_scope->
class_name().c_str(),this_symbolTable->get_table()->size());
5076 printf (
"Before fixup: copy scope = %p = %s copy_symbolTable->get_table()->size() = %" PRIuPTR
" \n",copy_scope,copy_scope->
class_name().c_str(),copy_symbolTable->get_table()->size());
5082 if (this_symbolTable->get_table()->size() != copy_symbolTable->get_table()->size())
5086 printf (
"Before fixup: this scope = %p = %s this_symbolTable->get_table()->size() = %" PRIuPTR
" \n",this_scope,this_scope->
class_name().c_str(),this_symbolTable->get_table()->size());
5087 printf (
"Before fixup: copy scope = %p = %s copy_symbolTable->get_table()->size() = %" PRIuPTR
" \n",copy_scope,copy_scope->
class_name().c_str(),copy_symbolTable->get_table()->size());
5088 printf (
"Warning the symbols tables in these different scopes are different sizes \n");
5093 SgSymbolTable::hash_iterator i = this_symbolTable->get_table()->begin();
5096 std::map<SgNode*, SgNode*> replacementMap;
5098 while (i != this_symbolTable->get_table()->end())
5100 ROSE_ASSERT ( isSgSymbol( (*i).second ) != NULL );
5102 SgName name = (*i).first;
5105 ROSE_ASSERT ( symbol != NULL );
5107 SgSymbol* associated_symbol = NULL;
5109 printf (
"Symbol number: %d (pair.first (SgName) = %s) pair.second (SgSymbol) = %p sage_class_name() = %s \n",counter,i->first.str(),i->second,i->second->class_name().c_str());
5112 SgSymbolTable::hash_iterator associated_symbol_iterator = copy_symbolTable->get_table()->find(name);
5117 while (associated_symbol_iterator != copy_symbolTable->get_table()->end() && associated_symbol_iterator->first == name)
5119 if ( associated_symbol_iterator->second->variantT() == symbol->
variantT() )
5121 associated_symbol = associated_symbol_iterator->second;
5124 associated_symbol_iterator++;
5127 if (associated_symbol != NULL)
5129 ROSE_ASSERT ( associated_symbol != NULL );
5132 ROSE_ASSERT(copy_scope->symbol_exists(associated_symbol) ==
true);
5137 replacementMap.insert(pair<SgNode*,SgNode*>(symbol,associated_symbol));
5144 help.get_copiedNodeMap().insert(pair<const SgNode*,SgNode*>(symbol,associated_symbol));
5151 printf (
"Warning: Symbol number: %d (pair.first (SgName) = %s) pair.second (SgSymbol) = %p sage_class_name() = %s \n",counter,i->first.str(),i->second,i->second->class_name().c_str());
5152 printf (
"Warning: associated_symbol == NULL, need to investigate this (ignoring for now) \n");
5162 printf (
"\n\n************************************************************\n");
5163 printf (
"fixupReferencesToSymbols(this_scope = %p copy_scope = %p = %s = %s): calling Utils::edgePointerReplacement() \n",this_scope,copy_scope,copy_scope->
class_name().c_str(),
get_name(copy_scope).c_str());
5169 printf (
"fixupReferencesToSymbols(): calling Utils::edgePointerReplacement(): DONE \n");
5170 printf (
"************************************************************\n\n");
5172 printf (
"\n\n After replacementMapTraversal(): intermediateDeleteSet: \n");
5173 displaySet(intermediateDeleteSet,
"After Utils::edgePointerReplacement");
5175 printf (
"After fixup: this_symbolTable->get_table()->size() = %" PRIuPTR
" \n",this_symbolTable->get_table()->size());
5176 printf (
"After fixup: copy_symbolTable->get_table()->size() = %" PRIuPTR
" \n",copy_symbolTable->get_table()->size());
5185 printf (
"Exiting as a test in fixupReferencesToSymbols() \n");
5201 vector<SgFile*> fileList;
5202 void visit (
SgNode* node)
5204 SgFile* file = isSgFile(node);
5205 ROSE_ASSERT(file != NULL);
5208 fileList.push_back(file);
5212 virtual ~FileTraversal() {}
5215 FileTraversal fileTraversal;
5220#ifdef ROSE_ENABLE_BINARY_ANALYSIS
5231 return fileTraversal.fileList;
5249 void visit (
SgNode* node)
5251 project = isSgProject(node);
5252 ROSE_ASSERT(project!= NULL);
5254 virtual ~ProjectTraversal() {}
5257 ProjectTraversal projectTraversal;
5259 return projectTraversal.project;
5261 std::vector<SgProject* > resultlist = getSgNodeListFromMemoryPool<SgProject>();
5262 if (resultlist.empty())
5264 ROSE_ASSERT(resultlist.size()==1);
5265 return resultlist[0];
5270 return getEnclosingNode<SgProject>(node,
true );
5275 if (isSgFunctionRefExp(func))
5277 return isSgFunctionRefExp(func)->get_symbol()->get_declaration();
5279 else if (isSgDotExp(func) || isSgArrowExp(func))
5282 if (isSgMemberFunctionRefExp(func2))
5283 return isSgMemberFunctionRefExp(func2)->get_symbol()->get_declaration();
5286 cerr<<
"Warning in SageInterface::getDeclarationOfNamedFunction(): rhs operand of dot or arrow operations is not a member function, but a "<<func2->
class_name()<<endl;
5295 const SgExpressionPtrList& ls = el->get_expressions();
5296 if (ls.empty())
return 0;
5297 if (isSgAssignOp(ls.back()))
return 0;
5304 ASSERT_not_null(astNode);
5305 Rose_STL_Container<SgNode*> arr_exp_list = NodeQuery::querySubTree(astNode,V_SgPntrArrRefExp);
5306 for (
SgNode* expr : arr_exp_list)
5309 ASSERT_not_null(arr_exp);
5310 Rose_STL_Container<SgNode*> refList = NodeQuery::querySubTree(arr_exp->
get_lhs_operand(),V_SgVarRefExp);
5311 for (
SgNode* ref : refList)
5314 ASSERT_not_null(cur_ref);
5316 ASSERT_not_null(sym);
5318 ASSERT_not_null(iname);
5319 SgArrayType * a_type = isSgArrayType(iname->get_typeptr());
5320 if (a_type && a_type->get_dim_info())
5322 Rose_STL_Container<SgNode*> dim_ref_list = NodeQuery::querySubTree(a_type->get_dim_info(),V_SgVarRefExp);
5323 for (Rose_STL_Container<SgNode*>::iterator iter2 = dim_ref_list.begin(); iter2 != dim_ref_list.end(); iter2++)
5326 NodeList_t.push_back(dim_ref);
5336#if (INLINE_OPTIMIZED_IS_LANGUAGE_KIND_FUNCTIONS == 0)
5340#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5342 return Rose::is_Ada_language;
5344 bool returnValue =
false;
5348 int size = (int)fileList.size();
5349 for (
int i = 0; i < size; i++)
5351 if (fileList[i]->get_Ada_only() ==
true)
5362#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5364 return Rose::is_C_language;
5366 bool returnValue =
false;
5370 int size = (int)fileList.size();
5371 for (
int i = 0; i < size; i++)
5373 if (fileList[i]->get_C_only() ==
true)
5384#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5386 return Rose::is_OpenMP_language;
5388 bool returnValue =
false;
5392 int size = (int)fileList.size();
5393 for (
int i = 0; i < size; i++)
5395 if (fileList[i]->get_openmp() ==
true)
5406#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5408 return Rose::is_UPC_language;
5410 bool returnValue =
false;
5414 int size = (int)fileList.size();
5415 for (
int i = 0; i < size; i++)
5417 if (fileList[i]->get_UPC_only() ==
true)
5429#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5431 return Rose::is_CAF_language;
5433 bool returnValue =
false;
5437 int size = (int)fileList.size();
5438 for (
int i = 0; i < size; i++)
5440 if (fileList[i]->get_CoArrayFortran_only()==
true)
5453#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5455 return Rose::is_UPC_dynamic_threads;
5457 bool returnValue =
false;
5461 int size = (int)fileList.size();
5462 for (
int i = 0; i < size; i++)
5464 if (fileList[i]->get_upc_threads() > 0)
5477#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5479 return Rose::is_C99_language;
5481 bool returnValue =
false;
5485 int size = (int)fileList.size();
5486 for (
int i = 0; i < size; i++)
5488 if (fileList[i]->get_C99_only() ==
true)
5499#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5501 return Rose::is_Cxx_language;
5503 bool returnValue =
false;
5507 int size = (int)fileList.size();
5508 for (
int i = 0; i < size; i++)
5511 if (fileList[i]->get_Cxx_only() ==
true)
5513 ROSE_ASSERT(fileList[i]->get_Fortran_only() ==
false && fileList[i]->get_C99_only() ==
false && fileList[i]->get_C_only() ==
false && fileList[i]->get_binary_only() ==
false);
5526#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5528 return Rose::is_Java_language;
5530 bool returnValue =
false;
5534 int size = (int)fileList.size();
5535 for (
int i = 0; i < size; i++)
5537 if (fileList[i]->get_Java_only() ==
true)
5548#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5550 return Rose::is_Jvm_language;
5552 bool returnValue =
false;
5556 int size = (int)fileList.size();
5557 for (
int i = 0; i < size; i++)
5559 if (fileList[i]->get_Jvm_only() ==
true)
5571#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5573 return Rose::is_Jovial_language;
5575 bool returnValue =
false;
5579 int size = (int)fileList.size();
5580 for (
int i = 0; i < size; i++)
5582 if (fileList[i]->get_Jovial_only() ==
true)
5594#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5596 return Rose::is_Fortran_language;
5598 bool returnValue =
false;
5602 int size = (int)fileList.size();
5603 for (
int i = 0; i < size; i++)
5605 if (fileList[i]->get_Fortran_only() ==
true)
5617#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5619 return Rose::is_binary_executable;
5621 bool returnValue =
false;
5625 int size = (int)fileList.size();
5626 for (
int i = 0; i < size; i++)
5628 if (fileList[i]->get_binary_only() ==
true)
5639#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5641 return Rose::is_PHP_language;
5643 bool returnValue =
false;
5647 int size = (int)fileList.size();
5648 for (
int i = 0; i < size; i++)
5650 if (fileList[i]->get_PHP_only() ==
true)
5661#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5663 return Rose::is_Python_language;
5665 bool returnValue =
false;
5669 int size = (int)fileList.size();
5670 for (
int i = 0; i < size; i++)
5672 if (fileList[i]->get_Python_only() ==
true)
5683#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5685 return Rose::is_Cuda_language;
5687 bool returnValue =
false;
5691 int size = (int)fileList.size();
5692 for (
int i = 0; i < size; i++)
5694 if (fileList[i]->get_Cuda_only() ==
true)
5705#if OPTIMIZE_IS_LANGUAGE_KIND_FUNCTIONS
5707 return Rose::is_OpenCL_language;
5709 bool returnValue =
false;
5713 int size = (int)fileList.size();
5714 for (
int i = 0; i < size; i++)
5716 if (fileList[i]->get_OpenCL_only() ==
true)
5764 ASSERT_not_null(functionDefinition);
5765 std::map<SgNode*,int> & scopeMap = functionDefinition->get_scope_number_list();
5768 scopeMap.erase(scopeMap.begin(),scopeMap.end());
5770 ASSERT_require(scopeMap.empty() ==
true);
5771 ASSERT_require(functionDefinition->get_scope_number_list().empty() ==
true);
5781 ROSE_ASSERT(functionDefinition != NULL);
5784 ROSE_ASSERT(functionDefinition->get_scope_number_list().empty() ==
true);
5790 ScopeNumberingTraversal() : count (0), storedFunctionDefinition(NULL) {}
5791 void visit (
SgNode* node)
5798 if (testFunctionDefinition != NULL && storedFunctionDefinition == NULL)
5800 ROSE_ASSERT(storedFunctionDefinition == NULL);
5801 storedFunctionDefinition = testFunctionDefinition;
5805 ROSE_ASSERT(storedFunctionDefinition != NULL);
5809 std::map<SgNode*,int> & scopeMap = storedFunctionDefinition->get_scope_number_list();
5810 scopeMap.insert(pair<SgNode*,int>(scope,count));
5812 string functionName = storedFunctionDefinition->get_declaration()->get_name().str();
5813 printf (
"In function = %s insert scope = %p = %s with count = %d into local map (size = %d) \n",
5814 functionName.c_str(),scope,scope->
class_name().c_str(),count,scopeMap.size());
5825 ScopeNumberingTraversal traversal;
5826 traversal.traverse(functionDefinition, preorder);
5840 ROSE_ASSERT(globalScope != NULL);
5841 std::map<SgNode*,std::string> & mangledNameCache = globalScope->get_mangledNameCache();
5844 mangledNameCache.erase(mangledNameCache.begin(),mangledNameCache.end());
5846 ROSE_ASSERT(mangledNameCache.empty() ==
true);
5847 ROSE_ASSERT(globalScope->get_mangledNameCache().empty() ==
true);
5855 ROSE_ASSERT(globalScope != NULL);
5856 ROSE_ASSERT(globalScope->get_mangledNameCache().empty() ==
true);
5862 MangledNameTraversal() : storedGlobalScope(NULL) {}
5863 void visit (
SgNode* node)
5866 if ( (mangleableNode != NULL) || (isSgGlobal(node) != NULL) )
5869 SgGlobal* testGlobalScope = isSgGlobal(mangleableNode);
5870 if (testGlobalScope != NULL && storedGlobalScope == NULL)
5872 ROSE_ASSERT(storedGlobalScope == NULL);
5873 storedGlobalScope = testGlobalScope;
5877 ROSE_ASSERT(storedGlobalScope != NULL);
5879 string mangledName = mangleableNode->get_mangled_name();
5882 std::map<SgNode*,std::string> & mangledNameCache = storedGlobalScope->get_mangledNameCache();
5883 mangledNameCache.insert(pair<SgNode*,std::string>(mangleableNode,mangledName));
5885 string nodeName =
get_name(mangleableNode);
5886 printf (
"At node = %p = %s = %s in local map (size = %d) \n",
5887 mangleableNode,mangleableNode->
class_name().c_str(),nodeName.c_str(),mangledNameCache.size());
5897 MangledNameTraversal traversal;
5898 traversal.traverse(globalScope, preorder);
5910 SgGlobal* globalScope = isSgGlobal(astNode);
5912 if (globalScope == NULL && isSgFile(astNode) != NULL)
5914 globalScope = isSgFile(astNode)->get_globalScope();
5915 ROSE_ASSERT(globalScope != NULL);
5918 if (globalScope == NULL && isSgProject(astNode) != NULL)
5921 ROSE_ASSERT( isSgProject(astNode)->get_fileList()->size() == 1 );
5922 globalScope = isSgProject(astNode)->get_fileList()->operator[](0)->get_globalScope();
5923 ROSE_ASSERT(globalScope != NULL);
5927 while (temp->
get_parent() != NULL && globalScope == NULL)
5930 globalScope = isSgGlobal(temp);
5932 ROSE_ASSERT(globalScope != NULL);
5939 std::map<SgNode*,std::string>::iterator i = mangledNameCache.find(astNode);
5942 if (i != mangledNameCache.end())
5946 mangledName = i->second;
5957#define DEBUG_SAGE_INTERFACE_ADD_MANGLED_TO_CACHE 0
5958#define DEBUG_MANGLED_SHORTNAME 1
5967#if DEBUG_SAGE_INTERFACE_ADD_MANGLED_TO_CACHE
5968 printf (
"In SageInterface::addMangledNameToCache(): TOP: astNode = %p = %s oldMangledName = %s \n",astNode,astNode->
class_name().c_str(),oldMangledName.c_str());
5972#ifdef DEBUG_MANGLED_SHORTNAME
5973 static std::unordered_map<uint64_t, std::string> mangledNameHashCollisionCheckMap;
5978 SgGlobal* globalScope = isSgGlobal(astNode);
5980 if (globalScope == NULL && isSgFile(astNode) != NULL)
5982 globalScope = isSgFile(astNode)->get_globalScope();
5983 ROSE_ASSERT(globalScope != NULL);
5986 if (globalScope == NULL && isSgProject(astNode) != NULL)
5989 ROSE_ASSERT( isSgProject(astNode)->get_fileList()->size() == 1 );
5990 globalScope = isSgProject(astNode)->get_fileList()->operator[](0)->get_globalScope();
5991 ROSE_ASSERT(globalScope != NULL);
5995 while (temp->
get_parent() != NULL && globalScope == NULL)
5998 globalScope = isSgGlobal(temp);
6000 ROSE_ASSERT(globalScope != NULL);
6005 std::string mangledName;
6007 if (SgProject::get_mangled_noshortname() ==
false) {
6010 if (oldMangledName.size() > 40) {
6011 std::map<std::string, uint64_t>::const_iterator shortMNIter = shortMangledNameCache.find(oldMangledName);
6012 uint64_t idNumber = 0;
6013 if (shortMNIter != shortMangledNameCache.end())
6015 idNumber = shortMNIter->second;
6017#ifdef DEBUG_MANGLED_SHORTNAME
6019 auto collisionIt = mangledNameHashCollisionCheckMap.find(idNumber);
6020 if(collisionIt != mangledNameHashCollisionCheckMap.end() &&
6021 oldMangledName != shortMNIter->first)
6023 mlog[Sawyer::Message::Common::ERROR] <<
" Got a short mangled name collision. \n "<<
6024 oldMangledName <<
" and \n " << shortMNIter->first <<
" \n" <<
6028 mangledNameHashCollisionCheckMap[idNumber] = oldMangledName;
6036 hasher.
insert(oldMangledName);
6039 shortMangledNameCache.insert(std::pair<std::string, uint64_t>(oldMangledName, idNumber));
6042 std::ostringstream mn;
6044 mangledName = mn.str();
6046 mangledName = oldMangledName;
6057 static unsigned long counter = 0;
6061 if (counter++ % 500 == 0)
6063 printf (
"WARNING: In SageInterface::addMangledNameToCache(): Using longer forms of mangled names (can cause some function names with embedded special characters to fail; test2004_141.C) \n");
6065 mangledName = oldMangledName;
6072 printf (
"Updating mangled name cache for node = %p = %s with mangledName = %s \n",astNode,astNode->
class_name().c_str(),mangledName.c_str());
6075#ifdef ROSE_DEBUG_NEW_EDG_ROSE_CONNECTION
6081 printf (
"Warning: SageInterface::addMangledNameToCache(): In it might be premature to add this IR node and name to the mangledNameCache: statement = %p = %s oldMangledName = %s \n",
6082 statement,statement->
class_name().c_str(),oldMangledName.c_str());
6087 mangledNameCache.insert(pair<SgNode*,string>(astNode,mangledName));
6089#if DEBUG_SAGE_INTERFACE_ADD_MANGLED_TO_CACHE
6090 printf (
"In SageInterface::addMangledNameToCache(): returning mangledName = %s \n",mangledName.c_str());
6114 : storedNondefiningDeclaration(nonDefiningDeclaration),
6115 storedDefiningDeclaration(definingDeclaration)
6117 storedDeclarationFound =
false;
6118 nonDefiningDeclarationPreceedsDefiningDeclaration =
false;
6121 void visit (
SgNode* node)
6123 ROSE_ASSERT(storedNondefiningDeclaration != NULL);
6124 ROSE_ASSERT(storedDefiningDeclaration != NULL);
6125 ROSE_ASSERT(storedNondefiningDeclaration != storedDefiningDeclaration);
6133 if ( declaration != NULL )
6135 if (storedDeclarationFound ==
false)
6137 if (declaration == storedDefiningDeclaration)
6139 storedDeclarationFound =
true;
6140 nonDefiningDeclarationPreceedsDefiningDeclaration =
false;
6142 if (declaration == storedNondefiningDeclaration)
6144 storedDeclarationFound =
true;
6145 nonDefiningDeclarationPreceedsDefiningDeclaration =
true;
6152 bool storedDeclarationFound;
6153 bool nonDefiningDeclarationPreceedsDefiningDeclaration;
6160 ROSE_ASSERT(nonDefiningDeclaration != NULL);
6162 printf (
"In SageInterface::declarationPreceedsDefinition(): \n");
6163 printf (
" nondefiningDeclaration = %p = %s \n",nonDefiningDeclaration,nonDefiningDeclaration->
class_name().c_str());
6164 nonDefiningDeclaration->
get_file_info()->display(
"nonDefiningDeclaration");
6165 printf (
" nondefiningDeclaration->get_definingDeclaration() = %p \n",nonDefiningDeclaration->
get_definingDeclaration());
6166 printf (
" definingDeclaration = %p = %s \n",definingDeclaration,definingDeclaration->
class_name().c_str());
6167 definingDeclaration->
get_file_info()->display(
"definingDeclaration");
6168 printf (
"************************************************************* \n");
6175 printf (
"In SageInterface::declarationPreceedsDefinition() (warning): \n");
6176 printf (
" nondefiningDeclaration = %p \n",nonDefiningDeclaration);
6177 printf (
" nondefiningDeclaration->get_definingDeclaration() = %p \n",nonDefiningDeclaration->
get_definingDeclaration());
6178 printf (
" definingDeclaration = %p \n",definingDeclaration);
6183 bool returnResult =
false;
6184 if (nonDefiningDeclaration != definingDeclaration)
6187 SgGlobal* globalScope = TransformationSupport::getGlobalScope(definingDeclaration);
6188 ROSE_ASSERT(globalScope != NULL);
6191 DeclarationOrderTraversal traversal (nonDefiningDeclaration,definingDeclaration);
6194 traversal.traverse(globalScope, preorder);
6197 printf (
"Skipping traversal within SageInterface::declarationPreceedsDefinition() \n");
6198 traversal.storedDeclarationFound =
true;
6199 traversal.nonDefiningDeclarationPreceedsDefiningDeclaration =
false;
6206 if (traversal.storedDeclarationFound ==
false)
6209 printf (
"In SageInterface::declarationPreceedsDefinition(): warning, nonDefiningDeclaration not found in the AST \n");
6210 nonDefiningDeclaration->
get_file_info()->display(
"nonDefiningDeclaration");
6211 definingDeclaration->
get_file_info()->display(
"definingDeclaration");
6212 printf (
"---------------------------------------------------- \n\n");
6216 returnResult =
true;
6220 returnResult = traversal.nonDefiningDeclarationPreceedsDefiningDeclaration;
6226 printf (
"returnResult = %s \n",returnResult ?
"true" :
"false");
6227 printf (
"************************************************************* \n\n");
6229 return returnResult;
6246 : storedFunctionCall(functionCall)
6248 ROSE_ASSERT(functionCall != NULL);
6249 ROSE_ASSERT(functionCall->get_function() != NULL);
6250 SgExpression* functionExpression = functionCall->get_function();
6252 switch (functionExpression->
variantT())
6258 case V_SgArrowStarOp:
6259 case V_SgPointerDerefExp:
6262 printf (
"These are the acceptable cases, but not handled yet... \n");
6266 case V_SgFunctionRefExp:
6269 ROSE_ASSERT(functionRefExp != NULL);
6271 ROSE_ASSERT(functionSymbol != NULL);
6274 ROSE_ASSERT(functionSymbol->get_declaration() != NULL);
6275 storedFunctionDeclaration = functionSymbol->get_declaration();
6279 case V_SgMemberFunctionRefExp:
6282 ROSE_ASSERT(memberFunctionRefExp != NULL);
6284 ROSE_ASSERT(memberFunctionSymbol != NULL);
6286 storedFunctionDeclaration = memberFunctionSymbol->get_declaration();
6288 printf (
"V_SgMemberFunctionRefExp case not handled yet... \n");
6294 printf (
"default reached in SageInterface::functionCallExpressionPreceedsDeclarationWhichAssociatesScope() functionExpression = %s \n",
6302 ROSE_ASSERT(storedFunctionDeclaration != NULL);
6304 storedFunctionCallFound =
false;
6308 void visit (
SgNode* node)
6310 ROSE_ASSERT(storedFunctionCall != NULL);
6311 ROSE_ASSERT(storedFunctionDeclaration != NULL);
6314 if (storedFunctionCallFound ==
false)
6317 if ( functionCall != NULL )
6319 if (functionCall == storedFunctionCall)
6321 storedFunctionCallFound =
true;
6331 ROSE_ASSERT(storedFunctionDeclaration != NULL);
6344 storedFunctionCallFound =
true;
6350 printf (
"Found a declaration which preceeds the function \n");
6351 declaration->
get_file_info()->display(
"Found a declaration which preceeds the function: declaration");
6352 storedFunctionCall->get_file_info()->display(
"Found a declaration which preceeds the function: storedFunctionCall");
6353 storedFunctionDeclaration->get_file_info()->display(
"Found a declaration which preceeds the function: storedFunctionDeclaration");
6359 if (parentScopeOfDeclaration == NULL)
6362 printf (
"Strange case of parentScopeOfDeclaration == NULL in SageInterface::functionCallExpressionPreceedsDeclarationWhichAssociatesScope() \n");
6364 if (parent != NULL) {
6365 printf (
"declaration->get_parent() = %s \n",parent->
class_name().c_str());
6368 printf (
"declaration->get_parent() = NULL \n");
6370 declaration->
get_file_info()->display(
"case of parentScopeOfDeclaration == NULL");
6379 bool storedFunctionCallFound;
6387 ROSE_ASSERT(functionCall != NULL);
6389 printf (
"In SageInterface::functionCallExpressionPreceedsDeclarationWhichAssociatesScope(): \n");
6390 printf (
" storedFunctionCall = %p = %s \n",functionCall,functionCall->
class_name().c_str());
6391 functionCall->
get_file_info()->display(
"storedFunctionCall");
6392 printf (
" storedFunctionCall->get_function() = %p = %s \n",functionCall->get_function(),functionCall->get_function()->
class_name().c_str());
6393 printf (
"************************************************************* \n");
6397 bool returnResult =
false;
6400 SgGlobal* globalScope = TransformationSupport::getGlobalScope(functionCall);
6401 ROSE_ASSERT(globalScope != NULL);
6404 DeclarationOrderTraversal traversal (functionCall);
6407 traversal.traverse(globalScope, preorder);
6410 printf (
"Skipping traversal within SageInterface::functionCallExpressionPreceedsDeclarationWhichAssociatesScope() \n");
6411 traversal.storedFunctionCallFound =
true;
6412 traversal.functionCallExpressionPreceedsDeclarationWhichAssociatesScope =
false;
6419 if (traversal.storedFunctionCallFound ==
false)
6422 printf (
"In SageInterface::functionCallExpressionPreceedsDeclarationWhichAssociatesScope(): warning, storedFunctionCall not found in the AST \n");
6424 printf (
"---------------------------------------------------- \n\n");
6429 returnResult =
true;
6433 returnResult = traversal.functionCallExpressionPreceedsDeclarationWhichAssociatesScope;
6437 ROSE_ASSERT(traversal.storedFunctionCallFound ==
true);
6439 printf (
"returnResult = %s \n",returnResult ?
"true" :
"false");
6440 printf (
"************************************************************* \n\n");
6442 return returnResult;
6463 ROSE_ASSERT(project != NULL);
6470 Rose_STL_Container<string>::iterator i = fileList.begin();
6473 if ( fileList.empty() ==
true )
6475 return "empty_file_list";
6479 string filename = *i;
6485 if (i != fileList.begin())
6486 projectName +=
"--";
6490 string filenameWithoutSuffix;
6491 if ( i != fileList.end() || supressSuffix ==
true )
6494 filenameWithoutSuffix = filename;
6501 filename = filenameWithoutPathOrSuffix;
6503 unsigned long int n = 0;
6504 while (n < filename.size())
6506 if (filename[n] ==
'/')
6513 projectName += filename;
6517 while (i != fileList.end());
6536 if (currentScope == NULL)
6538 ROSE_ASSERT(currentScope != NULL);
6541 while ((functionSymbol == NULL) && (tempScope != NULL))
6543 functionSymbol = tempScope->lookup_function_symbol(functionName);
6545 printf (
"In lookupFunctionSymbolInParentScopes(): Searching scope = %p = %s functionName = %s functionSymbol = %p \n",tempScope,tempScope->
class_name().c_str(),functionName.str(),functionSymbol);
6548 tempScope = isSgGlobal(tempScope) ? NULL : tempScope->
get_scope();
6552 return functionSymbol;
6563 if (currentScope == NULL)
6565 ROSE_ASSERT(currentScope != NULL);
6568 while ((functionSymbol == NULL) && (tempScope != NULL))
6570 functionSymbol = tempScope->lookup_template_function_symbol(functionName, ftype, tplparams);
6572 printf (
"In lookupTemplateFunctionSymbolInParentScopes(): Searching scope = %p = %s functionName = %s functionSymbol = %p \n",tempScope,tempScope->
class_name().c_str(),functionName.str(),functionSymbol);
6575 tempScope = isSgGlobal(tempScope) ? NULL : tempScope->
get_scope();
6579 return functionSymbol;
6590 if (currentScope == NULL)
6592 ROSE_ASSERT(currentScope != NULL);
6595 while ((functionSymbol == NULL) && (tempScope != NULL))
6597 functionSymbol = tempScope->lookup_template_member_function_symbol(functionName, ftype, tplparams);
6599 printf (
"In lookupTemplateMemberFunctionSymbolInParentScopes(): Searching scope = %p = %s functionName = %s functionSymbol = %p \n",tempScope,tempScope->
class_name().c_str(),functionName.str(),functionSymbol);
6602 tempScope = isSgGlobal(tempScope) ? NULL : tempScope->
get_scope();
6606 return functionSymbol;
6614 if (isSgType(astNode) != NULL)
6616 printf (
"Error: the mechanism to add text to be unparsed at IR nodes is not intended to operate on SgType IR nodes (since they are shared) \n");
6620 if (astNode->
attributeExists(AstUnparseAttribute::markerName) ==
true)
6622 AstUnparseAttribute* code =
dynamic_cast<AstUnparseAttribute*
>(astNode->
getAttribute(AstUnparseAttribute::markerName));
6623 ROSE_ASSERT(code != NULL);
6627 code->addString(s,inputlocation);
6636 AstUnparseAttribute* code =
new AstUnparseAttribute(s,inputlocation);
6637 ROSE_ASSERT(code != NULL);
6654 ROSE_ASSERT(cscope != NULL);
6656 while ((cscope != NULL) && (symbol == NULL))
6659 symbol = cscope->lookup_class_symbol(name,NULL);
6662 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6693 if (currentScope == NULL)
6695 ROSE_ASSERT(currentScope != NULL);
6697 while (functionSymbol == NULL && tempScope != NULL)
6699 functionSymbol = tempScope->lookup_function_symbol(functionName,t);
6701 tempScope = isSgGlobal(tempScope) ? NULL : tempScope->
get_scope();
6702 else tempScope = NULL;
6704 return functionSymbol;
6711 if (cscope ==
nullptr) {
6714 ASSERT_not_null(cscope);
6716 while ((cscope !=
nullptr) && (symbol ==
nullptr))
6718 symbol = cscope->lookup_symbol(name,templateParameterList,templateArgumentList);
6720 cscope = isSgGlobal(cscope) ? nullptr : cscope->
get_scope();
6739 if (currentScope == NULL)
6744 ROSE_ASSERT(currentScope != NULL);
6746#define DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS 0
6748#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6749 printf (
"In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): currentScope = %p = %s (templateParameterList = %p templateArgumentList = %p) \n",
6750 currentScope,currentScope->
class_name().c_str(),templateParameterList,templateArgumentList);
6753 while ((currentScope != NULL) && (symbol == NULL))
6755#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6756 printf(
" --- In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): name = %s currentScope = %p = %s \n",
6757 name.str(),currentScope,currentScope->
class_name().c_str());
6762 symbol = currentScope->lookup_symbol(name,templateParameterList,templateArgumentList);
6764 if (isSgAliasSymbol(symbol) != NULL)
6766#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6767 printf (
"Found a SgAliasSymbol: reset to NULL: symbol = %p = %s \n",symbol,symbol->
class_name().c_str());
6772#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS && 1
6774 printf(
" --- In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): symbol = %p \n",symbol);
6775 currentScope->print_symboltable(
"In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): debug");
6778 currentScope = isSgGlobal(currentScope) ? NULL : currentScope->
get_scope();
6780 currentScope = NULL;
6782#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6783 printf (
" --- In SageInterface:: (base of loop) lookupSymbolInParentScopesIgnoringAliasSymbols(): cscope = %p symbol = %p \n\n",currentScope,symbol);
6789#if DEBUG_SYMBOL_LOOKUP_IN_PARENT_SCOPES_IGNORING_ALIAS_SYMBOLS
6790 printf (
"Warning: In SageInterface:: lookupSymbolInParentScopesIgnoringAliasSymbols(): could not locate the specified name %s in any outer symbol table (templateParameterList = %p templateArgumentList = %p) \n",
6791 name.str(),templateParameterList,templateArgumentList);
6797 printf (
"Support for lookupSymbolInParentScopesIgnoringAliasSymbols() is not yet implemented \n");
6819 ROSE_ASSERT(cscope);
6821 while ((cscope!=NULL)&&(symbol==NULL))
6823 symbol = cscope->lookup_symbol(name);
6827 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6853 printf (
"WARNING: SageInterface::lookupVariableSymbolInParentScopes() should be implemented similar to SageInterface::lookupClassSymbolInParentScopes() \n");
6859 if (isSgAliasSymbol(symbol) != NULL)
6861 printf (
"Error: This SageInterface::lookupVariableSymbolInParentScopes() function does not handle SgAliasSymbols \n");
6864 result = isSgVariableSymbol(symbol);
6872 ROSE_ASSERT(cscope != NULL);
6874 while ((cscope != NULL) && (symbol == NULL))
6877 symbol = cscope->lookup_variable_symbol(name);
6880 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6889#define DEBUG_LOOKUP_TEMPLATE_VARIABLE 0
6894#if DEBUG_LOOKUP_TEMPLATE_VARIABLE
6895 printf (
"In SageInterface::lookupTemplateVariableSymbolInParentScopes():\n");
6896 printf (
" -- name = %s\n", name.str());
6897 printf (
" -- tplparams = %p [%zd]\n", tplparams, tplparams ? tplparams->size() : 0);
6898 printf (
" -- tplargs = %p [%zd]\n", tplargs, tplargs ? tplargs->size() : 0);
6899 printf (
" -- cscope = %p (%s)\n", cscope, cscope ? cscope->
class_name().c_str() :
"");
6905 ROSE_ASSERT(cscope != NULL);
6907 while ((cscope != NULL) && (symbol == NULL))
6910 symbol = cscope->lookup_template_variable_symbol(name, tplparams, tplargs);
6913 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6929 ROSE_ASSERT(cscope != NULL);
6931 while ((cscope != NULL) && (symbol == NULL))
6935 symbol = cscope->lookup_class_symbol(name,templateArgumentList);
6938 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6952 ROSE_ASSERT(cscope != NULL);
6954 while ((cscope != NULL) && (symbol == NULL))
6956 symbol = cscope->lookup_nonreal_symbol(name,templateParameterList,templateArgumentList);
6959 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6974 ROSE_ASSERT(cscope != NULL);
6977 printf (
"In lookupTypedefSymbolInParentScopes(): name = %s starting with cscope = %p = %s \n",name.str(),cscope,cscope->
class_name().c_str());
6981 while ((cscope != NULL) && (symbol == NULL))
6984 symbol = cscope->lookup_typedef_symbol(name);
6987 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
6992 printf (
"In lookupTypedefSymbolInParentScopes(): symbol = %p next cscope = %p = %s \n",symbol,cscope,(cscope != NULL) ? cscope->
class_name().c_str() :
"null");
6997 printf (
"Leaving lookupTypedefSymbolInParentScopes(): symbol = %p \n",symbol);
7015 ROSE_ASSERT(cscope != NULL);
7017 while ((cscope != NULL) && (symbol == NULL))
7023 symbol = cscope->lookup_template_symbol(name,NULL,NULL);
7025 printf (
"In lookupTemplateSymbolInParentScopes(): Searching scope = %p = %s name = %s symbol = %p \n",cscope,cscope->
class_name().c_str(),name.str(),symbol);
7028 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
7045 ROSE_ASSERT(cscope != NULL);
7047 while ((cscope != NULL) && (symbol == NULL))
7053 symbol = cscope->lookup_template_class_symbol(name,templateParameterList,templateArgumentList);
7055 printf (
"In lookupTemplateSymbolInParentScopes(): Searching scope = %p = %s name = %s symbol = %p \n",cscope,cscope->
class_name().c_str(),name.str(),symbol);
7058 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
7075 ROSE_ASSERT(cscope != NULL);
7077 while ((cscope != NULL) && (symbol == NULL))
7080 symbol = cscope->lookup_enum_symbol(name);
7083 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
7098 ROSE_ASSERT(cscope != NULL);
7100 while ((cscope != NULL) && (symbol == NULL))
7103 symbol = cscope->lookup_namespace_symbol(name);
7106 cscope = isSgGlobal(cscope) ? NULL : cscope->
get_scope();
7116SageInterface::setSourcePositionToDefault( T* node )
7134 ROSE_ASSERT(node != NULL);
7137 if (node->get_endOfConstruct() == NULL && node->get_startOfConstruct() == NULL)
7140 printf (
"Both startOfConstruct and endOfConstruct are NOT yet initialized with pointers to Sg_File_Info objects (node = %p = %s) \n",node,node->class_name().c_str());
7143 ROSE_ASSERT(node->get_endOfConstruct() == NULL);
7144 ROSE_ASSERT(node->get_startOfConstruct() == NULL);
7151 printf (
"In SageInterface::setSourcePositionToDefault(): Calling setSourcePositionUnavailableInFrontend() \n");
7153 start_fileInfo->setSourcePositionUnavailableInFrontend();
7154 end_fileInfo->setSourcePositionUnavailableInFrontend();
7158 printf (
"In SageInterface::setSourcePositionToDefault(): Calling setOutputInCodeGeneration() \n");
7164 node->set_startOfConstruct(start_fileInfo);
7165 node->set_endOfConstruct (end_fileInfo);
7167 node->get_startOfConstruct()->set_parent(node);
7168 node->get_endOfConstruct ()->set_parent(node);
7175 printf (
"Both startOfConstruct and endOfConstruct are ALREADY initialized with pointers to Sg_File_Info objects (node = %p = %s) \n",node,node->class_name().c_str());
7177 if (node->get_startOfConstruct() == NULL)
7179 printf (
"ERROR: startOfConstruct not set for locatedNode = %p = %s \n",node,node->class_name().c_str());
7181 if (node->get_endOfConstruct() == NULL)
7183 printf (
"ERROR: endOfConstruct not set for locatedNode = %p = %s \n",node,node->class_name().c_str());
7186 ROSE_ASSERT(node->get_startOfConstruct() != NULL);
7187 ROSE_ASSERT(node->get_endOfConstruct() != NULL);
7188 ROSE_ASSERT(node->get_endOfConstruct() != NULL && node->get_startOfConstruct() != NULL);
7209 if (expression != NULL)
7212 SgBinaryOp* binaryOp = isSgBinaryOp(expression);
7213 if (binaryOp != NULL)
7215 if (binaryOp->get_operatorPosition() == NULL)
7218 operator_fileInfo->setSourcePositionUnavailableInFrontend();
7220 binaryOp->set_operatorPosition(operator_fileInfo);
7223 binaryOp->get_operatorPosition()->
set_parent(binaryOp);
7228 if (expression->get_operatorPosition() == NULL)
7231 operator_fileInfo->setSourcePositionUnavailableInFrontend();
7233 expression->set_operatorPosition(operator_fileInfo);
7238 ROSE_ASSERT(expression->get_operatorPosition()->
get_parent() == expression);
7249#ifdef ROSE_DEBUG_NEW_EDG_ROSE_CONNECTION
7250 printf (
"+++++ Depricated function (use setSourcePositionAsTransformation() instead) (no using internal source position mode) \n");
7269 ROSE_ASSERT(node != NULL);
7278 SgPragma* pragma = isSgPragma(node);
7279 SgGlobal* global = isSgGlobal(node);
7284 printf (
"Debug, Found a variable definition: %p\n", v_d);
7287 if (locatedNode != NULL)
7299 if (expression!=NULL)
7302 expression->get_operatorPosition()->
set_parent(expression);
7321 printf (
"+++++ Depricated name setOneSourcePositionNull() (use setSourcePositionPointersToNull() instead) (no using internal source position mode) \n");
7339 ROSE_ASSERT(node != NULL);
7343 SgPragma* pragma = isSgPragma(node);
7344 SgGlobal* global = isSgGlobal(node);
7350 if (locatedNode != NULL)
7353 printf (
"WARNING: In SageInterface::setSourcePositionPointersToNull(): Memory leak of startOfConstruct Sg_File_Info object (setting Sg_File_Info pointers to NULL) \n");
7361 printf (
"WARNING: In SageInterface::setSourcePositionPointersToNull(): Memory leak of endOfConstruct Sg_File_Info object (setting Sg_File_Info pointers to NULL) \n");
7367 if (expression != NULL)
7369 if (expression->get_operatorPosition() != NULL)
7370 printf (
"WARNING: In SageInterface::setSourcePositionPointersToNull(): Memory leak of operatorPosition Sg_File_Info object (setting Sg_File_Info pointers to NULL) \n");
7372 expression->set_operatorPosition(NULL);
7379 printf (
"WARNING: In SageInterface::setSourcePositionPointersToNull(): Memory leak of Sg_File_Info object (setting Sg_File_Info pointers to NULL) \n");
7381 pragma->set_startOfConstruct(NULL);
7392 printf (
"+++++ Depricated name setSourcePositionForTransformation() (use setSourcePositionAtRootAndAllChildrenAsTransformation() instead) \n");
7405 Rose_STL_Container <SgNode*> nodeList = NodeQuery::querySubTree(root,V_SgNode);
7406 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i!=nodeList.end(); i++ )
7417SageInterface::setSourcePositionAtRootAndAllChildrenAsTransformation(
SgNode *root)
7419 Rose_STL_Container <SgNode*> nodeList= NodeQuery::querySubTree(root,V_SgNode);
7420 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i!=nodeList.end(); i++ )
7429SageInterface::setSourcePositionAtRootAndAllChildrenAsDefault(
SgNode *root)
7431 Rose_STL_Container <SgNode*> nodeList= NodeQuery::querySubTree(root,V_SgNode);
7432 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i!=nodeList.end(); i++ )
7434 setSourcePositionAsDefault(*i);
7444 Rose_STL_Container <SgNode*> nodeList = NodeQuery::querySubTree(root,V_SgNode);
7447 printf (
"In setSourcePositionAtRootAndAllChildren(): nodeList.size() = %" PRIuPTR
" \n",nodeList.size());
7450 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
7453 printf (
"In setSourcePositionAtRootAndAllChildren(): *i = %p = %s \n",*i,(*i)->class_name().c_str());
7472 printf (
"In SageInterface::setSourcePosition(): SourcePositionClassification scp = %s \n",
display(scp).c_str());
7477 case e_sourcePositionError:
7479 printf (
"Error: error value e_sourcePositionError in SageInterface::setSourcePosition() \n");
7486 printf (
"e_sourcePositionDefault in SageInterface::setSourcePosition() \n");
7489 if (locatedNode != NULL)
7491 setSourcePositionToDefault(locatedNode);
7496 printf (
"Error: can't call setSourcePosition() in mode e_sourcePositionDefault with non SgLocatedNode (node = %p = %s) \n",node,node->
class_name().c_str());
7505 printf (
"e_sourcePositionTransformation in SageInterface::setSourcePosition() \n");
7514 printf (
"e_sourcePositionCompilerGenerated in SageInterface::setSourcePosition() \n");
7516 printf (
"Sorry, not implemented \n");
7525 printf (
"e_sourcePositionNullPointers in SageInterface::setSourcePosition() \n");
7542 printf (
"e_sourcePositionFrontendConstruction in SageInterface::setSourcePosition() \n");
7545 if (locatedNode != NULL)
7548 setSourcePositionToDefault(locatedNode);
7553 SgPragma* pragma = isSgPragma(node);
7556 setSourcePositionToDefault(pragma);
7562 SgType* type = isSgType(node);
7570 if (functionParameterTypeList != NULL)
7576 printf (
"Error: can't call setSourcePosition() in mode e_sourcePositionFrontendConstruction with non SgLocatedNode (node = %p = %s) \n",node,node->
class_name().c_str());
7589 printf (
"Error: error value e_sourcePositionError in SageInterface::setSourcePosition() \n");
7595 printf (
"Error: default reached in SageInterface::setSourcePosition() \n");
7603 node->
get_file_info()->display(
"Leaving SageInterface::setSourcePosition()");
7610SageInterface::setSourcePositionForTransformation_memoryPool()
7615 printf (
"ERROR: In setSourcePositionForTransformation_memoryPool(): This seems like a very dangerous function to have, is it required? \n");
7618 VariantVector vv(V_SgNode);
7619 Rose_STL_Container<SgNode*> nodeList = NodeQuery::queryMemoryPool(vv);
7620 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++ )
7631 ROSE_ASSERT(project != NULL);
7634 ROSE_ASSERT(project->get_fileList().empty() ==
false);
7637 SgSourceFile* file = isSgSourceFile(project->get_fileList()[0]);
7638 SgGlobal* global = file->get_globalScope();
7641 SgFilePtrListPtr fileList = project->get_fileList();
7642 SgFilePtrList::const_iterator i= fileList->begin();
7644 SgGlobal* global = (*i)->get_globalScope();
7646 ROSE_ASSERT(global != NULL);
7667 if (declList.empty() ==
false)
7669 stmt = isSgStatement(declList.back());
7678 if (stmtList.empty() ==
false)
7680 stmt = stmtList.back();
7702 if (includingCompilerGenerated)
7706 if (declList.empty() ==
false)
7708 stmt = isSgStatement(declList.front());
7714 SgDeclarationStatementPtrList::iterator i=declList.begin();
7715 while (i != declList.end())
7742 if (includingCompilerGenerated)
7746 if (stmtList.empty() ==
false)
7748 stmt = stmtList.front();
7754 SgStatementPtrList::iterator i = stmtList.begin();
7755 while (i!=stmtList.end())
7790 SgDeclarationStatementPtrList::iterator i=declList.begin();
7791 while (i!=declList.end())
7815 SgStatementPtrList::iterator i=stmtList.begin();
7816 while (i!=stmtList.end())
7843 bool result =
false;
7846 if (isSgProgramHeaderStatement(n)) {
7851 if (isSgFunctionDeclaration(n) !=
nullptr) {
7852 bool either =
false;
7858 ROSE_ASSERT(stmnt !=
nullptr);
7865 ROSE_ASSERT(funcDefn !=
nullptr);
7866 if (funcDefn->get_name() ==
"main") {
7890 return isSgFunctionDeclaration(n);
7893 for (vector<SgNode*>::const_iterator i = children.begin();
7894 i != children.end(); ++i) {
7912 ROSE_ASSERT (scope != NULL);
7916 for (
size_t i = 0; i<stmt_list.size(); i++)
7920 if (isSgDeclarationStatement(cur_stmt))
7922 if (isSgPragmaDeclaration (cur_stmt))
7942 rt = n->copy (g_treeCopy);
7952 bool isC = TransformationSupport::getSourceFile(n)->get_outputLanguage() ==
SgFile::e_C_language;
7964#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
7966 for (std::vector<SgContinueStmt*>::iterator i = continues.begin(); i != continues.end(); ++i)
7971 LowLevelRewrite::replace(*i, make_unit_list( gotoStatement ) );
7977 printf (
"Not supported in mode: ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT (LowLevelRewrite::replace() is unavailable)");
7982#define DEBUG_TEMPLATE_ARG_EQUIVALENCE 0
7988#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
7989 printf (
"In templateArgumentEquivalence(): same pointer to template argument: returning true \n");
7996#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
7997 printf (
"In templateArgumentEquivalence(): different argumentType(): returning false \n");
8006 ROSE_ASSERT(arg1->
get_type() != NULL);
8007 ROSE_ASSERT(arg2->
get_type() != NULL);
8009#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8010 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::type_argument: checking for the same type: arg1->get_type() = %p = %s arg2->get_type() = %p = %s \n",
8018#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8019 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::type_argument: checking for the same type: returning true \n");
8032#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8033 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::type_argument: checking for the same type: pointers are different: returning typesAreEqual = %s \n",typesAreEqual ?
"true" :
"false");
8035 return typesAreEqual;
8043 if (expr1 == expr2) {
8044#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8045 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::nontype_argument: checking for the same expression: returning true \n");
8049#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8050 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::nontype_argument: same variant of expression: %s\n", expr1->
class_name().c_str());
8053 case V_SgLongIntVal: {
8057 case V_SgUnsignedLongVal:
8062 case V_SgBoolValExp:
8067 mlog[Sawyer::Message::Common::FATAL]
8068 <<
"FATAL: In templateArgumentEquivalence(): case SgTemplateArgument::nontype_argument: expression have the same variant "
8070 <<
" but comparison is not NIY!"
8076#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8077 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::nontype_argument: different variant of expression: returning false \n");
8085 if (arg1->get_templateDeclaration() == arg2->get_templateDeclaration())
8087#if DEBUG_TEMPLATE_ARG_EQUIVALENCE
8088 printf (
"In templateArgumentEquivalence(): case SgTemplateArgument::template_template_argument: checking for the same templateDeclaration: returning true \n");
8094 ROSE_ASSERT(!
"NIY: template template argument comparaison.");
8100 ROSE_ASSERT(!
"Try to compare template arguments of unknown type...");
8109 ROSE_ASSERT(!
"Try to compare template arguments of unknown type start_of_pack_expansion_argument");
8115 printf (
"Error: default case not handled! \n");
8123#define DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE 0
8127 if (list1.size() != list2.size())
8129#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8130 printf (
"In templateArgumentListEquivalence(): different list sizes: returning false \n");
8131 printf (
" --- list1.size() = %zu \n",list1.size());
8132 printf (
" --- list2.size() = %zu \n",list2.size());
8139#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8140 printf (
"In templateArgumentListEquivalence(): same list using STL equality operator: returning true \n");
8146 for (
size_t i = 0; i < list1.size(); i++)
8148#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8149 printf (
"In templateArgumentListEquivalence(): calling templateArgumentEquivalence() for i = %zu \n",i);
8154#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8155 printf (
"In templateArgumentListEquivalence(): calling templateArgumentEquivalence() for i = %zu --- returned false: returning false \n",i);
8161#if DEBUG_TEMPLATE_ARG_LIST_EQUIVALENCE
8162 printf (
"In templateArgumentListEquivalence(): reached base of function: returning true \n");
8182 SgName labelname =
"rose_label__";
8195 if (isSgNullExpression(f->get_increment()))
return;
8200 f->set_increment(ne);
8210 ROSE_ASSERT(condstmt);
8212 if (isSgNullStatement(condstmt))
return true;
8216 return isSgNullExpression(exprStmt->get_expression());
8225 bbStmts = initStmts;
8226 for (
size_t i = 0; i < bbStmts.size(); ++i) {
8227 bbStmts[i]->set_parent(bb);
8230 const bool testIsNull = hasEmptyCondition(f);
8240 Rose_STL_Container<SgNode*> fors = NodeQuery::querySubTree(top,
8242 for (
size_t i = 0; i < fors.size(); ++i) {
8250 Rose_STL_Container<SgNode*> allGotos = NodeQuery::querySubTree(scope, V_SgGotoStatement);
8252 vector<SgGotoStatement*> result;
8253 for (Rose_STL_Container<SgNode*>::const_iterator i = allGotos.begin(); i != allGotos.end(); ++i) {
8254 if (isSgGotoStatement(*i)->
get_label() == l) {
8255 result.push_back(isSgGotoStatement(*i));
8263 vector<SgReturnStmt*> SageInterface::findReturnStmts(
SgStatement* scope) {
8266 Rose_STL_Container<SgNode*> returns = NodeQuery::querySubTree(scope, V_SgReturnStmt);
8268 vector<SgReturnStmt*> result;
8269 for (Rose_STL_Container<SgNode*>::const_iterator i = returns.begin(); i != returns.end(); ++i) {
8270 result.push_back(isSgReturnStmt(*i));
8276static void getSwitchCasesHelper(
SgStatement* top, vector<SgStatement*>& result) {
8278 if (isSgSwitchStatement(top))
return;
8279 if (isSgCaseOptionStmt(top) || isSgDefaultOptionStmt(top)) {
8280 result.push_back(top);
8283 for (
unsigned int i = 0; i < children.size(); ++i) {
8284 if (isSgStatement(children[i])) {
8285 getSwitchCasesHelper(isSgStatement(children[i]), result);
8291 vector<SgStatement*> result;
8292 getSwitchCasesHelper(sw->
get_body(), result);
8322 if (
const SgSymbol* symbol = isSgSymbol(astNode))
8323 return symbol->get_scope();
8328 else if (
const SgQualifiedName* qualifiedName = isSgQualifiedName(astNode))
8332 const SgNode* parentNode = astNode;
8333 while (!isSgScopeStatement(parentNode))
8338 if (isSgFunctionParameterList(parentNode) || isSgCtorInitializerList(parentNode))
8341 ROSE_ASSERT(funcDeclaration != NULL);
8343 if (funcDeclaration != NULL)
8345 return funcDeclaration->get_definition();
8350 if (parentNode == NULL)
8358 if ( isSgScopeStatement(parentNode) == NULL &&
8359 dynamic_cast<const SgType*
>(parentNode) == NULL &&
8360 dynamic_cast<const SgSymbol*
>(parentNode) == NULL )
8362 printf (
"Error: In SageInterface::getScope(): could not trace back to SgScopeStatement node \n");
8367 if (
dynamic_cast<const SgType*
>(parentNode) != NULL ||
dynamic_cast<const SgSymbol*
>(parentNode) != NULL )
8369 printf (
"Error: can't locate an associated SgStatement from astNode = %p = %s parentNode = %p = %s \n",astNode,astNode->
class_name().c_str(),parentNode,parentNode->
class_name().c_str());
8377 ROSE_ASSERT (scopeStatement != NULL);
8380 if (isSgScopeStatement(astNode))
8381 if (isSgScopeStatement(parentNode))
8383 ROSE_ASSERT (astNode == parentNode);
8410 printf (
"In getVarSymFromName(): name->get_name() = %s \n",name->get_name().str());
8413 ROSE_ASSERT (scope != NULL);
8415 printf (
"In getVarSymFromName(): name->get_name() = %s scope = %p = %s \n",name->get_name().str(),scope,scope->
class_name().c_str());
8417 v_sym = scope->lookup_var_symbol (name->get_name());
8426 if (decl_scope != NULL)
8427 v_sym = decl_scope->lookup_var_symbol (name->get_name());
8430 cerr <<
"\t\t*** WARNING: Can't seem to find a symbol for '"
8431 << name->get_name ().str ()
8461getVarSym_const (
const SgNode* n)
8467 v_sym = isSgVarRefExp (n)->get_symbol ();
8469 case V_SgInitializedName:
8470 v_sym = getVarSymFromName_const (isSgInitializedName (n));
8496 if (!decl)
return 0;
8497 const SgInitializedNamePtrList& names = decl->
get_variables ();
8498 if (names.begin () != names.end ())
8501 return getVarSym_const (name);
8520 if (names.begin () != names.end ())
8521 return *(names.begin ());
8527static void findBreakStmtsHelper(
SgStatement* code,
const std::string& fortranLabel,
bool inOutermostBody, vector<SgBreakStmt*>& breakStmts) {
8528 if (isSgWhileStmt(code) || isSgDoWhileStmt(code) || isSgForStatement(code) || isSgSwitchStatement(code)) {
8529 if (fortranLabel ==
"") {
8534 inOutermostBody =
false;
8537 if (isSgBreakStmt(code)) {
8539 bool breakMatchesThisConstruct =
false;
8540 if (bs->get_do_string_label() ==
"") {
8542 breakMatchesThisConstruct = inOutermostBody;
8544 breakMatchesThisConstruct = (fortranLabel == bs->get_do_string_label());
8546 if (breakMatchesThisConstruct) {
8547 breakStmts.push_back(bs);
8552 for (
unsigned int i = 0; i < children.size(); ++i) {
8553 if (isSgStatement(children[i])) {
8554 findBreakStmtsHelper(isSgStatement(children[i]), fortranLabel, inOutermostBody, breakStmts);
8562 vector<SgBreakStmt*> result;
8563 findBreakStmtsHelper(code, fortranLabel,
true, result);
8568static void findContinueStmtsHelper(
SgStatement* code,
const std::string& fortranLabel,
bool inOutermostBody, vector<SgContinueStmt*>& continueStmts) {
8569 if (isSgWhileStmt(code) || isSgDoWhileStmt(code) || isSgForStatement(code)) {
8570 if (fortranLabel ==
"") {
8575 inOutermostBody =
false;
8578 if (isSgContinueStmt(code)) {
8580 bool continueMatchesThisConstruct =
false;
8581 if (cs->get_do_string_label() ==
"") {
8583 continueMatchesThisConstruct = inOutermostBody;
8585 continueMatchesThisConstruct = (fortranLabel == cs->get_do_string_label());
8587 if (continueMatchesThisConstruct) {
8588 continueStmts.push_back(cs);
8593 for (
unsigned int i = 0; i < children.size(); ++i) {
8595 if (stmnt != NULL) {
8596 findContinueStmtsHelper(stmnt, fortranLabel, inOutermostBody, continueStmts);
8604 vector<SgContinueStmt*> result;
8605 findContinueStmtsHelper(code, fortranLabel,
true, result);
8616 std::cout <<
"Starting getInitializerOfExpression on 0x" << std::hex << (int)n <<
", which has type " << n->
sage_class_name() << std::endl;
8618 while (!isSgInitializer(n)) {
8621 std::cout <<
"Continuing getInitializerOfExpression on 0x" << std::hex << (int)n;
8623 std::cout << std::endl;
8627 return isSgInitializer(n);
8635 std::vector<SgVariableSymbol*> symbols;
8637 virtual void visit(
SgNode* n) {
8638 if (isSgVarRefExp(n))
8639 symbols.push_back(isSgVarRefExp(n)->get_symbol());
8643 GetSymbolsUsedInExpressionVisitor vis;
8644 vis.traverse(expr, preorder);
8651 return getEnclosingNode<SgSourceFile>(n, includingSelf);
8657 return findDeclarationStatement<SgFunctionDeclaration> (root, name, scope, isDefining);
8668 return getEnclosingNode<SgFunctionDefinition>(n, includingSelf);
8674 return getEnclosingNode<SgFunctionDeclaration>(astNode, includingSelf);
8684 return getEnclosingNode<SgGlobal>(astNode,
true );
8689 return getEnclosingNode<SgClassDefinition>(astNode, includingSelf);
8697 return getEnclosingNode<SgClassDeclaration>(astNode,
true);
8702 return getEnclosingNode<SgExprListExp>(astNode, includingSelf);
8708 bool returnValue =
false;
8714 virtual void visit(
SgNode* n)
8716 if (n == expression_target)
8722 Visitor(
SgExpression* expr) : expression_target(expr), in_subtree(
false) {}
8725 Visitor traversal(exp);
8727 traversal.traverse(subtree, preorder);
8729 returnValue = traversal.in_subtree;
8743 ROSE_ASSERT (functionCallExp != NULL);
8745 SgExpression* expression = functionCallExp->get_function();
8746 ROSE_ASSERT (expression != NULL);
8750 SgDotExp* dotExp = isSgDotExp(expression);
8753 ROSE_ASSERT (dotExp != NULL);
8756 ROSE_ASSERT (rhsOperand != NULL);
8761 if (memberFunctionRefExp != NULL)
8768 if (functionReferenceExp != NULL)
8773 SgArrowExp* arrowExp = isSgArrowExp(expression);
8774 if ( arrowExp != NULL)
8776 ROSE_ASSERT (arrowExp != NULL);
8779 ROSE_ASSERT (rhsOperand != NULL);
8784 if (memberFunctionRefExp != NULL)
8790 return returnDeclaration;
8795std::list<SgClassType*>
8800#define DEBUG_DATA_MEMBER_TYPE_CHAIN 0
8806 ROSE_ASSERT(varRefExp != NULL || memberFunctionRefExp != NULL);
8808 std::list<SgClassType*> returnTypeChain;
8811 std::list<SgClassType*> classChain;
8816 if (varRefExp != NULL)
8822 ROSE_ASSERT(memberFunctionRefExp != NULL);
8827 ROSE_ASSERT(parent != NULL);
8829#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8830 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): parent = %p = %s \n",parent,parent->
class_name().c_str());
8834 SgDotExp* dotExp = isSgDotExp(parent);
8838 if (arrowExp != NULL)
8840#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8841 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): Found an arrow expression \n");
8843 binaryOperator = arrowExp;
8848#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8849 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): Found an dot expression \n");
8851 binaryOperator = dotExp;
8855 if (binaryOperator != NULL)
8858 ROSE_ASSERT(lhs != NULL);
8860#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8861 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs = %p = %s \n",lhs,lhs->
class_name().c_str());
8867 while (isSgCastExp(temp_lhs) != NULL)
8869 cast = isSgCastExp(temp_lhs);
8870 ROSE_ASSERT(cast != NULL);
8873#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8874 printf (
"Top of loop: processing cast = %p temp_lhs = %p = %s \n",cast,temp_lhs,temp_lhs->
class_name().c_str());
8876 ROSE_ASSERT(cast->
get_type() != NULL);
8878 if (classType == NULL)
8880#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8881 printf (
" --- looking for base type: In SageInterface::getClassTypeChainForDataMemberReference(): classType == NULL: cast->get_type() = %p = %s \n",
8884 SgType* baseType = cast->
get_type()->
stripType(SgType::STRIP_POINTER_TYPE | SgType::STRIP_MODIFIER_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE | SgType::STRIP_TYPEDEF_TYPE);
8885 ROSE_ASSERT(baseType != NULL);
8887#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8888 printf (
" --- baseType = %p = %s name = %s \n",baseType,baseType->
class_name().c_str(),
get_name(baseType).c_str());
8890 classType = isSgClassType(baseType);
8894 ROSE_ASSERT(temp_lhs != NULL);
8896#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8897 printf (
" --- temp_lhs = %p = %s name = %s \n",temp_lhs,temp_lhs->
class_name().c_str(),
get_name(temp_lhs).c_str());
8903 if (classType != NULL)
8905 classChain.push_front(classType);
8909 if (classType != NULL)
8920 ROSE_ASSERT(target_type != NULL);
8921 SgClassType* target_classType = isSgClassType(target_type);
8923 if (target_classType != NULL)
8926 ROSE_ASSERT(target_declaration != NULL);
8927 SgClassDeclaration* target_classDeclaration = isSgClassDeclaration(target_declaration);
8928 ROSE_ASSERT(target_classDeclaration != NULL);
8930 ROSE_ASSERT(target_definingClassDeclaration != NULL);
8931 SgScopeStatement* target_scope = target_definingClassDeclaration->get_definition();
8932 ROSE_ASSERT(target_scope != NULL);
8934#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8935 printf (
"target_classDeclaration = %p = %s name = %s target_scope = %p = %s \n",
8936 target_classDeclaration,target_classDeclaration->
class_name().c_str(),target_classDeclaration->get_name().str(),target_scope,target_scope->
class_name().c_str());
8939 ROSE_ASSERT(source_classType != NULL);
8941 ROSE_ASSERT(source_declaration != NULL);
8942 SgClassDeclaration* source_classDeclaration = isSgClassDeclaration(source_declaration);
8943 ROSE_ASSERT(source_classDeclaration != NULL);
8945 ROSE_ASSERT(source_definingClassDeclaration != NULL);
8946 SgScopeStatement* source_scope = source_definingClassDeclaration->get_definition();
8947 ROSE_ASSERT(source_scope != NULL);
8949#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8950 printf (
"source_classDeclaration = %p = %s name = %s source_scope = %p = %s \n",
8951 source_classDeclaration,source_classDeclaration->
class_name().c_str(),source_classDeclaration->get_name().str(),source_scope,source_scope->
class_name().c_str());
8954 while (tmp_scope != NULL && tmp_scope != target_scope)
8956#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8957 printf (
"tmp_scope = %p = %s \n",tmp_scope,tmp_scope->
class_name().c_str());
8960 ROSE_ASSERT(tmp_classDefinition != NULL);
8962 ROSE_ASSERT(tmp_classDeclaration != NULL);
8964#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8965 SgName scope_name = tmp_classDeclaration->get_name();
8966 printf (
"scope_name = %s \n",scope_name.str());
8968 SgClassType* tmp_classType = tmp_classDeclaration->get_type();
8969 ROSE_ASSERT(tmp_classType != NULL);
8972 classChain.push_front(tmp_classType);
8976 if (isSgGlobal(tmp_scope) != NULL)
8985 printf (
"In loop processing cast: target_type = %p = %s \n",target_type,target_type->
class_name().c_str());
8991#if DEBUG_DATA_MEMBER_TYPE_CHAIN
8992 printf (
"Bottom of loop: processing cast = %p temp_lhs = %p = %s \n",cast,temp_lhs,temp_lhs->
class_name().c_str());
8998 ROSE_ASSERT(temp_lhs != NULL);
9000#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9001 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): temp_lhs = %p = %s \n",temp_lhs,temp_lhs->
class_name().c_str());
9004 SgVarRefExp* derivedClassVarRefExp = isSgVarRefExp(temp_lhs);
9005 if (derivedClassVarRefExp != NULL)
9007 SgVariableSymbol* derivedClassVariableSymbol = derivedClassVarRefExp->get_symbol();
9008 ROSE_ASSERT(derivedClassVariableSymbol != NULL);
9010 SgName derivedClassVariableName = derivedClassVariableSymbol->
get_name();
9012#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9013 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): derivedClassVariableName = %s \n",derivedClassVariableName.str());
9017 ROSE_ASSERT(type != NULL);
9019#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9020 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs type = %p = %s \n",type,type->
class_name().c_str());
9024 SgType* stripped_type = type->
stripType(SgType::STRIP_POINTER_TYPE|SgType::STRIP_ARRAY_TYPE|SgType::STRIP_REFERENCE_TYPE|SgType::STRIP_RVALUE_REFERENCE_TYPE|SgType::STRIP_MODIFIER_TYPE);
9026#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9027 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs stripped_type = %p = %s \n",stripped_type,stripped_type->
class_name().c_str());
9031 SgClassType* classType = isSgClassType(stripped_type);
9034 if (classType != NULL)
9036#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9037 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs classType = %p = %s \n",classType,classType->
class_name().c_str());
9038 SgClassDeclaration* classDeclaration = isSgClassDeclaration(classType->get_declaration());
9039 ROSE_ASSERT(classDeclaration != NULL);
9040 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs classDeclaration = %p = %s name = %s \n",
9041 classDeclaration,classDeclaration->
class_name().c_str(),classDeclaration->get_name().str());
9046 classChain.push_front(classType);
9050#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9051 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs stripped_type is not a SgClassType \n");
9057#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9058 printf (
"Need to support alternative to SgVarRefExp: temp_lhs = %p = %s \n",temp_lhs,temp_lhs->
class_name().c_str());
9061 ROSE_ASSERT(type != NULL);
9063#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9064 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): lhs type = %p = %s name = %s \n",type,type->
class_name().c_str(),
get_name(type).c_str());
9068 SgType* stripped_type = type->
stripType(SgType::STRIP_POINTER_TYPE|SgType::STRIP_ARRAY_TYPE|SgType::STRIP_REFERENCE_TYPE|SgType::STRIP_RVALUE_REFERENCE_TYPE|SgType::STRIP_MODIFIER_TYPE);
9070#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9071 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): stripped_type = %p = %s name = %s \n",stripped_type,stripped_type->
class_name().c_str(),
get_name(stripped_type).c_str());
9074 SgClassType* classType = isSgClassType(stripped_type);
9076 if (classType != NULL)
9078 classChain.push_front(classType);
9082#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9083 printf (
"classChain.size() = %zu \n",classChain.size());
9084 std::list<SgClassType*>::iterator iter = classChain.begin();
9085 while(iter != classChain.end())
9087 printf (
" --- *iter = %p = %s name = %s \n",*iter,(*iter)->class_name().c_str(),(*iter)->get_name().str());
9100 if (varRefExp != NULL)
9102 ROSE_ASSERT(varRefExp != NULL);
9103 ROSE_ASSERT(memberFunctionRefExp == NULL);
9105 referenceSymbol = varRefExp->get_symbol();
9109 ROSE_ASSERT(varRefExp == NULL);
9110 ROSE_ASSERT(memberFunctionRefExp != NULL);
9112 referenceSymbol = memberFunctionRefExp->get_symbol();
9114 ROSE_ASSERT(referenceSymbol != NULL);
9117#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9118 printf (
"referenceSymbol = %p = %s \n",referenceSymbol,referenceSymbol->
class_name().c_str());
9119 printf (
"symbolName = %s \n",symbolName.str());
9124 if (functionSymbol != NULL)
9129 if (templateInstantiationMemberFunctionDeclaration != NULL)
9131#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9132 printf (
"This is a template name, we want the name without template arguments \n");
9133 printf (
"templateInstantiationMemberFunctionDeclaration = %p \n",templateInstantiationMemberFunctionDeclaration);
9134 printf (
"templateInstantiationMemberFunctionDeclaration->get_name() = %s \n",templateInstantiationMemberFunctionDeclaration->get_name().str());
9141 isSgTemplateMemberFunctionDeclaration(templateInstantiationMemberFunctionDeclaration->
get_templateDeclaration());
9142 if (templateMemberFunctionDeclaration != NULL)
9144#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9145 printf (
"templateMemberFunctionDeclaration = %p \n",templateMemberFunctionDeclaration);
9146 printf (
"templateMemberFunctionDeclaration->get_name() = %s \n",templateMemberFunctionDeclaration->get_name().str());
9149 symbolName = templateMemberFunctionDeclaration->get_name();
9153#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9154 printf (
"templateMemberFunctionDeclaration == NULL: template declaration not available from template instantiation (rare, I think) \n");
9158 printf (
"Exiting as a test! \n");
9166 ROSE_ASSERT(declarationStatement != NULL);
9167#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9168 printf (
"functionSymbol != NULL: but declaration is not a member function: declarationStatement = %p = %s \n",declarationStatement,declarationStatement->
class_name().c_str());
9175 if (variableSymbol != NULL)
9181#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9182 printf (
"In SageInterface::getClassTypeChainForDataMemberReference(): NOTE: referenceSymbol is not a SgFunctionSymbol or SgVariableSymbol \n");
9185 printf (
"Exiting as a test! \n");
9192#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9193 printf (
"symbolName = %s \n",symbolName.str());
9202 std::list<SgClassType*> saveList;
9204#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9205 printf (
"classChain.size() = %zu \n",classChain.size());
9208 std::list<SgClassType*>::iterator i = classChain.begin();
9209 std::list<SgClassType*>::iterator save_iter = i;
9215 bool ambiguityDetectedSoSaveWholeChain =
false;
9217 while(i != classChain.end())
9219#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9220 printf (
"******** TOP OF WHILE LOOP ******** \n");
9221 printf (
" --- *i = %p = %s name = %s \n",*i,(*i)->class_name().c_str(),(*i)->get_name().str());
9222 printf (
" --- --- referenceSymbol = %p = %s \n",referenceSymbol,referenceSymbol->
class_name().c_str());
9224 bool ambiguityDetected =
false;
9227 ROSE_ASSERT(declarationStatement != NULL);
9229 if (definingDeclarationStatement != NULL)
9231 SgClassDeclaration* classDeclaration = isSgClassDeclaration(definingDeclarationStatement);
9232 ROSE_ASSERT(classDeclaration != NULL);
9235#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9236 printf (
" --- classDeclaration = %p = %s name = %s \n",classDeclaration,classDeclaration->
class_name().c_str(),classDeclaration->get_name().str());
9237 printf (
" --- classDefinition = %p = %s \n",classDefinition,classDefinition->
class_name().c_str());
9240 ambiguityDetected = classDefinition->hasAmbiguity(symbolName,referenceSymbol);
9242#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9243 printf (
" --- ambiguityDetected = %s \n",ambiguityDetected ?
"true" :
"false");
9248 if (ambiguityDetected ==
true || ambiguityDetectedSoSaveWholeChain ==
true)
9250 ambiguityDetectedSoSaveWholeChain =
true;
9252 if (save_iter != classChain.end())
9254#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9255 printf (
" --- add to saveList: *save_iter = %p \n",*save_iter);
9257 saveList.push_back(*save_iter);
9261#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9262 printf (
" --- save_iter == classChain.end() \n");
9267#if DEBUG_DATA_MEMBER_TYPE_CHAIN || 0
9268 printf (
"******** BOTTOM OF WHILE LOOP ******** \n");
9278#if DEBUG_DATA_MEMBER_TYPE_CHAIN
9279 printf (
"saveList.size() = %zu \n",saveList.size());
9280 std::list<SgClassType*>::iterator saveList_iterator = saveList.begin();
9281 while (saveList_iterator != saveList.end())
9283 printf (
" --- *saveList_iterator = %p = %s name = %s \n",*saveList_iterator,(*saveList_iterator)->class_name().c_str(),(*saveList_iterator)->get_name().str());
9285 saveList_iterator++;
9289 returnTypeChain = saveList;
9294 return returnTypeChain;
9304#define DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE 0
9306 ROSE_ASSERT(memberFunctionRefExp != NULL);
9308 bool returnValue =
false;
9314 SgDotExp* dotExp = isSgDotExp(parent);
9321 if (arrowExp != NULL || dotExp != NULL || addressOfOp != NULL)
9325 ROSE_ASSERT(symbol != NULL);
9328 ROSE_ASSERT(functionDeclaration != NULL);
9331 if (functionDeclaration != NULL)
9333 bool isStatic = functionDeclaration->get_declarationModifier().get_storageModifier().
isStatic();
9334#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9335 printf (
"isStatic = %s \n",
isStatic ?
"true" :
"false");
9340 ROSE_ASSERT(scope != NULL);
9343 if (classDefinition != NULL)
9351#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9352 printf (
"In SageInterface::isMemberFunctionMemberReference(): memberFunctionRefExp is not associated with variableDeclaration (could not compute if it is static data member) \n");
9358#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9359 printf (
"In SageInterface::isMemberFunctionMemberReference(): memberFunctionRefExp parent is not a is not SgArrowExp or SgDotExp expression \n");
9363#if DEBUG_IS_MEMBER_FUNCTION_MEMBER_REFERENCE
9364 printf (
"Leaving SageInterface::isMemberFunctionMemberReference(): returnValue = %s \n",returnValue ?
"true" :
"false");
9383#define DEBUG_IS_DATA_MEMBER_REFERENCE 0
9385 ROSE_ASSERT(varRefExp != NULL);
9387 bool returnValue =
false;
9393 SgDotExp* dotExp = isSgDotExp(parent);
9397 if (arrowExp != NULL || dotExp != NULL || addressOfOp != NULL)
9399 if (arrowExp != NULL)
9403 ROSE_ASSERT(parentOfArrowExp != NULL);
9404 SgSizeOfOp* sizeOfOp = isSgSizeOfOp(parentOfArrowExp);
9405 if (sizeOfOp != NULL && sizeOfOp->get_is_objectless_nonstatic_data_member_reference() ==
true)
9408#if DEBUG_IS_DATA_MEMBER_REFERENCE
9409 printf (
"In SageInterface::isDataMemberReference(): Found case of expression used in sizeof with objectless_nonstatic_data_member_reference \n");
9416 ROSE_ASSERT(symbol != NULL);
9419 ROSE_ASSERT(initializedName != NULL);
9423 if (variableDeclaration != NULL)
9425 bool isStatic = variableDeclaration->get_declarationModifier().get_storageModifier().
isStatic();
9429 ROSE_ASSERT(scope != NULL);
9432 if (classDefinition != NULL)
9440#if DEBUG_IS_DATA_MEMBER_REFERENCE
9441 printf (
"In SageInterface::isDataMemberReference(): varRefExp is not associated with variableDeclaration (could not compute if it is static data member) \n");
9447#if DEBUG_IS_DATA_MEMBER_REFERENCE
9448 printf (
"In SageInterface::isDataMemberReference(): varRefExp parent is not a is not SgArrowExp or SgDotExp expression \n");
9452#if DEBUG_IS_DATA_MEMBER_REFERENCE
9453 printf (
"Leaving SageInterface::isDataMemberReference(): returnValue = %s \n",returnValue ?
"true" :
"false");
9465 ROSE_ASSERT(varRefExp != NULL);
9467 bool returnValue =
false;
9471 if (addressOfOp != NULL)
9489 ROSE_ASSERT(varRefExp != NULL || memberFunctionRefExp != NULL);
9493 ROSE_ASSERT(refExp != NULL);
9495 bool returnValue =
false;
9500 if (addressOfOp != NULL)
9518 ROSE_ASSERT (astNode != NULL);
9522 ROSE_ASSERT (isSgProject(astNode) == NULL);
9524 SgNode* previous_parent = NULL;
9525 SgNode* previous_previous_parent = NULL;
9527 SgNode* parent = astNode;
9529 while ( (parent != NULL) && (isSgFile(parent) == NULL) && isSgJavaPackageDeclaration(parent) == NULL)
9532 printf (
"In getEnclosingFileNode(): parent = %p = %s \n",parent,parent->
class_name().c_str());
9534 previous_previous_parent = previous_parent;
9535 previous_parent = parent;
9540 if (previous_previous_parent != NULL && previous_parent != NULL && isSgJavaPackageDeclaration(parent) != NULL)
9544 printf (
"parent = %p = %s \n",parent,parent->
class_name().c_str());
9545 printf (
"previous_parent = %p = %s \n",previous_parent,previous_parent->
class_name().c_str());
9546 printf (
"previous_previous_parent = %p = %s \n",previous_previous_parent,previous_previous_parent->
class_name().c_str());
9548 SgClassDeclaration* classDeclaration = isSgClassDeclaration(previous_previous_parent);
9549 if (classDeclaration != NULL)
9552 printf (
"Class name = %p = %s = %s \n",classDeclaration,classDeclaration->
class_name().c_str(),classDeclaration->get_name().str());
9557 SgProject* project = TransformationSupport::getProject(parent);
9558 ROSE_ASSERT(project != NULL);
9559 SgFileList* fileList = project->get_fileList_ptr();
9560 ROSE_ASSERT(fileList != NULL);
9561 SgFilePtrList & vectorFile = fileList->get_listOfFiles();
9563 printf (
"Output list of files: \n");
9565 SgFilePtrList::iterator i = vectorFile.begin();
9566 while (i != vectorFile.end())
9569 ROSE_ASSERT(file != NULL);
9571 printf (
" --- filename = %s \n",file->
getFileName().c_str());
9574 string filenameWithoutPath = file->get_sourceFileNameWithoutPath();
9575 string classname = classDeclaration->get_name();
9576 string matchingfilename = classname +
".java";
9578 printf (
" --- --- filename = %s \n",filename.c_str());
9579 printf (
" --- --- filenameWithoutPath = %s \n",filenameWithoutPath.c_str());
9580 printf (
" --- --- classname = %s \n",classname.c_str());
9581 printf (
" --- --- matchingfilename = %s \n",matchingfilename.c_str());
9583 if (filenameWithoutPath == matchingfilename)
9586 printf (
" return file = %p \n",file);
9602 SgSourceFile *sourcefile = isSgSourceFile(attribute->getNode());
9603 ROSE_ASSERT(sourcefile != NULL);
9612 if (previous_parent == NULL && isSgJavaPackageDeclaration(parent) != NULL)
9615 ROSE_ASSERT(isSgJavaPackageDeclaration(astNode) != NULL);
9620 if (previous_previous_parent == NULL && isSgJavaPackageDeclaration(parent) != NULL)
9623 ROSE_ASSERT(isSgClassDefinition(astNode) != NULL);
9634 if (parent ==
nullptr)
9640 return isSgFile(parent);
9646 std::set<SgNode*> specific;
9647 std::set<SgNode*> non_specific;
9649 static void recursive_collect(
SgNode* node , std::set<SgNode *> & collection ) {
9651 if (node == NULL || !collection.insert(node).second)
return;
9654 for (std::vector<std::pair<SgNode*, std::string> >::iterator i = data_members.begin(); i != data_members.end(); ++i) {
9655 recursive_collect(i->first, collection);
9662 if (fileInfo != NULL) {
9663 if (fileInfo->isFrontendSpecific()) {
9665 recursive_collect(n, specific);
9667 non_specific.insert(n);
9668 recursive_collect(n, non_specific);
9671 fileInfo = isSg_File_Info(n);
9672 if (fileInfo != NULL) {
9673 if (fileInfo->isFrontendSpecific()) {
9676 non_specific.insert(n);
9682 std::set<SgNode*> apply() {
9683 traverseMemoryPool();
9685 std::set<SgNode*> result;
9687 std::set_difference(
9688 specific.begin(), specific.end(),
9689 non_specific.begin(), non_specific.end(),
9690 std::insert_iterator<set<SgNode*> >(result, result.begin())
9697 FrontendSpecificTraversal fst;
9710 void visit(
SgNode *astNode)
9712 ROSE_ASSERT(astNode != NULL);
9714 if (file_info != NULL)
9718 printf (
"Found shared node: astNode = %p = %s \n",astNode,astNode->
class_name().c_str());
9724 OutputSharedNodesTraversal tt;
9725 tt.traverse(node,preorder);
9733 while (n && !isSgStatement(n)) n = n->
get_parent();
9734 return isSgStatement(n);
9743SageInterface::DeferredTransformation::DeferredTransformation()
9744 : deferredTransformationKind(e_default),
9745 statementToRemove(NULL),
9746 statementToAdd(NULL),
9747 class_definition(NULL),
9748 target_class_member(NULL),
9749 new_function_prototype(NULL),
9751 locationToOverwriteWithTransformation(NULL),
9752 transformationToOverwriteFirstStatementInInterval(NULL),
9753 blockOfStatementsToOutline(NULL)
9757 printf (
"In SageInterface::DeferredTransformation default constructor called \n");
9765SageInterface::DeferredTransformation::DeferredTransformation(
9769 : deferredTransformationKind(e_outliner),
9770 statementToRemove(NULL),
9771 statementToAdd(NULL),
9772 class_definition(input_class_definition),
9773 target_class_member(input_target_class_member),
9774 new_function_prototype(input_new_function_prototype),
9776 locationToOverwriteWithTransformation(NULL),
9777 transformationToOverwriteFirstStatementInInterval(NULL),
9778 blockOfStatementsToOutline(NULL)
9782 printf (
"In SageInterface::DeferredTransformation constructor for outliner called \n");
9790 printf (
"In SageInterface::DeferredTransformation constructor for replaceDefiningFunctionDeclarationWithFunctionPrototype called \n");
9796 X.deferredTransformationKind = e_replaceDefiningFunctionDeclarationWithFunctionPrototype;
9797 X.statementToRemove = functionDeclaration;
9798 X.statementToAdd = NULL;
9799 X.class_definition = NULL;
9800 X.target_class_member = NULL;
9801 X.new_function_prototype = NULL;
9804 X.locationToOverwriteWithTransformation = NULL;
9805 X.transformationToOverwriteFirstStatementInInterval = NULL;
9806 X.blockOfStatementsToOutline = NULL;
9812SageInterface::DeferredTransformation::replaceStatement(
SgStatement* oldStmt,
SgStatement* newStmt,
bool )
9815 printf (
"In SageInterface::DeferredTransformation constructor for replaceStatement called \n");
9821 X.deferredTransformationKind = e_replaceStatement;
9822 X.statementToRemove = oldStmt;
9823 X.statementToAdd = newStmt;
9824 X.class_definition = NULL;
9825 X.target_class_member = NULL;
9826 X.new_function_prototype = NULL;
9829 X.locationToOverwriteWithTransformation = NULL;
9830 X.transformationToOverwriteFirstStatementInInterval = NULL;
9831 X.blockOfStatementsToOutline = NULL;
9836SageInterface::DeferredTransformation::DeferredTransformation (
const DeferredTransformation& X)
9838 : deferredTransformationKind(X.deferredTransformationKind),
9839 statementToRemove(X.statementToRemove),
9840 statementToAdd(X.StatementToAdd),
9841 class_definition(X.class_definition),
9842 target_class_member(X.target_class_member),
9843 new_function_prototype(X.new_function_prototype),
9844 targetClasses(X.targetClasses),
9845 targetFriends(X.targetFriends)
9851 printf (
"In SageInterface::DeferredTransformation copy constructor called \n");
9861 printf (
"Inside of SageInterface::DeferredTransformation::operator= (const DeferredTransformation& X) \n");
9866 targetFriends = X.targetFriends;
9867 targetClasses = X.targetClasses;
9873 transformationLabel = X.transformationLabel;
9876 deferredTransformationKind = X.deferredTransformationKind;
9877 statementToRemove = X.statementToRemove;
9878 statementToAdd = X.statementToAdd;
9880 class_definition = X.class_definition;
9881 target_class_member = X.target_class_member;
9882 new_function_prototype = X.new_function_prototype;
9883 targetClasses = X.targetClasses;
9884 targetFriends = X.targetFriends;
9887 statementInterval = X.statementInterval;
9888 locationToOverwriteWithTransformation = X.locationToOverwriteWithTransformation;
9889 transformationToOverwriteFirstStatementInInterval = X.transformationToOverwriteFirstStatementInInterval;
9892 blockOfStatementsToOutline = X.blockOfStatementsToOutline;
9903std::string SageInterface::DeferredTransformation::outputDeferredTransformationKind(
const TransformationKind & kind)
9905 string returnValue =
"uninitialized";
9908 case e_error: returnValue =
"e_error";
break;
9909 case e_default: returnValue =
"e_default";
break;
9910 case e_outliner: returnValue =
"e_outliner";
break;
9911 case e_replaceStatement: returnValue =
"e_replaceStatement";
break;
9912 case e_removeStatement: returnValue =
"e_removeStatement";
break;
9913 case e_replaceDefiningFunctionDeclarationWithFunctionPrototype: returnValue =
"e_replaceDefiningFunctionDeclarationWithFunctionPrototype";
break;
9914 case e_last: returnValue =
"e_last";
break;
9917 printf (
"Error: SageInterface::DeferredTransformation::get_deferredTransformationKind_string(): default reached \n");
9925void SageInterface::DeferredTransformation::display ( std::string label )
const
9927 printf (
"SageInterface::DeferredTransformation::display(): label = %s \n",label.c_str());
9932 printf (
" --- transformationLabel = %s \n",transformationLabel.c_str());
9934 printf (
" --- deferredTransformationKind = %s \n",outputDeferredTransformationKind(deferredTransformationKind).c_str());
9935 if (statementToRemove != NULL)
9937 printf (
" --- statementToRemove = %p = %s name = %s \n",statementToRemove,statementToRemove->class_name().c_str(),
get_name(statementToRemove).c_str());
9941 printf (
" --- statementToRemove == NULL \n");
9944 if (statementToAdd != NULL)
9946 printf (
" --- statementToAdd = %p = %s name = %s \n",statementToAdd,statementToAdd->class_name().c_str(),
get_name(statementToAdd).c_str());
9950 printf (
" --- statementToAdd == NULL \n");
9953 if (class_definition != NULL)
9956 printf (
" --- class_definition = %p \n",class_definition);
9959 if (target_class_member != NULL)
9961 printf (
" --- target_class_member = %p = %s name = %s \n",target_class_member,target_class_member->class_name().c_str(),
get_name(target_class_member).c_str());
9964 if (new_function_prototype != NULL)
9966 printf (
" --- new_function_prototype = %p = %s name = %s \n",new_function_prototype,new_function_prototype->class_name().c_str(),
get_name(new_function_prototype).c_str());
9970 if (locationToOverwriteWithTransformation != NULL)
9974 printf (
" --- locationToOverwriteWithTransformation = %p \n",locationToOverwriteWithTransformation);
9978 if (transformationToOverwriteFirstStatementInInterval != NULL)
9982 printf (
" --- transformationToOverwriteFirstStatementInInterval = %p \n",transformationToOverwriteFirstStatementInInterval);
9986 if (blockOfStatementsToOutline != NULL)
9988 printf (
" --- blockOfStatementsToOutline = %p \n",blockOfStatementsToOutline);
9991 printf (
"targetClasses.size() = %zu \n",targetClasses.size());
9992 printf (
"targetFriends.size() = %zu \n",targetFriends.size());
9995 printf (
"statementInterval.size() = %zu \n",statementInterval.size());
10005#define REMOVE_STATEMENT_DEBUG 0
10010#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
10021 ASSERT_not_null(targetStmt);
10029 bool isRemovable = (parentStatement != NULL) ? LowLevelRewrite::isRemovableStatement(targetStmt) :
false;
10031#if REMOVE_STATEMENT_DEBUG || 0
10032 printf (
"In SageInterface::removeStatement(): parentStatement = %p = %s remove targetStatement = %p = %s (isRemovable = %s) \n",
10033 parentStatement,parentStatement->
class_name().c_str(),targetStmt,targetStmt->
class_name().c_str(),isRemovable ?
"true" :
"false");
10036 if (isRemovable ==
true)
10043 if (autoRelocatePreprocessingInfo ==
true)
10053 if (comments !=
nullptr && isSgBasicBlock(targetStmt) ==
nullptr )
10055 vector<int> captureList;
10056#if REMOVE_STATEMENT_DEBUG
10057 printf (
"Found attached comments (removing %p = %s): comments->size() = %" PRIuPTR
" \n",targetStmt,targetStmt->
class_name().c_str(),comments->size());
10063 int commentIndex = 0;
10064 AttachedPreprocessingInfoType::iterator i;
10065 for (i = comments->begin(); i != comments->end(); i++)
10067 ROSE_ASSERT ( (*i) != NULL );
10068#if REMOVE_STATEMENT_DEBUG
10069 printf (
" Attached Comment (relativePosition=%s): %s\n",
10070 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
10071 (*i)->getString().c_str());
10072 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
10073 (*i)->get_file_info()->display(
"comment/directive location debug");
10075 captureList.push_back(commentIndex);
10079#if REMOVE_STATEMENT_DEBUG
10080 printf (
"captureList.size() = %" PRIuPTR
" \n",captureList.size());
10083 if (captureList.empty() ==
false)
10088 bool surroundingStatementPreceedsTargetStatement =
false;
10091 if (surroundingStatement !=
nullptr)
10094#if REMOVE_STATEMENT_DEBUG
10095 printf (
"In removeStatement(): surroundingStatementPreceedsTargetStatement = %s \n",surroundingStatementPreceedsTargetStatement ?
"true" :
"false");
10096 printf (
" --- moving comments from targetStmt = %p = %s name = %s \n",targetStmt,targetStmt->
class_name().c_str(),
get_name(targetStmt).c_str());
10097 printf (
" --- moving comments to surroundingStatement = %p = %s name = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str(),
get_name(surroundingStatement).c_str());
10112 printf (
"Error: This is not supported within Microsoft Windows (I forget why). \n");
10134 printf (
"In SageInterface::resetInternalMapsForTargetStatement(SgStatement*): sourceStatement = %p = %s \n",sourceStatement,sourceStatement->
class_name().c_str());
10143 printf (
"In SageInterface::resetInternalMapsForTargetStatement(SgStatement*): sourceFile = %p \n",sourceFile);
10146 if (sourceFile != NULL)
10148 std::map<SgStatement*,MacroExpansion*> & macroExpansionMap = sourceFile->get_macroExpansionMap();
10150 if (macroExpansionMap.find(sourceStatement) != macroExpansionMap.end())
10152 MacroExpansion* macroExpansion = macroExpansionMap[sourceStatement];
10153 ROSE_ASSERT(macroExpansion != NULL);
10155 printf (
"In resetInternalMapsForTargetStatement(): macroExpansion = %p = %s \n",macroExpansion,macroExpansion->macro_name.c_str());
10157 if (macroExpansion->isTransformed ==
false)
10160 std::vector<SgStatement*> & associatedStatementVector = macroExpansion->associatedStatementVector;
10162 for (
size_t i = 0; i < associatedStatementVector.size(); i++)
10165 SgStatement* statement = associatedStatementVector[i];
10167 printf (
"Mark as transformation to be output: statement = %p = %s \n",statement,statement->
class_name().c_str());
10191 macroExpansion->isTransformed =
true;
10208#if REMOVE_STATEMENT_DEBUG || 0
10209 printf (
"In moveCommentsToNewStatement(): destinationStatementProceedsSourceStatement = %s \n",destinationStatementProceedsSourceStatement ?
"true" :
"false");
10210 printf (
" --- sourceStatement = %p = %s name = %s \n",sourceStatement,sourceStatement->
class_name().c_str(),
get_name(sourceStatement).c_str());
10211 printf (
" --- destinationStatement = %p = %s name = %s \n",destinationStatement,destinationStatement->
class_name().c_str(),
get_name(destinationStatement).c_str());
10219#if REMOVE_STATEMENT_DEBUG
10220 printf (
"Output the comments attached to sourceStatement: \n");
10222 printf (
"Output the comments attached to destinationStatement: \n");
10227 vector<int>::const_iterator j = indexList.begin();
10229 while (j != indexList.end())
10232 ROSE_ASSERT(destinationStatement->
get_file_info() != NULL);
10233#if REMOVE_STATEMENT_DEBUG || 0
10234 printf (
"Attaching comments to destinationStatement = %p = %s on file = %s line %d \n",
10235 destinationStatement,destinationStatement->
class_name().c_str(),
10236 destinationStatement->
get_file_info()->get_filenameString().c_str(),
10239 printf (
"(*comments)[*j]->getRelativePosition() = %s \n",PreprocessingInfo::relativePositionName((*comments)[*j]->getRelativePosition()).c_str());
10251 if (destinationStatementProceedsSourceStatement ==
true || isSgGlobal(destinationStatement) != NULL )
10257 auto commentPosition = (*comments)[*j]->getRelativePosition();
10258 if (commentPosition == PreprocessingInfo::before)
10261 (*comments)[*j]->setRelativePosition(PreprocessingInfo::after);
10263 else if (commentPosition == PreprocessingInfo::after ||
10264 commentPosition == PreprocessingInfo::end_of)
10270 ROSE_ASSERT(
false &&
"Comment relative position neither, before, after, nor end_of");
10282 (*comments)[*j]->setRelativePosition(PreprocessingInfo::inside);
10293 if ((*comments)[*j]->getRelativePosition() == PreprocessingInfo::before)
10301 ASSERT_require((*comments)[*j]->getRelativePosition() == PreprocessingInfo::after||
10302 (*comments)[*j]->getRelativePosition() == PreprocessingInfo::end_of);
10303 (*comments)[*j]->setRelativePosition(PreprocessingInfo::before);
10312 if (targetInfoList==NULL)
10321 if( prevTargetAnchorComment==NULL)
10334 prevTargetAnchorComment = (*comments)[*j];
10339#if REMOVE_STATEMENT_DEBUG
10340 printf (
"Marking entry from comments list as NULL on sourceStatement = %p = %s \n",sourceStatement,sourceStatement->
class_name().c_str());
10342 (*comments)[*j] =
nullptr;
10349 for (
size_t n = 0; n < indexList.size(); n++)
10351#if REMOVE_STATEMENT_DEBUG || 0
10352 printf (
"Erase entry from comments list on comments->size() %" PRIuPTR
" \n",comments->size());
10354 bool modifiedList =
false;
10355 AttachedPreprocessingInfoType::iterator k = comments->begin();
10356 while (k != comments->end() && modifiedList ==
false)
10361 k = comments->erase(k);
10362 modifiedList =
true;
10384 ROSE_ASSERT(targetStmt != NULL);
10389#if REMOVE_STATEMENT_DEBUG || 0
10390 printf (
"TOP of findSurroundingStatementFromSameFile(): surroundingStatementPreceedsTargetStatement = %s \n",surroundingStatementPreceedsTargetStatement ?
"true" :
"false");
10393 std::set<SgStatement*> previousVisitedStatementSet;
10398 surroundingStatementPreceedsTargetStatement =
true;
10400#if REMOVE_STATEMENT_DEBUG
10401 printf (
" targetStmt->get_file_info()->get_file_id() = %d \n",targetStmt->
get_file_info()->get_file_id());
10403#if REMOVE_STATEMENT_DEBUG
10404 printf (
"Before loop: surroundingStatement = %p = %s name = %s surroundingStatement_fileId = %d \n",surroundingStatement,
10407 bool returningNullSurroundingStatement =
false;
10419#if REMOVE_STATEMENT_DEBUG
10420 printf (
"In loop: after getPreviousStatement(): surroundingStatement = %p = %s name = %s \n",surroundingStatement,
10424 if (surroundingStatement == NULL)
10427#if REMOVE_STATEMENT_DEBUG
10428 printf (
" surroundingStatement_fileId set to Sg_File_Info::BAD_FILE_ID \n");
10433 surroundingStatement_fileId = surroundingStatement->
get_file_info()->get_file_id();
10434#if REMOVE_STATEMENT_DEBUG
10435 printf (
" surroundingStatement = %p = %s surroundingStatement->get_file_info()->get_file_id() = %d \n",
10436 surroundingStatement,surroundingStatement->
class_name().c_str(),surroundingStatement->
get_file_info()->get_file_id());
10440#if REMOVE_STATEMENT_DEBUG
10441 if (surroundingStatement != NULL)
10443 printf (
"Looping toward the top of the file for a statement to attach comments and CPP directives to: surroundingStatement = %p = %s file = %s file id = %d line = %d \n",
10444 surroundingStatement,surroundingStatement->
class_name().c_str(),
10445 surroundingStatement->
get_file_info()->get_filenameString().c_str(),
10451 printf (
"surroundingStatement == NULL \n");
10456 if (previousVisitedStatementSet.find(surroundingStatement) != previousVisitedStatementSet.end())
10458 printf (
"This statement has been previously visited: surroundingStatement = %p = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str());
10460 printf (
"ERROR: SageInterface::findSurroundingStatementFromSameFile(): cannot located surrounding statement from same file (return NULL) \n");
10462 surroundingStatement = NULL;
10468 previousVisitedStatementSet.insert(surroundingStatement);
10472 if (surroundingStatement == NULL || isSgGlobal(surroundingStatement) != NULL)
10475#if REMOVE_STATEMENT_DEBUG
10476 printf (
"We just ran off the start (top) of the file... targetStmt = %p = %s \n",targetStmt,targetStmt->
class_name().c_str());
10482 surroundingStatementPreceedsTargetStatement =
false;
10485 surroundingStatement = targetStmt;
10486 SgStatement* previousStatement = surroundingStatement;
10490 std::set<SgStatement*> forwardVisitedStatementSet;
10493 while ( (surroundingStatement != NULL) && (surroundingStatement_fileId != targetStmt->
get_file_info()->get_file_id()) )
10496 if (forwardVisitedStatementSet.find(surroundingStatement) != forwardVisitedStatementSet.end())
10498 printf (
"This statement has been previously visited: surroundingStatement = %p = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str());
10500 printf (
"ERROR: SageInterface::findSurroundingStatementFromSameFile(): cannot located surrounding statement from same file (return NULL) \n");
10502 surroundingStatement = NULL;
10508 forwardVisitedStatementSet.insert(surroundingStatement);
10511 previousStatement = surroundingStatement;
10514 if (surroundingStatement == NULL)
10517#if REMOVE_STATEMENT_DEBUG
10518 printf (
"We just ran off the end (bottom) of the file... \n");
10523 returningNullSurroundingStatement =
true;
10527 surroundingStatement_fileId = surroundingStatement->
get_file_info()->get_file_id();
10528#if REMOVE_STATEMENT_DEBUG
10529 printf (
"Looping toward the bottom of the file for a statement to attach comments and CPP directives to: surroundingStatement = %p = %s file = %s file id = %d line = %d \n",
10530 surroundingStatement,surroundingStatement->
class_name().c_str(),
10531 surroundingStatement->
get_file_info()->get_filenameString().c_str(),
10538 if (surroundingStatement == NULL)
10540#if REMOVE_STATEMENT_DEBUG
10541 printf (
"Resetting the surroundingStatement to the previousStatement = %p = %s \n",previousStatement,previousStatement->
class_name().c_str());
10543 surroundingStatement = previousStatement;
10546 if (surroundingStatement == targetStmt)
10550#if REMOVE_STATEMENT_DEBUG
10551 printf (
"Setting the surroundingStatement to be global scope \n");
10553 surroundingStatement = TransformationSupport::getGlobalScope(targetStmt);
10559 ROSE_ASSERT(surroundingStatement != NULL);
10563 printf (
"This is a special statement (not associated with the original source code, comment relocation is not supported for these statements) targetStmt file id = %d \n",targetStmt->
get_file_info()->get_file_id());
10564 surroundingStatement = NULL;
10567#if REMOVE_STATEMENT_DEBUG
10568 printf (
"BOTTOM of findSurroundingStatementFromSameFile(): surroundingStatementPreceedsTargetStatement = %s surroundingStatement = %p \n",surroundingStatementPreceedsTargetStatement ?
"true" :
"false",surroundingStatement);
10569 if (surroundingStatement != NULL)
10571 printf (
"surroundingStatement = %p = %s \n",surroundingStatement,surroundingStatement->
class_name().c_str());
10577 return surroundingStatement;
10587 virtual void visit(
SgNode* n) {
10591 Visitor().
traverse(root, postorder);
10601 ROSE_ASSERT(oldStmt);
10602 ROSE_ASSERT(newStmt);
10604 if (oldStmt == newStmt)
return;
10615 ROSE_ASSERT (f_do->get_body() == oldStmt);
10616 if (!isSgBasicBlock(newStmt))
10618 f_do->set_body(isSgBasicBlock(newStmt));
10635 printf (
"In SageInterface::replaceStatement(): physical_file_id = %d \n",physical_file_id);
10646 if (movePreprocessingInfoValue)
10654 printf (
"In SageInterface::replaceStatement(): calling moveUpPreprocessingInfo() changed to movePreprocessingInfo() \n");
10666 bool usePrepend =
true;
10668 movePreprocessingInfo ( oldStmt, newStmt, PreprocessingInfo::undef, PreprocessingInfo::undef, usePrepend );
10689 printf (
"In SageInterface::moveDeclarationToAssociatedNamespace(): declarationStatement = %p = %s \n",declarationStatement,declarationStatement->
class_name().c_str());
10690 printf (
" --- previousDeclarationStatement = %p = %s \n",previousDeclarationStatement,previousDeclarationStatement != NULL ? previousDeclarationStatement->
class_name().c_str() :
"null");
10691 printf (
" --- nextDeclarationStatement = %p \n",nextDeclarationStatement);
10692 printf (
" --- nextDeclarationStatement = %p = %s \n",nextDeclarationStatement, nextDeclarationStatement != NULL ? nextDeclarationStatement->
class_name().c_str() :
"null");
10696 if (previousDeclarationStatement != NULL)
10702 printf (
"There is no previous statement so there is no namespace to close off! \n");
10705 printf (
"Exiting as a test! \n");
10710 if (nextDeclarationStatement != NULL)
10717 printf (
"There is no next statement so there is no namespace to reopen! \n");
10721 printf (
"Exiting as a test! \n");
10726 if (previousDeclarationStatement != NULL && nextDeclarationStatement != NULL)
10730 printf (
"Identified the most common case... \n");
10735 printf (
"declarationScope = %p = %s \n",declarationScope,declarationScope->
class_name().c_str());
10739 printf (
"Exiting as a test! \n");
10745 if (previousDeclarationStatement != NULL && nextDeclarationStatement == NULL)
10749 printf (
"Found 2nd most common case: previousDeclarationStatement != NULL && nextDeclarationStatement == NULL \n");
10753 printf (
"Exiting as a test! \n");
10759 if (previousDeclarationStatement == NULL && nextDeclarationStatement == NULL)
10761 printf (
"This case should require no special handling, unless we are still in the wrong namespace \n");
10764 printf (
"Exiting as a test! \n");
10769 printf (
"This case should have been caught above! \n");
10772 printf (
"Exiting as a test! \n");
10779 if (declarationParent == NULL)
10782 printf (
"declarationStatement->get_parent() = %p = %s \n",declarationStatement->
get_parent(), (declarationStatement->
get_parent() != NULL) ? declarationStatement->
get_parent()->
class_name().c_str() :
"null");
10788 if (declarationParent != NULL)
10791 ROSE_ASSERT(declarationScope != NULL);
10794 if (namespaceDefinition != NULL)
10797 ROSE_ASSERT(namespaceDeclaration != NULL);
10799 printf (
"The declaration has been identified to be associuated with a valid namespace = %p = %s \n",namespaceDeclaration,namespaceDeclaration->
get_name().str());
10800 printf (
" --- declarationParent = %p = %s \n",declarationParent,declarationParent->
class_name().c_str());
10801 printf (
" --- Move declaration from scope = %p = %s to namespace = %p = %s \n",declarationParent,declarationParent->
class_name().c_str(),namespaceDeclaration,namespaceDeclaration->
get_name().str());
10804 printf (
"Exiting as a test! \n");
10811 printf (
"declaration is not associated with a namespace, so we don't have to wrap it: declarationScope = %p = %s \n",declarationScope,declarationScope->
class_name().c_str());
10818 printf (
"Warning: declarationParent == NULL: declarationStatement->get_parent() = %p = %s \n",declarationStatement->
get_parent(), (declarationStatement->
get_parent() != NULL) ? declarationStatement->
get_parent()->
class_name().c_str() :
"null");
10830 if (isSgTemplateInstantiationDefn(node) != NULL)
10833 printf (
"Note: In SageInterface::isTemplateInstantiationNode(): skipping SgTemplateInstantiationDefn \n");
10837 return isSgTemplateInstantiationDecl(node)
10840 || isSgTemplateInstantiationDefn(node)
10841 || isSgTemplateInstantiationFunctionDecl(node)
10842 || isSgTemplateInstantiationMemberFunctionDecl(node)
10843 || isSgTemplateInstantiationTypedefDeclaration(node)
10844 || isSgTemplateInstantiationDirectiveStatement(node)
10853SageInterface::isTemplateDeclarationNode(
SgNode* node)
10856 if (isSgTemplateDefinition(node) != NULL)
10859 printf (
"Note: In SageInterface::isTemplateDeclarationNode(): skipping SgTemplateDefinition \n");
10863 return isSgTemplateInstantiationDecl(node)
10866 || isSgTemplateInstantiationDefn(node)
10867 || isSgTemplateInstantiationFunctionDecl(node)
10868 || isSgTemplateInstantiationMemberFunctionDecl(node)
10869 || isSgTemplateInstantiationTypedefDeclaration(node)
10870 || isSgTemplateInstantiationDirectiveStatement(node)
10883 std::vector<SgDeclarationStatement*> templateInstantiationVector;
10895 if (declaration != NULL)
10897 templateInstantiationVector.push_back(declaration);
10906 std::cerr <<
"This feature for now is available with autotools only!" << std::endl;
10910 std::vector<SgDeclarationStatement*>::iterator j = templateInstantiationVector.begin();
10911 while (j != templateInstantiationVector.end())
10925 SgExpression * pattern_exp = isSgExpression(new_pattern);
10926 ROSE_ASSERT (anchor_exp != NULL);
10927 ROSE_ASSERT (pattern_exp != NULL);
10930 Rose_STL_Container<SgNode*> opaque_exp_list = NodeQuery::querySubTree(pattern_exp,V_SgExpression);
10931 for (
size_t i = 0; i<opaque_exp_list.size(); i++)
10933 SgExpression* opaque_exp = isSgExpression(opaque_exp_list[i]);
10934 ROSE_ASSERT (opaque_exp != NULL);
10935 if (opaque_exp->
variantT() == V_SgVariantExpression)
10944 return new_pattern;
10951 static int counter = 0;
10954 bool collision =
false;
10957 name =
"__" + baseName + boost::lexical_cast<string > (counter++) +
"__";
10963 collision = (nameSymbol != NULL);
10966 Rose_STL_Container<SgNode*> childScopes = NodeQuery::querySubTree(scope, V_SgScopeStatement);
10968 BOOST_FOREACH(
SgNode* childScope, childScopes)
10974 nameSymbol = childScopeStatement->lookup_symbol(
SgName(name),NULL,NULL);
10976 collision = collision || (nameSymbol != NULL);
10978 }
while (collision);
10988 SgType* variableType = expressionType;
10995 SgType* expressionBaseType = expressionType->
stripType(SgType::STRIP_TYPEDEF_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE);
11000 if (
SgArrayType* arrayType=isSgArrayType(expressionType)) {
11001 if(
SgArrayType* strippedArrayType = isSgArrayType(arrayType->stripType(SgType::STRIP_TYPEDEF_TYPE))) {
11002 SgType* strippedArrayBaseType = strippedArrayType->get_base_type();
11008 if (isSgPointerDerefExp(expression))
11016 ROSE_ASSERT(tempVarInitExpression != NULL);
11027 if (initializeInDeclaration)
11034 ROSE_ASSERT(tempVarDeclaration != NULL);
11037 if (reEvaluate != NULL)
11051 return std::make_pair(tempVarDeclaration, varRefExpression);
11064 SgType* variableType = expressionType;
11067 if (
SgArrayType* arrayType=isSgArrayType(expressionType))
11069 if(
SgArrayType* strippedArrayType = isSgArrayType(arrayType->stripType(SgType::STRIP_TYPEDEF_TYPE))) {
11070 SgType* strippedArrayBaseType = strippedArrayType->get_base_type();
11084 ROSE_ASSERT(tempVarDeclaration != NULL);
11088 return std::make_pair(tempVarDeclaration, varRefExpression);
11095 replaceExpressionInSgExpressionPtrList(
SgExpression* oldExp,
SgExpression* newExp, SgExpressionPtrList& lst,
bool replAll =
false)
11097 SgExpressionPtrList::iterator lim = lst.end();
11098 SgExpressionPtrList::iterator pos = lst.begin();
11103 pos = std::find(pos, lim, oldExp);
11105 if (pos != lim) { *pos = newExp; ++pos; chg =
true; }
11106 }
while (replAll && (pos != lim));
11120 ROSE_ASSERT(oldExp);
11121 ROSE_ASSERT(newExp);
11122 if (oldExp==newExp)
return;
11124 if (isSgVarRefExp(newExp))
11128 ROSE_ASSERT(parent!=NULL);
11134 if (isSgExprStatement(parent)) {
11135 isSgExprStatement(parent)->set_expression(newExp);
11136 }
else if (isSgForStatement(parent)) {
11137 ROSE_ASSERT (isSgForStatement(parent)->get_increment() == oldExp);
11138 isSgForStatement(parent)->set_increment(newExp);
11141 if(matlabFor->get_index() == oldExp)
11142 matlabFor->set_index(newExp);
11143 else if(matlabFor->get_range() == oldExp)
11144 matlabFor->set_range(newExp);
11146 ROSE_ASSERT(!
"sub-expression not found");
11148 if(jovFor->get_initialization() == oldExp)
11149 jovFor->set_initialization(newExp);
11150 else if(jovFor->get_while_expression() == oldExp)
11151 jovFor->set_while_expression(newExp);
11152 else if(jovFor->get_by_or_then_expression() == oldExp)
11153 jovFor->set_by_or_then_expression(newExp);
11155 ROSE_ASSERT(!
"sub-expression not found");
11156 }
else if (
SgRangeExp* rngexp = isSgRangeExp(parent)) {
11157 if (rngexp->get_start() == oldExp)
11158 rngexp->set_start(newExp);
11159 else if (rngexp->get_end() == oldExp)
11160 rngexp->set_end(newExp);
11161 else if (rngexp->get_stride() == oldExp)
11162 rngexp->set_stride(newExp);
11164 ROSE_ASSERT(!
"sub-expression not found");
11165 }
else if (isSgReturnStmt(parent)) {
11166 isSgReturnStmt(parent)->set_expression(newExp);
11167 }
else if (isSgBinaryOp(parent)!=NULL) {
11168 if (oldExp==isSgBinaryOp(parent)->get_lhs_operand()) {
11170 }
else if (oldExp==isSgBinaryOp(parent)->get_rhs_operand()) {
11175 }
else if (isSgUnaryOp(parent)!=NULL){
11176 if (oldExp==isSgUnaryOp(parent)->get_operand_i())
11180 }
else if (isSgConditionalExp(parent) != NULL) {
11190 }
else if (isSgExprListExp(parent) != NULL) {
11191 SgExpressionPtrList& explist = isSgExprListExp(parent)->get_expressions();
11192 for (Rose_STL_Container<SgExpression*>::iterator i=explist.begin();i!=explist.end();i++) {
11193 if (isSgExpression(*i)==oldExp) {
11199 }
else if (isSgValueExp(parent)) {
11204 ROSE_ASSERT(oldExp == actexp->get_expression());
11205 actexp->set_expression(newExp);
11207 if (oldExp == attrexp->get_object()) {
11208 attrexp->set_object(newExp);
11209 }
else if (oldExp == attrexp->get_args()) {
11211 ASSERT_not_null(newLst);
11213 attrexp->set_args(newLst);
11218 }
else if ((parentExp=isSgExpression(parent)) != NULL) {
11221 ROSE_ASSERT (worked);
11222 }
else if (isSgInitializedName(parent)) {
11224 if (oldExp == initializedNameParent->get_initializer()) {
11226 ROSE_ASSERT(isSgInitializer(newExp));
11227 initializedNameParent->set_initializer(isSgInitializer(newExp));
11232 }
else if (isSgCaseOptionStmt(parent)) {
11234 if (oldExp == case_stmt->
get_key()) {
11236 }
else if(oldExp == case_stmt->get_key_range_end()) {
11237 case_stmt->set_key_range_end(newExp);
11241 }
else if (isSgProcessControlStatement(parent)) {
11243 if (oldExp == ctrl_stmt->get_quiet()) {
11244 ctrl_stmt->set_quiet(newExp);
11245 }
else if (oldExp == ctrl_stmt->get_code()) {
11246 ctrl_stmt->set_code(newExp);
11250 }
else if (isSgFortranDo(parent)) {
11252 if (oldExp == fortranDo->get_initialization()) {
11253 fortranDo->set_initialization(newExp);
11254 }
else if(oldExp == fortranDo->get_bound()) {
11255 fortranDo->set_bound(newExp);
11256 }
else if (oldExp == fortranDo->get_increment()) {
11257 fortranDo->set_increment(newExp);
11263 ROSE_ASSERT(oldExp == stm->get_condition());
11264 stm->set_condition(newExp);
11267 ROSE_ASSERT(oldExp == ptype->get_modexpr());
11268 ptype->set_modexpr(newExp);
11271 ROSE_ASSERT(oldExp == stm->get_time());
11272 stm->set_time(newExp);
11274 ROSE_ASSERT(oldExp == clause->get_size());
11275 clause->set_size(newExp);
11277 ROSE_ASSERT(oldExp == dcl->get_renamed());
11278 dcl->set_renamed(newExp);
11280 ROSE_ASSERT(oldExp == dcl->get_entryBarrier());
11281 dcl->set_entryBarrier(newExp);
11283 ROSE_ASSERT(oldExp == stm->get_guard());
11284 stm->set_guard(newExp);
11286 ROSE_ASSERT(oldExp == delc->get_delta());
11287 delc->set_delta(newExp);
11289 ROSE_ASSERT(oldExp == digc->get_digits());
11290 digc->set_digits(newExp);
11292 replaceExpressionInSgExpressionPtrList(oldExp, newExp, disc->get_discriminants());
11294 ROSE_ASSERT(oldExp == rngc->get_range());
11295 rngc->set_range(newExp);
11297 replaceExpressionInSgExpressionPtrList(oldExp, newExp, idxc->get_indexRanges());
11299 ROSE_ASSERT(oldExp == vtdcl->get_discriminant());
11300 vtdcl->set_discriminant(newExp);
11302 ROSE_ASSERT(oldExp == clause->get_alignment());
11303 clause->set_alignment(newExp);
11306 if (newLst && (oldExp == vtwhen->get_choices()))
11307 vtwhen->set_choices(newLst);
11311 if (oldExp == clause->get_offset())
11312 clause->set_offset(newExp);
11313 else if (oldExp == clause->get_range() && isSgRangeExp(newExp))
11314 clause->set_range(isSgRangeExp(newExp));
11315 else if (oldExp == clause->get_component() && isSgVarRefExp(newExp))
11316 clause->set_component(isSgVarRefExp(newExp));
11320 if (oldExp == rendcl->get_renamed_function())
11321 rendcl->set_renamed_function(newExp);
11325 cerr<<
"SageInterface::replaceExpression(). Unhandled parent expression type of SageIII enum value: " <<parent->
class_name()<<endl;
11340 return Rose::getNextStatement(currentStmt);
11349 return isSgIntVal(e) && isSgIntVal(e)->get_value() == value;
11354 ROSE_ASSERT(func1&& func2);
11355 bool result =
false;
11356 if (func1 == func2)
11362 if (func1->get_name() == func2->get_name())
11367 if (func1->get_qualified_name().getString() +
11368 func1->get_mangled_name().getString() ==
11369 func2->get_qualified_name().getString() +
11370 func2->get_mangled_name().getString()
11376 if (func1->get_name() == func2->get_name())
11381 cout<<
"Error: SageInterface::isSameFunction(): unhandled language"<<endl;
11392 bool result =
false;
11393 ROSE_ASSERT(stmt != NULL);
11395 ROSE_ASSERT(p_scope != NULL);
11400 if (stmtlist[stmtlist.size()-1] == stmt)
11406 if (stmtlist[stmtlist.size()-1] == stmt)
11411 if (stmtlist[stmtlist.size()-1] == stmt)
11423 virtual void visit(
SgNode* n) {
11425 if (valueExp != NULL) {
11426 valueExp->set_originalExpressionTree(NULL);
11430 if (cast_exp != NULL) {
11431 cast_exp->set_originalExpressionTree(NULL);
11436 Visitor().traverse(top, preorder);
11441 while (s && !isSgSwitchStatement(s)) {
11445 return isSgSwitchStatement(s);
11450 while (s && !isSgOmpClauseBodyStatement(s)) {
11456 return isSgOmpClauseBodyStatement(s);
11462 for (; s; s = isSgStatement(s->
get_parent())) {
11467 case V_SgDoWhileStmt: {
11468 if (label.empty()) {
11473 case V_SgForStatement: {
11474 if (label.empty()) {
11479 case V_SgFortranDo:
11480 case V_SgFortranNonblockedDo: {
11481 if (label.empty() ||
11482 label == isSgFortranDo(sc)->get_string_label()) {
11487 case V_SgWhileStmt: {
11488 if (label.empty() ||
11489 label == isSgWhileStmt(sc)->get_string_label()) {
11494 case V_SgSwitchStatement: {
11495 if (stopOnSwitches)
return sc;
11498 case V_SgJavaForEachStatement: {
11499 if (label.empty()) {
11504 case V_SgJavaLabelStatement: {
11505 if (label.empty() ||
11506 label == isSgJavaLabelStatement(sc)->get_label().getString()) {
11522 virtual void visit(
SgNode* n) {
11523 if (isSgBasicBlock(n)) {
11525 bool changes =
true;
11528 for (SgStatementPtrList::iterator i = bb->
get_statements().begin();
11530 if (isSgGotoStatement(*i)) {
11532 SgStatementPtrList::iterator inext = i;
11536 if (!isSgLabelStatement(*inext))
11551 RemoveJumpsToNextStatementVisitor().traverse(top, postorder);
11560 ROSE_ASSERT (parent);
11564 ROSE_ASSERT (bb || fis);
11565 SgStatementPtrList& siblings =
11567 SgStatementPtrList::iterator j =
11568 std::find(siblings.begin(), siblings.end(), stmt);
11569 ROSE_ASSERT (j != siblings.end());
11582 SgLabelStatementPtrSet& used;
11583 SgLabelStatementPtrSet& all;
11586 FindUsedAndAllLabelsVisitor(SgLabelStatementPtrSet& used,
11587 SgLabelStatementPtrSet& all):
11588 used(used), all(all) {}
11590 virtual void visit(
SgNode* n) {
11591 if (isSgGotoStatement(n)) {
11592 used.insert(isSgGotoStatement(n)->get_label());
11594 if (isSgLabelStatement(n)) {
11595 all.insert(isSgLabelStatement(n));
11600 SgLabelStatementPtrSet used;
11601 SgLabelStatementPtrSet unused;
11602 FindUsedAndAllLabelsVisitor(used, unused).traverse(top, preorder);
11604 for (SgLabelStatementPtrSet::iterator i = used.begin();
11605 i != used.end(); ++i) {
11606 assert (unused.find(*i) != unused.end());
11619 for (SgLabelStatementPtrSet::iterator i = unused.begin();
11620 i != unused.end(); ++i) {
11628 l_stmt->set_statement(NULL);
11638 if (isSgWhileStmt(loopStmt))
return isSgWhileStmt(loopStmt)->
get_body();
11639 if (isSgForStatement(loopStmt))
return isSgForStatement(loopStmt)->
get_loop_body();
11640 if (isSgDoWhileStmt(loopStmt))
return isSgDoWhileStmt(loopStmt)->
get_body();
11642 ROSE_ASSERT (!
"Bad loop kind");
11647 if (isSgWhileStmt(loopStmt)) {
11648 isSgWhileStmt(loopStmt)->
set_body(body);
11649 }
else if (isSgForStatement(loopStmt)) {
11651 }
else if (isSgDoWhileStmt(loopStmt)) {
11652 isSgDoWhileStmt(loopStmt)->
set_body(body);
11654 ROSE_ASSERT (!
"Bad loop kind");
11660 if (isSgWhileStmt(loopStmt))
return isSgWhileStmt(loopStmt)->
get_condition();
11661 if (isSgForStatement(loopStmt))
return isSgForStatement(loopStmt)->get_test();
11662 if (isSgDoWhileStmt(loopStmt))
return isSgDoWhileStmt(loopStmt)->
get_condition();
11664 ROSE_ASSERT (!
"Bad loop kind");
11669 if (isSgWhileStmt(loopStmt)) {
11671 }
else if (isSgForStatement(loopStmt)) {
11672 isSgForStatement(loopStmt)->set_test(cond);
11673 }
else if (isSgDoWhileStmt(loopStmt)) {
11676 ROSE_ASSERT (!
"Bad loop kind");
11685 SgCastExp* cast_exp = isSgCastExp(exp);
11686 if (cast_exp != NULL)
11689 assert(operand != 0);
11690 return SkipCasting(operand);
11699 ROSE_ASSERT(loop!=NULL);
11701 SgStatementPtrList &init = loop ->get_init_stmt();
11702 if (init.size() !=1)
11713 ROSE_ASSERT(ivarname != NULL);
11715 if (isSgAssignInitializer(initor))
11717 lbast = isSgAssignInitializer(initor)->
get_operand();
11732 ROSE_ASSERT(funcDef!=NULL);
11734 ROSE_ASSERT(funcBody!=NULL);
11736 std::ostringstream os;
11737 os<<ivarname->get_name().getString();
11742 if (visibleSym != NULL)
11753 Rose_STL_Container<SgNode*> varRefs = NodeQuery::querySubTree(loop,V_SgVarRefExp);
11754 for (Rose_STL_Container<SgNode *>::iterator i = varRefs.begin(); i != varRefs.end(); i++)
11757 if (vRef->get_symbol()==osymbol)
11758 vRef->set_symbol(nsymbol);
11763 init.push_back(ninit);
11770 trans_records.forLoopInitNormalizationTable[loop] =
true;
11771 trans_records.forLoopInitNormalizationRecord[loop] = make_pair (decl, ndecl) ;
11784 ROSE_ASSERT (loop != NULL);
11786 if (!trans_records.forLoopInitNormalizationTable[loop])
11791 ROSE_ASSERT (decl!= NULL);
11792 ROSE_ASSERT (ndecl!= NULL);
11796 SgStatementPtrList &init = loop ->get_init_stmt();
11797 ROSE_ASSERT(init.size() ==1);
11802 ROSE_ASSERT (exp_stmt != NULL);
11803 SgAssignOp* assign_op = isSgAssignOp(exp_stmt->get_expression());
11804 ROSE_ASSERT (assign_op != NULL);
11811 init.push_back(decl);
11822 Rose_STL_Container<SgNode*> varRefs = NodeQuery::querySubTree(loop,V_SgVarRefExp);
11823 for (Rose_STL_Container<SgNode *>::iterator i = varRefs.begin(); i != varRefs.end(); i++)
11826 if (vRef->get_symbol()==osymbol)
11827 vRef->set_symbol(nsymbol);
11831 trans_records.forLoopInitNormalizationTable[loop] =
false;
11837 ROSE_ASSERT(loop != NULL);
11844 if (test_stmt!=NULL)
11846 if (isSgNullStatement(test_stmt))
11852 if (isSgBinaryOp(test))
11856 ROSE_ASSERT(testlhs && testrhs);
11861 SgVarRefExp* testlhs_var = isSgVarRefExp(SkipCasting(testlhs));
11862 if (testlhs_var == NULL )
11865 if (var_symbol==NULL)
11869 case V_SgLessThanOp:
11874 case V_SgGreaterThanOp:
11878 case V_SgLessOrEqualOp:
11879 case V_SgGreaterOrEqualOp:
11880 case V_SgNotEqualOp:
11889 ROSE_ASSERT(loop != NULL);
11893 if (isSgBinaryOp(test))
11897 ROSE_ASSERT(testlhs && testrhs);
11902 SgVarRefExp* testlhs_var = isSgVarRefExp(SkipCasting(testlhs));
11903 if (testlhs_var == NULL )
11906 if (var_symbol==NULL)
11912 ROSE_ASSERT(incr != NULL);
11914 case V_SgPlusPlusOp:
11917 SgVarRefExp* incr_var = isSgVarRefExp(SkipCasting(isSgPlusPlusOp(incr)->get_operand()));
11918 if (incr_var == NULL)
return false;
11919 if ( incr_var->get_symbol() != var_symbol)
11925 case V_SgMinusMinusOp:
11928 SgVarRefExp* incr_var = isSgVarRefExp(SkipCasting(isSgMinusMinusOp(incr)->get_operand()));
11929 if (incr_var == NULL)
return false;
11930 if ( incr_var->get_symbol() != var_symbol)
11936 case V_SgMinusAssignOp:
11938 SgVarRefExp* incr_var = isSgVarRefExp(SkipCasting(isSgMinusAssignOp(incr)->get_lhs_operand()));
11940 ROSE_ASSERT (rhs != NULL);
11941 if (incr_var == NULL)
return false;
11942 if ( incr_var->get_symbol() != var_symbol)
11949 case V_SgPlusAssignOp:
11962 ROSE_ASSERT(loop != NULL);
11980 ROSE_ASSERT(body!=NULL);
11998 ROSE_ASSERT (loop != NULL);
12000 if (isSgNullExpression(e_3))
12003 loop->set_increment(iv);
12018 ROSE_ASSERT(func!=NULL);
12019 AstInterfaceImpl faImpl(func->get_definition()->
get_body());
12020 AstInterface fa(&faImpl);
12021 ArrayAnnotation* annot = ArrayAnnotation::get_inst();
12022 ArrayInterface array_interface (*annot);
12023 array_interface.initialize(fa, AstNodePtrImpl(func->get_definition()));
12024 array_interface.observe(fa);
12025 LoopTransformInterface :: set_astInterface(fa);
12026 LoopTransformInterface :: set_arrayInterface(&array_interface);
12030 AstNodePtr result = AstNodePtrImpl(loop->
get_parent()) ;
12032 LoopUnrolling lu(unrolling_factor);
12035 result = lu(lpTrans, result);
12079#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
12081 if (unrolling_factor <= 1)
12102 cerr<<
"Error in SageInterface::loopUnrolling(): target loop is not canonical."<<endl;
12106 ROSE_ASSERT(ivar&& lb && ub && step);
12107 ROSE_ASSERT(isSgBasicBlock(orig_body));
12110 bool needFringe =
true;
12111 SgForStatement* fringe_loop = deepCopy<SgForStatement>(target_loop);
12129 ROSE_ASSERT(scope != NULL);
12133 attachComment(fringe_decl,
"iter_count = (ub-lb+1)%step ==0?(ub-lb+1)/step: (ub-lb+1)/step+1;");
12134 attachComment(fringe_decl,
"fringe = iter_count%unroll_factor==0 ? 0:unroll_factor*step");
12141 ConstantFolding::constantFoldingOptimization(fringe_decl,
false);
12143 ROSE_ASSERT(ivarname != NULL);
12147 if (isSgIntVal(init1->get_operand_i()))
12148 if (isSgIntVal(init1->get_operand_i())->get_value() == 0)
12149 needFringe =
false;
12153 ROSE_ASSERT(ub_bin_op);
12163 ROSE_ASSERT(step_bin_op != NULL);
12166 bool isPlus =
false;
12167 if (isSgPlusAssignOp(step_bin_op))
12169 else if (isSgMinusAssignOp(step_bin_op))
12173 cerr<<
"Error in SageInterface::loopUnrolling(): illegal incremental exp of a canonical loop"<<endl;
12179 for (
size_t i =1; i<unrolling_factor; i++)
12183 std::vector<SgVarRefExp*> refs = querySubTree<SgVarRefExp> (body, V_SgVarRefExp);
12184 for (std::vector<SgVarRefExp*>::iterator iter = refs.begin(); iter !=refs.end(); iter++)
12213 ConstantFolding::constantFoldingOptimization(scope,
false);
12225static size_t myfactorial (
size_t n)
12228 for (
size_t i=2; i<=n; i++)
12239std::vector<size_t> getPermutationOrder(
size_t n,
size_t lexicoOrder)
12241 size_t k = lexicoOrder;
12242 std::vector<size_t> s(n);
12244 for (
size_t i=0; i<n; i++)
12248 size_t factorial = myfactorial(n-1);
12250 if (k/n>=factorial)
12252 printf(
"Error: in getPermutationOrder(), lexicoOrder is larger than n!-1\n");
12268 for (
size_t j=0; j<n-1; j++)
12272 int tempj = (k/factorial) % (n - j);
12275 int temps = s[j+tempj];
12278 for (
size_t i=j+tempj; i>j; i--)
12285 factorial = factorial /(n-(j+1));
12288 for (
size_t i = 0; i<n; i++)
12320 ROSE_ASSERT(loopNest != NULL);
12321 ROSE_ASSERT(targetLevel >0);
12328 std::vector<SgForStatement* > loops= SageInterface::querySubTree<SgForStatement>(loopNest,V_SgForStatement);
12329 ROSE_ASSERT(loops.size()>=targetLevel);
12347 cerr<<
"Error in SageInterface::loopTiling(): target loop is not canonical."<<endl;
12351 ROSE_ASSERT(ivar&& lb && ub && step);
12359 parent = isSgLocatedNode(loopNest ->get_parent());
12361 ROSE_ASSERT(parent!= NULL);
12363 string ivar2_name =
"_lt_var_"+ivar->get_name().getString();
12373 if (isSgBinaryOp(orig_test))
12375 if (isSgLessOrEqualOp(orig_test))
12377 else if (isSgGreaterOrEqualOp(orig_test))
12383 cerr<<
"Error: illegal condition operator for a canonical loop"<<endl;
12390 cerr<<
"Error: illegal condition expression for a canonical loop"<<endl;
12394 ROSE_ASSERT(cond_stmt != NULL);
12399 SgExpression* orig_incr_exp = target_loop->get_increment();
12400 if( isSgPlusAssignOp(orig_incr_exp))
12404 else if (isSgMinusAssignOp(orig_incr_exp))
12410 cerr<<
"Error: illegal increment expression for a canonical loop"<<endl;
12422 ROSE_ASSERT(assign_op);
12426 ROSE_ASSERT(bin_op);
12446 if (lexicoOrder == 0)
12449 ROSE_ASSERT(loop != NULL);
12451 ROSE_ASSERT (depth >1);
12452 ROSE_ASSERT(lexicoOrder<myfactorial(depth));
12455 std::vector<SgForStatement* > loopNest = SageInterface::querySubTree<SgForStatement>(loop,V_SgForStatement);
12456 ROSE_ASSERT(loopNest.size()>=depth);
12457 std::vector<std::vector<SgNode*> > loopHeads;
12458 for (std::vector<SgForStatement* > ::iterator i = loopNest.begin(); i!= loopNest.end(); i++)
12461 std::vector<SgNode*> head;
12463 head.push_back(cur_loop->get_test());
12464 head.push_back(cur_loop->get_increment());
12465 loopHeads.push_back(head);
12469 std::vector<size_t> changedOrder = getPermutationOrder (depth, lexicoOrder);
12472 for (
size_t i=0; i<depth; i++)
12475 if (i != changedOrder[i])
12478 std::vector<SgNode*> newhead = loopHeads[changedOrder[i]];
12486 init->set_parent(cur_loop);
12491 cur_loop->set_test(test);
12499 cur_loop->set_increment(incr);
12513 ROSE_ASSERT(loop != NULL);
12519 SgAssignOp* assign_op = isSgAssignOp (do_loop->get_initialization());
12520 ROSE_ASSERT (assign_op != NULL);
12522 ROSE_ASSERT (var != NULL);
12523 ivarname = var->get_symbol()->get_declaration();
12524 ROSE_ASSERT (ivarname != NULL);
12538 SgStatementPtrList & init = fs->get_init_stmt();
12539 if (init.size() !=1)
12541 cerr<<
"SageInterface::getLoopIndexVariable(), no or more than one initialization statements are encountered. Not supported yet "<<endl;
12552 if (isSgVariableDeclaration(init1))
12556 ROSE_ASSERT(ivarname != NULL);
12563 SgVarRefExp* var = isSgVarRefExp(SkipCasting(ivarast));
12566 ivarname = var->get_symbol()->get_declaration();
12573 if (
SgCommaOpExp* comma_exp = isSgCommaOpExp(exp_stmt->get_expression()))
12580 SgVarRefExp* var = isSgVarRefExp(assign_op->get_lhs_operand());
12583 ivarname = var->get_symbol()->get_declaration();
12591 mlog[Sawyer::Message::Common::WARN] <<
"Warning: SageInterface::getLoopIndexVariable(). Unhandled init_stmt type of SgForStatement"<<endl;
12592 mlog[Sawyer::Message::Common::WARN] <<
"Init statement is :"<<init1->
class_name() <<
" " <<init1->
unparseToString()<<endl;
12610 ROSE_ASSERT (ivar != NULL);
12611 ROSE_ASSERT (subtree_root != NULL);
12612 bool result =
false;
12617 if (i_index == ivar)
12637 ROSE_ASSERT (loop !=NULL);
12638 SgStatementPtrList& stmt_list = loop->get_init_stmt();
12639 if (stmt_list.size() >1)
return true;
12640 if (stmt_list.size() == 0)
return false;
12645 if (decl_stmt != NULL)
12650 ROSE_ASSERT (exp_stmt != NULL);
12651 if (isSgCommaOpExp (exp_stmt->get_expression()) )
12661 ROSE_ASSERT(loop != NULL);
12669 SgAssignOp* init_assign = isSgAssignOp (init);
12674 bool isCase1=
false;
12679 ivarname = var->get_symbol()->get_declaration();
12681 if (ivarname && lbast )
12693 SgBinaryOp* test = isSgBinaryOp(fs->get_test_expr());
12697 case V_SgLessOrEqualOp:
12698 if (isInclusiveUpperBound != NULL)
12699 *isInclusiveUpperBound =
true;
12700 if (hasIncrementalIterationSpace != NULL)
12701 *hasIncrementalIterationSpace =
true;
12703 case V_SgLessThanOp:
12704 if (isInclusiveUpperBound != NULL)
12705 *isInclusiveUpperBound =
false;
12706 if (hasIncrementalIterationSpace != NULL)
12707 *hasIncrementalIterationSpace =
true;
12709 case V_SgGreaterOrEqualOp:
12710 if (isInclusiveUpperBound != NULL)
12711 *isInclusiveUpperBound =
true;
12712 if (hasIncrementalIterationSpace != NULL)
12713 *hasIncrementalIterationSpace =
false;
12715 case V_SgGreaterThanOp:
12716 if (isInclusiveUpperBound != NULL)
12717 *isInclusiveUpperBound =
false;
12718 if (hasIncrementalIterationSpace != NULL)
12719 *hasIncrementalIterationSpace =
false;
12728 if (testvar == NULL)
12734 ubast = loop->get_bound();
12736 if (isInclusiveUpperBound != NULL)
12737 *isInclusiveUpperBound =
true;
12740 ROSE_ASSERT (incr != NULL);
12741 if (isSgNullExpression(incr))
12743 cerr<<
"Error:isCanonicalDoLoop() found NULL increment expression. Please call doLoopNormalization() first!"<<endl;
12744 ROSE_ASSERT (
false);
12746 if (hasIncrementalIterationSpace != NULL)
12748 *hasIncrementalIterationSpace =
true;
12750 if (
SgIntVal* i_v = isSgIntVal(incr))
12752 if (i_v->get_value()<0)
12753 *hasIncrementalIterationSpace =
false;
12759 case V_SgPlusAssignOp:
12760 case V_SgMinusAssignOp:
12761 incr_var = isSgVarRefExp(SkipCasting(isSgBinaryOp(incr)->get_lhs_operand()));
12764 case V_SgPlusPlusOp:
12765 case V_SgMinusMinusOp:
12766 incr_var = isSgVarRefExp(SkipCasting(isSgUnaryOp(incr)->get_operand()));
12772 if (incr_var == NULL)
12786 if (body != NULL) {
12787 *body = fs->get_body();
12824 ROSE_ASSERT (s != NULL);
12827 std::set<SgNode*> bset = SgNodeHelper::loopRelevantBreakStmtNodes (s);
12828 if (bset.size()!=0 )
12842 ROSE_ASSERT(loop != NULL);
12853 SgStatementPtrList & init = fs->get_init_stmt();
12854 if (init.size() !=1)
12857 SgExpression* ivarast=NULL, *lbast=NULL, *ubast=NULL, *stepast=NULL;
12860 bool isCase1=
false, isCase2=
false;
12862 if (isSgVariableDeclaration(init1))
12866 ROSE_ASSERT(ivarname != NULL);
12868 if (isSgAssignInitializer(initor))
12870 lbast = isSgAssignInitializer(initor)->
get_operand();
12876 SgVarRefExp* var = isSgVarRefExp(SkipCasting(ivarast));
12879 ivarname = var->get_symbol()->get_declaration();
12884 ROSE_ASSERT(!(isCase1&&isCase2));
12886 if (!(isCase1||isCase2))
12898 case V_SgLessOrEqualOp:
12899 if (isInclusiveUpperBound != NULL)
12900 *isInclusiveUpperBound =
true;
12901 if (hasIncrementalIterationSpace != NULL)
12902 *hasIncrementalIterationSpace =
true;
12904 case V_SgLessThanOp:
12905 if (isInclusiveUpperBound != NULL)
12906 *isInclusiveUpperBound =
false;
12907 if (hasIncrementalIterationSpace != NULL)
12908 *hasIncrementalIterationSpace =
true;
12910 case V_SgGreaterOrEqualOp:
12911 if (isInclusiveUpperBound != NULL)
12912 *isInclusiveUpperBound =
true;
12913 if (hasIncrementalIterationSpace != NULL)
12914 *hasIncrementalIterationSpace =
false;
12916 case V_SgGreaterThanOp:
12917 if (isInclusiveUpperBound != NULL)
12918 *isInclusiveUpperBound =
false;
12919 if (hasIncrementalIterationSpace != NULL)
12920 *hasIncrementalIterationSpace =
false;
12929 if (testvar == NULL)
12953 case V_SgPlusAssignOp:
12954 case V_SgMinusAssignOp:
12955 incr_var = isSgVarRefExp(SkipCasting(isSgBinaryOp(incr)->get_lhs_operand()));
12958 case V_SgPlusPlusOp:
12959 case V_SgMinusMinusOp:
12960 incr_var = isSgVarRefExp(SkipCasting(isSgUnaryOp(incr)->get_operand()));
12963 case V_SgAssignOp: {
12964 incr_var=isSgVarRefExp(SkipCasting(isSgBinaryOp(incr)->get_lhs_operand()));
12965 if(incr_var == NULL)
12967 SgAddOp* addOp=isSgAddOp(SkipCasting(isSgBinaryOp(incr)->get_rhs_operand()));
12968 SgSubtractOp* subtractOp=isSgSubtractOp(SkipCasting(isSgBinaryOp(incr)->get_rhs_operand()));
12972 else if(subtractOp)
12973 arithOp=subtractOp;
12976 ROSE_ASSERT(arithOp!=0);
12977 if(
SgVarRefExp* varRefExp=isSgVarRefExp(SkipCasting(isSgBinaryOp(arithOp)->get_lhs_operand()))) {
12979 incr_var=varRefExp;
12981 }
else if(
SgVarRefExp* varRefExp=isSgVarRefExp(SkipCasting(isSgBinaryOp(arithOp)->get_rhs_operand()))) {
12982 if(isSgAddOp(arithOp)) {
12984 incr_var=varRefExp;
12994 if (incr_var == NULL)
13015 if (body != NULL) {
13024 ROSE_ASSERT(loop != NULL);
13025 ROSE_ASSERT(lb != NULL);
13030 if (forstmt != NULL)
13035 Rose_STL_Container<SgNode* > testList = NodeQuery::querySubTree( *((forstmt->get_init_stmt()).begin()), V_SgAssignOp);
13036 if (testList.size()>0)
13038 ROSE_ASSERT(testList.size()==1);
13039 SgAssignOp * assignop = isSgAssignOp((*testList.begin()));
13040 ROSE_ASSERT(assignop);
13050 Rose_STL_Container<SgNode* > testList = NodeQuery::querySubTree( *((forstmt->get_init_stmt()).begin()), V_SgAssignInitializer );
13051 ROSE_ASSERT(testList.size()==1);
13053 ROSE_ASSERT(init != NULL);
13054 init->set_operand(lb);
13059 else if (dostmt != NULL)
13062 ROSE_ASSERT (init != NULL);
13064 ROSE_ASSERT (a_op!=NULL);
13071 cerr<<
"Error. SageInterface::setLoopLowerBound(), illegal loop type:"<< loop->
class_name()<<endl;
13072 ROSE_ASSERT (
false);
13079 ROSE_ASSERT(loop != NULL);
13080 ROSE_ASSERT(ub != NULL);
13084 if (forstmt != NULL)
13087 SgBinaryOp * binop= isSgBinaryOp(isSgExprStatement(forstmt->get_test())->get_expression());
13088 ROSE_ASSERT(binop != NULL);
13092 else if (dostmt != NULL)
13094 dostmt->set_bound(ub);
13100 cerr<<
"Error. SageInterface::setLoopUpperBound(), illegal loop type:"<< loop->
class_name()<<endl;
13101 ROSE_ASSERT (
false);
13109 ROSE_ASSERT(loop != NULL);
13110 ROSE_ASSERT(stride != NULL);
13114 if (dostmt != NULL)
13116 dostmt->set_increment(stride);
13120 else if (forstmt != NULL)
13124 Rose_STL_Container<SgNode*> testList = NodeQuery::querySubTree( forstmt->get_increment(), V_SgPlusPlusOp);
13125 if (testList.size()>0)
13127 ROSE_ASSERT(testList.size() == 1);
13129 (isSgPlusPlusOp( *testList.begin())->
get_operand()));
13131 forstmt->set_increment(plusassignop);
13135 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgMinusMinusOp);
13136 if (testList.size()>0)
13138 ROSE_ASSERT(testList.size()==1);
13140 (isSgMinusMinusOp(*testList.begin())->
get_operand()));
13142 forstmt->set_increment(plusassignop);
13146 testList = NodeQuery::querySubTree( forstmt->get_increment(), V_SgPlusAssignOp);
13147 if (testList.size()>0)
13149 ROSE_ASSERT(testList.size()==1);
13150 SgPlusAssignOp * assignop = isSgPlusAssignOp(*(testList.begin()));
13151 ROSE_ASSERT(assignop!=NULL);
13156 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgMinusAssignOp);
13157 if (testList.size()>0)
13159 ROSE_ASSERT(testList.size()==1);
13162 SgExprStatement* exprstmt = isSgExprStatement((*testList.begin())->get_parent());
13163 ROSE_ASSERT(exprstmt !=NULL);
13165 exprstmt->set_expression(plusassignop);
13176 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgAddOp);
13177 if (testList.size()>0)
13179 ROSE_ASSERT(testList.size()==1);
13181 SgAddOp * addop = isSgAddOp(*(testList.begin()));
13182 ROSE_ASSERT(addop!=NULL);
13196 testList = NodeQuery::querySubTree(forstmt->get_increment(), V_SgSubtractOp);
13197 if (testList.size()>0)
13199 ROSE_ASSERT(testList.size()==1);
13201 SgSubtractOp * subtractop = isSgSubtractOp(*(testList.begin()));
13202 ROSE_ASSERT(subtractop!=NULL);
13205 SgAssignOp *assignop = isSgAssignOp((*testList.begin())->get_parent());
13206 ROSE_ASSERT(assignop !=NULL);
13213 cerr<<
"Error. SageInterface::setLoopStride(), illegal loop type:"<< loop->
class_name()<<endl;
13214 ROSE_ASSERT (
false);
13225 SgExpression *exp = (n != 0)? n->get_expression() : isSgExpression(s);
13228 case V_SgPlusAssignOp:
13229 case V_SgMinusAssignOp:
13230 case V_SgAndAssignOp:
13231 case V_SgIorAssignOp:
13232 case V_SgMultAssignOp:
13233 case V_SgDivAssignOp:
13234 case V_SgModAssignOp:
13235 case V_SgXorAssignOp:
13243 if ( init->variantT() == V_SgAssignInitializer)
13244 init = isSgAssignInitializer(init)->
get_operand();
13248 *readlhs = (exp->
variantT() != V_SgAssignOp);
13262 Rose_STL_Container<SgNode*> gotos = NodeQuery::querySubTree(top,V_SgGotoStatement);
13263 for (
size_t i = 0; i < gotos.size(); ++i)
13268 if (!lsParent)
continue;
13271 size_t j = std::find(bbStatements.begin(), bbStatements.end(), ls) - bbStatements.begin();
13273 ROSE_ASSERT (j != bbStatements.size());
13275 while (j < bbStatements.size() - 1 && isSgLabelStatement(bbStatements[j + 1]))
13279 gs->
set_label(isSgLabelStatement(bbStatements[j]));
13295 ROSE_ASSERT(decl != NULL);
13296 ROSE_ASSERT(assign_stmt != NULL);
13299 SgAssignOp * assign_op = isSgAssignOp (assign_stmt->get_expression());
13300 if (assign_op == NULL)
13303 if (assign_op_var == NULL)
return false;
13307 if (decl_var->get_initptr()!= NULL )
return false;
13314 if (decl_var_symbol!=NULL)
13317 if (assign_op_var->get_symbol() != decl_var_symbol)
return false;
13322 if (assign_op_var->get_symbol()->
get_name() != decl_var ->get_name())
return false;
13336 if (removeAssignStmt)
13340 decl_var->set_initptr(initor);
13351 ROSE_ASSERT(assign_stmt != NULL);
13352 SgAssignOp * assign_op = isSgAssignOp (assign_stmt->get_expression());
13353 if (assign_op == NULL)
13356 if (assign_op_var == NULL)
13360 ROSE_ASSERT(decl != NULL);
13362 if (decl_var->get_initptr()!= NULL)
13369 ROSE_ASSERT(decl_var != NULL);
13371 if (decl_var_symbol != NULL) {
13373 if (assign_op_var->get_symbol() != decl_var_symbol)
13379 if (assign_op_var->get_symbol()->
get_name() != decl_var ->get_name())
13392 decl_var->set_initptr(initor);
13422 ROSE_ASSERT (decl != NULL);
13426 if (initor == NULL)
13433 rhs = ainitor->get_operand();
13439 decl_var->set_initptr(NULL);
13451 cerr<<
"SageInterface::splitVariableDeclaration() topLevelOnly == false is not yet implemented."<<endl;
13452 ROSE_ASSERT (
false);
13455 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(scope, V_SgVariableDeclaration);
13456 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
13461 ROSE_ASSERT(decl != NULL);
13474 ROSE_ASSERT (root != NULL);
13477 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(root, V_SgVarRefExp);
13481 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
13484 ROSE_ASSERT (vRef != NULL);
13485 result.push_back(vRef);
13492 ROSE_ASSERT (root != NULL);
13493 Rose_STL_Container<SgNode*> constructorList= NodeQuery::querySubTree(root, V_SgConstructorInitializer);
13494 for (
size_t i =0; i< constructorList.size(); i++)
13499 Rose_STL_Container<SgNode*> varList = NodeQuery::querySubTree (a_type->get_index(),V_SgVarRefExp);
13500 for (
size_t j =0 ; j< varList.size(); j++)
13502 SgVarRefExp* var_exp = isSgVarRefExp(varList[j]) ;
13503 currentVarRefList.push_back(var_exp);
13527 SgExpression* lhsCopy = isSgExpression(lhs->copy(treeCopy));
13528 ROSE_ASSERT (lhsCopy);
13552 SgExpression* lhsCopy = isSgExpression(lhs->copy(treeCopy));
13553 ROSE_ASSERT (lhsCopy);
13577 SgExpression* lhsCopy = isSgExpression(lhs->copy(treeCopy));
13578 ROSE_ASSERT (lhsCopy);
13595 ROSE_ASSERT(from != NULL);
13597#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
13601 ROSE_ASSERT (
false);
13606 SgStatement* stmt = getStatementOfExpression(from);
13608 if (!isSgForInitStatement(stmt->
get_parent())) {
13617 if (!parent && isSgForInitStatement(stmt->
get_parent()))
13623 SgName varname =
"rose_temp__";
13624 if (newName ==
"") {
13632 vector<SgExpression*> ancestors;
13633 for (
SgExpression *expr = from, *anc = isSgExpression(fromparent); anc != 0;
13634 expr = anc, anc = isSgExpression(anc->get_parent()))
13636 if ((isSgAndOp(anc) && expr != isSgAndOp(anc)->get_lhs_operand()) ||
13639 ancestors.push_back(anc);
13642 for (vector<SgExpression*>::reverse_iterator ai = ancestors.rbegin(); ai != ancestors.rend(); ++ai)
13645 switch ((*ai)->variantT()) {
13650 case V_SgConditionalExp:
13652 default: assert (!
"Should not happen"); abort();
13657 if (ancestors.size() != 0) {
13665 ROSE_ASSERT (initname);
13667 replaceExpressionWithExpression(from, varref);
13671 initname->set_initializer(ai);
13673 myStatementInsert(stmt, vardecl,
true);
13694 SplitStatementGenerator gen;
13700 Rose_STL_Container<SgNode*> gotos = NodeQuery::querySubTree(top,
13701 V_SgGotoStatement);
13702 map<SgLabelStatement*, SgLabelStatement*> labelsToReplace;
for
13703 (
size_t i = 0; i < gotos.size(); ++i) {
13706 if (!gsParent)
continue;
13708 size_t j = std::find(bbStatements.begin(), bbStatements.end(), gs)
13709 - bbStatements.begin();
13710 ROSE_ASSERT (j != bbStatements.size());
13711 if (j == 0)
continue;
13712 if (isSgLabelStatement(bbStatements[j - 1])) {
13713 labelsToReplace[isSgLabelStatement(bbStatements[j - 1])] =
13717 for (
size_t i = 0; i < gotos.size(); ++i) {
13720 while (labelsToReplace.find(oldLabel) != labelsToReplace.end()) {
13721 oldLabel = labelsToReplace[oldLabel];
13731 case V_SgBoolValExp:
return (isSgBoolValExp(e)->get_value() != 0);
13733 case V_SgBoolValExp:
return (isSgBoolValExp(e)->get_value() ==
true);
13735 case V_SgIntVal:
return isSgIntVal(e)->get_value() != 0;
13736 case V_SgCastExp:
return isConstantTrue(isSgCastExp(e)->get_operand());
13738 case V_SgAddressOfOp:
return true;
13739 default:
return false;
13745 case V_SgBoolValExp:
return isSgBoolValExp(e)->get_value() ==
false;
13746 case V_SgIntVal:
return isSgIntVal(e)->get_value() == 0;
13747 case V_SgCastExp:
return
13749 case V_SgNotOp:
return isConstantTrue(isSgNotOp(e)->get_operand());
13750 default:
return false;
13757 if (!fc)
return false;
13759 if (fr == NULL)
return false;
13760 return fr->get_symbol()->get_declaration() == decl;
13766 if (!fc)
return false;
13768 if (fr == NULL)
return false;
13770 fr->get_symbol()->get_declaration()->get_qualified_name().getString();
13771 return (name == qualifiedName &&
13772 fc->get_args()->get_expressions().size() == arity);
13777 ROSE_ASSERT( e != NULL);
13793 ROSE_ASSERT(expList);
13795 expList->append_expression(exp);
13801 for (
size_t i = 0; i < exp.size(); ++i)
13810template <
class actualFunction>
13820 ROSE_ASSERT(paralist);
13825 cerr <<
"Waring! Setting a used SgFunctionParameterList to function: "
13826 << (func->get_name()).getString()<<endl
13827 <<
" Sharing parameter lists can corrupt symbol tables!"<<endl
13828 <<
" Please use deepCopy() to get an exclusive parameter list for each function declaration!"<<endl;
13833 if (func->get_parameterList() != NULL)
13834 if (func->get_parameterList() != paralist)
13835 delete func->get_parameterList();
13837 func->set_parameterList(paralist);
13845 ROSE_ASSERT(paraList != NULL);
13846 ROSE_ASSERT(initName != NULL);
13848 if (isPrepend ==
true)
13849 paraList->prepend_arg(initName);
13851 paraList->append_arg(initName);
13858 ROSE_ASSERT(initName->
get_parent() == paraList);
13868 if (func_decl != NULL)
13874 ROSE_ASSERT(func_def);
13884 initName->set_declptr(func_decl);
13896 initName->set_scope(scope);
13916 return addArg(paraList,initName,
false);
13921 return addArg(paraList,initName,
true);
13927 ROSE_ASSERT(pragma);
13928 if (decl->get_pragma()!=NULL)
delete (decl->get_pragma());
13929 decl->set_pragma(pragma);
13940 void testAstForUniqueNodes (
SgNode* node );
13943 printf (
"In SageInterface::appendStatement(): stmt = %p = %s scope = %p \n",stmt,stmt->
class_name().c_str(),scope);
13952 printf (
" --- scope was not specified as input! \n");
13957 ROSE_ASSERT(stmt != NULL);
13958 ROSE_ASSERT(scope != NULL);
13961 printf (
"In SageInterface::appendStatement(): stmt = %p = %s scope = %p = %s \n",stmt,stmt->
class_name().c_str(),scope,scope->
class_name().c_str());
13968 if (declarationStatement != NULL)
13996 scope->insertStatementInScope(stmt,
false);
14000 bool skipAddingStatement =
false;
14002 if (classDeclaration != NULL)
14008 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());
14014 skipAddingStatement = (classDeclaration->get_isAutonomousDeclaration() ==
false);
14018 skipAddingStatement = (classDeclaration->get_isAutonomousDeclaration() ==
false) || (classDeclaration->
get_parent() != NULL);
14033 if (statementAlreadyExistsInScope ==
true)
14035 if (isSgTemplateInstantiationDecl(classDeclaration) != NULL)
14039#if PRINT_DEVELOPER_WARNINGS
14040 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",
14048 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",
14053 skipAddingStatement =
true;
14060 if (enumDeclaration != NULL)
14063 skipAddingStatement = (enumDeclaration->get_isAutonomousDeclaration() ==
false);
14072 if (skipAddingStatement ==
false && statementAlreadyExistsInScope ==
true)
14075 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",
14079 printf (
"Exiting as a test! \n");
14082 skipAddingStatement =
true;
14087 printf (
" --- skipAddingStatement = %s \n",skipAddingStatement ?
"true" :
"false");
14090 if (skipAddingStatement ==
false)
14102 printf (
" --- calling insertStatementInScope(): scope = %p = %s stmt = %p = %s \n",scope,scope->
class_name().c_str(),stmt,stmt->
class_name().c_str());
14104 scope->insertStatementInScope(stmt,
false);
14131 testAstForUniqueNodes(scope);
14140 ROSE_ASSERT (stmt != NULL);
14141 ROSE_ASSERT (for_init_stmt != NULL);
14144 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());
14153 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());
14161 for_init_stmt->append_init_stmt (stmt);
14167 for (
size_t i = 0; i < stmts.size(); ++i)
14170#ifdef ROSE_DEBUG_NEW_EDG_ROSE_CONNECTION
14171 printf (
"In appendStatementList(): stmts[i = %" PRIuPTR
"] = %p = %s \n",i,stmts[i],stmts[i]->class_name().c_str());
14177 if (stmts[i]->get_parent() != NULL)
14180#ifdef ROSE_DEBUG_NEW_EDG_ROSE_CONNECTION
14181 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());
14188 printf (
" --- WARNING: In appendStatementList(): stmts[i = %" PRIuPTR
"] not added to scope (because stmts[i]->get_parent() == NULL) \n",i);
14197 ROSE_ASSERT (stmt != NULL);
14200 printf (
"In SageInterface::prependStatement(): stmt = %p = %s scope = %p \n",stmt,stmt->
class_name().c_str(),scope);
14210 ROSE_ASSERT(scope != NULL);
14220 printf (
"In SageInterface::prependStatement(): stmt = %p = %s scope = %p = %s (resetInternalMapsForTargetStatement: stmt) \n",
14232 printf (
"In SageInterface::prependStatement(): stmt = %p = %s scope = %p = %s (resetInternalMapsForTargetStatement: scope) \n",
14244 printf (
"Calling insertStatementInScope() \n");
14250 scope->insertStatementInScope(stmt,
true);
14270 printf (
"Leaving SageInterface::prependStatement() \n");
14278 ROSE_ASSERT (stmt != NULL);
14279 ROSE_ASSERT (for_init_stmt != NULL);
14282 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());
14291 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());
14299 for_init_stmt->prepend_init_stmt (stmt);
14304 for (
size_t i = stmts.size(); i > 0; --i)
14316 ROSE_ASSERT (scope != NULL);
14319 case V_SgBasicBlock:
14320 case V_SgClassDefinition:
14321 case V_SgFunctionDefinition:
14323 case V_SgNamespaceDefinitionStatement:
14327 case V_SgAssociateStatement :
14328 case V_SgBlockDataStatement :
14329 case V_SgCatchOptionStmt:
14330 case V_SgDoWhileStmt:
14331 case V_SgForAllStatement:
14332 case V_SgForStatement:
14333 case V_SgFortranDo:
14335 case V_SgSwitchStatement:
14336 case V_SgUpcForAllStatement:
14337 case V_SgWhileStmt:
14342 cout<<
"unrecognized or unhandled scope type for SageInterface::hasSimpleChildrenList() "<<endl;
14355 SgDeclarationStatementPtrList & declarationList = globalScope->
get_declarations();
14358 SgDeclarationStatementPtrList::iterator i = declarationList.begin();
14360 while (i != declarationList.end() && (*i)->get_file_info() != NULL && (*i)->get_file_info()->isFrontendSpecific() ==
true)
14363 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");
14365 last_statement = *i;
14370 ROSE_ASSERT(last_statement != NULL);
14372 printf (
"last_statement = %p = %s \n",last_statement,last_statement->
class_name().c_str());
14375 printf (
"Exiting as a test! \n");
14379 return last_statement;
14388 ROSE_ASSERT(targetStmt &&newStmt);
14389 ROSE_ASSERT(targetStmt != newStmt);
14391 if (parent == NULL)
14393 cerr <<
"Empty parent pointer for target statement. May be caused by the wrong order of target and new statements in insertStatement(targetStmt, newStmt)"<<endl;
14394 ROSE_ASSERT(parent);
14397 if (isSgLabelStatement(parent) != NULL)
14400 printf (
"In SageInterface::insertStatement(): Detected case of label statement as parent, using parent of label statement \n");
14405 ROSE_ASSERT(isSgLabelStatement(parent) == NULL);
14409 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());
14427 ROSE_ASSERT(scope);
14430 printf (
"targetStmt = %p = %s \n",targetStmt,targetStmt->
class_name().c_str());
14431 printf (
"scope = %p = %s \n",scope,scope->
class_name().c_str());
14449 ROSE_ASSERT(isSgStatement(parent) != NULL);
14454 ROSE_ASSERT(targetStmt != NULL);
14458 printf (
"In SageInterface::insertStatement(): after checking for associated comments \n");
14459 reportNodesMarkedAsModified(scope);
14465 if (autoMovePreprocessingInfo)
14467 if (comments != NULL && isSgBasicBlock(newStmt) == NULL)
14469 vector<int> captureList;
14471 printf (
"Found attached comments (at %p = %s, inserting %p = %s insertBefore = %s): comments->size() = %" PRIuPTR
" \n",
14472 targetStmt,targetStmt->
class_name().c_str(),newStmt,newStmt->
class_name().c_str(),insertBefore ?
"true" :
"false",comments->size());
14479 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");
14484 int commentIndex = 0;
14485 AttachedPreprocessingInfoType::iterator i;
14486 for (i = comments->begin(); i != comments->end(); i++)
14488 ROSE_ASSERT ( (*i) != NULL );
14490 printf (
" Attached Comment (relativePosition=%s): %s\n",
14491 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
14492 (*i)->getString().c_str());
14493 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
14494 (*i)->get_file_info()->display(
"comment/directive location");
14497 if ((*i)->getRelativePosition() == relativePosition)
14500 captureList.push_back(commentIndex);
14507 if (captureList.empty() ==
false)
14513 ROSE_ASSERT(surroundingStatement != targetStmt);
14514 ROSE_ASSERT(surroundingStatement != NULL);
14516 if (surroundingStatement == NULL)
14519 surroundingStatement = (insertBefore ==
true) ? newStmt : newStmt;
14524 vector<int>::iterator j = captureList.begin();
14525 while (j != captureList.end())
14533 (*comments)[*j] = NULL;
14540 for (
size_t n = 0; n < captureList.size(); n++)
14542 AttachedPreprocessingInfoType::iterator k = comments->begin();
14543 while (k != comments->end())
14548 comments->erase(k);
14561 if (comments != NULL)
14563 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");
14570 printf (
"In SageInterface::insertStatement(): after processing associated comments \n");
14571 reportNodesMarkedAsModified(scope);
14574 if (isSgIfStmt(parent))
14576 if (isSgIfStmt(parent)->get_conditional()==targetStmt)
14582 if (isSgIfStmt(parent)->get_true_body()==targetStmt)
14602 if (isSgIfStmt(parent)->get_false_body()==targetStmt)
14616 if (isSgWhileStmt(parent))
14618 if (isSgWhileStmt(parent)->get_condition()==targetStmt)
14624 if (isSgWhileStmt(parent)->get_body()==targetStmt)
14627 isSgWhileStmt(parent)->
set_body(newparent);
14637 if (isSgDoWhileStmt(parent))
14639 if (isSgDoWhileStmt(parent)->get_condition()==targetStmt)
14645 if (isSgDoWhileStmt(parent)->get_body()==targetStmt)
14648 isSgDoWhileStmt(parent)->
set_body(newparent);
14658 if (isSgForStatement(parent))
14660 if (isSgForStatement(parent)->get_loop_body()==targetStmt)
14671 if (isSgForStatement(parent)->get_test()==targetStmt)
14692 p->set_body(newparent);
14700 ROSE_ASSERT(stmnt != NULL);
14722 printf (
"In SageInterface::insertStatement(): at BASE of function \n");
14723 reportNodesMarkedAsModified(scope);
14732 for (
size_t i = 0; i < newStmts.size(); ++i)
14739 for (
size_t i = newStmts.size(); i > 0; --i)
14748 insertStatement(targetStmt,newStmt,
false, autoMovePreprocessingInfo);
14759 ROSE_ASSERT (stmt != NULL);
14760 ROSE_ASSERT (scope != NULL);
14772 ROSE_ASSERT (scope != NULL);
14773 vector <SgStatement* >::iterator iter;
14775 for (iter= stmt_list.begin(); iter != stmt_list.end(); iter++)
14777 if (iter == stmt_list.begin())
14783 ROSE_ASSERT (prev_stmt != NULL);
14792 ROSE_ASSERT(newStmt!=NULL);
14793 ROSE_ASSERT(scope!=NULL);
14795 if (!isSgDeclarationStatement(targetStmt)) {
14805 ROSE_ASSERT(scope!=NULL);
14807 if (!isSgDeclarationStatement(targetStmt)) {
14830 ROSE_ASSERT(target);
14831 ROSE_ASSERT(operand);
14832 ROSE_ASSERT(target!=operand);
14833 switch (target->variantT())
14835 case V_SgActualArgumentExpression:
14836 isSgActualArgumentExpression(target)->set_expression(operand);
14839 isSgAsmOp(target)->set_expression(operand);
14842 isSgSizeOfOp(target)->set_operand_expr(operand);
14845 isSgTypeIdOp(target)->set_operand_expr(operand);
14848 isSgVarArgOp(target)->set_operand_expr(operand);
14850 case V_SgVarArgStartOneOperandOp:
14851 isSgVarArgStartOneOperandOp(target)->set_operand_expr(operand);
14853 case V_SgAssignInitializer:
14854 isSgAssignInitializer (target)->
set_operand(operand);
14857 if (isSgUnaryOp(target)!=NULL)
14861 cerr<<
"\tSageInterface::setOperand(): unhandled case for target expression of type "
14862 <<target->class_name()<<endl;
14867 markLhsValues(target);
14873 ROSE_ASSERT(target);
14875 ROSE_ASSERT(target!=lhs);
14876 bool hasrhs =
false;
14882 if (varargcopy!=NULL)
14884 varargcopy->set_lhs_operand(lhs);
14885 if( varargcopy->get_rhs_operand()!=NULL) hasrhs=
true;
14887 else if(varargstart!=NULL)
14889 varargstart->set_lhs_operand(lhs);
14890 if( varargstart->get_rhs_operand()!=NULL) hasrhs=
true;
14892 else if(binary!=NULL)
14899 cout<<
"SageInterface::setLhsOperand(): unhandled case for target expression of type "
14900 <<target->class_name()<<endl;
14907 markLhsValues(target);
14912 ROSE_ASSERT(target);
14914 ROSE_ASSERT(target!=rhs);
14915 bool haslhs =
false;
14921 if (varargcopy!=NULL)
14923 varargcopy->set_rhs_operand(rhs);
14924 if( varargcopy->get_lhs_operand()!=NULL) haslhs=
true;
14926 else if(varargstart!=NULL)
14928 varargstart->set_rhs_operand(rhs);
14929 if( varargstart->get_lhs_operand()!=NULL) haslhs=
true;
14931 else if(binary!=NULL)
14938 cout<<
"SageInterface::setRhsOperand(): unhandled case for target expression of type "
14939 <<target->class_name()<<endl;
14945 markLhsValues(target);
14964 ROSE_ASSERT(parentFileList != NULL);
14970 if (parentDirectory != NULL)
14973 parentDirectory->get_directoryList()->get_listOfDirectories().push_back(directory);
14980 project = isSgProject(parentFileList->
get_parent());
14981 ROSE_ASSERT(project != NULL);
14984 project->get_directoryList()->get_listOfDirectories().push_back(directory);
14991 directory->get_fileList()->get_listOfFiles().push_back(file);
14994 parentFileList->get_listOfFiles().erase(find(parentFileList->get_listOfFiles().begin(),parentFileList->get_listOfFiles().end(),file));
15004 ROSE_ASSERT(structDecl != NULL);
15005 ROSE_ASSERT(scope != NULL);
15007 ROSE_ASSERT(nondefdecl != NULL);
15033 SgName name = structDecl->get_name();
15047 if (mysymbol == NULL)
15049 printf (
"Note: SageInterface::fixStructDeclaration(): structDecl = %p nondefdecl = %p (mysymbol == NULL) \n",structDecl,nondefdecl);
15053 ROSE_ASSERT(structDecl->
get_scope() != NULL);
15058 ROSE_ASSERT(mysymbol);
15061 printf (
"############## DANGER:DANGER:DANGER ################\n");
15063 printf (
"In SageInterface::fixStructDeclaration(): Adding class symbol to scope = %p = %s \n",scope,scope->
class_name().c_str());
15071 printf (
"*** WARNING: In SageInterface::fixStructDeclaration(): (mysymbol == NULL) Commented out the setting of the parent to be the same as the scope \n");
15080 printf (
"In SageInterface::fixStructDeclaration(): (mysymbol == NULL) Skipped building an associated symbol! \n");
15085 ROSE_ASSERT(nondefdecl->get_type() != NULL);
15088 ROSE_ASSERT(nondefdecl->get_type()->
variantT() != V_SgNode);
15091 ROSE_ASSERT(isSgClassType(nondefdecl->get_type()) != NULL);
15095 if (nondefdecl->get_type() == NULL)
15099 ROSE_ASSERT (nondefdecl->get_type() != NULL);
15102 if (defdecl != NULL)
15105 ROSE_ASSERT(defdecl->get_type()->
variantT() != V_SgNode);
15108 ROSE_ASSERT(isSgClassType(defdecl->get_type()) != NULL);
15112 if (defdecl != NULL)
15115 ROSE_ASSERT(defdecl->get_type() != NULL);
15116 if (defdecl->get_type() != nondefdecl->get_type())
15118 printf (
"ERROR: defdecl->get_type() != nondefdecl->get_type(): what are these: \n");
15119 printf (
" defdecl->get_type() = %p = %s \n",defdecl ->get_type(),defdecl ->get_type()->class_name().c_str());
15120 SgNamedType* namedType_definingDecl = isSgNamedType(defdecl->get_type());
15121 if (namedType_definingDecl != NULL)
15123 printf (
"namedType_definingDecl->get_declaration() = %p = %s \n",namedType_definingDecl->get_declaration(),namedType_definingDecl->get_declaration()->
class_name().c_str());
15125 printf (
" nondefdecl->get_type() = %p = %s \n",nondefdecl->get_type(),nondefdecl->get_type()->
class_name().c_str());
15126 SgNamedType* namedType_nondefiningDecl = isSgNamedType(nondefdecl->get_type());
15127 if (namedType_nondefiningDecl != NULL)
15129 printf (
"namedType_nondefiningDecl->get_declaration() = %p = %s \n",namedType_nondefiningDecl->get_declaration(),namedType_nondefiningDecl->get_declaration()->
class_name().c_str());
15145 ROSE_ASSERT(structDecl);
15146 ROSE_ASSERT(scope);
15148 ROSE_ASSERT(nondefdecl);
15167 if (mysymbol==NULL)
15174 ROSE_ASSERT(mysymbol);
15176 printf (
"In SageInterface::fixNamespaceDeclaration(): inserting namespace symbol into scope = %p = %s \n",scope,scope->
class_name().c_str());
15180 ROSE_ASSERT(defdecl);
15190#define DEBUG__SageInterface__fixVariableDeclaration 0
15194 ROSE_ASSERT(varDecl != NULL);
15195 ROSE_ASSERT(scope != NULL);
15197 SgInitializedNamePtrList namelist = varDecl->
get_variables();
15202#if DEBUG__SageInterface__fixVariableDeclaration
15203 printf (
"In SageInterface::fixVariableDeclaration():\n");
15204 printf (
" varDecl = %p scope = %p = %s \n", varDecl);
15205 printf (
" scope = %p : %s \n", scope, scope->
class_name().c_str());
15208 ROSE_ASSERT(namelist.size() > 0);
15210 SgInitializedNamePtrList::iterator i;
15211 for (i = namelist.begin(); i != namelist.end(); i++)
15214 ROSE_ASSERT(initName != NULL);
15215#if DEBUG__SageInterface__fixVariableDeclaration
15216 printf (
" initName = %p\n", initName);
15217 printf (
" initName->get_scope() = %p : %s\n", initName->get_scope(), initName->get_scope() ? initName->get_scope()->
class_name().c_str() :
"");
15220 SgName name = initName->get_name();
15221#if DEBUG__SageInterface__fixVariableDeclaration
15222 printf (
" name = %s\n", name.str());
15227#if DEBUG__SageInterface__fixVariableDeclaration
15228 printf (
" name = %s\n", name.str());
15235 if (preAssociatedScope != NULL) {
15236 requiredScope = preAssociatedScope;
15240 initName->set_scope(requiredScope);
15245 ROSE_ASSERT(requiredScope != NULL);
15246 SgVariableSymbol* varSymbol = requiredScope->lookup_variable_symbol(name);
15247#if DEBUG__SageInterface__fixVariableDeclaration
15248 printf (
" varSymbol = %p (%s)\n", varSymbol, varSymbol ? varSymbol->
class_name().c_str() :
"");
15250 if (varSymbol == NULL) {
15251 if (scope == initName->get_scope()) {
15252 if (isSgTemplateVariableDeclaration(varDecl)) {
15257 ROSE_ASSERT(varSymbol);
15262 ROSE_ASSERT(prev_decl);
15263 if (initName != prev_decl) {
15264 initName->set_prev_decl_item(prev_decl);
15266 ROSE_ASSERT(initName->get_prev_decl_item() != initName);
15268#if DEBUG__SageInterface__fixVariableDeclaration
15269 printf (
" varSymbol = %p (%s)\n", varSymbol, varSymbol ? varSymbol->
class_name().c_str() :
"");
15287 Rose_STL_Container<SgNode*> varList;
15290 Rose_STL_Container<SgNode*> reflist = NodeQuery::querySubTree(root, V_SgVarRefExp);
15291 for (Rose_STL_Container<SgNode*>::iterator i=reflist.begin();i!=reflist.end();i++)
15293 varRef= isSgVarRefExp(*i);
15294 ROSE_ASSERT(varRef->get_symbol());
15297 ROSE_ASSERT (initname != NULL);
15300 SgName varName=initname->get_name();
15311 if (varRef == arrowExp->get_rhs_operand_i())
15315 SgType* lhs_type = arrowExp->get_lhs_operand_i()->get_type() ;
15316 lhs_type = lhs_type->
stripType(SgType::STRIP_MODIFIER_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE | SgType::STRIP_TYPEDEF_TYPE);
15318 ROSE_ASSERT(ptrType);
15319 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));
15320 ROSE_ASSERT(clsType);
15338 if (varRef == dotExp->get_rhs_operand_i())
15343 SgType* lhs_type = dotExp->get_lhs_operand_i()->get_type() ;
15344 lhs_type = lhs_type->
stripType(SgType::STRIP_MODIFIER_TYPE | SgType::STRIP_REFERENCE_TYPE | SgType::STRIP_RVALUE_REFERENCE_TYPE | SgType::STRIP_TYPEDEF_TYPE);
15346 ROSE_ASSERT(clsType);
15370 if (realSymbol==NULL)
15377 ROSE_ASSERT(realSymbol!=(varRef->get_symbol()));
15384 bool toDelete =
true;
15386 SgSymbol* symbolToDelete = varRef->get_symbol();
15387 varRef->set_symbol(isSgVariableSymbol(realSymbol));
15390 if (varList.empty())
15392 VariantVector vv(V_SgVarRefExp);
15393 varList = NodeQuery::queryMemoryPool(vv);
15396 for (Rose_STL_Container<SgNode*>::iterator i = varList.begin();
15397 i != varList.end(); ++i)
15401 if (var->get_symbol() == symbolToDelete)
15411 delete symbolToDelete;
15420 delete (varRef->get_symbol());
15424 varRef->set_symbol(isSgVariableSymbol(realSymbol));
15431 if (cleanUnusedSymbols)
15438 Rose_STL_Container<SgNode*> symbolList;
15439 VariantVector sym_vv(V_SgVariableSymbol);
15440 symbolList = NodeQuery::queryMemoryPool(sym_vv);
15442 Rose_STL_Container<SgNode*> varList;
15443 VariantVector var_vv(V_SgVarRefExp);
15447 varList = NodeQuery::querySubTree(root, V_SgVarRefExp);
15450 for (Rose_STL_Container<SgNode*>::iterator i = symbolList.begin();
15451 i != symbolList.end(); ++i)
15454 ROSE_ASSERT(symbolToDelete);
15458 bool toDelete =
true;
15462 for (Rose_STL_Container<SgNode*>::iterator j = varList.begin();
15463 j != varList.end(); ++j)
15468 if (var->get_symbol() == symbolToDelete)
15479 std::cout <<
"Symbol " << symbolToDelete->
get_name().str() <<
' ' << symbolToDelete <<
15480 ' ' << symbolToDelete->get_declaration() <<
" is deleted." << std::endl;
15482 delete symbolToDelete->get_declaration();
15483 delete symbolToDelete;
15496 ROSE_ASSERT(label_stmt);
15505 if (isSgFunctionDefinition(scope) !=
nullptr)
15507 ASSERT_not_null(label_scope);
15513 SgLabelSymbol* lsymbol = label_scope->lookup_label_symbol(name);
15515 if (lsymbol ==
nullptr)
15520 ASSERT_not_null(lsymbol);
15532 ROSE_ASSERT (stmt != NULL);
15533 ROSE_ASSERT (label_value >0 && label_value <=99999);
15536 if (label_scope == NULL)
15540 ROSE_ASSERT (label_scope != NULL);
15542 SgLabelSymbol * symbol = label_scope->lookup_label_symbol (label_name);
15543 if (symbol == NULL)
15549 ROSE_ASSERT(symbol != NULL);
15550 symbol->set_fortran_statement(stmt);
15551 symbol->set_numeric_label_value(label_value);
15556 cerr<<
"Error. SageInterface::setFortranNumericLabel() tries to set a duplicated label value!"<<endl;
15557 ROSE_ASSERT (
false);
15566 case SgLabelSymbol::e_start_label_type:
15568 stmt->set_numeric_label(ref_exp);
15571 case SgLabelSymbol::e_end_label_type:
15573 stmt->set_end_numeric_label(ref_exp);
15578 std::cerr <<
"SageInterface::setFortranNumericLabel: unimplemented for label_type " << label_type <<
"\n";
15590 ROSE_ASSERT (func_def != NULL);
15595 std::set<SgNode*>::iterator iter ;
15596 for (iter=symbols.begin(); iter !=symbols.end(); iter++)
15601 int cur_val = l_symbol->get_numeric_label_value();
15602 if (result <=cur_val)
15603 result = cur_val +10;
15607 ROSE_ASSERT (result <= 99999);
15618 ROSE_ASSERT(scope != NULL);
15623 ROSE_ASSERT(fTable != NULL);
15630 printf (
"WARNING: Skip setting the scope of the SgFunctionTypeTable scope = %p = %s \n",scope,scope->
class_name().c_str());
15636 printf (
"In SageInterface::fixStatement(): stmt = %p = %s \n",stmt,stmt->
class_name().c_str());
15649 if (tmfunc != NULL)
15650 assert(tmfunc->
variantT() == V_SgTemplateMemberFunctionDeclaration);
15651 else if (mfunc != NULL)
15652 assert(mfunc->
variantT() == V_SgMemberFunctionDeclaration || mfunc->
variantT() == V_SgTemplateInstantiationMemberFunctionDecl);
15653 else if (tfunc != NULL)
15654 assert(tfunc->
variantT() == V_SgTemplateFunctionDeclaration);
15655 else if (procfunc != NULL)
15656 assert(procfunc->
variantT() == V_SgProcedureHeaderStatement);
15657 else if (progfunc != NULL)
15658 assert(progfunc->
variantT() == V_SgProgramHeaderStatement);
15659 else if (func != NULL)
15660 assert(func->
variantT() == V_SgFunctionDeclaration || func->
variantT() == V_SgTemplateInstantiationFunctionDecl);
15664 printf (
"In SageInterface::fixStatement(): scope = %p = %s \n",scope,scope->
class_name().c_str());
15665 printf (
"In SageInterface::fixStatement(): stmt->get_scope() = %p \n",stmt->
get_scope());
15677 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());
15683 if (tmfunc != NULL)
15685 SgTemplateParameterPtrList & templateParameterList = tmfunc->get_templateParameters();
15688 func_symbol = scope->lookup_template_member_function_symbol (func->get_name(), func->get_type(),&templateParameterList);
15690 else if (mfunc != NULL)
15693 SgTemplateArgumentPtrList* templateArgumentList = (templateInstantiationMemberFunctionDecl != NULL) ? &(templateInstantiationMemberFunctionDecl->
get_templateArguments()) : NULL;
15695 func_symbol = scope->lookup_nontemplate_member_function_symbol (func->get_name(), func->get_type(),templateArgumentList);
15697 else if (tfunc != NULL)
15699 SgTemplateParameterPtrList & templateParameterList = tfunc->get_templateParameters();
15701 printf (
"In SageInterface::fixStatement(): templateParameterList.size() = %" PRIuPTR
" \n",templateParameterList.size());
15705 func_symbol = scope->lookup_template_function_symbol (func->get_name(), func->get_type(),&templateParameterList);
15707 else if (procfunc != NULL)
15710 printf (
"In SageInterface::fixStatement(): procfunc->get_name() = %s calling lookup_function_symbol() \n",procfunc->get_name().str());
15712 func_symbol = scope->lookup_function_symbol (procfunc->get_name(), procfunc->get_type());
15713 assert(func_symbol != NULL);
15715 else if (progfunc != NULL)
15717 func_symbol = scope->lookup_function_symbol (progfunc->get_name(), progfunc->get_type());
15718 assert(func_symbol != NULL);
15720 else if (func != NULL)
15723 printf (
"In SageInterface::fixStatement(): func->get_name() = %s calling lookup_function_symbol() \n",func->get_name().str());
15726 SgTemplateArgumentPtrList* templateArgumentList = (templateInstantiationFunctionDecl != NULL) ? &(templateInstantiationFunctionDecl->
get_templateArguments()) : NULL;
15728 func_symbol = scope->lookup_function_symbol (func->get_name(), func->get_type(),templateArgumentList);
15733 if (func_symbol == NULL)
15745 printf (
"In SageInterface::fixStatement(): func_symbol = %p \n",func_symbol);
15747 assert(func_symbol != NULL);
15758 printf (
"Need to handle SgTemplateDeclaration IR nodes as well...(implement later) \n");
15766 if (isSgVariableDeclaration(stmt))
15773 ROSE_ASSERT(classDeclaration !=
nullptr);
15776 else if (isSgClassDeclaration(stmt))
15780 else if (isSgLabelStatement(stmt))
15784 else if (isSgFunctionDeclaration(stmt))
15792 ROSE_ASSERT(fTable);
15801 printf (
"In SageInterface::fixStatement(): scope = %p = %s \n",scope,scope->
class_name().c_str());
15802 printf (
"In SageInterface::fixStatement(): stmt->get_scope() = %p \n",stmt->
get_scope());
15813 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());
15815 SgFunctionSymbol* func_symbol = scope->lookup_function_symbol (func->get_name(), func->get_type());
15817 printf (
"In SageInterface::fixStatement(): func_symbol = %p \n",func_symbol);
15818 if (func_symbol == NULL)
15830 ROSE_ASSERT (func_symbol != NULL);
15836 printf (
"In SageInterface::fixStatement(): found a valid function so no need to insert new symbol \n");
15844 if (local_symbol == NULL)
15849 if (func != src_func )
15859 else if (isSgTemplateDeclaration(stmt) != NULL)
15874 case V_SgEnumDeclaration:
15875 case V_SgTemplateDeclaration:
15876 case V_SgTypedefDeclaration:
15877 case V_SgFunctionDeclaration:
15878 case V_SgMemberFunctionDeclaration:
15879 case V_SgTemplateInstantiationFunctionDecl:
15894 printf (
"In SageInterface::fixStatement(): switch default case used (likely OK): stmt = %p = %s \n",stmt,stmt->
class_name().c_str());
15897 printf (
"switch case not handled properly: stmt = %p = %s \n",stmt,stmt->
class_name().c_str());
15929 ROSE_ASSERT(func != NULL && scope != NULL);
15931 ROSE_ASSERT(func != NULL);
15932 ROSE_ASSERT(scope != NULL);
15934 SgStatementPtrList stmtList, sameFuncList;
15941 SgDeclarationStatementPtrList::iterator i;
15942 for (i=declList.begin();i!=declList.end();i++)
15943 stmtList.push_back(*i);
15951 if (firstNondefiningFunctionDeclaration != NULL)
15956 printf (
"In SageInterface::updateDefiningNondefiningLinks(): func = %p Found a valid pointer to a firstNondefiningFunctionDeclaration = %p \n",func,firstNondefiningFunctionDeclaration);
15967 printf (
"WARNING: symbol for func->get_firstNondefiningDeclaration() = %p = %s = %s is not present in the scope = %p = %s associated with the firstNondefiningDeclaration \n",
15975 SgSymbol* functionSymbol = scope->lookup_function_symbol(func->get_name(),func->get_type());
15976 if (functionSymbol != NULL)
15978 printf (
"In SageInterface::updateDefiningNondefiningLinks(): func = %p Found a valid symbol = %p \n",func,functionSymbol);
15982 printf (
"In SageInterface::updateDefiningNondefiningLinks(): func = %p functionSymbol == NULL \n",func);
15987 SgStatementPtrList::iterator j;
15988 for (j = stmtList.begin(); j != stmtList.end(); j++)
15991 if (func_decl != NULL)
15998 sameFuncList.push_back(func_decl);
16004 printf (
"func = %p \n",func);
16008 ROSE_ASSERT(func != NULL);
16012 for (j = sameFuncList.begin(); j != sameFuncList.end(); j++)
16017 ROSE_ASSERT(func != NULL);
16020 ROSE_ASSERT(sameFuncList.empty() ==
false);
16022 if (func == isSgFunctionDeclaration(*(sameFuncList.begin())))
16024 for (j = sameFuncList.begin(); j != sameFuncList.end(); j++)
16028 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 1) Testing j = %p set_firstNondefiningDeclaration(%p) \n",*j,func);
16032 if (func_decl != func)
16039 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 1) Calling j = %p set_firstNondefiningDeclaration(%p) \n",*j,func);
16049 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 2) Testing func = %p set_firstNondefiningDeclaration(%p) \n",func,isSgFunctionDeclaration(*(sameFuncList.begin()))->
get_firstNondefiningDeclaration());
16056 printf (
"In SageInterface::updateDefiningNondefiningLinks(): (case 2) Calling func = %p set_firstNondefiningDeclaration(%p) \n",func,isSgFunctionDeclaration(*(sameFuncList.begin()))->
get_firstNondefiningDeclaration());
16065 assert(source_file != NULL);
16066 assert(position == PreprocessingInfo::before || position == PreprocessingInfo::after);
16068 SgGlobal * global_scope = source_file->get_globalScope();
16071 ROSE_ASSERT(result);
16087 PreprocessingInfo::DirectiveType dtype )
16089 ASSERT_not_null(target);
16092 PreprocessingInfo::DirectiveType mytype=dtype;
16097 if (mytype == PreprocessingInfo::CpreprocessorUnknownDeclaration)
16103 mytype = PreprocessingInfo::C_StyleComment;
16108 mytype = PreprocessingInfo::CplusplusStyleComment;
16113 mytype = PreprocessingInfo::F90StyleComment;
16118 mytype = PreprocessingInfo::AdaStyleComment;
16123 mytype = PreprocessingInfo::JovialStyleComment;
16127 cout <<
"WARNING: SageInterface::attachComment(): Unknown programming language \n";
16133 bool resetPositionInfo =
false;
16136 case PreprocessingInfo::C_StyleComment: comment =
"/* " + content +
" */";
break;
16137 case PreprocessingInfo::CplusplusStyleComment: comment =
"// " + content;
break;
16138 case PreprocessingInfo::FortranStyleComment: comment =
" C " + content;
break;
16139 case PreprocessingInfo::F90StyleComment: comment =
"!" + content;
break;
16140 case PreprocessingInfo::AdaStyleComment: comment =
"-- " + content;
break;
16141 case PreprocessingInfo::JovialStyleComment:
16145 case PreprocessingInfo::CpreprocessorLineDeclaration:
16146 comment =
"#myline " + content;
16147 mytype = PreprocessingInfo::CplusplusStyleComment;
16148 resetPositionInfo =
true;
16150 case PreprocessingInfo::CpreprocessorIfndefDeclaration: comment =
"#ifndef " + content +
"\n";
break;
16151 case PreprocessingInfo::CpreprocessorDefineDeclaration: comment =
"#define " + content +
"\n";
break;
16152 case PreprocessingInfo::CpreprocessorEndifDeclaration: comment =
"#endif" + (content.empty() ?
"\n" : (
" /* " + content +
" */\n"));
break;
16153 case PreprocessingInfo::CpreprocessorEnd_ifDeclaration: comment =
"#end if" + (content.empty() ?
"\n" : (
" /* " + content +
" */\n"));
break;
16157 printf (
"Error: default in switch reached in SageInterface::attachComment() PreprocessingInfo::DirectiveType == %d \n",mytype);
16162 result =
new PreprocessingInfo (mytype,comment,
"transformation-generated", 0, 0, 0, position);
16165 if (resetPositionInfo ==
true)
16168 *(result->get_file_info()) = *(target->get_file_info());
16178 ASSERT_not_null(result);
16179 target->addToAttachedPreprocessingInfo(result);
16185 PreprocessingInfo::CpreprocessorIfDeclaration,
16187 "transformation-generated", 0, 0, 0,
16188 PreprocessingInfo::before
16190 target->addToAttachedPreprocessingInfo(if_macro);
16193 PreprocessingInfo::CpreprocessorEndifDeclaration,
16195 "transformation-generated", 0, 0, 0,
16196 PreprocessingInfo::after
16198 target->addToAttachedPreprocessingInfo(endif_macro);
16211static map<SgSourceFile*, map<string, PreprocessingInfo*> > fileHeaderDict;
16216 if (isSystemHeader)
16217 header_key=
"<"+header_file_name+
">";
16219 header_key=
"\""+header_file_name+
"\"";
16221 if (fileHeaderDict.count(source_file) && fileHeaderDict[source_file].count(header_key))
16222 return fileHeaderDict[source_file][header_key];
16224 vector<SgLocatedNode*> candidates;
16227 SgGlobal* global= source_file -> get_globalScope();
16229 candidates.push_back(global);
16232 SgDeclarationStatementPtrList decl_stmt_list = global->
get_declarations();
16233 for (SgDeclarationStatementPtrList::iterator iter= decl_stmt_list.begin(); iter!=decl_stmt_list.end(); iter++)
16234 candidates.push_back(*iter);
16236 bool found =
false;
16237 for (
size_t ci=0; ci<candidates.size(); ci++)
16242 if (comments == NULL)
continue;
16243 AttachedPreprocessingInfoType::iterator i;
16244 for (i = comments->begin (); i != comments->end (); i++)
16246 if ((*i)->getTypeOfDirective () != PreprocessingInfo::CpreprocessorIncludeDeclaration)
continue;
16247 string content = (*i)->getString ();
16248 if (content.find(header_key) != string::npos)
16250 fileHeaderDict[source_file][header_key] = *i;
16261 return fileHeaderDict[source_file][header_key];
16271 bool supportTokenUnparsing =
false;
16273 assert(source_file != NULL);
16274 assert(position == PreprocessingInfo::before || position == PreprocessingInfo::after);
16276 SgGlobal * global_scope = source_file->get_globalScope();
16279 if (isSystemHeader)
16280 content =
"#include <" + header_file_name +
"> \n";
16282 content =
"#include \"" + header_file_name +
"\" \n";
16285 ROSE_ASSERT(result);
16293 supportTokenUnparsing = source_file->get_unparse_tokens();
16294 bool supportUnparseHeaders = source_file->get_unparseHeaderFiles();
16297 printf (
"supportTokenUnparsing = %s \n",supportTokenUnparsing ?
"true" :
"false");
16298 printf (
"supportUnparseHeaders = %s \n",supportUnparseHeaders ?
"true" :
"false");
16299 printf (
"source_file = %p \n",source_file);
16300 printf (
"global_scope = %p \n",global_scope);
16303 printf (
"Exiting as a test! \n");
16308 if (supportTokenUnparsing ==
false)
16317 if (supportUnparseHeaders ==
true)
16322 printf (
"physical_file_id = %d \n",physical_file_id);
16327 printf (
"Exiting as a test! \n");
16334 global_scope->prepend_statement(emptyDeclaration);
16338 printf (
"Exiting as a test! \n");
16339 ROSE_ASSERT(
false);
16350 bool supportTokenUnparsing =
false;
16356 printf (
"In SageInterface::insertHeader(): filename = %s \n",filename.c_str());
16357 printf (
" --- position = %s \n",PreprocessingInfo::relativePositionName(position).c_str());
16363 ROSE_ASSERT(scope);
16366 ROSE_ASSERT(globalScope != NULL);
16374 if (isSystemHeader)
16375 content =
"#include <" + filename +
"> \n";
16377 content =
"#include \"" + filename +
"\" \n";
16386 ROSE_ASSERT(sourceFile != NULL);
16388 supportTokenUnparsing = sourceFile->get_unparse_tokens();
16390 bool supportUnparseHeaders = sourceFile->get_unparseHeaderFiles();
16392 if (supportUnparseHeaders)
16395 string suffix = Rose::StringUtility ::fileNameSuffix(filename);
16398 if (suffix==
"h" ||suffix==
"hpp"|| suffix==
"hh"||suffix==
"H" ||suffix==
"hxx"||suffix==
"h++" ||suffix==
"tcc")
16403 printf (
"supportTokenUnparsing = %s \n",supportTokenUnparsing ?
"true" :
"false");
16404 printf (
"supportUnparseHeaders = %s \n",supportUnparseHeaders ?
"true" :
"false");
16405 printf (
"sourceFile = %p \n",sourceFile);
16406 printf (
"globalScope = %p \n",globalScope);
16409 printf (
"supportTokenUnparsing = %s \n",supportTokenUnparsing ?
"true" :
"false");
16412 printf (
"Exiting as a test! \n");
16416 SgDeclarationStatementPtrList & stmtList = globalScope->
get_declarations();
16419 printf (
"stmtList.size() = %zu \n",stmtList.size());
16422 if (stmtList.size() > 0)
16424 for (SgDeclarationStatementPtrList::iterator j = stmtList.begin (); j != stmtList.end (); j++)
16428 if ( ((*j)->get_file_info())->isSameFile(srcScope->
get_file_info ()) || ((*j)->get_file_info ())->isTransformation() )
16430 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration, content,
"Transformation generated",0, 0, 0, PreprocessingInfo::before);
16431 ROSE_ASSERT(result != NULL);
16433 printf (
"Building a PreprocessingInfo: result = %p \n",result);
16441 if (supportTokenUnparsing ==
false)
16443 (*j)->addToAttachedPreprocessingInfo(result,position);
16447 (*j)->addToAttachedPreprocessingInfo(result,position);
16449 printf (
"In SageInterface::insertHeader(): Calling set_containsTransformationToSurroundingWhitespace(true) \n");
16453 (*j)->set_containsTransformationToSurroundingWhitespace(
true);
16462 printf (
"In SageInterface::insertHeader(): declarationStatement = %p = %s \n",declarationStatement,declarationStatement->
class_name().c_str());
16463 printf (
"In SageInterface::insertHeader(): declarationStatement->get_containsTransformationToSurroundingWhitespace() = %s \n",
16464 declarationStatement->get_containsTransformationToSurroundingWhitespace() ?
"true" :
"false");
16471 if (supportUnparseHeaders ==
true)
16476 printf (
"physical_file_id = %d \n",physical_file_id);
16478 emptyDeclaration->get_startOfConstruct()->set_physical_file_id(physical_file_id);
16479 emptyDeclaration->get_endOfConstruct()->set_physical_file_id(physical_file_id);
16481 printf (
"Exiting as a test! \n");
16482 ROSE_ASSERT(
false);
16486 emptyDeclaration->addToAttachedPreprocessingInfo(result, position);
16492 printf (
"break out of for loop: result = %p \n",result);
16502 cerr<<
"SageInterface::insertHeader() Empty file is found!"<<endl;
16503 cerr<<
"#include xxx is preprocessing information which has to be attached to some other located node (a statement for example)"<<endl;
16504 cerr<<
"You may have to insert some statement first before inserting a header"<<endl;
16505 ROSE_ASSERT(
false);
16506 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration, content,
"Transformation generated",0, 0, 0, PreprocessingInfo::after);
16507 ROSE_ASSERT(result);
16518 if (result != NULL)
16529 printf (
"Exiting as a test! \n");
16530 ROSE_ASSERT(
false);
16534 printf (
"Leaving SageInterface::insertHeader(): filename = %s \n",filename.c_str());
16538 printf (
"Exiting as a test! \n");
16539 ROSE_ASSERT(
false);
16549 ROSE_ASSERT (stmt != NULL);
16550 ROSE_ASSERT (newheader != NULL);
16553 printf (
"In SageInterface::insertHeader (SgStatement* stmt, PreprocessingInfo* newheader, bool asLastHeader) \n");
16559 position = PreprocessingInfo::after;
16561 position = PreprocessingInfo::before;
16567 if (comments != NULL)
16576 AttachedPreprocessingInfoType::iterator i, firsti, lasti;
16577 for (i = comments->begin (); i != comments->end (); i++)
16584 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration)
16587 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration)
16589 if (firstExistingHeader == NULL)
16591 firstExistingHeader = (*i);
16595 lastExistingHeader = (*i);
16601 if ( (*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration ||
16602 (*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorEndifDeclaration )
16605 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorIncludeDeclaration)
16607 if (firstExistingHeader == NULL)
16609 firstExistingHeader = (*i);
16613 lastExistingHeader = (*i);
16616 if ((*i)->getTypeOfDirective () == PreprocessingInfo::CpreprocessorEndifDeclaration)
16618 if (firstExistingEndif == NULL)
16620 firstExistingEndif = (*i);
16635 if (lastExistingHeader == NULL)
16639 comments->insert (lasti+1, newheader);
16644 if (firstExistingHeader == NULL)
16648 comments->insert (firsti, newheader);
16656 printf (
"Exiting as a test! \n");
16657 ROSE_ASSERT(
false);
16666 ROSE_ASSERT (source_file != NULL);
16667 SgGlobal* globalScope = source_file->get_globalScope();
16668 ROSE_ASSERT (globalScope != NULL);
16672 if (isSystemHeader)
16673 content =
"#include <" + filename +
"> \n";
16675 content =
"#include \"" + filename +
"\" \n";
16682 position = PreprocessingInfo::after;
16684 position = PreprocessingInfo::before;
16687 SgDeclarationStatementPtrList & stmtList = globalScope->
get_declarations ();
16688 if (stmtList.size()>0)
16690 for (SgDeclarationStatementPtrList::iterator j = stmtList.begin (); j != stmtList.end (); j++)
16695 if ( (*j)->get_file_info()->isSameFile(globalScope->
get_file_info()) || (*j)->get_file_info()->isTransformation() )
16698 printf (
"In SageInterface::insertHeader(): Found statement to attached #include: *j = %p = %s \n",*j,(*j)->class_name().c_str());
16699 printf (
" --- unparseToString() = %s \n",(*j)->unparseToString().c_str());
16701 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration, content,
"Transformation generated",0, 0, 0, PreprocessingInfo::before);
16702 ROSE_ASSERT(result);
16706 printf (
"Exiting as a test! \n");
16715 cerr<<
"SageInterface::insertHeader() Empty file is found!"<<endl;
16716 cerr<<
"#include xxx is preprocessing information which has to be attached to some other located node (a statement for example)"<<endl;
16717 cerr<<
"You may have to insert some statement first before inserting a header"<<endl;
16720 result =
new PreprocessingInfo(PreprocessingInfo::CpreprocessorIncludeDeclaration,
16721 content,
"Transformation generated",0, 0, 0, PreprocessingInfo::after);
16722 ROSE_ASSERT(result);
16729 printf (
"In SageInterface::insertHeader(): Marking include file for filename = %s as a transformation \n",filename.c_str());
16739 printf (
"Exiting as a test! \n");
16740 ROSE_ASSERT(
false);
16758 ROSE_ASSERT(target != NULL);
16765 PreprocessingInfo::DirectiveType mytype = PreprocessingInfo::CpreprocessorIfDeclaration;
16768 printf (
"Warning: attachArbitraryText(): attaching arbitrary text to the AST as a #if declaration: text = %s \n",text.c_str());
16770 result =
new PreprocessingInfo (mytype,text,
"transformation-generated", 0, 0, 0, position);
16771 ROSE_ASSERT(result);
16778 target->addToAttachedPreprocessingInfo(result);
16792 ROSE_ASSERT(target != NULL);
16793 AttachedPreprocessingInfoType *info= target->getAttachedPreprocessingInfo ();
16794 if (info == NULL)
return;
16795 AttachedPreprocessingInfoType::iterator j;
16796 for (j = info->begin (); j != info->end (); j++)
16798 if ((*j)->getTypeOfDirective()==PreprocessingInfo::CMacroCall)
16800#ifndef ROSE_SKIP_COMPILATION_OF_WAVE
16802 std::ostringstream os;
16803 token_container tc = (*j)->get_macro_call()->expanded_macro;
16804 token_container::const_iterator iter;
16805 for (iter=tc.begin(); iter!=tc.end(); iter++)
16806 os<<(*iter).get_value();
16809 string pragmaText = target->get_pragma()->get_pragma();
16810 string targetString = (*j)->getString();
16811 string replacement = os.str();
16813 size_t pos1 = pragmaText.find(targetString);
16814 while (pos1 != string::npos)
16816 pragmaText.replace(pos1, targetString.size(), replacement);
16817 pos1 = pragmaText.find(targetString);
16819 delete target->get_pragma();
16833 if (isSgWhileStmt(loopOrSwitch) || isSgDoWhileStmt(loopOrSwitch) ||
16834 isSgForStatement(loopOrSwitch)) {
16836 }
else if (isSgSwitchStatement(loopOrSwitch)) {
16837 body = isSgSwitchStatement(loopOrSwitch)->
get_body();
16839 ROSE_ASSERT (body);
16841 if (!breaks.empty()) {
16842 static int breakLabelCounter = 0;
16847 isSgScopeStatement(loopOrSwitch->
get_parent()));
16849 for (
size_t j = 0; j < breaks.size(); ++j) {
16854 newGoto->
set_parent(breaks[j]->get_parent());
16861 ROSE_ASSERT(node!=NULL);
16871 ROSE_ASSERT(node!=NULL);
16884 ROSE_ASSERT(stmt_src != NULL);
16885 ROSE_ASSERT(stmt_dst != NULL);
16888 if (infoList == NULL)
16891 printf (
"In SageInterface::movePreprocessingInfo(): infoList == NULL: exiting movePreprocessingInfo() \n");
16896 AttachedPreprocessingInfoType* infoToRemoveList =
new AttachedPreprocessingInfoType();
16899 printf (
"In SageInterface::movePreprocessingInfo(): \n");
16900 printf (
" --- stmt_src = %p = %s src_position = %d \n",stmt_src,stmt_src->
class_name().c_str(),src_position);
16902 if (src_declarationStatement != NULL)
16905 printf (
"src_declarationStatement->get_definingDeclaration() = %p \n",src_declarationStatement->
get_definingDeclaration());
16907 printf (
" --- stmt_dst = %p = %s dst_position = %d \n",stmt_dst,stmt_dst->
class_name().c_str(),dst_position);
16909 if (dst_declarationStatement != NULL)
16912 printf (
"dst_declarationStatement->get_definingDeclaration() = %p \n",dst_declarationStatement->
get_definingDeclaration());
16914 printf (
" --- src_position = %s \n",PreprocessingInfo::relativePositionName(src_position).c_str());
16915 printf (
" --- dst_position = %s \n",PreprocessingInfo::relativePositionName(dst_position).c_str());
16916 printf (
" --- usePrepend = %s \n",usePrepend ?
"true" :
"false");
16918 printf (
" --- infoList = %p \n",infoList);
16919 printf (
" --- infoToRemoveList = %p \n",infoToRemoveList);
16922 printf (
" --- dst_infoList = %p \n",dst_infoList);
16925 printf (
"****************************************************************** \n");
16926 printf (
"In SageInterface::movePreprocessingInfo(): Attached comments and CPP directives: stmt_src \n");
16928 printf (
"In SageInterface::movePreprocessingInfo(): Attached comments and CPP directives: stmt_dst \n");
16930 printf (
"****************************************************************** \n");
16940 printf (
" --- infoList->size() = %zu \n",infoList->size());
16941 printf (
" --- infoToRemoveList->size() = %zu \n",infoToRemoveList->size());
16947 for (Rose_STL_Container<PreprocessingInfo*>::iterator i = (*infoList).begin(); i != (*infoList).end(); i++)
16950 ROSE_ASSERT(*i != NULL);
16955 ROSE_ASSERT(info != NULL);
16958 printf (
"counter = %d Processing PreprocessingInfo = %s \n",counter,info->getString().c_str());
16967 for (Rose_STL_Container<PreprocessingInfo*>::iterator i = (*infoList).begin(); i != (*infoList).end(); i++)
16969 ROSE_ASSERT(*i != NULL);
16972 ROSE_ASSERT(info != NULL);
16975 (info->getTypeOfDirective()==PreprocessingInfo::C_StyleComment)||
16976 (info->getTypeOfDirective()==PreprocessingInfo::CplusplusStyleComment)||
16977 (info->getTypeOfDirective()==PreprocessingInfo::FortranStyleComment)||
16978 (info->getTypeOfDirective()==PreprocessingInfo::F90StyleComment)||
16979 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIncludeDeclaration )||
16980 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIncludeNextDeclaration )||
16981 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorDefineDeclaration )||
16982 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorUndefDeclaration)||
16983 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIfdefDeclaration )||
16984 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIfndefDeclaration )||
16985 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorIfDeclaration )||
16986 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorDeadIfDeclaration )||
16987 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorElseDeclaration )||
16988 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorElifDeclaration )||
16989 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorEndifDeclaration ) ||
16990 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorEnd_ifDeclaration ) ||
16991 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorLineDeclaration) ||
16992 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorErrorDeclaration) ||
16993 (info->getTypeOfDirective()==PreprocessingInfo::CpreprocessorWarningDeclaration) ||
16995 (info->getTypeOfDirective()==PreprocessingInfo::ClinkageSpecificationStart) ||
16996 (info->getTypeOfDirective()==PreprocessingInfo::ClinkageSpecificationEnd)
17001 if ( src_position == PreprocessingInfo::undef || info->getRelativePosition() == src_position)
17003 if (usePrepend ==
true)
17006 if (prevItem == NULL)
17024 info->setAsTransformation();
17032 stmt_dst->set_containsTransformationToSurroundingWhitespace(
true);
17033 if (isMarkedAsModified ==
false)
17040 (*infoToRemoveList).push_back(*i);
17044 if (dst_position != PreprocessingInfo::undef)
17046 info->setRelativePosition(dst_position);
17052 AttachedPreprocessingInfoType::iterator j;
17053 for (j = (*infoToRemoveList).begin(); j != (*infoToRemoveList).end(); j++)
17055 infoList->erase( find(infoList->begin(),infoList->end(),*j) );
17091 return info && (info->getRelativePosition () != pos);
17101 return info && !isNotRelPos (info, pos);
17108 ASSERT_not_null(src_node);
17111 AttachedPreprocessingInfoType* info = src_node->get_attachedPreprocessingInfoPtr();
17115 remove_copy_if(info->begin(),
17117 back_inserter(save_buf),
17118 [pos](
auto x) {
return !isRelPos(x, pos); }
17122 AttachedPreprocessingInfoType::iterator
17123 new_end = remove_if(info->begin(),
17125 [pos](
auto x) { return isRelPos(x, pos); }
17127 info->erase(new_end, info->end());
17131static AttachedPreprocessingInfoType *
17135 AttachedPreprocessingInfoType* info_list = s->get_attachedPreprocessingInfoPtr ();
17138 info_list =
new AttachedPreprocessingInfoType;
17139 ROSE_ASSERT (info_list);
17140 s->set_attachedPreprocessingInfoPtr (info_list);
17144 ROSE_ASSERT (info_list);
17151 if (save_buf.size()==0)
return;
17153 AttachedPreprocessingInfoType* info = createInfoList (dst_node);
17154 ROSE_ASSERT (info);
17161 if (pos==PreprocessingInfo::before)
17163 for(AttachedPreprocessingInfoType::reverse_iterator i=save_buf.rbegin();i!=save_buf.rend();i++)
17164 info->insert(info->begin(),*i);
17167 else if (pos==PreprocessingInfo::after)
17168 copy (save_buf.begin (), save_buf.end (), back_inserter (*info));
17169 else if (pos==PreprocessingInfo::inside)
17171 copy (save_buf.begin (), save_buf.end (), back_inserter (*info));
17172 cerr<<
"SageInterface::pastePreprocessingInfo() pos==PreprocessingInfo::inside is not supported."<<endl;
17173 save_buf[0]->display(
"ttt");
17179 ROSE_ASSERT(locatedNode != NULL);
17180 AttachedPreprocessingInfoType *comments =
17183 if (comments != NULL)
17185 printf (
"-----------------------------------------------\n");
17186 printf (
"Found an IR node (at %p of type: %s) in file %s \n",
17187 locatedNode, locatedNode->
class_name ().c_str (),
17188 (locatedNode->
get_file_info ()->get_filenameString ()).c_str ());
17190 AttachedPreprocessingInfoType::iterator i;
17191 for (i = comments->begin (); i != comments->end (); i++)
17194 (
"with attached preprocessingInfo numbering #%d :------------- \nclassification= %s:\nString format:%s\n",
17196 PreprocessingInfo::directiveTypeName ((*i)->getTypeOfDirective ()).
17197 c_str (), (*i)->getString ().c_str ());
17198 if ((*i)->getRelativePosition () == PreprocessingInfo::inside)
17199 printf (
"relative position is: inside\n");
17201 printf (
"relative position is: %s\n", \
17202 ((*i)->getRelativePosition () == PreprocessingInfo::before) ?
"before" :
"after");
17207 printf (
"No attached preprocessing info. (at %p of type: %s): \n", locatedNode,
17223template <
class ParentNode>
17233 if (basicblock == NULL) {
17235 (stmt.*setter)(basicblock);
17239 ROSE_ASSERT (basicblock != NULL);
17246 if (!isSgBasicBlock(b)) {
17254 ROSE_ASSERT (isSgBasicBlock(b));
17255 return isSgBasicBlock(b);
17261 if (!isSgBasicBlock(b)) {
17269 ROSE_ASSERT (isSgBasicBlock(b));
17270 return isSgBasicBlock(b);
17276 if (!isSgBasicBlock(b)) {
17284 ROSE_ASSERT (isSgBasicBlock(b));
17285 return isSgBasicBlock(b);
17290 ROSE_ASSERT (fs != NULL);
17292 return ensureBasicBlock_aux(*fs, &SgUpcForAllStatement::get_loop_body, &SgUpcForAllStatement::set_loop_body);
17297 if (!isSgBasicBlock(b)) {
17305 ROSE_ASSERT (isSgBasicBlock(b));
17306 return isSgBasicBlock(b);
17311 if (!isSgBasicBlock(b)) {
17319 ROSE_ASSERT (isSgBasicBlock(b));
17320 return isSgBasicBlock(b);
17325 if (!isSgBasicBlock(b)) {
17333 ROSE_ASSERT (isSgBasicBlock(b));
17334 return isSgBasicBlock(b);
17339 if (!isSgBasicBlock(b)) {
17347 printf (
"In SageInterface::ensureBasicBlockAsTrueBodyOfIf(): Added SgBasicBlock b = %p to addedBasicBlockNodes.size() = %zu \n",b,addedBasicBlockNodes.size());
17350 ROSE_ASSERT (isSgBasicBlock(b));
17351 return isSgBasicBlock(b);
17361 ROSE_ASSERT(bb != NULL);
17362 addedBasicBlockNodes.push_back(bb);
17364 printf (
"In SageInterface::recordNormalizations(): Added SgBasicBlock = %p to addedBasicBlockNodes.size() = %zu \n",bb,addedBasicBlockNodes.size());
17375 printf (
"In SageInterface::cleanupNontransformedBasicBlockNode(): addedBasicBlockNodes.size() = %zu \n",addedBasicBlockNodes.size());
17378 for (vector<SgBasicBlock*>::iterator i = addedBasicBlockNodes.begin(); i != addedBasicBlockNodes.end(); i++)
17381 ROSE_ASSERT(b != NULL);
17385 printf (
"This SgBasicBlock can be denormalized: b = %p \n",b);
17388 ROSE_ASSERT(parentOfBlock != NULL);
17393 ROSE_ASSERT(s != NULL);
17395 switch (parentOfBlock->
variantT())
17399 SgIfStmt* ifStatement = isSgIfStmt(parentOfBlock);
17403 printf (
"Calling set_true_body on ifStatement = %p = %s \n",ifStatement,ifStatement->
class_name().c_str());
17408 printf (
"Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17413 printf (
"DONE: Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17422 printf (
"Calling set_false_body on ifStatement = %p = %s \n",ifStatement,ifStatement->
class_name().c_str());
17427 printf (
"Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17432 printf (
"DONE: Calling set_parent on s = %p = %n \n",s,s->
class_name().c_str());
17436 printf (
"Mark as NOT modified after calling set_false_body on ifStatement = %p = %n \n",ifStatement,ifStatement->
class_name().c_str());
17439 printf (
"Error: case not handled in case V_SgIfStmt: parentOfBlock = %p = %s \n",parentOfBlock,parentOfBlock->
class_name().c_str());
17447 case V_SgWhileStmt:
17449 SgWhileStmt* whileStatement = isSgWhileStmt(parentOfBlock);
17450 if (b == whileStatement->
get_body())
17459 case V_SgSwitchStatement:
17462 if (b == switchStatement->
get_body())
17471 case V_SgForStatement:
17483 case V_SgCaseOptionStmt:
17485 SgCaseOptionStmt* caseOptionStatement = isSgCaseOptionStmt(parentOfBlock);
17486 if (b == caseOptionStatement->
get_body())
17495 case V_SgDefaultOptionStmt:
17498 if (b == defaultOptionStatement->
get_body())
17500 defaultOptionStatement->
set_body(s);
17507 case V_SgDoWhileStmt:
17509 SgDoWhileStmt* doWhileStatement = isSgDoWhileStmt(parentOfBlock);
17510 if (b == doWhileStatement->
get_body())
17520 printf (
"Error: case not handled in switch: parentOfBlock = %p = %s \n",parentOfBlock,parentOfBlock->
class_name().c_str());
17526 if (wasPreviouslyModified ==
false)
17531 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());
17538 printf (
"Exiting as a test! \n");
17545 printf (
"Leaving SageInterface::cleanupNontransformedBasicBlockNode(): addedBasicBlockNodes.size() = %zu \n",addedBasicBlockNodes.size());
17553 if (!createEmptyBody && (b == NULL || isSgNullStatement(b)))
17555 if (!isSgBasicBlock(b)) {
17563 ROSE_ASSERT (isSgBasicBlock(b));
17564 return isSgBasicBlock(b);
17569 if (!isSgBasicBlock(b)) {
17574 ROSE_ASSERT (isSgBasicBlock(b));
17575 return isSgBasicBlock(b);
17581 if (!isSgBasicBlock(b)) {
17586 ROSE_ASSERT (isSgBasicBlock(b));
17587 return isSgBasicBlock(b);
17599 case V_SgForStatement:
17601 if (isSgForStatement(p)->get_loop_body() == s)
17605 case V_SgUpcForAllStatement:
17608 if (upcforall.get_loop_body() == s)
17612 case V_SgWhileStmt:
17614 if (isSgWhileStmt(p)->get_body() == s)
17618 case V_SgDoWhileStmt:
17620 if (isSgDoWhileStmt(p)->get_body() == s)
17624 case V_SgSwitchStatement:
17626 if (isSgSwitchStatement(p)->get_body() == s)
17630 case V_SgCaseOptionStmt:
17632 if (isSgCaseOptionStmt(p)->get_body() == s)
17636 case V_SgDefaultOptionStmt:
17638 if (isSgDefaultOptionStmt(p)->get_body() == s)
17642 case V_SgCatchOptionStmt:
17644 if (isSgCatchOptionStmt(p)->get_body() == s)
17650 if (isSgIfStmt(p)->get_true_body() == s)
17652 else if (isSgIfStmt(p)->get_false_body() == s)
17658 if (isSgOmpBodyStatement(p))
17670 ROSE_ASSERT (singleStmt != NULL);
17671 ROSE_ASSERT (isSgBasicBlock(singleStmt) == NULL);
17683 case V_SgForStatement:
17685 if (isSgForStatement(p)->get_loop_body() == s)
17689 case V_SgUpcForAllStatement:
17693 if (upcforall.get_loop_body() == s)
17697 case V_SgWhileStmt:
17699 if (isSgWhileStmt(p)->get_body() == s)
17703 case V_SgDoWhileStmt:
17705 if (isSgDoWhileStmt(p)->get_body() == s)
17709 case V_SgSwitchStatement:
17711 if (isSgSwitchStatement(p)->get_body() == s)
17715 case V_SgCaseOptionStmt:
17717 if (isSgCaseOptionStmt(p)->get_body() == s)
17721 case V_SgDefaultOptionStmt:
17723 if (isSgDefaultOptionStmt(p)->get_body() == s)
17727 case V_SgCatchOptionStmt:
17729 if (isSgCatchOptionStmt(p)->get_body() == s)
17735 if (isSgIfStmt(p)->get_true_body() == s)
17737 else if (isSgIfStmt(p)->get_false_body() == s)
17743 if (isSgOmpBodyStatement(p))
17750 ROSE_ASSERT (rt != NULL);
17764 case V_SgBasicBlock:
return isSgBasicBlock(p);
17765 case V_SgForStatement:
17767 if (isSgForStatement(p)->get_loop_body() == s)
17769 else if (isSgForStatement(p)->get_test() == s)
17772 else if (isSgForStatement(p)->get_for_init_stmt() == s)
17778 case V_SgUpcForAllStatement:
17782 if (upcforall.get_loop_body() == s)
17785 ROSE_ASSERT( (s == upcforall.get_for_init_stmt())
17786 || (s == upcforall.get_test())
17790 case V_SgWhileStmt:
17792 if (isSgWhileStmt(p)->get_body() == s)
17794 else if (isSgWhileStmt(p)->get_condition() == s)
17800 case V_SgDoWhileStmt:
17802 if (isSgDoWhileStmt(p)->get_body() == s)
17804 else if (isSgDoWhileStmt(p)->get_condition() == s)
17810 case V_SgSwitchStatement:
17812 if (isSgSwitchStatement(p)->get_body() == s)
17814 else if (isSgSwitchStatement(p)->get_item_selector() == s)
17820 case V_SgCatchOptionStmt:
17822 if (isSgCatchOptionStmt(p)->get_body() == s)
17824 else if (isSgCatchOptionStmt(p)->get_condition() == s)
17832 if (isSgIfStmt(p)->get_true_body() == s)
17834 else if (isSgIfStmt(p)->get_false_body() == s)
17836 else if (isSgIfStmt(p)->get_conditional() == s)
17844 if (isSgOmpBodyStatement(p))
17859 void SageInterface::changeAllLoopBodiesToBlocks(
SgNode* top) {
17860 cerr<<
"Warning: SageInterface::changeAllLoopBodiesToBlocks() is being replaced by SageInterface::changeAllBodiesToBlocks()."<<endl;
17861 cerr<<
"Please use SageInterface::changeAllBodiesToBlocks() if you can."<<endl;
17869 bool allowEmptyBody;
17870 Visitor (
bool flag):allowEmptyBody(flag) {}
17871 virtual void visit(
SgNode* n) {
17876 case V_SgForStatement: {
17880 case V_SgWhileStmt: {
17884 case V_SgDoWhileStmt: {
17888 case V_SgSwitchStatement: {
17897 printf (
"In changeAllBodiesToBlocks(): case SgIfStmt: n->get_isModified() = %s \n",n->
get_isModified() ?
"true" :
"false");
17904 printf (
"In changeAllBodiesToBlocks(): AFTER RESET: case SgIfStmt: n->get_isModified() = %s \n",n->
get_isModified() ?
"true" :
"false");
17909 case V_SgCatchOptionStmt: {
17913 case V_SgUpcForAllStatement: {
17920 if (isSgOmpBodyStatement(n))
17927 if (wasPreviouslyModified ==
false)
17932 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());
17941 Visitor(createEmptyBody).traverse(top, postorder);
17962#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
17963 SgStatement* enclosingStatement = getStatementOfExpression(from);
17964 SgExprStatement* exprStatement = isSgExprStatement(enclosingStatement);
17966 SgForStatement* forStatement = isSgForStatement(enclosingStatement);
17967 SgReturnStmt* returnStatement = isSgReturnStmt(enclosingStatement);
17973 ROSE_ASSERT (exprStatement || forStatement || returnStatement || varDeclarationStatement);
17975 if (varDeclarationStatement)
17982 ROSE_ASSERT (root);
17985 if (forStatement && forStatement->get_increment() == root)
17996 forStatement->get_increment()->
set_parent(incrStmt);
18000 forStatement->set_increment(ne);
18007 assert (enclosingStmtParent);
18008 SgWhileStmt* whileStatement = isSgWhileStmt(enclosingStmtParent);
18009 SgDoWhileStmt* doWhileStatement = isSgDoWhileStmt(enclosingStmtParent);
18010 SgIfStmt* ifStatement = isSgIfStmt(enclosingStmtParent);
18012 SgForStatement* enclosingForStatement = isSgForStatement(enclosingStmtParent);
18013 if (enclosingForStatement && enclosingForStatement->get_test() == exprStatement)
18025 pushTestIntoBody(enclosingForStatement);
18028 else if (whileStatement && whileStatement->
get_condition() == exprStatement)
18041 pushTestIntoBody(whileStatement);
18045 else if (doWhileStatement && doWhileStatement->
get_condition() == exprStatement)
18061 myStatementInsert(doWhileStatement, new_statement,
false);
18063 SgName varname =
"rose__temp1";
18068 varname,
buildBoolType(), assignInitializer, new_statement);
18071 initname->set_scope(new_statement);
18103 else if (ifStatement && ifStatement->
get_conditional() == exprStatement)
18109 myStatementInsert(ifStatement, new_statement,
false);
18111 SgName varname =
"rose__temp2";
18120 initname->set_scope(new_statement);
18145 else if (switchStatement && switchStatement->
get_item_selector() == exprStatement)
18147 SgExpression* switchCond = exprStatement->get_expression();
18148 ROSE_ASSERT (switchCond);
18153 myStatementInsert(switchStatement, new_statement,
false);
18155 SgName varname =
"rose__temp3";
18202#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
18203 SgStatement* stmt = getStatementOfExpression(from);
18205 if (isSgExprStatement(stmt))
18219 if (isSgAssignOp(top) && isSgAssignOp(top)->get_rhs_operand() == from)
18237 convertInitializerIntoAssignment(init);
18240 SgExprStatement* new_stmt = isSgExprStatement(getStatementOfExpression(from));
18241 assert (new_stmt != NULL);
18242 replaceAssignmentStmtWithStatement(new_stmt, to);
18259 ROSE_ASSERT(func&&s);
18261 Rose_STL_Container <SgNode* > stmts = NodeQuery::querySubTree(func, V_SgReturnStmt);
18263 Rose_STL_Container<SgNode*>::iterator i;
18264 for (i=stmts.begin();i!=stmts.end();i++)
18267 ROSE_ASSERT(cur_stmt);
18270 bool needRewrite = (exp != NULL) && !(isSgValueExp(exp));
18281 if (stmts.size()==0 )
18286 cout<<
"In instrumentEndOfFunction(), found an empty function body.! "<<endl;
18298 return ((stmt->get_declarationModifier()).get_storageModifier()).isStatic();
18305 return ((stmt->get_declarationModifier()).get_storageModifier()).setStatic();
18311 return ((stmt->get_declarationModifier()).get_storageModifier()).isExtern();
18319 return ((stmt->get_declarationModifier()).get_storageModifier()).setExtern();
18326 return name->get_storageModifier().isMutable();
18339 std::vector<SgInitializedName*> in_params;
18351 std::vector<SgInitializedName*> out_params;
18361 case V_SgCharVal:
return (
long long)(isSgCharVal(expr)->get_value());
18362 case V_SgSignedCharVal:
return (
long long)(isSgSignedCharVal(expr)->get_value());
18363 case V_SgUnsignedCharVal:
return isSgUnsignedCharVal(expr)->get_value();
18364 case V_SgShortVal:
return (
long long)(isSgShortVal(expr)->get_value());
18365 case V_SgUnsignedShortVal:
return isSgUnsignedShortVal(expr)->get_value();
18366 case V_SgIntVal:
return (
long long)(isSgIntVal(expr)->get_value());
18367 case V_SgUnsignedIntVal:
return isSgUnsignedIntVal(expr)->get_value();
18368 case V_SgLongIntVal:
return (
long long)(isSgLongIntVal(expr)->get_value());
18369 case V_SgUnsignedLongVal:
return isSgUnsignedLongVal(expr)->get_value();
18370 case V_SgLongLongIntVal:
return isSgLongLongIntVal(expr)->get_value();
18371 case V_SgUnsignedLongLongIntVal:
return isSgUnsignedLongLongIntVal(expr)->get_value();
18372 case V_SgBoolValExp:
return (
long long )(isSgBoolValExp(expr)->get_value());
18378 printf (
"ERROR: In SageInterface::getIntegerConstantValue(): default reached: expr = %p = %s \n",expr,expr->
class_name().c_str());
18379 ROSE_ASSERT (
false);
18384 ROSE_ASSERT (!
"Bad kind return in getIntegerConstantValue");
18389#ifdef ROSE_ENABLE_BINARY_ANALYSIS
18398 ROSE_ASSERT(binary!=NULL);
18403 if (1==headers.size()) {
18404 requisite_header = headers[0];
18406 for (SgAsmGenericHeaderPtrList::const_iterator hi=headers.begin(); hi!=headers.end(); ++hi) {
18407 if (isSgAsmPEFileHeader(*hi)) {
18408 requisite_header = isSgAsmPEFileHeader(*hi);
18413 ROSE_ASSERT(requisite_header!=NULL);
18416 const SgAsmInterpretationPtrList &interps = binary->get_interpretations()->
get_interpretations();
18417 for (SgAsmInterpretationPtrList::const_iterator ii=interps.begin(); ii!=interps.end(); ++ii) {
18418 const SgAsmGenericHeaderPtrList &headers = (*ii)->get_headers()->get_headers();
18419 for (SgAsmGenericHeaderPtrList::const_iterator hi=headers.begin(); hi!=headers.end(); ++hi) {
18420 if ((*hi)==requisite_header)
18425 ROSE_ASSERT(!
"no appropriate interpretation");
18438 SgNode* copy = n->copy(*
this);
18442 if (fileInfo != NULL)
18451 } collectDependentDeclarationsCopyType;
18459 vector<PreprocessingInfo*> cppDirectiveList;
18461 void visit(
SgNode *astNode);
18469 if (locatedNode != NULL)
18473 if (comments != NULL)
18476 printf (
"Found attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
sage_class_name());
18478 AttachedPreprocessingInfoType::iterator i;
18479 for (i = comments->begin(); i != comments->end(); i++)
18481 ROSE_ASSERT ( (*i) != NULL );
18483 printf (
" Attached Comment (relativePosition=%s): %s\n",
18484 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
18485 (*i)->getString().c_str());
18486 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
18487 (*i)->get_file_info()->display(
"comment/directive location");
18495 cppDirectiveList.push_back(*i);
18497 printf (
" Attached include directive (relativePosition=%s): %s\n",
18498 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
18499 (*i)->getString().c_str());
18507 printf (
"No attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
sage_class_name());
18518vector<PreprocessingInfo*>
18525 return t.cppDirectiveList;
18529vector<PreprocessingInfo*>
18536 return t.cppDirectiveList;
18541outputPreprocessingInfoList (
const vector<PreprocessingInfo*> & l )
18545 vector<PreprocessingInfo*>::const_iterator i = l.begin();
18546 while ( i != l.end() )
18548 printf (
" Attached include directive (relativePosition=%s): %s\n",
18549 ((*i)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
18550 (*i)->getString().c_str());
18565 case V_SgNamespaceDefinitionStatement:
18568 declaration = namespaceDefinition->get_namespaceDeclaration();
18572 case V_SgClassDefinition:
18573 case V_SgTemplateInstantiationDefn:
18582 printf (
"Error: default reached in getAssociatedDeclaration(): scope = %p = %s \n",scope,scope->
class_name().c_str());
18588 ROSE_ASSERT(declaration != NULL);
18590 return declaration;
18599 vector<SgDeclarationStatement*> declarationList;
18603 vector<SgSymbol*> symbolList;
18606 set<SgDeclarationStatement*> alreadySavedDeclarations;
18609 void visit(
SgNode *astNode);
18625 ROSE_ASSERT(scope != NULL);
18630 SgGlobal* globalScope = isSgGlobal(scope);
18631 if (globalScope == NULL)
18638 ROSE_ASSERT(parentScope != NULL);
18639 while (globalScope == NULL)
18641 associatedDeclaration = getAssociatedDeclaration(parentScope);
18642 ROSE_ASSERT(associatedDeclaration != NULL);
18644 parentScope = parentScope->
get_scope();
18645 globalScope = isSgGlobal(parentScope);
18651 return returnDeclaration;
18657outputDeclarationList (
const vector<SgDeclarationStatement*> & l )
18662 vector<SgDeclarationStatement*>::const_iterator i = l.begin();
18663 while ( i != l.end() )
18665 printf (
"In outputDeclarationList(): list[%d] = %p = %s = %s \n",counter++,*i,(*i)->class_name().c_str(),
SageInterface::get_name(*i).c_str());
18673 if (declaration != NULL)
18682 if (alreadySavedDeclarations.find(dependentDeclaration) == alreadySavedDeclarations.end())
18685 printf (
"In CollectDependentDeclarationsTraversal::visit(): selected dependentDeclaration = %p = %s = %s \n",
18689 declarationList.push_back(dependentDeclaration);
18692 alreadySavedDeclarations.insert(dependentDeclaration);
18694 printf (
"In CollectDependentDeclarationsTraversal::visit(): astNode = %p = %s = %s \n",astNode,astNode->
class_name().c_str(),
SageInterface::get_name(astNode).c_str());
18695 printf (
"############### ADDING dependentDeclaration = %p = %s to alreadySavedDeclarations set (size = %" PRIuPTR
") \n",
18696 dependentDeclaration,dependentDeclaration->
class_name().c_str(),alreadySavedDeclarations.size());
18704 printf (
"In CollectDependentDeclarationsTraversal::visit(): astNode = %p = %s = %s \n",astNode,astNode->
class_name().c_str(),
SageInterface::get_name(astNode).c_str());
18705 printf (
"############### EXISTING dependentDeclaration = %p = %s found in alreadySavedDeclarations set (size = %" PRIuPTR
") \n",
18706 dependentDeclaration,dependentDeclaration->
class_name().c_str(),alreadySavedDeclarations.size());
18713static std::vector<SgTypedefDeclaration*> collectTypedefDeclarations(
SgType* type)
18715 ROSE_ASSERT(type != NULL);
18716 std::vector<SgTypedefDeclaration*> result;
18717 SgType* currentType = type;
18727 modType = isSgModifierType(currentType);
18730 currentType = modType->get_base_type();
18734 refType = isSgReferenceType(currentType);
18737 currentType = refType->get_base_type();
18741 pointType = isSgPointerType(currentType);
18744 currentType = pointType->get_base_type();
18748 arrayType = isSgArrayType(currentType);
18751 currentType = arrayType->get_base_type();
18755 typedefType = isSgTypedefType(currentType);
18766 result.push_back(decl);
18780 if (result.size()>0)
18782 cout<<
"------------Found a chain of typedef decls: count="<<result.size()<<endl;
18783 for (vector <SgTypedefDeclaration*>::const_iterator iter = result.begin();
18784 iter!=result.end(); iter ++)
18811 if (fileInfo != NULL && fileInfo->isFrontendSpecific() ==
false && (isSgStatement(astNode) != NULL) )
18813 printf (
"\n\nIn CollectDependentDeclarationsTraversal::visit(): astNode = %p = %s = %s \n",astNode,astNode->
class_name().c_str(),
SageInterface::get_name(astNode).c_str());
18816 printf (
"alreadySavedDeclarations.size() = %" PRIuPTR
" \n",alreadySavedDeclarations.size());
18817 for (set<SgDeclarationStatement*>::iterator i = alreadySavedDeclarations.begin(); i != alreadySavedDeclarations.end(); i++)
18819 printf (
"alreadySavedDeclarations %d: %p = %s \n",counter++,*i,(*i)->class_name().c_str());
18830 if (initializedname != NULL)
18832 SgType* type = initializedname->get_type();
18835 std::vector <SgTypedefDeclaration*> typedefVec = collectTypedefDeclarations(type);
18836 for (std::vector <SgTypedefDeclaration*>::const_iterator iter =typedefVec.begin();
18837 iter != typedefVec.end(); iter++)
18840 addDeclaration(typedef_decl);
18864 SgNamedType* namedType = isSgNamedType(strippedType);
18865 if (namedType != NULL)
18873 if (classDeclaration != NULL)
18880 if (declaration != NULL)
18883 addDeclaration(declaration);
18886 addDeclaration (classDeclaration);
18897 ROSE_ASSERT(classSymbol != NULL);
18900 symbolList.push_back(classSymbol);
18905 if (enum_decl != NULL)
18908 ROSE_ASSERT(declaration != NULL);
18909 addDeclaration(declaration);
18914 ROSE_ASSERT(esymbol!= NULL);
18915 symbolList.push_back(esymbol);
18919 printf (
"Found reference to type = %p = %s strippedType = %p = %s \n",type,type->
class_name().c_str(),strippedType,strippedType->
class_name().c_str());
18926 if (functionCallExp != NULL)
18931 if (declaration != NULL)
18932 addDeclaration(declaration);
18939 if (functionSymbol)
18940 symbolList.push_back(functionSymbol);
18945 SgEnumVal * eval = isSgEnumVal(astNode);
18948 declaration = eval->get_declaration();
18949 ROSE_ASSERT(declaration != NULL);
18950 addDeclaration(declaration);
18952 ROSE_ASSERT(symbol != NULL);
18953 symbolList.push_back(symbol);
18958static std::map<const SgStatement*, bool> visitedDeclMap;
18970 printf (
"\n\n********************************************************** \n");
18971 printf (
" Inside of getDependentDeclarations(stmt = %p = %s) \n",stmt,stmt->
class_name().c_str());
18972 printf (
"********************************************************** \n");
18974 visitedDeclMap[stmt]=
true;
18978 declarationList = t.declarationList;
18979 symbolList = t.symbolList;
18982 copy(t.declarationList.begin(),t.declarationList.end(), back_inserter(declarationList));
18983 copy(t.symbolList.begin(),t.symbolList.end(), back_inserter(symbolList));
18985 sort (declarationList.begin(), declarationList.end());
18986 vector<SgDeclarationStatement*>::iterator new_end = unique(declarationList.begin(), declarationList.end());
18987 declarationList.erase(new_end, declarationList.end());
18989 sort (symbolList.begin(), symbolList.end());
18990 vector<SgSymbol*>::iterator end2 = unique(symbolList.begin(), symbolList.end());
18991 symbolList.erase(end2, symbolList.end());
18995 for (vector<SgDeclarationStatement*>::const_iterator iter = t.declarationList.begin();
18996 iter !=t.declarationList.end(); iter++)
18999 SgType* base_type = NULL;
19004 if (isSgClassDeclaration(decl))
19006 base_type = isSgClassDeclaration(decl)->get_type();
19008 if (isSgTypedefDeclaration(decl))
19012 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);
19020 if (isSgClassType(base_type))
19022 SgClassDeclaration* class_decl = isSgClassDeclaration(isSgClassType(base_type)->get_declaration()->get_definingDeclaration());
19023 if (class_decl!=NULL)
19025 body_stmt = class_decl->get_definition();
19029 if ((body_stmt!=NULL) &&(!visitedDeclMap[body_stmt]))
19041vector<SgDeclarationStatement*>
19044 vector<SgDeclarationStatement*> sortedNode;
19046 if (nodevec.size()==0 )
19049 if (nodevec.size() ==1)
19053 Rose_STL_Container<SgNode*> queryResult = NodeQuery::querySubTree(project,V_SgDeclarationStatement);
19054 for (Rose_STL_Container<SgNode*>::const_iterator iter = queryResult.begin();
19055 iter!= queryResult.end(); iter++)
19058 SgNode* cur_node = *iter;
19060 ROSE_ASSERT(cur_stmt!=NULL);
19072 ROSE_ASSERT (cur_stmt != func_decl);
19075 vector<SgDeclarationStatement*>::const_iterator i = find (nodevec.begin(), nodevec.end(), cur_stmt);
19076 if (i!=nodevec.end())
19080 vector<SgDeclarationStatement*>::const_iterator j = find (sortedNode.begin(), sortedNode.end(), *i);
19081 if (j == sortedNode.end())
19082 sortedNode.push_back(*i);
19086 if (nodevec.size() != sortedNode.size())
19088 cerr<<
"Fatal error in sortSgNodeListBasedOnAppearanceOrderInSource(): nodevec.size() != sortedNode.size()"<<endl;
19089 cerr<<
"nodevec() have "<< nodevec.size()<<
" elements. They are:"<<endl;
19090 for (vector<SgDeclarationStatement*>::const_iterator iter = nodevec.begin(); iter != nodevec.end(); iter++)
19092 cerr<<(*iter)<<
" "<<(*iter)->class_name() <<
" "<<(*iter)->unparseToString()<<endl;
19094 cerr<<
"sortedNode() have " << sortedNode.size() <<
" elements. They are:"<<endl;
19095 for (vector<SgDeclarationStatement*>::const_iterator iter = sortedNode.begin(); iter != sortedNode.end(); iter++)
19097 cerr<<(*iter)<<
" "<<(*iter)->class_name() <<
" "<<(*iter)->unparseToString()<<endl;
19100 ROSE_ASSERT(nodevec.size() == sortedNode.size());
19107std::vector<SgDeclarationStatement*>
19113 printf (
"\n\n********************************************************** \n");
19114 printf (
" Inside of getDependentDeclarations(stmt = %p = %s) \n",stmt,stmt->
class_name().c_str());
19115 printf (
"********************************************************** \n");
19120 return t.declarationList;
19123 visitedDeclMap.clear();
19124 vector<SgDeclarationStatement*> declarationList;
19125 vector<SgSymbol*> symbolList;
19129 printf (
"\n\n ********************************************************** \n");
19130 cout<<
"Found dependent decl: count="<<declarationList.size()<<endl;
19131 for ( vector<SgDeclarationStatement*>::const_iterator iter = declarationList.begin();
19132 iter != declarationList.end(); iter++)
19134 cout<<
"\t"<<(*iter)->class_name()<<
" at line "<<(*iter)->get_file_info()->get_line()<<endl;
19135 if ((*iter)->variantT()== V_SgFunctionDeclaration)
19136 cout<<
"func name is:"<<isSgFunctionDeclaration(*iter)->get_name().getString()<<endl;
19139 printf (
"\n ********************************************************** \n");
19142 return declarationList;
19151 bool returnValue =
false;
19154 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());
19157 if (functionName.is_null() ==
false)
19160 if ( functionName ==
"operator++" || functionName ==
"operator--" || functionName ==
"operator&" ||
19161 functionName ==
"operator!" || functionName ==
"operator*" || functionName ==
"operator+" ||
19162 functionName ==
"operator-" || functionName ==
"operator+" || functionName ==
"operator~")
19164 returnValue =
true;
19168 return returnValue;
19180 bool returnValue =
false;
19187 size_t numberOfOperands = 0;
19189 if (memberFunctionRefExp != NULL)
19191 ROSE_ASSERT(functionRefExp == NULL);
19193 if (memberFunctionDeclaration != NULL)
19195 functionName = memberFunctionDeclaration->get_name();
19196 numberOfOperands = memberFunctionDeclaration->get_args().size();
19202 if (functionRefExp != NULL)
19205 if (functionDeclaration != NULL)
19207 functionName = functionDeclaration->get_name();
19208 numberOfOperands = functionDeclaration->get_args().size();
19214 printf (
"In SageInterface::isPrefixOperator(): unknown case of exp = %p = %s \n",exp,exp->
class_name().c_str());
19219 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);
19224 if (memberFunctionRefExp != NULL)
19227 ROSE_ASSERT(functionRefExp == NULL);
19228 if (numberOfOperands == 0)
19231 returnValue =
true;
19236 returnValue =
false;
19242 ROSE_ASSERT(functionRefExp != NULL);
19243 ROSE_ASSERT(memberFunctionRefExp == NULL);
19244 if (numberOfOperands == 1)
19247 returnValue =
true;
19252 ROSE_ASSERT(numberOfOperands == 2);
19253 returnValue =
false;
19259 printf (
"Leaving SageInterface::isPrefixOperator(): returnValue = %s \n",returnValue ?
"true" :
"false");
19262 return returnValue;
19278 bool returnValue =
false;
19280 if (memberFunctionRefExp == NULL)
19284 if (memberFunctionDeclaration != NULL)
19286 SgName functionName = memberFunctionDeclaration->get_name();
19287 if ( (functionName ==
"operator[]") && (isSgType(memberFunctionDeclaration->get_type()) != NULL) )
19289 returnValue =
true;
19293 if ( (functionName ==
"operator()") && (isSgType(memberFunctionDeclaration->get_type()) != NULL) )
19295 returnValue =
true;
19299 returnValue =
false;
19304 return returnValue;
19315 ROSE_ASSERT(scope != NULL);
19318 printf (
"In SageInterface::lastStatementOfScopeWithTokenInfo(): scope = %p = %s \n",scope,scope->
class_name().c_str());
19321 SgIfStmt* ifStatement = isSgIfStmt(scope);
19322 if (ifStatement != NULL)
19325 if (lastStatement == NULL || (tokenStreamSequenceMap.find(lastStatement) == tokenStreamSequenceMap.end() || tokenStreamSequenceMap[lastStatement] == NULL))
19328 if (lastStatement == NULL || (tokenStreamSequenceMap.find(lastStatement) == tokenStreamSequenceMap.end() || tokenStreamSequenceMap[lastStatement] == NULL))
19330 lastStatement = NULL;
19334 printf (
"Note: SgIfStmt scope in SageInterface::lastStatementOfScopeWithTokenInfo(): returning lastStatement = %p \n",lastStatement);
19335 if (lastStatement != NULL)
19337 printf (
" --- lastStatement = %p = %s \n",lastStatement,lastStatement->
class_name().c_str());
19340 return lastStatement;
19344 if (statementList.rbegin() != statementList.rend())
19347 SgStatementPtrList::reverse_iterator i = statementList.rbegin();
19349 while (i != statementList.rend() && (tokenStreamSequenceMap.find(*i) == tokenStreamSequenceMap.end() || tokenStreamSequenceMap[*i] == NULL) )
19354 if (i == statementList.rend())
19356 lastStatement = NULL;
19360 lastStatement = *i;
19364 return lastStatement;
19378 void visit (
SgNode* node)
19388 printf (
"Found declaration = %p = %s name = %s \n",decl,decl->
class_name().c_str(),
get_name(decl).c_str());
19389 if (decl != definingDeclaration && decl != firstNondefiningDeclaration)
19391 otherDeclaration = decl;
19394 if (definingDeclaration != NULL)
19396 definingDeclaration->get_declarationModifier().get_accessModifier().display(
"definingDeclaration: accessModifier");
19399 if (firstNondefiningDeclaration != NULL)
19401 firstNondefiningDeclaration->get_declarationModifier().get_accessModifier().display(
"firstNondefiningDeclaration: accessModifier");
19404 if (otherDeclaration != NULL)
19406 otherDeclaration->get_declarationModifier().get_accessModifier().display(
"otherDeclaration: accessModifier");
19416 DeclarationTraversal traversal;
19417 traversal.traverse(astNode, preorder);
19429 void visit (
SgNode* node)
19435 if (functionDefinition != NULL)
19438 ROSE_ASSERT(functionDeclaration != NULL);
19440 string functionName = functionDeclaration->get_name();
19442 printf (
"functionName = %s \n",functionName.c_str());
19444 if (functionName ==
"main")
19448 ROSE_ASSERT(functionBody != NULL);
19450 ROSE_ASSERT(symbolTable != NULL);
19453 symbolTable->
print();
19458 if (namespaceDefinition != NULL)
19461 ROSE_ASSERT(namespaceDeclaration != NULL);
19463 string namespaceName = namespaceDeclaration->
get_name();
19465 printf (
"namespaceName = %s \n",namespaceName.c_str());
19467 if (namespaceName ==
"B")
19470 ROSE_ASSERT(symbolTable != NULL);
19473 symbolTable->
print();
19481 ScopeTraversal traversal;
19482 traversal.traverse(astNode, preorder);
19490 if (fileInfo != NULL)
19496 if (locatedNode != NULL)
19505 printf (
"In markNodeToBeUnparsed(): physical_file_id = %d \n",physical_file_id);
19508 locatedNode->
get_file_info()->set_physical_file_id(physical_file_id);
19510 printf (
"Note: calling node markTransformationsForOutput(): node = %p = %s \n",node,node->
class_name().c_str());
19514 markTransformationsForOutput(node);
19519 printf (
"Note: node is not a SgLocatedNode: node = %p = %s \n",node,node->
class_name().c_str());
19526 printf (
"Note: no Sg_File_Info was found: node = %p = %s \n",node,node->
class_name().c_str());
19531 if (locatedNode != NULL)
19540 printf (
"In SageInterface::markNodeToBeUnparsed(): locatedNode = %p = %s calling set_physical_file_id(%d) \n",locatedNode,locatedNode->
class_name().c_str(),physical_file_id);
19542 locatedNode->
get_file_info()->set_physical_file_id(physical_file_id);
19547 printf (
"Note: no Sg_File_Info was found: node = %p = %s \n",node,node->
class_name().c_str());
19580 class InheritedAttribute
19583 int physical_file_id;
19584 bool isCastSubtree;
19585 InheritedAttribute(
int file_id): physical_file_id(file_id), isCastSubtree(
false) {}
19586 InheritedAttribute(
const InheritedAttribute & X)
19588 isCastSubtree = X.isCastSubtree;
19589 physical_file_id = X.physical_file_id;
19600 InheritedAttribute evaluateInheritedAttribute (
SgNode* node, InheritedAttribute inheritedAttribute)
19602 InheritedAttribute returnAttribute(inheritedAttribute);
19604 SgCastExp* castExpression = isSgCastExp(node);
19605 if (castExpression != NULL)
19607 returnAttribute.isCastSubtree =
true;
19610 if (returnAttribute.isCastSubtree ==
true)
19614 printf (
"In markSubtreeToBeUnparsedTreeTraversal(): subtree of a SgCastExp: node = %p = %s physical_file_id = %d \n",
19615 node,node->
class_name().c_str(),inheritedAttribute.physical_file_id);
19621 printf (
"In markSubtreeToBeUnparsedTreeTraversal(): Calling markNodeToBeUnparsed(): node = %p = %s physical_file_id = %d \n",
19622 node,node->
class_name().c_str(),inheritedAttribute.physical_file_id);
19628 return returnAttribute;
19632 InheritedAttribute inheritedAttribute(physical_file_id);
19635 SubtreeTraversal traversal;
19638 printf (
"\nIn markSubtreeToBeUnparsedTreeTraversal(): calling traverse \n");
19641 traversal.traverse(root, inheritedAttribute);
19643 printf (
"This function does not compile with GNU 4.9 or older compilers (part of ROSE used only with more modern compilers) \n");
19652vector<SgDeclarationStatement*>
19653generateCopiesOfDependentDeclarations (
const vector<SgDeclarationStatement*>& dependentDeclarations,
SgScopeStatement* targetScope)
19664 printf (
"\n\n********************************************************** \n");
19665 printf (
" Inside of generateCopiesOfDependentDeclarations(stmt = %p = %s) \n",stmt,stmt->
class_name().c_str());
19666 printf (
"********************************************************** \n");
19669 vector<SgDeclarationStatement*> copiesOfDependentDeclarations;
19674 printf (
"Output the dependentDeclarations: dependentDeclarations.size() = %" PRIuPTR
" \n",dependentDeclarations.size());
19675 outputDeclarationList(dependentDeclarations);
19678 printf (
"************************************************ \n");
19679 printf (
"*** Make all copies of dependentDeclarations *** \n");
19680 printf (
"************************************************ \n");
19684 ROSE_ASSERT(targetScope != NULL);
19687 ROSE_ASSERT(isSgGlobal(targetScope) != NULL);
19689 for (vector<SgDeclarationStatement*>::const_iterator i = dependentDeclarations.begin(); i != dependentDeclarations.end(); i++)
19692 printf (
"Copying declaration = %p = %s = %s \n",*i,(*i)->class_name().c_str(),
SageInterface::get_name(*i).c_str());
19696 SgNode* copy_node = NULL;
19701 if (functionDeclaration != NULL)
19710 printf (
"WARNING: In SageInterface -- generateCopiesOfDependentDeclarations(): I think this is the wrong lookup symbol function that is being used here! \n");
19717 printf (
"In generateCopiesOfDependentDeclarations(): Copy mechanism appied to SgFunctionDeclaration functionDeclaration->get_firstNondefiningDeclaration() = %p \n",functionDeclaration->
get_firstNondefiningDeclaration());
19719 printf (
"functionDeclaration = %p \n",functionDeclaration);
19720 printf (
"functionDeclaration->get_definingDeclaration() = %p \n",functionDeclaration->
get_definingDeclaration());
19722 printf (
"functionDeclaration->get_scope() = %p \n",functionDeclaration->
get_scope());
19723 printf (
"targetScope = %p \n",targetScope);
19726 assert(copy_functionDeclaration != NULL);
19728 copy_functionDeclaration->
set_parent(targetScope);
19738 assert(copy_functionDeclaration->
get_scope() != NULL);
19739 assert(copy_functionDeclaration->
get_scope() == targetScope);
19740 assert(copy_functionDeclaration->
get_scope()->lookup_function_symbol(copy_functionDeclaration->get_name(),
19741 copy_functionDeclaration->get_type()) != NULL);
19742 assert(copy_functionDeclaration->
get_scope()->lookup_function_symbol(copy_functionDeclaration->get_name(),
19745 copy_node = copy_functionDeclaration;
19747 printf (
"In generateCopiesOfDependentDeclarations(): DONE: Copy mechanism appied to SgFunctionDeclaration \n");
19761 cout<<
"Copying a defining typedef declaration:"<<tdecl->
unparseToString()<<endl;
19763 cout<<
"Copying a non-defining typedef declaration:"<<tdecl->
unparseToString()<<endl;
19767 tdecl_copy->set_typedefBaseTypeContainsDefiningDeclaration (
false);
19770 copy_node = (*i)->copy(collectDependentDeclarationsCopyType);
19774 ROSE_ASSERT(copy_declaration != NULL);
19778 copy_declaration->
set_scope(targetScope);
19790 ROSE_ASSERT(copy_node != NULL);
19799 ROSE_ASSERT(copy_definingDeclaration != NULL);
19801 ROSE_ASSERT( *i != NULL );
19802 ROSE_ASSERT(copy_definingDeclaration != NULL);
19805 if (copy_definingDeclaration->
get_parent() == NULL)
19807 copy_definingDeclaration->
set_parent(targetScope);
19809 ROSE_ASSERT(copy_definingDeclaration->
get_parent() != NULL);
19812 printf (
"DONE: Copying declaration: original scope = %p copied to scope = %p \n",(*i)->get_scope(),copy_definingDeclaration->
get_scope());
19822 ROSE_ASSERT(copy_definingDeclaration->
get_parent() == NULL);
19829 printf (
"copy_definingDeclaration = %p \n",copy_definingDeclaration);
19830 printf (
"copy_definingDeclaration->get_firstNondefiningDeclaration() == NULL \n");
19831 printf (
"copy_definingDeclaration->get_definingDeclaration() = %p \n",copy_definingDeclaration->
get_definingDeclaration());
19836 if ((*i)->get_firstNondefiningDeclaration() != NULL)
19844 copiesOfDependentDeclarations.push_back(copy_definingDeclaration);
19848 printf (
"****************************************************** \n");
19849 printf (
"*** DONE: Make all copies of dependentDeclarations *** \n");
19850 printf (
"****************************************************** \n");
19851 printf (
"copiesOfDependentDeclarations.size() = %" PRIuPTR
" \n",copiesOfDependentDeclarations.size());
19857 ROSE_ASSERT(copiesOfDependentDeclarations.size() <= dependentDeclarations.size());
19859 return copiesOfDependentDeclarations;
19864declarationContainsDependentDeclarations(
SgDeclarationStatement* decl, vector<SgDeclarationStatement*> & dependentDeclarationList )
19867 bool returnValue =
false;
19870 printf (
"\n\n********************************************************** \n");
19871 printf (
" Inside of declarationContainsDependentDeclarations(decl = %p = %s) \n",decl,decl->
class_name().c_str());
19872 printf (
"********************************************************** \n");
19880 for (
size_t i = 0; i < locallyDependentDeclarationList.size(); i++)
19886 vector<SgDeclarationStatement*>::iterator j = find(dependentDeclarationList.begin(),dependentDeclarationList.end(),d);
19887 if (j != dependentDeclarationList.end())
19892 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());
19894 returnValue =
true;
19899 printf (
"**************************************************************************** \n");
19900 printf (
" LEAVING: Inside of declarationContainsDependentDeclarations(decl = %p = %s) returnValue = %s \n",decl,decl->
class_name().c_str(),returnValue ?
"true" :
"false");
19901 printf (
"**************************************************************************** \n");
19904 return returnValue;
19909 ROSE_ASSERT (new_exp != NULL);
19910 ROSE_ASSERT (anchor_exp != NULL);
19911 ROSE_ASSERT (new_exp != anchor_exp);
19914 ROSE_ASSERT (parent != NULL);
19918 ROSE_ASSERT (result != NULL);
19930 ROSE_ASSERT (new_exp != NULL);
19931 ROSE_ASSERT (anchor_exp != NULL);
19932 ROSE_ASSERT (new_exp != anchor_exp);
19935 ROSE_ASSERT (parent != NULL);
19939 ROSE_ASSERT (t != NULL);
19941 ROSE_ASSERT (enclosing_stmt != NULL);
19948 ROSE_ASSERT (temp_sym != NULL);
19950 *temp_decl = t_decl;
19955 * temp_ref = first_ref;
19968 string fileName =
"separate-outlined-file";
19988 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl = %p \n",decl);
19989 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_parent() = %p \n",decl->
get_parent());
19990 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_scope() = %p \n",decl->
get_scope());
19991 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): original_statement = %p \n",original_statement);
19992 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): file (decl) = %s \n",TransformationSupport::getSourceFile(decl)->getFileName().c_str());
19993 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_firstNondefiningDeclaration() = %p \n",decl->
get_firstNondefiningDeclaration());
19995 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): file (first non-defining) = %s \n",TransformationSupport::getSourceFile(decl->
get_firstNondefiningDeclaration())->
getFileName().c_str());
19996 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): decl->get_definingDeclaration() = %p \n",decl->
get_definingDeclaration());
19998 printf (
"***** In SageInterface::appendStatementWithDependentDeclaration(): file (first non-defining) = %s \n",TransformationSupport::getSourceFile(decl->
get_definingDeclaration())->
getFileName().c_str());
20001#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
20033 vector<SgDeclarationStatement*> dependentDeclarationList_inOriginalFile;
20040 vector<SgDeclarationStatement*> dependentDeclarationList = generateCopiesOfDependentDeclarations(dependentDeclarationList_inOriginalFile,scope);
20041 ROSE_ASSERT(dependentDeclarationList.size() <= dependentDeclarationList_inOriginalFile.size());
20051 std::map<SgNode*, SgNode*> replacementMap;
20056 SgCopyHelp::copiedNodeMapType copyNodeMap = collectDependentDeclarationsCopyType.get_copiedNodeMap();
20057 SgCopyHelp::copiedNodeMapType::iterator copyNodeMapItrator = copyNodeMap.begin();
20058 while (copyNodeMapItrator != copyNodeMap.end())
20063 SgNode* first =
const_cast<SgNode*
>(copyNodeMapItrator->first);
20064 SgNode* second = copyNodeMapItrator->second;
20066 printf (
"copyNodeMapItrator.first = %p = %s second = %p = %s \n",first,first->
class_name().c_str(),second,second->
class_name().c_str());
20069 if (isSgSymbol(first) != NULL)
20074 replacementMap.insert(pair<SgNode*,SgNode*>(first,second));
20077 copyNodeMapItrator++;
20081 printf (
"Exiting after test of new functionality \n");
20087 SgSourceFile* sourceFile = TransformationSupport::getSourceFile(original_statement);
20088 vector<PreprocessingInfo*> requiredDirectivesList = collectCppDirectives(sourceFile);
20091 ROSE_ASSERT(outlinedFunctionDeclaration != NULL);
20092 SgGlobal* originalFileGlobalScope = TransformationSupport::getGlobalScope(original_statement);
20093 ROSE_ASSERT(originalFileGlobalScope != NULL);
20095 printf (
"WARNING: In SageInterface::appendStatementWithDependentDeclaration(): I think this is the wrong lookup symbol function that is being used here! \n");
20099 SgFunctionSymbol* outlinedFunctionSymbolFromOriginalFile = isSgFunctionSymbol(originalFileGlobalScope->lookup_symbol(outlinedFunctionDeclaration->get_name(),NULL,NULL));
20105 printf (
"outlinedFunctionSymbolFromOriginalFile = %p outlinedFunctionSymbolFromOutlinedFile = %p \n",outlinedFunctionSymbolFromOriginalFile,outlinedFunctionSymbolFromOutlinedFile);
20107 printf (
"TransformationSupport::getSourceFile(decl)->getFileName() = %s \n",TransformationSupport::getSourceFile(decl)->getFileName().c_str());
20108 printf (
"TransformationSupport::getSourceFile(decl->get_firstNondefiningDeclaration())->getFileName() = %s \n",TransformationSupport::getSourceFile(decl->
get_firstNondefiningDeclaration())->
getFileName().c_str());
20109 printf (
"TransformationSupport::getSourceFile(original_statement)->getFileName() = %s \n",TransformationSupport::getSourceFile(original_statement)->getFileName().c_str());
20112 ROSE_ASSERT(outlinedFunctionSymbolFromOriginalFile != NULL);
20113 ROSE_ASSERT(outlinedFunctionSymbolFromOutlinedFile != NULL);
20116 ROSE_ASSERT(outlinedFunctionSymbolFromOriginalFile == outlinedFunctionSymbolFromOutlinedFile);
20119 replacementMap.insert(pair<SgNode*,SgNode*>(originalFileGlobalScope,scope));
20122 SgFunctionDeclaration* outlinedNondefiningFunctionDeclarationFromOriginalFile = isSgFunctionDeclaration(outlinedFunctionSymbolFromOriginalFile->get_declaration());
20124 ROSE_ASSERT(outlinedNondefiningFunctionDeclarationFromOriginalFile != NULL);
20125 ROSE_ASSERT(outlinedNondefiningFunctionDeclarationFromOutlinedFile != NULL);
20126 replacementMap.insert(pair<SgNode*,SgNode*>(outlinedNondefiningFunctionDeclarationFromOriginalFile,outlinedNondefiningFunctionDeclarationFromOutlinedFile));
20135 for (
size_t i = 0; i < dependentDeclarationList.size(); i++)
20141 printf (
"originalDeclaration = %p \n",originalDeclaration);
20143 d->
get_file_info()->display(
"SageInterface::appendStatementWithDependentDeclaration()");
20151 ROSE_ASSERT(decl->
get_scope() == scope);
20157 printf (
"Add the required symbol information to the symbol table: scope = %p = %s \n",scope,scope->
class_name().c_str());
20164 case V_SgClassDeclaration:
20166 if ( declarationContainsDependentDeclarations(d,dependentDeclarationList) ==
true )
20167 printf (
"Warning: This class contains dependent declarations (not implemented) \n");
20171 case V_SgMemberFunctionDeclaration:
20172 printf (
"Sorry, support for dependent member function declarations not implemented! \n");
20175 case V_SgTemplateInstantiationDecl:
20176 printf (
"Sorry, not implemented: case SgTemplateInstantiationDecl not handled as dependent declaration \n");
20177 d->
get_file_info()->display(
"Sorry, not implemented: case SgTemplateInstantiationDecl not handled as dependent declaration");
20179 printf (
"Case of SgTemplateInstantiationDecl not implemented. \n");
20182 case V_SgNamespaceDeclarationStatement:
20183 if (declarationContainsDependentDeclarations(d,dependentDeclarationList) ==
true )
20184 printf (
"Warning: This namespace contains dependent declarations (not supported) \n");
20187 case V_SgFunctionDeclaration:
20188 case V_SgTypedefDeclaration:
20189 case V_SgEnumDeclaration:
20193 printf (
"default case in SageInterface::appendStatementWithDependentDeclaration() (handling dependentDeclarationList) d = %p = %s \n",d,d->
class_name().c_str());
20199 vector<PreprocessingInfo*> cppDirectivesAlreadyAttachedToDependentDeclarations = collectCppDirectives(d);
20202 printf (
"directives BEFORE excluding those already present in dependent declarations \n");
20203 outputPreprocessingInfoList(requiredDirectivesList);
20205 printf (
"directives already attached to dependent declarations \n");
20206 outputPreprocessingInfoList(cppDirectivesAlreadyAttachedToDependentDeclarations);
20210 vector<PreprocessingInfo*>::iterator j = cppDirectivesAlreadyAttachedToDependentDeclarations.begin();
20211 while ( j != cppDirectivesAlreadyAttachedToDependentDeclarations.end() )
20214 vector<PreprocessingInfo*>::iterator entry = find(requiredDirectivesList.begin(),requiredDirectivesList.end(),*j);
20215 ROSE_ASSERT(entry != requiredDirectivesList.end());
20217 requiredDirectivesList.erase(entry);
20223 printf (
"directives AFTER excluding those already present in dependent declarations \n");
20224 outputPreprocessingInfoList(requiredDirectivesList);
20233 if (dependentDeclarationList.empty() ==
true)
20235 firstStatmentInFile = decl;
20239 firstStatmentInFile = dependentDeclarationList[0];
20242 ROSE_ASSERT(firstStatmentInFile != NULL);
20250 if (excludeHeaderFiles ==
false)
20253 vector<PreprocessingInfo*>::reverse_iterator j = requiredDirectivesList.rbegin();
20254 while ( j != requiredDirectivesList.rend() )
20273 SgSourceFile* outlinedFile = TransformationSupport::getSourceFile(scope);
20274 ROSE_ASSERT(outlinedFile != NULL);
20280 printf (
"\n\n************************************************************\n");
20281 printf (
"Calling Utils::edgePointerReplacement() \n");
20287 printf (
"Calling Utils::edgePointerReplacement(): DONE \n");
20288 printf (
"************************************************************\n\n");
20290 printf (
"\n\n After replacementMapTraversal(): intermediateDeleteSet: \n");
20291 displaySet(intermediateDeleteSet,
"After Utils::edgePointerReplacement");
20295 ROSE_ASSERT(dependentDeclarationList.size() <= dependentDeclarationList_inOriginalFile.size());
20303 printf (
"replacementMap.size() = %" PRIuPTR
" dependentDeclarationList.size() = %" PRIuPTR
" \n",replacementMap.size(),dependentDeclarationList.size());
20319 int SgVariableSymbol_count;
20320 int SgFunctionSymbol_count;
20321 int SgClassDeclaration_count;
20322 int SgTypedefSymbol_count;
20323 int SgMemFuncSymbol_count;
20324 int SgTemplateSymbol_count;
20325 int SgEnumFieldSymbol_count;
20343 SgVariableSymbol_count = 0;
20344 SgVariableSymbolPtr = symbol;
20345 SgFunctionSymbolPtr =NULL;
20346 SgClassSymbolPtr =NULL;
20347 SgTypedefPtr = NULL;
20348 SgMemFuncSymbolPtr =NULL;
20349 class_defining = NULL;
20351 typedef_defining =NULL;
20352 function_decl = NULL;
20353 SgTemplateSymbolPtr = NULL;
20354 template_defining = NULL;
20355 SgEnumFieldSymbolPtr = NULL;
20356 templateInstantiate_defining =NULL;
20360 SgFunctionSymbol_count = 0;
20361 SgFunctionSymbolPtr = symbol;
20364 SgMemFuncSymbol_count =0;
20366 SgVariableSymbolPtr = NULL;
20367 SgClassSymbolPtr =NULL;
20368 SgTypedefPtr = NULL;
20369 SgMemFuncSymbolPtr =NULL;
20370 class_defining = NULL;
20372 typedef_defining =NULL;
20373 function_decl = NULL;
20374 SgTemplateSymbolPtr = NULL;
20375 template_defining = NULL;
20376 SgEnumFieldSymbolPtr = NULL;
20377 templateInstantiate_defining =NULL;
20381 SgClassDeclaration_count = 0;
20382 SgClassSymbolPtr = symbol;
20383 SgFunctionSymbolPtr = NULL;
20384 SgVariableSymbolPtr = NULL;
20385 SgTypedefPtr = NULL;
20386 SgMemFuncSymbolPtr =NULL;
20387 class_defining = NULL;
20389 typedef_defining =NULL;
20390 function_decl = NULL;
20391 SgTemplateSymbolPtr = NULL;
20392 template_defining = NULL;
20393 SgEnumFieldSymbolPtr = NULL;
20394 templateInstantiate_defining =NULL;
20398 SgTypedefSymbol_count =0;
20399 SgTypedefPtr = symbol;
20400 SgClassSymbolPtr = NULL;
20401 SgFunctionSymbolPtr = NULL;
20402 SgVariableSymbolPtr = NULL;
20403 SgMemFuncSymbolPtr =NULL;
20404 class_defining = NULL;
20406 typedef_defining =NULL;
20407 function_decl = NULL;
20408 SgTemplateSymbolPtr = NULL;
20409 template_defining = NULL;
20410 SgEnumFieldSymbolPtr = NULL;
20411 templateInstantiate_defining =NULL;
20415 SgMemFuncSymbolPtr = symbol;
20416 SgMemFuncSymbol_count =0;
20417 SgTypedefPtr = NULL;
20418 SgClassSymbolPtr = NULL;
20419 SgFunctionSymbolPtr = NULL;
20420 SgVariableSymbolPtr = NULL;
20421 class_defining = NULL;
20423 typedef_defining =NULL;
20424 function_decl = NULL;
20425 SgTemplateSymbolPtr = NULL;
20426 template_defining = NULL;
20427 SgEnumFieldSymbolPtr = NULL;
20428 templateInstantiate_defining =NULL;
20432 SgTemplateSymbolPtr = symbol;
20433 SgTemplateSymbol_count =0;
20434 SgMemFuncSymbolPtr = NULL;
20435 SgTypedefPtr = NULL;
20436 SgClassSymbolPtr = NULL;
20437 SgFunctionSymbolPtr = NULL;
20438 SgVariableSymbolPtr = NULL;
20439 class_defining = NULL;
20441 typedef_defining =NULL;
20442 function_decl = NULL;
20443 template_defining = NULL;
20444 SgEnumFieldSymbolPtr = NULL;
20445 templateInstantiate_defining =NULL;
20449 SgEnumFieldSymbolPtr = symbol;
20450 SgEnumFieldSymbol_count =0;
20451 SgTemplateSymbolPtr = NULL;
20452 SgMemFuncSymbolPtr = NULL;
20453 SgTypedefPtr = NULL;
20454 SgClassSymbolPtr = NULL;
20455 SgFunctionSymbolPtr = NULL;
20456 SgVariableSymbolPtr = NULL;
20457 class_defining = NULL;
20459 typedef_defining =NULL;
20460 function_decl = NULL;
20461 template_defining = NULL;
20462 templateInstantiate_defining =NULL;
20467 class_defining = node;
20468 SgMemFuncSymbolPtr = NULL;
20469 SgTypedefPtr = NULL;
20470 SgClassSymbolPtr = NULL;
20471 SgFunctionSymbolPtr = NULL;
20472 SgVariableSymbolPtr = NULL;
20474 typedef_defining =NULL;
20475 function_decl = NULL;
20476 SgTemplateSymbolPtr = NULL;
20477 template_defining = NULL;
20478 SgEnumFieldSymbolPtr = NULL;
20479 templateInstantiate_defining =NULL;
20483 template_defining = node;
20484 class_defining = NULL;
20485 SgMemFuncSymbolPtr = NULL;
20486 SgTypedefPtr = NULL;
20487 SgClassSymbolPtr = NULL;
20488 SgFunctionSymbolPtr = NULL;
20489 SgVariableSymbolPtr = NULL;
20491 typedef_defining =NULL;
20492 function_decl = NULL;
20493 SgTemplateSymbolPtr = NULL;
20494 SgEnumFieldSymbolPtr = NULL;
20495 templateInstantiate_defining =NULL;
20498 function_decl =node;
20499 class_defining = NULL;
20500 SgMemFuncSymbolPtr = NULL;
20501 SgTypedefPtr = NULL;
20502 SgClassSymbolPtr = NULL;
20503 SgFunctionSymbolPtr = NULL;
20504 SgVariableSymbolPtr = NULL;
20506 typedef_defining =NULL;
20507 SgTemplateSymbolPtr = NULL;
20508 template_defining = NULL;
20509 SgEnumFieldSymbolPtr = NULL;
20510 templateInstantiate_defining =NULL;
20515 function_decl =NULL;
20516 class_defining = NULL;
20517 SgMemFuncSymbolPtr = NULL;
20518 SgTypedefPtr = NULL;
20519 SgClassSymbolPtr = NULL;
20520 SgFunctionSymbolPtr = NULL;
20521 SgVariableSymbolPtr = NULL;
20522 typedef_defining =NULL;
20523 SgTemplateSymbolPtr = NULL;
20524 template_defining = NULL;
20525 SgEnumFieldSymbolPtr = NULL;
20526 templateInstantiate_defining =NULL;
20530 typedef_defining = node;
20532 function_decl =NULL;
20533 class_defining = NULL;
20534 SgMemFuncSymbolPtr = NULL;
20535 SgTypedefPtr = NULL;
20536 SgClassSymbolPtr = NULL;
20537 SgFunctionSymbolPtr = NULL;
20538 SgVariableSymbolPtr = NULL;
20539 SgTemplateSymbolPtr = NULL;
20540 template_defining = NULL;
20541 SgEnumFieldSymbolPtr = NULL;
20542 templateInstantiate_defining =NULL;
20546 templateInstantiate_defining =node;
20547 typedef_defining = NULL;
20549 function_decl =NULL;
20550 class_defining = NULL;
20551 SgMemFuncSymbolPtr = NULL;
20552 SgTypedefPtr = NULL;
20553 SgClassSymbolPtr = NULL;
20554 SgFunctionSymbolPtr = NULL;
20555 SgVariableSymbolPtr = NULL;
20556 SgTemplateSymbolPtr = NULL;
20557 template_defining = NULL;
20558 SgEnumFieldSymbolPtr = NULL;
20565 if(SgVariableSymbolPtr !=NULL)
20567 if(node->get_scope()!=NULL)
20573 if (isSgVariableSymbol(s) == SgVariableSymbolPtr) SgVariableSymbol_count++;
20578 if(SgEnumFieldSymbolPtr !=NULL)
20580 if(node->get_scope()!=NULL)
20586 if (isSgEnumFieldSymbol(s) == SgEnumFieldSymbolPtr) SgEnumFieldSymbol_count++;
20594 if(SgVariableSymbolPtr !=NULL){
20596 if (s == SgVariableSymbolPtr) SgVariableSymbol_count++;
20600 int get_num_variable_pointers(){
return SgVariableSymbol_count;}
20602 int get_num_EnumField_pointers(){
return SgEnumFieldSymbol_count;}
20607 if(SgFunctionSymbolPtr !=NULL){
20613 if ((
SgFunctionSymbol *)s == SgFunctionSymbolPtr) SgFunctionSymbol_count++;
20618 if(function_decl!=NULL){
20622 if(node!=function_decl && (define==function_decl || first_nondefine==function_decl))
delete node;
20631 printf (
"In visit(SgFunctionRefExp* node): SgFunctionSymbolPtr = %p \n",SgFunctionSymbolPtr);
20633 if (SgFunctionSymbolPtr !=NULL)
20636 if (isSgFunctionSymbol(s) == SgFunctionSymbolPtr)
20638 SgFunctionSymbol_count++;
20640 printf (
"Increment SgFunctionSymbol_count = %d \n",SgFunctionSymbol_count);
20650 printf (
"In visit(SgMemberFunctionRefExp* node): SgFunctionSymbolPtr = %p \n",SgFunctionSymbolPtr);
20652 if (SgFunctionSymbolPtr !=NULL)
20655 if (isSgFunctionSymbol(s) == SgFunctionSymbolPtr)
20657 SgFunctionSymbol_count++;
20659 printf (
"Increment SgFunctionSymbol_count = %d \n",SgFunctionSymbol_count);
20667 if (SgFunctionSymbolPtr !=NULL){
20669 if (isSgFunctionSymbol(s) == SgFunctionSymbolPtr) SgFunctionSymbol_count++;
20673 int get_num_Function_pointers(){
return SgFunctionSymbol_count;}
20678 if(SgClassSymbolPtr !=NULL){
20683 if (isSgClassSymbol(s) == SgClassSymbolPtr) SgClassDeclaration_count++;
20688 if(class_defining!=NULL) {
20692 if((class_decl==class_defining||class_decl1==class_defining) && node!=class_defining )
20700 if(SgClassSymbolPtr !=NULL){
20705 if (isSgClassSymbol(s) == SgClassSymbolPtr) SgClassDeclaration_count++;
20710 if(templateInstantiate_defining!=NULL) {
20717 if((template_decl==templateInstantiate_defining||template_decl1==templateInstantiate_defining) && node!=templateInstantiate_defining){
20737 if (SgClassSymbolPtr !=NULL){
20738 SgSymbol* s = node->get_class_symbol();
20739 if (s == SgClassSymbolPtr) SgClassDeclaration_count++;
20745 if (SgClassSymbolPtr !=NULL){
20747 if (isSgClassSymbol(s) == SgClassSymbolPtr) SgClassDeclaration_count++;
20752 int get_num_Class_pointers(){
return SgClassDeclaration_count;}
20758 if(memFunc !=NULL){
20760 if(func == memFunc){
20769 if (SgMemFuncSymbolPtr !=NULL){
20774 if(symbol == SgMemFuncSymbolPtr){
20775 SgMemFuncSymbol_count++;
20784 if (SgMemFuncSymbolPtr !=NULL){
20789 if(symbol == SgMemFuncSymbolPtr){
20790 SgMemFuncSymbol_count++;
20799 int get_num_memFunc_pointers(){
return SgMemFuncSymbol_count;}
20805 if(SgTypedefPtr!=NULL){
20814 if(typedef_defining!=NULL){
20816 if(typedef_define == typedef_defining && node != typedef_defining ) {
20822 int get_num_Typedef_pointers(){
return SgTypedefSymbol_count;}
20828 if (SgTemplateSymbolPtr !=NULL){
20833 if(symbol == SgTemplateSymbolPtr){
20834 SgTemplateSymbol_count++;
20840 if(template_defining !=NULL) {
20847 if((template_decl==template_defining||template_decl1==template_defining) && node!=template_defining) {
20857 int get_num_Template_pointers(){
return SgTemplateSymbol_count;}
20867 void visit (
SgNode* node)
20874 printf (
"In DeleteAST::visit(): node = %p = %s \n",node,node->
class_name().c_str());
20879 if (isSgScopeStatement(node) !=NULL)
20883 printf (
"Deleting the scopes type table: scope->get_type_table() = %p \n",scope->get_type_table());
20885 delete scope->get_type_table();
20891 if (isSgTypeTable(node) !=NULL)
20895 printf (
"Deleting the type table (SgSymbolTable): typeTable->get_type_table() = %p \n",typeTable->get_type_table());
20897 delete typeTable->get_type_table();
20900 if(isSgInitializedName(node) !=NULL){
20904 if(isSgVariableDefinition(var_def) !=NULL){
20911 if(isSgInitializedName(node)->get_scope()!=NULL){
20915 if(isSgVariableSymbol(symbol) !=NULL){
20917 traverseMemoryPoolVisitorPattern(visitor);
20918 if(visitor.get_num_variable_pointers()==1){
20925 if(isSgEnumFieldSymbol(symbol) !=NULL){
20927 traverseMemoryPoolVisitorPattern(visitor);
20928 if(visitor.get_num_EnumField_pointers()==1){
20939 if(isSgVarRefExp(node) !=NULL){
20941 ClassicVisitor visitor(symbol);
20942 traverseMemoryPoolVisitorPattern(visitor);
20943 if(visitor.get_num_variable_pointers()==1){
20955 SgFunctionDeclaration* funcDecl = isSgFunctionDeclaration(node);
20956 if (funcDecl != NULL){
20957 if (isSgMemberFunctionDeclaration(node) == NULL) {
20958 if (funcDecl->get_scope() != NULL) {
20959 if (funcDecl->get_scope()->get_symbol_table() != NULL) {
20960 SgSymbol* symbol = ((SgFunctionDeclaration*)node)->get_symbol_from_symbol_table();
20961 ClassicVisitor visitor((SgFunctionSymbol *)symbol);
20962 traverseMemoryPoolVisitorPattern(visitor);
20963 if (visitor.get_num_Function_pointers()==1) { //only one reference to this FunctionSymbol => safe to delete
20964 ((SgFunctionDeclaration*)node)->get_scope()->get_symbol_table()->remove(symbol);
20966 //printf("A SgFunctionSymbol was deleted\n");
20968 ClassicVisitor visitor1((SgFunctionDeclaration *)node);
20969 traverseMemoryPoolVisitorPattern(visitor1);
20976 if(isSgFunctionRefExp(node) !=NULL)
20979 SgFunctionRefExp* functionRefExp = isSgFunctionRefExp(node);
20980 ROSE_ASSERT(functionRefExp->get_symbol_i() != NULL);
20981 printf ("In DeleteAST::visit(): functionRefExp->get_symbol_i() = %p = %s \n",functionRefExp->get_symbol_i(),functionRefExp->get_symbol_i()->class_name().c_str());
20983 SgFunctionSymbol *symbol = ((SgFunctionRefExp*)node)->get_symbol_i();
20984 ClassicVisitor visitor(symbol);
20985 traverseMemoryPoolVisitorPattern(visitor);
20986 if(visitor.get_num_Function_pointers()==1)
20988 // only one reference to this FunctionSymbol => safe to delete
20989 //((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
20991 //printf("A SgFunctionSymbol was deleted\n");
20996 if(isSgUserDefinedBinaryOp(node) !=NULL){
20997 SgFunctionSymbol *symbol = ((SgUserDefinedBinaryOp*)node)->get_symbol();
20998 ClassicVisitor visitor(symbol);
20999 traverseMemoryPoolVisitorPattern(visitor);
21000 if(visitor.get_num_Function_pointers()==1){ //only one reference to this FunctionSymbol => safe to delete
21001 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21003 //printf("A SgFunctionSymbol was deleted\n");
21011 if(isSgTypedefDeclaration(node) !=NULL){
21016 if(isSgTypedefSymbol(symbol)){
21018 traverseMemoryPoolVisitorPattern(visitor);
21019 if(visitor.get_num_Typedef_pointers()==1){
21030 traverseMemoryPoolVisitorPattern(visitor1);
21038 if(isSgNamespaceDeclarationStatement(node) !=NULL){
21039 if(((SgNamespaceDeclarationStatement*)node)->get_scope()!=NULL){
21040 if(((SgNamespaceDeclarationStatement*)node)->get_scope()->get_symbol_table()!=NULL)
21042 SgSymbol* symbol = ((SgNamespaceDeclarationStatement*)node)->get_symbol_from_symbol_table();
21043 if(isSgNamespaceSymbol(symbol)){
21044 ((SgNamespaceDeclarationStatement*)node)->get_scope()->get_symbol_table()->remove(symbol);
21046 //printf("A SgNamespaceSymbol was deleted\n");
21053 if(isSgNamespaceAliasDeclarationStatement(node) !=NULL){
21054 if(((SgNamespaceAliasDeclarationStatement*)node)->get_scope()!=NULL){
21055 if(((SgNamespaceAliasDeclarationStatement*)node)->get_scope()->get_symbol_table()!=NULL)
21057 SgSymbol* symbol = ((SgNamespaceAliasDeclarationStatement*)node)->get_symbol_from_symbol_table();
21058 if(isSgNamespaceSymbol(symbol)){
21059 ((SgNamespaceAliasDeclarationStatement*)node)->get_scope()->get_symbol_table()->remove(symbol);
21061 //printf("A SgNamespaceSymbol was deleted\n");
21072 if(isSgLabelStatement(node) !=NULL){
21077 if(isSgLabelSymbol(symbol)){
21086 if(isSgLabelRefExp(node) !=NULL){
21098 if(isSgEnumDeclaration(node) !=NULL){
21099 if(((SgEnumDeclaration*)node)->get_scope()!=NULL){
21100 if(((SgEnumDeclaration*)node)->get_scope()->get_symbol_table()!=NULL)
21102 SgSymbol* symbol = ((SgEnumDeclaration*)node)->get_symbol_from_symbol_table();
21103 if(isSgEnumSymbol(symbol) !=NULL){
21104 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21106 //printf("A SgEnumSymbol was deleted\n");
21110 SgEnumType* type= ((SgEnumDeclaration*)node)->get_type();
21113 //printf("A SgEnumType was deleted\n");
21122 if(isSgClassDeclaration(node) !=NULL && isSgTemplateInstantiationDecl(node) ==NULL){
21127 if(isSgClassSymbol(symbol) !=NULL){
21129 traverseMemoryPoolVisitorPattern(visitor);
21130 if(visitor.get_num_Class_pointers()==1){
21140 traverseMemoryPoolVisitorPattern(visitor);
21149 if(isSgThisExp(node) !=NULL){
21152 traverseMemoryPoolVisitorPattern(visitor);
21153 if(visitor.get_num_Class_pointers()==1){
21154 ((
SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21161 if(isSgClassNameRefExp(node) !=NULL){
21163 if(isSgClassSymbol(symbol) !=NULL)
21166 traverseMemoryPoolVisitorPattern(visitor);
21167 if(visitor.get_num_Class_pointers()==1){
21168 ((
SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21180 if(isSgMemberFunctionDeclaration(node) !=NULL){
21181 if(((SgMemberFunctionDeclaration*)node)->get_scope()!=NULL){
21182 if(((SgMemberFunctionDeclaration*)node)->get_scope()->get_symbol_table()!=NULL)
21184 SgSymbol* symbol = ((SgMemberFunctionDeclaration*)node)->get_symbol_from_symbol_table();
21185 if(isSgMemberFunctionSymbol(symbol)){
21186 ClassicVisitor visitor((SgMemberFunctionSymbol*)symbol);
21187 traverseMemoryPoolVisitorPattern(visitor);
21188 if(visitor.get_num_memFunc_pointers()==1){
21189 ((SgMemberFunctionDeclaration*)node)->get_scope()->get_symbol_table()->remove(symbol);
21191 //printf("A SgMemberFunctionSymbol was deleted\n");
21196 ClassicVisitor visitor((SgMemberFunctionDeclaration*) node);
21197 traverseMemoryPoolVisitorPattern(visitor);
21200//Tan: I have no idea why the codes below cannot work. Perhaps it conflicts with some prior works
21202 if(isSgMemberFunctionRefExp(node) !=NULL){
21203 SgMemberFunctionSymbol* symbol = ((SgMemberFunctionRefExp*)node)->get_symbol_i();
21204 ClassicVisitor visitor(symbol);
21205 traverseMemoryPoolVisitorPattern(visitor);
21206 if(visitor.get_num_memFunc_pointers()==1){ //only one reference to this symbol => safe to delete
21207 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21209 //printf("A SgClassSymbol was deleted\n");
21214 if(isSgFunctionType(node) !=NULL){
21215 SgSymbol* symbol = ((SgFunctionType*)node)->get_symbol_from_symbol_table();
21216 if(isSgFunctionTypeSymbol(symbol)){
21217 ((SgSymbol*)symbol)->get_scope()->get_symbol_table()->remove(symbol);
21219 //printf("A SgFunctionTypeSymbol was deleted\n");
21228 if(isSgInterfaceStatement(node) !=NULL){
21233 if(isSgInterfaceSymbol(symbol)){
21244 if(isSgModuleStatement(node) !=NULL){
21249 if(isSgModuleSymbol(symbol)){
21262 if(isSgTemplateInstantiationMemberFunctionDecl(node) !=NULL){
21267 if(isSgMemberFunctionSymbol(symbol)){
21269 traverseMemoryPoolVisitorPattern(visitor);
21270 if(visitor.get_num_memFunc_pointers()==1){
21279 traverseMemoryPoolVisitorPattern(visitor);
21282 if(isSgTemplateDeclaration(node) !=NULL){
21288 traverseMemoryPoolVisitorPattern(visitor);
21289 if(visitor.get_num_Template_pointers()==1){
21292 printf(
"A SgTemplateSymbol was deleted\n");
21298 traverseMemoryPoolVisitorPattern(visitor1);
21303 if(isSgInterfaceStatement(node) !=NULL){
21308 if(isSgInterfaceSymbol(symbol)){
21319 if(isSgModuleStatement(node) !=NULL){
21324 if(isSgModuleSymbol(symbol)){
21334 if(isSgTemplateInstantiationDecl(node) !=NULL){
21339 if(isSgClassSymbol(symbol)){
21341 traverseMemoryPoolVisitorPattern(visitor);
21342 if(visitor.get_num_Class_pointers()==1){
21361 printf(
"SgTemplateArg in normal traversal\n");
21363 printf(
"SgTemplateInstantiationDecl in normal traversal\n");
21366 traverseMemoryPoolVisitorPattern(visitor);
21376 printf (
"After delete node: node = %p = %s \n",node,node->
class_name().c_str());
21382 DeleteAST deleteTree;
21385 deleteTree.traverse(n,postorder);
21388 printf (
"Leaving SageInterface::deleteAST(): n = %p = %s \n",n,n->
class_name().c_str());
21415 virtual void visit(
SgNode* n)
21418 if (expression != NULL)
21420 Visitor().traverse(expression->get_originalExpressionTree(), postorder);
21427 Visitor().traverse(root, postorder);
21439 SgSymbol* symbol = s_table->find(iname);
21440 ASSERT_not_null(symbol);
21445 ASSERT_not_null(sourceBlock);
21446 ASSERT_not_null(targetBlock);
21461 SgSymbol* symbol = s_table->find(iname);
21462 ASSERT_not_null(symbol);
21469 ASSERT_not_null(symbol);
21480 ASSERT_require(stmt->
get_parent() == targetBlock);
21495 func->set_scope(targetBlock);
21498 SgFunctionDeclaration* nondef_decl= isSgFunctionDeclaration(func->get_firstNondefiningDeclaration());
21499 if (func != nondef_decl)
21501 ASSERT_not_null(nondef_decl);
21508 else if (
auto labelStmt = isSgLabelStatement(stmt))
21510 if (labelStmt->get_scope() == sourceBlock) {
21511 labelStmt->set_scope(targetBlock);
21516 else if (isSgJovialTableStatement(stmt) || isSgTypedefDeclaration(stmt) || isSgEnumDeclaration(stmt))
21524 mlog[Rose::Diagnostics::WARN] <<
"test failing stmt->get_scope() == targetBlock in SageInterface::moveStatementsBetweenBlocks(): class: "
21531 if (declaration !=
nullptr)
21538 case V_SgVariableDeclaration:
21543 for (SgInitializedNamePtrList::iterator ii = l.begin(); ii != l.end(); ii++)
21553 SgType* var_type = init_name->get_type();
21556 var_type = mod_type->get_base_type();
21563 if (isSgEnumType(var_type))
21565 SgEnumType* enum_type = isSgEnumType(var_type);
21580 enumerator->set_scope(targetBlock);
21584 else if (isSgJovialTableType(var_type))
21600 SgVariableSymbol* var_sym = isSgVariableSymbol(init_name -> search_for_symbol_from_symbol_table ()) ;
21601 ASSERT_not_null(var_sym);
21604 if (old_scope != sourceBlock)
21606 old_scope->remove_symbol (var_sym);
21607 sourceBlock ->
insert_symbol(init_name->get_name(), var_sym);
21610 init_name->set_scope(targetBlock);
21611 initname_vec.push_back(init_name);
21615 case V_SgFunctionDeclaration:
21618 ASSERT_not_null(funcDecl);
21625 if (old_scope != sourceBlock)
21627 old_scope->remove_symbol (func_sym);
21635 case V_SgProgramHeaderStatement:
21636 case V_SgProcedureHeaderStatement:
21637 case V_SgClassDeclaration:
21638 case V_SgEnumDeclaration:
21641 ASSERT_not_null(nondef_decl);
21655 if (
auto proc = isSgProcedureHeaderStatement(nondef_decl)) {
21656 for (
auto arg : proc->get_parameterList()->get_args()) {
21657 if (arg->get_scope() != proc->get_scope()) {
21661 arg->set_scope(proc->get_scope());
21673 name->set_scope(targetBlock);
21678 case V_SgJovialTableStatement:
21682 ROSE_ASSERT (table);
21691 case V_SgTypedefDeclaration:
21695 ASSERT_not_null(typedef_decl);
21700 case V_SgAttributeSpecificationStatement:
21701 case V_SgEmptyDeclaration:
21702 case V_SgFortranIncludeLine:
21703 case V_SgImplicitStatement:
21704 case V_SgJovialDefineDeclaration:
21705 case V_SgJovialDirectiveStatement:
21706 case V_SgJovialLabelDeclaration:
21707 case V_SgJovialOverlayDeclaration:
21708 case V_SgPragmaDeclaration:
21709 case V_SgAdaAttributeClause:
21713 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());
21722template <
class T1,
class T2>
21723void moveDeclarationsBetweenScopes( T1* sourceBlock, T2* targetBlock)
21727 ROSE_ASSERT (sourceBlock && targetBlock);
21728 ROSE_ASSERT (sourceBlock->containsOnlyDeclarations() && targetBlock->containsOnlyDeclarations());
21729 if ((
void*)sourceBlock == (
void*)targetBlock)
21731 cerr<<
"warning: SageInterface::moveStatementsBetweenScopes() is skipped, "<<endl;
21732 cerr<<
" since program is trying to move statements from and to the identical scoped block. "<<endl;
21736 SgDeclarationStatementPtrList& srcStmts = sourceBlock->get_declarations ();
21737 std::vector <SgInitializedName*> initname_vec;
21739 for (
auto stmt : srcStmts)
21741 moveOneStatement(sourceBlock, targetBlock, stmt, initname_vec);
21746 ROSE_ASSERT(srcStmts.empty() ==
true);
21747 ROSE_ASSERT(sourceBlock->get_declarations().empty() ==
true);
21750 moveSymbolTableBetweenBlocks(sourceBlock, targetBlock, initname_vec);
21763template <
class T1,
class T2>
21764void moveStatementsBetweenScopes( T1* sourceBlock, T2* targetBlock)
21767 ROSE_ASSERT (sourceBlock && targetBlock);
21768 if ((
void*)sourceBlock == (
void*)targetBlock)
21770 cerr<<
"warning: SageInterface::moveStatementsBetweenScopes() is skipped, "<<endl;
21771 cerr<<
" since program is trying to move statements from and to the identical scoped block. "<<endl;
21775 SgStatementPtrList & srcStmts = sourceBlock->get_statements();
21776 std::vector <SgInitializedName*> initname_vec;
21780 moveOneStatement(sourceBlock, targetBlock, stmt, initname_vec);
21785 ROSE_ASSERT(srcStmts.empty() ==
true);
21786 ROSE_ASSERT(sourceBlock->get_statements().empty() ==
true);
21789 moveSymbolTableBetweenBlocks(sourceBlock, targetBlock, initname_vec);
21803 ASSERT_not_null(decl);
21807 ASSERT_require(local_def && global_def && (local_def!=global_def));
21809 for (
auto symbol : local_def->get_symbol_table()->get_symbols())
21811 SgSymbol *orig_sym = isSgSymbol(symbol);
21812 ASSERT_not_null(orig_sym);
21821 moveDeclarationsBetweenScopes(sourceBlock, targetBlock);
21823 createAliasSymbols(isSgNamespaceDeclarationStatement(targetBlock->
get_parent()));
21828 moveStatementsBetweenScopes(sourceBlock, targetBlock);
21830 createAliasSymbols(isSgNamespaceDeclarationStatement(targetBlock->
get_parent()));
21835 moveDeclarationsBetweenScopes(sourceBlock, targetBlock);
21841 moveStatementsBetweenScopes (sourceBlock, targetBlock);
21849 ROSE_ASSERT (func != NULL);
21851 ROSE_ASSERT (p != NULL);
21853 if (le && le->get_lambda_function() == func)
21866 #pragma message ("WARNING: MSVC does not handle isLambdaCapturedVariable() properly.")
21868 ROSE_ASSERT (varRef!= NULL);
21872 SgThisExp* te = isSgThisExp(p->get_lhs_operand_i());
21876 ROSE_ASSERT (csym!= NULL);
21879 ROSE_ASSERT (xdecl != NULL);
21883 if (le->get_lambda_closure_class() == xdecl )
21899 ROSE_ASSERT(current != NULL);
21901 if (isSgInitializedName(current))
21903 name = isSgInitializedName(current);
21905 else if (isSgPntrArrRefExp(current) != NULL)
21909 ROSE_ASSERT(exp != NULL);
21911 ROSE_ASSERT(suc ==
true);
21915 else if (isSgVarRefExp(current) != NULL)
21921 if (isSgDotExp(parent))
21923 if (isSgDotExp(parent)->get_rhs_operand() == current)
21929 if (isSgArrowExp(parent)->get_rhs_operand() == current)
21933 name = isSgVarRefExp(current)->get_symbol()->get_declaration();
21935 else if (isSgFunctionRefExp(current) != NULL ||
21936 isSgTemplateFunctionRefExp(current) != NULL ||
21937 isSgMemberFunctionRefExp(current) != NULL ||
21938 isSgTemplateMemberFunctionRefExp(current) != NULL)
21943 else if (isSgNonrealRefExp(current) != NULL)
21948 else if (isSgDotExp(current))
21955 ROSE_ASSERT(child);
21959 else if (isSgArrowExp(current))
21980 ROSE_ASSERT(child);
21985 else if (isSgThisExp(current))
21990 else if (isSgPointerDerefExp(current))
21994 else if(isSgUnaryOp(current)) {
21997 else if (isSgCastExp(current))
22003 else if (isSgAddOp(current))
22008 else if (isSgSubtractOp(current))
22019 else if (isSgIntVal(current))
22029 if (!isSgConstructorInitializer(current))
22031 mlog[Sawyer::Message::Common::WARN] <<
22032 "convertRefToInitializedName: " <<
22035 cerr<<
"In SageInterface::convertRefToInitializedName(): unhandled reference type:"<<current->
class_name()<<endl;
22046#ifdef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22047 printf (
"AbstractHandle support is disabled for ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT \n");
22053 size_t pos = input_string.find(
"SourceFile<");
22054 ROSE_ASSERT (pos != string::npos);
22055 string trimed_string = input_string.substr(pos);
22059 if (handle->getNode()!=NULL)
22064#pragma message ("WARNING: covariant return type for get_node() not supported in MSVC.")
22065 printf (
"ERROR: covariant return type for get_node() not supported in MSVC. \n");
22088 ROSE_ASSERT(node != NULL);
22091 cout<<
"///////////// begin of SageInterface::dumpInfo() ///////////////"<<endl;
22092 cout<<
"--------------base info. for SgNode---------------"<<endl;
22098 cout<<
"--------------source location info. for SgNode---------------"<<endl;
22106 cout<<
"--------------preprocessing info. for SgNode---------------"<<endl;
22107 AttachedPreprocessingInfoType::iterator i;
22108 cout<<
"Total attached preprocessingInfo count="<<comments->size()<<endl;
22109 for (i = comments->begin (); i != comments->end (); i++)
22112 pinfo->display(
"");
22115 cout<<
"--------------name info. for SgNode---------------"<<endl;
22119 cout<<
"\tqualified name="<<decl->get_qualified_name().getString()<<endl;
22122 cout<<
"\treferenced variable name= "<<varRef->get_symbol()->
get_name().getString()<<endl;
22129 cout<<
"///////////// end of SageInterface::dumpInfo() ///////////////"<<endl;
22140 bool retVal =
true;
22142 ROSE_ASSERT(stmt !=NULL);
22144#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22151 if (funcDecl != NULL)
22154 if (funcDecl == NULL)
22156 cerr<<
"In collectReadWriteRefs(): cannot proceed without a function body!"<<endl;
22159 stmt = funcDecl->get_definition()->
get_body();
22167 ROSE_ASSERT(funcDef != NULL);
22169 ROSE_ASSERT(funcBody!= NULL);
22172 AstInterfaceImpl faImpl(funcBody);
22173 AstInterface fa(&faImpl);
22174 ArrayAnnotation* annot = ArrayAnnotation::get_inst();
22175 if( useCachedDefUse ){
22176 ArrayInterface* array_interface = ArrayInterface::get_inst(*annot, fa, funcDef, AstNodePtrImpl(funcDef));
22177 LoopTransformInterface::set_arrayInfo(array_interface);
22179 ArrayInterface array_interface(*annot);
22182 array_interface.observe(fa);
22183 LoopTransformInterface::set_arrayInfo(&array_interface);
22185 LoopTransformInterface::set_astInterface(fa);
22187 LoopTransformInterface::set_sideEffectInfo(annot);
22190 DoublyLinkedListWrap<AstNodePtr> rRef1, wRef1;
22191 CollectDoublyLinkedList<AstNodePtr> crRef1(rRef1),cwRef1(wRef1);
22192 AstNodePtr s1 = AstNodePtrImpl(stmt);
22195 if (!AnalyzeStmtRefs(fa, s1, cwRef1, crRef1))
22200 mlog[Sawyer::Message::Common::DEBUG] <<
"Function: " << funcDef->get_declaration()->get_qualified_name() <<
" calls at least one function that has not been annotated." << endl;
22205 for (DoublyLinkedEntryWrap<AstNodePtr>* p = rRef1.First(); p != 0; )
22207 DoublyLinkedEntryWrap<AstNodePtr>* p1 = p;
22209 AstNodePtr cur = p1->GetEntry();
22210 SgNode* sgRef = AstNodePtrImpl(cur).get_ptr();
22211 ROSE_ASSERT(sgRef != NULL);
22212 readRefs.push_back(sgRef);
22217 for (DoublyLinkedEntryWrap<AstNodePtr>* p = wRef1.First(); p != 0; )
22219 DoublyLinkedEntryWrap<AstNodePtr>* p1 = p;
22221 AstNodePtr cur = p1->GetEntry();
22222 SgNode* sgRef = AstNodePtrImpl(cur).get_ptr();
22223 ROSE_ASSERT(sgRef != NULL);
22224 writeRefs.push_back(sgRef);
22237static bool skipSomeRefs(
SgNode* n)
22240 return (isSgThisExp(n)||isSgArrowExp(n)||isSgDotExp(n));
22246 ROSE_ASSERT(stmt != NULL);
22247 vector <SgNode* > readRefs, writeRefs;
22251 vector<SgNode*>::iterator iter = readRefs.begin();
22252 for (; iter!=readRefs.end();iter++)
22254 SgNode* current = *iter;
22257 ROSE_ASSERT (current != NULL);
22260 if (!name)
continue;
22263 readVars.insert(name);
22266 vector<SgNode*>::iterator iterw = writeRefs.begin();
22267 for (; iterw!=writeRefs.end();iterw++)
22269 SgNode* current = *iterw;
22270 ROSE_ASSERT (current != NULL);
22272 if (!name)
continue;
22276 writeVars.insert(name);
22284 ROSE_ASSERT(stmt != NULL);
22285 set<SgInitializedName*> readVars, writeVars;
22290 set_difference(readVars.begin(), readVars.end(),
22291 writeVars.begin(), writeVars.end(),
22292 std::inserter(readOnlyVars, readOnlyVars.begin()));
22302 readOnlyVars.insert (v_ref->get_symbol()->get_declaration());
22312 set<SgInitializedName*> temp;
22315 for (set<SgInitializedName*>::const_iterator iter = temp.begin();
22316 iter!=temp.end(); iter++)
22318 SgSymbol* symbol = (*iter)->get_symbol_from_symbol_table () ;
22319 ROSE_ASSERT(symbol != NULL );
22320 ROSE_ASSERT(isSgVariableSymbol(symbol));
22321 readOnlySymbols.insert(isSgVariableSymbol(symbol));
22329 bool result =
false;
22330 ROSE_ASSERT(ref != NULL);
22342 ROSE_ASSERT(grandparent);
22343 if (isSgFunctionCallExp(grandparent))
22349 size_t param_index = 0;
22351 SgExpressionPtrList expList = isSgExprListExp(ref->
get_parent())->get_expressions();
22352 Rose_STL_Container<SgExpression*>::const_iterator iter= expList.begin();
22353 for (; iter!=expList.end(); iter++)
22361 SgExpression* func_exp = isSgFunctionCallExp(grandparent)->get_function();
22362 ROSE_ASSERT (func_exp);
22367 SgInitializedNamePtrList nameList = funcDecl->get_args();
22372 if (param_index >= nameList.size() ||isSgTypeEllipse(nameList[param_index]->get_type()) )
22374 if (isSgReferenceType(ref))
22378 if (isSgReferenceType(nameList[param_index]->get_type()))
22383 else if (isSgDotExp (func_exp) || isSgArrowExp(func_exp))
22386 ROSE_ASSERT (binOp);
22388 ROSE_ASSERT (mfuncRef);
22390 ROSE_ASSERT (mfuncDecl);
22391 SgInitializedNamePtrList nameList = mfuncDecl->get_args();
22393 if (isSgReferenceType(nameList[param_index]->get_type()))
22408 Rose_STL_Container <SgNode*> var_refs = NodeQuery::querySubTree (
const_cast<SgStatement *
> (s), V_SgVarRefExp);
22410 Rose_STL_Container<SgNode*>::iterator iter = var_refs.begin();
22411 for (; iter!=var_refs.end(); iter++)
22414 ROSE_ASSERT(ref != NULL);
22421 varSetB.insert(ref);
22427 ROSE_ASSERT(grandparent);
22428 if (isSgFunctionCallExp(grandparent))
22431 int param_index =0;
22432 SgExpressionPtrList expList = isSgExprListExp(ref->
get_parent())->get_expressions();
22433 Rose_STL_Container<SgExpression*>::const_iterator iter= expList.begin();
22434 for (; iter!=expList.end(); iter++)
22442 SgFunctionRefExp * funcRef = isSgFunctionRefExp(isSgFunctionCallExp(grandparent)->get_function());
22444 SgInitializedNamePtrList nameList = funcDecl->get_args();
22446 if (isSgReferenceType(nameList[param_index]->get_type()))
22448 varSetB.insert(ref);
22454 varSetB.insert(ref);
22458#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22463 static LivenessAnalysis* liv = NULL;
22467 static DFAnalysis * defuse = NULL;
22471 ROSE_ASSERT(project != NULL);
22472 defuse =
new DefUseAnalysis(project);
22475 ROSE_ASSERT(defuse != NULL);
22476 defuse->run(debug);
22479 defuse->dfaToDOT();
22482 liv =
new LivenessAnalysis(debug,(DefUseAnalysis*)defuse);
22483 ROSE_ASSERT(liv != NULL);
22485 std::vector <FilteredCFGNode < IsDFAFilter > > dfaFunctions;
22486 NodeQuerySynthesizedAttributeType vars =
22487 NodeQuery::querySubTree(project, V_SgFunctionDefinition);
22488 NodeQuerySynthesizedAttributeType::const_iterator i;
22489 bool abortme=
false;
22491 for (i= vars.begin(); i!=vars.end();++i)
22494 ROSE_ASSERT(func != NULL);
22498 string funcName = func->get_declaration()->get_qualified_name().str();
22499 cout<<
" .. running liveness analysis for function: " << funcName << endl;
22501 FilteredCFGNode <IsDFAFilter> rem_source = liv->run(func,abortme);
22503 liv->fixupStatementsINOUT(func);
22504 if (rem_source.getNode()!=NULL)
22505 dfaFunctions.push_back(rem_source);
22511 cout <<
"Writing out liveness analysis results into var.dot... " << endl;
22512 std::ofstream f2(
"var.dot");
22513 dfaToDot(f2,
string(
"var"), dfaFunctions, (DefUseAnalysis*)defuse, liv);
22517 cerr<<
"Error: Liveness analysis is ABORTING ." << endl;
22525#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22529 ROSE_ASSERT(liv != NULL);
22530 ROSE_ASSERT(loop != NULL);
22532 std::vector<SgInitializedName*> liveIns0, liveOuts0;
22542 CFGNode cfgnode(forstmt,2);
22543 FilteredCFGNode<IsDFAFilter> filternode= FilteredCFGNode<IsDFAFilter> (cfgnode);
22547 ROSE_ASSERT(filternode.getNode()==forstmt);
22550 vector<FilteredCFGEdge < IsDFAFilter > > out_edges = filternode.outEdges();
22551 ROSE_ASSERT(out_edges.size()==2);
22552 vector<FilteredCFGEdge < IsDFAFilter > >::iterator iter= out_edges.begin();
22554 for (; iter!=out_edges.end();iter++)
22556 FilteredCFGEdge < IsDFAFilter > edge= *iter;
22560 if (edge.condition()==eckTrue)
22562 SgNode* firstnode= edge.target().getNode();
22563 liveIns0 = liv->getIn(firstnode);
22565 for (std::vector<SgInitializedName*>::iterator iter = liveIns0.begin();
22566 iter!=liveIns0.end(); iter++)
22569 liveIns.insert(*iter);
22574 else if (edge.condition()==eckFalse)
22576 SgNode* firstnode= edge.target().getNode();
22577 liveOuts0 = liv->getIn(firstnode);
22579 for (std::vector<SgInitializedName*>::iterator iter = liveOuts0.begin();
22580 iter!=liveOuts0.end(); iter++)
22584 liveOuts.insert(*iter);
22589 cerr<<
"Unexpected CFG out edge type for SgForStmt!"<<endl;
22598static bool isAssignReduction (
SgVarRefExp* ref_exp1,
SgVarRefExp* ref_exp2, OmpSupport::omp_construct_enum& optype)
22600 bool isReduction =
false;
22602 ROSE_ASSERT (ref_exp1!= NULL);
22603 ROSE_ASSERT (ref_exp2!= NULL);
22604 ROSE_ASSERT (ref_exp1-> get_symbol() == ref_exp2-> get_symbol());
22610 if (stmt != stmt2)
return false;
22617 if (exp_stmt && isSgAssignOp(exp_stmt->get_expression()))
22620 assign_lhs = isSgAssignOp(exp_stmt->get_expression())->
get_lhs_operand();
22621 assign_rhs = isSgAssignOp(exp_stmt->get_expression())->
get_rhs_operand();
22622 ROSE_ASSERT(assign_lhs && assign_rhs);
22630 SgBinaryOp * binop = isSgBinaryOp(assign_rhs);
22636 if( !((op_lhs==ref_exp1)||(op_lhs==ref_exp2))
22637 && !((op_rhs==ref_exp1)||(op_rhs==ref_exp2)))
22640 bool isOnLeft =
false;
22641 if ((op_lhs==ref_exp1)||
22642 (op_lhs==ref_exp2))
22648 optype = OmpSupport::e_reduction_plus;
22649 isReduction =
true;
22652 case V_SgMultiplyOp:
22654 optype = OmpSupport::e_reduction_mul;
22655 isReduction =
true;
22658 case V_SgSubtractOp:
22660 optype = OmpSupport::e_reduction_minus;
22663 isReduction =
true;
22669 optype = OmpSupport::e_reduction_bitand ;
22670 isReduction =
true;
22675 optype = OmpSupport::e_reduction_bitxor;
22676 isReduction =
true;
22681 optype = OmpSupport::e_reduction_bitor;
22682 isReduction =
true;
22687 optype = OmpSupport::e_reduction_logand;
22688 isReduction =
true;
22693 optype = OmpSupport::e_reduction_logor;
22694 isReduction =
true;
22703 return isReduction;
22712 bool matchStmt1 =
false;
22713 bool matchStmt2 =
false;
22720 ROSE_ASSERT (ref1 != NULL);
22721 ROSE_ASSERT (ref2 != NULL);
22722 ROSE_ASSERT (ref1-> get_symbol() == ref2-> get_symbol());
22730 if (stmt1 == stmt2)
return false;
22753 bool matchBody =
false;
22754 bool matchCondition=
false;
22755 if (
SgIfStmt * if_stmt = isSgIfStmt (if_cond_stmt->get_parent()) )
22757 if (
SgStatement* body = if_stmt->get_true_body())
22762 ROSE_ASSERT(stmt2 != NULL);
22763 if ( ((block->get_statements()).size() == 1) && stmt2->
get_scope() == block )
22774 if (
SgExprStatement* cond_exp_stmt = isSgExprStatement (if_stmt->get_conditional()) )
22776 SgExpression* cond_exp = cond_exp_stmt->get_expression();
22777 if (
SgBinaryOp * binop = isSgBinaryOp (cond_exp))
22782 if (isSgLessThanOp (binop))
22784 optype = OmpSupport::e_reduction_max;
22785 matchCondition=
true;
22787 else if (isSgGreaterThanOp(binop))
22789 optype = OmpSupport::e_reduction_min;
22790 matchCondition=
true;
22796 if (isSgLessThanOp (binop))
22798 optype = OmpSupport::e_reduction_min;
22799 matchCondition=
true;
22801 else if (isSgGreaterThanOp(binop))
22803 optype = OmpSupport::e_reduction_max;
22804 matchCondition=
true;
22811 matchStmt1 = matchBody && matchCondition;
22815 return (matchStmt2 && matchStmt1);
22822static bool isSingleAppearanceReduction(
SgVarRefExp* ref1, OmpSupport::omp_construct_enum& optype )
22824 bool isReduction =
false;
22826 ROSE_ASSERT (ref1 != NULL);
22832 if (isSgExprStatement(stmt))
22834 SgExpression* exp = isSgExprStatement(stmt)->get_expression();
22836 if (isSgPlusPlusOp(exp))
22839 optype = OmpSupport::e_reduction_plus;
22840 isReduction =
true;
22842 else if (isSgMinusMinusOp(exp))
22844 optype = OmpSupport::e_reduction_minus;
22845 isReduction =
true;
22856 case V_SgPlusAssignOp:
22858 optype = OmpSupport::e_reduction_plus;
22859 isReduction =
true;
22862 case V_SgMultAssignOp:
22864 optype = OmpSupport::e_reduction_mul;
22865 isReduction =
true;
22868 case V_SgMinusAssignOp:
22870 optype = OmpSupport::e_reduction_minus;
22871 isReduction =
true;
22874 case V_SgAndAssignOp:
22876 optype = OmpSupport::e_reduction_bitand;
22877 isReduction =
true;
22880 case V_SgXorAssignOp:
22882 optype = OmpSupport::e_reduction_bitxor;
22883 isReduction =
true;
22886 case V_SgIorAssignOp:
22888 optype = OmpSupport::e_reduction_bitor;
22889 isReduction =
true;
22898 return isReduction;
22930 std::set<SgInitializedName*> candidateVars;
22932 std::map <SgInitializedName*, vector<SgVarRefExp* > > var_references;
22934 Rose_STL_Container<SgNode*> reflist = NodeQuery::querySubTree(loop, V_SgVarRefExp);
22936 ROSE_ASSERT(lbody != NULL);
22937 Rose_STL_Container<SgNode*>::iterator iter = reflist.begin();
22938 for (; iter!=reflist.end(); iter++)
22947 ROSE_ASSERT(var_scope != NULL);
22948 if ((
isScalarType(initname->get_type())) &&(initname !=loopindex)
22951 candidateVars.insert(initname);
22952 var_references[initname].push_back(ref_exp);
22957 std::set<SgInitializedName*>::iterator niter=candidateVars.begin();
22958 for (; niter!=candidateVars.end(); niter++)
22961 bool isReduction =
false;
22962 OmpSupport::omp_construct_enum optype;
22964 if (var_references[initname].size()==1)
22966 mlog[Sawyer::Message::Common::DEBUG] <<
"Debug: SageInterface::ReductionRecognition() A candidate used once:"<<initname->get_name().getString()<<endl;
22967 SgVarRefExp* ref_exp = *(var_references[initname].begin());
22968 if (isSingleAppearanceReduction (ref_exp, optype))
22969 isReduction =
true;
22972 else if (var_references[initname].size()==2)
22974 mlog[Sawyer::Message::Common::DEBUG] <<
"Debug: A candidate used twice:"<<initname->get_name().getString()<<endl;
22975 SgVarRefExp* ref_exp1 = *(var_references[initname].begin());
22976 SgVarRefExp* ref_exp2 = *(++var_references[initname].begin());
22979 if (isAssignReduction (ref_exp1, ref_exp2, optype) || isIfReduction (ref_exp1, ref_exp2, optype) )
22981 isReduction =
true;
22987 results.insert(make_pair(initname,optype));
22994 ROSE_ASSERT(r!=NULL);
22995#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
22996 ConstantFolding::constantFoldingOptimization(r,
false);
23006 virtual void visit (
SgNode * n)
23013 ROSE_ASSERT (name_attribute != NULL);
23021 exampleTraversal.
traverse(project, preorder);
23053 const SgInitializedNamePtrList& orig_decls = params.
get_args();
23055 std::transform( orig_decls.begin(), orig_decls.end(), sg::sage_inserter(copy), sg::InitNameCloner(copy, fundef) );
23069 sg::swap_child(ll, rr, &SgFunctionDeclaration::get_definition, &SgFunctionDeclaration::set_definition);
23070 sg::swap_child(ll, rr, &SgFunctionDeclaration::get_parameterList, &SgFunctionDeclaration::set_parameterList);
23080 std::pair<SgStatement*, SgInitializedName*>
23094 SgType* result_type = definingDeclaration.get_type()->get_return_type();
23099 SgFunctionDeclaration* wrapperfn = SB::buildDefiningFunctionDeclaration(newName, result_type, ¶m_list, containing_scope);
23102 ROSE_ASSERT(wrapperdef);
23105 wrapperfn->set_exceptionSpecification(definingDeclaration.get_exceptionSpecification());
23109 swapDefiningElements(definingDeclaration, *wrapperfn);
23114 SgInitializedNamePtrList& param_decls = param_list.
get_args();
23116 std::transform( param_decls.begin(), param_decls.end(), sg::sage_inserter(*args), sg::VarRefBuilder(*wrapperdef) );
23118 SgFunctionCallExp* callWrapped = SB::buildFunctionCallExp( newName, result_type, args, body );
23123 if (!isSgTypeVoid(result_type))
23126 SgVariableDeclaration* res = SB::buildVariableDeclaration(
"res", result_type, SB::buildAssignInitializer(callWrapped), body );
23133 callStatement = res;
23140 callStatement = SB::buildExprStatement(callWrapped);
23144 ROSE_ASSERT(callStatement);
23148 SgFunctionDeclaration* wrapperfn_proto = SB::buildNondefiningFunctionDeclaration(wrapperfn, containing_scope, decorator_proto);
23154 return std::make_pair(callStatement, resultName);
23162 struct VarrefBuilder
23181 template <
class AstNode>
23182 struct VarrefCreator : VarrefBuilder
23187 VarrefCreator(AstNode& orig)
23191 SgVarRefExp*
get()
const {
return VarrefBuilder::build(origin); }
23194 template <
class AstNode>
23195 VarrefCreator<AstNode>
23196 varrefCreator(AstNode& n)
23198 return VarrefCreator<AstNode>(n);
23208 return SB::buildMultiplyOp(lhs, SI::deepCopy(rhs));
23211 std::pair<std::vector<SgExpression*>,
SgType*>
23212 get_C_array_dimensions_aux(
const SgArrayType& arr_type)
23218 std::vector<SgExpression*> indices;
23219 SgType* undertype = NULL;
23223 if (arrtype->get_index() == NULL)
23225 indices.push_back(SB::buildNullExpression());
23226 undertype = arrtype->get_base_type();
23227 arrtype = isSgArrayType(undertype);
23233 ROSE_ASSERT(indexexpr);
23235 indices.push_back(SI::deepCopy(indexexpr));
23236 undertype = arrtype->get_base_type();
23237 arrtype = isSgArrayType(undertype);
23240 ROSE_ASSERT((!indices.empty()) && undertype);
23241 return std::make_pair(indices, undertype);
23245 std::vector<SgExpression*>
23246 get_C_array_dimensions_aux(
const SgArrayType& arrtype,
const VarrefBuilder& varrefBuilder)
23250 std::pair<std::vector<SgExpression*>,
SgType*> res = get_C_array_dimensions_aux(arrtype);
23251 const std::vector<SgExpression*>::iterator first = res.first.begin();
23254 if (isSgNullExpression(*first))
23262 const std::vector<SgExpression*>::iterator aa = first+1;
23263 const std::vector<SgExpression*>::iterator zz = res.first.end();
23265 SgExpression* sz_undertype = SB::buildSizeOfOp(res.second);
23266 SgExpression* denominator = std::accumulate(aa, zz, sz_undertype, create_mulop);
23267 SgSizeOfOp* sz_var = SB::buildSizeOfOp(varrefBuilder.get());
23268 SgExpression* sz = SB::buildDivideOp(sz_var, denominator);
23270 std::swap(*first, sz);
23278 std::vector<SgExpression*>
23281 return get_C_array_dimensions_aux(arrtype).first;
23284 std::vector<SgExpression*>
23287 return get_C_array_dimensions_aux(arrtype, varrefCreator(varref));
23290 std::vector<SgExpression*>
23293 return get_C_array_dimensions_aux(arrtype, varrefCreator(initname));
23300 set<unsigned int> sourceSequenceSet;
23302 void visit (
SgNode* astNode );
23310 if (fileInfo != NULL)
23312 unsigned int source_sequence_number = fileInfo->get_source_sequence_number();
23314 printf (
"In CollectSourceSequenceNumbers::visit(): source_sequence_number = %" PRIuPTR
" \n",source_sequence_number);
23316 sourceSequenceSet.insert(source_sequence_number);
23326 traversal.
traverse(astNode,preorder);
23328 return traversal.sourceSequenceSet;
23415#ifndef ROSE_USE_INTERNAL_FRONTEND_DEVELOPMENT
23417 if (collapsing_factor <= 1)
23430 ROSE_ASSERT (global_scope != NULL);
23439 bool *isPlus =
new bool[collapsing_factor];
23443 std::vector<SgForStatement* > loops= SageInterface::querySubTree<SgForStatement>(target_loop,V_SgForStatement);
23444 ROSE_ASSERT(loops.size()>=collapsing_factor);
23460 ROSE_ASSERT(
getScope(target_loop)->get_parent()!= NULL);
23464 while(scope == NULL)
23466 parent = isSgStatement(parent->
get_parent());
23467 scope = isSgScopeStatement(parent);
23471 if (insert_target != NULL)
23476 ROSE_ASSERT(scope != NULL);
23479 for(
size_t i = 0; i < collapsing_factor; i ++)
23481 temp_target_loop = loops[i];
23486 if (!
isCanonicalForLoop(temp_target_loop, &ivar[i], &lb[i], &ub[i], &step[i], &orig_body[i], &isPlus[i]))
23488 cerr<<
"Error in SageInterface::loopCollapsing(): target loop is not canonical."<<endl;
23496 delete[] orig_body;
23497 delete[] total_iters;
23504 ROSE_ASSERT(ivar[i]&& lb[i] && ub[i] && step[i]);
23508 if(isPlus[i] ==
true)
23522 string iter_var_name=
"_total_iters";
23543 new_var_list->append_expression(isSgVarRefExp(ub_exp));
23546 for(
unsigned int i = 0; i < collapsing_factor; i++)
23549 for(
unsigned int j = collapsing_factor - 1; j > i; j--)
23558 new_var_list->append_expression(isSgVarRefExp(interval[i]));
23568 ROSE_ASSERT(insert_target != NULL);
23573 new_var_list->append_expression(clps_index_ref);
23579 ROSE_ASSERT(body != NULL);
23582 std::vector<SgStatement*> new_stmt_list;
23593 for(
unsigned int i = 0; i < collapsing_factor - 1; i ++)
23595 if(isPlus[i] ==
true)
23601 new_stmt_list.push_back(assign_stmt);
23604 if(i != collapsing_factor - 2){
23605 string remain_var_name=
"_remainder";
23606 remain_var_name =
"__"+ ivar[i]->get_name().getString() + remain_var_name;
23609 new_stmt_list.push_back(loop_index_decl);
23615 if(isPlus[collapsing_factor - 1] ==
true)
23619 new_stmt_list.push_back(assign_stmt);
23631 ROSE_ASSERT(cond_stmt != NULL);
23638 target_loop = new_loop;
23640 ConstantFolding::constantFoldingOptimization(scope->
get_parent(),
false);
23646 delete [] orig_body;
23647 delete [] total_iters;
23648 delete [] interval;
23653 return new_var_list;
23672 RoseAst ast_of_original(tree2);
23681 while (i_copy != ast_of_copy.
end())
23684 printf (
"*i_copy = %p = %s \n",*i_copy,(*i_copy)->class_name().c_str());
23685 printf (
"*i_original = %p = %s \n",*i_original,(*i_original)->class_name().c_str());
23689 if ((*i_copy)->variantT() != (*i_original)->variantT())
23692 printf (
"ERROR: return from SageInterface::isStructurallyEquivalentAST(): (*i_copy)->variantT() != (*i_original)->variantT() \n");
23695 printf (
"Making this an error! \n");
23705 ROSE_ASSERT(i_original != ast_of_original.
end());
23710 ROSE_ASSERT(i_copy == ast_of_copy.
end() && i_original == ast_of_original.
end());
23730 lower_bound = NULL;
23731 upper_bound = NULL;
23735 const std::vector<SgStatement *> & init_stmts = for_init_stmt->
get_init_stmt();
23736 assert(init_stmts.size() == 1);
23738 assert(init_stmt != NULL);
23741 SgAssignOp * assign_init = isSgAssignOp(init);
23742 assert(assign_init != NULL);
23744 assert(iterator_init_ref != NULL);
23745 iterator = iterator_init_ref->get_symbol();
23746 assert(iterator != NULL);
23749 SgExprStatement * test_stmt = isSgExprStatement(for_loop->get_test());
23750 assert(test_stmt != NULL);
23756 while (isSgCastExp(lhs_exp)) lhs_exp = ((
SgCastExp *)lhs_exp)->get_operand_i();
23757 SgVarRefExp * lhs_var_ref = isSgVarRefExp(lhs_exp);
23758 bool lhs_it = (lhs_var_ref != NULL) && (lhs_var_ref->get_symbol() == iterator);
23761 while (isSgCastExp(rhs_exp)) rhs_exp = ((
SgCastExp *)rhs_exp)->get_operand_i();
23762 SgVarRefExp * rhs_var_ref = isSgVarRefExp(rhs_exp);
23764 bool rhs_it = (rhs_var_ref != NULL) && (rhs_var_ref->get_symbol() == iterator);
23772 assert(lhs_it != rhs_it);
23781 case V_SgGreaterOrEqualOp:
23782 inclusive = lhs_it;
23785 case V_SgGreaterThanOp:
23786 inclusive = !lhs_it;
23789 case V_SgLessOrEqualOp:
23790 inclusive = lhs_it;
23791 reversed = !lhs_it;
23793 case V_SgLessThanOp:
23794 inclusive = !lhs_it;
23795 reversed = !lhs_it;
23797 case V_SgEqualityOp:
23798 case V_SgNotEqualOp:
23804 switch (increment->variantT()) {
23805 case V_SgPlusPlusOp:
23809 case V_SgMinusMinusOp:
23813 case V_SgPlusAssignOp:
23818 assert(var_ref_lhs != NULL && var_ref_lhs->get_symbol() == iterator);
23823 case V_SgMinusAssignOp:
23828 assert(var_ref_lhs != NULL && var_ref_lhs->get_symbol() == iterator);
23838 assert(inc_assign_lhs != NULL && inc_assign_lhs->get_symbol() == iterator);
23841 assert(inc_assign_rhs != NULL);
23843 if (inc_assign_rhs_lhs != NULL && inc_assign_rhs_lhs->get_symbol() == iterator)
23846 if (inc_assign_rhs_rhs != NULL && inc_assign_rhs_rhs->get_symbol() == iterator)
23867#ifdef ROSE_BUILD_JAVA_LANGUAGE_SUPPORT
23874 jstring temp_directory = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(::currentJavaTraversalClass, Rose::Frontend::Java::Ecj::getTempDirectoryMethod);
23876 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_directory, NULL);
23878 string directory_name = utf8;
23879 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_directory, utf8);
23881 list<string> sourcepath = project -> get_Java_sourcepath();
23882 sourcepath.push_back(directory_name);
23883 project -> set_Java_sourcepath(sourcepath);
23885 return directory_name;
23893 string command = string(
"rm -fr ") + directory_name;
23894 int status = system(command.c_str());
23895 ROSE_ASSERT(status == 0);
23906 project -> get_sourceFileNameList().push_back(filename);
23907 Rose_STL_Container<std::string> arg_list = project -> get_originalCommandLineArgumentList();
23908 arg_list.push_back(filename);
23911 int error_code = 0;
23912 SgFile *file = determineFileType(arg_list, error_code, project);
23914 ROSE_ASSERT(sourcefile);
23915 sourcefile -> set_parent(project);
23920 project -> get_fileList_ptr() -> get_listOfFiles().push_back(sourcefile);
23921 ROSE_ASSERT(sourcefile == isSgSourceFile((*project)[filename]));
23923 sourcefile -> build_Java_AST(arg_list, project -> get_originalCommandLineArgumentList());
23926 project -> get_fileList_ptr() -> get_listOfFiles().pop_back();
23927 ROSE_ASSERT(sourcefile != isSgSourceFile((*project)[filename]));
23931 ROSE_ASSERT(file->get_preprocessorDirectivesAndCommentsList() != NULL);
23942 string command =
"package " + package_name +
";";
23947 jstring temp_file = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
23948 Rose::Frontend::Java::Ecj::createTempFileMethod,
23949 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(command.c_str()));
23951 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_file, NULL);
23953 string filename = (string) utf8;
23954 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_file, utf8);
23958 return package_name;
23967 string command =
"import " + import_string +
";";
23972 jstring temp_file = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
23973 Rose::Frontend::Java::Ecj::createTempFileMethod,
23974 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(command.c_str()));
23976 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_file, NULL);
23978 string filename = (string) utf8;
23979 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_file, utf8);
23983 return import_string;
23995 jstring temp_file = (jstring) Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
23996 Rose::Frontend::Java::Ecj::createTempNamedFileMethod,
23997 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(file_name.c_str()),
23998 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(file_content.c_str()));
24000 const char *utf8 = Rose::Frontend::Java::Ecj::currentEnvironment -> GetStringUTFChars(temp_file, NULL);
24002 string filename = (string) utf8;
24003 Rose::Frontend::Java::Ecj::currentEnvironment -> ReleaseStringUTFChars(temp_file, utf8);
24013 ROSE_ASSERT(scope);
24015 for (
int index = 0, length = package_name.size(); index < length; index++) {
24017 for (n = index; n < length; n++) {
24018 if (package_name[n] ==
'.') {
24022 string name = package_name.substr(index, n - index);
24024 SgClassSymbol *package_symbol = scope -> lookup_class_symbol(name);
24025 if (package_symbol == NULL) {
24029 SgJavaPackageDeclaration *package_declaration = isSgJavaPackageDeclaration(package_symbol -> get_declaration() -> get_definingDeclaration());
24030 ROSE_ASSERT(package_declaration);
24031 package_definition = package_declaration -> get_definition();
24032 ROSE_ASSERT(package_definition);
24033 scope = package_definition;
24038 return package_definition;
24046 SgGlobal *global_scope = project -> get_globalScopeAcrossFiles();
24048 if (package_definition == NULL) {
24054 if (create_directory) {
24055 Rose::Frontend::Java::Ecj::currentEnvironment -> CallObjectMethod(Rose::Frontend::Java::Ecj::currentJavaTraversalClass,
24056 Rose::Frontend::Java::Ecj::createTempNamedDirectoryMethod,
24057 Rose::Frontend::Java::Ecj::currentEnvironment -> NewStringUTF(package_name.c_str()));
24063 return package_definition;
24070 ROSE_ASSERT(package_definition);
24071 SgClassSymbol *class_symbol = package_definition -> lookup_class_symbol(class_name);
24074 : isSgClassDeclaration(class_symbol -> get_declaration() -> get_definingDeclaration()));
24075 if ((! class_declaration) || (! class_declaration -> attributeExists(
"complete"))) {
24076 string qualified_name = package_definition -> get_qualified_name().getString() +
"." + class_name;
24078 class_symbol = package_definition -> lookup_class_symbol(class_name);
24081 class_declaration = (class_symbol == NULL
24083 : isSgClassDeclaration(class_symbol -> get_declaration() -> get_definingDeclaration()));
24085 return class_declaration;
24101 SgClassDeclaration *class_declaration = isSgClassDeclaration(class_type -> get_declaration() -> get_definingDeclaration());
24102 ROSE_ASSERT(class_declaration);
24103 SgClassDefinition *scope = isSgClassDefinition(class_declaration -> get_scope());
24104 while (scope && (! isSgJavaPackageDeclaration(scope -> get_parent()))) {
24105 class_declaration = isSgClassDeclaration(scope -> get_parent());
24106 ROSE_ASSERT(class_declaration);
24107 scope = isSgClassDefinition(class_declaration -> get_scope());
24114 string class_name = class_declaration ->
get_name().getString();
24123 ROSE_ASSERT(class_definition);
24125 ROSE_ASSERT(type_list);
24127 ROSE_ASSERT(string_array_type);
24128 type_list -> append_argument(string_array_type);
24134 SgFunctionSymbol *method_symbol = class_definition -> lookup_function_symbol(
"main", member_function_type);
24136 return (method_symbol == NULL ? NULL : isSgMemberFunctionDeclaration(method_symbol -> get_declaration()));
24144 SgClassDeclaration *class_declaration = isSgClassDeclaration(class_type -> get_declaration() -> get_definingDeclaration());
24145 ROSE_ASSERT(class_declaration);
24158 ROSE_ASSERT (old_sym != NULL);
24159 ROSE_ASSERT (new_sym != NULL);
24160 ROSE_ASSERT (old_sym != new_sym);
24161 ROSE_ASSERT (scope != NULL);
24163 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(scope, V_SgVarRefExp);
24164 for (Rose_STL_Container<SgNode *>::iterator i = nodeList.begin(); i != nodeList.end(); i++)
24167 if (vRef->get_symbol() == old_sym)
24168 vRef->set_symbol(new_sym);
24181 bool result =
true;
24183 bool includingSelf =
false;
24186 if (sourceFile == NULL)
24188 printf (
"In SageInterface::statementCanBeTransformed(): sourceFile not found \n");
24192 ROSE_ASSERT(sourceFile != NULL);
24194 if (sourceFile != NULL && sourceFile->get_unparse_tokens() ==
true && sourceFile->get_unparseHeaderFiles() ==
true)
24198 string source_filename = stmt->getFilenameString();
24200 printf (
"In SageInterface::statementCanBeTransformed(): source_filename = %s \n",source_filename.c_str());
24201 printf (
" --- Rose::includeFileMapForUnparsing.size() = %zu \n",Rose::includeFileMapForUnparsing.size());
24205 if (EDG_ROSE_Translation::edg_include_file_map.find(source_filename) != EDG_ROSE_Translation::edg_include_file_map.end())
24207 SgIncludeFile* include_file = EDG_ROSE_Translation::edg_include_file_map[source_filename];
24208 ROSE_ASSERT(include_file != NULL);
24210 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");
24212 if (include_file->get_can_be_supported_using_token_based_unparsing() ==
false)
24215 printf (
"NOTE: Transformations of this statement cannot be supported using the header file unparsing with token unparsing options! \n");
24225 printf (
"Not found in Rose::includeFileMapForUnparsing: source_filename = %s \n",source_filename.c_str());
24228 printf (
"Exiting as a test! \n");
24234 printf (
"Error: In statementCanBeTransformed(): this might be an issue! \n");
24247 ROSE_ASSERT (decl!= NULL);
24248 ROSE_ASSERT (target_scope != NULL);
24249 ROSE_ASSERT (target_scope != decl->
get_scope());
24256 if (isSgIfStmt (target_scope))
24259 if (target_scope == )
24269 case V_SgBasicBlock:
24281 case V_SgForStatement:
24285 ROSE_ASSERT(stmt != NULL);
24286 SgStatementPtrList& stmt_list = stmt->get_init_stmt();
24290 if (stmt_list.size() !=1)
24292 cerr<<
"Error in moveVariableDeclaration(): only single init statement is handled for SgForStatement now."<<endl;
24293 ROSE_ASSERT (stmt_list.size() ==1);
24296 ROSE_ASSERT (exp_stmt != NULL);
24297 SgAssignOp* assign_op = isSgAssignOp(exp_stmt->get_expression());
24298 ROSE_ASSERT (assign_op != NULL);
24308 if (init_name->get_initptr() != NULL)
24310 init_name->set_initptr(initor);
24313 stmt_list.insert (stmt_list.begin(), decl );
24319 cerr<<
"Error. Unhandled target scope type:"<<target_scope->
class_name()<<endl;
24320 ROSE_ASSERT (
false);
24326 ROSE_ASSERT(sym != NULL);
24328 if (orig_scope != target_scope)
24333 init_name->set_scope(target_scope);
24335 orig_scope->remove_symbol(sym);
24340 ROSE_ASSERT (target_scope->symbol_exists(sym));
24350 subtreeVal.hasValue_ =
true;
24352 if (isSgIntVal(valExp)) {
24353 subtreeVal.value_ = isSgIntVal(valExp)->get_value();
24354 }
else if (isSgLongIntVal(valExp)) {
24355 subtreeVal.value_ = isSgLongIntVal(valExp)->get_value();
24356 }
else if (isSgLongLongIntVal(valExp)) {
24357 subtreeVal.value_ = isSgLongLongIntVal(valExp)->get_value();
24358 }
else if (isSgShortVal(valExp)) {
24359 subtreeVal.value_ = isSgShortVal(valExp)->get_value();
24360 }
else if (isSgUnsignedIntVal(valExp)) {
24361 subtreeVal.value_ = isSgUnsignedIntVal(valExp)->get_value();
24362 }
else if (isSgUnsignedLongVal(valExp)) {
24363 subtreeVal.value_ = isSgUnsignedLongVal(valExp)->get_value();
24364 }
else if (isSgUnsignedLongLongIntVal(valExp)) {
24365 subtreeVal.value_ = isSgUnsignedLongLongIntVal(valExp)->get_value();
24366 }
else if (isSgUnsignedShortVal(valExp)) {
24367 subtreeVal.value_ = isSgUnsignedShortVal(valExp)->get_value();
24373 if (isSgModifierType(vRef->get_type()) == NULL) {
24376 val.hasValue_ =
false;
24379 if (isSgModifierType(vRef->get_type())->
get_typeModifier().get_constVolatileModifier().isConst()) {
24385 if (isSgAssignInitializer(ini)) {
24390 return variableEval.
traverse(rhs);
24394 val.hasValue_ =
false;
24400 if (isSgExpression(node) != NULL) {
24402 if (valueExp != NULL) {
24403 return this->getValueExpressionValue(valueExp);
24407 if (varRefExp != NULL) {
24409 return evaluateVariableReference(varRefExp);
24412 if (isSgAssignInitializer(node)) {
24413 if(synList.at(0).hasValue_){
24414 return synList.at(0);
24418 val.hasValue_ =
false;
24423 evaluatedValue.hasValue_ =
false;
24424 evaluatedValue.value_ = -1;
24426 if(synList.size() != 2){
24427 for(SynthesizedAttributesList::iterator it = synList.begin(); it != synList.end(); ++it){
24428 std::cout <<
"Node: " << node->unparseToString() <<
"\n" << (*it).value_ << std::endl;
24429 std::cout <<
"Parent: " << node->get_parent()->unparseToString() << std::endl;
24430 std::cout <<
"Parent, Parent: " << node->get_parent()->get_parent()->unparseToString() << std::endl;
24434 for (SynthesizedAttributesList::iterator it = synList.begin(); it != synList.end(); ++it) {
24435 if((*it).hasValue_){
24436 if (isSgAddOp(node)) {
24437 assert(synList.size() == 2);
24438 evaluatedValue.value_ = synList[0].value_ + synList[1].value_ ;
24439 evaluatedValue.hasValue_ =
true;
24440 }
else if (isSgSubtractOp(node)) {
24441 assert(synList.size() == 2);
24442 evaluatedValue.value_ = synList[0].value_ - synList[1].value_ ;
24443 evaluatedValue.hasValue_ =
true;
24444 }
else if (isSgMultiplyOp(node)) {
24445 assert(synList.size() == 2);
24446 evaluatedValue.value_ = synList[0].value_ * synList[1].value_ ;
24447 evaluatedValue.hasValue_ =
true;
24448 }
else if (isSgDivideOp(node)) {
24449 assert(synList.size() == 2);
24450 evaluatedValue.value_ = synList[0].value_ / synList[1].value_ ;
24451 evaluatedValue.hasValue_ =
true;
24452 }
else if (isSgModOp(node)) {
24453 assert(synList.size() == 2);
24454 evaluatedValue.value_ = synList[0].value_ % synList[1].value_ ;
24455 evaluatedValue.hasValue_ =
true;
24458 std::cerr <<
"Expression is not evaluatable" << std::endl;
24459 evaluatedValue.hasValue_ =
false;
24460 evaluatedValue.value_ = -1;
24461 return evaluatedValue;
24464 evaluatedValue.hasValue_ =
true;
24465 return evaluatedValue;
24468 evaluatedValue.hasValue_ =
false;
24469 evaluatedValue.value_ = -1;
24470 return evaluatedValue;
24483 class TypeEquivalenceChecker {
24485 TypeEquivalenceChecker(
bool profile,
bool useSemanticEquivalence)
24486 : profile_(profile), useSemanticEquivalence_(useSemanticEquivalence),
24487 namedType_(0), pointerType_(0), arrayType_(0), functionType_(0)
24493 if (isSgTypedefType(t)) {
24495 node = isSgTypedefType(t)->
stripType(SgType::STRIP_TYPEDEF_TYPE);
24497 if(useSemanticEquivalence_){
24498 if(isSgModifierType(t)){
24500 ROSE_ASSERT(modType != NULL);
24507 std::cout <<
"Hit volatile type, stripping of modifier type" << std::endl;
24508 node = modType->get_base_type();
24512 std::cout <<
"Hit restrict type, stripping of modifier type" << std::endl;
24513 node = modType->get_base_type();
24517 ROSE_ASSERT(node != NULL);
24522 bool equal =
false;
24523 if(t1 == NULL || t2 == NULL){
24524 std::string wasNull;
24530 std::cerr <<
"ERROR: " << wasNull <<
" was NULL" << std::endl;
24543 i != subT1.
end() && j != subT2.
end(); ++i, ++j) {
24548 nodeT1 = getBasetypeIfApplicable(nodeT1);
24549 nodeT2 = getBasetypeIfApplicable(nodeT2);
24553 if(isSgModifierType(nodeT1)){
24557 if(modT1.get_constVolatileModifier().isConst() != modT2.get_constVolatileModifier().isConst()){
24560 if(modT1.get_constVolatileModifier().isVolatile() != modT2.get_constVolatileModifier().isVolatile()){
24563 }
else if (isSgNamedType(nodeT1)) {
24567 i.skipChildrenOnForward();
24568 j.skipChildrenOnForward();
24574 if(!c1->get_autonomous_declaration()){
24577 if (!c2->get_autonomous_declaration()){
24586 }
else if (isSgPointerType(nodeT1)) {
24593 return typesAreEqual(t1->get_base_type(), t2->get_base_type());
24595 }
else if(isSgReferenceType(nodeT1)){
24599 return typesAreEqual(t1->get_base_type(), t2->get_base_type());
24600 }
else if (isSgArrayType(nodeT1)) {
24607 bool arrayBaseIsEqual = typesAreEqual(a1->get_base_type(), a2->get_base_type());
24611 bool arrayIndexExpressionIsEquivalent =
false;
24612 if(t1Index.hasValue_ && t2Index.hasValue_){
24613 if(t1Index.value_ == t2Index.value_){
24614 arrayIndexExpressionIsEquivalent =
true;
24617 bool arraysAreEqual = (arrayBaseIsEqual && arrayIndexExpressionIsEquivalent);
24618 return arraysAreEqual;
24619 }
else if (isSgFunctionType(nodeT1)) {
24627 if(typesAreEqual(funcTypeA->get_return_type(), funcTypeB->get_return_type())) {
24637 for(SgTypePtrList::const_iterator ii = funcTypeA->
get_arguments().begin(),
24644 if(!typesAreEqual((*ii), (*jj))) {
24664 std::cerr <<
"This feature for now is available with autotools only!" << std::endl;
24669int getNamedTypeCount() {
24673int getPointerTypeCount() {
24674 return pointerType_;
24677int getArrayTypeCount() {
24681int getFunctionTypeCount() {
24682 return functionType_;
24686 bool profile_, useSemanticEquivalence_;
24687 int namedType_, pointerType_, arrayType_, functionType_;
24690TypeEquivalenceChecker tec(
false,
false);
24691return tec.typesAreEqual(typeA, typeB);
24695std::set<SgStatement*>
24704 StatementTraversal() : count (0) {}
24705 void visit (
SgNode* node)
24710 returnset.insert(statement);
24716 std::set<SgStatement*> returnset;
24720 StatementTraversal traversal;
24721 traversal.traverse(node, preorder);
24723 return traversal.returnset;
24726std::set<SgStatement*>
24733 printf (
"In collectModifiedStatements(): node = %p = %s \n",node,node->
class_name().c_str());
24739 StatementTraversal() : count (0) {}
24740 void visit (
SgNode* node)
24745 returnset.insert(statement);
24751 std::set<SgStatement*> returnset;
24755 StatementTraversal traversal;
24756 traversal.traverse(node, preorder);
24758 return traversal.returnset;
24768 printf (
"In outputFileIds(): node = %p = %s \n",node,node->
class_name().c_str());
24774 LocatedNodeTraversal() {}
24775 void visit (
SgNode* node)
24778 if (locatedNode != NULL)
24781 printf (
"In outputFileIds(): isModified() == %s: locatedNode = %p = %s \n",locatedNode->
get_isModified() ?
"true" :
"false",locatedNode,locatedNode->
class_name().c_str());
24782 printf (
" --- file id = %d physical_file_id = %d \n",node->
get_file_info()->get_file_id(),node->
get_file_info()->get_physical_file_id());
24788 if (initializedName != NULL)
24790 printf (
"In outputFileIds(): isModified() == %s: initializedName = %p = %s \n",initializedName->
get_isModified() ?
"true" :
"false",initializedName,initializedName->
class_name().c_str());
24791 printf (
" --- file id = %d physical_file_id = %d \n",initializedName->
get_file_info()->get_file_id(),initializedName->
get_file_info()->get_physical_file_id());
24798 LocatedNodeTraversal traversal;
24799 traversal.traverse(node, preorder);
24802 printf (
"Exiting as a test! \n");
24808std::set<SgLocatedNode*>
24815 printf (
"In collectModifiedLocatedNodes(): node = %p = %s \n",node,node->
class_name().c_str());
24821 LocatedNodeTraversal() : count (0) {}
24822 void visit (
SgNode* node)
24825 if (locatedNode != NULL && locatedNode->
get_isModified() ==
true)
24828 printf (
"In collectModifiedLocatedNodes(): isModified() == true: locatedNode = %p = %s \n",locatedNode,locatedNode->
class_name().c_str());
24830 returnset.insert(locatedNode);
24836 std::set<SgLocatedNode*> returnset;
24840 LocatedNodeTraversal traversal;
24841 traversal.traverse(node, preorder);
24843 return traversal.returnset;
24854 printf (
"In resetModifiedLocatedNodes(): modifiedNodeSet.size() = %zu \n",modifiedNodeSet.size());
24857 std::set<SgLocatedNode*>::const_iterator i = modifiedNodeSet.begin();
24858 while (i != modifiedNodeSet.end())
24862 printf (
"Marking node = %p = %s as modified \n",node,node->
class_name().c_str());
24877 printf (
"\n\n##################################################### \n");
24878 printf (
"Report on modified statements: label = %s \n",label.c_str());
24881 if (sourceFile != NULL)
24883 printf (
" --- (SgSourceFile) filename = %s \n",sourceFile->
getFileName().c_str());
24887 SgGlobal* globalScope = isSgGlobal(node);
24888 if (globalScope != NULL)
24890 sourceFile = isSgSourceFile(globalScope->
get_parent());
24891 printf (
" --- (SgGlobal) filename = %s \n",sourceFile->
getFileName().c_str());
24895 ROSE_ASSERT(node != NULL);
24899 printf (
"In reportModifiedStatements(): collection.size() = %zu \n",collection.size());
24902 std::set<SgStatement*>::iterator i = collection.begin();
24903 while (i != collection.end())
24906 string filename = (*i)->get_file_info()->get_filename();
24909 if (filename ==
"transformation")
24912 printf (
" --- filename == transformation: sourceFile = %p using physical filename \n",sourceFile);
24915 SgSourceFile* sourceFile = TransformationSupport::getSourceFile(*i);
24916 if (sourceFile != NULL)
24922 printf (
" --- filename = %s modified statement = %p = %s \n",filename.c_str(),(*i),(*i)->class_name().c_str());
24930 printf (
"########################################################## \n");
24931 printf (
"reportModifiedStatements(): Called using label = %s \n",label.c_str());
24933 printf (
"########################################################## \n\n\n");
24936 printf (
"Exiting as a test! \n");
24937 ROSE_ASSERT(
false);
24949 printf (
"\n\n##################################################### \n");
24950 printf (
"Report on modified locatedNodes: label = %s \n",label.c_str());
24953 if (sourceFile != NULL)
24955 printf (
" --- (SgSourceFile) filename = %s \n",sourceFile->
getFileName().c_str());
24959 SgGlobal* globalScope = isSgGlobal(node);
24960 if (globalScope != NULL)
24962 sourceFile = isSgSourceFile(globalScope->
get_parent());
24963 printf (
" --- (SgGlobal) filename = %s \n",sourceFile->
getFileName().c_str());
24967 ROSE_ASSERT(node != NULL);
24971 printf (
"In reportModifiedLocatedNode(): collection.size() = %zu \n",collection.size());
24974 std::set<SgLocatedNode*>::iterator i = collection.begin();
24975 while (i != collection.end())
24978 string filename = (*i)->get_file_info()->get_filename();
24981 if (filename ==
"transformation")
24984 printf (
" --- filename == transformation: sourceFile = %p using physical filename \n",sourceFile);
24987 SgSourceFile* sourceFile = TransformationSupport::getSourceFile(*i);
24988 if (sourceFile != NULL)
24994 printf (
" --- filename = %s modified locatedNode = %p = %s \n",filename.c_str(),(*i),(*i)->class_name().c_str());
25002 printf (
"########################################################## \n");
25003 printf (
"reportModifiedLocatedNodes(): Called using label = %s \n",label.c_str());
25005 printf (
"########################################################## \n\n\n");
25008 printf (
"Exiting as a test! \n");
25009 ROSE_ASSERT(
false);
25023 ROSE_ASSERT(locatedNode != NULL);
25027 curprint (
"/* Inside of printOutComments() */");
25030 if (comments != NULL)
25033 printf (
"Found attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
class_name().c_str());
25034 curprint (
"/* Inside of printOutComments(): comments != NULL */");
25037 AttachedPreprocessingInfoType::iterator i;
25038 for (i = comments->begin(); i != comments->end(); i++)
25040 ROSE_ASSERT ( (*i) != NULL );
25041 printf (
" Attached Comment (relativePosition=%s): %s \n",
25044 PreprocessingInfo::relativePositionName((*i)->getRelativePosition()).c_str(),
25045 (*i)->getString().c_str());
25046 printf (
"Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*i)->getNumberOfLines(),(*i)->getColumnNumberOfEndOfString());
25050 (*i)->get_file_info()->display(
"comment/directive location");
25057 printf (
"In SageInterface::printOutComments(): No attached comments (at %p of type: %s): \n",locatedNode,locatedNode->
class_name().c_str());
25067 bool returnValue =
false;
25069 ROSE_ASSERT(currentPreprocessingInfo != NULL);
25071 PreprocessingInfo::DirectiveType directive = currentPreprocessingInfo->getTypeOfDirective();
25073 if (directive == PreprocessingInfo::C_StyleComment ||
25074 directive == PreprocessingInfo::CplusplusStyleComment ||
25075 directive == PreprocessingInfo::FortranStyleComment ||
25076 directive == PreprocessingInfo::CpreprocessorBlankLine ||
25077 directive == PreprocessingInfo::ClinkageSpecificationStart ||
25078 directive == PreprocessingInfo::ClinkageSpecificationEnd)
25080 returnValue =
true;
25083 return returnValue;
25086std::vector<SgC_PreprocessorDirectiveStatement*>
25089 std::vector<SgC_PreprocessorDirectiveStatement*> directiveList;
25094 if (comments !=
nullptr)
25096 AttachedPreprocessingInfoType::iterator i;
25097 for (i = comments->begin (); i != comments->end(); i++)
25106 ROSE_ASSERT(directive != NULL);
25107 directiveList.push_back(directive);
25110 printf (
"directiveList.size() = %zu \n",directiveList.size());
25114 return directiveList;
25123 printf (
"In translateScopeToUseCppDeclarations(): declarationsOnly = %s scope = %p = %s \n",declarationsOnly ?
"true" :
"false",scope,scope->
class_name().c_str());
25125 std::map<SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> > directiveMap;
25127 if (declarationsOnly ==
true)
25131 SgDeclarationStatementPtrList::iterator i = declarationList.begin();
25132 while (i != declarationList.end())
25135 ROSE_ASSERT(declaration != NULL);
25139 printf (
"attachDirectives.size() = %zu \n",attachDirectives.size());
25141 if (attachDirectives.empty() ==
false)
25143 directiveMap.insert(std::pair<
SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> >(declaration,attachDirectives));
25155 SgStatementPtrList::iterator i = statementList.begin();
25156 while (i != statementList.end())
25159 ROSE_ASSERT(statement != NULL);
25163 printf (
"attachDirectives.size() = %zu \n",attachDirectives.size());
25165 if (attachDirectives.empty() ==
false)
25167 directiveMap.insert(std::pair<
SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> >(statement,attachDirectives));
25174 printf (
"directiveMap.size() = %zu \n",directiveMap.size());
25176 printf (
"Processing the directiveMap: \n");
25177 std::map<SgStatement*,std::vector<SgC_PreprocessorDirectiveStatement*> >::iterator i = directiveMap.begin();
25178 while (i != directiveMap.end())
25181 std::vector<SgC_PreprocessorDirectiveStatement*> directives = i->second;
25183 printf (
"statement = %p = %s \n",statement,statement->
class_name().c_str());
25184 printf (
"directives.size() = %zu \n",directives.size());
25186 std::vector<SgC_PreprocessorDirectiveStatement*>::iterator j = directives.begin();
25187 while (j != directives.end())
25196 ROSE_ASSERT(comments != NULL);
25198 AttachedPreprocessingInfoType deleteList;
25203 AttachedPreprocessingInfoType::iterator k;
25204 for (k = comments->begin(); k != comments->end(); k++)
25207 ROSE_ASSERT ( (*k) != NULL );
25208 printf (
" Attached Comment (relativePosition=%s): %s\n",
25209 ((*k)->getRelativePosition() == PreprocessingInfo::before) ?
"before" :
"after",
25210 (*k)->getString().c_str());
25211 printf (
"translateScopeToUseCppDeclarations(): Comment/Directive getNumberOfLines = %d getColumnNumberOfEndOfString = %d \n",(*k)->getNumberOfLines(),(*k)->getColumnNumberOfEndOfString());
25218 printf (
"Do NOT delete *k = %p = %s \n",*k,(*k)->getString().c_str());
25222 printf (
"DO delete *k = %p = %s \n",*k,(*k)->getString().c_str());
25224 deleteList.push_back(*k);
25230 printf (
"Iterate over the deleteList: deleteList.size() = %zu comments->size() = %zu \n",deleteList.size(),comments->size());
25231 AttachedPreprocessingInfoType::iterator m = deleteList.begin();
25232 while (m != deleteList.end())
25236 comments->erase(std::remove(comments->begin(), comments->end(), *m), comments->end());
25238 printf (
" --- comments->size() = %zu \n",comments->size());
25250 printf (
"Leaving translateScopeToUseCppDeclarations(): scope = %p = %s \n",scope,scope->
class_name().c_str());
25260 CppTranslationTraversal() {}
25261 void visit (
SgNode* node)
25263 printf (
"In CppTranslationTraversal::visit(): node = %p = %s \n",node,node->
class_name().c_str());
25266 SgGlobal* globalScope = isSgGlobal(scope);
25267 if (globalScope != NULL)
25269 printf (
"In CppTranslationTraversal::visit(): processing scope = %p = %s \n",scope,scope->
class_name().c_str());
25276 printf (
"In SageInterface::translateToUseCppDeclarations(): Currently skipping all but global scope! \n");
25283 CppTranslationTraversal traversal;
25285 printf (
"In translateToUseCppDeclarations(): Calling traversal.traverse() \n");
25289 traversal.traverse(n, postorder);
25291 printf (
"Leaving translateToUseCppDeclarations(): DONE: Calling traversal.traverse() \n");
25298 cout<<
"--------------"<<endl;
25302 cout<<
"file info:\t ";
25303 lnode->get_file_info()->display();
25304 cout<<
"\n unparseToString:\t ";
25305 lnode->unparseToString();
25316static void serialize(SgTemplateArgumentPtrList& plist,
string& prefix,
bool hasRemaining, ostringstream& out,
string& edgeLabel)
25319 out<< (hasRemaining?
"|---":
"|___");
25322 out<<
" "<<edgeLabel<<
" ->";
25324 out<<
"@"<<&plist<<
" "<<
"SgTemplateArgumentPtrList ";
25328 int last_non_null_child_idx =-1;
25329 for (
int i = (
int) (plist.size())-1; i>=0; i--)
25333 last_non_null_child_idx = i;
25338 for (
size_t i=0; i< plist.size(); i++ )
25340 bool n_hasRemaining=
false;
25342 if (i+1 < plist.size())
25343 n_hasRemaining=
true;
25345 if ((
int)i< last_non_null_child_idx) n_hasRemaining =
true;
25347 string suffix= hasRemaining?
"| " :
" ";
25348 string n_prefix = prefix+suffix;
25349 string n_edge_label=
"";
25351 serialize (plist[i], n_prefix, n_hasRemaining, out,n_edge_label);
25364 out<< (hasRemaining?
"|---":
"|___");
25366 out<<
" "<<edgeLabel<<
" ->";
25369 out<<
" NULL "<<endl;
25374 out<<
"@"<<node<<
" "<< node->
class_name()<<
" ";
25380 out<< lnode->get_file_info()->get_filename() <<
" "<<lnode->get_file_info()->get_line()<<
":"<<lnode->get_file_info()->get_col();
25382 AttachedPreprocessingInfoType *comments =
25383 lnode->getAttachedPreprocessingInfo ();
25385 if (comments != NULL)
25388 out<<
" AttachedPreprocessingInfoType@"<<comments;
25390 AttachedPreprocessingInfoType::iterator i;
25392 for (i = comments->begin (); i != comments->end (); i++)
25394 if (i!=comments->begin ())
25397 out<<counter++<<
" ";
25406 out<<*i<<
" classification="<<PreprocessingInfo::directiveTypeName((*i)->getTypeOfDirective ()). c_str ();
25407 out<<
" string="<<(*i)->getString ().c_str ();
25408 out<<
" relative pos=" ;
25410 if ((*i)->getRelativePosition () == PreprocessingInfo::inside)
25412 else if ((*i)->getRelativePosition () == PreprocessingInfo::before)
25426 out<<
" first nondefining decl@"<< v->get_firstNondefiningDeclaration();
25427 out<<
" defining decl@"<< v->get_definingDeclaration();
25431 out<<
" value="<< f->get_value() <<
" declaration="<<f->get_declaration() <<
" name="<< f->get_name().getString();
25438 out<<
" renamed_function "<< f->get_renamed_function();
25441 out<<
" name="<< f->get_name() <<
" renamed decl "<<f->get_renamed() ;
25453 out<<
" enumType="<< f->get_enumType();
25461 out<<
" is_general_access"<< v->get_is_general_access();
25464 out<<
" is_anonymous:"<< v->get_is_anonymous ();
25469 out<<
" is_protected"<< v->get_is_protected();
25475 out<<
" type@"<< v->get_type();
25476 out<<
" initializer@"<< v->get_initializer();
25477 out<<
" scope@"<< v->get_scope();
25483 out<<
" template class decl@"<< f->get_templateDeclaration();
25486 out<<
" assoc. class decl@"<< f->get_associatedClassDeclaration();
25490 out<<
" member function decl@"<< ctor->get_declaration();
25493 if (
SgIntVal* v= isSgIntVal(node))
25494 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25497 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25500 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25503 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25506 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25509 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25512 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25515 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25518 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25521 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25524 out<<
" value="<< v->get_value() <<
" valueString="<< v->get_valueString();
25527 out<<
" init name@"<< var_ref->get_symbol()->get_declaration() <<
" symbol name="<<var_ref->get_symbol()->get_name();
25530 out<<
" member func decl@"<< func_ref->get_symbol_i()->get_declaration();
25533 out<<
" template member func decl@"<< cnode->get_templateDeclaration();
25538 out<<
" func decl@"<< sym->get_declaration() <<
" func sym name="<<sym->
get_name();
25544 out<<
" ada renaming decl@"<< renaming_decl;
25550 out<<
" base_type@"<< v->get_base_type();
25555 out<<
" base_type@"<< v->get_base_type();
25558 out<<
" base_type@"<< v->get_base_type();
25561 out<<
" type@"<< v->get_type();
25564 out<<
" attribute@"<< v->get_attribute();
25567 out<<
" namespaceDeclaration="<< v->get_namespaceDeclaration();
25573 int total_count = children.size();
25574 int current_index=0;
25577 int last_non_null_child_idx =-1;
25578 for (
int i = (
int) (children.size())-1; i>=0; i--)
25582 last_non_null_child_idx = i;
25590 if (isSgTemplateInstantiationDecl (node))
25597 SgTemplateArgumentPtrList& plist = sn->get_templateArguments();
25598 bool n_hasRemaining=
false;
25599 if (last_non_null_child_idx>-1) n_hasRemaining =
true;
25600 string suffix= hasRemaining?
"| " :
" ";
25601 string n_prefix = prefix+suffix;
25602 string n_edge_label=
"";
25603 serialize_list(plist,
"SgTemplateArgumentPtrList", n_prefix, n_hasRemaining, out, n_edge_label);
25607 SgExpressionPtrList& plist = import_stmt->get_import_list();
25608 bool n_hasRemaining=
false;
25609 if (last_non_null_child_idx>-1) n_hasRemaining =
true;
25610 string suffix= hasRemaining?
"| " :
" ";
25611 string n_prefix = prefix+suffix;
25612 string n_edge_label=
"";
25613 serialize_list(plist,
"SgExpressionPtrList", n_prefix, n_hasRemaining, out, n_edge_label);
25619 for (
size_t i =0; i< children.size(); i++)
25621 bool n_hasRemaining=
false;
25623 if (current_index+1<total_count)
25624 n_hasRemaining=
true;
25627 if ((
int)i<last_non_null_child_idx) n_hasRemaining =
true;
25629 string suffix= hasRemaining?
"| " :
" ";
25630 string n_prefix = prefix+suffix;
25632 serialize (children[i], n_prefix, n_hasRemaining, out, successorNames[i]);
25641 serialize(node, prefix,
false, oss, label);
25662 serialize(node, prefix,
false, oss, label);
25664 textfile.open(filename, ios::out);
25665 textfile<<oss.str();
25670 textfile<<
"Types encountered ...."<<endl;
25671 ostringstream oss2;
25672 VariantVector vv(V_SgType);
25673 Rose_STL_Container<SgNode*> tnodes= NodeQuery::queryMemoryPool(vv);
25674 for (Rose_STL_Container<SgNode*>::const_iterator i = tnodes.begin(); i != tnodes.end(); ++i)
25676 serialize (*i, prefix,
false, oss2, label);
25678 textfile<<oss2.str();
25686 saveToPDF(node,
string(
"temp.pdf.json") );
25692 ROSE_ASSERT(node != NULL);
25699 bool rtval =
false;
25700 ROSE_ASSERT (node != NULL);
25704 string fname = finfo->get_filenameString();
25705 string buildtree_str1 = string(
"include-staging/gcc_HEADERS");
25706 string buildtree_str2 = string(
"include-staging/g++_HEADERS");
25707 string installtree_str1 = string(
"include/edg/gcc_HEADERS");
25708 string installtree_str2 = string(
"include/edg/g++_HEADERS");
25709 string system_headers = string(
"/usr/include");
25711 if ((fname.find (buildtree_str1, 0) != string::npos) ||
25712 (fname.find (buildtree_str2, 0) != string::npos) ||
25713 (fname.find (installtree_str1, 0) != string::npos) ||
25714 (fname.find (installtree_str2, 0) != string::npos) ||
25715 (fname.find (system_headers, 0) != string::npos)
25728 bool returnValue =
false;
25731 ROSE_ASSERT(fileInfo != NULL);
25732 string filename = fileInfo->get_filenameString();
25735 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());
25740 if (EDG_ROSE_Translation::edg_include_file_map.find(filename) == EDG_ROSE_Translation::edg_include_file_map.end())
25743 printf (
"This is NOT in the EDG_ROSE_Translation::edg_include_file_map \n");
25749 printf (
"This IS in the EDG_ROSE_Translation::edg_include_file_map \n");
25751 returnValue =
true;
25754 return returnValue;
25761 ROSE_ASSERT(return_type != NULL);
25762 ROSE_ASSERT(typeList != NULL);
25764 ROSE_ASSERT(fTable);
25769 SgFunctionType* funcType = isSgFunctionType(fTable->lookup_function_type(typeName));
25779 ROSE_ASSERT (lhs != NULL);
25780 ROSE_ASSERT (rhs != NULL);
25785 SgType* rt1 = lhs->get_return_type();
25786 SgType* rt2 = rhs->get_return_type();
25793 if (f1_arg_types.size() == f2_arg_types.size())
25797 size_t counter = 0;
25800 for (
size_t i=0; i< f1_arg_types.size(); i++)
25808 if (counter == f1_arg_types.size())
25830 ROSE_ASSERT(lhs != NULL);
25831 ROSE_ASSERT(rhs != NULL);
25833 bool isSame =
false;
25836 static int counter = 0;
25838 const SgType & X = *lhs;
25839 const SgType & Y = *rhs;
25847#define DEBUG_TYPE_EQUIVALENCE 0
25849#if DEBUG_TYPE_EQUIVALENCE
25850 printf (
"In SageInterface::isEquivalentType(): evaluation of type equivalence for lhs and rhs: counter = %d \n",counter);
25855#if DEBUG_TYPE_EQUIVALENCE || 0
25858 printf (
"In SageInterface::isEquivalentType(): evaluation of type equivalence for lhs and rhs: counter = %d \n",counter);
25864#if DEBUG_TYPE_EQUIVALENCE || 0
25870 printf (
"Output of type chain for lhs: \n");
25871 for (
size_t i = 0; i < X_typeChain.size(); i++)
25873 SgType* element_type = X_typeChain[i];
25874 printf (
"X_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
25875 printf (
" --- X_element_type unparseToString: = %s \n",element_type->
unparseToString().c_str());
25877 if (modifierType != NULL)
25881 printf (
" --- type chain modifier: %s \n",s.c_str());
25882 printf (
" --- type chain modifier: unparseToString: %s \n",modifierType->
unparseToString().c_str());
25886 printf (
"Output of type chain for rhs: \n");
25887 for (
size_t i = 0; i < Y_typeChain.size(); i++)
25889 SgType* element_type = Y_typeChain[i];
25890 printf (
"Y_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
25891 printf (
" --- Y_element_type unparseToString: = %s \n",element_type->
unparseToString().c_str());
25893 if (modifierType != NULL)
25897 printf (
" --- type chain modifier: %s \n",s.c_str());
25898 printf (
" --- type chain modifier: unparseToString: %s \n",modifierType->
unparseToString().c_str());
25909 if (counter >= 280)
25912 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);
25924 printf (
"ERROR: In SageInterface::isEquivalentType(): recursive limit exceeded for : counter = %d \n",counter);
25935 SgReferenceType* X_referenceType = isSgReferenceType(X_element_type);
25936 SgReferenceType* Y_referenceType = isSgReferenceType(Y_element_type);
25938 if (X_referenceType != NULL && Y_referenceType != NULL)
25940 X_element_type = X_referenceType->get_base_type();
25941 Y_element_type = Y_referenceType->get_base_type();
25952 SgPointerType* X_pointerType = isSgPointerType(X_element_type);
25953 SgPointerType* Y_pointerType = isSgPointerType(Y_element_type);
25955 if (X_pointerType != NULL && Y_pointerType != NULL)
25957 X_element_type = X_pointerType->get_base_type();
25958 Y_element_type = Y_pointerType->get_base_type();
25969 SgArrayType* X_arrayType = isSgArrayType(X_element_type);
25970 SgArrayType* Y_arrayType = isSgArrayType(Y_element_type);
25973 if (X_arrayType != NULL && Y_arrayType != NULL)
25975 X_element_type = X_arrayType->get_base_type();
25976 Y_element_type = Y_arrayType->get_base_type();
25978 SgExpression* X_array_index_expression = X_arrayType->get_index();
25979 SgExpression* Y_array_index_expression = Y_arrayType->get_index();
25981 if (X_array_index_expression == Y_array_index_expression)
25983#if DEBUG_TYPE_EQUIVALENCE || 0
25984 printf (
"In SageInterface::isEquivalentType(): counter = %d: Need to check the array size for static equivalence \n",counter);
25995#if DEBUG_TYPE_EQUIVALENCE || 0
25996 printf (
"In SageInterface::isEquivalentType(): counter = %d Need more complex test for expression equivalence \n",counter);
25999 printf (
" --- array index expressions: str1 = %s str2 = %s \n",str1.c_str(),str2.c_str());
26011 SgNonrealType* X_templateType = isSgNonrealType(X_element_type);
26012 SgNonrealType* Y_templateType = isSgNonrealType(Y_element_type);
26015 if (X_templateType != NULL && Y_templateType != NULL)
26017 string X_name = X_templateType->
get_name();
26018 string Y_name = Y_templateType->
get_name();
26020 SgNonrealDecl* X_templateDecl = isSgNonrealDecl(X_templateType->get_declaration());
26021 ROSE_ASSERT(X_templateDecl != NULL);
26022 SgNonrealDecl* Y_templateDecl = isSgNonrealDecl(Y_templateType->get_declaration());
26023 ROSE_ASSERT(Y_templateDecl != NULL);
26025 int X_template_parameter_position = X_templateDecl->get_template_parameter_position();
26026 int Y_template_parameter_position = Y_templateDecl->get_template_parameter_position();
26031#if DEBUG_TYPE_EQUIVALENCE
26034 printf (
"In SageInterface::isEquivalentType(): case SgNonrealType:\n");
26035 printf (
" -- X_name = %s Y_name = %s\n", X_name.c_str(),Y_name.c_str());
26036 printf (
" -- X_template_parameter_position = %d Y_template_parameter_position = %d\n", X_template_parameter_position,Y_template_parameter_position);
26037 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() :
"");
26038 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() :
"");
26039 printf (
" -- X_templateDecl->get_mangled_name() = %s\n", X_templateDecl->get_mangled_name().str());
26040 printf (
" -- Y_templateDecl->get_mangled_name() = %s\n", Y_templateDecl->get_mangled_name().str());
26042 bool value = (X_parent == Y_parent);
26044 if (value && X_templateDecl->get_is_template_param() && Y_templateDecl->get_is_template_param()) {
26045 value = (X_template_parameter_position == Y_template_parameter_position);
26046 }
else if (value && X_templateDecl->get_is_class_member() && Y_templateDecl->get_is_class_member()) {
26047 value = (X_name == Y_name);
26059 printf (
"Nothing to do here since we have explored all uniform pairs of intermediate types possible: isSame = %s \n",isSame ?
"true" :
"false");
26065#if DEBUG_TYPE_EQUIVALENCE
26066 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");
26073 SgModifierType* X_modifierType = isSgModifierType(X_element_type);
26074 SgModifierType* Y_modifierType = isSgModifierType(Y_element_type);
26076#if DEBUG_TYPE_EQUIVALENCE
26077 printf (
"In SageInterface::isEquivalentType(): counter = %d: type chain X_element_type = %p = %s Y_element_type = %p = %s \n",
26078 counter,X_element_type,X_element_type->
class_name().c_str(),Y_element_type,Y_element_type->
class_name().c_str());
26081 if (X_modifierType != NULL && Y_modifierType != NULL)
26084#if DEBUG_TYPE_EQUIVALENCE
26085 printf (
"In SageInterface::isEquivalentType(): loop: these are the both SgModifierType nodes: isSame = %s \n",isSame ?
"true" :
"false");
26087 if (X_modifierType == Y_modifierType)
26090#if DEBUG_TYPE_EQUIVALENCE
26091 printf (
"In SageInterface::isEquivalentType(): loop: these are the same modifier type: isSame = %s \n",isSame ?
"true" :
"false");
26098#if DEBUG_TYPE_EQUIVALENCE
26099 printf (
"In SageInterface::isEquivalentType(): loop: these are equivalent modifiers: check the base type: isSame = %s \n",isSame ?
"true" :
"false");
26103 isSame =
isEquivalentType(X_modifierType->get_base_type(),Y_modifierType->get_base_type());
26107#if DEBUG_TYPE_EQUIVALENCE
26108 printf (
"In SageInterface::isEquivalentType(): loop: these are not equivalent modifier types: check for default settings: isSame = %s \n",isSame ?
"true" :
"false");
26111 bool skippingOverIdentityModifier =
false;
26115#if DEBUG_TYPE_EQUIVALENCE
26116 printf (
"In SageInterface::isEquivalentType(): loop: found self-similar setting for lhs: isSame = %s \n",isSame ?
"true" :
"false");
26118 X_element_type = X_modifierType->get_base_type();
26121 skippingOverIdentityModifier =
true;
26126#if DEBUG_TYPE_EQUIVALENCE
26127 printf (
"In SageInterface::isEquivalentType(): loop: found self-similar setting for rhs: isSame = %s \n",isSame ?
"true" :
"false");
26129 Y_element_type = Y_modifierType->get_base_type();
26132 skippingOverIdentityModifier =
true;
26136#if DEBUG_TYPE_EQUIVALENCE
26137 printf (
"In SageInterface::isEquivalentType(): loop: skippingOverIdentityModifier = %s \n",skippingOverIdentityModifier ?
"true" :
"false");
26142 if (skippingOverIdentityModifier ==
true)
26144#if DEBUG_TYPE_EQUIVALENCE
26145 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");
26154#if DEBUG_TYPE_EQUIVALENCE
26155 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");
26159#if DEBUG_TYPE_EQUIVALENCE
26160 printf (
"In SageInterface::isEquivalentType(): loop: these are different modifier types: after recursive call to compare base types: isSame = %s \n",isSame ?
"true" :
"false");
26169 if (X_modifierType != NULL || Y_modifierType != NULL)
26171 bool isReduceable =
false;
26173 if (X_modifierType != NULL && X_modifierType->
get_typeModifier().isIdentity() ==
true)
26175#if DEBUG_TYPE_EQUIVALENCE
26176 printf (
"In SageInterface::isEquivalentType(): loop: found default setting for lhs: isSame = %s \n",isSame ?
"true" :
"false");
26178 X_element_type = X_modifierType->get_base_type();
26179 isReduceable =
true;
26182 if (Y_modifierType != NULL && Y_modifierType->
get_typeModifier().isIdentity() ==
true)
26184#if DEBUG_TYPE_EQUIVALENCE
26185 printf (
"In SageInterface::isEquivalentType(): loop: found default setting for rhs: isSame = %s \n",isSame ?
"true" :
"false");
26187 Y_element_type = Y_modifierType->get_base_type();
26188 isReduceable =
true;
26192#if DEBUG_TYPE_EQUIVALENCE
26193 printf (
"In SageInterface::isEquivalentType(): loop: these are different modifier types: after recursive call to compare base types: isReduceable = %s \n",isReduceable ?
"true" :
"false");
26195 if (isReduceable ==
true)
26207#if DEBUG_TYPE_EQUIVALENCE
26208 printf (
"In SageInterface::isEquivalentType(): loop: these are different modifier types: after recursive call to compare base types: isReduceable = %s isSame = %s \n",
26209 isReduceable ?
"true" :
"false",isSame ?
"true" :
"false");
26218 if (X_element_type == Y_element_type)
26221#if DEBUG_TYPE_EQUIVALENCE || 0
26223 printf (
"In SageInterface::isEquivalentType(): resolved to equal types: isSame = %s lhs = %p = %s rhs = %p = %s \n",
26226#if DEBUG_TYPE_EQUIVALENCE || 0
26229 const SgTypedefType* lhs_typedefType = isSgTypedefType(lhs);
26230 const SgTypedefType* rhs_typedefType = isSgTypedefType(rhs);
26232 if (lhs_typedefType != NULL || rhs_typedefType != NULL)
26235 if (lhs_typedefType != NULL)
26237 printf (
"lhs was a typedef: lhs = %p = %s \n",lhs,lhs->
unparseToString().c_str());
26239 if (rhs_typedefType != NULL)
26241 printf (
"rhs was a typedef: rhs = %p = %s \n",rhs,rhs->
unparseToString().c_str());
26244 printf (
" --- one was a typedef: lhs = %p = %s \n",lhs,lhs->
unparseToString().c_str());
26245 printf (
" --- one was a typedef: rhs = %p = %s \n",rhs,rhs->
unparseToString().c_str());
26256 SgReferenceType* X_referenceType = isSgReferenceType(X_element_type);
26257 SgReferenceType* Y_referenceType = isSgReferenceType(Y_element_type);
26259 if (X_referenceType != NULL || Y_referenceType != NULL)
26262 if (X_referenceType != NULL)
26264 X_element_type = X_referenceType->get_base_type();
26268 isReduceable =
false;
26271 if (Y_referenceType != NULL)
26273 Y_element_type = Y_referenceType->get_base_type();
26277 isReduceable =
false;
26280 if (isReduceable ==
true)
26301#if DEBUG_TYPE_EQUIVALENCE
26302 printf (
"In SageInterface::isEquivalentType(): loop: evaluation of inner types: isSame = %s \n",isSame ?
"true" :
"false");
26306 SgPointerType* X_pointerType = isSgPointerType(X_element_type);
26307 SgPointerType* Y_pointerType = isSgPointerType(Y_element_type);
26309 if (X_pointerType != NULL || Y_pointerType != NULL)
26312 if (X_pointerType != NULL)
26314 X_element_type = X_pointerType->get_base_type();
26318 isReduceable =
false;
26321 if (Y_pointerType != NULL)
26323 Y_element_type = Y_pointerType->get_base_type();
26327 isReduceable =
false;
26330 if (isReduceable ==
true)
26351#if DEBUG_TYPE_EQUIVALENCE
26352 printf (
"In SageInterface::isEquivalentType(): loop: evaluation of inner types: isSame = %s \n",isSame ?
"true" :
"false");
26356 SgArrayType* X_arrayType = isSgArrayType(X_element_type);
26357 SgArrayType* Y_arrayType = isSgArrayType(Y_element_type);
26359 if (X_arrayType != NULL || Y_arrayType != NULL)
26362 if (X_arrayType != NULL)
26364 X_element_type = X_arrayType->get_base_type();
26368 isReduceable =
false;
26371 if (Y_arrayType != NULL)
26373 Y_element_type = Y_arrayType->get_base_type();
26377 isReduceable =
false;
26380 if (isReduceable ==
true)
26401#if DEBUG_TYPE_EQUIVALENCE
26402 printf (
"In SageInterface::isEquivalentType(): loop: evaluation of inner types: isSame = %s \n",isSame ?
"true" :
"false");
26406 SgFunctionType* X_functionType = isSgFunctionType(X_element_type);
26407 SgFunctionType* Y_functionType = isSgFunctionType(Y_element_type);
26409 if (X_functionType != NULL || Y_functionType != NULL)
26411 bool value = ( (X_functionType != NULL && Y_functionType != NULL) && (X_functionType == Y_functionType) );
26414#if DEBUG_TYPE_EQUIVALENCE || 0
26415 printf (
"In SageInterface::isEquivalentType(): loop: Process case of SgFunctionType: value = %s \n",value ?
"true" :
"false");
26433 if (X_memberFunctionType != NULL || Y_memberFunctionType != NULL)
26436 printf (
"This should be unreachable code \n");
26440 bool value = ( (X_memberFunctionType != NULL && Y_memberFunctionType != NULL) && (X_memberFunctionType == Y_memberFunctionType) );
26441#if DEBUG_TYPE_EQUIVALENCE || 0
26442 printf (
"In SageInterface::isEquivalentType(): loop: Process case of SgMemberFunctionType: value = %s \n",value ?
"true" :
"false");
26455 bool X_isReduceable =
true;
26456 if (isSgTypeSignedLong(X_element_type) != NULL ||
26457 isSgTypeUnsignedInt(X_element_type) != NULL ||
26458 isSgTypeBool(X_element_type) != NULL ||
26459 isSgTypeInt(X_element_type) != NULL)
26461 X_isReduceable =
false;
26464 bool Y_isReduceable =
true;
26465 if (isSgTypeSignedLong(Y_element_type) != NULL ||
26466 isSgTypeUnsignedInt(Y_element_type) != NULL ||
26467 isSgTypeBool(Y_element_type) != NULL ||
26468 isSgTypeInt(Y_element_type) != NULL)
26470 Y_isReduceable =
false;
26472#if DEBUG_TYPE_EQUIVALENCE || 0
26473 printf (
"In SageInterface::isEquivalentType(): loop: Process default case: X_isReduceable = %s Y_isReduceable = %s \n",
26474 X_isReduceable ?
"true" :
"false",Y_isReduceable ?
"true" :
"false");
26476 if (X_isReduceable ==
true || Y_isReduceable ==
true)
26490#if DEBUG_TYPE_EQUIVALENCE || 0
26491 printf (
"In SageInterface::isEquivalentType(): loop: Process default case: X_element_type = %p = %s Y_element_type = %p = %s \n",
26492 X_element_type,X_element_type->
class_name().c_str(),Y_element_type,Y_element_type->
class_name().c_str());
26497 isSame = (X_element_type == Y_element_type);
26517#if DEBUG_TYPE_EQUIVALENCE || 0
26518 printf (
"In SageInterface::isEquivalentType(): isSame = %s \n",isSame ?
"true" :
"false");
26521#if DEBUG_TYPE_EQUIVALENCE || 0
26522 if (counter == 1 && isSame ==
true)
26524 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());
26531 printf (
" --- Output of type chain for lhs: \n");
26532 for (
size_t i = 0; i < X_typeChain.size(); i++)
26534 SgType* element_type = X_typeChain[i];
26535 printf (
" --- --- X_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
26537 if (modifierType != NULL)
26541 printf (
" --- type chain modifier: %s \n",s.c_str());
26545 printf (
" --- Output of type chain for rhs: \n");
26546 for (
size_t i = 0; i < Y_typeChain.size(); i++)
26548 SgType* element_type = Y_typeChain[i];
26549 printf (
" --- --- Y_element_type = %p = %s \n",element_type,element_type->
class_name().c_str());
26551 if (modifierType != NULL)
26555 printf (
" --- --- type chain modifier: %s \n",s.c_str());
26564 if (isSame ==
true)
26567 printf (
" --- isSame = %s \n",isSame ?
"true" :
"false");
26570 printf (
" --- --- X_element_type = %p = %s = %s \n",X_element_type,X_element_type->
class_name().c_str(),X_element_type->
unparseToString().c_str());
26571 printf (
" --- --- Y_element_type = %p = %s = %s \n",Y_element_type,Y_element_type->
class_name().c_str(),Y_element_type->
unparseToString().c_str());
26576 printf (
" --- isSame = %s \n",isSame ?
"true" :
"false");
26581 printf (
" --- counter = %d \n",counter);
26598 bool retval =
false;
26607 retval = function->get_marked_as_edg_normalization();
26615 if (templateInstantiationFunction != NULL)
26620 if (templateFunctionDeclaration != NULL)
26631 printf (
" --- case of templateInstantiationFunction: retval = %s \n",retval ?
"true" :
"false");
26636 if (templateInstantiationMemberFunction != NULL)
26639 templateInstantiationMemberFunction = isSgTemplateInstantiationMemberFunctionDecl(templateInstantiationMemberFunction->
get_firstNondefiningDeclaration());
26641 if (templateMemberFunctionDeclaration != NULL)
26652 printf (
" --- case of templateInstantiationMemberFunction: retval = %s \n",retval ?
"true" :
"false");
26664 printf(
"In detectCycleInType():\n");
26665 printf(
" -- from = %s\n", from.c_str());
26666 printf(
" -- type = %p (%s)\n", type, type->
class_name().c_str());
26668 std::vector<SgType *> seen_types;
26670 while (type != NULL) {
26673 ROSE_ASSERT(type != NULL);
26675 std::vector<SgType *>::const_iterator it = std::find(seen_types.begin(), seen_types.end(), type);
26676 if (it != seen_types.end()) {
26677 printf(
"ERROR: Cycle found in type = %p (%s):\n", type, type->
class_name().c_str());
26679 for (; it != seen_types.end(); it++) {
26680 printf(
" [%zd] %p (%s)\n", i, *it, (*it)->class_name().c_str());
26683 printf(
"-> detectCycleInType() was called from: %s\n", from.c_str());
26686 seen_types.push_back(type);
26696 if (isSgPointerMemberType(type) != NULL)
26703 type = modType->get_base_type();
26704 }
else if ( refType ) {
26705 type = refType->get_base_type();
26706 }
else if ( pointType ) {
26707 type = pointType->get_base_type();
26710 }
else if ( arrayType ) {
26711 type = arrayType->get_base_type();
26712 }
else if ( typedefType ) {
26717 ROSE_ASSERT(type != NULL);
26738 std::vector<SgFunctionDeclaration*> functionList;
26741 string filenameWithPath;
26744 TransformFunctionDefinitionsTraversal(): sourceFile(NULL), sourceFileId(-99) {}
26746 void visit (
SgNode* node)
26749 printf (
"In convertFunctionDefinitionsToFunctionPrototypes visit(): node = %p = %s \n",node,node->
class_name().c_str());
26752 if (temp_sourceFile != NULL)
26754 sourceFile = temp_sourceFile;
26758 filenameWithPath = sourceFile->get_sourceFileNameWithPath();
26760 printf (
"Found source file: id = %d name = %s \n",sourceFileId,sourceFile->get_sourceFileNameWithPath().c_str());
26765 if (functionDeclaration != NULL)
26768 ROSE_ASSERT(sourceFile != NULL);
26771 if (functionDeclaration == definingFunctionDeclaration)
26774 printf (
"Found a defining function declaration: functionDeclaration = %p = %s name = %s \n",
26775 functionDeclaration,functionDeclaration->
class_name().c_str(),functionDeclaration->get_name().str());
26777 printf (
" --- recorded source file: id = %d name = %s \n",sourceFileId,sourceFile->get_sourceFileNameWithPath().c_str());
26778 printf (
" --- source file: file_info: id = %d name = %s \n",
26783 bool isInSourceFile = (filenameWithPath == functionDeclaration->
get_file_info()->get_filenameString());
26785 printf (
" --- isInSourceFile = %s \n",isInSourceFile ?
"true" :
"false");
26789 if (isInSourceFile ==
true && functionDeclarationScope != NULL)
26792 printf (
" --- Found a defining function declaration: functionDeclarationScope = %p = %s \n",
26793 functionDeclarationScope,functionDeclarationScope->
class_name().c_str());
26797 functionList.push_back(functionDeclaration);
26805 TransformFunctionDefinitionsTraversal traversal;
26806 traversal.traverse(node, preorder);
26808 std::vector<SgFunctionDeclaration*> & functionList = traversal.functionList;
26811 printf (
"In convertFunctionDefinitionsToFunctionPrototypes(): functionList.size() = %zu \n",functionList.size());
26814 std::vector<SgFunctionDeclaration*>::iterator i = functionList.begin();
26815 while (i != functionList.end())
26818 ROSE_ASSERT(functionDeclaration != NULL);
26821 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
26824 printf (
" --- Removing function declaration: functionDeclaration = %p = %s name = %s \n",
26825 functionDeclaration,functionDeclaration->
class_name().c_str(),functionDeclaration->get_name().str());
26835 printf (
"In convertFunctionDefinitionsToFunctionPrototypes(): exiting as a test! \n");
26846 ROSE_ASSERT(scope != NULL);
26848 printf (
"Output the statements in scope = %p = %s \n",scope,scope->
class_name().c_str());
26852 for (
size_t i = 0; i < statementList.size(); i++)
26859 printf (
"Exiting as a test at the end of evaluation of global scope! \n");
26872 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration = %p = %s name = %s \n",
26873 functionDeclaration,functionDeclaration->
class_name().c_str(),functionDeclaration->get_name().str());
26877 bool isConstructor =
false;
26879 if (tmp_memberFunctionDeclaration != NULL)
26881 isConstructor = tmp_memberFunctionDeclaration->get_specialFunctionModifier().isConstructor();
26884 if (isConstructor ==
true)
26886 printf (
"Skipping case of constructors (in building prototype from defining function declaration) \n");
26896 SgName name = functionDeclaration->get_name();
26897 SgType* return_type = functionDeclaration->get_type()->get_return_type();
26905 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration = %p \n",functionDeclaration);
26906 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration->get_firstNondefiningDeclaration() = %p \n",functionDeclaration->
get_firstNondefiningDeclaration());
26907 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration->get_definingDeclaration() = %p \n",functionDeclaration->
get_definingDeclaration());
26911 for (
size_t i = 0; i < functionDeclaration->get_args().size(); i++)
26915 printf (
"In SageInterface::buildFunctionPrototype(): functionDeclaration->get_args(): (i = %zu) arg = %p = %s isDefaultArgument = %s \n",
26916 i,arg,arg->get_name().str(),arg->
get_file_info()->isDefaultArgument() ?
"true" :
"false");
26917 printf (
" --- arg->get_initializer() = %p \n",arg->get_initializer());
26921 printf (
"NOTE: default argument (i = %zu) not reproduced in function prototype: arg = %p = %s \n",i,arg,arg->get_name().str());
26934 if (templateInstantiationFunctionDecl == NULL)
26941 if (templateInstantiationMemberFunctionDecl == NULL)
26950 bool isTemplateInstantiationMemberFunctionDecl =
false;
26955 bool buildTemplateInstantiation =
false;
26956 SgTemplateArgumentPtrList* templateArgumentsList = NULL;
26961 ROSE_ASSERT(param_list == NULL || param_list->
get_parent() == NULL);
26963 switch (functionDeclaration->
variantT())
26965 case V_SgTemplateMemberFunctionDeclaration:
26968 printf (
"This function to replace the defining declaration with a non-defining declaration does not yet support template member functions \n");
26971 ROSE_ASSERT(original_templateMemberFunctionDeclaration != NULL);
26975 unsigned int functionConstVolatileFlags = 0;
26977 ROSE_ASSERT(original_templateMemberFunctionDeclaration->get_type() != NULL);
26982 SgMemberFunctionType* memberFunctionType = isSgMemberFunctionType(original_templateMemberFunctionDeclaration->get_type());
26983 ROSE_ASSERT(memberFunctionType != NULL);
26985 functionConstVolatileFlags = memberFunctionType->get_mfunc_specifier();
26991 SgTemplateParameterPtrList templateParameterList = original_templateMemberFunctionDeclaration->get_templateParameters();
26994 templateMemberFunctionDeclaration =
26997 printf (
"ERROR: Template functions are not yet supported! \n");
27000 nondefiningFunctionDeclaration = templateMemberFunctionDeclaration;
27002 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27005 if (isConstructor ==
true)
27007 templateMemberFunctionDeclaration->get_specialFunctionModifier().setConstructor();
27013 case V_SgTemplateFunctionDeclaration:
27016 printf (
"This function to replace the defining declaration with a non-defining declaration does not yet support template functions \n");
27019 ROSE_ASSERT(original_templateFunctionDeclaration != NULL);
27027 SgTemplateParameterPtrList templateParameterList = original_templateFunctionDeclaration->get_templateParameters();
27031 printf (
"ERROR: Template functions are not yet supported! \n");
27034 nondefiningFunctionDeclaration = templateFunctionDeclaration;
27036 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27042 case V_SgTemplateInstantiationMemberFunctionDecl:
27044 buildTemplateInstantiation =
true;
27046 isTemplateInstantiationMemberFunctionDecl =
true;
27049 ROSE_ASSERT(templateInstantiationMemberFunctionDecl != NULL);
27052 printf (
"name from functionDeclaration->get_name(): name = %s \n",name.str());
27054 printf (
"name from templateInstantiationMemberFunctionDecl->get_templateName(): template_name = %s \n",templateInstantiationMemberFunctionDecl->
get_templateName().str());
27056 if (templateDeclaration != NULL)
27058 printf (
"name from templateInstantiationMemberFunctionDecl->get_template_declaration()->get_name(): template_name = %s \n",templateDeclaration->get_name().str());
27059 printf (
"name from templateInstantiationMemberFunctionDecl->get_template_declaration()->get_template_name(): template_name = %s \n",templateDeclaration->
get_template_name().str());
27066 printf (
"In case V_SgTemplateInstantiationMemberFunctionDecl: using name = %s \n",name.str());
27071 case V_SgMemberFunctionDeclaration:
27074 printf (
"This function to replace the defining declaration with a non-defining declaration does not yet support member functions \n");
27077 ROSE_ASSERT(original_memberFunctionDeclaration != NULL);
27085 unsigned int functionConstVolatileFlags = 0;
27087 ROSE_ASSERT(original_memberFunctionDeclaration->get_type() != NULL);
27096 bool buildPrototype = isTemplateInstantiationMemberFunctionDecl || original_memberFunctionDeclaration->
get_parent() == original_memberFunctionDeclaration->
get_scope();
27098 printf (
"In SageInterface::buildFunctionPrototype(): buildPrototype = %s \n",buildPrototype ?
"true" :
"false");
27100 if (buildPrototype ==
true)
27102 SgMemberFunctionType* memberFunctionType = isSgMemberFunctionType(original_memberFunctionDeclaration->get_type());
27103 ROSE_ASSERT(memberFunctionType != NULL);
27105 printf (
"original_memberFunctionDeclaration->get_parent() == original_memberFunctionDeclaration->get_scope() \n");
27107 functionConstVolatileFlags = memberFunctionType->get_mfunc_specifier();
27109 memberFunctionDeclaration =
27111 ( name, return_type, param_list, scope, python_decoratorList, functionConstVolatileFlags,
27112 buildTemplateInstantiation,templateArgumentsList );
27114 printf (
"ERROR: Member functions are not yet supported! \n");
27118 if (isConstructor ==
true)
27120 memberFunctionDeclaration->get_specialFunctionModifier().setConstructor();
27123 nondefiningFunctionDeclaration = memberFunctionDeclaration;
27125 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27131 printf (
"NOTE: Member functions defined outside of their class can not be output as member function prototypes (not allowed in C++) \n");
27135 nondefiningFunctionDeclaration = NULL;
27137 nondefiningFunctionDeclaration = NULL;
27139 replaceWithEmptyDeclaration =
true;
27141 ROSE_ASSERT(emptyDeclaration != NULL);
27150 printf (
"Exiting as a test! \n");
27160 case V_SgFunctionDeclaration:
27163 nondefiningFunctionDeclaration =
buildNondefiningFunctionDeclaration (name, return_type, param_list, scope, python_decoratorList, buildTemplateInstantiation,templateArgumentsList);
27164 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27169 case V_SgTemplateInstantiationFunctionDecl:
27172 buildTemplateInstantiation =
true;
27174 ROSE_ASSERT(templateInstantiationFunctionDecl != NULL);
27177 printf (
"name from functionDeclaration->get_name(): name = %s \n",name.str());
27179 printf (
"name from templateInstantiationFunctionDecl->get_templateName(): template_name = %s \n",templateInstantiationFunctionDecl->
get_templateName().str());
27181 if (templateDeclaration != NULL)
27183 printf (
"name from templateInstantiationFunctionDecl->get_template_declaration()->get_name(): template_name = %s \n",templateDeclaration->get_name().str());
27184 printf (
"name from templateInstantiationFunctionDecl->get_template_declaration()->get_template_name(): template_name = %s \n",templateDeclaration->
get_template_name().str());
27189 printf (
"In case V_SgTemplateInstantiationFunctionDecl: using name = %s \n",name.str());
27191 nondefiningFunctionDeclaration =
buildNondefiningFunctionDeclaration (name, return_type, param_list, scope, python_decoratorList, buildTemplateInstantiation,templateArgumentsList);
27192 ROSE_ASSERT(nondefiningFunctionDeclaration != NULL);
27211 ROSE_ASSERT(param_list == NULL || param_list->
get_parent() != NULL);
27217 if (nondefiningFunctionDeclaration != NULL)
27222 printf (
"Setting the firstNondefiningDeclaration \n");
27230 printf (
"Setting the definingDeclaration \n");
27239 if (nondefiningFunctionDeclaration != NULL)
27249 return nondefiningFunctionDeclaration;
27258 ROSE_ASSERT(functionDeclaration != NULL);
27261 printf (
"****************************************************************** \n");
27262 printf (
"Attached comments and CPP directives: defining functionDeclaration \n");
27264 printf (
"****************************************************************** \n");
27272 if (nondefiningFunctionDeclaration != NULL)
27283 if (templateInstantiationFunctionDecl == NULL)
27285 if (nondefiningFunctionDeclaration != NULL)
27288 nondefiningFunctionDeclaration->get_declarationModifier() = functionDeclaration->get_declarationModifier();
27291 nondefiningFunctionDeclaration->get_functionModifier() = functionDeclaration->get_functionModifier();
27292 nondefiningFunctionDeclaration->get_specialFunctionModifier() = functionDeclaration->get_specialFunctionModifier();
27294 nondefiningFunctionDeclaration->set_linkage( functionDeclaration->get_linkage() );
27295 nondefiningFunctionDeclaration->set_externBrace( functionDeclaration->get_externBrace() );
27297 ROSE_ASSERT(nondefiningFunctionDeclaration->get_forward() ==
true);
27300 int file_id = functionDeclaration->
get_file_info()->get_physical_file_id();
27301 nondefiningFunctionDeclaration->
get_file_info()->set_physical_file_id(file_id);
27317 ROSE_ASSERT(nondefiningFunctionDeclaration->
get_parent() != NULL);
27323 nondefiningFunctionDeclaration = NULL;
27327 if (functionDeclaration->get_declarationModifier().get_storageModifier().
isStatic() ==
true)
27329 ROSE_ASSERT(nondefiningFunctionDeclaration->get_declarationModifier().get_storageModifier().
isStatic() ==
true);
27333 return nondefiningFunctionDeclaration;
27337std::vector<SgFunctionDeclaration*>
27349 std::vector<SgFunctionDeclaration*> functionList;
27350 FunctionDefinitionsTraversal() {}
27352 void visit (
SgNode* node)
27355 if (functionDeclaration != NULL)
27361 if (functionDeclaration == definingFunctionDeclaration)
27365 if (functionDeclarationScope != NULL)
27367 functionList.push_back(functionDeclaration);
27375 FunctionDefinitionsTraversal traversal;
27377 traversal.traverseWithinFile(node, preorder);
27379 std::vector<SgFunctionDeclaration*> & functionList = traversal.functionList;
27381 return functionList;
27388 ROSE_ASSERT(node != NULL);
27391 std::vector<SgFunctionDeclaration*>::iterator i = functionList.begin();
27393 while (i != functionList.end())
27396 ROSE_ASSERT(functionDeclaration != NULL);
27414 ROSE_ASSERT(node !=
nullptr);
27420 void visit (
SgNode* node)
27423 if (variableDeclaration != NULL)
27426 SgExpression* initializer = initializedName->get_initializer();
27428 printf (
"variableDeclaration = %p initializedName = %p = %s initializer = %p \n",
27429 variableDeclaration,initializedName,initializedName->get_name().str(),initializer);
27431 if (initializer != NULL)
27433 printf (
" --- initializer = %s \n",initializer->
class_name().c_str());
27440 CheckInitializerTraversal traversal;
27441 traversal.traverse(node, preorder);
27449 void setResult(
SgType*) { }
27451 void handle(
SgNode& n,
SgNode&) { SG_UNEXPECTED_NODE(n); }
27453 template <
class SageDeclarationStatement>
27459 setResult(n.get_type());
27462 template <
class SageNode>
27463 void handle(SageNode& n)
27476 SgGlobal * gsaf = project->get_globalScopeAcrossFiles();
27477 ROSE_ASSERT(gsaf !=
nullptr);
27479 ROSE_ASSERT(st !=
nullptr);
27481 ROSE_ASSERT(hmm !=
nullptr);
27485 ROSE_ASSERT(st !=
nullptr);
27486 hmm = st->get_table();
27487 ROSE_ASSERT(hmm !=
nullptr);
27491 ROSE_ASSERT(st !=
nullptr);
27492 hmm = st->get_table();
27493 ROSE_ASSERT(hmm !=
nullptr);
27513 int match_count = 0;
27514 ROSE_ASSERT (root);
27518 Rose_STL_Container<SgNode*> nodeList = NodeQuery::querySubTree(root, V_SgArrowExp);
27522 boost::unordered::unordered_map <SgNode*, bool> visited;
27525 for (Rose_STL_Container<SgNode *>::reverse_iterator i = nodeList.rbegin(); i != nodeList.rend(); i++)
27528 if (visited.count(*i)==1)
27537 cerr<<
"SageInterface::normalizeArrowExpWithAddressOfLeftOperand() expects SgArrowExp while encountering "<<(*i)->class_name()<<
"@"<<(*i) <<endl;
27538 ROSE_ASSERT (a_exp);
27541 if (transformationGeneratedOnly)
27549 if (
SgVarRefExp* left = isSgVarRefExp(address_op->get_operand()))
27562 return match_count;
27572 Traversal() : found(
false) {}
27573 void visit (
SgNode* node)
27575 SgCastExp* castExpression = isSgCastExp(node);
27576 if (castExpression != NULL)
27580 if (initializer == NULL)
27585 printf (
" --- Found a SgCastExp marked as a transformation: castExpression = %p \n",castExpression);
27588 printf (
"Exiting as a test! \n");
27589 ROSE_ASSERT(
false);
27595 printf (
" --- SgCastExp (but not marked as a transformation) node = %p = %s \n",node,node->
class_name().c_str());
27603 printf (
" --- SgCastExp (but from an initializer) node = %p = %s \n",node,node->
class_name().c_str());
27610 printf (
" --- node = %p = %s \n",node,node->
class_name().c_str());
27617 printf (
"In findFirstSgCastExpMarkedAsTransformation(): s = %s \n",s.c_str());
27621 Traversal traversal;
27622 traversal.traverse(n, preorder);
27625 printf (
"In findFirstSgCastExpMarkedAsTransformation(): s = %s traversal.found = %s \n",s.c_str(),traversal.found ?
"true" :
"false");
27629 if (traversal.found ==
true)
27631 printf (
"In findFirstSgCastExpMarkedAsTransformation(): returning false \n");
27636 return traversal.found;
27647 ROSE_ASSERT (info != NULL);
27648 PreprocessingInfo::DirectiveType dtype= info->getTypeOfDirective();
27649 if (dtype == PreprocessingInfo::CpreprocessorIfdefDeclaration ||
27650 dtype == PreprocessingInfo::CpreprocessorIfndefDeclaration ||
27651 dtype == PreprocessingInfo::CpreprocessorIfDeclaration )
27655 else if (dtype==PreprocessingInfo::CpreprocessorElseDeclaration||
27656 dtype==PreprocessingInfo::CpreprocessorElifDeclaration)
27660 else if (dtype==PreprocessingInfo::CpreprocessorEndifDeclaration)
27669static void moveInofListToNewPlace(AttachedPreprocessingInfoType* infoList,
int cidx, set <AttachedPreprocessingInfoType*>& relatedInfoList,
SgLocatedNode* lnode,
int &retVal)
27674 relatedInfoList.insert (infoList);
27678 info->setRelativePosition(PreprocessingInfo::after);
27685 (*infoList)[cidx]= NULL;
27692 ROSE_ASSERT(lnode);
27698 vector < pair< AttachedPreprocessingInfoType*, int> > empty_entries;
27699 for(;ast_i!=ast.
end();++ast_i) {
27701 if (current ==NULL )
27705 if (infoList == NULL)
continue;
27707 int commentIndex=0;
27708 for (Rose_STL_Container<PreprocessingInfo*>::iterator ci = (*infoList).begin(); ci != (*infoList).end(); ci++)
27714 empty_entries.push_back( make_pair (infoList, commentIndex) );
27720 for (
auto ki = empty_entries.rbegin(); ki != empty_entries.rend(); ki ++)
27722 AttachedPreprocessingInfoType* infoList = (*ki).first;
27723 int cidx= (*ki).second;
27726 ROSE_ASSERT (info==NULL);
27729 AttachedPreprocessingInfoType::iterator k = infoList->begin();
27730 infoList->erase(k+cidx);
27740static std::unordered_map <PreprocessingInfo*, SageInterface::PreprocessingInfoData> infoMap;
27745 if (current == NULL)
27751 vector<PreprocessingInfo*> afterList;
27754 AttachedPreprocessingInfoType* comments = locatedNode->getAttachedPreprocessingInfo();
27756 if (comments !=
nullptr)
27758 AttachedPreprocessingInfoType::iterator i;
27760 for (i = comments->begin (); i != comments->end (); i++)
27766 data.container=comments;
27768 data.depth = depth;
27771 if (info->getRelativePosition () == PreprocessingInfo::before
27774 infoList.push_back (info);
27775 infoMap[info] = data;
27780 else if (info->getRelativePosition () == PreprocessingInfo::after
27781 || info->getRelativePosition () == PreprocessingInfo::inside
27784 afterList.push_back (info);
27785 infoMap[info] = data;
27789 mlog[Sawyer::Message::Common::WARN] <<
"Warning: unhandled relative position value:" <<info->getRelativePosition () <<endl;
27800 for (
auto c: children)
27804 for (
auto fi : afterList)
27805 infoList.push_back(fi);
27819 ROSE_ASSERT(lnode);
27835 vector < pair< AttachedPreprocessingInfoType*, int> > keepers;
27839 unordered_map < PreprocessingInfo * , vector< pair<AttachedPreprocessingInfoType*, int>> > associated_directives;
27844 vector< pair<AttachedPreprocessingInfoType*, int>> associated_erase;
27852 vector<PreprocessingInfo*> candidateInfoList;
27857 for (
auto candidate: candidateInfoList)
27864 if (infoMap[info].depth ==0)
27867 int commentIndex = infoMap[info].index;
27868 AttachedPreprocessingInfoType* infoList = infoMap[info].container;
27871 if ( isBeginDirective(info) == 1)
27873 keepers.push_back(make_pair (infoList,commentIndex));
27876 else if (isBeginDirective(info) == 2)
27881 if (keepers.size()==0)
27882 keepers.push_back(make_pair (infoList, commentIndex));
27883 else if (isBeginDirective( (*(keepers.back().first))[keepers.back().second] )!=1 )
27885 keepers.push_back(make_pair (infoList,commentIndex));
27887 else if(isBeginDirective( (*(keepers.back().first))[keepers.back().second] )==1 )
27889 PreprocessingInfo* begin_info = (*(keepers.back().first))[keepers.back().second];
27891 associated_directives[begin_info].push_back(make_pair (infoList,commentIndex));
27895 else if ( isBeginDirective(info) == -1)
27897 bool neutralized =
false;
27899 if (keepers.size()>0)
27901 AttachedPreprocessingInfoType* comments = keepers.back().first;
27902 int idx = keepers.back().second;
27904 if(isBeginDirective( (*comments)[idx] )==1)
27906 keepers.pop_back();
27907 neutralized =
true;
27912 keepers.push_back(make_pair (infoList,commentIndex));
27920 for(;ast_i!=ast.
end();++ast_i) {
27922 if (current ==NULL )
27926 if (infoList == NULL)
continue;
27928 int commentIndex=0;
27929 for (Rose_STL_Container<PreprocessingInfo*>::iterator ci = (*infoList).begin(); ci != (*infoList).end(); ci++)
27931 ROSE_ASSERT(*ci != NULL);
27937 if ( isBeginDirective(info) == 1)
27939 keepers.push_back(make_pair (infoList,commentIndex));
27942 else if (isBeginDirective(info) == 2)
27947 if (keepers.size()==0)
27948 keepers.push_back(make_pair (infoList,commentIndex));
27949 else if (isBeginDirective( (*(keepers.back().first))[keepers.back().second] )!=1 )
27951 keepers.push_back(make_pair (infoList,commentIndex));
27953 else if(isBeginDirective( (*(keepers.back().first))[keepers.back().second] )==1 )
27955 PreprocessingInfo* begin_info = (*(keepers.back().first))[keepers.back().second];
27957 associated_directives[begin_info].push_back(make_pair (infoList,commentIndex));
27961 else if ( isBeginDirective(info) == -1)
27963 bool neutralized =
false;
27965 if (keepers.size()>0)
27967 AttachedPreprocessingInfoType* comments = keepers.back().first;
27968 int idx = keepers.back().second;
27970 if(isBeginDirective( (*comments)[idx] )==1)
27972 keepers.pop_back();
27973 neutralized =
true;
27978 keepers.push_back(make_pair (infoList,commentIndex));
27985 set <AttachedPreprocessingInfoType*> relatedInfoList;
27988 for (
auto ki = keepers.begin(); ki != keepers.end(); ki ++)
27990 AttachedPreprocessingInfoType* infoList = (*ki).first;
27991 int cidx= (*ki).second;
27993 relatedInfoList.insert (infoList);
27997 info->setRelativePosition(PreprocessingInfo::after);
28004 if (associated_directives.count (info)!=0)
28006 vector<pair<AttachedPreprocessingInfoType*,int>> a_list_vec = associated_directives[info];
28007 for (
auto vec_i = a_list_vec.rbegin(); vec_i != a_list_vec.rend(); vec_i ++ )
28009 AttachedPreprocessingInfoType* a_infoList = (*vec_i).first;
28010 int aidx= (*vec_i).second;
28011 moveInofListToNewPlace (a_infoList, aidx, relatedInfoList, lnode, retVal);
28012 associated_erase.push_back(make_pair (a_infoList, aidx));
28018 (*infoList)[cidx]= NULL;
to specify a construct using a specifier Can be used alone or with parent handles when relative speci...
virtual void * getNode() const
Get the raw IR node associated with the current abstract node.
Base class for all IR node attribute values.
Attribute Evaluator for synthesized attributes.
SynthesizedAttributeType traverse(SgNode *node)
evaluates attributes on the entire AST
Attribute storing an SgNode.
Class for traversing the AST.
void traverse(SgNode *node, Order treeTraversalOrder)
traverse the entire AST. Order defines preorder (preorder) or postorder (postorder) traversal....
void visit(SgNode *astNode)
this method is called at every traversed node.
void visit(SgNode *astNode)
visitor function for each node to collect non-builtin types' declarations
void visit(SgNode *astNode)
this method is called at every traversed node.
For preprocessing information including source comments, include , if, define, etc.
RelativePositionType
MK: Enum type to store if the directive goes before or after the corresponding line of source code.
Interface for iterating over an AST.
iterator begin()
Iterator positioned at root of subtree.
iterator end()
Iterator positioned at the end of the traversal.
const Digest & digest() override
Return the digest.
void insert(const std::string &x)
Insert data into the digest.
uint64_t make64Bits()
Returns the hash as a 64 bit int.
void visit(SgNode *node)
this method is called at every traversed node.
Interface for creating a statement whose computation writes its answer into a given variable.
A persistent attribute to represent a unique name for an expression.
SgName get_name() const override
Access function for getting name from declarations or types internally.
Base class for binary files.
SgAsmGenericHeaderList *const & get_headers() const
Property: List of all headers in file.
SgAsmInterpretationPtrList const & get_interpretations() const
Property: Interpretation list.
Represents an interpretation of a binary container.
This class represents the concept of a C Assembler statement.
This class represents the rhs of a variable declaration which includes an optional assignment (e....
void set_operand(SgExpression *exp)
This sets the rhs expression.
SgExpression * get_operand() const
Returns the rhs.
This class represents the concept of a block (not a basic block from control flow analysis).
const SgStatementPtrList & get_statements() const
Returns a const STL list by reference.
static void traverseMemoryPoolNodes(ROSE_VisitTraversal &visit)
FOR INTERNAL USE Support for visitor pattern over all IR nodes by type of IR node.
This class represents the notion of a binary operator. It is derived from a SgExpression because oper...
SgExpression * get_lhs_operand() const
returns SgExpression pointer to the lhs operand associated with this binary operator.
void set_rhs_operand(SgExpression *exp)
This function allows the p_rhs_operand pointer to be set (used internally).
void set_lhs_operand(SgExpression *exp)
This function allows the p_lhs_operand pointer to be set (used internally).
SgExpression * get_rhs_operand_i() const
returns SgExpression pointer to the operand associated with this binary operator.
SgExpression * get_lhs_operand_i() const
returns SgExpression pointer to the operand associated with this binary operator.
virtual VariantT variantT() const override
returns new style SageIII enum values
SgExpression * get_rhs_operand() const
returns SgExpression pointer to the rhs operand associated with this binary operator.
This class represents a boolean value (expression value).
This class represents the notion of a break statement (typically used in a switch statment).
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the concept of a C and C++ case option (used within a switch statement).
SgStatement * get_body() const
Returns pointer to a SgBasicBlock object.
void set_key(SgExpression *key)
Access function for pointer to SgExpression object wrapped by SgExpressionRoot in p_key_root.
void set_body(SgStatement *body)
Access function for p_body.
SgExpression * get_key() const
Returns pointer to a SgExpression object wrapped by SgExpressionRoot in p_key_root.
This class represents a cast of one type to another.
SgType * get_type() const override
unparsing support for pragmas
This class represents the concept of a catch within a try-catch construct used in C++ exception handl...
void set_body(SgStatement *body)
Access function for p_body.
SgStatement * get_body() const
Access function for p_body.
This class represents the concept of a class declaration statement. It includes the concept of an ins...
void set_scope(SgScopeStatement *scope) override
Support for setting scopes (only meaningful on IR statements that store the scope explicitly).
virtual std::string class_name() const override
returns a string representing the class name
virtual SgSymbol * get_symbol_from_symbol_table() const override
FOR INTERNAL USE Get the associated symbol from the symbol table in the stored scope....
SgScopeStatement * get_scope() const override
Returns scope of current statement.
This class represents the concept of a class definition in C++.
SgClassDeclaration * get_declaration() const
returns the class declaration associated with this class decinition.
const SgDeclarationStatementPtrList & get_members() const
Returns a const list to the data member declarations.
virtual std::string class_name() const override
returns a string representing the class name
This class represents the concept of a C++ expression built from a class name.
SgClassSymbol * get_symbol() const
Returns pointer to SgSymbol.
This class represents the concept of a class name within the compiler.
SgName get_name() const override
Access function for getting name from declarations or types internally.
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
static SgClassType * createType(SgDeclarationStatement *decl=NULL, SgExpression *optional_fortran_type_kind=NULL)
more sophisticated version for more complex types like SgClassType (types whose constructors take par...
This class represents the concept of a C trinary conditional expression (e.g. "test ?...
SgExpression * get_true_exp() const
Access function for p_true_exp.
void set_false_exp(SgExpression *false_exp)
Access function for p_false_exp.
SgExpression * get_conditional_exp() const
Access function for p_conditional_exp.
SgExpression * get_false_exp() const
Access function for p_false_exp.
void set_true_exp(SgExpression *true_exp)
Access function for p_true_exp.
void set_conditional_exp(SgExpression *conditional_exp)
Access function for p_conditional_exp.
This class represents the call of a class constructor to initialize a variable. For example "Foo foo;...
SgType * get_expression_type() const
Access function for p_expression_type, returns pointer to SgType associated with constructor.
This class represents the concept of a C or C++ continue statement.
Supporting class from copy mechanism within ROSE.
This class represents the concept of a contructor initializer list (used in constructor (member funct...
bool isFriend() const
declaration modifier is friend.
This class represents the concept of a declaration statement.
SgSymbol * search_for_symbol_from_symbol_table() const
User interface for retrieving the associated symbol from the declaration.
void set_definingDeclaration(SgDeclarationStatement *definingDeclaration)
This is an access function for the SgDeclarationStatement::p_definingDeclaration data member (see tha...
void set_firstNondefiningDeclaration(SgDeclarationStatement *firstNondefiningDeclaration)
This is an access function for the SgDeclarationStatement::p_firstNondefiningDeclaration data member ...
SgDeclarationStatement * get_definingDeclaration() const
This is an access function for the SgDeclarationStatement::p_definingDeclaration data member (see tha...
virtual VariantT variantT() const override
returns new style SageIII enum values
virtual std::string class_name() const override
returns a string representing the class name
bool isForward() const
Returns boolean value indicating if this is a forward declaration.
SgDeclarationStatement * get_firstNondefiningDeclaration() const
This is an access function for the SgDeclarationStatement::p_firstNondefiningDeclaration data member ...
virtual SgSymbol * get_symbol_from_symbol_table() const override
FOR INTERNAL USE Get the associated symbol from the symbol table in the stored scope....
bool hasAssociatedSymbol() const
Returns boolean value true of this type of declaration has an associated sysmbol.
SgName get_template_name() const
This function returns the template name (taken from the template declaration for the class,...
This class represents the concept of a C or C++ default case within a switch statement.
void set_body(SgStatement *body)
Access function for p_body.
SgStatement * get_body() const
Returns pointer to SgBasicBlock.
This class represents a directory within a projects file structure of files and directories.
This class represents the concept of a do-while statement.
SgStatement * get_condition() const
Access function for p_condition.
SgStatement * get_body() const
Access function for p_body.
void set_condition(SgStatement *condition)
Access function for p_condition.
void set_body(SgStatement *body)
Access function for p_body.
This class represents the notion of an value (expression value).
This class represents the concept of an enum declaration.
SgScopeStatement * get_scope() const override
Access function for p_scope.
SgName get_name() const
Access function for p_name.
void set_scope(SgScopeStatement *scope) override
Access function for p_scope.
const SgInitializedNamePtrList & get_enumerators() const
Access function for p_enumerators.
This class represents the concept of a C and C++ expression list.
int replace_expression(SgExpression *o, SgExpression *n) override
This class represents the base class of all the expressions within this grammar.
This class represents the concept of a C or C++ statement which contains a expression.
This class represents the notion of an expression. Expressions are derived from SgLocatedNodes,...
virtual std::string class_name() const override
returns a string representing the class name
void set_need_paren(bool need_paren)
This function allows the p_need_paren flag to be set (used internally).
virtual VariantT variantT() const override
returns new style SageIII enum values
virtual SgType * get_type() const
unparsing support for pragmas
virtual int replace_expression(SgExpression *oldChild, SgExpression *newChild)
This class represents the base class of all the expressions within this grammar.
virtual const char * sage_class_name() const override
virtual Sg_File_Info * get_file_info(void) const override
Interface function to implement original SAGE interface to SgFile_Info objects.
void set_lvalue(bool lvalue)
This function allows the p_lvalue flag to be set (used internally).
bool get_lvalue() const
Returns a bool value if the current expression is assigned to.
This class represents a source file for a project (which may contian many source files and or directo...
std::string getFileName() const
associated filename
Sg_File_Info * get_file_info() const override
Access function calling get_startOfConstruct(), provided to support older interface.
This class represents the notion of an value (expression value).
This class represents the variable declaration or variable initialization withn a for loop.
const SgStatementPtrList & get_init_stmt() const
Returns const reference to a SgStatementPtrList (typedef to a STL list).
This class represents the concept of a for loop.
SgExpression * get_test_expr() const
Access function for p_test_expr_root.
SgForInitStatement * get_for_init_stmt() const
Access function for p_for_init_stmt.
void set_loop_body(SgStatement *loop_body)
Access function for p_loop_body.
SgStatement * get_loop_body() const
Access function for p_loop_body.
void set_for_init_stmt(SgForInitStatement *for_init_stmt)
Access function for p_for_init_stmt.
This class represents the concept of a C++ function call (which is an expression).
SgFunctionSymbol * getAssociatedFunctionSymbol() const
Returns the associated function symbol, if it can be resolved statically.
SgFunctionDeclaration * getAssociatedFunctionDeclaration() const
Returns the associated function declaration, if it can be resolved statically.
virtual std::string class_name() const override
returns a string representing the class name
This class represents the concept of a function declaration statement.
SgScopeStatement * get_scope() const override
Returns scope of current statement.
virtual SgSymbol * get_symbol_from_symbol_table() const override
FOR INTERNAL USE Get the associated symbol from the symbol table in the stored scope....
bool isTemplateFunction() const
Determines if function is a template or non-template function.
void set_scope(SgScopeStatement *scope) override
Support for setting scopes (only meaningful on IR statements that store the scope explicitly).
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the concept of a scope in C++ (e.g. global scope, fuction scope,...
virtual std::string class_name() const override
returns a string representing the class name
SgBasicBlock * get_body() const
Access function for p_body.
This class represents the concept of a declaration list.
const SgInitializedNamePtrList & get_args() const
Access function for p_args.
const SgTypePtrList & get_arguments() const
Get a const list of input types (types of the parameters list) to this function type (from a cost fun...
This class represents the function being called and must be assembled in the SgFunctionCall with the ...
SgFunctionDeclaration * getAssociatedFunctionDeclaration() const
Returns the associated function declaration, if it can be resolved statically.
SgName get_name() const override
Access function for getting name from declarations or types internally.
This class represents the function type table (stores all function types so that they can be shared i...
SgSymbolTable * get_function_type_table() const
Returns pointer to SgSymbolTable used for function type symbols only.
This class represents a type for all functions.
virtual std::string class_name() const override
returns a string representing the class name
const SgTypePtrList & get_arguments() const
This is a const convience access function to the STL container of types in the child IR node (SgFunct...
virtual SgName get_mangled(void) const override
Mangled name support for unparser support.
This class represents the concept of a namespace definition.
virtual std::string class_name() const override
returns a string representing the class name
const SgDeclarationStatementPtrList & get_declarations() const
Returns a const list to the global scope declarations.
This class represents the concept of a C or C++ goto statement.
SgLabelStatement * get_label() const
Returns pointer to SgLabelStatement where control flow will be transfered during execution.
void set_label(SgLabelStatement *label)
Access function for p_label.
InheritedAttributeType traverse(SgGraphNode *basenode, SgIncidenceDirectedGraph *g, InheritedAttributeType inheritedValue, InheritedAttributeType nullInherit, SgGraphNode *endnode, bool insep=false, bool pcHk=false)
This is the function that is used by the user directly to start the algorithm.
This class represents the concept of an "if" construct.
void set_false_body(SgStatement *false_body)
Access function for p_false_body.
virtual std::string class_name() const override
returns a string representing the class name
void set_true_body(SgStatement *true_body)
Access function for p_true_body.
SgStatement * get_conditional() const
Access function for p_conditional.
SgStatement * get_true_body() const
Access function for p_true_body.
SgStatement * get_false_body() const
Access function for p_false_body.
void set_conditional(SgStatement *conditional)
Access function for p_conditional.
This class represents the notion of a declared variable.
SgName get_qualified_name() const
Returns the name with appropriate qualified names representing nested scopes.
SgSymbol * get_symbol_from_symbol_table() const
Get the associated SgSymbol from the symbol table located in the scope, without considering possible ...
virtual std::string class_name() const override
returns a string representing the class name
SgDeclarationStatement * get_declaration() const
Equal operator : it checks if all the data members are the same or point to the same objects.
This class represents the notion of an initializer for a variable declaration or expression in a func...
This class represents the concept of a C or C++ label statement.
SgName get_label() const
Returns SgName by value.
SgScopeStatement * get_scope() const override
Returns scope of current statement.
void set_scope(SgScopeStatement *scope) override
Support for setting scopes (only meaningful on IR statements that store the scope explicitly).
label_type_enum
Type of label used (fortran only)
SgName get_name() const override
Access function for getting name from declarations or types internally.
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the notion of an expression or statement which has a position within the source...
virtual std::string class_name() const override
returns a string representing the class name
virtual const char * sage_class_name() const override
Sg_File_Info * get_endOfConstruct() const override
New function interface for Sg_File_Info data stores ending location of contruct (typically the closin...
void setTransformation()
Allow IR nodes (mostly SgLocatedNode) to be marked as a transformation.
virtual void addNewAttribute(std::string s, AstAttribute *a) override
Add a new attribute represented by the named string.
void set_endOfConstruct(Sg_File_Info *endOfConstruct)
This function sets the current source location position of the end of the current construct.
Sg_File_Info * get_startOfConstruct() const override
New function interface for Sg_File_Info data stores starting location of contruct (typically the open...
void addToAttachedPreprocessingInfo(PreprocessingInfo *prepInfoPtr, PreprocessingInfo::RelativePositionType locationInList=PreprocessingInfo::after)
This function adds comment or CPP directives to the current IR node.
virtual AstAttribute * getAttribute(std::string s) const override
Returns attribute of name 's'.
void set_startOfConstruct(Sg_File_Info *startOfConstruct)
This function sets the current source location position of the start of the current construct.
bool isCompilerGenerated() const
Simple test for if this is a compiler generated node.
void insertToAttachedPreprocessingInfo(PreprocessingInfo *prepInfoPtr, PreprocessingInfo *anchorInfoPtr, bool insertAfter=true)
Insert prepInfo After (or before if last parameter is false) an anchor info ptr in the list of prepro...
virtual VariantT variantT() const override
returns new style SageIII enum values
void setOutputInCodeGeneration()
Allow IR nodes (mostly SgLocatedNode) to be marked as to when the information was unavilable in the f...
virtual Sg_File_Info * get_file_info() const override
Interface function to implement original SAGE interface to SgFile_Info objects.
bool isTransformation() const
Simple test for if this is a part of a transformation.
AttachedPreprocessingInfoType *& getAttachedPreprocessingInfo(void)
Computes the number of nodes in the defined subtree of the AST.
This class represents the notion of an value (expression value).
This class represents the concept of a member function declaration statement.
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the member function being called and must be assembled in the SgFunctionCall wi...
SgMemberFunctionDeclaration * getAssociatedMemberFunctionDeclaration() const
This is helpful in chasing down the associated declaration to this member function reference.
SgName get_name() const override
Access function for getting name from declarations or types internally.
SgTypeModifier & get_typeModifier()
Access function for modifier.
This class represents strings within the IR nodes.
virtual SgName get_name() const
Gets name of the type (useful for debugging, unparsing, etc.)
SgName get_qualified_name() const
Used for the SgNamedType object (base class for the SgClassType, SgTypedefType and the SgEnumType obj...
This class represents the concept of a C++ namespace alias declaration statement.
SgName get_name() const
Access function for p_name.
SgNamespaceDeclarationStatement * get_namespaceDeclaration() const
Access function for p_namespaceDeclaration.
This class represents the concept of a C++ namespace declaration.
virtual SgSymbol * get_symbol_from_symbol_table() const override
FOR INTERNAL USE Get the associated symbol from the symbol table in the stored scope....
SgName get_name() const
Access function for p_name.
SgNamespaceDefinitionStatement * get_definition() const
Returns pointer to SgNamespaceDefinitionStatement.
This class represents the concept of a namespace definition.
This class represents the concept of a namespace name within the compiler.
This class represents the base class for all IR nodes within Sage III.
static SgTypeTable * get_globalTypeTable()
Access function for symbol table specific to non-function types.
virtual std::vector< std::string > get_traversalSuccessorNamesContainer() const
container of names of variables or container indices used used in the traversal to access AST success...
SgNode * get_parent() const
Access function for parent node.
void set_isModified(bool isModified)
All nodes in the AST contain a isModified flag used to track changes to the AST.
virtual std::vector< SgNode * > get_traversalSuccessorContainer() const
container of pointers to AST successor nodes used in the traversal overridden in every class by gener...
virtual VariantT variantT() const
returns new style SageIII enum values
void set_parent(SgNode *parent)
All nodes in the AST contain a reference to a parent node.
virtual std::string unparseToString(SgUnparse_Info *info) const
This function unparses the AST node (excluding comments and unnecessary white space)
virtual std::string class_name() const
returns a string representing the class name
static std::map< SgNode *, std::string > & get_globalMangledNameMap()
Access function for performance optimizing global mangled name map.
virtual void checkDataMemberPointersIfInMemoryPool()
FOR INTERNAL USE This is used in internal tests to verify that all IR nodes are allocated from the he...
virtual AstAttribute * getAttribute(std::string s) const
Returns attribute of name 's'.
static SgFunctionTypeTable * get_globalFunctionTypeTable()
Access function for symbol table specific to function types.
virtual Sg_File_Info * get_file_info(void) const
File information containing filename, line number, column number, and if the SgNode is a part of a ne...
virtual bool attributeExists(std::string s) const
Tests if attribute of name 's' is present.
virtual std::vector< std::pair< SgNode *, std::string > > returnDataMemberPointers() const
FOR INTERNAL USE Returns STL vector of pairs of SgNode* and strings for use in AST tools
virtual void addNewAttribute(std::string s, AstAttribute *a)
Add a new attribute represented by the named string.
static std::map< std::string, uint64_t > & get_shortMangledNameCache()
Access function for lower level optimizing of global mangled name map.
bool get_isModified() const
Acess function for isModified flag.
SgName get_name() const override
Support for some classes which have pure virtual function in base classes.
This class represents the concept of a C Assembler statement (untested).
Sg_File_Info * get_startOfConstruct() const override
New function interface for Sg_File_Info data stores starting location of contruct (typically the open...
This class represents a source project, with a list of SgFile objects and global information about th...
std::vector< std::string > getAbsolutePathFileNames() const
This function generates a list of files resolved to absolute paths (symbolic links should not be reso...
static void visitRepresentativeNode(ROSE_VisitTraversal &visit)
FOR INTERNAL USE Support for type-based traversal.
static int get_verbose(void)
DQ: Modified to accept a value on the command line (no longer a boolean variable) value of 0 means qu...
This class represents a OLD concept of the structure require for qualified names when they were in th...
This class represents the concept of a C Assembler statement (untested).
This class represents the concept of a scope in C++ (e.g. global scope, fuction scope,...
bool supportsDefiningFunctionDeclaration()
Reports if scope can support defining function declarations. Not all scopes permit function declarati...
const SgStatementPtrList generateStatementList() const
Generate s list of statements from either the existing list of statements or the list of declarations...
bool isNamedScope()
Some scopes have associated names for purposed of name qualification. This returns true if the scope ...
SgSymbolTable * get_symbol_table() const
Returns a pointer to the locally strored SgSymbolTable.
virtual const char * sage_class_name() const override
SgDeclarationStatementPtrList & getDeclarationList()
Gets reference to internal STL list of pointers to SgDeclarationStatement objects (only defined for s...
SgStatementPtrList & getStatementList()
Gets reference to internal STL list of pointers to SgStatement objects (only defined for scopes conta...
void append_statement(SgStatement *stmt)
Higher level function to handle statements and declarations is scopes.
void set_symbol_table(SgSymbolTable *symbol_table)
Sets the pointer to the locally strored SgSymbolTable.
virtual std::string class_name() const override
returns a string representing the class name
bool statementExistsInScope(SgStatement *statement)
Test for existence of statement is scope.
bool containsOnlyDeclarations() const
This function is used to indicate if either the getDeclarationList() or getStatementList() can be cal...
void insert_symbol(const SgName &n, SgSymbol *s)
Puts a SgSymbol object into the local symbol table.
virtual VariantT variantT() const override
returns new style SageIII enum values
virtual SgName get_qualified_name() const
Returns SgName (a string) representing the name of the current scope.
This class represents the "sizeof()" operator (applied to any type).
static void traverseMemoryPoolNodes(ROSE_VisitTraversal &visit)
FOR INTERNAL USE Support for visitor pattern over all IR nodes by type of IR node.
This class represents the notion of a statement.
virtual std::string class_name() const override
returns a string representing the class name
void insert_statement(SgStatement *target, SgStatement *newstmt, bool inFront=true)
This function inserts a single statement at the position indicated by target.
virtual void set_scope(SgScopeStatement *newScope)
Support for setting scopes (only meaningful on IR statements that store the scope explicitly).
virtual bool hasExplicitScope() const
Support for where the scope is explicitly required.
virtual SgSymbol * get_symbol_from_symbol_table() const
Get the associated symbol from the symbol table in the stored scope.
virtual SgScopeStatement * get_scope(void) const
Returns scope of current statement.
void remove_statement(SgStatement *)
This function removes the target statement from the AST.
virtual std::vector< SgNode * > get_traversalSuccessorContainer() const override
container of pointers to AST successor nodes used in the traversal overridden in every class by gener...
void replace_statement(SgStatement *target, SgStatement *newstmt)
This function replaces the target statement with a single statement.
virtual VariantT variantT() const override
returns new style SageIII enum values
bool isStatic() const
Storage modifier is static (always false for the SgStorageModifier in the SgInitializedName).
This class represents the base class of a numbr of IR nodes that don't otherwise fit into the existin...
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the concept of a switch.
void set_item_selector(SgStatement *item_selector)
Access function for p_item_selector.
SgStatement * get_body() const
Access function for p_body.
SgStatement * get_item_selector() const
Access function for p_item_selector_root.
void set_body(SgStatement *body)
Access function for p_body.
This class represents the symbol tables used in both SgScopeStatement and the SgFunctionTypeSymbolTab...
std::set< SgNode * > get_symbols() const
Complexity O(n)
void print(std::string label, VariantT nodeType=V_SgSymbol)
Outputs symbol table information (useful for debugging)
int size() const
Computes the number of symbols in the symbol table (forced to count them, I think,...
void remove(const SgSymbol *symbol)
Complexity O(n)
This class represents the concept of a name within the compiler.
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
virtual SgName get_name() const =0
Access function for getting name from declarations or types internally.
virtual SgType * get_type() const =0
This function returns the type associated with the named entity.
This class represents template argument within the use of a template to build an instantiation.
SgExpression * get_expression() const
This function returns argumentExpression.
SgType * get_type() const
This function returns argumentType.
SgTemplateArgument::template_argument_enum get_argumentType() const
This function returns argumentType.
@ template_template_argument
@ start_of_pack_expansion_argument
This class represents the concept of a template declaration.
SgName get_string() const
Returns stringified template declaration.
virtual std::string class_name() const override
returns a string representing the class name
SgName get_name() const
Returns name of template declaration.
SgScopeStatement * get_scope() const override
Returns scope of current statement.
virtual SgSymbol * get_symbol_from_symbol_table() const override
FOR INTERNAL USE Get the associated symbol from the symbol table in the stored scope....
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the concept of an instantiated class template.
virtual std::string class_name() const override
returns a string representing the class name
virtual SgSymbol * get_symbol_from_symbol_table() const override
FOR INTERNAL USE Get the associated symbol from the symbol table in the stored scope....
SgName get_templateName() const
Returns name of class template, the name excludes template arguments.
SgTemplateClassDeclaration * get_templateDeclaration() const
Returns pointer to SgTemplateDeclaration from which instantiation is generated.
This class represents the concept of a class definition in C++.
This class represents the concept of a C++ template instantiation directive.
SgDeclarationStatement * get_declaration() const
Returns pointer to SgDeclarationStatement.
This class represents the concept of an instantiation of function template.
virtual std::string class_name() const override
returns a string representing the class name
const SgTemplateArgumentPtrList & get_templateArguments() const
Returns pointer to STL list of pointers to SgTemplateArgument objects.
SgTemplateFunctionDeclaration * get_templateDeclaration() const
Returns pointer to SgTemplateDeclaration from which instantiation is generated.
SgName get_templateName() const
Returns name of instantiated function template, name includes template arguments.
This class represents the concept of an instantiation of member function template or a member functio...
virtual std::string class_name() const override
returns a string representing the class name
const SgTemplateArgumentPtrList & get_templateArguments() const
Returns pointer to STL list of pointers to SgTemplateArgument objects.
SgName get_templateName() const
Returns name of instantiated function template, name includes template arguments.
SgTemplateMemberFunctionDeclaration * get_templateDeclaration() const
Returns pointer to SgTemplateDeclaration from which instantiation is generated.
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the "this" operator (can be applied to any member data).
Supporting class for "Deep" copies of the AST.
static SgTypeBool * createType(SgExpression *optional_fortran_type_kind=nullptr)
example of type used where construction is particularly simple
static SgTypeInt * createType(int sz=0, SgExpression *optional_fortran_type_kind=NULL)
more sophisticated version for more complex types like SgTypeInt (types whose constructors take param...
static SgTypeUnknown * createType(SgExpression *optional_fortran_type_kind=nullptr)
example of type used where construction is particularly simple
static SgTypeVoid * createType(SgExpression *optional_fortran_type_kind=nullptr)
example of type used where construction is particularly simple
This class represents the base class for all types.
std::vector< SgType * > getInternalTypes() const
Generate a container of types hidden in the input type.
SgType * stripType(unsigned char bit_array=STRIP_MODIFIER_TYPE|STRIP_REFERENCE_TYPE|STRIP_RVALUE_REFERENCE_TYPE|STRIP_POINTER_TYPE|STRIP_ARRAY_TYPE|STRIP_TYPEDEF_TYPE|STRIP_POINTER_MEMBER_TYPE) const
Returns hidden type beneath layers of typedefs, pointers, references, modifiers, array representation...
virtual std::string class_name() const override
returns a string representing the class name
virtual VariantT variantT() const override
returns new style SageIII enum values
This class represents the notion of a typedef declaration.
SgScopeStatement * get_scope() const override
Returns scope of current statement.
virtual SgSymbol * get_symbol_from_symbol_table() const override
FOR INTERNAL USE Get the associated symbol from the symbol table in the stored scope....
SgDeclarationStatement * get_baseTypeDefiningDeclaration() const
Returns the defining declaration if get_typedefBaseTypeContainsDefiningDeclaration() is true,...
void set_scope(SgScopeStatement *scope) override
Support for setting scopes (only meaningful on IR statements that store the scope explicitly).
SgType * get_base_type() const
This is used in the SgTypedefType object (is not associated with a base_type data field)
void set_operand_i(SgExpression *operand_i)
This function allows the p_operand_i pointer to be set (used internally).
SgExpression * get_operand() const
returns SgExpression pointer to the operand associated with this unary operator.
This class represents the concept of a C++ using declaration.
SgDeclarationStatement * get_declaration() const
Access function for p_declaration.
SgInitializedName * get_initializedName() const
Access function for p_initializedName.
This class represents the concept of a C++ using directive.
SgNamespaceDeclarationStatement * get_namespaceDeclaration() const
Access function for p_namespaceDeclaration.
This class represents the notion of an value (expression value).
virtual VariantT variantT() const override
returns new style SageIII enum values
virtual std::string class_name() const override
returns a string representing the class name
This class represents the variable refernece in expressions.
static void traverseMemoryPoolNodes(ROSE_VisitTraversal &visit)
FOR INTERNAL USE Support for visitor pattern over all IR nodes by type of IR node.
This class represents the concept of a C or C++ variable declaration.
const SgInitializedNamePtrList & get_variables() const
Access function for p_variables.
SgDeclarationStatement * get_baseTypeDefiningDeclaration() const
Returns the defining declaration if get_variableDeclarationContainsBaseTypeDefiningDeclaration() is t...
bool get_variableDeclarationContainsBaseTypeDefiningDeclaration() const
Access function for p_variableDeclarationContainsBaseTypeDefiningDeclaration.
This class represents the definition (initialization) of a variable.
SgInitializedName * get_vardefn() const
Access function for SgInitializedName stored in p_vardefn.
This class represents the concept of a variable name within the compiler (a shared container for the ...
virtual std::string class_name() const override
returns a string representing the class name
SgName get_name() const override
Access function for getting name from declarations or types internally.
This class represents the concept of a do-while statement.
SgStatement * get_condition() const
Access function for p_condition.
void set_condition(SgStatement *condition)
Access function for p_condition.
SgStatement * get_body() const
Access function for p_body.
void set_body(SgStatement *body)
Access function for p_body.
This class represents the location of the code associated with the IR node in the original source cod...
void setTransformation()
Marks an IR node to be a transformation if it is not one already.
const char * get_filename() const
Returns filename of source code associated with IR node.
bool isOutputInCodeGeneration() const
Returns true only if required to be unparsed in generated code.
int get_line() const
Returns the line number of the associated code for this IR node.
bool isCompilerGenerated() const
Returns true only if compiler generated (either by the front-end or by ROSE).
int get_col() const
Returns the column number of the associated code for this IR node.
static Sg_File_Info * generateDefaultFileInfoForTransformationNode()
Static function to return new Sg_File_Info object set to default values appropriate for transformatio...
bool isTransformation() const
Access function for classification bit field.
bool isShared() const
Returns true only if shared internally (either by the front-end or by ROSE).
static Sg_File_Info * generateDefaultFileInfo()
Static function to return new Sg_File_Info object set to default values.
void setOutputInCodeGeneration()
Marks IR node as compiler generated but required in the generated source (e.g. requied templates).
Hash table support for symbol tables within ROSE.
ROSE_DLL_API abstract_handle * buildAbstractHandle(SgNode *snode)
A default builder function handles all details: file use name, others use numbering
ROSE_DLL_API std::vector< std::string > generateSourceFilenames(std::vector< std::string > argList, bool binaryMode)
Build the list of isolated file names from the command line.
ROSE_UTIL_API void removeAllFileNamesExcept(std::vector< std::string > &argv, std::vector< std::string > filenameList, std::string exceptFilename)
Remove file names specified in filenameList from argv, except for 'exceptFilename'.
void edgePointerReplacement(replacement_map_t const &)
For all nodes in the memory pool, it looks for the edges in the replacement map. If a match is found ...
ROSE_DLL_API std::string toBase62String(uint64_t num)
Converts a 64 bit in to base 62 (All letters and numbers).
ROSE_DLL_API Sawyer::Message::Facility mlog
Diagnostic facility for the ROSE library as a whole.
void serialize(std::ostream &output, Graph &graph)
Serialize a graph into a stream of bytes.
ROSE_UTIL_API std::string stripFileSuffixFromFileName(const std::string &fileNameWithSuffix)
Get the file name without the ".suffix".
ROSE_UTIL_API std::string numberToString(long long)
Convert an integer to a string.
ROSE_UTIL_API std::string copyEdit(const std::string &inputString, const std::string &oldToken, const std::string &newToken)
Replace all occurrences of a string with another string.
ROSE_UTIL_API std::string stripPathFromFileName(const std::string &fileNameWithPath)
Returns the last component of a path in a filesystem.
SgStatement * getPreviousStatement(SgStatement *targetStatement, bool climbOutScope=true)
Functions to move to SgStatement object in SAGE III later.
Functions that build an AST.
ROSE_DLL_API SgAddOp * buildAddOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgFunctionDeclaration * buildNondefiningFunctionDeclaration(const SgName &name, SgType *return_type, SgFunctionParameterList *parlist, SgScopeStatement *scope=NULL, SgExprListExp *decoratorList=NULL, bool buildTemplateInstantiation=false, SgTemplateArgumentPtrList *templateArgumentsList=NULL, SgStorageModifier::storage_modifier_enum sm=SgStorageModifier::e_default)
Build a prototype for a function, handle function type, symbol etc transparently.
SourcePositionClassification
intended to be a private member, don't access it directly. could be changed any time
@ e_sourcePosition_last
Specify as source position to be filled in as part of AST construction in the front-end.
@ e_sourcePositionNullPointers
Classify as compiler generated code (e.g. template instantiation).
@ e_sourcePositionCompilerGenerated
Classify as a transformation.
@ e_sourcePositionFrontendConstruction
Set pointers to Sg_File_Info objects to NULL.
@ e_sourcePositionDefault
Error value for enum.
@ e_sourcePositionTransformation
Default source position.
ROSE_DLL_API SgPragma * buildPragma(const std::string &name)
Build SgPragma.
ROSE_DLL_API SourcePositionClassification getSourcePositionClassificationMode()
Get the current source position classification (defines how IR nodes built by the SageBuilder interfa...
ROSE_DLL_API SgEqualityOp * buildEqualityOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgTemplateMemberFunctionDeclaration * buildNondefiningTemplateMemberFunctionDeclaration(const SgName &name, SgType *return_type, SgFunctionParameterList *parlist, SgScopeStatement *scope, SgExprListExp *decoratorList, unsigned int functionConstVolatileFlags, SgTemplateParameterPtrList *templateParameterList)
Build a variable declaration, handle symbol table transparently.
ROSE_DLL_API SgLabelStatement * buildLabelStatement(const SgName &name, SgStatement *stmt=NULL, SgScopeStatement *scope=NULL)
Build a label statement, name is the label's name. Handling label symbol and scope internally.
ROSE_DLL_API SgAddressOfOp * buildAddressOfOp(SgExpression *op=NULL)
ROSE_DLL_API SgTemplateFunctionDeclaration * buildNondefiningTemplateFunctionDeclaration(const SgName &name, SgType *return_type, SgFunctionParameterList *parlist, SgScopeStatement *scope=NULL, SgExprListExp *decoratorList=NULL, SgTemplateParameterPtrList *templateParameterList=NULL)
Build a variable declaration, handle symbol table transparently.
ROSE_DLL_API SgMultiplyOp * buildMultiplyOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgGotoStatement * buildGotoStatement(SgLabelStatement *label=NULL)
Build a goto statement.
ROSE_DLL_API std::string display(SourcePositionClassification &scp)
display function for debugging
ROSE_DLL_API SgLabelRefExp * buildLabelRefExp(SgLabelSymbol *s)
Build a Fortran numeric label ref exp.
ROSE_DLL_API SgLessOrEqualOp * buildLessOrEqualOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgSubtractOp * buildSubtractOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgMemberFunctionType * buildMemberFunctionType(SgType *return_type, SgFunctionParameterTypeList *typeList, SgScopeStatement *struct_name, unsigned int mfunc_specifier)
Built in simple types.
ROSE_DLL_API SgWhileStmt * buildWhileStmt(SgStatement *condition, SgStatement *body, SgStatement *else_body=NULL)
Build while statement.
ROSE_DLL_API SgForStatement * buildForStatement(SgStatement *initialize_stmt, SgStatement *test, SgExpression *increment, SgStatement *loop_body, SgStatement *else_body=NULL)
Build a for statement, assume none of the arguments is NULL.
ROSE_DLL_API SgEmptyDeclaration * buildEmptyDeclaration()
Build an empty declaration (useful for adding precission to comments and CPP handling under token-bas...
ROSE_DLL_API SgConditionalExp * buildConditionalExp(SgExpression *test=NULL, SgExpression *a=NULL, SgExpression *b=NULL)
Build a conditional expression ?:
ROSE_DLL_API SgTypeInt * buildIntType()
Built in simple types.
SourcePositionClassification SourcePositionClassificationMode
C++ SageBuilder namespace specific state for storage of the source code position state (used to contr...
ROSE_DLL_API SgMinusOp * buildMinusOp(SgExpression *op=NULL)
ROSE_DLL_API SgExprListExp * buildExprListExp(SgExpression *expr1=NULL, SgExpression *expr2=NULL, SgExpression *expr3=NULL, SgExpression *expr4=NULL, SgExpression *expr5=NULL, SgExpression *expr6=NULL, SgExpression *expr7=NULL, SgExpression *expr8=NULL, SgExpression *expr9=NULL, SgExpression *expr10=NULL)
Build a SgExprListExp, used for function call parameter list etc.
ROSE_DLL_API SgPlusAssignOp * buildPlusAssignOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgVarRefExp * buildVarRefExp(const SgName &name, SgScopeStatement *scope=NULL)
Build SgVarRefExp based on a variable's Sage name. It will lookup the name in the symbol table intern...
bool symbol_table_case_insensitive_semantics
Support for construction of case sensitive/insensitive symbol table handling in scopes.
ROSE_DLL_API SgDotExp * buildDotExp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgAssignInitializer * buildAssignInitializer(SgExpression *operand_i=NULL, SgType *expression_type=NULL)
Build the rhs of a variable declaration which includes an assignment.
ROSE_DLL_API SgArrayType * getUniqueJavaArrayType(SgType *, int)
Build a SgFile node and attach it to SgProject.
ROSE_DLL_API SgVariableDeclaration * buildVariableDeclaration(const SgName &name, SgType *type, SgInitializer *varInit=NULL, SgScopeStatement *scope=NULL)
Build a variable declaration, handle symbol table transparently.
ROSE_DLL_API SgScopeStatement * topScopeStack()
intended to be a private member, don't access it directly. could be changed any time
ROSE_DLL_API SgNullExpression * buildNullExpression()
Build a null expression, set file info as the default one.
ROSE_DLL_API SgGreaterOrEqualOp * buildGreaterOrEqualOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgReferenceType * buildReferenceType(SgType *base_type=nullptr)
Build a reference type.
ROSE_DLL_API SgExprStatement * buildExprStatement(SgExpression *exp=NULL)
Build a SgExprStatement, set File_Info automatically.
ROSE_DLL_API SgIfStmt * buildIfStmt(SgStatement *conditional, SgStatement *true_body, SgStatement *false_body)
Build if statement.
ROSE_DLL_API SgFunctionParameterList * buildFunctionParameterList(SgInitializedName *in1=NULL, SgInitializedName *in2=NULL, SgInitializedName *in3=NULL, SgInitializedName *in4=NULL, SgInitializedName *in5=NULL, SgInitializedName *in6=NULL, SgInitializedName *in7=NULL, SgInitializedName *in8=NULL, SgInitializedName *in9=NULL, SgInitializedName *in10=NULL)
Build an empty SgFunctionParameterList, possibly with some initialized names filled in.
ROSE_DLL_API SgPointerDerefExp * buildPointerDerefExp(SgExpression *op=NULL)
ROSE_DLL_API SgTypeBool * buildBoolType()
Built in simple types.
ROSE_DLL_API SgAssignOp * buildAssignOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgPointerType * buildPointerType(SgType *base_type=nullptr)
Build a pointer type.
ROSE_DLL_API SgBoolValExp * buildBoolValExp(int value=0)
Build a bool value expression, the name convention of SgBoolValExp is little different from others fo...
ROSE_DLL_API SgName appendTemplateArgumentsToName(const SgName &name, const SgTemplateArgumentPtrList &templateArgumentsList)
DQ (7/27/2012): changed semantics from removing the template arguments in names to adding the templat...
ROSE_DLL_API SgFunctionParameterTypeList * buildFunctionParameterTypeList(SgFunctionParameterList *paralist)
Build SgFunctionParameterTypeList from SgFunctionParameterList.
ROSE_DLL_API SgLessThanOp * buildLessThanOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgCastExp * buildCastExp(SgExpression *operand_i=NULL, SgType *expression_type=NULL, SgCastExp::cast_type_enum cast_type=SgCastExp::e_C_style_cast)
Build a type casting expression.
ROSE_DLL_API SgMinusAssignOp * buildMinusAssignOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgDivideOp * buildDivideOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgBasicBlock * buildBasicBlock(SgStatement *stmt1=NULL, SgStatement *stmt2=NULL, SgStatement *stmt3=NULL, SgStatement *stmt4=NULL, SgStatement *stmt5=NULL, SgStatement *stmt6=NULL, SgStatement *stmt7=NULL, SgStatement *stmt8=NULL, SgStatement *stmt9=NULL, SgStatement *stmt10=NULL)
Build a SgBasicBlock, setting file info internally.
ROSE_DLL_API SgModOp * buildModOp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgExprStatement * buildAssignStatement(SgExpression *lhs, SgExpression *rhs)
Build an assignment statement from lefthand operand and right hand operand.
ROSE_DLL_API SgMemberFunctionDeclaration * buildNondefiningMemberFunctionDeclaration(const SgName &name, SgType *return_type, SgFunctionParameterList *parlist, SgScopeStatement *scope, SgExprListExp *decoratorList, unsigned int functionConstVolatileFlags, bool buildTemplateInstantiation, SgTemplateArgumentPtrList *templateArgumentsList)
Build a prototype member function declaration.
ROSE_DLL_API SgMemberFunctionDeclaration * buildDefaultConstructor(SgClassType *classType)
Build a variable declaration, handle symbol table transparently.
ROSE_DLL_API SgCommaOpExp * buildCommaOpExp(SgExpression *lhs=NULL, SgExpression *rhs=NULL)
ROSE_DLL_API SgIntVal * buildIntVal(int value=0)
Build an integer value expression.
SgDeclarationStatement * associatedDeclaration(const SgSymbol &n)
returns the associated declaration for symbol n or nullptr if there is none.
Functions that are useful when operating on the AST.
ROSE_DLL_API void checkSgNodePointers()
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API bool isLastStatement(SgStatement *stmt)
Check if a statement is the last statement within its closed scope.
ROSE_DLL_API bool isUnionDeclaration(SgNode *node)
Check if a SgNode is a declaration for a union.
ROSE_DLL_API void translateScopeToUseCppDeclarations(SgScopeStatement *scope)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
void initializeIfStmt(SgIfStmt *ifstmt, SgStatement *conditional, SgStatement *true_body, SgStatement *false_body)
Support function used for variable declarations in conditionals.
ROSE_DLL_API void deepDelete(SgNode *root)
Deep delete a sub AST tree. It uses postorder traversal to delete each child node....
void annotateExpressionsWithUniqueNames(SgProject *project)
Generate unique names for expressions and attach the names as persistent attributes ("UniqueNameAttri...
ROSE_DLL_API bool hasMultipleInitStatmentsOrExpressions(SgForStatement *for_loop)
Check if a for loop uses C99 style initialization statement with multiple expressions like for (int i...
ROSE_DLL_API void fixNamespaceDeclaration(SgNamespaceDeclarationStatement *structDecl, SgScopeStatement *scope)
Fix symbols, parent and scope pointers. Used internally within appendStatment(), insertStatement() et...
void serialize(SgNode *node, std::string &prefix, bool hasRemaining, std::ostringstream &out, std::string &edgeLabel)
we have two serialize() functions, one for a single node, the other for a list of pointers
ROSE_DLL_API void deleteExpressionTreeWithOriginalExpressionSubtrees(SgNode *root)
Special purpose function for deleting AST expression tress containing valid original expression trees...
void setSourcePositionAsTransformation(SgNode *node)
DQ (5/1/2012): New function with improved name.
ROSE_DLL_API void insertStatementList(SgStatement *targetStmt, const std::vector< SgStatement * > &newStmts, bool insertBefore=true)
Insert a list of statements before or after the target statement within the.
void whereAmI(SgNode *node)
Diagnostic function for tracing back through the parent list to understand at runtime where in the AS...
ROSE_DLL_API SgStatement * getLastStatement(SgScopeStatement *scope)
get the last statement within a scope, return NULL if it does not exit
ROSE_DLL_API void addStepToLoopBody(SgScopeStatement *loopStmt, SgStatement *step)
Add a step statement to the end of a loop body Add a new label to the end of the loop,...
ROSE_DLL_API bool is_UPC_dynamic_threads()
ROSE_DLL_API SgFunctionDeclaration * getFunctionDeclaration(SgFunctionCallExp *functionCallExp)
Find a node by type using upward traversal.
ROSE_DLL_API bool is_mixed_Fortran_and_C_language()
ROSE_DLL_API void addTextForUnparser(SgNode *astNode, std::string s, AstUnparseAttribute::RelativePositionType inputlocation)
Add a string to be unparsed to support code generation for back-end specific tools or compilers.
ROSE_DLL_API std::string getTempDirectory(SgProject *project)
Create a temporary directory if it does not yet exist and return its name.
ROSE_DLL_API void displayScope(SgScopeStatement *scope)
Find a node by type using upward traversal.
ROSE_DLL_API bool is_Jovial_language()
ROSE_DLL_API SgMemberFunctionDeclaration * findJavaMain(SgClassDefinition *)
Find a main method in a Java class.
ROSE_DLL_API bool is_Cxx_language()
void resetScopeNumbers(SgFunctionDefinition *functionDeclaration)
Assigns unique numbers to each SgScopeStatement of a function.
ROSE_DLL_API SgFunctionDeclaration * replaceDefiningFunctionDeclarationWithFunctionPrototype(SgFunctionDeclaration *functionDeclaration)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API bool hasSameGlobalScope(SgStatement *statement_1, SgStatement *statement_2)
This is supporting the recognition of functions in header files from two different ASTs.
SgCommaOpExp * insertBeforeUsingCommaOp(SgExpression *new_exp, SgExpression *anchor_exp)
Insert an expression (new_exp )before another expression (anchor_exp) has possible side effects,...
ROSE_DLL_API void fixFunctionDeclaration(SgFunctionDeclaration *stmt, SgScopeStatement *scope)
Fix the symbol table and set scope (only if scope in declaration is not already set).
ROSE_DLL_API std::string preprocessImport(SgProject *, std::string)
Using the import_string parameter, create a file with the relevant import statement; translate the fi...
ROSE_DLL_API bool collectReadWriteRefs(SgStatement *stmt, std::vector< SgNode * > &readRefs, std::vector< SgNode * > &writeRefs, bool useCachedDefUse=false)
Collect all read and write references within stmt, which can be a function, a scope statement,...
ROSE_DLL_API void prependStatementList(const std::vector< SgStatement * > &stmt, SgScopeStatement *scope=NULL)
prepend a list of statements to the beginning of the current scope, handling side effects as appropri...
ROSE_DLL_API SgInitializer * getInitializerOfExpression(SgExpression *n)
Get the initializer containing an expression if it is within an initializer.
ROSE_DLL_API std::vector< SgInitializedName * > getInParameters(const SgInitializedNamePtrList ¶ms)
Get a vector of Jovial input parameters from the function parameter list (may work for Fortran in the...
ROSE_DLL_API bool language_may_contain_nondeclarations_in_scope()
ROSE_DLL_API std::set< SgStatement * > collectTransformedStatements(SgNode *node)
This collects the statements that are marked as transformed (useful in debugging).
ROSE_DLL_API void cleanupNontransformedBasicBlockNode()
Remove unused basic block IR nodes added as part of normalization.
ROSE_DLL_API bool skipTranslateToUseCppDeclaration(PreprocessingInfo *currentPreprocessingInfo)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API AbstractHandle::abstract_handle * buildAbstractHandle(SgNode *)
Build an abstract handle from an AST node, reuse previously built handle when possible.
ROSE_DLL_API void insertStatementListBefore(SgStatement *targetStmt, const std::vector< SgStatement * > &newStmts)
Insert a list of statements before a target statement.
ROSE_DLL_API void fixStructDeclaration(SgClassDeclaration *structDecl, SgScopeStatement *scope)
Fix symbols, parent and scope pointers. Used internally within appendStatment(), insertStatement() et...
void recursivePrintCurrentAndParent(SgNode *n)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API void appendExpressionList(SgExprListExp *, const std::vector< SgExpression * > &)
Append an expression list to a SgExprListExp, set the parent pointers also.
ROSE_DLL_API void collectReadOnlySymbols(SgStatement *stmt, std::set< SgVariableSymbol * > &readOnlySymbols, bool coarseGrain=true)
Collect read only variable symbols within a statement. The statement can be either of a function,...
bool isOverloaded(SgFunctionDeclaration *functionDeclaration)
Return true if function is overloaded.
ROSE_DLL_API int set_name(SgInitializedName *initializedNameNode, SgName new_name)
set_name of symbol in symbol table.
ROSE_DLL_API SgClassDefinition * findOrInsertJavaPackage(SgProject *, std::string, bool create_directory=false)
Process a qualified package name, if needed, and return its package definition.
ROSE_DLL_API SgClassDeclaration * findOrImportJavaClass(SgProject *, SgClassDefinition *package_definition, std::string)
If the class_name already exists in the scope, return it.
ROSE_DLL_API SgVariableSymbol * getFirstVarSym(SgVariableDeclaration *decl)
Get the variable symbol for the first initialized name of a declaration stmt.
ROSE_DLL_API bool templateArgumentEquivalence(SgTemplateArgument *arg1, SgTemplateArgument *arg2)
Verify that 2 SgTemplateArgument are equivalent (same type, same expression, or same template declara...
ROSE_DLL_API SgFunctionDeclaration * findFirstDefiningFunctionDecl(SgScopeStatement *scope)
Find the first defining function declaration statement in a scope.
ROSE_DLL_API bool is_Jvm_language()
void addMessageStatement(SgStatement *stmt, std::string message)
Function to add "C" style comment to statement.
ROSE_DLL_API bool isLoopIndexVariable(SgInitializedName *ivar, SgNode *subtree_root)
Check if a SgInitializedName is used as a loop index within a AST subtree This function will use a bo...
SgInitializedName & getFirstVariable(SgVariableDeclaration &vardecl)
convenience function that returns the first initialized name in a list of variable declarations.
void initializeSwitchStatement(SgSwitchStatement *switchStatement, SgStatement *item_selector, SgStatement *body)
Support function used for variable declarations in conditionals.
SgExprListExp * loopCollapsing(SgForStatement *target_loop, size_t collapsing_factor)
Add a step statement to the end of a loop body Add a new label to the end of the loop,...
ROSE_DLL_API void fixStatement(SgStatement *stmt, SgScopeStatement *scope)
A wrapper containing fixes (fixVariableDeclaration(),fixStructDeclaration(), fixLabelStatement(),...
ROSE_DLL_API SgStatement * copyStatement(SgStatement *s)
Deep copy a statement.
ROSE_DLL_API int eraseNullPreprocessingInfo(SgLocatedNode *lnode)
Dumps a located node's preprocessing information.
ROSE_DLL_API bool isCanonicalDoLoop(SgFortranDo *loop, SgInitializedName **ivar, SgExpression **lb, SgExpression **ub, SgExpression **step, SgStatement **body, bool *hasIncrementalIterationSpace, bool *isInclusiveUpperBound)
Check if a Fortran Do loop has a complete canonical form: Do I=1, 10, 1.
SgCommaOpExp * insertAfterUsingCommaOp(SgExpression *new_exp, SgExpression *anchor_exp, SgStatement **temp_decl=NULL, SgVarRefExp **temp_ref=NULL)
Insert an expression (new_exp ) after another expression (anchor_exp) has possible side effects,...
ROSE_DLL_API SgTemplateVariableSymbol * lookupTemplateVariableSymbolInParentScopes(const SgName &name, SgTemplateParameterPtrList *tplparams, SgTemplateArgumentPtrList *tplargs, SgScopeStatement *currentScope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API void moveUpPreprocessingInfo(SgStatement *stmt_dst, SgStatement *stmt_src, PreprocessingInfo::RelativePositionType src_position=PreprocessingInfo::undef, PreprocessingInfo::RelativePositionType dst_position=PreprocessingInfo::undef, bool usePrepend=false)
Identical to movePreprocessingInfo(), except for the stale name and confusing order of parameters....
ROSE_DLL_API SgStatement * lastStatementOfScopeWithTokenInfo(SgScopeStatement *scope, std::map< SgNode *, TokenStreamSequenceToNodeMapping * > &tokenStreamSequenceMap)
Used to support token unparsing (when the output the trailing token sequence).
ROSE_DLL_API void cutPreprocessingInfo(SgLocatedNode *src_node, PreprocessingInfo::RelativePositionType pos, AttachedPreprocessingInfoType &save_buf)
Cut preprocessing information from a source node and save it into a buffer. Used in combination of pa...
ROSE_DLL_API bool normalizeForLoopTest(SgForStatement *loop)
Normalize a for loop's test expression i<x is normalized to i<= (x-1) and i>x is normalized to i>= (x...
bool declarationPreceedsDefinition(SgDeclarationStatement *nonDefiningDeclaration, SgDeclarationStatement *definingDeclaration)
Check if a defining declaration comes before of after the non-defining declaration.
ROSE_DLL_API bool isSameFunction(SgFunctionDeclaration *func1, SgFunctionDeclaration *func2)
Check if two function declarations refer to the same one. Two function declarations are the same when...
std::vector< SgVariableSymbol * > getSymbolsUsedInExpression(SgExpression *expr)
Find referenced symbols within an expression.
ROSE_DLL_API bool isStructDeclaration(SgNode *node)
Check if a SgNode is a declaration for a structure.
ROSE_DLL_API void moveVariableDeclaration(SgVariableDeclaration *decl, SgScopeStatement *target_scope)
Move a variable declaration to a new scope, handle symbol, special scopes like For loop,...
ROSE_DLL_API std::string preprocessPackage(SgProject *, std::string)
Using the package_name, create a file with a package statement, translate it in order to load the pac...
ROSE_DLL_API void setOneSourcePositionForTransformation(SgNode *root)
Set current node's source position as transformation generated.
NodeType * deepCopy(const NodeType *subtree)
A template function for deep copying a subtree. It is also used to create deepcopy functions with spe...
void clearMangledNameCache(SgGlobal *globalScope)
Support for faster mangled name generation (caching avoids recomputation).
std::vector< SgStatement * > getSwitchCases(SgSwitchStatement *sw)
Query a subtree to get all nodes of a given type, with an appropriate downcast.
ROSE_DLL_API bool isScalarType(SgType *t)
Is this a scalar type?
ROSE_DLL_API void changeBreakStatementsToGotos(SgStatement *loopOrSwitch)
If the given statement contains any break statements in its body, add a new label below the statement...
ROSE_DLL_API SgFunctionDefinition * getEnclosingFunctionDefinition(SgNode *astNode, const bool includingSelf=false)
Find a node by type using upward traversal.
ROSE_DLL_API bool is_CAF_language()
ROSE_DLL_API void printOutComments(SgLocatedNode *locatedNode)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API void ReductionRecognition(SgForStatement *loop, std::set< std::pair< SgInitializedName *, OmpSupport::omp_construct_enum > > &results)
Recognize and collect reduction variables and operations within a C/C++ loop, following OpenMP 3....
ROSE_DLL_API bool loopUnrolling(SgForStatement *loop, size_t unrolling_factor)
Unroll a target loop with a specified unrolling factor. It handles steps larger than 1 and adds a fri...
ROSE_DLL_API void setLoopCondition(SgScopeStatement *loop, SgStatement *cond)
Set the condition statement of a loop, including While-loop, For-loop, and Do-While-loop.
bool ROSE_DLL_API isStatic(SgDeclarationStatement *stmt)
Check if a declaration has a "static' modifier.
PreprocessingInfo * attachComment(SgSourceFile *source_file, const std::string &content, PreprocessingInfo::DirectiveType directive_type=PreprocessingInfo::C_StyleComment, PreprocessingInfo::RelativePositionType position=PreprocessingInfo::before)
Build and attach comment onto the global scope of a source file.
ROSE_DLL_API SgClassDefinition * getEnclosingClassDefinition(SgNode *astnode, const bool includingSelf=false)
Get the closest class definition enclosing the specified AST node,.
ROSE_DLL_API bool mergeDeclarationAndAssignment(SgVariableDeclaration *decl, SgExprStatement *assign_stmt, bool removeAssignStmt=true)
Merge a variable assignment statement into a matching variable declaration statement....
ROSE_DLL_API void checkAccessPermissions(SgNode *)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API std::vector< SgFunctionDeclaration * > generateFunctionDefinitionsList(SgNode *node)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API void replaceMacroCallsWithExpandedStrings(SgPragmaDeclaration *target)
Check if a pragma declaration node has macro calls attached, if yes, replace macro calls within the p...
std::string generateUniqueNameForUseAsIdentifier(SgDeclarationStatement *declaration)
Generate a useful name to support construction of identifiers from declarations.
ROSE_DLL_API bool isRestrictType(SgType *t)
Is this a restrict type?
ROSE_DLL_API std::string generateProjectName(const SgProject *project, bool supressSuffix=false)
Added mechanism to generate project name from list of file names.
ROSE_DLL_API void resetInternalMapsForTargetStatement(SgStatement *sourceStatement)
Reset internal data structures used for token-based unparsing and macro summaries based on modificati...
ROSE_DLL_API bool is_Cuda_language()
ROSE_DLL_API bool isLambdaCapturedVariable(SgVarRefExp *varRef)
check if a variable reference is this->a[i] inside of a lambda function
ROSE_DLL_API int instrumentEndOfFunction(SgFunctionDeclaration *func, SgStatement *s)
Instrument(Add a statement, often a function call) into a function right before the return points,...
ROSE_DLL_API SgInitializedName * getFirstInitializedName(SgVariableDeclaration *decl)
Get the first initialized name of a declaration statement.
void setSourcePositionPointersToNull(SgNode *node)
Set the source code positon for the current (input) node.
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsBodyOfDoWhile(SgDoWhileStmt *ws)
Check if the body of a 'do .. while' statement is a SgBasicBlock, create one if not.
ROSE_DLL_API void reportModifiedStatements(const std::string &label, SgNode *node)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API std::vector< SgInitializedName * > getOutParameters(const SgInitializedNamePtrList ¶ms)
Get a vector of Jovial output parameters from the function parameter list (may work for Fortran in th...
ROSE_DLL_API void setSourcePositionForTransformation(SgNode *root)
Recursively set source position info(Sg_File_Info) as transformation generated.
ROSE_DLL_API SgGlobal * getGlobalScope(const SgNode *astNode)
Traverse back through a node's parents to find the enclosing global scope.
ROSE_DLL_API void insertStatementListAfter(SgStatement *targetStmt, const std::vector< SgStatement * > &newStmt)
Insert a list of statements after a target statement.
ROSE_DLL_API bool isMain(const SgNode *node)
Check if a SgNode is a main() function declaration.
std::map< std::string, int > local_name_collision_map
Global map of name collisions to support generateUniqueNameForUseAsIdentifier() function.
ROSE_DLL_API void fixClassDeclaration(SgClassDeclaration *classDecl, SgScopeStatement *scope)
Fix symbols, parent and scope pointers. Used internally within appendStatment(), insertStatement() et...
ROSE_DLL_API int collectVariableReferencesInArrayTypes(SgLocatedNode *root, Rose_STL_Container< SgNode * > ¤tVarRefList)
Collect variable references in array types. The default NodeQuery::querySubTree() will miss variables...
SgBasicBlock * ensureBasicBlockAsBodyOfCaseOption(SgCaseOptionStmt *cs)
Check if the body of a 'case option' statement is a SgBasicBlock, create one if not.
void checkForInitializers(SgNode *node)
Collect all read and write references within stmt, which can be a function, a scope statement,...
ROSE_DLL_API void removeUnusedLabels(SgNode *top, bool keepChild=false)
Remove labels which are not targets of any goto statements: its child statement is also removed by de...
ROSE_DLL_API SgProject * getProject()
Get the current SgProject IR Node.
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsBodyOfUpcForAll(SgUpcForAllStatement *fs)
Check if the body of a 'upc_forall' statement is a SgBasicBlock, create one if not.
ROSE_DLL_API SgClassDeclaration * getEnclosingClassDeclaration(SgNode *astNode)
Get the closest class declaration enclosing the specified AST node,.
ROSE_DLL_API void insertStatement(SgStatement *targetStmt, SgStatement *newStmt, bool insertBefore=true, bool autoMovePreprocessingInfo=true)
Insert a statement before or after the target statement within the target's scope....
ROSE_DLL_API void listHeaderFiles(SgIncludeFile *includeFile)
return path prefix for subtree of include files.
ROSE_DLL_API void markSubtreeToBeUnparsedTreeTraversal(SgNode *root, int physical_file_id)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
void saveToPDF(SgNode *node, std::string filename)
Save AST into a pdf file. Start from a node to find its enclosing file node. The entire file's AST wi...
ROSE_DLL_API bool normalizeForLoopInitDeclaration(SgForStatement *loop)
Normalize loop init stmt by promoting the single variable declaration statement outside of the for lo...
void detectCycleInType(SgType *type, const std::string &from)
Collect all read and write references within stmt, which can be a function, a scope statement,...
ROSE_DLL_API void deleteAST(SgNode *node)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API bool statementCanBeTransformed(SgStatement *stmt)
If header file unparsing and token-based unparsing are used, then some statements in header files use...
ROSE_DLL_API SgStatement * getNextStatement(SgStatement *currentStmt)
Get next statement within the same scope of current statement.
ROSE_DLL_API std::set< SgLabelStatement * > findUnusedLabels(SgNode *top)
Find unused labels which are not targets of any goto statements.
ROSE_DLL_API void setExtern(SgDeclarationStatement *stmt)
Set a declaration as extern.
ROSE_DLL_API void deleteAllNodes()
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API bool templateArgumentListEquivalence(const SgTemplateArgumentPtrList &list1, const SgTemplateArgumentPtrList &list2)
Verify that 2 SgTemplateArgumentPtrList are equivalent.
ROSE_DLL_API LivenessAnalysis * call_liveness_analysis(SgProject *project, bool debug=false)
Call liveness analysis on an entire project.
ROSE_DLL_API void reportModifiedLocatedNodes(const std::string &label, SgNode *node)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API void fixTemplateDeclaration(SgTemplateDeclaration *stmt, SgScopeStatement *scope)
Fix the symbol table and set scope (only if scope in declaration is not already set).
SgType * getBoolType(SgNode *n)
Get the right bool type according to C or C++ language input.
void clearSharedGlobalScopes(SgProject *project)
Collect all read and write references within stmt, which can be a function, a scope statement,...
void initializeWhileStatement(SgWhileStmt *whileStatement, SgStatement *condition, SgStatement *body, SgStatement *else_body)
Support function used for variable declarations in conditionals.
ROSE_DLL_API void setSourcePosition(SgNode *node)
Set the source code positon for the current (input) node.
ROSE_DLL_API void setPragma(SgPragmaDeclaration *decl, SgPragma *pragma)
Set a pragma of a pragma declaration. handle memory release for preexisting pragma,...
ROSE_DLL_API void insertStatementListBeforeFirstNonDeclaration(const std::vector< SgStatement * > &newStmts, SgScopeStatement *scope)
Insert statements before the first non-declaration statement in a scope. If the scope has no non-decl...
ROSE_DLL_API bool isPostfixOperator(SgExpression *exp)
Is an overloaded operator a postfix operator. (e.g. ).
ROSE_DLL_API SgStatement * findSurroundingStatementFromSameFile(SgStatement *targetStmt, bool &surroundingStatementPreceedsTargetStatement)
Supporting function to comment relocation in insertStatement() and removeStatement().
SgNamespaceDefinitionStatement * enclosingNamespaceScope(SgDeclarationStatement *declaration)
Find the enclosing namespace of a declaration.
ROSE_DLL_API SgStatement * getLoopBody(SgScopeStatement *loop)
Routines to get and set the body of a loop.
ROSE_DLL_API bool is_mixed_C_and_Cxx_language()
bool isStructurallyEquivalentAST(SgNode *tree1, SgNode *tree2)
Collect all read and write references within stmt, which can be a function, a scope statement,...
ROSE_DLL_API PreprocessingInfo * insertHeader(SgSourceFile *source_file, const std::string &header_file_name, bool isSystemHeader, bool asLastHeader)
Insert #include "filename" or #include <filename> (system header) onto the global scope of a source f...
void printAST2TextFile(SgNode *node, const char *filename, bool printType=true)
Pretty print AST horizontally, output to a specified text file. If printType is set to false,...
ROSE_DLL_API SgFunctionSymbol * lookupTemplateFunctionSymbolInParentScopes(const SgName &functionName, SgFunctionType *ftype, SgTemplateParameterPtrList *tplparams, SgScopeStatement *currentScope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API bool is_language_case_insensitive()
ROSE_DLL_API void replaceStatement(SgStatement *oldStmt, SgStatement *newStmt, bool movePreprocessinInfo=false)
Replace a statement with another. Move preprocessing information from oldStmt to newStmt if requested...
ROSE_DLL_API void recordNormalizations(SgStatement *s)
Record where normalization have been done so that we can preform denormalizations as required for the...
ROSE_DLL_API bool loopInterchange(SgForStatement *loop, size_t depth, size_t lexicoOrder)
Interchange/permutate a n-level perfectly-nested loop rooted at 'loop' using a lexicographical order ...
void printAST(SgNode *node)
Pretty print AST horizontally, output to std output.
ROSE_DLL_API SgFunctionSymbol * lookupTemplateMemberFunctionSymbolInParentScopes(const SgName &functionName, SgFunctionType *ftype, SgTemplateParameterPtrList *tplparams, SgScopeStatement *currentScope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API bool is_PHP_language()
ROSE_DLL_API bool isEqualToIntConst(SgExpression *e, int value)
Check if a SgIntVal node has a given value.
ROSE_DLL_API void insertStatementBeforeFirstNonDeclaration(SgStatement *newStmt, SgScopeStatement *scope, bool movePreprocessingInfo=true)
Insert a statement before the first non-declaration statement in a scope. If the scope has no non-dec...
ROSE_DLL_API SgFunctionSymbol * lookupFunctionSymbolInParentScopes(const SgName &functionName, SgScopeStatement *currentScope=NULL)
look up the first matched function symbol in parent scopes given only a function name,...
ROSE_DLL_API void appendStatementWithDependentDeclaration(SgDeclarationStatement *decl, SgGlobal *scope, SgStatement *original_statement, bool excludeHeaderFiles)
Append a copy ('decl') of a function ('original_statement') into a 'scope', include any referenced de...
ROSE_DLL_API bool insideHeader(SgLocatedNode *node)
Check if a node is from a header file.
ROSE_DLL_API void markSubtreeToBeUnparsed(SgNode *root, int physical_file_id)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API bool isDataMemberReference(SgVarRefExp *varRefExp)
Find a node by type using upward traversal.
ROSE_DLL_API bool collectReadWriteVariables(SgStatement *stmt, std::set< SgInitializedName * > &readVars, std::set< SgInitializedName * > &writeVars, bool coarseGrain=true)
Collect unique variables which are read or written within a statement. Note that a variable can be bo...
ROSE_DLL_API void constantFolding(SgNode *r)
Constant folding an AST subtree rooted at 'r' (replacing its children with their constant values,...
std::vector< SgBreakStmt * > findBreakStmts(SgStatement *code, const std::string &fortranLabel="")
Find break statements inside a particular statement, stopping at nested loops or switches.
ROSE_DLL_API SgFile * getEnclosingFileNode(SgNode *astNode)
get the SgFile node from current node
ROSE_DLL_API void setStatic(SgDeclarationStatement *stmt)
Set a declaration as static.
ROSE_DLL_API bool doLoopNormalization(SgFortranDo *loop)
Normalize a Fortran Do loop. Make the default increment expression (1) explicit.
ROSE_DLL_API SgFile * preprocessCompilationUnit(SgProject *, std::string, std::string, bool unparse=true)
Using the file_content string, create a file with the content in question; build its AST and add it t...
ROSE_DLL_API void removeLabeledGotos(SgNode *top)
Remove labeled goto statements.
std::map< SgNode *, std::string > local_node_to_name_map
Global map of name collisions to support generateUniqueNameForUseAsIdentifier() function.
std::vector< SgGotoStatement * > findGotoStmts(SgStatement *scope, SgLabelStatement *l)
Query a subtree to get all nodes of a given type, with an appropriate downcast.
ROSE_DLL_API bool mergeDeclarationWithAssignment(SgVariableDeclaration *decl, SgExprStatement *assign_stmt)
Merge a declaration statement into a matching followed variable assignment. Callers should make sure ...
ROSE_DLL_API bool isAssignmentStatement(SgNode *_s, SgExpression **lhs=NULL, SgExpression **rhs=NULL, bool *readlhs=NULL)
Check if a SgNode _s is an assignment statement (any of =,+=,-=,&=,/=, ^=, etc)
ROSE_DLL_API void outputSharedNodes(SgNode *node)
Find a node by type using upward traversal.
bool ROSE_DLL_API isAncestor(SgNode *node1, SgNode *node2)
check if node1 is a strict ancestor of node 2. (a node is not considered its own ancestor)
ROSE_DLL_API SgScopeStatement * getEnclosingScope(SgNode *n, const bool includingSelf=false)
Get the enclosing scope from a node n.
ROSE_DLL_API SgNonrealSymbol * lookupNonrealSymbolInParentScopes(const SgName &name, SgScopeStatement *currentScope=NULL, SgTemplateParameterPtrList *templateParameterList=NULL, SgTemplateArgumentPtrList *templateArgumentList=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API SgSwitchStatement * findEnclosingSwitch(SgStatement *s)
Find the closest switch outside a given statement (normally used for case and default statements)
ROSE_DLL_API void removeAllOriginalExpressionTrees(SgNode *top)
Set original expression trees to NULL for SgValueExp or SgCastExp expressions, so you can change the ...
ROSE_DLL_API std::vector< SgNode * > astIntersection(SgNode *original, SgNode *copy, SgCopyHelp *help=NULL)
Compute the intersection set for two ASTs.
ROSE_DLL_API bool isPrefixOperator(SgExpression *exp)
Is an overloaded operator a prefix operator (e.g. address operator X * operator&(),...
ROSE_DLL_API void setLhsOperand(SgExpression *target, SgExpression *lhs)
set left hand operand for binary expressions, transparently downcasting target expressions when neces...
ROSE_DLL_API std::vector< SgC_PreprocessorDirectiveStatement * > translateStatementToUseCppDeclarations(SgStatement *statement, SgScopeStatement *scope)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API int suggestNextNumericLabel(SgFunctionDefinition *func_def)
Suggest next usable (non-conflicting) numeric label value for a Fortran function definition scope.
ROSE_DLL_API std::set< SgStatement * > collectModifiedStatements(SgNode *node)
This collects the statements that are marked as modified (a flag automatically set by all set_* gener...
ROSE_DLL_API SgFunctionDeclaration * getEnclosingFunctionDeclaration(SgNode *astNode, const bool includingSelf=false)
Find the enclosing function declaration, including its derived instances like isSgProcedureHeaderStat...
SgFunctionDeclaration * findFunctionDeclaration(SgNode *root, std::string name, SgScopeStatement *scope, bool isDefining)
Topdown traverse a subtree from root to find the first function declaration matching the given name,...
ROSE_DLL_API bool isPrefixOperatorName(const SgName &functionName)
Check for proper names of possible prefix operators (used in isPrefixOperator()).
ROSE_DLL_API void setLoopStride(SgNode *loop, SgExpression *stride)
Set the stride(step) of a loop 's incremental expression, regardless the expression types (i+=s; i= i...
ROSE_DLL_API bool isInSubTree(SgExpression *subtree, SgExpression *exp)
Find a node by type using upward traversal.
ROSE_DLL_API bool forLoopNormalization(SgForStatement *loop, bool foldConstant=true)
Normalize a for loop, return true if successful.
unsigned long long getIntegerConstantValue(SgValueExp *expr)
Get the constant value from a constant integer expression; abort on everything else.
ROSE_DLL_API bool is_UPC_language()
ROSE_DLL_API void checkSymbolTables(SgNode *)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API void updateDefiningNondefiningLinks(SgFunctionDeclaration *func, SgScopeStatement *scope)
Update defining and nondefining links due to a newly introduced function declaration....
ROSE_DLL_API SgNode * deepCopyNode(const SgNode *subtree)
Deep copy an arbitrary subtree.
SgBasicBlock * ensureBasicBlockAsBodyOfDefaultOption(SgDefaultOptionStmt *cs)
Check if the body of a 'default option' statement is a SgBasicBlock, create one if not.
ROSE_DLL_API void getLiveVariables(LivenessAnalysis *liv, SgForStatement *loop, std::set< SgInitializedName * > &liveIns, std::set< SgInitializedName * > &liveOuts)
get liveIn and liveOut variables for a for loop from liveness analysis result liv.
ROSE_DLL_API void resetModifiedLocatedNodes(const std::set< SgLocatedNode * > &modifiedNodeSet)
Use the set of IR nodes and set the isModified flag in each IR node to true.
ROSE_DLL_API SgNode * replaceWithPattern(SgNode *anchor, SgNode *new_pattern)
Replace an anchor node with a specified pattern subtree with optional SgVariantExpression....
ROSE_DLL_API bool ROSE_DLL_API isJovialOutParam(SgInitializedName *name)
True if a parameter name is a Jovial output parameter.
ROSE_DLL_API void moveForStatementIncrementIntoBody(SgForStatement *f)
Add a step statement to the end of a loop body Add a new label to the end of the loop,...
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsBodyOfOmpBodyStmt(SgOmpBodyStatement *ompbodyStmt)
Check if the body of a SgOmpBodyStatement is a SgBasicBlock, create one if not.
ROSE_DLL_API bool is_Python_language()
ROSE_DLL_API bool is_mixed_Fortran_and_Cxx_language()
ROSE_DLL_API SgStatement * getLoopCondition(SgScopeStatement *loop)
Routines to get the condition of a loop. It recognize While-loop, For-loop, and Do-While-loop.
ROSE_DLL_API SgEnumSymbol * lookupEnumSymbolInParentScopes(const SgName &name, SgScopeStatement *currentScope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
std::pair< SgVariableDeclaration *, SgExpression * > createTempVariableAndReferenceForExpression(SgExpression *expression, SgScopeStatement *scope)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API SgTypedefSymbol * lookupTypedefSymbolInParentScopes(const SgName &name, SgScopeStatement *currentScope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsBodyOfWhile(SgWhileStmt *ws)
Check if the body of a 'while' statement is a SgBasicBlock, create one if not.
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsBodyOfFor(SgForStatement *fs)
Check if the body of a 'for' statement is a SgBasicBlock, create one if not.
ROSE_DLL_API PreprocessingInfo * attachArbitraryText(SgLocatedNode *target, const std::string &text, PreprocessingInfo::RelativePositionType position=PreprocessingInfo::before)
Attach an arbitrary string to a located node. A workaround to insert irregular statements or vendor-s...
ROSE_DLL_API void markNodeToBeUnparsed(SgNode *node, int physical_file_id)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API bool isConstantTrue(SgExpression *e)
Check if a bool or int constant expression evaluates to be a true value.
std::map< std::string, SgNode * > local_name_to_node_map
Global map of name collisions to support generateUniqueNameForUseAsIdentifier() function.
ROSE_DLL_API bool is_binary_executable()
void changeAllBodiesToBlocks(SgNode *top, bool createEmptyBody=true)
Fix up ifs, loops, while, switch, Catch, OmpBodyStatement, etc. to have blocks as body components....
void dumpPreprocInfo(SgLocatedNode *locatedNode)
Dumps a located node's preprocessing information.
void fixupReferencesToSymbols(const SgScopeStatement *this_scope, SgScopeStatement *copy_scope, SgCopyHelp &help)
All the symbol table references in the copied AST need to be reset after rebuilding the copied scope'...
ROSE_DLL_API void moveDeclarationToAssociatedNamespace(SgDeclarationStatement *declarationStatement)
Relocate the declaration to be explicitly represented in its associated namespace (required for some ...
ROSE_DLL_API bool isCanonicalForLoop(SgNode *loop, SgInitializedName **ivar=NULL, SgExpression **lb=NULL, SgExpression **ub=NULL, SgExpression **step=NULL, SgStatement **body=NULL, bool *hasIncrementalIterationSpace=NULL, bool *isInclusiveUpperBound=NULL)
Check if a for-loop has a canonical form, return loop index, bounds, step, and body if requested.
ROSE_DLL_API bool isArrayReference(SgExpression *ref, SgExpression **arrayNameExp=NULL, std::vector< SgExpression * > **subscripts=NULL)
Check if an expression is an array access (SgPntrArrRefExp). If so, return its name expression and su...
ROSE_DLL_API void insertStatementAfterLastDeclaration(SgStatement *stmt, SgScopeStatement *scope)
Insert a statement after the last declaration within a scope. The statement will be prepended to the ...
ROSE_DLL_API void destroyTempDirectory(std::string)
Use the system command to remove a temporary directory and all its containing files.
void serialize_list(T &plist, std::string T_name, std::string &prefix, bool hasRemaining, std::ostringstream &out, std::string &edgeLabel)
Query a subtree to get all nodes of a given type, with an appropriate downcast.
void resetMangledNameCache(SgGlobal *globalScope)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API SgTemplateInstantiationMemberFunctionDecl * buildForwardFunctionDeclaration(SgTemplateInstantiationMemberFunctionDecl *memberFunctionInstantiation)
Generate a non-defining (forward) declaration from a defining function declaration.
ROSE_DLL_API bool is_Fortran_language()
ROSE_DLL_API SgVariableSymbol * lookupVariableSymbolInParentScopes(const SgName &name, SgScopeStatement *currentScope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API void outputFileIds(SgNode *node)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API SgExprStatement * splitVariableDeclaration(SgVariableDeclaration *decl)
Split a variable declaration with an rhs assignment into two statements: a declaration and an assignm...
ROSE_DLL_API SgStatement * getFirstStatement(SgScopeStatement *scope, bool includingCompilerGenerated=false)
Get the first statement within a scope, return NULL if it does not exist. Skip compiler-generated sta...
ROSE_DLL_API SgNamespaceSymbol * lookupNamespaceSymbolInParentScopes(const SgName &name, SgScopeStatement *currentScope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API bool isExtern(SgDeclarationStatement *stmt)
Check if a declaration has an "extern" modifier.
std::string extractPragmaKeyword(const SgPragmaDeclaration *)
Extract a SgPragmaDeclaration's leading keyword . For example "#pragma omp parallel" has a keyword of...
ROSE_DLL_API SgTemplateClassSymbol * lookupTemplateClassSymbolInParentScopes(const SgName &name, SgTemplateParameterPtrList *templateParameterList, SgTemplateArgumentPtrList *templateArgumentList, SgScopeStatement *cscope=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API bool isEquivalentFunctionType(const SgFunctionType *lhs, const SgFunctionType *rhs)
Test if two types are equivalent SgFunctionType nodes.
ROSE_DLL_API void setLoopLowerBound(SgNode *loop, SgExpression *lb)
Set the lower bound of a loop header for (i=lb; ...)
void guardNode(SgLocatedNode *target, std::string guard)
Add preproccessor guard around a given node.
bool checkTypesAreEqual(SgType *typeA, SgType *typeB)
Collect all read and write references within stmt, which can be a function, a scope statement,...
ROSE_DLL_API bool isReferenceType(SgType *t)
Is this type a const or non-const reference type? (Handles typedefs correctly)
ROSE_DLL_API void moveCommentsToNewStatement(SgStatement *sourceStatement, const std::vector< int > &indexList, SgStatement *destinationStatement, bool destinationStatementPreceedsSourceStatement)
Relocate comments and CPP directives from one statement to another.
ROSE_DLL_API SgStatement * getEnclosingStatement(SgNode *n)
Find the closest enclosing statement, including the given node.
ROSE_DLL_API void translateToUseCppDeclarations(SgNode *n)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API void changeContinuesToGotos(SgStatement *stmt, SgLabelStatement *label)
Change continue statements in a given block of code to gotos to a label.
void outputGlobalFunctionTypeSymbolTable()
Output function type symbols in global function type symbol table.
ROSE_DLL_API SgScopeStatement * findEnclosingLoop(SgStatement *s, const std::string &fortranLabel="", bool stopOnSwitches=false)
Find the closest loop outside the given statement; if fortranLabel is not empty, the Fortran label of...
std::pair< SgVariableDeclaration *, SgExpression * > createTempVariableForExpression(SgExpression *expression, SgScopeStatement *scope, bool initializeInDeclaration, SgAssignOp **reEvaluate=NULL)
Given an expression, generates a temporary variable whose initializer optionally evaluates that expre...
bool isBodyStatement(SgStatement *s)
Check if a statement is a (true or false) body of a container-like parent, such as For,...
bool functionCallExpressionPreceedsDeclarationWhichAssociatesScope(SgFunctionCallExp *functionCall)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API void convertAllForsToWhiles(SgNode *top)
Add a step statement to the end of a loop body Add a new label to the end of the loop,...
ROSE_DLL_API bool isConstantFalse(SgExpression *e)
Check if a bool or int constant expression evaluates to be a false value.
ROSE_DLL_API void outputLocalSymbolTables(SgNode *node)
Output the local symbol tables.
ROSE_DLL_API void preOrderCollectPreprocessingInfo(SgNode *current, std::vector< PreprocessingInfo * > &infoList, int depth)
Dumps a located node's preprocessing information.
ROSE_DLL_API SgMemberFunctionDeclaration * getDefaultDestructor(SgClassDeclaration *classDeclaration)
Get the default destructor from the class declaration.
void collectVarRefs(SgLocatedNode *root, std::vector< SgVarRefExp * > &result)
Collect all variable references in a subtree.
ROSE_DLL_API void setOperand(SgExpression *target, SgExpression *operand)
Set operands for expressions with single operand, such as unary expressions. handle file info,...
ROSE_DLL_API SgMemberFunctionDeclaration * getDefaultConstructor(SgClassDeclaration *classDeclaration)
Get the default constructor from the class declaration.
ROSE_DLL_API SgInitializedName * getLoopIndexVariable(SgNode *loop)
Return the loop index variable for a for loop.
ROSE_DLL_API SgAssignInitializer * splitExpression(SgExpression *from, std::string newName="")
Replace an expression with a temporary variable and an assignment statement.
ROSE_DLL_API void replaceVariableReferences(SgVariableSymbol *old_sym, SgVariableSymbol *new_sym, SgScopeStatement *scope)
Replace all variable references to an old symbol in a scope to being references to a new symbol.
ROSE_DLL_API bool is_OpenCL_language()
ROSE_DLL_API bool normalizeForLoopIncrement(SgForStatement *loop)
Add a step statement to the end of a loop body Add a new label to the end of the loop,...
ROSE_DLL_API SgVariableSymbol * appendArg(SgFunctionParameterList *, SgInitializedName *)
Append an argument to SgFunctionParameterList, transparently set parent,scope, and symbols for argume...
ROSE_DLL_API bool unnormalizeForLoopInitDeclaration(SgForStatement *loop)
Undo the normalization of for loop's C99 init declaration. Previous record of normalization is used t...
ROSE_DLL_API SgStatement * getPreviousStatement(SgStatement *currentStmt, bool climbOutScope=true)
Get previous statement of the current statement. It may return a previous statement of a parent scope...
ROSE_DLL_API void removeJumpsToNextStatement(SgNode *)
Remove jumps whose label is immediately after the jump. Used to clean up inlined code fragments.
bool isPrototypeInScope(SgScopeStatement *scope, SgFunctionDeclaration *functionDeclaration, SgDeclarationStatement *startingAtDeclaration)
Assigns unique numbers to each SgScopeStatement of a function.
ROSE_DLL_API int moveUpInnerDanglingIfEndifDirective(SgLocatedNode *lnode)
Extract sequences like " #endif #endif ... #if | #ifdef| #ifndef" buried inside subtree of lnode.
SgDeclarationStatement * getNonInstantiatonDeclarationForClass(SgTemplateInstantiationMemberFunctionDecl *memberFunctionInstantiation)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API bool isConstType(SgType *t)
Is this a const type?
SgFunctionDeclaration * getDeclarationOfNamedFunction(SgExpression *func)
Given a SgExpression that represents a named function (or bound member function), return the mentione...
ROSE_DLL_API bool is_C99_language()
ROSE_DLL_API bool addDefaultConstructorIfRequired(SgClassType *classType, int physical_file_id=Sg_File_Info::TRANSFORMATION_FILE_ID)
Get the default destructor from the class declaration.
ROSE_DLL_API void movePreprocessingInfo(SgStatement *stmt_src, SgStatement *stmt_dst, PreprocessingInfo::RelativePositionType src_position=PreprocessingInfo::undef, PreprocessingInfo::RelativePositionType dst_position=PreprocessingInfo::undef, bool usePrepend=false)
Move preprocessing information of stmt_src to stmt_dst, Only move preprocessing information from the ...
ROSE_DLL_API int fixVariableReferences(SgNode *root, bool cleanUnusedSymbol=true)
Connect variable reference to the right variable symbols when feasible, return the number of referenc...
ROSE_DLL_API bool isUseByAddressVariableRef(SgVarRefExp *ref)
Check if a variable reference is used by its address: including &a expression and foo(a) when type2 f...
struct const_int_expr_t evaluateConstIntegerExpression(SgExpression *expr)
The function tries to evaluate const integer expressions (such as are used in array dimension sizes)....
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsTrueBodyOfIf(SgIfStmt *ifs)
Check if the true body of a 'if' statement is a SgBasicBlock, create one if not.
ROSE_DLL_API void replaceExpression(SgExpression *oldExp, SgExpression *newExp, bool keepOldExp=false)
Replace an expression with another, used for variable reference substitution and others....
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsFalseBodyOfIf(SgIfStmt *ifs, bool createEmptyBody=true)
Check if the false body of a 'if' statement is a SgBasicBlock, create one if not when the flag is tru...
ROSE_DLL_API SgExprListExp * getEnclosingExprListExp(SgNode *astNode, const bool includingSelf=false)
Get the enclosing SgExprListExp (used as part of function argument index evaluation in subexpressions...
ROSE_DLL_API void appendStatement(SgStatement *stmt, SgScopeStatement *scope=NULL)
Append a statement to the end of the current scope, handle side effect of appending statements,...
ROSE_DLL_API SgFunctionDeclaration * buildFunctionPrototype(SgFunctionDeclaration *functionDeclaration)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
void addVarRefExpFromArrayDimInfo(SgNode *astNode, Rose_STL_Container< SgNode * > &NodeList_t)
Find all SgPntrArrRefExp under astNode, then add SgVarRefExp (if any) of SgPntrArrRefExp's dim_info i...
ROSE_DLL_API bool loopTiling(SgForStatement *loopNest, size_t targetLevel, size_t tileSize)
Tile the n-level (starting from 1) loop of a perfectly nested loop nest using tiling size s.
std::string generateUniqueName(const SgNode *node, bool ignoreDifferenceBetweenDefiningAndNondefiningDeclarations)
Generate unique name from C and C++ constructs. The name may contain space.
ROSE_DLL_API SgGlobal * getFirstGlobalScope(SgProject *project)
return the first global scope under current project
ROSE_DLL_API void setOneSourcePositionNull(SgNode *node)
Set current node's source position as NULL.
ROSE_DLL_API void setRhsOperand(SgExpression *target, SgExpression *rhs)
set left hand operand for binary expression
std::pair< SgStatement *, SgInitializedName * > wrapFunction(SgFunctionDeclaration &definingDeclaration, SgName newName)
moves the body of a function f to a new function f; f's body is replaced with code that forwards the ...
ROSE_DLL_API bool is_mixed_Fortran_and_C_and_Cxx_language()
ROSE_DLL_API bool isVolatileType(SgType *t)
Is this a volatile type?
void clearUnusedVariableSymbols(SgNode *root=NULL)
Clear those variable symbols with unknown type (together with initialized names) which are also not r...
ROSE_DLL_API void fixVariableDeclaration(SgVariableDeclaration *varDecl, SgScopeStatement *scope)
Patch up symbol, scope, and parent information when a SgVariableDeclaration's scope is known.
ROSE_DLL_API SgSymbol * lookupSymbolInParentScopesIgnoringAliasSymbols(const SgName &name, SgScopeStatement *currentScope=NULL, SgTemplateParameterPtrList *templateParameterList=NULL, SgTemplateArgumentPtrList *templateArgumentList=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
std::string generateUniqueVariableName(SgScopeStatement *scope, std::string baseName="temp")
Generate a name like temp# that is unique in the current scope and any parent and children scopes.
ROSE_DLL_API int gensym_counter
An internal counter for generating unique SgName.
ROSE_DLL_API void splitExpressionIntoBasicBlock(SgExpression *expr)
Split long expressions into blocks of statements.
void reset_name_collision_map()
Reset map variables used to support generateUniqueNameForUseAsIdentifier() function.
ROSE_DLL_API SgFunctionDefinition * getEnclosingProcedure(SgNode *n, const bool includingSelf=false)
Find the function definition.
std::vector< SgExpression * > get_C_array_dimensions(const SgArrayType &arrtype)
returns the array dimensions in an array as defined for arrtype
ROSE_DLL_API void replaceSubexpressionWithStatement(SgExpression *from, SageInterface::StatementGenerator *to)
Similar to replaceExpressionWithStatement, but with more restrictions.
ROSE_DLL_API void wrapAllTemplateInstantiationsInAssociatedNamespaces(SgProject *root)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
std::string get_name(const SgNode *node)
Generate a useful name to describe the SgNode.
ROSE_DLL_API void setLoopUpperBound(SgNode *loop, SgExpression *ub)
Set the upper bound of a loop header,regardless the condition expression type. for (i=lb; i op up,...
ROSE_DLL_API bool isMemberFunctionMemberReference(SgMemberFunctionRefExp *memberFunctionRefExp)
Find a node by type using upward traversal.
ROSE_DLL_API SgClassDefinition * findJavaPackage(SgScopeStatement *, std::string)
Look for a qualified package name in the given scope and return its package definition.
ROSE_DLL_API bool isOmpStatement(SgNode *)
Check if a node is SgOmp*Statement.
ROSE_DLL_API bool is_Ada_language()
std::string addMangledNameToCache(SgNode *astNode, const std::string &mangledName)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API bool is_C_language()
ROSE_DLL_API std::list< SgClassType * > getClassTypeChainForMemberReference(SgExpression *refExp)
Find a node by type using upward traversal.
ROSE_DLL_API void collectUseByAddressVariableRefs(const SgStatement *s, std::set< SgVarRefExp * > &varSetB)
Collect variable references involving use by address: including &a expression and foo(a) when type2 f...
std::vector< SgContinueStmt * > findContinueStmts(SgStatement *code, const std::string &fortranLabel="")
Find all continue statements inside a particular statement, stopping at nested loops.
std::string getMangledNameFromCache(SgNode *astNode)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API std::vector< SgDeclarationStatement * > sortSgNodeListBasedOnAppearanceOrderInSource(const std::vector< SgDeclarationStatement * > &nodevec)
Reorder a list of declaration statements based on their appearance order in source files.
ROSE_DLL_API std::set< SgLocatedNode * > collectModifiedLocatedNodes(SgNode *node)
This collects the SgLocatedNodes that are marked as modified (a flag automatically set by all set_* g...
SgExpression * forallMaskExpression(SgForAllStatement *stmt)
Get the mask expression from the header of a SgForAllStatement.
void clearScopeNumbers(SgFunctionDefinition *functionDefinition)
Clears the cache of scope,integer pairs for the input function.
ROSE_DLL_API SgInitializedName * convertRefToInitializedName(SgNode *current, bool coarseGrain=true)
Variable references can be introduced by SgVarRef, SgPntrArrRefExp, SgInitializedName,...
ROSE_DLL_API SgNode * getSgNodeFromAbstractHandleString(const std::string &input_string)
Obtain a matching SgNode from an abstract handle string.
ROSE_DLL_API void moveStatementsBetweenBlocks(SgBasicBlock *sourceBlock, SgBasicBlock *targetBlock)
Move statements in first block to the second block (preserves order and rebuilds the symbol table).
ROSE_DLL_API bool templateDefinitionIsInClass(SgTemplateInstantiationMemberFunctionDecl *memberFunctionDeclaration)
Return true if template definition is in the class, false if outside of class.
ROSE_DLL_API void fixLabelStatement(SgLabelStatement *label_stmt, SgScopeStatement *scope)
Fix symbol table for SgLabelStatement. Used Internally when the label is built without knowing its ta...
ROSE_DLL_API void replaceExpressionWithStatement(SgExpression *from, SageInterface::StatementGenerator *to)
Replace a given expression with a list of statements produced by a generator.
ROSE_DLL_API void convertForToWhile(SgForStatement *f)
Add a step statement to the end of a loop body Add a new label to the end of the loop,...
ROSE_DLL_API void insertStatementBefore(SgStatement *targetStmt, SgStatement *newStmt, bool autoMovePreprocessingInfo=true)
Insert a statement before a target statement.
ROSE_DLL_API bool findFirstSgCastExpMarkedAsTransformation(SgNode *n, const std::string &s)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API void dumpInfo(SgNode *node, std::string desc="")
Dump information about a SgNode for debugging.
ROSE_DLL_API void convertFunctionDefinitionsToFunctionPrototypes(SgNode *node)
XXX This function operates on the new file used to support outlined function definitions....
ROSE_DLL_API void appendStatementList(const std::vector< SgStatement * > &stmt, SgScopeStatement *scope=NULL)
Append a list of statements to the end of the current scope, handle side effect of appending statemen...
SgNamedType * getDeclaredType(const SgDeclarationStatement *declaration)
Returns the type introduced by a declaration.
ROSE_DLL_API bool isIndexOperator(SgExpression *exp)
Is an overloaded operator an index operator (also referred to as call or subscript operators)....
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsBodyOfCatch(SgCatchOptionStmt *cos)
Check if the body of a 'catch' statement is a SgBasicBlock, create one if not.
std::vector< SgFile * > generateFileList()
Returns STL vector of SgFile IR node pointers.
ROSE_DLL_API int normalizeArrowExpWithAddressOfLeftOperand(SgNode *root, bool transformationGeneratedOnly=true)
Convert all code within root matching the patern of (&left)->right, and translate them into left....
bool hasTemplateSyntax(const SgName &name)
Collect all read and write references within stmt, which can be a function, a scope statement,...
ROSE_DLL_API void moveToSubdirectory(std::string directoryName, SgFile *file)
Move file to be generated in a subdirectory (will be generated by the unparser).
ROSE_DLL_API bool isAddressTaken(SgExpression *refExp)
Find a node by type using upward traversal.
ROSE_DLL_API bool hasSimpleChildrenList(SgScopeStatement *scope)
Check if a scope statement has a simple children statement list so insert additional statements under...
ROSE_DLL_API SgFunctionDeclaration * findMain(SgNode *currentNode)
top-down traversal from current node to find the main() function declaration
ROSE_DLL_API SgClassSymbol * lookupClassSymbolInParentScopes(const SgName &name, SgScopeStatement *currentScope=NULL, SgTemplateArgumentPtrList *templateArgumentList=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
ROSE_DLL_API void removeConsecutiveLabels(SgNode *top)
Remove consecutive labels.
ROSE_DLL_API void setLoopBody(SgScopeStatement *loop, SgStatement *body)
Add a step statement to the end of a loop body Add a new label to the end of the loop,...
bool getForLoopInformations(SgForStatement *for_loop, SgVariableSymbol *&iterator, SgExpression *&lower_bound, SgExpression *&upper_bound, SgExpression *&stride)
ROSE_DLL_API void appendExpression(SgExprListExp *, SgExpression *)
Append an expression to a SgExprListExp, set the parent pointer also.
ROSE_DLL_API bool isLambdaFunction(SgFunctionDeclaration *func)
Check if a function declaration is a C++11 lambda function.
ROSE_DLL_API SgBasicBlock * ensureBasicBlockAsBodyOfSwitch(SgSwitchStatement *ws)
Check if the body of a 'switch' statement is a SgBasicBlock, create one if not.
ROSE_DLL_API void prependStatement(SgStatement *stmt, SgScopeStatement *scope=NULL)
Prepend a statement to the beginning of the current scope, handling side effects as appropriate.
ROSE_DLL_API bool isCallToParticularFunction(SgFunctionDeclaration *decl, SgExpression *e)
Recursively print current and parent nodes. used within gdb to probe the context of a node.
ROSE_DLL_API bool ROSE_DLL_API isMutable(SgInitializedName *name)
True if an SgInitializedName is "mutable' (has storage modifier set)
ROSE_DLL_API bool isCopyConstructible(SgType *type)
Is a type copy constructible? This may not quite work properly.
ROSE_DLL_API SgVariableSymbol * prependArg(SgFunctionParameterList *, SgInitializedName *)
Prepend an argument to SgFunctionParameterList.
ROSE_DLL_API void setSourcePositionAtRootAndAllChildren(SgNode *root)
Set the source code positon for the subtree (including the root).
ROSE_DLL_API SgExpression * copyExpression(SgExpression *e)
Deep copy an expression.
void setParameterList(actualFunction *func, SgFunctionParameterList *paralist)
Set parameter list for a function declaration, considering existing parameter list etc.
SgStatement * findLastDeclarationStatement(SgScopeStatement *scope, bool includePragma=false)
Find the last declaration statement within a scope (if any). This is often useful to decide where to ...
ROSE_DLL_API bool insideSystemHeader(SgLocatedNode *node)
Set source position info(Sg_File_Info) as transformation generated for all SgNodes in memory pool.
std::vector< SgDeclarationStatement * > getDependentDeclarations(SgStatement *stmt)
Get a statement's dependent declarations which declares the types used in the statement....
SgBasicBlock * makeSingleStatementBodyToBlock(SgStatement *singleStmt)
Make a single statement body to be a basic block. Its parent is if, while, catch, or upc_forall etc.
void computeUniqueNameForUseAsIdentifier(SgNode *astNode)
Traversal to set the global map of names to node and node to names.collisions to support generateUniq...
ROSE_DLL_API void collectReadOnlyVariables(SgStatement *stmt, std::set< SgInitializedName * > &readOnlyVars, bool coarseGrain=true)
Collect read only variables within a statement. The statement can be either of a function,...
std::string generateUniqueNameForUseAsIdentifier_support(SgDeclarationStatement *declaration)
Global map of name collisions to support generateUniqueNameForUseAsIdentifier() function.
ROSE_DLL_API PreprocessingInfo * findHeader(SgSourceFile *source_file, const std::string &header_file_name, bool isSystemHeader)
Find the preprocessingInfo node representing #include <header.h> or #include "header....
ROSE_DLL_API void myRemoveStatement(SgStatement *stmt)
A special purpose statement removal function, originally from inlinerSupport.h, Need Jeremiah's atten...
ROSE_DLL_API SgScopeStatement * getScope(const SgNode *astNode)
Get the closest scope from astNode. Return astNode if it is already a scope.
ROSE_DLL_API bool isStrictIntegerType(SgType *t)
Check if a type is an integral type, only allowing signed/unsigned short, int, long,...
ROSE_DLL_API bool is_Java_language()
ROSE_DLL_API void insertStatementAfter(SgStatement *targetStmt, SgStatement *newStmt, bool autoMovePreprocessingInfo=true)
Insert a statement after a target statement, Move around preprocessing info automatically by default.
ROSE_DLL_API bool isEquivalentType(const SgType *lhs, const SgType *rhs)
Test for equivalence of types independent of access permissions (private or protected modes for membe...
ROSE_DLL_API bool isTemplateInstantiationNode(SgNode *node)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API void removeStatement(SgStatement *stmt, bool autoRelocatePreprocessingInfo=true)
Remove a statement from its attach point of the AST. Automatically keep its associated preprocessing ...
ROSE_DLL_API SgOmpClauseBodyStatement * findEnclosingOmpClauseBodyStatement(SgStatement *s)
Find enclosing OpenMP clause body statement from s. If s is already one, return it directly.
ROSE_DLL_API bool scopeHasStatementsFromSameFile(SgScopeStatement *scope)
This function supports the token-based unparsing when used with unparsing of header files to know whe...
ROSE_DLL_API SgSourceFile * getEnclosingSourceFile(SgNode *n, const bool includingSelf=false)
Find enclosing source file node.
void rebuildSymbolTable(SgScopeStatement *scope)
Regenerate the symbol table.
ROSE_DLL_API SgSymbol * lookupSymbolInParentScopes(const SgName &name, SgScopeStatement *currentScope=NULL, SgTemplateParameterPtrList *templateParameterList=NULL, SgTemplateArgumentPtrList *templateArgumentList=NULL)
Find a symbol in current and ancestor scopes for a given variable name, starting from top of ScopeSta...
void setBaseTypeDefiningDeclaration(SgVariableDeclaration *var_decl, SgDeclarationStatement *base_decl)
a better version for SgVariableDeclaration::set_baseTypeDefininingDeclaration(), handling all side ef...
ROSE_DLL_API void pastePreprocessingInfo(SgLocatedNode *dst_node, PreprocessingInfo::RelativePositionType pos, AttachedPreprocessingInfoType &saved_buf)
Paste preprocessing information from a buffer to a destination node. Used in combination of cutPrepro...
ROSE_DLL_API SgStatement * lastFrontEndSpecificStatement(SgGlobal *globalScope)
Function to delete AST subtree's nodes only, users must take care of any dangling pointers,...
ROSE_DLL_API SgFunctionType * findFunctionType(SgType *return_type, SgFunctionParameterTypeList *typeList)
Find the function type matching a function signature plus a given return type.
std::set< unsigned int > collectSourceSequenceNumbers(SgNode *astNode)
Collect all read and write references within stmt, which can be a function, a scope statement,...
ROSE_DLL_API bool is_OpenMP_language()
ROSE_DLL_API std::set< SgNode * > getFrontendSpecificNodes()
Find a node by type using upward traversal.
ROSE_DLL_API bool mergeAssignmentWithDeclaration(SgExprStatement *assign_stmt, SgVariableDeclaration *decl, bool removeAssignStmt=true)
Merge an assignment into its upstream declaration statement. Callers should make sure the merge is se...
ROSE_DLL_API void setFortranNumericLabel(SgStatement *stmt, int label_value, SgLabelSymbol::label_type_enum label_type=SgLabelSymbol::e_start_label_type, SgScopeStatement *label_scope=NULL)
Set a numerical label for a Fortran statement. The statement should have a enclosing function definit...
ROSE_DLL_API SgType * lookupNamedTypeInParentScopes(const std::string &type_name, SgScopeStatement *scope=NULL)
Lookup a named type based on its name, bottomup searching from a specified scope. Note name collison ...
ROSE_DLL_API SgFile * processFile(SgProject *, std::string, bool unparse=false)
Invoke JavaRose to translate a given file and put the resulting AST in the global space of the projec...
bool get(const Word *words, size_t idx)
Return a single bit.
void swap_child(SageNode &lhs, SageNode &rhs, SageChild *(SageNode::*getter)() const, void(SageNode::*setter)(SageChild *))
swaps children (of equal kind) between two ancestor nodes of the same type
std::remove_const< typenamestd::remove_reference< RoseVisitor >::type >::type dispatch(RoseVisitor &&rv, SgNode *n)
uncovers the type of SgNode and passes it to an function "handle" in RoseVisitor.
This file implements generic (template) sage query functions Currently this includes functions for: