brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.8 KiB · cbfa178 Raw
68 lines · cpp
1//===- bolt/Core/CallGraphWalker.cpp ------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file implements the CallGraphWalker class.10//11//===----------------------------------------------------------------------===//12 13#include "bolt/Core/CallGraphWalker.h"14#include "bolt/Core/BinaryFunctionCallGraph.h"15#include "llvm/Support/CommandLine.h"16#include "llvm/Support/Timer.h"17#include <queue>18#include <set>19 20namespace opts {21extern llvm::cl::opt<bool> TimeOpts;22}23 24namespace llvm {25namespace bolt {26 27void CallGraphWalker::traverseCG() {28  NamedRegionTimer T1("CG Traversal", "CG Traversal", "CG breakdown",29                      "CG breakdown", opts::TimeOpts);30  std::queue<BinaryFunction *> Queue;31  std::set<BinaryFunction *> InQueue;32 33  for (BinaryFunction *Func : TopologicalCGOrder) {34    Queue.push(Func);35    InQueue.insert(Func);36  }37 38  while (!Queue.empty()) {39    BinaryFunction *Func = Queue.front();40    Queue.pop();41    InQueue.erase(Func);42 43    bool Changed = false;44    for (CallbackTy Visitor : Visitors) {45      bool CurVisit = Visitor(Func);46      Changed = Changed || CurVisit;47    }48 49    if (Changed) {50      for (CallGraph::NodeId CallerID : CG.predecessors(CG.getNodeId(Func))) {51        BinaryFunction *CallerFunc = CG.nodeIdToFunc(CallerID);52        if (InQueue.count(CallerFunc))53          continue;54        Queue.push(CallerFunc);55        InQueue.insert(CallerFunc);56      }57    }58  }59}60 61void CallGraphWalker::walk() {62  TopologicalCGOrder = CG.buildTraversalOrder();63  traverseCG();64}65 66} // namespace bolt67} // namespace llvm68