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