aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2007-05-17 17:27:26 +0000
committerH.J. Lu <hjl.tools@gmail.com>2007-05-17 17:27:26 +0000
commit4b7d318b85051503fae2b758837f2bd56c0bd37c (patch)
treecc5c1d32a0ef7b70c7a2209136bb1b5956a8aaa5 /gas
parent30618a1e611122545b53916334c5ad8ee3656f1f (diff)
downloadgdb-4b7d318b85051503fae2b758837f2bd56c0bd37c.zip
gdb-4b7d318b85051503fae2b758837f2bd56c0bd37c.tar.gz
gdb-4b7d318b85051503fae2b758837f2bd56c0bd37c.tar.bz2
2007-05-17 H.J. Lu <hongjiu.lu@intel.com>
PR gas/4517 2003-06-05 Michal Ludvig <mludvig@suse.cz> * as.texinfo: Document new directives: .cfi_restore, .cfi_undefined, .cfi_same_value, .cfi_return_column, .cfi_remember_state and .cfi_restore_state. 2007-05-17 H.J. Lu <hongjiu.lu@intel.com> 2003-06-05 Michal Ludvig <mludvig@suse.cz> * testsuite/gas/cfi/cfi-x86_64.s: Test new directives and different writings of registers and numbers. * testsuite/gas/cfi/cfi-x86_64.d: Updated pattern to match the above change.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog16
-rw-r--r--gas/doc/as.texinfo35
-rw-r--r--gas/testsuite/gas/cfi/cfi-x86_64.d39
-rw-r--r--gas/testsuite/gas/cfi/cfi-x86_64.s49
4 files changed, 125 insertions, 14 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index fe78e8f..ef9ce4d 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,19 @@
+2007-05-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ PR gas/4517
+ 2003-06-05 Michal Ludvig <mludvig@suse.cz>
+ * as.texinfo: Document new directives: .cfi_restore,
+ .cfi_undefined, .cfi_same_value, .cfi_return_column,
+ .cfi_remember_state and .cfi_restore_state.
+
+2007-05-17 H.J. Lu <hongjiu.lu@intel.com>
+
+ 2003-06-05 Michal Ludvig <mludvig@suse.cz>
+ * testsuite/gas/cfi/cfi-x86_64.s: Test new directives
+ and different writings of registers and numbers.
+ * testsuite/gas/cfi/cfi-x86_64.d: Updated pattern to
+ match the above change.
+
2007-05-17 Nathan Sidwell <nathan@codesourcery.com>
* config/tc-m68k.c (md_apply_fix): Show value of out of range
diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo
index ac61d2b..ce6a18f 100644
--- a/gas/doc/as.texinfo
+++ b/gas/doc/as.texinfo
@@ -3790,7 +3790,7 @@ Some machine configurations provide additional directives.
* Byte:: @code{.byte @var{expressions}}
* Comm:: @code{.comm @var{symbol} , @var{length} }
-* CFI directives:: @code{.cfi_startproc}, @code{.cfi_endproc}, etc.
+* CFI directives:: @code{.cfi_startproc [simple]}, @code{.cfi_endproc}, etc.
* Data:: @code{.data @var{subsection}}
@ifset COFF
@@ -4109,14 +4109,16 @@ The syntax for @code{.comm} differs slightly on the HPPA. The syntax is
@end ifset
@node CFI directives
-@section @code{.cfi_startproc}
+@section @code{.cfi_startproc [simple]}
@cindex @code{cfi_startproc} directive
@code{.cfi_startproc} is used at the beginning of each function that
should have an entry in @code{.eh_frame}. It initializes some internal
-data structures and emits architecture dependent initial CFI instructions.
-Don't forget to close the function by
+data structures. Don't forget to close the function by
@code{.cfi_endproc}.
+Unless @code{.cfi_startproc} is used along with parameter @code{simple}
+it also emits some architecture dependent initial CFI instructions.
+
@section @code{.cfi_endproc}
@cindex @code{cfi_endproc} directive
@code{.cfi_endproc} is used at the end of a function where it closes its
@@ -4172,6 +4174,31 @@ 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.
+@section @code{.cfi_register @var{register1}, @var{register2}}
+Previous value of @var{register1} is saved in register @var{register2}.
+
+@section @code{.cfi_restore @var{register}}
+@code{.cfi_restore} says that the rule for @var{register} is now the
+same as it was at the beginning of the function, after all initial
+instruction added by @code{.cfi_startproc} were executed.
+
+@section @code{.cfi_undefined @var{register}}
+From now on the previous value of @var{register} can't be restored anymore.
+
+@section @code{.cfi_same_value @var{register}}
+Current value of @var{register} is the same like in the previous frame,
+i.e. no restoration needed.
+
+@section @code{.cfi_remember_state},
+First save all current rules for all registers by @code{.cfi_remember_state},
+then totally screw them up by subsequent @code{.cfi_*} directives and when
+everything is hopelessly bad, use @code{.cfi_restore_state} to restore
+the previous saved state.
+
+@section @code{.cfi_return_column @var{register}}
+Change return column @var{register}, i.e. the return address is either
+directly in @var{register} or can be accessed by rules for @var{register}.
+
@section @code{.cfi_signal_frame}
Mark current function as signal trampoline.
diff --git a/gas/testsuite/gas/cfi/cfi-x86_64.d b/gas/testsuite/gas/cfi/cfi-x86_64.d
index f346435..2f37a9c 100644
--- a/gas/testsuite/gas/cfi/cfi-x86_64.d
+++ b/gas/testsuite/gas/cfi/cfi-x86_64.d
@@ -35,7 +35,7 @@ The section .eh_frame contains:
00000050 00000014 00000054 FDE cie=00000000 pc=00000022..00000035
DW_CFA_advance_loc: 3 to 00000025
- DW_CFA_def_cfa_reg: r12
+ DW_CFA_def_cfa_reg: r8
DW_CFA_advance_loc: 15 to 00000034
DW_CFA_def_cfa_reg: r7
DW_CFA_nop
@@ -50,3 +50,40 @@ The section .eh_frame contains:
DW_CFA_nop
DW_CFA_nop
+00000090 00000010 00000000 CIE
+ Version: 1
+ Augmentation: "zR"
+ Code alignment factor: 1
+ Data alignment factor: -8
+ Return address column: 16
+ Augmentation data: 1b
+
+ DW_CFA_def_cfa: r7 ofs 8
+
+000000a4 00000030 00000018 FDE cie=00000090 pc=0000004d..00000058
+ DW_CFA_advance_loc: 1 to 0000004e
+ DW_CFA_def_cfa_offset: 16
+ DW_CFA_advance_loc: 1 to 0000004f
+ DW_CFA_def_cfa_reg: r8
+ DW_CFA_advance_loc: 1 to 00000050
+ DW_CFA_def_cfa_offset: 4676
+ DW_CFA_advance_loc: 1 to 00000051
+ DW_CFA_offset_extended_sf: r4 at cfa\+16
+ DW_CFA_advance_loc: 1 to 00000052
+ DW_CFA_register: r8 in r9
+ DW_CFA_advance_loc: 1 to 00000053
+ DW_CFA_remember_state
+ DW_CFA_advance_loc: 1 to 00000054
+ DW_CFA_restore: r6
+ DW_CFA_advance_loc: 1 to 00000055
+ DW_CFA_undefined: r16
+ DW_CFA_advance_loc: 1 to 00000056
+ DW_CFA_same_value: r3
+ DW_CFA_advance_loc: 1 to 00000057
+ DW_CFA_restore_state
+ DW_CFA_nop
+ DW_CFA_nop
+ DW_CFA_nop
+ DW_CFA_nop
+ DW_CFA_nop
+
diff --git a/gas/testsuite/gas/cfi/cfi-x86_64.s b/gas/testsuite/gas/cfi/cfi-x86_64.s
index 10035ad..c2e2464 100644
--- a/gas/testsuite/gas/cfi/cfi-x86_64.s
+++ b/gas/testsuite/gas/cfi/cfi-x86_64.s
@@ -35,9 +35,9 @@ func_prologue:
#; each instruction.
pushq %rbp
.cfi_def_cfa_offset 16
- .cfi_offset rbp,-16
+ .cfi_offset %rbp, -16
movq %rsp, %rbp
- .cfi_def_cfa_register rbp
+ .cfi_def_cfa_register %rbp
#; function body
call func_locvars
@@ -46,7 +46,7 @@ func_prologue:
#; epilogue with valid CFI
#; (we're better than gcc :-)
leaveq
- .cfi_def_cfa rsp,8
+ .cfi_def_cfa %rsp, 8
ret
.cfi_endproc
@@ -59,21 +59,21 @@ func_prologue:
func_otherreg:
.cfi_startproc
- #; save frame pointer to r12
- movq %rsp,%r12
- .cfi_def_cfa_register r12
+ #; save frame pointer to r8
+ movq %rsp,%r8
+ .cfi_def_cfa_register r8
#; alocate space for local vars
#; (no .cfi_{def,adjust}_cfa_offset here,
- #; because CFA is computed from r12!)
+ #; because CFA is computed from r8!)
sub $100,%rsp
#; function body
call func_prologue
addl $2, %eax
- #; restore frame pointer from r12
- movq %r12,%rsp
+ #; restore frame pointer from r8
+ movq %r8,%rsp
.cfi_def_cfa_register rsp
ret
.cfi_endproc
@@ -105,3 +105,34 @@ _start:
syscall
hlt
.cfi_endproc
+
+#; func_alldirectives
+#; - test for all .cfi directives.
+#; This function is never called and the CFI info doesn't make sense.
+
+ .type func_alldirectives,@function
+func_alldirectives:
+ .cfi_startproc simple
+ .cfi_def_cfa rsp,8
+ nop
+ .cfi_def_cfa_offset 16
+ nop
+ .cfi_def_cfa_register r8
+ nop
+ .cfi_adjust_cfa_offset 0x1234
+ nop
+ .cfi_offset %rsi, 0x10
+ nop
+ .cfi_register %r8, %r9
+ nop
+ .cfi_remember_state
+ nop
+ .cfi_restore %rbp
+ nop
+ .cfi_undefined %rip
+ nop
+ .cfi_same_value rbx
+ nop
+ .cfi_restore_state
+ ret
+ .cfi_endproc