summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-exegesis/lib/PerfHelper.h
diff options
context:
space:
mode:
authorClement Courbet <courbet@google.com>2018-04-04 11:37:06 +0000
committerClement Courbet <courbet@google.com>2018-04-04 11:37:06 +0000
commitac74acdefed9af2751d323bacef7ac47982957e8 (patch)
tree86fa1d51e6ad1bcf64c29d899c085e49f88ccf39 /llvm/tools/llvm-exegesis/lib/PerfHelper.h
parentd152d55ab25be21ec8e5a162fce74f3bf7f8ed5c (diff)
downloadbcm5719-llvm-ac74acdefed9af2751d323bacef7ac47982957e8.tar.gz
bcm5719-llvm-ac74acdefed9af2751d323bacef7ac47982957e8.zip
Re-land r329156 "Add llvm-exegesis tool."
Fixed to depend on and initialize the native target instead of X86. llvm-svn: 329169
Diffstat (limited to 'llvm/tools/llvm-exegesis/lib/PerfHelper.h')
-rw-r--r--llvm/tools/llvm-exegesis/lib/PerfHelper.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/llvm/tools/llvm-exegesis/lib/PerfHelper.h b/llvm/tools/llvm-exegesis/lib/PerfHelper.h
new file mode 100644
index 00000000000..22da2061c52
--- /dev/null
+++ b/llvm/tools/llvm-exegesis/lib/PerfHelper.h
@@ -0,0 +1,103 @@
+//===-- PerfHelper.h ------------------------------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// Helpers for measuring perf events.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TOOLS_LLVM_EXEGESIS_PERFHELPER_H
+#define LLVM_TOOLS_LLVM_EXEGESIS_PERFHELPER_H
+
+#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/StringRef.h"
+#include <functional>
+#include <memory>
+
+struct perf_event_attr;
+
+namespace exegesis {
+namespace pfm {
+
+// Returns true on error.
+bool pfmInitialize();
+void pfmTerminate();
+
+// Retrieves the encoding for the event described by pfm_event_string.
+// NOTE: pfm_initialize() must be called before creating PerfEvent objects.
+class PerfEvent {
+public:
+ // http://perfmon2.sourceforge.net/manv4/libpfm.html
+ // Events are expressed as strings. e.g. "INSTRUCTION_RETIRED"
+ explicit PerfEvent(llvm::StringRef pfm_event_string);
+
+ PerfEvent(const PerfEvent &) = delete;
+ PerfEvent(PerfEvent &&other);
+ ~PerfEvent();
+
+ // The pfm_event_string passed at construction time.
+ llvm::StringRef name() const;
+
+ // Whether the event was successfully created.
+ bool valid() const;
+
+ // The encoded event to be passed to the Kernel.
+ const perf_event_attr *attribute() const;
+
+ // The fully qualified name for the event.
+ // e.g. "snb_ep::INSTRUCTION_RETIRED:e=0:i=0:c=0:t=0:u=1:k=0:mg=0:mh=1"
+ llvm::StringRef getPfmEventString() const;
+
+private:
+ const std::string EventString;
+ std::string FullQualifiedEventString;
+ perf_event_attr *Attr;
+};
+
+// Uses a valid PerfEvent to configure the Kernel so we can measure the
+// underlying event.
+struct Counter {
+ // event: the PerfEvent to measure.
+ explicit Counter(const PerfEvent &event);
+
+ Counter(const Counter &) = delete;
+ Counter(Counter &&other) = default;
+
+ ~Counter();
+
+ void start(); // Starts the measurement of the event.
+ void stop(); // Stops the measurement of the event.
+ int64_t read() const; // Return the current value of the counter.
+
+private:
+ int FileDescriptor = -1;
+};
+
+// Helper to measure a list of PerfEvent for a particular function.
+// callback is called for each successful measure (PerfEvent needs to be valid).
+template <typename Function>
+void Measure(
+ llvm::ArrayRef<PerfEvent> Events,
+ const std::function<void(const PerfEvent &Event, int64_t Value)> &Callback,
+ Function Fn) {
+ for (const auto &Event : Events) {
+ if (!Event.valid())
+ continue;
+ Counter Cnt(Event);
+ Cnt.start();
+ Fn();
+ Cnt.stop();
+ Callback(Event, Cnt.read());
+ }
+}
+
+} // namespace pfm
+} // namespace exegesis
+
+#endif // LLVM_TOOLS_LLVM_EXEGESIS_PERFHELPER_H
OpenPOWER on IntegriCloud