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