The-libitm-ABI.html 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  2. <html>
  3. <!-- Copyright (C) 2011-2017 Free Software Foundation, Inc.
  4. Permission is granted to copy, distribute and/or modify this document
  5. under the terms of the GNU Free Documentation License, Version 1.2 or
  6. any later version published by the Free Software Foundation; with no
  7. Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
  8. A copy of the license is included in the section entitled "GNU
  9. Free Documentation License". -->
  10. <!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
  11. <head>
  12. <title>GNU libitm: The libitm ABI</title>
  13. <meta name="description" content="GNU libitm: The libitm ABI">
  14. <meta name="keywords" content="GNU libitm: The libitm ABI">
  15. <meta name="resource-type" content="document">
  16. <meta name="distribution" content="global">
  17. <meta name="Generator" content="makeinfo">
  18. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  19. <link href="index.html#Top" rel="start" title="Top">
  20. <link href="Library-Index.html#Library-Index" rel="index" title="Library Index">
  21. <link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
  22. <link href="index.html#Top" rel="up" title="Top">
  23. <link href="Internals.html#Internals" rel="next" title="Internals">
  24. <link href="C_002fC_002b_002b-Language-Constructs-for-TM.html#C_002fC_002b_002b-Language-Constructs-for-TM" rel="prev" title="C/C++ Language Constructs for TM">
  25. <style type="text/css">
  26. <!--
  27. a.summary-letter {text-decoration: none}
  28. blockquote.smallquotation {font-size: smaller}
  29. div.display {margin-left: 3.2em}
  30. div.example {margin-left: 3.2em}
  31. div.indentedblock {margin-left: 3.2em}
  32. div.lisp {margin-left: 3.2em}
  33. div.smalldisplay {margin-left: 3.2em}
  34. div.smallexample {margin-left: 3.2em}
  35. div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
  36. div.smalllisp {margin-left: 3.2em}
  37. kbd {font-style:oblique}
  38. pre.display {font-family: inherit}
  39. pre.format {font-family: inherit}
  40. pre.menu-comment {font-family: serif}
  41. pre.menu-preformatted {font-family: serif}
  42. pre.smalldisplay {font-family: inherit; font-size: smaller}
  43. pre.smallexample {font-size: smaller}
  44. pre.smallformat {font-family: inherit; font-size: smaller}
  45. pre.smalllisp {font-size: smaller}
  46. span.nocodebreak {white-space:nowrap}
  47. span.nolinebreak {white-space:nowrap}
  48. span.roman {font-family:serif; font-weight:normal}
  49. span.sansserif {font-family:sans-serif; font-weight:normal}
  50. ul.no-bullet {list-style: none}
  51. -->
  52. </style>
  53. </head>
  54. <body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
  55. <a name="The-libitm-ABI"></a>
  56. <div class="header">
  57. <p>
  58. Next: <a href="Internals.html#Internals" accesskey="n" rel="next">Internals</a>, Previous: <a href="C_002fC_002b_002b-Language-Constructs-for-TM.html#C_002fC_002b_002b-Language-Constructs-for-TM" accesskey="p" rel="prev">C/C++ Language Constructs for TM</a>, Up: <a href="index.html#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Library-Index.html#Library-Index" title="Index" rel="index">Index</a>]</p>
  59. </div>
  60. <hr>
  61. <a name="The-libitm-ABI-1"></a>
  62. <h2 class="chapter">3 The libitm ABI</h2>
  63. <p>The ABI provided by libitm is basically equal to the Linux variant of Intel&rsquo;s
  64. current TM ABI specification document (Revision 1.1, May 6 2009) but with the
  65. differences listed in this chapter. It would be good if these changes would
  66. eventually be merged into a future version of this specification. To ease
  67. look-up, the following subsections mirror the structure of this specification.
  68. </p>
  69. <a name="g_t_005bNo-changes_005d-Objectives"></a>
  70. <h3 class="section">3.1 [No changes] Objectives</h3>
  71. <a name="g_t_005bNo-changes_005d-Non_002dobjectives"></a>
  72. <h3 class="section">3.2 [No changes] Non-objectives</h3>
  73. <a name="Library-design-principles"></a>
  74. <h3 class="section">3.3 Library design principles</h3>
  75. <a name="g_t_005bNo-changes_005d-Calling-conventions"></a>
  76. <h4 class="subsection">3.3.1 [No changes] Calling conventions</h4>
  77. <a name="g_t_005bNo-changes_005d-TM-library-algorithms"></a>
  78. <h4 class="subsection">3.3.2 [No changes] TM library algorithms</h4>
  79. <a name="g_t_005bNo-changes_005d-Optimized-load-and-store-routines"></a>
  80. <h4 class="subsection">3.3.3 [No changes] Optimized load and store routines</h4>
  81. <a name="g_t_005bNo-changes_005d-Aligned-load-and-store-routines"></a>
  82. <h4 class="subsection">3.3.4 [No changes] Aligned load and store routines</h4>
  83. <a name="Data-logging-functions"></a>
  84. <h4 class="subsection">3.3.5 Data logging functions</h4>
  85. <p>The memory locations accessed with transactional loads and stores and the
  86. memory locations whose values are logged must not overlap. This required
  87. separation only extends to the scope of the execution of one transaction
  88. including all the executions of all nested transactions.
  89. </p>
  90. <p>The compiler must be consistent (within the scope of a single transaction)
  91. about which memory locations are shared and which are not shared with other
  92. threads (i.e., data must be accessed either transactionally or
  93. nontransactionally). Otherwise, non-write-through TM algorithms would not work.
  94. </p>
  95. <p>For memory locations on the stack, this requirement extends to only the
  96. lifetime of the stack frame that the memory location belongs to (or the
  97. lifetime of the transaction, whichever is shorter). Thus, memory that is
  98. reused for several stack frames could be target of both data logging and
  99. transactional accesses; however, this is harmless because these stack frames&rsquo;
  100. lifetimes will end before the transaction finishes.
  101. </p>
  102. <a name="g_t_005bNo-changes_005d-Scatter_002fgather-calls"></a>
  103. <h4 class="subsection">3.3.6 [No changes] Scatter/gather calls</h4>
  104. <a name="g_t_005bNo-changes_005d-Serial-and-irrevocable-mode"></a>
  105. <h4 class="subsection">3.3.7 [No changes] Serial and irrevocable mode</h4>
  106. <a name="g_t_005bNo-changes_005d-Transaction-descriptor"></a>
  107. <h4 class="subsection">3.3.8 [No changes] Transaction descriptor</h4>
  108. <a name="Store-allocation"></a>
  109. <h4 class="subsection">3.3.9 Store allocation</h4>
  110. <p>There is no <code>getTransaction</code> function.
  111. </p>
  112. <a name="g_t_005bNo-changes_005d-Naming-conventions"></a>
  113. <h4 class="subsection">3.3.10 [No changes] Naming conventions</h4>
  114. <a name="Function-pointer-encryption"></a>
  115. <h4 class="subsection">3.3.11 Function pointer encryption</h4>
  116. <p>Currently, this is not implemented.
  117. </p>
  118. <a name="Types-and-macros-list"></a>
  119. <h3 class="section">3.4 Types and macros list</h3>
  120. <p><code>_ITM_codeProperties</code> has changed, see <a href="#txn_002dcode_002dproperties">Starting a
  121. transaction</a>.
  122. <code>_ITM_srcLocation</code> is not used.
  123. </p>
  124. <a name="Function-list"></a>
  125. <h3 class="section">3.5 Function list</h3>
  126. <a name="Initialization-and-finalization-functions"></a>
  127. <h4 class="subsection">3.5.1 Initialization and finalization functions</h4>
  128. <p>These functions are not part of the ABI.
  129. </p>
  130. <a name="g_t_005bNo-changes_005d-Version-checking"></a>
  131. <h4 class="subsection">3.5.2 [No changes] Version checking</h4>
  132. <a name="g_t_005bNo-changes_005d-Error-reporting"></a>
  133. <h4 class="subsection">3.5.3 [No changes] Error reporting</h4>
  134. <a name="g_t_005bNo-changes_005d-inTransaction-call"></a>
  135. <h4 class="subsection">3.5.4 [No changes] inTransaction call</h4>
  136. <a name="State-manipulation-functions"></a>
  137. <h4 class="subsection">3.5.5 State manipulation functions</h4>
  138. <p>There is no <code>getTransaction</code> function. Transaction identifiers for
  139. nested transactions will be ordered but not necessarily sequential (i.e., for
  140. a nested transaction&rsquo;s identifier <var>IN</var> and its enclosing transaction&rsquo;s
  141. identifier <var>IE</var>, it is guaranteed that <em>IN &gt;= IE</em>).
  142. </p>
  143. <a name="g_t_005bNo-changes_005d-Source-locations"></a>
  144. <h4 class="subsection">3.5.6 [No changes] Source locations</h4>
  145. <a name="Starting-a-transaction"></a>
  146. <h4 class="subsection">3.5.7 Starting a transaction</h4>
  147. <a name="Transaction-code-properties"></a>
  148. <h4 class="subsubsection">3.5.7.1 Transaction code properties</h4>
  149. <a name="txn_002dcode_002dproperties"></a><p>The bit <code>hasNoXMMUpdate</code> is instead called <code>hasNoVectorUpdate</code>.
  150. Iff it is set, vector register save/restore is not necessary for any target
  151. machine.
  152. </p>
  153. <p>The <code>hasNoFloatUpdate</code> bit (<code>0x0010</code>) is new. Iff it is set, floating
  154. point register save/restore is not necessary for any target machine.
  155. </p>
  156. <p><code>undoLogCode</code> is not supported and a fatal runtime error will be raised
  157. if this bit is set. It is not properly defined in the ABI why barriers
  158. other than undo logging are not present; Are they not necessary (e.g., a
  159. transaction operating purely on thread-local data) or have they been omitted by
  160. the compiler because it thinks that some kind of global synchronization
  161. (e.g., serial mode) might perform better? The specification suggests that the
  162. latter might be the case, but the former seems to be more useful.
  163. </p>
  164. <p>The <code>readOnly</code> bit (<code>0x4000</code>) is new. <strong>TODO</strong> Lexical or dynamic
  165. scope?
  166. </p>
  167. <p><code>hasNoRetry</code> is not supported. If this bit is not set, but
  168. <code>hasNoAbort</code> is set, the library can assume that transaction
  169. rollback will not be requested.
  170. </p>
  171. <p>It would be useful if the absence of externally-triggered rollbacks would be
  172. reported for the dynamic scope as well, not just for the lexical scope
  173. (<code>hasNoAbort</code>). Without this, a library cannot exploit this together
  174. with flat nesting.
  175. </p>
  176. <p><code>exceptionBlock</code> is not supported because exception blocks are not used.
  177. </p>
  178. <a name="g_t_005bNo-changes_005d-Windows-exception-state"></a>
  179. <h4 class="subsubsection">3.5.7.2 [No changes] Windows exception state</h4>
  180. <a name="g_t_005bNo-changes_005d-Other-machine-state"></a>
  181. <h4 class="subsubsection">3.5.7.3 [No changes] Other machine state</h4>
  182. <a name="g_t_005bNo-changes_005d-Results-from-beginTransaction"></a>
  183. <h4 class="subsubsection">3.5.7.4 [No changes] Results from beginTransaction</h4>
  184. <a name="Aborting-a-transaction"></a>
  185. <h4 class="subsection">3.5.8 Aborting a transaction</h4>
  186. <p><code>_ITM_rollbackTransaction</code> is not supported. <code>_ITM_abortTransaction</code>
  187. is supported but the abort reasons <code>exceptionBlockAbort</code>,
  188. <code>TMConflict</code>, and <code>userRetry</code> are not supported. There are no
  189. exception blocks in general, so the related cases also do not have to be
  190. considered. To encode <code>__transaction_cancel [[outer]]</code>, compilers must
  191. set the new <code>outerAbort</code> bit (<code>0x10</code>) additionally to the
  192. <code>userAbort</code> bit in the abort reason.
  193. </p>
  194. <a name="Committing-a-transaction"></a>
  195. <h4 class="subsection">3.5.9 Committing a transaction</h4>
  196. <p>The exception handling (EH) scheme is different. The Intel ABI requires the
  197. <code>_ITM_tryCommitTransaction</code> function that will return even when the
  198. commit failed and will have to be matched with calls to either
  199. <code>_ITM_abortTransaction</code> or <code>_ITM_commitTransaction</code>. In contrast,
  200. gcc relies on transactional wrappers for the functions of the Exception
  201. Handling ABI and on one additional commit function (shown below). This allows
  202. the TM to keep track of EH internally and thus it does not have to embed the
  203. cleanup of EH state into the existing EH code in the program.
  204. <code>_ITM_tryCommitTransaction</code> is not supported.
  205. <code>_ITM_commitTransactionToId</code> is also not supported because the
  206. propagation of thrown exceptions will not bypass commits of nested
  207. transactions.
  208. </p>
  209. <div class="example">
  210. <pre class="example">void _ITM_commitTransactionEH(void *exc_ptr) ITM_REGPARM;
  211. void *_ITM_cxa_allocate_exception (size_t);
  212. void _ITM_cxa_free_exception (void *exc_ptr);
  213. void _ITM_cxa_throw (void *obj, void *tinfo, void *dest);
  214. void *_ITM_cxa_begin_catch (void *exc_ptr);
  215. void _ITM_cxa_end_catch (void);
  216. </pre></div>
  217. <p>The EH scheme changed in version 6 of GCC. Previously, the compiler
  218. added a call to <code>_ITM_commitTransactionEH</code> to commit a transaction if
  219. an exception could be in flight at this position in the code; <code>exc_ptr</code> is
  220. the address of the current exception and must be non-zero. Now, the
  221. compiler must catch all exceptions that are about to be thrown out of a
  222. transaction and call <code>_ITM_commitTransactionEH</code> from the catch clause,
  223. with <code>exc_ptr</code> being zero.
  224. </p>
  225. <p>Note that the old EH scheme never worked completely in GCC&rsquo;s implementation;
  226. libitm currently does not try to be compatible with the old scheme.
  227. </p>
  228. <p>The <code>_ITM_cxa...</code> functions are transactional wrappers for the respective
  229. <code>__cxa...</code> functions and must be called instead of these in transactional
  230. code. <code>_ITM_cxa_free_exception</code> is new in GCC 6.
  231. </p>
  232. <p>To support this EH scheme, libstdc++ needs to provide one additional function
  233. (<code>_cxa_tm_cleanup</code>), which is used by the TM to clean up the exception
  234. handling state while rolling back a transaction:
  235. </p>
  236. <div class="example">
  237. <pre class="example">void __cxa_tm_cleanup (void *unthrown_obj, void *cleanup_exc,
  238. unsigned int caught_count);
  239. </pre></div>
  240. <p>Since GCC 6, <code>unthrown_obj</code> is not used anymore and always null;
  241. prior to that, <code>unthrown_obj</code> is non-null if the program called
  242. <code>__cxa_allocate_exception</code> for this exception but did not yet called
  243. <code>__cxa_throw</code> for it. <code>cleanup_exc</code> is non-null if the program is
  244. currently processing a cleanup along an exception path but has not caught this
  245. exception yet. <code>caught_count</code> is the nesting depth of
  246. <code>__cxa_begin_catch</code> within the transaction (which can be counted by the TM
  247. using <code>_ITM_cxa_begin_catch</code> and <code>_ITM_cxa_end_catch</code>);
  248. <code>__cxa_tm_cleanup</code> then performs rollback by essentially performing
  249. <code>__cxa_end_catch</code> that many times.
  250. </p>
  251. <a name="Exception-handling-support"></a>
  252. <h4 class="subsection">3.5.10 Exception handling support</h4>
  253. <p>Currently, there is no support for functionality like
  254. <code>__transaction_cancel throw</code> as described in the C++ TM specification.
  255. Supporting this should be possible with the EH scheme explained previously
  256. because via the transactional wrappers for the EH ABI, the TM is able to
  257. observe and intercept EH.
  258. </p>
  259. <a name="g_t_005bNo-changes_005d-Transition-to-serial_002d_002dirrevocable-mode"></a>
  260. <h4 class="subsection">3.5.11 [No changes] Transition to serial&ndash;irrevocable mode</h4>
  261. <a name="g_t_005bNo-changes_005d-Data-transfer-functions"></a>
  262. <h4 class="subsection">3.5.12 [No changes] Data transfer functions</h4>
  263. <a name="g_t_005bNo-changes_005d-Transactional-memory-copies"></a>
  264. <h4 class="subsection">3.5.13 [No changes] Transactional memory copies</h4>
  265. <a name="Transactional-versions-of-memmove"></a>
  266. <h4 class="subsection">3.5.14 Transactional versions of memmove</h4>
  267. <p>If either the source or destination memory region is to be accessed
  268. nontransactionally, then source and destination regions must not be
  269. overlapping. The respective <code>_ITM_memmove</code> functions are still
  270. available but a fatal runtime error will be raised if such regions do overlap.
  271. To support this functionality, the ABI would have to specify how the
  272. intersection of the regions has to be accessed (i.e., transactionally or
  273. nontransactionally).
  274. </p>
  275. <a name="g_t_005bNo-changes_005d-Transactional-versions-of-memset"></a>
  276. <h4 class="subsection">3.5.15 [No changes] Transactional versions of memset</h4>
  277. <a name="g_t_005bNo-changes_005d-Logging-functions"></a>
  278. <h4 class="subsection">3.5.16 [No changes] Logging functions</h4>
  279. <a name="User_002dregistered-commit-and-undo-actions"></a>
  280. <h4 class="subsection">3.5.17 User-registered commit and undo actions</h4>
  281. <p>Commit actions will get executed in the same order in which the respective
  282. calls to <code>_ITM_addUserCommitAction</code> happened. Only
  283. <code>_ITM_noTransactionId</code> is allowed as value for the
  284. <code>resumingTransactionId</code> argument. Commit actions get executed after
  285. privatization safety has been ensured.
  286. </p>
  287. <p>Undo actions will get executed in reverse order compared to the order in which
  288. the respective calls to <code>_ITM_addUserUndoAction</code> happened. The ordering of
  289. undo actions w.r.t. the roll-back of other actions (e.g., data transfers or
  290. memory allocations) is undefined.
  291. </p>
  292. <p><code>_ITM_getThreadnum</code> is not supported currently because its only purpose
  293. is to provide a thread ID that matches some assumed performance tuning output,
  294. but this output is not part of the ABI nor further defined by it.
  295. </p>
  296. <p><code>_ITM_dropReferences</code> is not supported currently because its semantics and
  297. the intention behind it is not entirely clear. The
  298. specification suggests that this function is necessary because of certain
  299. orderings of data transfer undos and the releasing of memory regions (i.e.,
  300. privatization). However, this ordering is never defined, nor is the ordering of
  301. dropping references w.r.t. other events.
  302. </p>
  303. <a name="g_t_005bNew_005d-Transactional-indirect-calls"></a>
  304. <h4 class="subsection">3.5.18 [New] Transactional indirect calls</h4>
  305. <p>Indirect calls (i.e., calls through a function pointer) within transactions
  306. should execute the transactional clone of the original function (i.e., a clone
  307. of the original that has been fully instrumented to use the TM runtime), if
  308. such a clone is available. The runtime provides two functions to
  309. register/deregister clone tables:
  310. </p>
  311. <div class="example">
  312. <pre class="example">struct clone_entry
  313. {
  314. void *orig, *clone;
  315. };
  316. void _ITM_registerTMCloneTable (clone_entry *table, size_t entries);
  317. void _ITM_deregisterTMCloneTable (clone_entry *table);
  318. </pre></div>
  319. <p>Registered tables must be writable by the TM runtime, and must be live
  320. throughout the life-time of the TM runtime.
  321. </p>
  322. <p><strong>TODO</strong> The intention was always to drop the registration functions
  323. entirely, and create a new ELF Phdr describing the linker-sorted table. Much
  324. like what currently happens for <code>PT_GNU_EH_FRAME</code>.
  325. This work kept getting bogged down in how to represent the <var>N</var> different
  326. code generation variants. We clearly needed at least two&mdash;SW and HW
  327. transactional clones&mdash;but there was always a suggestion of more variants for
  328. different TM assumptions/invariants.
  329. </p>
  330. <p>The compiler can then use two TM runtime functions to perform indirect calls in
  331. transactions:
  332. </p><div class="example">
  333. <pre class="example">void *_ITM_getTMCloneOrIrrevocable (void *function) ITM_REGPARM;
  334. void *_ITM_getTMCloneSafe (void *function) ITM_REGPARM;
  335. </pre></div>
  336. <p>If there is a registered clone for supplied function, both will return a
  337. pointer to the clone. If not, the first runtime function will attempt to switch
  338. to serial&ndash;irrevocable mode and return the original pointer, whereas the second
  339. will raise a fatal runtime error.
  340. </p>
  341. <a name="g_t_005bNew_005d-Transactional-dynamic-memory-management"></a>
  342. <h4 class="subsection">3.5.19 [New] Transactional dynamic memory management</h4>
  343. <div class="example">
  344. <pre class="example">void *_ITM_malloc (size_t)
  345. __attribute__((__malloc__)) ITM_PURE;
  346. void *_ITM_calloc (size_t, size_t)
  347. __attribute__((__malloc__)) ITM_PURE;
  348. void _ITM_free (void *) ITM_PURE;
  349. </pre></div>
  350. <p>These functions are essentially transactional wrappers for <code>malloc</code>,
  351. <code>calloc</code>, and <code>free</code>. Within transactions, the compiler should
  352. replace calls to the original functions with calls to the wrapper functions.
  353. </p>
  354. <p>libitm also provides transactional clones of C++ memory management functions
  355. such as global operator new and delete. They are part of libitm for historic
  356. reasons but do not need to be part of this ABI.
  357. </p>
  358. <a name="g_t_005bNo-changes_005d-Future-Enhancements-to-the-ABI"></a>
  359. <h3 class="section">3.6 [No changes] Future Enhancements to the ABI</h3>
  360. <a name="Sample-code"></a>
  361. <h3 class="section">3.7 Sample code</h3>
  362. <p>The code examples might not be correct w.r.t. the current version of the ABI,
  363. especially everything related to exception handling.
  364. </p>
  365. <a name="g_t_005bNew_005d-Memory-model"></a>
  366. <h3 class="section">3.8 [New] Memory model</h3>
  367. <p>The ABI should define a memory model and the ordering that is guaranteed for
  368. data transfers and commit/undo actions, or at least refer to another memory
  369. model that needs to be preserved. Without that, the compiler cannot ensure the
  370. memory model specified on the level of the programming language (e.g., by the
  371. C++ TM specification).
  372. </p>
  373. <p>For example, if a transactional load is ordered before another load/store, then
  374. the TM runtime must also ensure this ordering when accessing shared state. If
  375. not, this might break the kind of publication safety used in the C++ TM
  376. specification. Likewise, the TM runtime must ensure privatization safety.
  377. </p>
  378. <hr>
  379. <div class="header">
  380. <p>
  381. Next: <a href="Internals.html#Internals" accesskey="n" rel="next">Internals</a>, Previous: <a href="C_002fC_002b_002b-Language-Constructs-for-TM.html#C_002fC_002b_002b-Language-Constructs-for-TM" accesskey="p" rel="prev">C/C++ Language Constructs for TM</a>, Up: <a href="index.html#Top" accesskey="u" rel="up">Top</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Library-Index.html#Library-Index" title="Index" rel="index">Index</a>]</p>
  382. </div>
  383. </body>
  384. </html>