diff options
Diffstat (limited to 'include/llvm/Support')
| -rw-r--r-- | include/llvm/Support/DOTGraphTraits.h | 3 | ||||
| -rw-r--r-- | include/llvm/Support/GraphWriter.h | 17 | ||||
| -rw-r--r-- | include/llvm/Support/Timer.h | 45 | 
3 files changed, 44 insertions, 21 deletions
diff --git a/include/llvm/Support/DOTGraphTraits.h b/include/llvm/Support/DOTGraphTraits.h index 7a61b2b16512..080297f8297e 100644 --- a/include/llvm/Support/DOTGraphTraits.h +++ b/include/llvm/Support/DOTGraphTraits.h @@ -51,7 +51,8 @@ struct DefaultDOTGraphTraits {    /// getNodeLabel - Given a node and a pointer to the top level graph, return    /// the label to print in the node.    template<typename GraphType> -  static std::string getNodeLabel(const void *Node, const GraphType& Graph) { +  static std::string getNodeLabel(const void *Node, +                                  const GraphType& Graph, bool ShortNames) {      return "";    } diff --git a/include/llvm/Support/GraphWriter.h b/include/llvm/Support/GraphWriter.h index ca28aafa7898..01b44d0b8e2f 100644 --- a/include/llvm/Support/GraphWriter.h +++ b/include/llvm/Support/GraphWriter.h @@ -72,6 +72,7 @@ template<typename GraphType>  class GraphWriter {    std::ostream &O;    const GraphType &G; +  bool ShortNames;    typedef DOTGraphTraits<GraphType>           DOTTraits;    typedef GraphTraits<GraphType>              GTraits; @@ -79,7 +80,8 @@ class GraphWriter {    typedef typename GTraits::nodes_iterator    node_iterator;    typedef typename GTraits::ChildIteratorType child_iterator;  public: -  GraphWriter(std::ostream &o, const GraphType &g) : O(o), G(g) {} +  GraphWriter(std::ostream &o, const GraphType &g, bool SN) : +    O(o), G(g), ShortNames(SN) {}    void writeHeader(const std::string &Name) {      std::string GraphName = DOTTraits::getGraphName(G); @@ -130,7 +132,7 @@ public:      O << "label=\"{";      if (!DOTTraits::renderGraphFromBottomUp()) { -      O << DOT::EscapeString(DOTTraits::getNodeLabel(Node, G)); +      O << DOT::EscapeString(DOTTraits::getNodeLabel(Node, G, ShortNames));        // If we should include the address of the node in the label, do so now.        if (DOTTraits::hasNodeAddressLabel(Node, G)) @@ -156,7 +158,7 @@ public:      }      if (DOTTraits::renderGraphFromBottomUp()) { -      O << DOT::EscapeString(DOTTraits::getNodeLabel(Node, G)); +      O << DOT::EscapeString(DOTTraits::getNodeLabel(Node, G, ShortNames));        // If we should include the address of the node in the label, do so now.        if (DOTTraits::hasNodeAddressLabel(Node, G)) @@ -250,10 +252,11 @@ public:  template<typename GraphType>  std::ostream &WriteGraph(std::ostream &O, const GraphType &G, +                         bool ShortNames = false,                           const std::string &Name = "",                           const std::string &Title = "") {    // Start the graph emission process... -  GraphWriter<GraphType> W(O, G); +  GraphWriter<GraphType> W(O, G, ShortNames);    // Output the header for the graph...    W.writeHeader(Title); @@ -272,6 +275,7 @@ std::ostream &WriteGraph(std::ostream &O, const GraphType &G,  template<typename GraphType>  sys::Path WriteGraph(const GraphType &G,                       const std::string& Name, +                     bool ShortNames = false,                       const std::string& Title = "") {    std::string ErrMsg;    sys::Path Filename = sys::Path::GetTemporaryDirectory(&ErrMsg); @@ -290,7 +294,7 @@ sys::Path WriteGraph(const GraphType &G,    std::ofstream O(Filename.c_str());    if (O.good()) { -    WriteGraph(O, G, Name, Title); +    WriteGraph(O, G, ShortNames, Name, Title);      cerr << " done. \n";      O.close(); @@ -308,8 +312,9 @@ sys::Path WriteGraph(const GraphType &G,  template<typename GraphType>  void ViewGraph(const GraphType& G,                 const std::string& Name, +               bool ShortNames = false,                 const std::string& Title = "") { -  sys::Path Filename =  WriteGraph(G, Name, Title); +  sys::Path Filename =  WriteGraph(G, Name, ShortNames, Title);    if (Filename.isEmpty()) {      return; diff --git a/include/llvm/Support/Timer.h b/include/llvm/Support/Timer.h index f34fc9541016..71b7ee58fd3c 100644 --- a/include/llvm/Support/Timer.h +++ b/include/llvm/Support/Timer.h @@ -16,6 +16,7 @@  #define LLVM_SUPPORT_TIMER_H  #include "llvm/Support/DataTypes.h" +#include "llvm/System/Mutex.h"  #include <string>  #include <vector>  #include <iosfwd> @@ -34,28 +35,37 @@ class TimerGroup;  /// if they are never started.  ///  class Timer { -  int64_t Elapsed;        // Wall clock time elapsed in seconds -  int64_t UserTime;       // User time elapsed -  int64_t SystemTime;     // System time elapsed -  int64_t MemUsed;       // Memory allocated (in bytes) -  int64_t PeakMem;        // Peak memory used -  int64_t PeakMemBase;    // Temporary for peak calculation... +  double Elapsed;        // Wall clock time elapsed in seconds +  double UserTime;       // User time elapsed +  double SystemTime;     // System time elapsed +  ssize_t MemUsed;       // Memory allocated (in bytes) +  size_t PeakMem;        // Peak memory used +  size_t PeakMemBase;    // Temporary for peak calculation...    std::string Name;      // The name of this time variable    bool Started;          // Has this time variable ever been started?    TimerGroup *TG;        // The TimerGroup this Timer is in. +  mutable sys::SmartMutex<true> Lock; // Mutex for the contents of this Timer.  public:    explicit Timer(const std::string &N);    Timer(const std::string &N, TimerGroup &tg);    Timer(const Timer &T);    ~Timer(); -  int64_t getProcessTime() const { return UserTime+SystemTime; } -  int64_t getWallTime() const { return Elapsed; } -  int64_t getMemUsed() const { return MemUsed; } -  int64_t getPeakMem() const { return PeakMem; } +  double getProcessTime() const { return UserTime+SystemTime; } +  double getWallTime() const { return Elapsed; } +  ssize_t getMemUsed() const { return MemUsed; } +  size_t getPeakMem() const { return PeakMem; }    std::string getName() const { return Name; }    const Timer &operator=(const Timer &T) { +    if (&T < this) { +      T.Lock.acquire(); +      Lock.acquire(); +    } else { +      Lock.acquire(); +      T.Lock.acquire(); +    } +          Elapsed = T.Elapsed;      UserTime = T.UserTime;      SystemTime = T.SystemTime; @@ -65,6 +75,15 @@ public:      Name = T.Name;      Started = T.Started;      assert(TG == T.TG && "Can only assign timers in the same TimerGroup!"); +     +    if (&T < this) { +      T.Lock.release(); +      Lock.release(); +    } else { +      Lock.release(); +      T.Lock.release(); +    } +          return *this;    } @@ -160,11 +179,9 @@ public:  private:    friend class Timer; -  void addTimer() { ++NumTimers; } +  void addTimer();    void removeTimer(); -  void addTimerToPrint(const Timer &T) { -    TimersToPrint.push_back(Timer(true, T)); -  } +  void addTimerToPrint(const Timer &T);  };  } // End llvm namespace  | 
