OProfileWrapper.cpp revision df5b3305c71b21eb3ace56922d75fb777ac25c17
161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky//===-- OProfileWrapper.cpp - OProfile JIT API Wrapper implementation -----===// 261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// 361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// The LLVM Compiler Infrastructure 461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// 561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// This file is distributed under the University of Illinois Open Source 661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// License. See LICENSE.TXT for details. 761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// 861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky//===----------------------------------------------------------------------===// 961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// 1061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// This file implements the interface in OProfileWrapper.h. It is responsible 1161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// for loading the opagent dynamic library when the first call to an op_ 1261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// function occurs. 1361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// 1461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky//===----------------------------------------------------------------------===// 1561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 1661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/ExecutionEngine/OProfileWrapper.h" 1761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 1861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#define DEBUG_TYPE "oprofile-wrapper" 1961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/Support/Debug.h" 2061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/Support/raw_ostream.h" 2161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/Support/DynamicLibrary.h" 2261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/Support/Mutex.h" 2361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/Support/MutexGuard.h" 2461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include "llvm/ADT/SmallString.h" 2561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 2661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include <sstream> 2761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include <cstring> 2861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include <stddef.h> 2961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include <dirent.h> 3061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include <sys/stat.h> 3161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky#include <fcntl.h> 32df5b3305c71b21eb3ace56922d75fb777ac25c17Will Schmidt#include <unistd.h> 3361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 3461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskynamespace { 3561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 3661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky// Global mutex to ensure a single thread initializes oprofile agent. 3761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyllvm::sys::Mutex OProfileInitializationMutex; 3861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 3961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} // anonymous namespace 4061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 4161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskynamespace llvm { 4261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 4361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli BenderskyOProfileWrapper::OProfileWrapper() 4461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky: Agent(0), 4561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky OpenAgentFunc(0), 4661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky CloseAgentFunc(0), 4761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky WriteNativeCodeFunc(0), 4861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky WriteDebugLineInfoFunc(0), 4961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky UnloadNativeCodeFunc(0), 5061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky MajorVersionFunc(0), 5161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky MinorVersionFunc(0), 5261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky IsOProfileRunningFunc(0), 5361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky Initialized(false) { 5461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} 5561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 5661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskybool OProfileWrapper::initialize() { 5761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky using namespace llvm; 5861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky using namespace llvm::sys; 5961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 6061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky MutexGuard Guard(OProfileInitializationMutex); 6161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 6261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (Initialized) 6361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return OpenAgentFunc != 0; 6461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 6561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky Initialized = true; 6661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 6761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // If the oprofile daemon is not running, don't load the opagent library 6861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (!isOProfileRunning()) { 6961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky DEBUG(dbgs() << "OProfile daemon is not detected.\n"); 7061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return false; 7161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 7261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 7361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky std::string error; 7461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if(!DynamicLibrary::LoadLibraryPermanently("libopagent.so", &error)) { 7561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky DEBUG(dbgs() 7661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky << "OProfile connector library libopagent.so could not be loaded: " 7761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky << error << "\n"); 7861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 7961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 8061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // Get the addresses of the opagent functions 8161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky OpenAgentFunc = (op_open_agent_ptr_t)(intptr_t) 8261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky DynamicLibrary::SearchForAddressOfSymbol("op_open_agent"); 8361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky CloseAgentFunc = (op_close_agent_ptr_t)(intptr_t) 8461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky DynamicLibrary::SearchForAddressOfSymbol("op_close_agent"); 8561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky WriteNativeCodeFunc = (op_write_native_code_ptr_t)(intptr_t) 8661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky DynamicLibrary::SearchForAddressOfSymbol("op_write_native_code"); 8761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky WriteDebugLineInfoFunc = (op_write_debug_line_info_ptr_t)(intptr_t) 8861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky DynamicLibrary::SearchForAddressOfSymbol("op_write_debug_line_info"); 8961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky UnloadNativeCodeFunc = (op_unload_native_code_ptr_t)(intptr_t) 9061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky DynamicLibrary::SearchForAddressOfSymbol("op_unload_native_code"); 9161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky MajorVersionFunc = (op_major_version_ptr_t)(intptr_t) 9261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky DynamicLibrary::SearchForAddressOfSymbol("op_major_version"); 9361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky MinorVersionFunc = (op_major_version_ptr_t)(intptr_t) 9461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky DynamicLibrary::SearchForAddressOfSymbol("op_minor_version"); 9561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 9661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // With missing functions, we can do nothing 9761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (!OpenAgentFunc 9861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky || !CloseAgentFunc 9961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky || !WriteNativeCodeFunc 10061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky || !WriteDebugLineInfoFunc 10161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky || !UnloadNativeCodeFunc) { 10261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky OpenAgentFunc = 0; 10361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky CloseAgentFunc = 0; 10461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky WriteNativeCodeFunc = 0; 10561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky WriteDebugLineInfoFunc = 0; 10661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky UnloadNativeCodeFunc = 0; 10761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return false; 10861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 10961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 11061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return true; 11161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} 11261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 11361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskybool OProfileWrapper::isOProfileRunning() { 11461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (IsOProfileRunningFunc != 0) 11561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return IsOProfileRunningFunc(); 11661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return checkForOProfileProcEntry(); 11761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} 11861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 11961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskybool OProfileWrapper::checkForOProfileProcEntry() { 12061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky DIR* ProcDir; 12161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 12261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky ProcDir = opendir("/proc"); 12361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (!ProcDir) 12461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return false; 12561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 12661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // Walk the /proc tree looking for the oprofile daemon 12761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky struct dirent* Entry; 12861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky while (0 != (Entry = readdir(ProcDir))) { 12961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (Entry->d_type == DT_DIR) { 13061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // Build a path from the current entry name 13161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky SmallString<256> CmdLineFName; 13261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky raw_svector_ostream(CmdLineFName) << "/proc/" << Entry->d_name 13361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky << "/cmdline"; 13461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 13561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // Open the cmdline file 13661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky int CmdLineFD = open(CmdLineFName.c_str(), S_IRUSR); 13761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (CmdLineFD != -1) { 13861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky char ExeName[PATH_MAX+1]; 13961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky char* BaseName = 0; 14061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 14161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // Read the cmdline file 14261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky ssize_t NumRead = read(CmdLineFD, ExeName, PATH_MAX+1); 14361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky close(CmdLineFD); 14461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky ssize_t Idx = 0; 14561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 14661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // Find the terminator for the first string 14761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky while (Idx < NumRead-1 && ExeName[Idx] != 0) { 14861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky Idx++; 14961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 15061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 15161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // Go back to the last non-null character 15261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky Idx--; 15361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 15461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // Find the last path separator in the first string 15561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky while (Idx > 0) { 15661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (ExeName[Idx] == '/') { 15761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky BaseName = ExeName + Idx + 1; 15861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky break; 15961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 16061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky Idx--; 16161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 16261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 16361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // Test this to see if it is the oprofile daemon 16461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (BaseName != 0 && !strcmp("oprofiled", BaseName)) { 16561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // If it is, we're done 16661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky closedir(ProcDir); 16761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return true; 16861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 16961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 17061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 17161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 17261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 17361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky // We've looked through all the files and didn't find the daemon 17461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky closedir(ProcDir); 17561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return false; 17661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} 17761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 17861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskybool OProfileWrapper::op_open_agent() { 17961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (!Initialized) 18061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky initialize(); 18161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 18261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (OpenAgentFunc != 0) { 18361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky Agent = OpenAgentFunc(); 18461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return Agent != 0; 18561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 18661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 18761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return false; 18861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} 18961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 19061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyint OProfileWrapper::op_close_agent() { 19161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (!Initialized) 19261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky initialize(); 19361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 19461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky int ret = -1; 19561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (Agent && CloseAgentFunc) { 19661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky ret = CloseAgentFunc(Agent); 19761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (ret == 0) { 19861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky Agent = 0; 19961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 20061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky } 20161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return ret; 20261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} 20361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 20461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskybool OProfileWrapper::isAgentAvailable() { 20561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return Agent != 0; 20661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} 20761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 20861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyint OProfileWrapper::op_write_native_code(const char* Name, 20961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky uint64_t Addr, 21061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky void const* Code, 21161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky const unsigned int Size) { 21261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (!Initialized) 21361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky initialize(); 21461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 21561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (Agent && WriteNativeCodeFunc) 21661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return WriteNativeCodeFunc(Agent, Name, Addr, Code, Size); 21761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 21861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return -1; 21961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} 22061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 22161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyint OProfileWrapper::op_write_debug_line_info( 22261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky void const* Code, 22361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky size_t NumEntries, 22461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky struct debug_line_info const* Info) { 22561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (!Initialized) 22661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky initialize(); 22761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 22861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (Agent && WriteDebugLineInfoFunc) 22961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return WriteDebugLineInfoFunc(Agent, Code, NumEntries, Info); 23061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 23161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return -1; 23261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} 23361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 23461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyint OProfileWrapper::op_major_version() { 23561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (!Initialized) 23661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky initialize(); 23761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 23861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (Agent && MajorVersionFunc) 23961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return MajorVersionFunc(); 24061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 24161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return -1; 24261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} 24361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 24461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyint OProfileWrapper::op_minor_version() { 24561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (!Initialized) 24661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky initialize(); 24761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 24861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (Agent && MinorVersionFunc) 24961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return MinorVersionFunc(); 25061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 25161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return -1; 25261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} 25361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 25461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Benderskyint OProfileWrapper::op_unload_native_code(uint64_t Addr) { 25561b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (!Initialized) 25661b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky initialize(); 25761b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 25861b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky if (Agent && UnloadNativeCodeFunc) 25961b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return UnloadNativeCodeFunc(Agent, Addr); 26061b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 26161b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky return -1; 26261b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} 26361b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky 26461b1851a205cb8dd29c1d3d4231efb8f8f7da283Eli Bendersky} // namespace llvm 265