00001 #include "astQuery.h"
00002
00003
00011 #ifndef OMP_LOWERING_H
00012 #define OMP_LOWERING_H
00013 namespace OmpSupport
00014 {
00016
00017 enum omp_rtl_enum
00018 {
00019 e_gomp,
00020 e_omni,
00021 e_last_rtl
00022 };
00023 extern unsigned int nCounter;
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 };
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
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
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
00115
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 }
00161
00162 #endif //OMP_LOWERING_H