void COleFileSystem::SortList(NodeList_t& node_list) { //printf("sort len = %d\n", node_list.size() ); sort(node_list.begin(), node_list.end(), oleCompare); // stable_sort Compare }
// =========================================================== //! Fixes up references in a block to point to alternative symbols. // based on an existing symbol-to-symbol map // Also called variable substitution. static void remapVarSyms (const VarSymRemap_t& vsym_remap, // regular shared variables const ASTtools::VarSymSet_t& pdSyms, // special shared variables const VarSymRemap_t& private_remap, // variables using private copies SgBasicBlock* b) { // Check if variable remapping is even needed. if (vsym_remap.empty() && private_remap.empty()){ //cout << "no remapping " << endl ; return; } // Find all variable references typedef Rose_STL_Container<SgNode *> NodeList_t; NodeList_t refs = NodeQuery::querySubTree (b, V_SgVarRefExp); // For each of the references , for (NodeList_t::iterator i = refs.begin (); i != refs.end (); ++i) { // Reference possibly in need of fix-up. SgVarRefExp* ref_orig = isSgVarRefExp (*i); ROSE_ASSERT (ref_orig); // Search for a symbol which needs to be replaced. // cout << "this is the symbol " <<ref_orig->get_symbol()->get_name().str() << endl ; VarSymRemap_t::const_iterator ref_new = vsym_remap.find (ref_orig->get_symbol ()); VarSymRemap_t::const_iterator ref_private = private_remap.find (ref_orig->get_symbol ()); // a variable could be both a variable needing passing original value and private variable // such as OpenMP firstprivate, lastprivate and reduction variable // For variable substitution, private remap has higher priority // remapping private variables if (ref_private != private_remap.end()) { // get the replacement variable SgVariableSymbol* sym_new = ref_private->second; // Do the replacement ref_orig->set_symbol (sym_new); } else if (ref_new != vsym_remap.end ()) // Needs replacement, regular shared variables { if(Outliner::enable_debug) { cout << "replace this " << "variable with that " << endl ; } SgVariableSymbol* sym_new = ref_new->second; if (Outliner::temp_variable || Outliner::useStructureWrapper) // uniform handling if temp variables of the same type are used {// two cases: variable using temp vs. variables using pointer dereferencing! if (pdSyms.find(ref_orig->get_symbol())==pdSyms.end()) //using temp ref_orig->set_symbol(sym_new); else { SgPointerDerefExp * deref_exp = SageBuilder::buildPointerDerefExp(buildVarRefExp(sym_new)); deref_exp->set_need_paren(true); SageInterface::replaceExpression(isSgExpression(ref_orig),isSgExpression(deref_exp)); } } else // no variable cloning is used { if (is_C_language()) // old method of using pointer dereferencing indiscriminately for C input // TODO compare the orig and new type, use pointer dereferencing only when necessary { SgPointerDerefExp * deref_exp = SageBuilder::buildPointerDerefExp(buildVarRefExp(sym_new)); deref_exp->set_need_paren(true); SageInterface::replaceExpression(isSgExpression(ref_orig),isSgExpression(deref_exp)); } else ref_orig->set_symbol (sym_new); } } //find an entry } // for every refs }