omp_lowering.h

Go to the documentation of this file.
00001 #include "astQuery.h"
00002 //#include "sage3basic.h"
00003 
00011 #ifndef OMP_LOWERING_H
00012 #define OMP_LOWERING_H 
00013 namespace OmpSupport
00014 {
00016   // We support both Omni and GCC OpenMP runtime libraries
00017   enum omp_rtl_enum 
00018   {
00019     e_gomp,
00020     e_omni,
00021     e_last_rtl
00022   };
00023   extern unsigned int nCounter; // translation generated variable counter, used to avoid name collision
00024 
00025   extern omp_rtl_enum rtl_type; 
00026   typedef std::map<const SgVariableSymbol *, SgVariableSymbol *> VariableSymbolMap_t;
00027 
00028   void commandLineProcessing(std::vector<std::string> &argvList);
00029 
00031   void lower_omp(SgSourceFile*);
00032 
00033 
00035   void insertRTLHeaders(SgSourceFile*);
00036 
00038   void insertRTLinitAndCleanCode(SgSourceFile* ); 
00039 
00042   class translationDriver: public AstSimpleProcessing
00043   { 
00044     protected:
00045       void visit(SgNode*);
00046   }; //translationDriver
00047 
00049   void transOmpParallel(SgNode* node);
00050 
00052   void transOmpSections(SgNode* node);
00053 
00055   void transOmpTask(SgNode* node);
00056 
00058   void transOmpLoop(SgNode* node);
00059 
00061   //void transOmpDo(SgNode* node);
00062 
00063 
00065   void transOmpBarrier(SgNode* node);
00066 
00068   void transOmpFlush(SgNode* node);
00069 
00071   void transOmpTaskwait(SgNode* node);
00072 
00074   void transOmpThreadprivate(SgNode* node);
00075 
00077   void transOmpOrdered(SgNode* node);
00079   void transOmpAtomic(SgNode* node);
00081   void transOmpCritical(SgNode* node);
00083   void transOmpMaster(SgNode* node);
00085   void transOmpSingle(SgNode* node);
00086 
00088  // It calls the ROSE AST outliner internally. 
00089  SgFunctionDeclaration* generateOutlinedTask(SgNode* node, std::string& wrapper_name, std::set<SgVariableSymbol*>& syms, std::set<SgInitializedName*>& readOnlyVars);
00090  
00092   void transOmpVariables(SgStatement * ompStmt, SgBasicBlock* bb1, SgExpression* orig_loop_upper = NULL);
00093 
00095   SgInitializedNamePtrList collectAllClauseVariables (SgOmpClauseBodyStatement * clause_stmt);
00096 
00098   SgInitializedNamePtrList collectClauseVariables (SgOmpClauseBodyStatement * clause_stmt, const VariantT& vt);
00099 
00101   SgInitializedNamePtrList collectClauseVariables (SgOmpClauseBodyStatement * clause_stmt, const VariantVector& vvt);
00102 
00104   bool isInClauseVariableList(SgInitializedName* var, SgOmpClauseBodyStatement * clause_stmt, const VariantT& vt);
00105 
00107   bool isInClauseVariableList(SgInitializedName* var, SgOmpClauseBodyStatement * clause_stmt, const VariantVector& vvt);
00108 
00110   int replaceVariableReferences(SgNode* root, SgVariableSymbol* oldVar, SgVariableSymbol* newVar);
00111 
00113   int replaceVariableReferences(SgNode* root,  VariableSymbolMap_t varRemap);
00114   // I decided to reuse the existing Outliner work instead of coding a new one
00115   //SgFunctionDeclaration* generateOutlinedFunction(SgNode* node);
00116   
00118   void addClauseVariable(SgInitializedName* var, SgOmpClauseBodyStatement * clause_stmt, const VariantT& vt);
00119 
00121   SgOmpVariablesClause* buildOmpVariableClause(SgOmpClauseBodyStatement * clause_stmt, const VariantT& vt);
00122 
00124   bool hasClause(SgOmpClauseBodyStatement* clause_stmt, const VariantT & vt);
00125 
00127   Rose_STL_Container<SgOmpClause*>  getClause(SgOmpClauseBodyStatement* clause_stmt, const VariantT & vt);
00128 
00130   bool useStaticSchedule(SgOmpClauseBodyStatement* omp_loop);
00131 
00133   SgOmpClause::omp_reduction_operator_enum getReductionOperationType(SgInitializedName* init_name, SgOmpClauseBodyStatement* clause_stmt);
00134 
00136   SgExpression* createInitialValueExp(SgOmpClause::omp_reduction_operator_enum r_operator);
00137 
00139   std::string generateGOMPLoopStartFuncName (bool isOrdered, SgOmpClause::omp_schedule_kind_enum s_kind);
00140 
00142   std::string generateGOMPLoopNextFuncName (bool isOrdered, SgOmpClause::omp_schedule_kind_enum s_kind);
00143 
00145   std::string toString(SgOmpClause::omp_schedule_kind_enum s_kind);
00146 
00148   int patchUpPrivateVariables(SgFile*);
00149 
00151   int patchUpFirstprivateVariables(SgFile*);
00152 
00154   std::set<SgInitializedName*> collectThreadprivateVariables();
00155 
00157   SgVariableDeclaration * buildAndInsertDeclarationForOmp(const std::string &name, SgType *type, SgInitializer *varInit, SgBasicBlock *orig_scope);
00159   SgBasicBlock* getEnclosingRegionOrFuncDefinition (SgNode *);
00160 } // end namespace OmpSupport  
00161 
00162 #endif //OMP_LOWERING_H

Generated on Sat May 19 00:53:06 2012 for ROSE by  doxygen 1.4.7