|
OpenADFortTk (basic)
|
00001 // -*-Mode: C++;-*- 00002 // $Header: /m_home/m_utkej/Argonne/cvs2svn/cvs/OpenADFortTk/src/lib/support/ScalarizedRefTab.h,v 1.17 2007-10-08 18:28:32 utke Exp $ 00003 00004 #ifndef ScalarizedRefTab_H 00005 #define ScalarizedRefTab_H 00006 00007 #include <set> 00008 #include <map> 00009 #include <string> 00010 #include <iostream> 00011 00012 #include "Open64IRInterface/Open64BasicTypes.h" 00013 #include "Open64IRInterface/Open64IRInterface.hpp" 00014 #include "BaseMap.h" 00015 #include "Diagnostics.h" 00016 #include "ScalarizedRef.h" 00017 00018 namespace fortTkSupport { 00019 00020 class ScalarizedRefTab_Base 00021 { 00022 public: 00023 enum TableType { 00024 W2X, // A table optimized for WHIRL->XAIF lookups 00025 X2W // A table optimized for XAIF->WHIRL lookups 00026 }; 00027 00028 public: 00029 00030 typedef std::set<ScalarizedRef*> ScalarizedRefPoolTy; 00031 00032 ScalarizedRefPoolTy::iterator RefPoolBegin() 00033 { return scalarizedRefPool.begin(); } 00034 00035 ScalarizedRefPoolTy::iterator RefPoolEnd() 00036 { return scalarizedRefPool.end(); } 00037 00038 protected: 00039 ScalarizedRefTab_Base(); 00040 virtual ~ScalarizedRefTab_Base(); 00041 00042 // Insert 'x' into the ref pool if not already there 00043 void 00044 InsertIntoPool(ScalarizedRef* x) 00045 { 00046 if (scalarizedRefPool.find(x) == scalarizedRefPool.end()) { 00047 scalarizedRefPool.insert(x); 00048 } 00049 } 00050 00051 protected: 00052 00053 // Because one scalarized ref can be associated with several actual 00054 // references, we need a pool in which these references are entered 00055 // only once. 00056 ScalarizedRefPoolTy scalarizedRefPool; 00057 }; 00058 00059 00060 00061 00062 //*************************************************************************** 00063 // ScalarizedRefTab 00064 //*************************************************************************** 00065 00066 // ScalarizedRefTab: A dummy template that will be specialized below. 00067 // For mapping certain non-scalar WHIRL references to dummy scalar 00068 // variables 00069 template <ScalarizedRefTab_Base::TableType TabTy> 00070 class ScalarizedRefTab 00071 : public ScalarizedRefTab_Base, 00072 public BaseMap<void*, void*> 00073 { 00074 }; 00075 00076 00077 // --------------------------------------------------------- 00078 // ScalarizedRefTab: Specialization for W2X 00079 // --------------------------------------------------------- 00080 typedef ScalarizedRefTab<ScalarizedRefTab_Base::W2X> 00081 ScalarizedRefTab_W2X; 00082 00083 template <> 00084 class ScalarizedRefTab<ScalarizedRefTab_Base::W2X> 00085 : public ScalarizedRefTab_Base, 00086 public BaseMap<WN*, ScalarizedRef*> { 00087 00088 public: 00089 // Constructor allocates an empty data structure 00090 ScalarizedRefTab(); 00091 ScalarizedRefTab(PU_Info* pu) { Create(pu); } 00092 virtual ~ScalarizedRefTab(); 00093 00094 // Create: Fills in map 00095 void Create(PU_Info* pu); 00096 00097 // Find: 00098 virtual ScalarizedRef* 00099 Find(WN* x_, bool mustFind = false) const 00100 { return BaseMap<WN*, ScalarizedRef*>::Find(x_, mustFind); } 00101 00102 // Find: a version with const params for convenience 00103 ScalarizedRef* 00104 Find(const WN* x_, bool mustFind = false) const 00105 { 00106 WN* x = const_cast<WN*>(x_); 00107 return BaseMap<WN*, ScalarizedRef*>::Find(x, mustFind); 00108 } 00109 00110 00111 // Insert: override to manage scalar ref pool 00112 virtual bool 00113 Insert(WN* x, ScalarizedRef* y) { 00114 InsertIntoPool(y); 00115 return BaseMap<WN*, ScalarizedRef*>::Insert(x, y); 00116 } 00117 00118 // Insert: a version with const params for convenience 00119 bool 00120 Insert(const WN* x_, const ScalarizedRef* y_) { 00121 WN* x = const_cast<WN*>(x_); 00122 ScalarizedRef* y = const_cast<ScalarizedRef*>(y_); 00123 return Insert(x, y); 00124 } 00125 00126 00127 // Dump contents for inspection 00128 virtual void Dump(std::ostream& o = std::cerr) const; 00129 virtual void DDump() const; 00130 00131 void DumpFmt(std::ostream& o = std::cerr, const char* pre = "") const; 00132 00133 protected: 00134 // Should not be used 00135 ScalarizedRefTab(const ScalarizedRefTab& x) { } 00136 ScalarizedRefTab& operator=(const ScalarizedRefTab& x) { return *this; } 00137 00138 private: 00139 }; 00140 00141 00142 // --------------------------------------------------------- 00143 // ScalarizedRefTabMap: Specialization for W2X 00144 // --------------------------------------------------------- 00145 00146 class ScalarizedRefTabMap_W2X 00147 : public BaseMap<PU_Info*, ScalarizedRefTab_W2X*> { 00148 00149 public: 00150 ScalarizedRefTabMap_W2X(); 00151 ScalarizedRefTabMap_W2X(PU_Info* pu_forest) { Create(pu_forest); } 00152 virtual ~ScalarizedRefTabMap_W2X(); 00153 00154 void Create(PU_Info* pu_forest); 00155 }; 00156 00157 00158 //*************************************************************************** 00159 // Variable References and WHIRL/XAIF 00160 //*************************************************************************** 00161 00162 // See tech report for explanation of three categories of references. 00163 00164 00165 //*************************************************************************** 00166 // 00167 //*************************************************************************** 00168 00169 // ForAllScalarizableRefsOp: Abstract base class for the operator passed 00170 // to the function 'ForAllScalarizableRefs(...)'. Any caller of this 00171 // function must define its own operator object, using this class 00172 // as a base class and providing a definition for 'operator()'. 00173 class ForAllScalarizableRefsOp { 00174 public: 00175 ForAllScalarizableRefsOp() { } 00176 virtual ~ForAllScalarizableRefsOp() { } 00177 00178 // Given a non-scalar reference 'wn', does something interesting. 00179 // Returns 0 on success; non-zero on error. 00180 virtual int operator()(const WN* wn) = 0; 00181 private: 00182 }; 00183 00184 void 00185 ForAllScalarizableRefs(const WN* wn, ForAllScalarizableRefsOp& op); 00186 00187 00188 00189 // AddToScalarizedRefTabOp: Given a ScalarizedRefTab, add references to it 00190 class AddToScalarizedRefTabOp : public ForAllScalarizableRefsOp { 00191 public: 00192 AddToScalarizedRefTabOp(ScalarizedRefTab_W2X* tab_, PU_Info* curpu_); 00193 virtual ~AddToScalarizedRefTabOp(); 00194 00195 ScalarizedRefTab_W2X* GetTab() { return tab; } 00196 00197 // Given a non-scalar reference 'wn', create a dummy variable and 00198 // add to the map. 00199 int operator()(const WN* wn); 00200 00201 private: 00202 typedef std::map<std::string, ScalarizedRef*> WorkMapTy; 00203 00204 private: 00205 ScalarizedRefTab_W2X* tab; 00206 PU_Info* curpu; 00207 00208 OA::OA_ptr<Open64IRInterface> ir; 00209 WorkMapTy workmap; 00210 }; 00211 00212 } 00213 00214 #endif