blob: 84b92bf5452c6971dcbe8ce8a252d90ad1107fc3 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef _EM_PROFILE_ACCESS_H_
#define _EM_PROFILE_ACCESS_H_
#include "open/types.h"
#include "open/em.h"
#include <iostream>
#ifdef __cplusplus
extern "C" {
#endif
/**
* Known profiler types. Each of the profilers
* is represented with separate interface to
* create and to access to profiles.
*/
enum EM_PCTYPE {
/**
* Entry-backedge profiler.
* Collects number execution counts for
* methods entries and backedges if present.
*/
EM_PCTYPE_ENTRY_BACKEDGE=1,
/**
* Edge profiler.
* Collects profile for method entry and
* all edges in <code>IR Control Flow Graph</code>.
*/
EM_PCTYPE_EDGE=2,
/**
* Value profiler.
* Collects profile for each given instruction.
*/
EM_PCTYPE_VALUE=3
};
/**
* A EM interface used to access to profile collectors.
*/
typedef struct EM_ProfileAccessInterface {
/**
* Request profile collector type for specified profile collector handle.
*
* @param _this - EM instance profile collector belongs to
* @param pc - profile collector handle we interested in
*
* @return The type of profile collector.
*/
EM_PCTYPE (*get_pc_type) (
EM_Handle _this,
PC_Handle pc
);
/**
* Request method profile from profile collector.
*
* @param _this - EM instance profile collector belongs to
* @param pc - profile collector used to collect profile
* @param mh - method we asking profile for
*
* @return Method profile handle, that can be used to access
* to custom method profile properties with specialized
* profile collector interface.
*/
Method_Profile_Handle (*get_method_profile)(
EM_Handle _this,
PC_Handle pc,
Method_Handle mh
);
/**
* Request profile collector of specified type and role for a JIT.
*
* @param _this - EM instance profile collector belongs to
* @param profile_type - the type of profile collector
* @param jh - handle to JIT, profile collector created for
* @param jit_role - the role of JIT: the user or supplier of profile
*
* @return The handle to profile collector instance.
*/
PC_Handle (*get_pc)(
EM_Handle _this,
EM_PCTYPE profile_type,
JIT_Handle jh,
EM_JIT_PC_Role jit_role
);
// Here follows entry-backedge and edge profilers interfaces.
// All methods below could be moved into separate EB and Edge
// profiler collectors specific files.
/**
* Create new entry-backedge profile for a method.
* Only one profile per method can be created for a single
* profile collector instance.
*/
Method_Profile_Handle (*eb_profiler_create_profile) (PC_Handle ph, Method_Handle mh);
/**
* Request the address of entry counter.
* JIT configured to generate entry-backedge profile must
* emit the code to increment this counter every time a method called.
*/
void* (*eb_profiler_get_entry_counter_addr)(Method_Profile_Handle mph);
/**
* Request the address of backedge counter.
* JIT configured to generate entry-backedge profile must
* emit the code to increment this counter every time any backedge in
* a method is called.
*/
void* (*eb_profiler_get_backedge_counter_addr)(Method_Profile_Handle mph);
/**
* Check if entry-backedge profiler is configured to work in synchronous mode
* In synchronous mode JIT is responsible to emit checks that counter's limit
* is reached for both entry and backedge counters. If limit is reached
* <code>eb_profiler_sync_mode_callback</code> must be called directly from
* managed code.
* In asynchronous mode counters checks are done by profile collector in a
* separate thread.
*
* @sa eb_profiler_sync_mode_callback()
*/
char (*eb_profiler_is_in_sync_mode)(PC_Handle pch);
/**
* If profile collector is in <code>sync</code> mode
* JIT must call this method every time the counter limit is reached.
*
* @sa eb_profiler_is_in_sync_mode()
*/
void (*eb_profiler_sync_mode_callback)(Method_Profile_Handle mph);
/**
* @return The counter's limit for entry threshold for a given
* profile collector.
*/
U_32 (*eb_profiler_get_entry_threshold)(PC_Handle pch);
/**
* @return The counter's limit for backedge threshold for a given
* profile collector.
*/
U_32 (*eb_profiler_get_backedge_threshold)(PC_Handle pch);
//EDGE profiler interface
/**
* Create an edge profile for a method.
* Only one profile per method can be created for a single
* profile collector instance.
*
* @param ph - edge profile collector handle
* @param mh - method handle to create profile for
* @param numEdgeCounters - number of edge counters in a method
* @param counterKeys - the keys, or numbers, will be associated with
* each counter. The key must be used to access to
* counter value
* @param checksum - profile checksum
*
* @return A handle to access method profile data.
*/
Method_Profile_Handle (*edge_profiler_create_profile) (PC_Handle ph, Method_Handle mh, U_32 numEdgeCounters, U_32* counterKeys, U_32 checkSum);
/**
* Return number of edge counters in profile.
*/
U_32 (*edge_profiler_get_num_counters)(Method_Profile_Handle mph);
/**
* Return profile checksum.
*/
U_32 (*edge_profiler_get_checksum)(Method_Profile_Handle mph);
/**
* Return the address of counter associated with key.
*/
void* (*edge_profiler_get_counter_addr)(Method_Profile_Handle mph, U_32 key);
/**
* Return the address of entry counter.
*/
void* (*edge_profiler_get_entry_counter_addr)(Method_Profile_Handle mph);
/**
* Return the entry threshold for profile collector.
*/
U_32 (*edge_profiler_get_entry_threshold)(PC_Handle pch);
/**
* Return the edge threshold for profile collector.
*/
U_32 (*edge_profiler_get_backedge_threshold)(PC_Handle pch);
// Value profiler interface
/**
* Create an value profile for a method.
* Only one profile per method can be created for a single
* profile collector instance.
*
* @param pch - value profile collector handle
* @param mh - method handle to create profile for
* @param numKeys - number of instructions to be profiled
* @param keys - the keys, or numbers, will be associated with
* each instruction. The key must be used to access to
* instruction value
*/
Method_Profile_Handle (*value_profiler_create_profile) (PC_Handle pch, Method_Handle mh, U_32 numKeys, U_32* keys);
/**
* Update frequency or insert the new value of given instruction.
*/
void (*value_profiler_add_value)(Method_Profile_Handle mph, U_32 instructionKey, POINTER_SIZE_INT valueToAdd);
/**
* @return The maximum value(by frequency) of give instruction.
*/
POINTER_SIZE_INT (*value_profiler_get_top_value) (Method_Profile_Handle mph, U_32 instructionKey);
void (*value_profiler_dump_values) (Method_Profile_Handle mph, std::ostream& os);
} EM_ProfileAccessInterface;
#ifdef __cplusplus
}
#endif
#endif