/** * @file opagent.h * Interface to report symbol names and dynamically generated code to Oprofile * * @remark Copyright 2007 OProfile authors * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * @author Jens Wilke * @Modifications Daniel Hansel * * Copyright IBM Corporation 2007 * */ #ifndef _LIB_OPAGENT_H #define _LIB_OPAGENT_H #include #if defined(__cplusplus) extern "C" { #endif struct debug_line_info { unsigned long vma; unsigned int lineno; /* The filename format is unspecified, absolute path, relative etc. */ char const * filename; }; typedef void * op_agent_t; /** * This function must be called by agents before any other function. * Creates and opens a JIT dump file in /var/lib/oprofile/jitdump * using the naming convention .dump. * * Returns a valid op_agent_t handle or NULL. If NULL is returned, errno * is set to indicate the nature of the error. **/ op_agent_t op_open_agent(void); /** * Frees all resources and closes open file handles. * * hdl: Handle returned from an earlier call to op_open_agent() * * Returns 0 on success; -1 otherwise. If -1 is returned, errno is * set to indicate the nature of the error. **/ int op_close_agent(op_agent_t hdl); /** * Signal the dynamic generation of native code from a virtual machine. * Writes a JIT dump record to the open JIT dump file using * the passed information. * * hdl: Handle returned from an earlier call to op_open_agent() * symbol_name: The name of the symbol being dynamically compiled. * This name can (and should) contain all necessary * information to disambiguate it from symbols of the * same name; e.g., class, method signature. * vma: The virtual memory address of the executable code. * code: Pointer to the location of the compiled code. * Theoretically, this may be a different location from * that given by the vma argument. For some JIT compilers, * obtaining the code may be impractical. For this (or any other) * reason, the agent can choose to pass NULL for this paraemter. * If NULL is passed, no code will be copied into the JIT dump * file. * code_size: Size of the compiled code. * * Returns 0 on success; -1 otherwise. If -1 is returned, errno is * set to indicate the nature of the error. **/ int op_write_native_code(op_agent_t hdl, char const * symbol_name, uint64_t vma, void const * code, const unsigned int code_size); /** * Add debug line information to a piece of code. An op_write_native_code() * with the same code pointer should have occurred before this call. It's not * necessary to provide one lineno information entry per machine instruction; * the array can contain hole. * * hdl: Handle returned from an earlier call to op_open_agent() * code: Pointer to the location of the code with debug info * nr_entry: Number of entries in compile_map * compile_map: Array of struct debug_line_info. See the JVMTI agent * library implementation for an example of what information * should be retrieved from a VM to fill out this data structure. * * Returns 0 on success; -1 otherwise. If -1 is returned, errno is * set to indicate the nature of the error. **/ int op_write_debug_line_info(op_agent_t hdl, void const * code, size_t nr_entry, struct debug_line_info const * compile_map); /** * Signal the invalidation of native code from a virtual machine. * * hdl: Handle returned from an earlier call to op_open_agent() * vma: The virtual memory address of the compiled code being unloaded. * An op_write_native_code() with the same vma should have * occurred before this call. * * Returns 0 on success; -1 otherwise. If -1 is returned, errno is * set to indicate the nature of the error. **/ int op_unload_native_code(op_agent_t hdl, uint64_t vma); /** * Returns the major version number of the libopagent library that will be used. **/ int op_major_version(void); /** * Returns the minor version number of the libopagent library that will be used. **/ int op_minor_version(void); /* idea how to post additional information for a piece of code. we use the code address as reference int op_write_loader_name(const void* code_addr, char const * loader_name); */ #if defined(__cplusplus) } #endif #endif