|
OpenADFortTk (basic)
|
00001 // -*-Mode: C++;-*- 00002 // $Header: /m_home/m_utkej/Argonne/cvs2svn/cvs/OpenADFortTk/src/whirl2xaif/XlationContext.cxx,v 1.19 2007-10-08 18:28:34 utke Exp $ 00003 00004 00005 #include <stdio.h> 00006 #include "Open64IRInterface/SymTab.h" 00007 #include "Diagnostics.h" 00008 #include "XlationContext.h" 00009 00010 namespace whirl2xaif{ 00011 00012 XlationContext::XlationContext(unsigned int aStackPosition) : 00013 myWNp(0), 00014 myNextVertexId(0), 00015 myNextEdgeId(0), 00016 myFlags(0), 00017 myStackPosition(aStackPosition) { 00018 } 00019 00020 XlationContext::~XlationContext() { 00021 } 00022 00023 WN* XlationContext::getWN() const { 00024 if (!myWNp) 00025 FORTTK_DIE("XlationContext::getWN: myWNp not set"); 00026 return myWNp; 00027 } 00028 00029 bool XlationContext::hasWN() const { 00030 return (myWNp)?true:false; 00031 } 00032 00033 void XlationContext::setWN(WN* aWNp) { 00034 if (!aWNp) 00035 FORTTK_DIE("XlationContext::setWN: null pointer passed"); 00036 if (myWNp) 00037 FORTTK_MSG(4,"XlationContext::setWN: already set to " << myWNp << " new " << aWNp); 00038 myWNp = aWNp; 00039 } 00040 00041 unsigned int XlationContext::getNewVertexId() { 00042 return ++myNextVertexId; 00043 } 00044 00045 unsigned int XlationContext::getVertexId() const { 00046 if (!myNextVertexId) 00047 FORTTK_DIE("XlationContext::getVertexId: invalid use"); 00048 return myNextVertexId; 00049 } 00050 00051 unsigned int XlationContext::peekVertexId() const { 00052 return myNextVertexId + 1; 00053 } 00054 00055 unsigned int XlationContext::getNewEdgeId() { 00056 return ++myNextEdgeId; 00057 } 00058 00059 unsigned int XlationContext::getEdgeId() const { 00060 if (!myNextEdgeId) 00061 FORTTK_DIE("XlationContext::getEdgeId: invalid use"); 00062 return myNextEdgeId; 00063 } 00064 00065 unsigned int XlationContext::peekEdgeId() const { 00066 return myNextEdgeId + 1; 00067 } 00068 00069 bool XlationContext::isFlag(XlationContext::Flags_E f) const { 00070 return (myFlags & f); 00071 } 00072 void XlationContext::setFlag(XlationContext::Flags_E f) { 00073 FORTTK_MSG(2,"XlationContext::setFlag: " 00074 << flagToString(f).c_str() 00075 << " for " 00076 << toString().c_str()); 00077 myFlags = myFlags | f; 00078 } 00079 void XlationContext::unsetFlag(XlationContext::Flags_E f) { 00080 FORTTK_MSG(2,"XlationContext::unsetFlag: " 00081 << flagToString(f).c_str() 00082 << " for " 00083 << toString().c_str()); 00084 myFlags = myFlags & ~f; 00085 } 00086 00087 void XlationContext::inheritFlags(const XlationContext& parentContext) { 00088 // only ASSIGN and VARREF are inherited 00089 myFlags = myFlags | (parentContext.myFlags & (ASSIGN|VARREF|HAS_NO_ARR_ELMT)); 00090 } 00091 00092 std::string XlationContext::flagToString(XlationContext::Flags_E aFlag) { 00093 std::string returnString; 00094 switch (aFlag) { 00095 case NOFLAG: 00096 returnString=""; 00097 break; 00098 case ASSIGN: 00099 returnString="assign"; 00100 break; 00101 case VARREF: 00102 returnString="varref"; 00103 break; 00104 case DEREF_ADDR: 00105 returnString="deref_addr"; 00106 break; 00107 case HAS_LOGICAL_ARG: 00108 returnString="has_logical_arg"; 00109 break; 00110 case IS_LOGICAL_ARG: 00111 returnString="is_logical_arg"; 00112 break; 00113 case IS_LOGICAL_OPERATION: 00114 returnString="is_logical_operation"; 00115 break; 00116 case IO_STMT: 00117 returnString="io_stmt"; 00118 break; 00119 case DEREF_IO_ITEM: 00120 returnString="deref_io_item"; 00121 break; 00122 case ORIGFMT_IOCTRL: 00123 returnString="origfmt_ioctrl"; 00124 break; 00125 case FMT_IO: 00126 returnString="fmt_io"; 00127 break; 00128 case CRAY_IO: 00129 returnString="cray_io"; 00130 break; 00131 case HAS_NO_ARR_ELMT: 00132 returnString="has_no_arr_elmt"; 00133 break; 00134 default: 00135 FORTTK_DIE("XlationContext::flagToString: unexpected input " << aFlag ); 00136 break; 00137 } 00138 return returnString; 00139 } 00140 00141 std::string XlationContext::toString()const { 00142 ostringstream o; 00143 o << "(" << myStackPosition << ",wn=" << myWNp; 00144 if (isFlag(ASSIGN)) o << flagToString(ASSIGN).c_str(); 00145 if (isFlag(VARREF)) o << flagToString(VARREF).c_str(); 00146 if (isFlag(DEREF_ADDR)) o << flagToString(DEREF_ADDR).c_str(); 00147 if (isFlag(HAS_LOGICAL_ARG)) o << flagToString(HAS_LOGICAL_ARG).c_str(); 00148 if (isFlag(IS_LOGICAL_ARG)) o << flagToString(IS_LOGICAL_ARG).c_str(); 00149 if (isFlag(IS_LOGICAL_OPERATION))o << flagToString(IS_LOGICAL_OPERATION).c_str(); 00150 if (isFlag(IO_STMT)) o << flagToString(IO_STMT).c_str(); 00151 if (isFlag(DEREF_IO_ITEM)) o << flagToString(DEREF_IO_ITEM).c_str(); 00152 if (isFlag(ORIGFMT_IOCTRL)) o << flagToString(ORIGFMT_IOCTRL).c_str(); 00153 if (isFlag(FMT_IO)) o << flagToString(FMT_IO).c_str(); 00154 if (isFlag(CRAY_IO)) o << flagToString(CRAY_IO).c_str(); 00155 if (isFlag(HAS_NO_ARR_ELMT)) o << flagToString(HAS_NO_ARR_ELMT).c_str(); 00156 o << ")" << std::ends; 00157 return o.str(); 00158 } 00159 00160 void XlationContext::dump(std::ostream& o, const std::string& indent) const { 00161 o << indent.c_str() << toString().c_str() << std::endl; 00162 } 00163 00164 void 00165 XlationContext::ddump() const { 00166 dump(std::cerr,""); 00167 } 00168 00169 }