| <html lang="en"> |
| <head> |
| <title>CFI directives - Using as</title> |
| <meta http-equiv="Content-Type" content="text/html"> |
| <meta name="description" content="Using as"> |
| <meta name="generator" content="makeinfo 4.13"> |
| <link title="Top" rel="start" href="index.html#Top"> |
| <link rel="up" href="Pseudo-Ops.html#Pseudo-Ops" title="Pseudo Ops"> |
| <link rel="prev" href="Byte.html#Byte" title="Byte"> |
| <link rel="next" href="Comm.html#Comm" title="Comm"> |
| <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> |
| <!-- |
| This file documents the GNU Assembler "as". |
| |
| Copyright (C) 1991-2019 Free Software Foundation, Inc. |
| |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.3 |
| or any later version published by the Free Software Foundation; |
| with no Invariant Sections, with no Front-Cover Texts, and with no |
| Back-Cover Texts. A copy of the license is included in the |
| section entitled ``GNU Free Documentation License''. |
| |
| --> |
| <meta http-equiv="Content-Style-Type" content="text/css"> |
| <style type="text/css"><!-- |
| pre.display { font-family:inherit } |
| pre.format { font-family:inherit } |
| pre.smalldisplay { font-family:inherit; font-size:smaller } |
| pre.smallformat { font-family:inherit; font-size:smaller } |
| pre.smallexample { font-size:smaller } |
| pre.smalllisp { font-size:smaller } |
| span.sc { font-variant:small-caps } |
| span.roman { font-family:serif; font-weight:normal; } |
| span.sansserif { font-family:sans-serif; font-weight:normal; } |
| --></style> |
| </head> |
| <body> |
| <div class="node"> |
| <a name="CFI-directives"></a> |
| <p> |
| Next: <a rel="next" accesskey="n" href="Comm.html#Comm">Comm</a>, |
| Previous: <a rel="previous" accesskey="p" href="Byte.html#Byte">Byte</a>, |
| Up: <a rel="up" accesskey="u" href="Pseudo-Ops.html#Pseudo-Ops">Pseudo Ops</a> |
| <hr> |
| </div> |
| |
| <h3 class="section">7.10 CFI directives</h3> |
| |
| <h4 class="subsection">7.10.1 <code>.cfi_sections </code><var>section_list</var></h4> |
| |
| <p><a name="index-g_t_0040code_007bcfi_005fsections_007d-directive-301"></a><code>.cfi_sections</code> may be used to specify whether CFI directives |
| should emit <code>.eh_frame</code> section and/or <code>.debug_frame</code> section. |
| If <var>section_list</var> is <code>.eh_frame</code>, <code>.eh_frame</code> is emitted, |
| if <var>section_list</var> is <code>.debug_frame</code>, <code>.debug_frame</code> is emitted. |
| To emit both use <code>.eh_frame, .debug_frame</code>. The default if this |
| directive is not used is <code>.cfi_sections .eh_frame</code>. |
| |
| <p>On targets that support compact unwinding tables these can be generated |
| by specifying <code>.eh_frame_entry</code> instead of <code>.eh_frame</code>. |
| |
| <p>Some targets may support an additional name, such as <code>.c6xabi.exidx</code> |
| which is used by the target. |
| |
| <p>The <code>.cfi_sections</code> directive can be repeated, with the same or different |
| arguments, provided that CFI generation has not yet started. Once CFI |
| generation has started however the section list is fixed and any attempts to |
| redefine it will result in an error. |
| |
| <h4 class="subsection">7.10.2 <code>.cfi_startproc [simple]</code></h4> |
| |
| <p><a name="index-g_t_0040code_007bcfi_005fstartproc_007d-directive-302"></a><code>.cfi_startproc</code> is used at the beginning of each function that |
| should have an entry in <code>.eh_frame</code>. It initializes some internal |
| data structures. Don't forget to close the function by |
| <code>.cfi_endproc</code>. |
| |
| <p>Unless <code>.cfi_startproc</code> is used along with parameter <code>simple</code> |
| it also emits some architecture dependent initial CFI instructions. |
| |
| <h4 class="subsection">7.10.3 <code>.cfi_endproc</code></h4> |
| |
| <p><a name="index-g_t_0040code_007bcfi_005fendproc_007d-directive-303"></a><code>.cfi_endproc</code> is used at the end of a function where it closes its |
| unwind entry previously opened by |
| <code>.cfi_startproc</code>, and emits it to <code>.eh_frame</code>. |
| |
| <h4 class="subsection">7.10.4 <code>.cfi_personality </code><var>encoding</var><code> [, </code><var>exp</var><code>]</code></h4> |
| |
| <p><a name="index-g_t_0040code_007bcfi_005fpersonality_007d-directive-304"></a><code>.cfi_personality</code> defines personality routine and its encoding. |
| <var>encoding</var> must be a constant determining how the personality |
| should be encoded. If it is 255 (<code>DW_EH_PE_omit</code>), second |
| argument is not present, otherwise second argument should be |
| a constant or a symbol name. When using indirect encodings, |
| the symbol provided should be the location where personality |
| can be loaded from, not the personality routine itself. |
| The default after <code>.cfi_startproc</code> is <code>.cfi_personality 0xff</code>, |
| no personality routine. |
| |
| <h4 class="subsection">7.10.5 <code>.cfi_personality_id </code><var>id</var></h4> |
| |
| <p><a name="index-g_t_0040code_007bcfi_005fpersonality_005fid_007d-directive-305"></a><code>cfi_personality_id</code> defines a personality routine by its index as |
| defined in a compact unwinding format. |
| Only valid when generating compact EH frames (i.e. |
| with <code>.cfi_sections eh_frame_entry</code>. |
| |
| <h4 class="subsection">7.10.6 <code>.cfi_fde_data [</code><var>opcode1</var><code> [, ...]]</code></h4> |
| |
| <p><a name="index-g_t_0040code_007bcfi_005ffde_005fdata_007d-directive-306"></a><code>cfi_fde_data</code> is used to describe the compact unwind opcodes to be |
| used for the current function. These are emitted inline in the |
| <code>.eh_frame_entry</code> section if small enough and there is no LSDA, or |
| in the <code>.gnu.extab</code> section otherwise. |
| Only valid when generating compact EH frames (i.e. |
| with <code>.cfi_sections eh_frame_entry</code>. |
| |
| <h4 class="subsection">7.10.7 <code>.cfi_lsda </code><var>encoding</var><code> [, </code><var>exp</var><code>]</code></h4> |
| |
| <p><code>.cfi_lsda</code> defines LSDA and its encoding. |
| <var>encoding</var> must be a constant determining how the LSDA |
| should be encoded. If it is 255 (<code>DW_EH_PE_omit</code>), the second |
| argument is not present, otherwise the second argument should be a constant |
| or a symbol name. The default after <code>.cfi_startproc</code> is <code>.cfi_lsda 0xff</code>, |
| meaning that no LSDA is present. |
| |
| <h4 class="subsection">7.10.8 <code>.cfi_inline_lsda</code> [<var>align</var>]</h4> |
| |
| <p><code>.cfi_inline_lsda</code> marks the start of a LSDA data section and |
| switches to the corresponding <code>.gnu.extab</code> section. |
| Must be preceded by a CFI block containing a <code>.cfi_lsda</code> directive. |
| Only valid when generating compact EH frames (i.e. |
| with <code>.cfi_sections eh_frame_entry</code>. |
| |
| <p>The table header and unwinding opcodes will be generated at this point, |
| so that they are immediately followed by the LSDA data. The symbol |
| referenced by the <code>.cfi_lsda</code> directive should still be defined |
| in case a fallback FDE based encoding is used. The LSDA data is terminated |
| by a section directive. |
| |
| <p>The optional <var>align</var> argument specifies the alignment required. |
| The alignment is specified as a power of two, as with the |
| <code>.p2align</code> directive. |
| |
| <h4 class="subsection">7.10.9 <code>.cfi_def_cfa </code><var>register</var><code>, </code><var>offset</var></h4> |
| |
| <p><code>.cfi_def_cfa</code> defines a rule for computing CFA as: <i>take |
| address from </i><var>register</var><i> and add </i><var>offset</var><i> to it</i>. |
| |
| <h4 class="subsection">7.10.10 <code>.cfi_def_cfa_register </code><var>register</var></h4> |
| |
| <p><code>.cfi_def_cfa_register</code> modifies a rule for computing CFA. From |
| now on <var>register</var> will be used instead of the old one. Offset |
| remains the same. |
| |
| <h4 class="subsection">7.10.11 <code>.cfi_def_cfa_offset </code><var>offset</var></h4> |
| |
| <p><code>.cfi_def_cfa_offset</code> modifies a rule for computing CFA. Register |
| remains the same, but <var>offset</var> is new. Note that it is the |
| absolute offset that will be added to a defined register to compute |
| CFA address. |
| |
| <h4 class="subsection">7.10.12 <code>.cfi_adjust_cfa_offset </code><var>offset</var></h4> |
| |
| <p>Same as <code>.cfi_def_cfa_offset</code> but <var>offset</var> is a relative |
| value that is added/subtracted from the previous offset. |
| |
| <h4 class="subsection">7.10.13 <code>.cfi_offset </code><var>register</var><code>, </code><var>offset</var></h4> |
| |
| <p>Previous value of <var>register</var> is saved at offset <var>offset</var> from |
| CFA. |
| |
| <h4 class="subsection">7.10.14 <code>.cfi_val_offset </code><var>register</var><code>, </code><var>offset</var></h4> |
| |
| <p>Previous value of <var>register</var> is CFA + <var>offset</var>. |
| |
| <h4 class="subsection">7.10.15 <code>.cfi_rel_offset </code><var>register</var><code>, </code><var>offset</var></h4> |
| |
| <p>Previous value of <var>register</var> is saved at offset <var>offset</var> from |
| the current CFA register. This is transformed to <code>.cfi_offset</code> |
| using the known displacement of the CFA register from the CFA. |
| This is often easier to use, because the number will match the |
| code it's annotating. |
| |
| <h4 class="subsection">7.10.16 <code>.cfi_register </code><var>register1</var><code>, </code><var>register2</var></h4> |
| |
| <p>Previous value of <var>register1</var> is saved in register <var>register2</var>. |
| |
| <h4 class="subsection">7.10.17 <code>.cfi_restore </code><var>register</var></h4> |
| |
| <p><code>.cfi_restore</code> says that the rule for <var>register</var> is now the |
| same as it was at the beginning of the function, after all initial |
| instruction added by <code>.cfi_startproc</code> were executed. |
| |
| <h4 class="subsection">7.10.18 <code>.cfi_undefined </code><var>register</var></h4> |
| |
| <p>From now on the previous value of <var>register</var> can't be restored anymore. |
| |
| <h4 class="subsection">7.10.19 <code>.cfi_same_value </code><var>register</var></h4> |
| |
| <p>Current value of <var>register</var> is the same like in the previous frame, |
| i.e. no restoration needed. |
| |
| <h4 class="subsection">7.10.20 <code>.cfi_remember_state</code> and <code>.cfi_restore_state</code></h4> |
| |
| <p><code>.cfi_remember_state</code> pushes the set of rules for every register onto an |
| implicit stack, while <code>.cfi_restore_state</code> pops them off the stack and |
| places them in the current row. This is useful for situations where you have |
| multiple <code>.cfi_*</code> directives that need to be undone due to the control |
| flow of the program. For example, we could have something like this (assuming |
| the CFA is the value of <code>rbp</code>): |
| |
| <pre class="smallexample"> je label |
| popq %rbx |
| .cfi_restore %rbx |
| popq %r12 |
| .cfi_restore %r12 |
| popq %rbp |
| .cfi_restore %rbp |
| .cfi_def_cfa %rsp, 8 |
| ret |
| label: |
| /* Do something else */ |
| </pre> |
| <p>Here, we want the <code>.cfi</code> directives to affect only the rows corresponding |
| to the instructions before <code>label</code>. This means we'd have to add multiple |
| <code>.cfi</code> directives after <code>label</code> to recreate the original save |
| locations of the registers, as well as setting the CFA back to the value of |
| <code>rbp</code>. This would be clumsy, and result in a larger binary size. Instead, |
| we can write: |
| |
| <pre class="smallexample"> je label |
| popq %rbx |
| .cfi_remember_state |
| .cfi_restore %rbx |
| popq %r12 |
| .cfi_restore %r12 |
| popq %rbp |
| .cfi_restore %rbp |
| .cfi_def_cfa %rsp, 8 |
| ret |
| label: |
| .cfi_restore_state |
| /* Do something else */ |
| </pre> |
| <p>That way, the rules for the instructions after <code>label</code> will be the same |
| as before the first <code>.cfi_restore</code> without having to use multiple |
| <code>.cfi</code> directives. |
| |
| <h4 class="subsection">7.10.21 <code>.cfi_return_column </code><var>register</var></h4> |
| |
| <p>Change return column <var>register</var>, i.e. the return address is either |
| directly in <var>register</var> or can be accessed by rules for <var>register</var>. |
| |
| <h4 class="subsection">7.10.22 <code>.cfi_signal_frame</code></h4> |
| |
| <p>Mark current function as signal trampoline. |
| |
| <h4 class="subsection">7.10.23 <code>.cfi_window_save</code></h4> |
| |
| <p>SPARC register window has been saved. |
| |
| <h4 class="subsection">7.10.24 <code>.cfi_escape</code> <var>expression</var>[, <small class="dots">...</small>]</h4> |
| |
| <p>Allows the user to add arbitrary bytes to the unwind info. One |
| might use this to add OS-specific CFI opcodes, or generic CFI |
| opcodes that GAS does not yet support. |
| |
| <h4 class="subsection">7.10.25 <code>.cfi_val_encoded_addr </code><var>register</var><code>, </code><var>encoding</var><code>, </code><var>label</var></h4> |
| |
| <p>The current value of <var>register</var> is <var>label</var>. The value of <var>label</var> |
| will be encoded in the output file according to <var>encoding</var>; see the |
| description of <code>.cfi_personality</code> for details on this encoding. |
| |
| <p>The usefulness of equating a register to a fixed label is probably |
| limited to the return address register. Here, it can be useful to |
| mark a code segment that has only one return address which is reached |
| by a direct branch and no copy of the return address exists in memory |
| or another register. |
| |
| </body></html> |
| |