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