aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@google.com>2013-11-06 01:03:57 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2013-11-06 01:03:57 +0000
commit674647e60381fe980fda563eea96e0536150057d (patch)
tree6883ff09dca6ecde88c7300e1d9c735df4a80b38
parent39cf09b1f55b630ee462edce769bf8e9562ef74a (diff)
downloadgcc-674647e60381fe980fda563eea96e0536150057d.zip
gcc-674647e60381fe980fda563eea96e0536150057d.tar.gz
gcc-674647e60381fe980fda563eea96e0536150057d.tar.bz2
sync.md (atomic_compare_and_swap<dwi>_doubleword): If possible, add .cfi directives to record change to bx.
* config/i386/sync.md (atomic_compare_and_swap<dwi>_doubleword): If possible, add .cfi directives to record change to bx. * config/i386/i386.c (ix86_emit_cfi): New function. * config/i386/i386-protos.h (ix86_emit_cfi): Declare. From-SVN: r204433
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/config/i386/i386-protos.h1
-rw-r--r--gcc/config/i386/i386.c8
-rw-r--r--gcc/config/i386/sync.md15
4 files changed, 29 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2727156..d5c8ceb 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2013-11-05 Ian Lance Taylor <iant@google.com>
+
+ * config/i386/sync.md (atomic_compare_and_swap<dwi>_doubleword):
+ If possible, add .cfi directives to record change to bx.
+ * config/i386/i386.c (ix86_emit_cfi): New function.
+ * config/i386/i386-protos.h (ix86_emit_cfi): Declare.
+
2013-11-05 Steven Bosscher <steven@gcc.gnu.org>
diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-protos.h
index 5799251..fdf9d58 100644
--- a/gcc/config/i386/i386-protos.h
+++ b/gcc/config/i386/i386-protos.h
@@ -143,6 +143,7 @@ extern void ix86_split_lshr (rtx *, rtx, enum machine_mode);
extern rtx ix86_find_base_term (rtx);
extern bool ix86_check_movabs (rtx, int);
extern void ix86_split_idivmod (enum machine_mode, rtx[], bool);
+extern bool ix86_emit_cfi ();
extern rtx assign_386_stack_local (enum machine_mode, enum ix86_stack_slot);
extern int ix86_attr_length_immediate_default (rtx, bool);
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 771fabe..3d3838b 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -17344,6 +17344,14 @@ ix86_split_idivmod (enum machine_mode mode, rtx operands[],
emit_label (end_label);
}
+/* Whether it is OK to emit CFI directives when emitting asm code. */
+
+bool
+ix86_emit_cfi ()
+{
+ return dwarf2out_do_cfi_asm ();
+}
+
#define LEA_MAX_STALL (3)
#define LEA_SEARCH_THRESHOLD (LEA_MAX_STALL << 1)
diff --git a/gcc/config/i386/sync.md b/gcc/config/i386/sync.md
index 9e58356..8408a2b 100644
--- a/gcc/config/i386/sync.md
+++ b/gcc/config/i386/sync.md
@@ -430,10 +430,21 @@
const char *xchg = "xchg{<imodesuffix>}\t%%<regprefix>bx, %5";
if (swap)
- output_asm_insn (xchg, operands);
+ {
+ output_asm_insn (xchg, operands);
+ if (ix86_emit_cfi ())
+ {
+ output_asm_insn (".cfi_remember_state", operands);
+ output_asm_insn (".cfi_register\t%%<regprefix>bx, %5", operands);
+ }
+ }
output_asm_insn ("lock{%;} %K7cmpxchg<doublemodesuffix>b\t%2", operands);
if (swap)
- output_asm_insn (xchg, operands);
+ {
+ output_asm_insn (xchg, operands);
+ if (ix86_emit_cfi ())
+ output_asm_insn (".cfi_restore_state", operands);
+ }
return "";
})