diff --git a/llvm/tools/llvm-exegesis/lib/PerfHelper.h b/llvm/tools/llvm-exegesis/lib/PerfHelper.h --- a/llvm/tools/llvm-exegesis/lib/PerfHelper.h +++ b/llvm/tools/llvm-exegesis/lib/PerfHelper.h @@ -23,6 +23,10 @@ #include #include +#ifndef HAVE_LIBPFM +typedef int pid_t; +#endif // HAVE_LIBPFM + struct perf_event_attr; namespace llvm { @@ -76,7 +80,7 @@ class Counter { public: // event: the PerfEvent to measure. - explicit Counter(PerfEvent &&event); + explicit Counter(PerfEvent &&event, pid_t ProcessID = 0); Counter(const Counter &) = delete; Counter(Counter &&other) = default; @@ -103,15 +107,15 @@ virtual int numValues() const; + int getFileDescriptor() const { return FileDescriptor; } + protected: PerfEvent Event; -#ifdef HAVE_LIBPFM int FileDescriptor = -1; -#endif bool IsDummyEvent; private: - void initRealEvent(const PerfEvent &E); + void initRealEvent(const PerfEvent &E, pid_t ProcessID); }; } // namespace pfm diff --git a/llvm/tools/llvm-exegesis/lib/PerfHelper.cpp b/llvm/tools/llvm-exegesis/lib/PerfHelper.cpp --- a/llvm/tools/llvm-exegesis/lib/PerfHelper.cpp +++ b/llvm/tools/llvm-exegesis/lib/PerfHelper.cpp @@ -107,21 +107,20 @@ return FullQualifiedEventString; } -Counter::Counter(PerfEvent &&E) : Event(std::move(E)){ +Counter::Counter(PerfEvent &&E, pid_t ProcessID) : Event(std::move(E)) { assert(Event.valid()); IsDummyEvent = Event.name() == PerfEvent::DummyEventString; if (!IsDummyEvent) - initRealEvent(E); + initRealEvent(E, ProcessID); } #ifdef HAVE_LIBPFM -void Counter::initRealEvent(const PerfEvent &E) { - const pid_t Pid = 0; // measure current process/thread. +void Counter::initRealEvent(const PerfEvent &E, pid_t ProcessID) { const int Cpu = -1; // measure any processor. const int GroupFd = -1; // no grouping of counters. const uint32_t Flags = 0; perf_event_attr AttrCopy = *Event.attribute(); - FileDescriptor = perf_event_open(&AttrCopy, Pid, Cpu, GroupFd, Flags); + FileDescriptor = perf_event_open(&AttrCopy, ProcessID, Cpu, GroupFd, Flags); if (FileDescriptor == -1) { errs() << "Unable to open event. ERRNO: " << strerror(errno) << ". Make sure your kernel allows user " @@ -180,7 +179,7 @@ int Counter::numValues() const { return 1; } #else -void Counter::initRealEvent(const PerfEvent &) {} +void Counter::initRealEvent(const PerfEvent &, pid_t ProcessID) {} Counter::~Counter() = default; diff --git a/llvm/tools/llvm-exegesis/lib/Target.h b/llvm/tools/llvm-exegesis/lib/Target.h --- a/llvm/tools/llvm-exegesis/lib/Target.h +++ b/llvm/tools/llvm-exegesis/lib/Target.h @@ -75,7 +75,8 @@ // Targets can use this to create target-specific perf counters. virtual Expected> - createCounter(StringRef CounterName, const LLVMState &State) const; + createCounter(StringRef CounterName, const LLVMState &State, + const pid_t ProcessID = 0) const; // Targets can use this to add target-specific passes in assembleToStream(); virtual void addTargetSpecificPasses(PassManagerBase &PM) const {} diff --git a/llvm/tools/llvm-exegesis/lib/Target.cpp b/llvm/tools/llvm-exegesis/lib/Target.cpp --- a/llvm/tools/llvm-exegesis/lib/Target.cpp +++ b/llvm/tools/llvm-exegesis/lib/Target.cpp @@ -35,7 +35,8 @@ } Expected> -ExegesisTarget::createCounter(StringRef CounterName, const LLVMState &) const { +ExegesisTarget::createCounter(StringRef CounterName, const LLVMState &, + const pid_t ProcessID) const { pfm::PerfEvent Event(CounterName); if (!Event.valid()) return llvm::make_error( @@ -43,7 +44,7 @@ .concat(CounterName) .concat("'")); - return std::make_unique(std::move(Event)); + return std::make_unique(std::move(Event), ProcessID); } void ExegesisTarget::registerTarget(ExegesisTarget *Target) { diff --git a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp --- a/llvm/tools/llvm-exegesis/lib/X86/Target.cpp +++ b/llvm/tools/llvm-exegesis/lib/X86/Target.cpp @@ -665,7 +665,8 @@ ExegesisX86Target() : ExegesisTarget(X86CpuPfmCounters) {} Expected> - createCounter(StringRef CounterName, const LLVMState &State) const override { + createCounter(StringRef CounterName, const LLVMState &State, + const pid_t ProcessID) const override { // If LbrSamplingPeriod was provided, then ignore the // CounterName because we only have one for LBR. if (LbrSamplingPeriod > 0) { @@ -682,7 +683,7 @@ llvm::errc::invalid_argument); #endif } - return ExegesisTarget::createCounter(CounterName, State); + return ExegesisTarget::createCounter(CounterName, State, ProcessID); } private: