1 //===----- PerfSupportPlugin.h ----- Utils for perf support -----*- C++ -*-===// 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-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // Handles support for registering code with perf 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_EXECUTIONENGINE_ORC_PERFSUPPORTPLUGIN_H 14 #define LLVM_EXECUTIONENGINE_ORC_PERFSUPPORTPLUGIN_H 15 16 #include "llvm/ExecutionEngine/Orc/Shared/PerfSharedStructs.h" 17 18 #include "llvm/ExecutionEngine/Orc/Core.h" 19 #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" 20 21 namespace llvm { 22 namespace orc { 23 24 /// Log perf jitdump events for each object (see 25 /// https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/tools/perf/Documentation/jitdump-specification.txt). 26 /// Currently has support for dumping code load records and unwind info records. 27 class PerfSupportPlugin : public ObjectLinkingLayer::Plugin { 28 public: 29 PerfSupportPlugin(ExecutorProcessControl &EPC, 30 ExecutorAddr RegisterPerfStartAddr, 31 ExecutorAddr RegisterPerfEndAddr, 32 ExecutorAddr RegisterPerfImplAddr, bool EmitDebugInfo, 33 bool EmitUnwindInfo); 34 ~PerfSupportPlugin(); 35 36 void modifyPassConfig(MaterializationResponsibility &MR, 37 jitlink::LinkGraph &G, 38 jitlink::PassConfiguration &Config) override; 39 40 Error notifyFailed(MaterializationResponsibility &MR) override { 41 return Error::success(); 42 } 43 44 Error notifyRemovingResources(JITDylib &JD, ResourceKey K) override { 45 return Error::success(); 46 } 47 48 void notifyTransferringResources(JITDylib &JD, ResourceKey DstKey, 49 ResourceKey SrcKey) override {} 50 51 static Expected<std::unique_ptr<PerfSupportPlugin>> 52 Create(ExecutorProcessControl &EPC, JITDylib &JD, bool EmitDebugInfo, 53 bool EmitUnwindInfo); 54 55 private: 56 ExecutorProcessControl &EPC; 57 ExecutorAddr RegisterPerfStartAddr; 58 ExecutorAddr RegisterPerfEndAddr; 59 ExecutorAddr RegisterPerfImplAddr; 60 std::atomic<uint64_t> CodeIndex; 61 bool EmitDebugInfo; 62 bool EmitUnwindInfo; 63 }; 64 65 } // namespace orc 66 } // namespace llvm 67 68 #endif // LLVM_EXECUTIONENGINE_ORC_PERFSUPPORTPLUGIN_H