summaryrefslogtreecommitdiffstats
path: root/include/llvm/Support
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/Support')
-rw-r--r--include/llvm/Support/DOTGraphTraits.h3
-rw-r--r--include/llvm/Support/GraphWriter.h17
-rw-r--r--include/llvm/Support/Timer.h45
3 files changed, 44 insertions, 21 deletions
diff --git a/include/llvm/Support/DOTGraphTraits.h b/include/llvm/Support/DOTGraphTraits.h
index 7a61b2b..080297f 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 ca28aafa..01b44d0 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 f34fc95..71b7ee5 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
OpenPOWER on IntegriCloud