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