void AArch64A57FPLoadBalancing:: scanInstruction(MachineInstr *MI, unsigned Idx, std::map<unsigned, Chain*> &ActiveChains, std::set<std::unique_ptr<Chain>> &AllChains) { // Inspect "MI", updating ActiveChains and AllChains. if (isMul(MI)) { for (auto &I : MI->uses()) maybeKillChain(I, Idx, ActiveChains); for (auto &I : MI->defs()) maybeKillChain(I, Idx, ActiveChains); // Create a new chain. Multiplies don't require forwarding so can go on any // unit. unsigned DestReg = MI->getOperand(0).getReg(); DEBUG(dbgs() << "New chain started for register " << TRI->getName(DestReg) << " at " << *MI); auto G = llvm::make_unique<Chain>(MI, Idx, getColor(DestReg)); ActiveChains[DestReg] = G.get(); AllChains.insert(std::move(G)); } else if (isMla(MI)) { // It is beneficial to keep MLAs on the same functional unit as their // accumulator operand. unsigned DestReg = MI->getOperand(0).getReg(); unsigned AccumReg = MI->getOperand(3).getReg(); maybeKillChain(MI->getOperand(1), Idx, ActiveChains); maybeKillChain(MI->getOperand(2), Idx, ActiveChains); if (DestReg != AccumReg) maybeKillChain(MI->getOperand(0), Idx, ActiveChains); if (ActiveChains.find(AccumReg) != ActiveChains.end()) { DEBUG(dbgs() << "Chain found for accumulator register " << TRI->getName(AccumReg) << " in MI " << *MI); // For simplicity we only chain together sequences of MULs/MLAs where the // accumulator register is killed on each instruction. This means we don't // need to track other uses of the registers we want to rewrite. // // FIXME: We could extend to handle the non-kill cases for more coverage. if (MI->getOperand(3).isKill()) { // Add to chain. DEBUG(dbgs() << "Instruction was successfully added to chain.\n"); ActiveChains[AccumReg]->add(MI, Idx, getColor(DestReg)); // Handle cases where the destination is not the same as the accumulator. if (DestReg != AccumReg) { ActiveChains[DestReg] = ActiveChains[AccumReg]; ActiveChains.erase(AccumReg); } return; } DEBUG(dbgs() << "Cannot add to chain because accumulator operand wasn't " << "marked <kill>!\n"); maybeKillChain(MI->getOperand(3), Idx, ActiveChains); } DEBUG(dbgs() << "Creating new chain for dest register " << TRI->getName(DestReg) << "\n"); auto G = llvm::make_unique<Chain>(MI, Idx, getColor(DestReg)); ActiveChains[DestReg] = G.get(); AllChains.insert(std::move(G)); } else { // Non-MUL or MLA instruction. Invalidate any chain in the uses or defs // lists. for (auto &I : MI->uses()) maybeKillChain(I, Idx, ActiveChains); for (auto &I : MI->defs()) maybeKillChain(I, Idx, ActiveChains); } }
void StoreGUID(QueryResult result, uint32 field, std::set<uint32>& guids) { Field* fields = result->Fetch(); uint32 guid = fields[field].GetUInt32(); if (guid) guids.insert(guid); }
// ------------------------------------------------------------------------------------------------ // List all extensions handled by this loader void BlenderImporter::GetExtensionList(std::set<std::string>& app) { app.insert("blend"); }
/// For a given conditional copy, predicate the definition of the source of /// the copy under the given condition (using the same predicate register as /// the copy). bool HexagonExpandCondsets::predicate(MachineInstr &TfrI, bool Cond, std::set<unsigned> &UpdRegs) { // TfrI - A2_tfr[tf] Instruction (not A2_tfrsi). unsigned Opc = TfrI.getOpcode(); (void)Opc; assert(Opc == Hexagon::A2_tfrt || Opc == Hexagon::A2_tfrf); DEBUG(dbgs() << "\nattempt to predicate if-" << (Cond ? "true" : "false") << ": " << TfrI); MachineOperand &MD = TfrI.getOperand(0); MachineOperand &MP = TfrI.getOperand(1); MachineOperand &MS = TfrI.getOperand(2); // The source operand should be a <kill>. This is not strictly necessary, // but it makes things a lot simpler. Otherwise, we would need to rename // some registers, which would complicate the transformation considerably. if (!MS.isKill()) return false; // Avoid predicating instructions that define a subregister if subregister // liveness tracking is not enabled. if (MD.getSubReg() && !MRI->shouldTrackSubRegLiveness(MD.getReg())) return false; RegisterRef RT(MS); unsigned PredR = MP.getReg(); MachineInstr *DefI = getReachingDefForPred(RT, TfrI, PredR, Cond); if (!DefI || !isPredicable(DefI)) return false; DEBUG(dbgs() << "Source def: " << *DefI); // Collect the information about registers defined and used between the // DefI and the TfrI. // Map: reg -> bitmask of subregs ReferenceMap Uses, Defs; MachineBasicBlock::iterator DefIt = DefI, TfrIt = TfrI; // Check if the predicate register is valid between DefI and TfrI. // If it is, we can then ignore instructions predicated on the negated // conditions when collecting def and use information. bool PredValid = true; for (MachineBasicBlock::iterator I = std::next(DefIt); I != TfrIt; ++I) { if (!I->modifiesRegister(PredR, nullptr)) continue; PredValid = false; break; } for (MachineBasicBlock::iterator I = std::next(DefIt); I != TfrIt; ++I) { MachineInstr *MI = &*I; // If this instruction is predicated on the same register, it could // potentially be ignored. // By default assume that the instruction executes on the same condition // as TfrI (Exec_Then), and also on the opposite one (Exec_Else). unsigned Exec = Exec_Then | Exec_Else; if (PredValid && HII->isPredicated(*MI) && MI->readsRegister(PredR)) Exec = (Cond == HII->isPredicatedTrue(*MI)) ? Exec_Then : Exec_Else; for (auto &Op : MI->operands()) { if (!Op.isReg()) continue; // We don't want to deal with physical registers. The reason is that // they can be aliased with other physical registers. Aliased virtual // registers must share the same register number, and can only differ // in the subregisters, which we are keeping track of. Physical // registers ters no longer have subregisters---their super- and // subregisters are other physical registers, and we are not checking // that. RegisterRef RR = Op; if (!TargetRegisterInfo::isVirtualRegister(RR.Reg)) return false; ReferenceMap &Map = Op.isDef() ? Defs : Uses; if (Op.isDef() && Op.isUndef()) { assert(RR.Sub && "Expecting a subregister on <def,read-undef>"); // If this is a <def,read-undef>, then it invalidates the non-written // part of the register. For the purpose of checking the validity of // the move, assume that it modifies the whole register. RR.Sub = 0; } addRefToMap(RR, Map, Exec); } } // The situation: // RT = DefI // ... // RD = TfrI ..., RT // If the register-in-the-middle (RT) is used or redefined between // DefI and TfrI, we may not be able proceed with this transformation. // We can ignore a def that will not execute together with TfrI, and a // use that will. If there is such a use (that does execute together with // TfrI), we will not be able to move DefI down. If there is a use that // executed if TfrI's condition is false, then RT must be available // unconditionally (cannot be predicated). // Essentially, we need to be able to rename RT to RD in this segment. if (isRefInMap(RT, Defs, Exec_Then) || isRefInMap(RT, Uses, Exec_Else)) return false; RegisterRef RD = MD; // If the predicate register is defined between DefI and TfrI, the only // potential thing to do would be to move the DefI down to TfrI, and then // predicate. The reaching def (DefI) must be movable down to the location // of the TfrI. // If the target register of the TfrI (RD) is not used or defined between // DefI and TfrI, consider moving TfrI up to DefI. bool CanUp = canMoveOver(TfrI, Defs, Uses); bool CanDown = canMoveOver(*DefI, Defs, Uses); // The TfrI does not access memory, but DefI could. Check if it's safe // to move DefI down to TfrI. if (DefI->mayLoad() || DefI->mayStore()) if (!canMoveMemTo(*DefI, TfrI, true)) CanDown = false; DEBUG(dbgs() << "Can move up: " << (CanUp ? "yes" : "no") << ", can move down: " << (CanDown ? "yes\n" : "no\n")); MachineBasicBlock::iterator PastDefIt = std::next(DefIt); if (CanUp) predicateAt(MD, *DefI, PastDefIt, MP, Cond, UpdRegs); else if (CanDown) predicateAt(MD, *DefI, TfrIt, MP, Cond, UpdRegs); else return false; if (RT != RD) { renameInRange(RT, RD, PredR, Cond, PastDefIt, TfrIt); UpdRegs.insert(RT.Reg); } removeInstr(TfrI); removeInstr(*DefI); return true; }
void PluginCache::scanDirectory(std::set<std::string> &foundBinFiles, const std::string &dir, bool recurse) { #ifdef CACHE_DEBUG printf("looking in %s for plugins\n", dir.c_str()); #endif #if defined (WINDOWS) WIN32_FIND_DATA findData; HANDLE findHandle; #else DIR *d = opendir(dir.c_str()); if (!d) { return; } #endif _pluginDirs.push_back(dir.c_str()); #if defined (UNIX) while (dirent *de = readdir(d)) #elif defined (WINDOWS) findHandle = FindFirstFile((dir + "\\*").c_str(), &findData); if (findHandle == INVALID_HANDLE_VALUE) { return; } while (1) #endif { #if defined (UNIX) std::string name = de->d_name; bool isdir = true; #else std::string name = findData.cFileName; bool isdir = (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0; #endif if (name.find(".ofx.bundle") != std::string::npos) { std::string barename = name.substr(0, name.length() - strlen(".bundle")); std::string bundlename = dir + DIRSEP + name; std::string binpath = dir + DIRSEP + name + DIRSEP "Contents" DIRSEP + ARCHSTR + DIRSEP + barename; foundBinFiles.insert(binpath); if (_knownBinFiles.find(binpath) == _knownBinFiles.end()) { #ifdef CACHE_DEBUG printf("found non-cached binary %s\n", binpath.c_str()); #endif _dirty = true; // the binary was not in the cache PluginBinary *pb = new PluginBinary(binpath, bundlename, this); _binaries.push_back(pb); _knownBinFiles.insert(binpath); for (int j=0;j<pb->getNPlugins();j++) { Plugin *plug = &pb->getPlugin(j); const APICache::PluginAPICacheI &api = plug->getApiHandler(); api.loadFromPlugin(plug); } } else { #ifdef CACHE_DEBUG printf("found cached binary %s\n", binpath.c_str()); #endif } } else { if (isdir && (recurse && name[0] != '@' && name != "." && name != "..")) { scanDirectory(foundBinFiles, dir + DIRSEP + name, recurse); } } #if defined(WINDOWS) int rval = FindNextFile(findHandle, &findData); if (rval == 0) { break; } #endif } #if defined(UNIX) closedir(d); #else FindClose(findHandle); #endif }
IGL_INLINE bool igl::collapse_edge( const std::function<void( const int, const Eigen::MatrixXd &, const Eigen::MatrixXi &, const Eigen::MatrixXi &, const Eigen::VectorXi &, const Eigen::MatrixXi &, const Eigen::MatrixXi &, double &, Eigen::RowVectorXd &)> & cost_and_placement, Eigen::MatrixXd & V, Eigen::MatrixXi & F, Eigen::MatrixXi & E, Eigen::VectorXi & EMAP, Eigen::MatrixXi & EF, Eigen::MatrixXi & EI, std::set<std::pair<double,int> > & Q, std::vector<std::set<std::pair<double,int> >::iterator > & Qit, Eigen::MatrixXd & C, int & e, int & e1, int & e2, int & f1, int & f2) { using namespace Eigen; if(Q.empty()) { // no edges to collapse return false; } std::pair<double,int> p = *(Q.begin()); if(p.first == std::numeric_limits<double>::infinity()) { // min cost edge is infinite cost return false; } Q.erase(Q.begin()); e = p.second; Qit[e] = Q.end(); std::vector<int> N = circulation(e, true,F,E,EMAP,EF,EI); std::vector<int> Nd = circulation(e,false,F,E,EMAP,EF,EI); N.insert(N.begin(),Nd.begin(),Nd.end()); const bool collapsed = collapse_edge(e,C.row(e),V,F,E,EMAP,EF,EI,e1,e2,f1,f2); if(collapsed) { // Erase the two, other collapsed edges Q.erase(Qit[e1]); Qit[e1] = Q.end(); Q.erase(Qit[e2]); Qit[e2] = Q.end(); // update local neighbors // loop over original face neighbors for(auto n : N) { if(F(n,0) != IGL_COLLAPSE_EDGE_NULL || F(n,1) != IGL_COLLAPSE_EDGE_NULL || F(n,2) != IGL_COLLAPSE_EDGE_NULL) { for(int v = 0; v<3; v++) { // get edge id const int ei = EMAP(v*F.rows()+n); // erase old entry Q.erase(Qit[ei]); // compute cost and potential placement double cost; RowVectorXd place; cost_and_placement(ei,V,F,E,EMAP,EF,EI,cost,place); // Replace in queue Qit[ei] = Q.insert(std::pair<double,int>(cost,ei)).first; C.row(ei) = place; } } } } else { // reinsert with infinite weight (the provided cost function must **not** // have given this un-collapsable edge inf cost already) p.first = std::numeric_limits<double>::infinity(); Qit[e] = Q.insert(p).first; } return collapsed; }
void jsil_languaget::modules_provided(std::set<std::string> &modules) { modules.insert(get_base_name(parse_path, true)); }
void Placement::updateBucketOpacities(SymbolBucket& bucket, std::set<uint32_t>& seenCrossTileIDs) { if (bucket.hasTextData()) bucket.text.opacityVertices.clear(); if (bucket.hasIconData()) bucket.icon.opacityVertices.clear(); if (bucket.hasCollisionBoxData()) bucket.collisionBox.dynamicVertices.clear(); if (bucket.hasCollisionCircleData()) bucket.collisionCircle.dynamicVertices.clear(); JointOpacityState duplicateOpacityState(false, false, true); const bool textAllowOverlap = bucket.layout.get<style::TextAllowOverlap>(); const bool iconAllowOverlap = bucket.layout.get<style::IconAllowOverlap>(); // If allow-overlap is true, we can show symbols before placement runs on them // But we have to wait for placement if we potentially depend on a paired icon/text // with allow-overlap: false. // See https://github.com/mapbox/mapbox-gl-native/issues/12483 JointOpacityState defaultOpacityState( textAllowOverlap && (iconAllowOverlap || !bucket.hasIconData() || bucket.layout.get<style::IconOptional>()), iconAllowOverlap && (textAllowOverlap || !bucket.hasTextData() || bucket.layout.get<style::TextOptional>()), true); for (SymbolInstance& symbolInstance : bucket.symbolInstances) { bool isDuplicate = seenCrossTileIDs.count(symbolInstance.crossTileID) > 0; auto it = opacities.find(symbolInstance.crossTileID); auto opacityState = defaultOpacityState; if (isDuplicate) { opacityState = duplicateOpacityState; } else if (it != opacities.end()) { opacityState = it->second; } if (it == opacities.end()) { opacities.emplace(symbolInstance.crossTileID, defaultOpacityState); } seenCrossTileIDs.insert(symbolInstance.crossTileID); if (symbolInstance.hasText) { auto opacityVertex = SymbolOpacityAttributes::vertex(opacityState.text.placed, opacityState.text.opacity); for (size_t i = 0; i < symbolInstance.horizontalGlyphQuads.size() * 4; i++) { bucket.text.opacityVertices.emplace_back(opacityVertex); } for (size_t i = 0; i < symbolInstance.verticalGlyphQuads.size() * 4; i++) { bucket.text.opacityVertices.emplace_back(opacityVertex); } if (symbolInstance.placedTextIndex) { bucket.text.placedSymbols[*symbolInstance.placedTextIndex].hidden = opacityState.isHidden(); } if (symbolInstance.placedVerticalTextIndex) { bucket.text.placedSymbols[*symbolInstance.placedVerticalTextIndex].hidden = opacityState.isHidden(); } } if (symbolInstance.hasIcon) { auto opacityVertex = SymbolOpacityAttributes::vertex(opacityState.icon.placed, opacityState.icon.opacity); if (symbolInstance.iconQuad) { bucket.icon.opacityVertices.emplace_back(opacityVertex); bucket.icon.opacityVertices.emplace_back(opacityVertex); bucket.icon.opacityVertices.emplace_back(opacityVertex); bucket.icon.opacityVertices.emplace_back(opacityVertex); } if (symbolInstance.placedIconIndex) { bucket.icon.placedSymbols[*symbolInstance.placedIconIndex].hidden = opacityState.isHidden(); } } auto updateCollisionBox = [&](const auto& feature, const bool placed) { if (feature.alongLine) { return; } auto dynamicVertex = CollisionBoxDynamicAttributes::vertex(placed, false); for (size_t i = 0; i < feature.boxes.size() * 4; i++) { bucket.collisionBox.dynamicVertices.emplace_back(dynamicVertex); } }; auto updateCollisionCircles = [&](const auto& feature, const bool placed) { if (!feature.alongLine) { return; } for (const CollisionBox& box : feature.boxes) { auto dynamicVertex = CollisionBoxDynamicAttributes::vertex(placed, !box.used); bucket.collisionCircle.dynamicVertices.emplace_back(dynamicVertex); bucket.collisionCircle.dynamicVertices.emplace_back(dynamicVertex); bucket.collisionCircle.dynamicVertices.emplace_back(dynamicVertex); bucket.collisionCircle.dynamicVertices.emplace_back(dynamicVertex); } }; if (bucket.hasCollisionBoxData()) { updateCollisionBox(symbolInstance.textCollisionFeature, opacityState.text.placed); updateCollisionBox(symbolInstance.iconCollisionFeature, opacityState.icon.placed); } if (bucket.hasCollisionCircleData()) { updateCollisionCircles(symbolInstance.textCollisionFeature, opacityState.text.placed); updateCollisionCircles(symbolInstance.iconCollisionFeature, opacityState.icon.placed); } } bucket.updateOpacity(); bucket.sortFeatures(state.getAngle()); auto retainedData = retainedQueryData.find(bucket.bucketInstanceId); if (retainedData != retainedQueryData.end()) { retainedData->second.featureSortOrder = bucket.featureSortOrder; } }
// ------------------------------------------------------------------------------------------------ // Get a list of all file extensions which are handled by this class void IRRMeshImporter::GetExtensionList(std::set<std::string>& extensions) { extensions.insert("xml"); extensions.insert("irrmesh"); }
void addElements(const std::set<DataKeyElement>& elements) { std::unique_lock<std::mutex> lock(m_mutex); m_elements.insert(elements.begin(), elements.end()); lock.unlock(); }
void RegisterMouseSubscriber(MouseListener* actor) { _mouseSubscribers.insert(actor); }
void addElement(const DataKeyElement& element) { std::unique_lock<std::mutex> lock(m_mutex); m_elements.insert(element); lock.unlock(); }
bool Transport::GenerateWaypoints(uint32 pathid, std::set<uint32> &mapids) { if (pathid >= sTaxiPathNodesByPath.size()) return false; TaxiPathNodeList const& path = sTaxiPathNodesByPath[pathid]; if (path.empty()) return false; std::vector<keyFrame> keyFrames; int mapChange = 0; mapids.clear(); for (size_t i = 1; i < path.size() - 1; ++i) { if (mapChange == 0) { if ((path[i].mapid == path[i+1].mapid)) { keyFrame k(path[i].x, path[i].y, path[i].z, path[i].mapid, path[i].actionFlag, path[i].delay); keyFrames.push_back(k); mapids.insert(k.mapid); } else { mapChange = 1; } } else { --mapChange; } } int lastStop = -1; int firstStop = -1; // first cell is arrived at by teleportation :S keyFrames[0].distFromPrev = 0; if (keyFrames[0].actionflag == 2) { lastStop = 0; } // find the rest of the distances between key points for (size_t i = 1; i < keyFrames.size(); ++i) { if ((keyFrames[i].actionflag == 1) || (keyFrames[i].mapid != keyFrames[i-1].mapid)) { keyFrames[i].distFromPrev = 0; } else { keyFrames[i].distFromPrev = sqrt(pow(keyFrames[i].x - keyFrames[i - 1].x, 2) + pow(keyFrames[i].y - keyFrames[i - 1].y, 2) + pow(keyFrames[i].z - keyFrames[i - 1].z, 2)); } if (keyFrames[i].actionflag == 2) { // remember first stop frame if (firstStop == -1) firstStop = i; lastStop = i; } } float tmpDist = 0; for (size_t i = 0; i < keyFrames.size(); ++i) { int j = (i + lastStop) % keyFrames.size(); if (keyFrames[j].actionflag == 2) tmpDist = 0; else tmpDist += keyFrames[j].distFromPrev; keyFrames[j].distSinceStop = tmpDist; } for (int i = int(keyFrames.size()) - 1; i >= 0; i--) { int j = (i + (firstStop+1)) % keyFrames.size(); tmpDist += keyFrames[(j + 1) % keyFrames.size()].distFromPrev; keyFrames[j].distUntilStop = tmpDist; if (keyFrames[j].actionflag == 2) tmpDist = 0; } for (size_t i = 0; i < keyFrames.size(); ++i) { if (keyFrames[i].distSinceStop < (30 * 30 * 0.5f)) keyFrames[i].tFrom = sqrt(2 * keyFrames[i].distSinceStop); else keyFrames[i].tFrom = ((keyFrames[i].distSinceStop - (30 * 30 * 0.5f)) / 30) + 30; if (keyFrames[i].distUntilStop < (30 * 30 * 0.5f)) keyFrames[i].tTo = sqrt(2 * keyFrames[i].distUntilStop); else keyFrames[i].tTo = ((keyFrames[i].distUntilStop - (30 * 30 * 0.5f)) / 30) + 30; keyFrames[i].tFrom *= 1000; keyFrames[i].tTo *= 1000; } // for (int i = 0; i < keyFrames.size(); ++i) { // sLog.outString("%f, %f, %f, %f, %f, %f, %f", keyFrames[i].x, keyFrames[i].y, keyFrames[i].distUntilStop, keyFrames[i].distSinceStop, keyFrames[i].distFromPrev, keyFrames[i].tFrom, keyFrames[i].tTo); // } // Now we're completely set up; we can move along the length of each waypoint at 100 ms intervals // speed = max(30, t) (remember x = 0.5s^2, and when accelerating, a = 1 unit/s^2 int t = 0; bool teleport = false; if (keyFrames[keyFrames.size() - 1].mapid != keyFrames[0].mapid) teleport = true; WayPoint pos(keyFrames[0].mapid, keyFrames[0].x, keyFrames[0].y, keyFrames[0].z, teleport, 0); m_WayPoints[0] = pos; t += keyFrames[0].delay * 1000; uint32 cM = keyFrames[0].mapid; for (size_t i = 0; i < keyFrames.size() - 1; ++i) { float d = 0; float tFrom = keyFrames[i].tFrom; float tTo = keyFrames[i].tTo; // keep the generation of all these points; we use only a few now, but may need the others later if (((d < keyFrames[i + 1].distFromPrev) && (tTo > 0))) { while ((d < keyFrames[i + 1].distFromPrev) && (tTo > 0)) { tFrom += 100; tTo -= 100; if (d > 0) { float newX, newY, newZ; newX = keyFrames[i].x + (keyFrames[i + 1].x - keyFrames[i].x) * d / keyFrames[i + 1].distFromPrev; newY = keyFrames[i].y + (keyFrames[i + 1].y - keyFrames[i].y) * d / keyFrames[i + 1].distFromPrev; newZ = keyFrames[i].z + (keyFrames[i + 1].z - keyFrames[i].z) * d / keyFrames[i + 1].distFromPrev; bool teleport = false; if (keyFrames[i].mapid != cM) { teleport = true; cM = keyFrames[i].mapid; } // sLog.outString("T: %d, D: %f, x: %f, y: %f, z: %f", t, d, newX, newY, newZ); WayPoint pos(keyFrames[i].mapid, newX, newY, newZ, teleport, i); if (teleport) m_WayPoints[t] = pos; } if (tFrom < tTo) // caught in tFrom dock's "gravitational pull" { if (tFrom <= 30000) { d = 0.5f * (tFrom / 1000) * (tFrom / 1000); } else { d = 0.5f * 30 * 30 + 30 * ((tFrom - 30000) / 1000); } d = d - keyFrames[i].distSinceStop; } else { if (tTo <= 30000) { d = 0.5f * (tTo / 1000) * (tTo / 1000); } else { d = 0.5f * 30 * 30 + 30 * ((tTo - 30000) / 1000); } d = keyFrames[i].distUntilStop - d; } t += 100; } t -= 100; } if (keyFrames[i + 1].tFrom > keyFrames[i + 1].tTo) t += 100 - ((long)keyFrames[i + 1].tTo % 100); else t += (long)keyFrames[i + 1].tTo % 100; bool teleport = false; if ((keyFrames[i + 1].actionflag == 1) || (keyFrames[i + 1].mapid != keyFrames[i].mapid)) { teleport = true; cM = keyFrames[i + 1].mapid; } WayPoint pos(keyFrames[i + 1].mapid, keyFrames[i + 1].x, keyFrames[i + 1].y, keyFrames[i + 1].z, teleport, i); // sLog.outString("T: %d, x: %f, y: %f, z: %f, t:%d", t, pos.x, pos.y, pos.z, teleport); //if (teleport) m_WayPoints[t] = pos; t += keyFrames[i + 1].delay * 1000; // sLog.outString("------"); } uint32 timer = t; // sLog.outDetail(" Generated %d waypoints, total time %u.", m_WayPoints.size(), timer); m_curr = m_WayPoints.begin(); m_curr = GetNextWayPoint(); //if problems comment the next line m_next = GetNextWayPoint(); m_pathTime = timer; m_nextNodeTime = m_curr->first; return true; }
void set_insert(std::set<K,C,A>& x, const T& a) { x.insert(a); }
/** * @brief parse a function call and extract information about variable usage * @param tok first token * @param var variables that the function read / write. * @param value 0 => invalid with null pointers as parameter. * 1-.. => invalid with uninitialized data. */ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token *> &var, unsigned char value) { // standard functions that dereference first parameter.. static std::set<std::string> functionNames1_all; static std::set<std::string> functionNames1_nullptr; static std::set<std::string> functionNames1_uninit; if (functionNames1_all.empty()) { // cstdlib functionNames1_all.insert("atoi"); functionNames1_all.insert("atof"); functionNames1_all.insert("atol"); functionNames1_all.insert("qsort"); functionNames1_all.insert("strtod"); functionNames1_all.insert("strtol"); functionNames1_all.insert("strtoul"); // cstring functionNames1_all.insert("memchr"); functionNames1_all.insert("memcmp"); functionNames1_all.insert("strcat"); functionNames1_all.insert("strncat"); functionNames1_all.insert("strcoll"); functionNames1_all.insert("strchr"); functionNames1_all.insert("strrchr"); functionNames1_all.insert("strcmp"); functionNames1_all.insert("strncmp"); functionNames1_all.insert("strcspn"); functionNames1_all.insert("strdup"); functionNames1_all.insert("strndup"); functionNames1_all.insert("strpbrk"); functionNames1_all.insert("strlen"); functionNames1_all.insert("strspn"); functionNames1_all.insert("strstr"); // cstdio functionNames1_all.insert("fclose"); functionNames1_all.insert("feof"); functionNames1_all.insert("fwrite"); functionNames1_all.insert("fseek"); functionNames1_all.insert("ftell"); functionNames1_all.insert("fputs"); functionNames1_all.insert("ferror"); functionNames1_all.insert("fgetc"); functionNames1_all.insert("fgetpos"); functionNames1_all.insert("fsetpos"); functionNames1_all.insert("freopen"); functionNames1_all.insert("fscanf"); functionNames1_all.insert("fprintf"); functionNames1_all.insert("fopen"); functionNames1_all.insert("rewind"); functionNames1_all.insert("printf"); functionNames1_all.insert("scanf"); functionNames1_all.insert("fscanf"); functionNames1_all.insert("sscanf"); functionNames1_all.insert("setbuf"); functionNames1_all.insert("setvbuf"); functionNames1_all.insert("rename"); functionNames1_all.insert("remove"); functionNames1_all.insert("puts"); functionNames1_all.insert("getc"); functionNames1_all.insert("clearerr"); // ctime functionNames1_all.insert("asctime"); functionNames1_all.insert("ctime"); functionNames1_all.insert("mktime"); functionNames1_nullptr.insert("itoa"); functionNames1_nullptr.insert("memcpy"); functionNames1_nullptr.insert("memmove"); functionNames1_nullptr.insert("memset"); functionNames1_nullptr.insert("strcpy"); functionNames1_nullptr.insert("sprintf"); functionNames1_nullptr.insert("vsprintf"); functionNames1_nullptr.insert("vprintf"); functionNames1_nullptr.insert("fprintf"); functionNames1_nullptr.insert("vfprintf"); functionNames1_nullptr.insert("fread"); functionNames1_nullptr.insert("gets"); functionNames1_nullptr.insert("gmtime"); functionNames1_nullptr.insert("localtime"); functionNames1_nullptr.insert("strftime"); functionNames1_uninit.insert("perror"); functionNames1_uninit.insert("fflush"); } // standard functions that dereference second parameter.. static std::set<std::string> functionNames2_all; static std::set<std::string> functionNames2_nullptr; if (functionNames2_all.empty()) { functionNames2_all.insert("mbstowcs"); functionNames2_all.insert("wcstombs"); functionNames2_all.insert("memcmp"); functionNames2_all.insert("memcpy"); functionNames2_all.insert("memmove"); functionNames2_all.insert("strcat"); functionNames2_all.insert("strncat"); functionNames2_all.insert("strcmp"); functionNames2_all.insert("strncmp"); functionNames2_all.insert("strcoll"); functionNames2_all.insert("strcpy"); functionNames2_all.insert("strcspn"); functionNames2_all.insert("strncpy"); functionNames2_all.insert("strpbrk"); functionNames2_all.insert("strspn"); functionNames2_all.insert("strstr"); functionNames2_all.insert("strxfrm"); functionNames2_all.insert("sprintf"); functionNames2_all.insert("fprintf"); functionNames2_all.insert("fscanf"); functionNames2_all.insert("sscanf"); functionNames2_all.insert("fputs"); functionNames2_all.insert("fputc"); functionNames2_all.insert("ungetc"); functionNames2_all.insert("rename"); functionNames2_all.insert("putc"); functionNames2_all.insert("freopen"); functionNames2_nullptr.insert("frexp"); functionNames2_nullptr.insert("modf"); functionNames2_nullptr.insert("fgetpos"); } if (Token::Match(&tok, "%var% ( )") || !tok.tokAt(2)) return; const Token* firstParam = tok.tokAt(2); if(!firstParam) return; if(firstParam->str()== "(" ||firstParam->str()== "{"||firstParam->str()== "]") { firstParam=firstParam->link(); firstParam=firstParam->next(); } // const Token* secondParam = firstParam->nextArgument(); const Token* secondParam = firstParam->nextArgument2(); // 1st parameter.. if ((Token::Match(firstParam, "%var% ,|)") && firstParam->varId() > 0) || (value == 0 && Token::Match(firstParam, "0 ,|)"))) { if (functionNames1_all.find(tok.str()) != functionNames1_all.end()) var.push_back(firstParam); else if (value == 0 && functionNames1_nullptr.find(tok.str()) != functionNames1_nullptr.end()) var.push_back(firstParam); else if (value != 0 && functionNames1_uninit.find(tok.str()) != functionNames1_uninit.end()) var.push_back(firstParam); else if (value == 0 && Token::Match(&tok, "snprintf|vsnprintf|fnprintf|vfnprintf") && secondParam && secondParam->str() != "0") // Only if length (second parameter) is not zero var.push_back(firstParam); } // 2nd parameter.. if (secondParam && ((value == 0 && secondParam->str() == "0") || (Token::Match(secondParam, "%var%") && secondParam->varId() > 0))) { if (functionNames2_all.find(tok.str()) != functionNames2_all.end()) var.push_back(secondParam); else if (value == 0 && functionNames2_nullptr.find(tok.str()) != functionNames2_nullptr.end()) var.push_back(secondParam); } if (Token::Match(&tok, "printf|sprintf|snprintf|fprintf|fnprintf|scanf|sscanf|fscanf")) { const Token* argListTok = 0; // Points to first va_list argument std::string formatString; bool scan = Token::Match(&tok, "scanf|sscanf|fscanf"); if (Token::Match(&tok, "printf|scanf ( %str%")) { formatString = firstParam->strValue(); argListTok = secondParam; } else if (Token::Match(&tok, "sprintf|fprintf|sscanf|fscanf")) { const Token* formatStringTok = secondParam; // Find second parameter (format string) if (formatStringTok && formatStringTok->type() == Token::eString) { argListTok = formatStringTok->nextArgument(); // Find third parameter (first argument of va_args) formatString = formatStringTok->strValue(); } } else if (Token::Match(&tok, "snprintf|fnprintf") && secondParam) { const Token* formatStringTok = secondParam->nextArgument(); // Find third parameter (format string) if (formatStringTok && formatStringTok->type() == Token::eString) { argListTok = formatStringTok->nextArgument(); // Find fourth parameter (first argument of va_args) formatString = formatStringTok->strValue(); } } if (argListTok) { bool percent = false; for (std::string::iterator i = formatString.begin(); i != formatString.end(); ++i) { if (*i == '%') { percent = !percent; } else if (percent) { percent = false; bool _continue = false; while (!std::isalpha(*i)) { if (*i == '*') { if (scan) _continue = true; else argListTok = argListTok->nextArgument(); } ++i; if (!argListTok || i == formatString.end()) return; } if (_continue) continue; if ((*i == 'n' || *i == 's' || scan) && (!scan || value == 0)) { if ((value == 0 && argListTok->str() == "0") || (argListTok->varId() > 0)) { var.push_back(argListTok); } } if (*i != 'm') // %m is a non-standard glibc extension that requires no parameter argListTok = argListTok->nextArgument(); // Find next argument if (!argListTok) break; } } } } }
// Look up multiple symbols in the symbol table and return a set of // Modules that define those symbols. bool Archive::findModulesDefiningSymbols(std::set<std::string>& symbols, std::set<Module*>& result, std::string* error) { if (!mapfile || !base) { if (error) *error = "Empty archive invalid for finding modules defining symbols"; return false; } if (symTab.empty()) { // We don't have a symbol table, so we must build it now but lets also // make sure that we populate the modules table as we do this to ensure // that we don't load them twice when findModuleDefiningSymbol is called // below. // Get a pointer to the first file const char* At = base + firstFileOffset; const char* End = mapfile->getBufferEnd(); while ( At < End) { // Compute the offset to be put in the symbol table unsigned offset = At - base - firstFileOffset; // Parse the file's header ArchiveMember* mbr = parseMemberHeader(At, End, error); if (!mbr) return false; // If it contains symbols if (mbr->isBitcode()) { // Get the symbols std::vector<std::string> symbols; std::string FullMemberName = archPath.str() + "(" + mbr->getPath().str() + ")"; Module* M = GetBitcodeSymbols((const unsigned char*)At, mbr->getSize(), FullMemberName, Context, symbols, error); if (M) { // Insert the module's symbols into the symbol table for (std::vector<std::string>::iterator I = symbols.begin(), E=symbols.end(); I != E; ++I ) { symTab.insert(std::make_pair(*I, offset)); } // Insert the Module and the ArchiveMember into the table of // modules. modules.insert(std::make_pair(offset, std::make_pair(M, mbr))); } else { if (error) *error = "Can't parse bitcode member: " + mbr->getPath().str() + ": " + *error; delete mbr; return false; } } // Go to the next file location At += mbr->getSize(); if ((intptr_t(At) & 1) == 1) At++; } } // At this point we have a valid symbol table (one way or another) so we // just use it to quickly find the symbols requested. for (std::set<std::string>::iterator I=symbols.begin(), E=symbols.end(); I != E;) { // See if this symbol exists Module* m = findModuleDefiningSymbol(*I,error); if (m) { // The symbol exists, insert the Module into our result, duplicates will // be ignored. result.insert(m); // Remove the symbol now that its been resolved, being careful to // post-increment the iterator. symbols.erase(I++); } else { ++I; } } return true; }
// ------------------------------------------------------------------------------------------------ void MD3Importer::GetExtensionList(std::set<std::string>& extensions) { extensions.insert("md3"); }
/// Attempt to coalesce one of the source registers to a MUX instruction with /// the destination register. This could lead to having only one predicated /// instruction in the end instead of two. bool HexagonExpandCondsets::coalesceSegments( const SmallVectorImpl<MachineInstr*> &Condsets, std::set<unsigned> &UpdRegs) { SmallVector<MachineInstr*,16> TwoRegs; for (MachineInstr *MI : Condsets) { MachineOperand &S1 = MI->getOperand(2), &S2 = MI->getOperand(3); if (!S1.isReg() && !S2.isReg()) continue; TwoRegs.push_back(MI); } bool Changed = false; for (MachineInstr *CI : TwoRegs) { RegisterRef RD = CI->getOperand(0); RegisterRef RP = CI->getOperand(1); MachineOperand &S1 = CI->getOperand(2), &S2 = CI->getOperand(3); bool Done = false; // Consider this case: // vreg1 = instr1 ... // vreg2 = instr2 ... // vreg0 = C2_mux ..., vreg1, vreg2 // If vreg0 was coalesced with vreg1, we could end up with the following // code: // vreg0 = instr1 ... // vreg2 = instr2 ... // vreg0 = A2_tfrf ..., vreg2 // which will later become: // vreg0 = instr1 ... // vreg0 = instr2_cNotPt ... // i.e. there will be an unconditional definition (instr1) of vreg0 // followed by a conditional one. The output dependency was there before // and it unavoidable, but if instr1 is predicable, we will no longer be // able to predicate it here. // To avoid this scenario, don't coalesce the destination register with // a source register that is defined by a predicable instruction. if (S1.isReg()) { RegisterRef RS = S1; MachineInstr *RDef = getReachingDefForPred(RS, CI, RP.Reg, true); if (!RDef || !HII->isPredicable(*RDef)) { Done = coalesceRegisters(RD, RegisterRef(S1)); if (Done) { UpdRegs.insert(RD.Reg); UpdRegs.insert(S1.getReg()); } } } if (!Done && S2.isReg()) { RegisterRef RS = S2; MachineInstr *RDef = getReachingDefForPred(RS, CI, RP.Reg, false); if (!RDef || !HII->isPredicable(*RDef)) { Done = coalesceRegisters(RD, RegisterRef(S2)); if (Done) { UpdRegs.insert(RD.Reg); UpdRegs.insert(S2.getReg()); } } } Changed |= Done; } return Changed; }
void my_insert(std::set<long>& values, long r ) { values.insert(r); }
bool find_sql_updates() { printf("+ finding new sql updates on HEAD\n"); // add all updates from HEAD snprintf(cmd, MAX_CMD, "git show HEAD:%s", sql_update_dir); if ((cmd_pipe = popen(cmd, "r")) == NULL) return false; // skip first two lines if (!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; } if (!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; } sql_update_info info; while (fgets(buffer, MAX_BUF, cmd_pipe)) { buffer[strlen(buffer) - 1] = '\0'; if (!get_sql_update_info(buffer, info)) continue; if (info.db_idx == NUM_DATABASES) { if (info.rev > 0) printf("WARNING: incorrect database name for sql update %s\n", buffer); continue; } new_sql_updates.insert(buffer); } pclose(cmd_pipe); // remove updates from the last commit also found on origin snprintf(cmd, MAX_CMD, "git show %s:%s", origin_hash, sql_update_dir); if ((cmd_pipe = popen(cmd, "r")) == NULL) return false; // skip first two lines if (!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; } if (!fgets(buffer, MAX_BUF, cmd_pipe)) { pclose(cmd_pipe); return false; } while (fgets(buffer, MAX_BUF, cmd_pipe)) { buffer[strlen(buffer) - 1] = '\0'; if (!get_sql_update_info(buffer, info)) continue; // find the old update with the highest rev for each database // (will be the required version for the new update) std::set<std::string>::iterator itr = new_sql_updates.find(buffer); if (itr != new_sql_updates.end()) { if (info.rev > 0 && (info.rev > last_sql_rev[info.db_idx] || (info.rev == last_sql_rev[info.db_idx] && info.nr > last_sql_nr[info.db_idx]))) { last_sql_rev[info.db_idx] = info.rev; last_sql_nr[info.db_idx] = info.nr; if (db_sql_rev_parent[info.db_idx]) snprintf(last_sql_update[info.db_idx], MAX_PATH, "%s_%0*d_%s%s%s", info.parentRev, 2, info.nr, info.db, info.has_table ? "_" : "", info.table); else sscanf(buffer, "%[^.]", last_sql_update[info.db_idx]); } new_sql_updates.erase(itr); } } pclose(cmd_pipe); if (!new_sql_updates.empty()) { for (std::set<std::string>::iterator itr = new_sql_updates.begin(); itr != new_sql_updates.end(); ++itr) printf("%s\n", itr->c_str()); } else printf("WARNING: no new sql updates found.\n"); return true; }