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