• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /**
2  * @file opagent.h
3  * Interface to report symbol names and dynamically generated code to Oprofile
4  *
5  * @remark Copyright 2007 OProfile authors
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with this library; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20  *
21  * @author Jens Wilke
22  * @Modifications Daniel Hansel
23  *
24  * Copyright IBM Corporation 2007
25  *
26  */
27 
28 #ifndef _LIB_OPAGENT_H
29 #define _LIB_OPAGENT_H
30 
31 #include <sys/types.h>
32 
33 #if defined(__cplusplus)
34 extern "C" {
35 #endif
36 
37 struct debug_line_info {
38 	unsigned long vma;
39 	unsigned int lineno;
40 	/* The filename format is unspecified, absolute path, relative etc. */
41 	char const * filename;
42 };
43 
44 typedef void * op_agent_t;
45 
46 /**
47  * This function must be called by agents before any other function.
48  * Creates and opens a JIT dump file in /var/lib/oprofile/jitdump
49  * using the naming convention <process_id>.dump.
50  *
51  * Returns a valid op_agent_t handle or NULL.  If NULL is returned, errno
52  * is set to indicate the nature of the error.
53  **/
54 op_agent_t op_open_agent(void);
55 
56 /**
57  * Frees all resources and closes open file handles.
58  *
59  * hdl:         Handle returned from an earlier call to op_open_agent()
60  *
61  * Returns 0 on success; -1 otherwise.  If -1 is returned, errno is
62  * set to indicate the nature of the error.
63  **/
64 int op_close_agent(op_agent_t hdl);
65 
66 /**
67  * Signal the dynamic generation of native code from a virtual machine.
68  * Writes a JIT dump record to the open JIT dump file using
69  * the passed information.
70  *
71  * hdl:         Handle returned from an earlier call to op_open_agent()
72  * symbol_name: The name of the symbol being dynamically compiled.
73  *              This name can (and should) contain all necessary
74  *              information to disambiguate it from symbols of the
75  *              same name; e.g., class, method signature.
76  * vma:         The virtual memory address of the executable code.
77  * code:        Pointer to the location of the compiled code.
78  *		Theoretically, this may be a different location from
79  *		that given by the vma argument.  For some JIT compilers,
80  *		obtaining the code may be impractical.  For this (or any other)
81  *		reason, the agent can choose to pass NULL for this paraemter.
82  *		If NULL is passed, no code will be copied into the JIT dump
83  *		file.
84  * code_size:   Size of the compiled code.
85  *
86  * Returns 0 on success; -1 otherwise.  If -1 is returned, errno is
87  * set to indicate the nature of the error.
88  **/
89 int op_write_native_code(op_agent_t hdl, char const * symbol_name,
90 			 uint64_t vma, void const * code,
91 			 const unsigned int code_size);
92 
93 /**
94  * Add debug line information to a piece of code. An op_write_native_code()
95  * with the same code pointer should have occurred before this call. It's not
96  * necessary to provide one lineno information entry per machine instruction;
97  * the array can contain hole.
98  *
99  * hdl:         Handle returned from an earlier call to op_open_agent()
100  * code:        Pointer to the location of the code with debug info
101  * nr_entry:    Number of entries in compile_map
102  * compile_map: Array of struct debug_line_info.  See the JVMTI agent
103  *              library implementation for an example of what information
104  *              should be retrieved from a VM to fill out this data structure.
105  *
106  * Returns 0 on success; -1 otherwise.  If -1 is returned, errno is
107  * set to indicate the nature of the error.
108  **/
109 int op_write_debug_line_info(op_agent_t hdl, void const * code,
110 			     size_t nr_entry,
111 			     struct debug_line_info const * compile_map);
112 
113 /**
114  * Signal the invalidation of native code from a virtual machine.
115  *
116  * hdl:         Handle returned from an earlier call to op_open_agent()
117  * vma:         The virtual memory address of the compiled code being unloaded.
118  *              An op_write_native_code() with the same vma should have
119  *              occurred before this call.
120  *
121  * Returns 0 on success; -1 otherwise.  If -1 is returned, errno is
122  * set to indicate the nature of the error.
123  **/
124 int op_unload_native_code(op_agent_t hdl, uint64_t vma);
125 
126 /**
127  * Returns the major version number of the libopagent library that will be used.
128  **/
129 int op_major_version(void);
130 
131 /**
132  * Returns the minor version number of the libopagent library that will be used.
133  **/
134 int op_minor_version(void);
135 
136 /* idea how to post additional information for a piece of code.
137    we use the code address as reference
138 int op_write_loader_name(const void* code_addr, char const * loader_name);
139 */
140 
141 #if defined(__cplusplus)
142 }
143 #endif
144 
145 #endif
146