OpenADFortTk (basic)
src/xaif2whirl/AdjustFunctions.cxx
Go to the documentation of this file.
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines