You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

676 lines
41 KiB

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Pin: Instrumentation API</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Pin
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="summary">
<a href="#typedef-members">Typedefs</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">Instrumentation API<div class="ingroups"><a class="el" href="group__INS__BASIC__API.html">INS: Instruction Object</a></div></div> </div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
Typedefs</h2></td></tr>
<tr class="memitem:ga1dbcddbc297c12bba5ce1eb6c3cf11b1"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__INS__INST__API.html#ga1dbcddbc297c12bba5ce1eb6c3cf11b1">LEVEL_PINCLIENT::INS_INSTRUMENT_CALLBACK</a>) (INS ins, VOID *v)</td></tr>
<tr class="separator:ga1dbcddbc297c12bba5ce1eb6c3cf11b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:gaaff4a98e0ece27fc46c0050b4ae05c6d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__INS__INST__API.html#gaaff4a98e0ece27fc46c0050b4ae05c6d">LEVEL_PINCLIENT::INS_AddInstrumentFunction</a> (<a class="el" href="group__INS__INST__API.html#ga1dbcddbc297c12bba5ce1eb6c3cf11b1">INS_INSTRUMENT_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:gaaff4a98e0ece27fc46c0050b4ae05c6d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga26d02bff719bf8600421895956804252"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__INS__INST__API.html#ga26d02bff719bf8600421895956804252">LEVEL_PINCLIENT::INS_InsertPredicatedCall</a> (INS ins, <a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a> ipoint, AFUNPTR funptr,...)</td></tr>
<tr class="separator:ga26d02bff719bf8600421895956804252"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga74a956a0acde197043d04f4adcde4626"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__INS__INST__API.html#ga74a956a0acde197043d04f4adcde4626">LEVEL_PINCLIENT::INS_InsertCall</a> (INS ins, <a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a> action, AFUNPTR funptr,...)</td></tr>
<tr class="separator:ga74a956a0acde197043d04f4adcde4626"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga7907ad8ebd991b9e24df3b3b9cec4cac"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__INS__INST__API.html#ga7907ad8ebd991b9e24df3b3b9cec4cac">LEVEL_PINCLIENT::INS_InsertIfCall</a> (INS ins, <a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a> action, AFUNPTR funptr,...)</td></tr>
<tr class="separator:ga7907ad8ebd991b9e24df3b3b9cec4cac"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga952b2b061d3fa8f1cc4d5d59fef53a69"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__INS__INST__API.html#ga952b2b061d3fa8f1cc4d5d59fef53a69">LEVEL_PINCLIENT::INS_InsertThenCall</a> (INS ins, <a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a> action, AFUNPTR funptr,...)</td></tr>
<tr class="separator:ga952b2b061d3fa8f1cc4d5d59fef53a69"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga5009833ffeecd9fecd8f842a605bf2a1"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__INS__INST__API.html#ga5009833ffeecd9fecd8f842a605bf2a1">LEVEL_PINCLIENT::INS_InsertIfPredicatedCall</a> (INS ins, <a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a> action, AFUNPTR funptr,...)</td></tr>
<tr class="separator:ga5009833ffeecd9fecd8f842a605bf2a1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga88f930cbed33fa370c9611cc0183d97b"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__INS__INST__API.html#ga88f930cbed33fa370c9611cc0183d97b">LEVEL_PINCLIENT::INS_InsertThenPredicatedCall</a> (INS ins, <a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a> action, AFUNPTR funptr,...)</td></tr>
<tr class="separator:ga88f930cbed33fa370c9611cc0183d97b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gacf731514b88f79344068df5d8e60eacc"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__INS__INST__API.html#gacf731514b88f79344068df5d8e60eacc">LEVEL_PINCLIENT::INS_InsertFillBuffer</a> (INS ins, <a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a> action, BUFFER_ID id,...)</td></tr>
<tr class="separator:gacf731514b88f79344068df5d8e60eacc"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga74a3e0d9a1e35568c28abd9b2ba29e4d"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__INS__INST__API.html#ga74a3e0d9a1e35568c28abd9b2ba29e4d">LEVEL_PINCLIENT::INS_InsertFillBufferPredicated</a> (INS ins, <a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a> action, BUFFER_ID id,...)</td></tr>
<tr class="separator:ga74a3e0d9a1e35568c28abd9b2ba29e4d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa4e98a83483b18bf47d20cb99b4c24ec"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__INS__INST__API.html#gaa4e98a83483b18bf47d20cb99b4c24ec">LEVEL_PINCLIENT::INS_InsertFillBufferThen</a> (INS ins, <a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a> action, BUFFER_ID id,...)</td></tr>
<tr class="separator:gaa4e98a83483b18bf47d20cb99b4c24ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<p>Use these functions to instrument instructions. </p>
<h2 class="groupheader">Typedef Documentation</h2>
<a id="ga1dbcddbc297c12bba5ce1eb6c3cf11b1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga1dbcddbc297c12bba5ce1eb6c3cf11b1">&#9670;&nbsp;</a></span>INS_INSTRUMENT_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::INS_INSTRUMENT_CALLBACK) (INS ins, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p><a class="anchor" id="INS_INSTRUMENT_CALLBACK"></a> Call back function used to instrument instructions </p>
</div>
</div>
<h2 class="groupheader">Function Documentation</h2>
<a id="gaaff4a98e0ece27fc46c0050b4ae05c6d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaaff4a98e0ece27fc46c0050b4ae05c6d">&#9670;&nbsp;</a></span>INS_AddInstrumentFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::INS_AddInstrumentFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__INS__INST__API.html#ga1dbcddbc297c12bba5ce1eb6c3cf11b1">INS_INSTRUMENT_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Add a function used to instrument at instruction granularity </p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">fun</td><td>Instrumentation function for instructions </td></tr>
<tr><td class="paramname">val</td><td>passed as the second argument to the instrumentation function</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga74a956a0acde197043d04f4adcde4626"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga74a956a0acde197043d04f4adcde4626">&#9670;&nbsp;</a></span>INS_InsertCall()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::INS_InsertCall </td>
<td>(</td>
<td class="paramtype">INS&#160;</td>
<td class="paramname"><em>ins</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a>&#160;</td>
<td class="paramname"><em>action</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">AFUNPTR&#160;</td>
<td class="paramname"><em>funptr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname"><em>...</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Insert a call to funptr relative to instruction ins. </p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">ins</td><td>Instruction to instrument </td></tr>
<tr><td class="paramname">action</td><td>Specifies before, after, etc. <br />
IPOINT_BEFORE is always valid for all instructions. <br />
IPOINT_AFTER is valid only when a fall-through exists (i.e. Calls and unconditional branches will fail). It is only allowed when INS_IsValidForIpointAfter(ins) is true. <br />
IPOINT_TAKEN_BRANCH is invalid for non-branches. It is only allowed when INS_IsValidForIpointTakenBranch is true. </td></tr>
<tr><td class="paramname">funptr</td><td>Insert a call to funptr </td></tr>
<tr><td class="paramname">...</td><td>List of arguments to pass funptr. See <a class="el" href="group__INST__ARGS.html#ga089c27ca15e9ff139dd3a3f8a6f8451d">IARG_TYPE</a>, terminated with IARG_END</td></tr>
</table>
</dd>
</dl>
<p>If more than one call is inserted for the same instruction, the order is determined by <a class="el" href="group__INST__ARGS.html#gga089c27ca15e9ff139dd3a3f8a6f8451da45b6bfd69845ada4a0875967995ad7c6">IARG_CALL_ORDER</a>. For more information, see <a class="el" href="group__INST__ARGS.html#ga3d1d5f6805cb16d00bce441290ca2212">CALL_ORDER</a>.</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="gacf731514b88f79344068df5d8e60eacc"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gacf731514b88f79344068df5d8e60eacc">&#9670;&nbsp;</a></span>INS_InsertFillBuffer()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::INS_InsertFillBuffer </td>
<td>(</td>
<td class="paramtype">INS&#160;</td>
<td class="paramname"><em>ins</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a>&#160;</td>
<td class="paramname"><em>action</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">BUFFER_ID&#160;</td>
<td class="paramname"><em>id</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname"><em>...</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Insert analysis code to fill one record in a trace buffer whenever an application instruction executes.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">ins</td><td>The application instruction. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">action</td><td>Tells whether the record is filled before or after the instruction. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">id</td><td>The ID of the buffer whose record is filled. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">...</td><td><a class="el" href="group__INST__ARGS.html#ga089c27ca15e9ff139dd3a3f8a6f8451d">IARG_TYPE</a>. Additional arguments to specify the fields of the trace buffer. These additional arguments take the form: IARG_TYPE arg, [optional IARG parameters], size_t offset, ..., IARG_END The arg argument specifies the value to write to the trace record field. The offset argument specifies the offset (in bytes) from the start of the trace record to this field. Typically, you would use "offsetof()" for this. if arg requires additional parameters, they come before offset.</td></tr>
</table>
</dd>
</dl>
<p>Certain IARG_TYPEs cannot be used with the *_InsertFillBuffer APIs. The unsupported IARG_TYPEs are: IARG_CONTEXT, IARG_REG_REFERENCE, and IARG_REG_CONST_REFERENCE.</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux &amp; Windows<br />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="ga74a3e0d9a1e35568c28abd9b2ba29e4d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga74a3e0d9a1e35568c28abd9b2ba29e4d">&#9670;&nbsp;</a></span>INS_InsertFillBufferPredicated()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::INS_InsertFillBufferPredicated </td>
<td>(</td>
<td class="paramtype">INS&#160;</td>
<td class="paramname"><em>ins</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a>&#160;</td>
<td class="paramname"><em>action</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">BUFFER_ID&#160;</td>
<td class="paramname"><em>id</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname"><em>...</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Insert analysis code to fill one record in a trace buffer whenever an application instruction executes, based on that instruction's predicate.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">ins</td><td>The application instruction </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">action</td><td>Whether the record is filled before or after the instruction </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">id</td><td>The ID of the buffer whose record is filled </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">...</td><td><a class="el" href="group__INST__ARGS.html#ga089c27ca15e9ff139dd3a3f8a6f8451d">IARG_TYPE</a>. Additional arguments to specify the fields of the trace buffer.</td></tr>
</table>
</dd>
</dl>
<p>Certain IARG_TYPEs cannot be used with the *_InsertFillBuffer APIs. The unsupported IARG_TYPEs are: IARG_CONTEXT, IARG_REG_REFERENCE, and IARG_REG_CONST_REFERENCE.</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux &amp; Windows<br />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="gaa4e98a83483b18bf47d20cb99b4c24ec"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaa4e98a83483b18bf47d20cb99b4c24ec">&#9670;&nbsp;</a></span>INS_InsertFillBufferThen()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::INS_InsertFillBufferThen </td>
<td>(</td>
<td class="paramtype">INS&#160;</td>
<td class="paramname"><em>ins</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a>&#160;</td>
<td class="paramname"><em>action</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">BUFFER_ID&#160;</td>
<td class="paramname"><em>id</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname"><em>...</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Insert analysis code to fill one record in a trace buffer whenever an application instruction executes. The record is only inserted if the preceding "if" analysis call returns a non-zero value.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">ins</td><td>The application instruction </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">action</td><td>Whether the record is filled before or after the instruction </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">id</td><td>The ID of the buffer whose record is to filled </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">...</td><td><a class="el" href="group__INST__ARGS.html#ga089c27ca15e9ff139dd3a3f8a6f8451d">IARG_TYPE</a>. Additional arguments to specify the fields of the trace buffer.</td></tr>
</table>
</dd>
</dl>
<p>Certain IARG_TYPEs cannot be used with the *_InsertFillBuffer APIs. The unsupported IARG_TYPEs are: IARG_CONTEXT, IARG_REG_REFERENCE, and IARG_REG_CONST_REFERENCE.</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux &amp; Windows<br />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="ga7907ad8ebd991b9e24df3b3b9cec4cac"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga7907ad8ebd991b9e24df3b3b9cec4cac">&#9670;&nbsp;</a></span>INS_InsertIfCall()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::INS_InsertIfCall </td>
<td>(</td>
<td class="paramtype">INS&#160;</td>
<td class="paramname"><em>ins</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a>&#160;</td>
<td class="paramname"><em>action</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">AFUNPTR&#160;</td>
<td class="paramname"><em>funptr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname"><em>...</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Insert a call to funptr relative to an INS. If funptr returns a non-zero ADDRINT, then the immediately following "then" analysis call is executed.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">ins</td><td>Instruction to instrument </td></tr>
<tr><td class="paramname">action</td><td>Specifies before, after, etc. <br />
IPOINT_BEFORE is always valid for all instructions. <br />
IPOINT_AFTER is valid only when a fall-through exists (i.e. Calls and unconditional branches will fail). It is only allowed when INS_IsValidForIpointAfter(ins) is true. <br />
IPOINT_TAKEN_BRANCH is invalid for non-branches. It is only allowed when INS_IsValidForIpointTakenBranch is true. <br />
IPOINT_ANYWHERE is not supported and will result an error. <br />
action value must be identical to the value passed to the corresponding <a class="el" href="group__INS__INST__API.html#ga952b2b061d3fa8f1cc4d5d59fef53a69">INS_InsertThenCall</a>. </td></tr>
<tr><td class="paramname">funptr</td><td>Insert a call to funptr. Its return type must be ADDRINT </td></tr>
<tr><td class="paramname">...</td><td>List of arguments to pass funptr. See <a class="el" href="group__INST__ARGS.html#ga089c27ca15e9ff139dd3a3f8a6f8451d">IARG_TYPE</a>, terminated with IARG_END</td></tr>
</table>
</dd>
</dl>
<p>If more than one call is inserted for the same instruction, the order is determined by <a class="el" href="group__INST__ARGS.html#gga089c27ca15e9ff139dd3a3f8a6f8451da45b6bfd69845ada4a0875967995ad7c6">IARG_CALL_ORDER</a>. For more information, see <a class="el" href="group__INST__ARGS.html#ga3d1d5f6805cb16d00bce441290ca2212">CALL_ORDER</a>. Note that if <a class="el" href="group__INST__ARGS.html#ga3d1d5f6805cb16d00bce441290ca2212">CALL_ORDER</a> is used, Both "if" and "then" analysis calls must have the same order.</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga5009833ffeecd9fecd8f842a605bf2a1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga5009833ffeecd9fecd8f842a605bf2a1">&#9670;&nbsp;</a></span>INS_InsertIfPredicatedCall()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::INS_InsertIfPredicatedCall </td>
<td>(</td>
<td class="paramtype">INS&#160;</td>
<td class="paramname"><em>ins</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a>&#160;</td>
<td class="paramname"><em>action</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">AFUNPTR&#160;</td>
<td class="paramname"><em>funptr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname"><em>...</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Insert a call to funptr relative to an INS. If funptr returns a non-zero ADDRINT and the instruction has a true predicate, then the immediately following "then" analysis call is executed. If the instruction is not predicated, then this function is identical to <a class="el" href="group__INS__INST__API.html#ga7907ad8ebd991b9e24df3b3b9cec4cac">INS_InsertIfCall</a>.</p>
<p>Note that funptr <em>may</em> be called even if the predicate is false, the predicate is only defined to guard the execution of the following THEN function. (So if the function inserted here modifies the machine state it might affect the value of the predicate. Best practice is not to modify machine state here!)</p>
<p>On IA32 and Intel64, the sequences </p><div class="fragment"><div class="line"><a class="code" href="group__INS__INST__API.html#ga7907ad8ebd991b9e24df3b3b9cec4cac">INS_InsertIfCall</a>(...);</div><div class="line"><a class="code" href="group__INS__INST__API.html#ga88f930cbed33fa370c9611cc0183d97b">INS_InsertThenPredicatedCall</a>(...);</div></div><!-- fragment --> <div class="fragment"><div class="line"><a class="code" href="group__INS__INST__API.html#ga5009833ffeecd9fecd8f842a605bf2a1">INS_InsertIfPredicatedCall</a>(...);</div><div class="line"><a class="code" href="group__INS__INST__API.html#ga952b2b061d3fa8f1cc4d5d59fef53a69">INS_InsertThenCall</a>(...);</div></div><!-- fragment --><p> and </p><div class="fragment"><div class="line"><a class="code" href="group__INS__INST__API.html#ga5009833ffeecd9fecd8f842a605bf2a1">INS_InsertIfPredicatedCall</a>(...);</div><div class="line"><a class="code" href="group__INS__INST__API.html#ga88f930cbed33fa370c9611cc0183d97b">INS_InsertThenPredicatedCall</a>(...);</div></div><!-- fragment --><p>produce identical results. They all generate code which can be represented like this </p><div class="fragment"><div class="line"><span class="keywordflow">if</span> (UsersIfFunction(...))</div><div class="line"> <span class="keywordflow">if</span> (predicate)</div><div class="line"> UsersThenFunction(...);</div></div><!-- fragment --><p> However on other architectures the behavior may be different, and the "IF" call need not always be called.</p>
<p>This means that on IA32 and Intel64 the user's IF code is always called, however on these architectures that is very likely to generate faster code, since predicated instructions are rare. The dynamically most important predicated instructions are almost certainly REP MOVS, which have a very low (~80ppm) probablity of being predicated false. Unless the user's IF code is very large, or has a lower probability of filtering the execution, it is always better to use the test of the user condition to prevent execution of the predicate test. Of course, the code included in a user IF call is expected to be small, since the objective of INS_InsertIfCall, INS_InsertThenCall is to allow the code in the IF to be inlined.</p>
<p>If you need to know the instruction predicate inside the IF call, you should pass IARG_EXECUTING as an argument and test it.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">ins</td><td>Instruction to instrument </td></tr>
<tr><td class="paramname">action</td><td>Specifies before, after, etc. <br />
<a class="el" href="group__INST__ARGS.html#gga707ea08e31f44f4a81e2a7766123bad7a7c7cbebb7a62a40e9f803b1db2e6ce20">IPOINT_BEFORE</a> is always valid for all instructions. <br />
<a class="el" href="group__INST__ARGS.html#gga707ea08e31f44f4a81e2a7766123bad7a42eff26179c6d87348abe492301c12ec">IPOINT_AFTER</a> is valid only when a fall-through exists (i.e. Calls and unconditional branches will fail). It is only allowed when INS_IsValidForIpointAfter(ins) is true. <br />
<a class="el" href="group__INST__ARGS.html#gga707ea08e31f44f4a81e2a7766123bad7a5ef5b45901a8447e5173f50746ab029d">IPOINT_TAKEN_BRANCH</a> is invalid for non-branches. It is only allowed when INS_IsValidForIpointTakenBranch is true. </td></tr>
<tr><td class="paramname">funptr</td><td>Insert a call to funptr. Its return type must be ADDRINT </td></tr>
<tr><td class="paramname">...</td><td>List of arguments to pass funptr. See <a class="el" href="group__INST__ARGS.html#ga089c27ca15e9ff139dd3a3f8a6f8451d">IARG_TYPE</a>, terminated with IARG_END</td></tr>
</table>
</dd>
</dl>
<p>If more than one call is inserted for the same instruction, the order is determined by <a class="el" href="group__INST__ARGS.html#gga089c27ca15e9ff139dd3a3f8a6f8451da45b6bfd69845ada4a0875967995ad7c6">IARG_CALL_ORDER</a>. For more information, see <a class="el" href="group__INST__ARGS.html#ga3d1d5f6805cb16d00bce441290ca2212">CALL_ORDER</a>. Note that if <a class="el" href="group__INST__ARGS.html#ga3d1d5f6805cb16d00bce441290ca2212">CALL_ORDER</a> is used, Both "if" and "then" analysis calls must have the same order.</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga26d02bff719bf8600421895956804252"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga26d02bff719bf8600421895956804252">&#9670;&nbsp;</a></span>INS_InsertPredicatedCall()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::INS_InsertPredicatedCall </td>
<td>(</td>
<td class="paramtype">INS&#160;</td>
<td class="paramname"><em>ins</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a>&#160;</td>
<td class="paramname"><em>ipoint</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">AFUNPTR&#160;</td>
<td class="paramname"><em>funptr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname"><em>...</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>See <a class="el" href="group__INS__INST__API.html#ga74a956a0acde197043d04f4adcde4626">INS_InsertCall</a>. When the instruction has a predicate and the predicate is false, the analysis function is not called.</p>
<p>On the IA-32 and Intel 64 architectures the only instructions treated as predicated are CMOVcc, FCMOVcc and REPped string ops. For the conditional moves, the predicate is based on the condition codes tested by the instruction. For the REPped string ops the predicate is that the execution count is not zero. For all other instructions the predicate is always true, so INS_InsertPredicatedCall is identical to <a class="el" href="group__INS__INST__API.html#ga74a956a0acde197043d04f4adcde4626">INS_InsertCall</a>.</p>
<p>If you want to test both your own condition, and the predicate, you can use <a class="el" href="group__INS__INST__API.html#ga88f930cbed33fa370c9611cc0183d97b">INS_InsertThenPredicatedCall</a>, or use <a class="el" href="group__INST__ARGS.html#gga089c27ca15e9ff139dd3a3f8a6f8451da5f291cb55a7d61a40fa3ab98e191394e">IARG_EXECUTING</a> to pass the predicate value to an <a class="el" href="group__INS__INST__API.html#ga7907ad8ebd991b9e24df3b3b9cec4cac">INS_InsertIfCall</a>.</p>
<p>If more than one call is inserted for the same instruction, the order is determined by <a class="el" href="group__INST__ARGS.html#gga089c27ca15e9ff139dd3a3f8a6f8451da45b6bfd69845ada4a0875967995ad7c6">IARG_CALL_ORDER</a>. For more information, see <a class="el" href="group__INST__ARGS.html#ga3d1d5f6805cb16d00bce441290ca2212">CALL_ORDER</a>.</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga952b2b061d3fa8f1cc4d5d59fef53a69"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga952b2b061d3fa8f1cc4d5d59fef53a69">&#9670;&nbsp;</a></span>INS_InsertThenCall()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::INS_InsertThenCall </td>
<td>(</td>
<td class="paramtype">INS&#160;</td>
<td class="paramname"><em>ins</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a>&#160;</td>
<td class="paramname"><em>action</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">AFUNPTR&#160;</td>
<td class="paramname"><em>funptr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname"><em>...</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Insert a call to funptr relative to an INS. The function is called only if the immediately preceding "if" analysis call returns a non-zero value.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">ins</td><td>Instruction to instrument </td></tr>
<tr><td class="paramname">action</td><td>Specifies before, after, etc. <br />
IPOINT_BEFORE is always valid for all instructions. <br />
IPOINT_AFTER is valid only when a fall-through exists (i.e. Calls and unconditional branches will fail). It is only allowed when INS_IsValidForIpointAfter(ins) is true. <br />
IPOINT_TAKEN_BRANCH is invalid for non-branches. It is only allowed when INS_IsValidForIpointTakenBranch is true. <br />
IPOINT_ANYWHERE is not supported and will result an error. <br />
action value must be identical to the value passed to the corresponding <a class="el" href="group__INS__INST__API.html#ga7907ad8ebd991b9e24df3b3b9cec4cac">INS_InsertIfCall</a>. </td></tr>
<tr><td class="paramname">funptr</td><td>Insert a call to funptr </td></tr>
<tr><td class="paramname">...</td><td>List of arguments to pass funptr. See <a class="el" href="group__INST__ARGS.html#ga089c27ca15e9ff139dd3a3f8a6f8451d">IARG_TYPE</a>, terminated with IARG_END</td></tr>
</table>
</dd>
</dl>
<p>If more than one call is inserted for the same instruction, the order is determined by <a class="el" href="group__INST__ARGS.html#gga089c27ca15e9ff139dd3a3f8a6f8451da45b6bfd69845ada4a0875967995ad7c6">IARG_CALL_ORDER</a>. For more information, see <a class="el" href="group__INST__ARGS.html#ga3d1d5f6805cb16d00bce441290ca2212">CALL_ORDER</a>. Note that if <a class="el" href="group__INST__ARGS.html#ga3d1d5f6805cb16d00bce441290ca2212">CALL_ORDER</a> is used, Both "if" and "then" analysis calls must have the same order.</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga88f930cbed33fa370c9611cc0183d97b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga88f930cbed33fa370c9611cc0183d97b">&#9670;&nbsp;</a></span>INS_InsertThenPredicatedCall()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::INS_InsertThenPredicatedCall </td>
<td>(</td>
<td class="paramtype">INS&#160;</td>
<td class="paramname"><em>ins</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__INST__ARGS.html#ga707ea08e31f44f4a81e2a7766123bad7">IPOINT</a>&#160;</td>
<td class="paramname"><em>action</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">AFUNPTR&#160;</td>
<td class="paramname"><em>funptr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname"><em>...</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Insert a call to funptr relative to an INS. The function is called only if the immediately preceding "if" analysis call returns a non-zero value and the instruction's predicate is true. See <a class="el" href="group__INS__INST__API.html#ga5009833ffeecd9fecd8f842a605bf2a1">INS_InsertIfPredicatedCall</a> for details of the semantics of mixing <a class="el" href="group__INS__INST__API.html#ga88f930cbed33fa370c9611cc0183d97b">INS_InsertThenPredicatedCall</a> with <a class="el" href="group__INS__INST__API.html#ga7907ad8ebd991b9e24df3b3b9cec4cac">INS_InsertIfCall</a> (and all the other possibilities).</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">ins</td><td>Instruction to instrument </td></tr>
<tr><td class="paramname">action</td><td>Specifies before, after, etc. <br />
IPOINT_BEFORE is always valid for all instructions. <br />
IPOINT_AFTER is valid only when a fall-through exists (i.e. Calls and unconditional branches will fail). It is only allowed when INS_IsValidForIpointAfter(ins) is true. <br />
<a class="el" href="group__INST__ARGS.html#gga707ea08e31f44f4a81e2a7766123bad7a5ef5b45901a8447e5173f50746ab029d">IPOINT_TAKEN_BRANCH</a> is invalid for non-branches. It is only allowed when INS_IsValidForIpointTakenBranch is true. </td></tr>
<tr><td class="paramname">funptr</td><td>Insert a call to funptr </td></tr>
<tr><td class="paramname">...</td><td>List of arguments to pass funptr. See <a class="el" href="group__INST__ARGS.html#ga089c27ca15e9ff139dd3a3f8a6f8451d">IARG_TYPE</a>, terminated with IARG_END</td></tr>
</table>
</dd>
</dl>
<p>If more than one call is inserted for the same instruction, the order is determined by <a class="el" href="group__INST__ARGS.html#gga089c27ca15e9ff139dd3a3f8a6f8451da45b6bfd69845ada4a0875967995ad7c6">IARG_CALL_ORDER</a>. For more information, see <a class="el" href="group__INST__ARGS.html#ga3d1d5f6805cb16d00bce441290ca2212">CALL_ORDER</a>. Note that if <a class="el" href="group__INST__ARGS.html#ga3d1d5f6805cb16d00bce441290ca2212">CALL_ORDER</a> is used, Both "if" and "then" analysis calls must have the same order.</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>