123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694 |
- /* <copyright>
- This file is provided under a dual BSD/GPLv2 license. When using or
- redistributing this file, you may do so under either license.
- GPL LICENSE SUMMARY
- Copyright (c) 2005-2014 Intel Corporation. All rights reserved.
- This program is free software; you can redistribute it and/or modify
- it under the terms of version 2 of the GNU General Public License as
- published by the Free Software Foundation.
- This program 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
- General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
- The full GNU General Public License is included in this distribution
- in the file called LICENSE.GPL.
- Contact Information:
- http://software.intel.com/en-us/articles/intel-vtune-amplifier-xe/
- BSD LICENSE
- Copyright (c) 2005-2014 Intel Corporation. All rights reserved.
- All rights reserved.
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
- * Neither the name of Intel Corporation nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- </copyright> */
- #ifndef __JITPROFILING_H__
- #define __JITPROFILING_H__
- /**
- * @brief JIT Profiling APIs
- *
- * The JIT Profiling API is used to report information about just-in-time
- * generated code that can be used by performance tools. The user inserts
- * calls in the code generator to report information before JIT-compiled
- * code goes to execution. This information is collected at runtime and used
- * by tools like Intel(R) VTune(TM) Amplifier to display performance metrics
- * associated with JIT-compiled code.
- *
- * These APIs can be used to\n
- * - **Profile trace-based and method-based JIT-compiled
- * code**. Some examples of environments that you can profile with these APIs:
- * dynamic JIT compilation of JavaScript code traces, JIT execution in OpenCL(TM)
- * software technology, Java/.NET managed execution environments, and custom
- * ISV JIT engines.
- * @code
- * #include <jitprofiling.h>
- *
- * if (iJIT_IsProfilingActive != iJIT_SAMPLING_ON) {
- * return;
- * }
- *
- * iJIT_Method_Load jmethod = {0};
- * jmethod.method_id = iJIT_GetNewMethodID();
- * jmethod.method_name = "method_name";
- * jmethod.class_file_name = "class_name";
- * jmethod.source_file_name = "source_file_name";
- * jmethod.method_load_address = code_addr;
- * jmethod.method_size = code_size;
- *
- * iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, (void*)&jmethod);
- * iJIT_NotifyEvent(iJVM_EVENT_TYPE_SHUTDOWN, NULL);
- * @endcode
- *
- * * Expected behavior:
- * * If any iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED event overwrites an
- * already reported method, then such a method becomes invalid and its
- * memory region is treated as unloaded. VTune Amplifier displays the metrics
- * collected by the method until it is overwritten.
- * * If supplied line number information contains multiple source lines for
- * the same assembly instruction (code location), then VTune Amplifier picks up
- * the first line number.
- * * Dynamically generated code can be associated with a module name.
- * Use the iJIT_Method_Load_V2 structure.\n
- * Clarification of some cases:
- * * If you register a function with the same method ID multiple times,
- * specifying different module names, then the VTune Amplifier picks up
- * the module name registered first. If you want to distinguish the same
- * function between different JIT engines, supply different method IDs for
- * each function. Other symbolic information (for example, source file)
- * can be identical.
- *
- * - **Analyze split functions** (multiple joint or disjoint code regions
- * belonging to the same function) **including re-JIT**
- * with potential overlapping of code regions in time, which is common in
- * resource-limited environments.
- * @code
- * #include <jitprofiling.h>
- *
- * unsigned int method_id = iJIT_GetNewMethodID();
- *
- * iJIT_Method_Load a = {0};
- * a.method_id = method_id;
- * a.method_load_address = 0x100;
- * a.method_size = 0x20;
- *
- * iJIT_Method_Load b = {0};
- * b.method_id = method_id;
- * b.method_load_address = 0x200;
- * b.method_size = 0x30;
- *
- * iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, (void*)&a);
- * iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, (void*)&b);
- * @endcode
- *
- * * Expected behaviour:
- * * If a iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED event overwrites an
- * already reported method, then such a method becomes invalid and
- * its memory region is treated as unloaded.
- * * All code regions reported with the same method ID are considered as
- * belonging to the same method. Symbolic information (method name,
- * source file name) will be taken from the first notification, and all
- * subsequent notifications with the same method ID will be processed
- * only for line number table information. So, the VTune Amplifier will map
- * samples to a source line using the line number table from the current
- * notification while taking the source file name from the very first one.\n
- * Clarification of some cases:\n
- * * If you register a second code region with a different source file
- * name and the same method ID, then this information will be saved and
- * will not be considered as an extension of the first code region, but
- * VTune Amplifier will use the source file of the first code region and map
- * performance metrics incorrectly.
- * * If you register a second code region with the same source file as
- * for the first region and the same method ID, then the source file will be
- * discarded but VTune Amplifier will map metrics to the source file correctly.
- * * If you register a second code region with a null source file and
- * the same method ID, then provided line number info will be associated
- * with the source file of the first code region.
- *
- * - **Explore inline functions** including multi-level hierarchy of
- * nested inline methods which shows how performance metrics are distributed through them.
- * @code
- * #include <jitprofiling.h>
- *
- * // method_id parent_id
- * // [-- c --] 3000 2000
- * // [---- d -----] 2001 1000
- * // [---- b ----] 2000 1000
- * // [------------ a ----------------] 1000 n/a
- *
- * iJIT_Method_Load a = {0};
- * a.method_id = 1000;
- *
- * iJIT_Method_Inline_Load b = {0};
- * b.method_id = 2000;
- * b.parent_method_id = 1000;
- *
- * iJIT_Method_Inline_Load c = {0};
- * c.method_id = 3000;
- * c.parent_method_id = 2000;
- *
- * iJIT_Method_Inline_Load d = {0};
- * d.method_id = 2001;
- * d.parent_method_id = 1000;
- *
- * iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED, (void*)&a);
- * iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED, (void*)&b);
- * iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED, (void*)&c);
- * iJIT_NotifyEvent(iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED, (void*)&d);
- * @endcode
- *
- * * Requirements:
- * * Each inline (iJIT_Method_Inline_Load) method should be associated
- * with two method IDs: one for itself; one for its immediate parent.
- * * Address regions of inline methods of the same parent method cannot
- * overlap each other.
- * * Execution of the parent method must not be started until it and all
- * its inline methods are reported.
- * * Expected behaviour:
- * * In case of nested inline methods an order of
- * iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED events is not important.
- * * If any event overwrites either inline method or top parent method,
- * then the parent, including inline methods, becomes invalid and its memory
- * region is treated as unloaded.
- *
- * **Life time of allocated data**\n
- * The client sends an event notification to the agent with event-specific
- * data, which is a structure. The pointers in the structure refer to memory
- * allocated by the client, which responsible for releasing it. The pointers are
- * used by the iJIT_NotifyEvent method to copy client's data in a trace file,
- * and they are not used after the iJIT_NotifyEvent method returns.
- */
- /**
- * @defgroup jitapi JIT Profiling
- * @ingroup internal
- * @{
- */
- /**
- * @brief Enumerator for the types of notifications
- */
- typedef enum iJIT_jvm_event
- {
- iJVM_EVENT_TYPE_SHUTDOWN = 2, /**<\brief Send this to shutdown the agent.
- * Use NULL for event data. */
- iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED = 13, /**<\brief Send when dynamic code is
- * JIT compiled and loaded into
- * memory by the JIT engine, but
- * before the code is executed.
- * Use iJIT_Method_Load as event
- * data. */
- /** @cond exclude_from_documentation */
- iJVM_EVENT_TYPE_METHOD_UNLOAD_START, /**<\brief Send when compiled dynamic
- * code is being unloaded from memory.
- * Use iJIT_Method_Load as event data.*/
- /** @endcond */
- iJVM_EVENT_TYPE_METHOD_UPDATE, /**<\brief Send to provide new content for
- * a previously reported dynamic code.
- * The previous content will be invalidated
- * starting from the time of the notification.
- * Use iJIT_Method_Load as event data but
- * required fields are following:
- * - method_id identify the code to update.
- * - method_load_address specify start address
- * within identified code range
- * where update should be started.
- * - method_size specify length of updated code
- * range. */
- iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED, /**<\brief Send when an inline dynamic
- * code is JIT compiled and loaded
- * into memory by the JIT engine,
- * but before the parent code region
- * starts executing.
- * Use iJIT_Method_Inline_Load as event data.*/
- /** @cond exclude_from_documentation */
- iJVM_EVENT_TYPE_METHOD_UPDATE_V2,
- /** @endcond */
- iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V2 = 21, /**<\brief Send when a dynamic code is
- * JIT compiled and loaded into
- * memory by the JIT engine, but
- * before the code is executed.
- * Use iJIT_Method_Load_V2 as event data. */
- iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V3 /**<\brief Send when a dynamic code is
- * JIT compiled and loaded into
- * memory by the JIT engine, but
- * before the code is executed.
- * Use iJIT_Method_Load_V3 as event data. */
- } iJIT_JVM_EVENT;
- /**
- * @brief Enumerator for the agent's mode
- */
- typedef enum _iJIT_IsProfilingActiveFlags
- {
- iJIT_NOTHING_RUNNING = 0x0000, /**<\brief The agent is not running;
- * iJIT_NotifyEvent calls will
- * not be processed. */
- iJIT_SAMPLING_ON = 0x0001, /**<\brief The agent is running and
- * ready to process notifications. */
- } iJIT_IsProfilingActiveFlags;
- /**
- * @brief Description of a single entry in the line number information of a code region.
- * @details A table of line number entries gives information about how the reported code region
- * is mapped to source file.
- * Intel(R) VTune(TM) Amplifier uses line number information to attribute
- * the samples (virtual address) to a line number. \n
- * It is acceptable to report different code addresses for the same source line:
- * @code
- * Offset LineNumber
- * 1 2
- * 12 4
- * 15 2
- * 18 1
- * 21 30
- *
- * VTune Amplifier constructs the following table using the client data
- *
- * Code subrange Line number
- * 0-1 2
- * 1-12 4
- * 12-15 2
- * 15-18 1
- * 18-21 30
- * @endcode
- */
- typedef struct _LineNumberInfo
- {
- unsigned int Offset; /**<\brief Offset from the begining of the code region. */
- unsigned int LineNumber; /**<\brief Matching source line number offset (from beginning of source file). */
- } *pLineNumberInfo, LineNumberInfo;
- /**
- * @brief Enumerator for the code architecture.
- */
- typedef enum _iJIT_CodeArchitecture
- {
- iJIT_CA_NATIVE = 0, /**<\brief Native to the process architecture that is calling it. */
- iJIT_CA_32, /**<\brief 32-bit machine code. */
- iJIT_CA_64 /**<\brief 64-bit machine code. */
- } iJIT_CodeArchitecture;
- #pragma pack(push, 8)
- /**
- * @brief Description of a JIT-compiled method
- * @details When you use the iJIT_Method_Load structure to describe
- * the JIT compiled method, use iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED
- * as an event type to report it.
- */
- typedef struct _iJIT_Method_Load
- {
- unsigned int method_id; /**<\brief Unique method ID. Cannot be 0.
- * You must either use the API function
- * iJIT_GetNewMethodID to get a valid and unique
- * method ID, or else manage ID uniqueness
- * and correct range by yourself.\n
- * You must use the same method ID for all code
- * regions of the same method, otherwise different
- * method IDs specify different methods. */
- char* method_name; /**<\brief The name of the method. It can be optionally
- * prefixed with its class name and appended with
- * its complete signature. Can't be NULL. */
- void* method_load_address; /**<\brief The start virtual address of the method code
- * region. If NULL, data provided with
- * event are not accepted. */
- unsigned int method_size; /**<\brief The code size of the method in memory.
- * If 0, then data provided with the event are not
- * accepted. */
- unsigned int line_number_size; /**<\brief The number of entries in the line number
- * table.0 if none. */
- pLineNumberInfo line_number_table; /**<\brief Pointer to the line numbers info
- * array. Can be NULL if
- * line_number_size is 0. See
- * LineNumberInfo Structure for a
- * description of a single entry in
- * the line number info array */
- unsigned int class_id; /**<\brief This field is obsolete. */
- char* class_file_name; /**<\brief Class name. Can be NULL.*/
- char* source_file_name; /**<\brief Source file name. Can be NULL.*/
- } *piJIT_Method_Load, iJIT_Method_Load;
- /**
- * @brief Description of a JIT-compiled method
- * @details When you use the iJIT_Method_Load_V2 structure to describe
- * the JIT compiled method, use iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V2
- * as an event type to report it.
- */
- typedef struct _iJIT_Method_Load_V2
- {
- unsigned int method_id; /**<\brief Unique method ID. Cannot be 0.
- * You must either use the API function
- * iJIT_GetNewMethodID to get a valid and unique
- * method ID, or else manage ID uniqueness
- * and correct range by yourself.\n
- * You must use the same method ID for all code
- * regions of the same method, otherwise different
- * method IDs specify different methods. */
- char* method_name; /**<\brief The name of the method. It can be optionally
- * prefixed with its class name and appended with
- * its complete signature. Can't be NULL. */
- void* method_load_address; /**<\brief The start virtual address of the method code
- * region. If NULL, then data provided with the
- * event are not accepted. */
- unsigned int method_size; /**<\brief The code size of the method in memory.
- * If 0, then data provided with the event are not
- * accepted. */
- unsigned int line_number_size; /**<\brief The number of entries in the line number
- * table. 0 if none. */
- pLineNumberInfo line_number_table; /**<\brief Pointer to the line numbers info
- * array. Can be NULL if
- * line_number_size is 0. See
- * LineNumberInfo Structure for a
- * description of a single entry in
- * the line number info array. */
- char* class_file_name; /**<\brief Class name. Can be NULL. */
- char* source_file_name; /**<\brief Source file name. Can be NULL. */
- char* module_name; /**<\brief Module name. Can be NULL.
- The module name can be useful for distinguishing among
- different JIT engines. VTune Amplifier will display
- reported methods grouped by specific module. */
- } *piJIT_Method_Load_V2, iJIT_Method_Load_V2;
- /**
- * @brief Description of a JIT-compiled method
- * @details The iJIT_Method_Load_V3 structure is the same as iJIT_Method_Load_V2
- * with a newly introduced 'arch' field that specifies architecture of the code region.
- * When you use the iJIT_Method_Load_V3 structure to describe
- * the JIT compiled method, use iJVM_EVENT_TYPE_METHOD_LOAD_FINISHED_V3
- * as an event type to report it.
- */
- typedef struct _iJIT_Method_Load_V3
- {
- unsigned int method_id; /**<\brief Unique method ID. Cannot be 0.
- * You must either use the API function
- * iJIT_GetNewMethodID to get a valid and unique
- * method ID, or manage ID uniqueness
- * and correct range by yourself.\n
- * You must use the same method ID for all code
- * regions of the same method, otherwise they are
- * treated as regions of different methods. */
- char* method_name; /**<\brief The name of the method. It can be optionally
- * prefixed with its class name and appended with
- * its complete signature. Cannot be NULL. */
- void* method_load_address; /**<\brief The start virtual address of the method code
- * region. If NULL, then data provided with the
- * event are not accepted. */
- unsigned int method_size; /**<\brief The code size of the method in memory.
- * If 0, then data provided with the event are not
- * accepted. */
- unsigned int line_number_size; /**<\brief The number of entries in the line number
- * table. 0 if none. */
- pLineNumberInfo line_number_table; /**<\brief Pointer to the line numbers info
- * array. Can be NULL if
- * line_number_size is 0. See
- * LineNumberInfo Structure for a
- * description of a single entry in
- * the line number info array. */
- char* class_file_name; /**<\brief Class name. Can be NULL. */
- char* source_file_name; /**<\brief Source file name. Can be NULL. */
- char* module_name; /**<\brief Module name. Can be NULL.
- * The module name can be useful for distinguishing among
- * different JIT engines. VTune Amplifier will display
- * reported methods grouped by specific module. */
- iJIT_CodeArchitecture module_arch; /**<\brief Architecture of the method's code region.
- * By default, it is the same as the process
- * architecture that is calling it.
- * For example, you can use it if your 32-bit JIT
- * engine generates 64-bit code.
- *
- * If JIT engine reports both 32-bit and 64-bit types
- * of methods then VTune Amplifier splits the methods
- * with the same module name but with different
- * architectures in two different modules. VTune Amplifier
- * modifies the original name provided with a 64-bit method
- * version by ending it with '(64)' */
- } *piJIT_Method_Load_V3, iJIT_Method_Load_V3;
- /**
- * @brief Description of an inline JIT-compiled method
- * @details When you use the_iJIT_Method_Inline_Load structure to describe
- * the JIT compiled method, use iJVM_EVENT_TYPE_METHOD_INLINE_LOAD_FINISHED
- * as an event type to report it.
- */
- typedef struct _iJIT_Method_Inline_Load
- {
- unsigned int method_id; /**<\brief Unique method ID. Cannot be 0.
- * You must either use the API function
- * iJIT_GetNewMethodID to get a valid and unique
- * method ID, or else manage ID uniqueness
- * and correct range by yourself. */
- unsigned int parent_method_id; /**<\brief Unique immediate parent's method ID.
- * Cannot be 0.
- * You must either use the API function
- * iJIT_GetNewMethodID to get a valid and unique
- * method ID, or else manage ID uniqueness
- * and correct range by yourself. */
- char* method_name; /**<\brief The name of the method. It can be optionally
- * prefixed with its class name and appended with
- * its complete signature. Can't be NULL. */
- void* method_load_address; /** <\brief The virtual address on which the method
- * is inlined. If NULL, then data provided with
- * the event are not accepted. */
- unsigned int method_size; /**<\brief The code size of the method in memory.
- * If 0, then data provided with the event are not
- * accepted. */
- unsigned int line_number_size; /**<\brief The number of entries in the line number
- * table. 0 if none. */
- pLineNumberInfo line_number_table; /**<\brief Pointer to the line numbers info
- * array. Can be NULL if
- * line_number_size is 0. See
- * LineNumberInfo Structure for a
- * description of a single entry in
- * the line number info array */
- char* class_file_name; /**<\brief Class name. Can be NULL.*/
- char* source_file_name; /**<\brief Source file name. Can be NULL.*/
- } *piJIT_Method_Inline_Load, iJIT_Method_Inline_Load;
- /** @cond exclude_from_documentation */
- /**
- * @brief Description of a segment type
- * @details Use the segment type to specify a type of data supplied
- * with the iJVM_EVENT_TYPE_METHOD_UPDATE_V2 event to be applied to
- * a certain code trace.
- */
- typedef enum _iJIT_SegmentType
- {
- iJIT_CT_UNKNOWN = 0,
- iJIT_CT_CODE, /**<\brief Executable code. */
- iJIT_CT_DATA, /**<\brief Data (not executable code).
- * VTune Amplifier uses the format string
- * (see iJIT_Method_Update) to represent
- * this data in the VTune Amplifier GUI */
- iJIT_CT_KEEP, /**<\brief Use the previous markup for the trace.
- * Can be used for the following
- * iJVM_EVENT_TYPE_METHOD_UPDATE_V2 events,
- * if the type of the previously reported segment
- * type is the same. */
- iJIT_CT_EOF
- } iJIT_SegmentType;
- /**
- * @brief Description of a dynamic update of the content within JIT-compiled method
- * @details The JIT engine may generate the methods that are updated at runtime
- * partially by mixed (data + executable code) content. When you use the iJIT_Method_Update
- * structure to describe the update of the content within a JIT-compiled method,
- * use iJVM_EVENT_TYPE_METHOD_UPDATE_V2 as an event type to report it.
- *
- * On the first Update event, VTune Amplifier copies the original code range reported by
- * the iJVM_EVENT_TYPE_METHOD_LOAD event, then modifies it with the supplied bytes and
- * adds the modified range to the original method. For next update events, VTune Amplifier
- * does the same but it uses the latest modified version of a code region for update.
- * Eventually, VTune Amplifier GUI displays multiple code ranges for the method reported by
- * the iJVM_EVENT_TYPE_METHOD_LOAD event.
- * Notes:
- * - Multiple update events with different types for the same trace are allowed
- * but they must be reported for the same code ranges.
- * Example,
- * @code
- * [-- data---] Allowed
- * [-- code --] Allowed
- * [code] Ignored
- * [-- data---] Allowed
- * [-- code --] Allowed
- * [------------ trace ---------]
- * @endcode
- * - The types of previously reported events can be changed but they must be reported
- * for the same code ranges.
- * Example,
- * @code
- * [-- data---] Allowed
- * [-- code --] Allowed
- * [-- data---] Allowed
- * [-- code --] Allowed
- * [------------ trace ---------]
- * @endcode
- */
- typedef struct _iJIT_Method_Update
- {
- void* load_address; /**<\brief Start address of the update within a method */
- unsigned int size; /**<\brief The update size */
- iJIT_SegmentType type; /**<\brief Type of the update */
- const char* data_format; /**<\brief C string that contains a format string
- * that follows the same specifications as format in printf.
- * The format string is used for iJIT_CT_CODE only
- * and cannot be NULL.
- * Format can be changed on the fly. */
- } *piJIT_Method_Update, iJIT_Method_Update;
- /** @endcond */
- #pragma pack(pop)
- /** @cond exclude_from_documentation */
- #ifdef __cplusplus
- extern "C" {
- #endif /* __cplusplus */
- #ifndef CDECL
- # if defined WIN32 || defined _WIN32
- # define CDECL __cdecl
- # else /* defined WIN32 || defined _WIN32 */
- # if defined _M_IX86 || defined __i386__
- # define CDECL __attribute__ ((cdecl))
- # else /* _M_IX86 || __i386__ */
- # define CDECL /* actual only on x86_64 platform */
- # endif /* _M_IX86 || __i386__ */
- # endif /* defined WIN32 || defined _WIN32 */
- #endif /* CDECL */
- #define JITAPI CDECL
- /** @endcond */
- /**
- * @brief Generates a new unique method ID.
- *
- * You must use this API to obtain unique and valid method IDs for methods or
- * traces reported to the agent if you don't have your own mechanism to generate
- * unique method IDs.
- *
- * @return a new unique method ID. When out of unique method IDs, this API
- * returns 0, which is not an accepted value.
- */
- unsigned int JITAPI iJIT_GetNewMethodID(void);
- /**
- * @brief Returns the current mode of the agent.
- *
- * @return iJIT_SAMPLING_ON, indicating that agent is running, or
- * iJIT_NOTHING_RUNNING if no agent is running.
- */
- iJIT_IsProfilingActiveFlags JITAPI iJIT_IsProfilingActive(void);
- /**
- * @brief Reports infomation about JIT-compiled code to the agent.
- *
- * The reported information is used to attribute samples obtained from any
- * Intel(R) VTune(TM) Amplifier collector. This API needs to be called
- * after JIT compilation and before the first entry into the JIT-compiled
- * code.
- *
- * @param[in] event_type - type of the data sent to the agent
- * @param[in] EventSpecificData - pointer to event-specific data
- *
- * @returns 1 on success, otherwise 0.
- */
- int JITAPI iJIT_NotifyEvent(iJIT_JVM_EVENT event_type, void *EventSpecificData);
- #ifdef __cplusplus
- }
- #endif /* __cplusplus */
- /** @endcond */
- /** @} jitapi group */
- #endif /* __JITPROFILING_H__ */
|