LLVM  8.0.1
OProfileWrapper.h
Go to the documentation of this file.
1 //===-- OProfileWrapper.h - OProfile JIT API Wrapper ------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 // This file defines a OProfileWrapper object that detects if the oprofile
10 // daemon is running, and provides wrappers for opagent functions used to
11 // communicate with the oprofile JIT interface. The dynamic library libopagent
12 // does not need to be linked directly as this object lazily loads the library
13 // when the first op_ function is called.
14 //
15 // See http://oprofile.sourceforge.net/doc/devel/jit-interface.html for the
16 // definition of the interface.
17 //
18 //===----------------------------------------------------------------------===//
19 
20 #ifndef LLVM_EXECUTIONENGINE_OPROFILEWRAPPER_H
21 #define LLVM_EXECUTIONENGINE_OPROFILEWRAPPER_H
22 
23 #include "llvm/Support/DataTypes.h"
24 #include <opagent.h>
25 
26 namespace llvm {
27 
28 
30  typedef op_agent_t (*op_open_agent_ptr_t)();
31  typedef int (*op_close_agent_ptr_t)(op_agent_t);
32  typedef int (*op_write_native_code_ptr_t)(op_agent_t,
33  const char*,
34  uint64_t,
35  void const*,
36  const unsigned int);
37  typedef int (*op_write_debug_line_info_ptr_t)(op_agent_t,
38  void const*,
39  size_t,
40  struct debug_line_info const*);
41  typedef int (*op_unload_native_code_ptr_t)(op_agent_t, uint64_t);
42 
43  // Also used for op_minor_version function which has the same signature
44  typedef int (*op_major_version_ptr_t)();
45 
46  // This is not a part of the opagent API, but is useful nonetheless
47  typedef bool (*IsOProfileRunningPtrT)();
48 
49 
50  op_agent_t Agent;
51  op_open_agent_ptr_t OpenAgentFunc;
52  op_close_agent_ptr_t CloseAgentFunc;
53  op_write_native_code_ptr_t WriteNativeCodeFunc;
54  op_write_debug_line_info_ptr_t WriteDebugLineInfoFunc;
55  op_unload_native_code_ptr_t UnloadNativeCodeFunc;
56  op_major_version_ptr_t MajorVersionFunc;
57  op_major_version_ptr_t MinorVersionFunc;
58  IsOProfileRunningPtrT IsOProfileRunningFunc;
59 
60  bool Initialized;
61 
62 public:
64 
65  // For testing with a mock opagent implementation, skips the dynamic load and
66  // the function resolution.
67  OProfileWrapper(op_open_agent_ptr_t OpenAgentImpl,
68  op_close_agent_ptr_t CloseAgentImpl,
69  op_write_native_code_ptr_t WriteNativeCodeImpl,
70  op_write_debug_line_info_ptr_t WriteDebugLineInfoImpl,
71  op_unload_native_code_ptr_t UnloadNativeCodeImpl,
72  op_major_version_ptr_t MajorVersionImpl,
73  op_major_version_ptr_t MinorVersionImpl,
74  IsOProfileRunningPtrT MockIsOProfileRunningImpl = 0)
75  : OpenAgentFunc(OpenAgentImpl),
76  CloseAgentFunc(CloseAgentImpl),
77  WriteNativeCodeFunc(WriteNativeCodeImpl),
78  WriteDebugLineInfoFunc(WriteDebugLineInfoImpl),
79  UnloadNativeCodeFunc(UnloadNativeCodeImpl),
80  MajorVersionFunc(MajorVersionImpl),
81  MinorVersionFunc(MinorVersionImpl),
82  IsOProfileRunningFunc(MockIsOProfileRunningImpl),
83  Initialized(true)
84  {
85  }
86 
87  // Calls op_open_agent in the oprofile JIT library and saves the returned
88  // op_agent_t handle internally so it can be used when calling all the other
89  // op_* functions. Callers of this class do not need to keep track of
90  // op_agent_t objects.
91  bool op_open_agent();
92 
93  int op_close_agent();
94  int op_write_native_code(const char* name,
95  uint64_t addr,
96  void const* code,
97  const unsigned int size);
98  int op_write_debug_line_info(void const* code,
99  size_t num_entries,
100  struct debug_line_info const* info);
101  int op_unload_native_code(uint64_t addr);
102  int op_major_version();
103  int op_minor_version();
104 
105  // Returns true if the oprofiled process is running, the opagent library is
106  // loaded and a connection to the agent has been established, and false
107  // otherwise.
108  bool isAgentAvailable();
109 
110 private:
111  // Loads the libopagent library and initializes this wrapper if the oprofile
112  // daemon is running
113  bool initialize();
114 
115  // Searches /proc for the oprofile daemon and returns true if the process if
116  // found, or false otherwise.
117  bool checkForOProfileProcEntry();
118 
119  bool isOProfileRunning();
120 };
121 
122 } // namespace llvm
123 
124 #endif // LLVM_EXECUTIONENGINE_OPROFILEWRAPPER_H
This class represents lattice values for constants.
Definition: AllocatorList.h:24
block Block Frequency true
int op_write_debug_line_info(void const *code, size_t num_entries, struct debug_line_info const *info)
OProfileWrapper(op_open_agent_ptr_t OpenAgentImpl, op_close_agent_ptr_t CloseAgentImpl, op_write_native_code_ptr_t WriteNativeCodeImpl, op_write_debug_line_info_ptr_t WriteDebugLineInfoImpl, op_unload_native_code_ptr_t UnloadNativeCodeImpl, op_major_version_ptr_t MajorVersionImpl, op_major_version_ptr_t MinorVersionImpl, IsOProfileRunningPtrT MockIsOProfileRunningImpl=0)
lazy value info
auto size(R &&Range, typename std::enable_if< std::is_same< typename std::iterator_traits< decltype(Range.begin())>::iterator_category, std::random_access_iterator_tag >::value, void >::type *=nullptr) -> decltype(std::distance(Range.begin(), Range.end()))
Get the size of a range.
Definition: STLExtras.h:1167
static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T, ArrayRef< StringRef > StandardNames)
Initialize the set of available library functions based on the specified target triple.
int op_write_native_code(const char *name, uint64_t addr, void const *code, const unsigned int size)
static const char * name
int op_unload_native_code(uint64_t addr)