aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitar Dimitrov <dimitar@dinux.eu>2018-12-11 15:50:51 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2018-12-11 15:50:51 +0000
commit5b238a4591932c5e5a28fa8f9b3a413a3ce641a6 (patch)
tree7942157d661299dbb5b1d291fdd2283ad78ec3a4
parentf9d4d3cf937b5a94d461a51799018dfb33262650 (diff)
downloadgcc-5b238a4591932c5e5a28fa8f9b3a413a3ce641a6.zip
gcc-5b238a4591932c5e5a28fa8f9b3a413a3ce641a6.tar.gz
gcc-5b238a4591932c5e5a28fa8f9b3a413a3ce641a6.tar.bz2
cfgexpand.c (asm_clobber_reg_is_valid): Also produce error when stack pointer is clobbered.
gcc/ 2018-12-11 Dimitar Dimitrov <dimitar@dinux.eu> * cfgexpand.c (asm_clobber_reg_is_valid): Also produce error when stack pointer is clobbered. (expand_asm_stmt): Refactor clobber check in separate function. gcc/testsuite/ 2018-12-11 Dimitar Dimitrov <dimitar@dinux.eu> * gcc.target/i386/pr52813.c: New test. From-SVN: r267025
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cfgexpand.c42
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/i386/pr52813.c9
4 files changed, 53 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 99ba8bd..cc126c7 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-12-11 Dimitar Dimitrov <dimitar@dinux.eu>
+
+ * cfgexpand.c (asm_clobber_reg_is_valid): Also produce
+ error when stack pointer is clobbered.
+ (expand_asm_stmt): Refactor clobber check in separate function.
+
2018-12-11 Eric Botcazou <botcazou@adacore.com>
* config/rs6000/vxworks.h (RS6000_STARTING_FRAME_OFFSET): Define,
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index 9b3259d..0d04bbc 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -2850,6 +2850,38 @@ tree_conflicts_with_clobbers_p (tree t, HARD_REG_SET *clobbered_regs)
return false;
}
+/* Check that the given REGNO spanning NREGS is a valid
+ asm clobber operand. Some HW registers cannot be
+ saved/restored, hence they should not be clobbered by
+ asm statements. */
+static bool
+asm_clobber_reg_is_valid (int regno, int nregs, const char *regname)
+{
+ bool is_valid = true;
+ HARD_REG_SET regset;
+
+ CLEAR_HARD_REG_SET (regset);
+
+ add_range_to_hard_reg_set (&regset, regno, nregs);
+
+ /* Clobbering the PIC register is an error. */
+ if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM
+ && overlaps_hard_reg_set_p (regset, Pmode, PIC_OFFSET_TABLE_REGNUM))
+ {
+ /* ??? Diagnose during gimplification? */
+ error ("PIC register clobbered by %qs in %<asm%>", regname);
+ is_valid = false;
+ }
+ /* Clobbering the STACK POINTER register is an error. */
+ if (overlaps_hard_reg_set_p (regset, Pmode, STACK_POINTER_REGNUM))
+ {
+ error ("Stack Pointer register clobbered by %qs in %<asm%>", regname);
+ is_valid = false;
+ }
+
+ return is_valid;
+}
+
/* Generate RTL for an asm statement with arguments.
STRING is the instruction template.
OUTPUTS is a list of output arguments (lvalues); INPUTS a list of inputs.
@@ -2982,14 +3014,8 @@ expand_asm_stmt (gasm *stmt)
else
for (int reg = j; reg < j + nregs; reg++)
{
- /* Clobbering the PIC register is an error. */
- if (reg == (int) PIC_OFFSET_TABLE_REGNUM)
- {
- /* ??? Diagnose during gimplification? */
- error ("PIC register clobbered by %qs in %<asm%>",
- regname);
- return;
- }
+ if (!asm_clobber_reg_is_valid (reg, nregs, regname))
+ return;
SET_HARD_REG_BIT (clobbered_regs, reg);
rtx x = gen_rtx_REG (reg_raw_mode[reg], reg);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 12acfe3..3c15bf7 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2018-12-11 Dimitar Dimitrov <dimitar@dinux.eu>
+
+ * gcc.target/i386/pr52813.c: New test.
+
2018-12-11 Jakub Jelinek <jakub@redhat.com>
PR target/88425
diff --git a/gcc/testsuite/gcc.target/i386/pr52813.c b/gcc/testsuite/gcc.target/i386/pr52813.c
new file mode 100644
index 0000000..154ebbf
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr52813.c
@@ -0,0 +1,9 @@
+/* Ensure that stack pointer cannot be an asm clobber. */
+/* { dg-do compile { target { ! ia32 } } } */
+/* { dg-options "-O2" } */
+
+void
+test1 (void)
+{
+ asm volatile ("" : : : "%esp"); /* { dg-error "Stack Pointer register clobbered" } */
+}