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