|
OpenADFortTk (basic)
|
00001 #include "Open64IRInterface/WhirlGlobalStateUtils.h" 00002 #include "Open64IRInterface/wn_attr.h" 00003 #include "AdjustFunctions.h" 00004 #include "Diagnostics.h" 00005 #include "XlateExpression.h" 00006 00007 namespace xaif2whirl { 00008 00009 extern TY_IDX ActiveTypeTyIdx; 00010 extern TY_IDX ActiveTypeInitializedTyIdx; 00011 00012 void AdjustFunctions::doIt() { 00013 if (!myPUInfoForest_p) { return; } 00014 // Loop through all the PU_Infos 00015 PU_Info* aPUInfoTree_p; 00016 for (aPUInfoTree_p=myPUInfoForest_p; aPUInfoTree_p!= NULL; aPUInfoTree_p=PU_Info_next(aPUInfoTree_p)) { 00017 forPUInfoTree(aPUInfoTree_p); 00018 } 00019 } 00020 00021 void AdjustFunctions::forPUInfoTree(PU_Info* aPUInfoTree_p) { 00022 if (!aPUInfoTree_p) { return; } 00023 forPUInfo(aPUInfoTree_p); 00024 for (PU_Info *aPUInfosubtree_p = PU_Info_child(aPUInfoTree_p); 00025 aPUInfosubtree_p != NULL; 00026 aPUInfosubtree_p = PU_Info_next(aPUInfosubtree_p)) { 00027 forPUInfoTree(aPUInfosubtree_p); 00028 } 00029 } 00030 00031 bool AdjustFunctions::doSymbol(ST* theST_p) { 00032 return (ST_level(theST_p)==1 00033 && 00034 (ST_type(theST_p)==ActiveTypeTyIdx 00035 || 00036 ST_type(theST_p)==ActiveTypeInitializedTyIdx)); 00037 } 00038 00039 void AdjustFunctions::forSubTree(WN_TREE_CONTAINER<PRE_ORDER>& aWNPtree) { 00040 WN_TREE_CONTAINER<PRE_ORDER>::iterator aWNPtreeIterator=aWNPtree.begin(); 00041 bool skipKids=false; 00042 while (aWNPtreeIterator != aWNPtree.end()) { 00043 WN* currWN_p = aWNPtreeIterator.Wn(); 00044 OPERATOR opr = WN_operator(currWN_p); 00045 if (WN_has_sym(currWN_p) 00046 && 00047 doSymbol(WN_st(currWN_p))) { 00048 switch (opr) { 00049 case OPR_STID: { 00050 // do the rhs first : 00051 WN_TREE_CONTAINER<PRE_ORDER> subTree(WN_kid0(currWN_p)); 00052 forSubTree(subTree); 00053 // make a new LDID 00054 WN* newLDID_p=WN_Ldid(TY_mtype(WN_Tree_Type(currWN_p)), 00055 0, 00056 WN_st_idx(currWN_p), 00057 0, 00058 0); 00059 WN* wrappedLDID_p=XlateExpression::createValueSelector(newLDID_p); 00060 // make a new ISTORE 00061 TY_IDX lhsTY_IDX=WN_Tree_Type(wrappedLDID_p); 00062 WN* newIstore_p = WN_Istore(TY_mtype(lhsTY_IDX), 00063 0, 00064 lhsTY_IDX, 00065 wrappedLDID_p, 00066 WN_COPY_Tree(WN_kid0(currWN_p)) , 00067 0); 00068 aWNPtreeIterator.Replace(newIstore_p); 00069 skipKids=true; 00070 break; 00071 } 00072 default: { 00073 aWNPtreeIterator.Replace(XlateExpression::createValueSelector(currWN_p)); 00074 skipKids=true; 00075 break; 00076 } 00077 } 00078 } 00079 // advance the iterator 00080 if (skipKids){ 00081 aWNPtreeIterator.WN_TREE_next_skip(); 00082 skipKids=false; 00083 } 00084 else 00085 ++aWNPtreeIterator; 00086 } 00087 00088 } 00089 00090 void AdjustFunctions::forPUInfo(PU_Info* aPUInfo_p) { 00091 PU_SetGlobalState(aPUInfo_p); 00092 WN* thePU_WN_p = PU_Info_tree_ptr(aPUInfo_p); 00093 WN_TREE_CONTAINER<PRE_ORDER> aWNPtree(thePU_WN_p); 00094 WN_TREE_CONTAINER<PRE_ORDER>::iterator aWNPtreeIterator=aWNPtree.begin(); 00095 bool skipKids=false; 00096 while (aWNPtreeIterator != aWNPtree.end()) { 00097 WN* currWN_p = aWNPtreeIterator.Wn(); 00098 OPERATOR opr = WN_operator(currWN_p); 00099 if (opr==OPR_FUNC_ENTRY) { 00100 ST* st_p=WN_st(currWN_p); 00101 TY_IDX funtype(ST_pu_type(st_p)); 00102 TY_IDX return_ty = TY_ret_type(funtype); 00103 if (!(return_ty != (TY_IDX) 0 && TY_kind(return_ty) != KIND_VOID)) { 00104 // not a function 00105 // std::cout << "skipping over :" << ST_name(st_p) << std::endl; 00106 skipKids=true; 00107 } 00108 else { 00109 // std::cout << "not skipping over :" << ST_name(st_p) << std::endl; 00110 WN_TREE_CONTAINER<PRE_ORDER> subTree(currWN_p); 00111 forSubTree(subTree); 00112 } 00113 } 00114 // advance the iterator 00115 if (skipKids){ 00116 aWNPtreeIterator.WN_TREE_next_skip(); 00117 skipKids=false; 00118 } 00119 else 00120 ++aWNPtreeIterator; 00121 } 00122 } 00123 00124 } 00125