mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-26 04:32:44 +01:00
ae65e281f3
to reflect the new license. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. llvm-svn: 351636
124 lines
4.9 KiB
C++
124 lines
4.9 KiB
C++
//===-- OProfileWrapper.h - OProfile JIT API Wrapper ------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
// This file defines a OProfileWrapper object that detects if the oprofile
|
|
// daemon is running, and provides wrappers for opagent functions used to
|
|
// communicate with the oprofile JIT interface. The dynamic library libopagent
|
|
// does not need to be linked directly as this object lazily loads the library
|
|
// when the first op_ function is called.
|
|
//
|
|
// See http://oprofile.sourceforge.net/doc/devel/jit-interface.html for the
|
|
// definition of the interface.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_EXECUTIONENGINE_OPROFILEWRAPPER_H
|
|
#define LLVM_EXECUTIONENGINE_OPROFILEWRAPPER_H
|
|
|
|
#include "llvm/Support/DataTypes.h"
|
|
#include <opagent.h>
|
|
|
|
namespace llvm {
|
|
|
|
|
|
class OProfileWrapper {
|
|
typedef op_agent_t (*op_open_agent_ptr_t)();
|
|
typedef int (*op_close_agent_ptr_t)(op_agent_t);
|
|
typedef int (*op_write_native_code_ptr_t)(op_agent_t,
|
|
const char*,
|
|
uint64_t,
|
|
void const*,
|
|
const unsigned int);
|
|
typedef int (*op_write_debug_line_info_ptr_t)(op_agent_t,
|
|
void const*,
|
|
size_t,
|
|
struct debug_line_info const*);
|
|
typedef int (*op_unload_native_code_ptr_t)(op_agent_t, uint64_t);
|
|
|
|
// Also used for op_minor_version function which has the same signature
|
|
typedef int (*op_major_version_ptr_t)();
|
|
|
|
// This is not a part of the opagent API, but is useful nonetheless
|
|
typedef bool (*IsOProfileRunningPtrT)();
|
|
|
|
|
|
op_agent_t Agent;
|
|
op_open_agent_ptr_t OpenAgentFunc;
|
|
op_close_agent_ptr_t CloseAgentFunc;
|
|
op_write_native_code_ptr_t WriteNativeCodeFunc;
|
|
op_write_debug_line_info_ptr_t WriteDebugLineInfoFunc;
|
|
op_unload_native_code_ptr_t UnloadNativeCodeFunc;
|
|
op_major_version_ptr_t MajorVersionFunc;
|
|
op_major_version_ptr_t MinorVersionFunc;
|
|
IsOProfileRunningPtrT IsOProfileRunningFunc;
|
|
|
|
bool Initialized;
|
|
|
|
public:
|
|
OProfileWrapper();
|
|
|
|
// For testing with a mock opagent implementation, skips the dynamic load and
|
|
// the function resolution.
|
|
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)
|
|
: OpenAgentFunc(OpenAgentImpl),
|
|
CloseAgentFunc(CloseAgentImpl),
|
|
WriteNativeCodeFunc(WriteNativeCodeImpl),
|
|
WriteDebugLineInfoFunc(WriteDebugLineInfoImpl),
|
|
UnloadNativeCodeFunc(UnloadNativeCodeImpl),
|
|
MajorVersionFunc(MajorVersionImpl),
|
|
MinorVersionFunc(MinorVersionImpl),
|
|
IsOProfileRunningFunc(MockIsOProfileRunningImpl),
|
|
Initialized(true)
|
|
{
|
|
}
|
|
|
|
// Calls op_open_agent in the oprofile JIT library and saves the returned
|
|
// op_agent_t handle internally so it can be used when calling all the other
|
|
// op_* functions. Callers of this class do not need to keep track of
|
|
// op_agent_t objects.
|
|
bool op_open_agent();
|
|
|
|
int op_close_agent();
|
|
int op_write_native_code(const char* name,
|
|
uint64_t addr,
|
|
void const* code,
|
|
const unsigned int size);
|
|
int op_write_debug_line_info(void const* code,
|
|
size_t num_entries,
|
|
struct debug_line_info const* info);
|
|
int op_unload_native_code(uint64_t addr);
|
|
int op_major_version();
|
|
int op_minor_version();
|
|
|
|
// Returns true if the oprofiled process is running, the opagent library is
|
|
// loaded and a connection to the agent has been established, and false
|
|
// otherwise.
|
|
bool isAgentAvailable();
|
|
|
|
private:
|
|
// Loads the libopagent library and initializes this wrapper if the oprofile
|
|
// daemon is running
|
|
bool initialize();
|
|
|
|
// Searches /proc for the oprofile daemon and returns true if the process if
|
|
// found, or false otherwise.
|
|
bool checkForOProfileProcEntry();
|
|
|
|
bool isOProfileRunning();
|
|
};
|
|
|
|
} // namespace llvm
|
|
|
|
#endif // LLVM_EXECUTIONENGINE_OPROFILEWRAPPER_H
|