diff options
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/config/s390/constraints.md | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/s390/jump-label.c | 19 |
4 files changed, 44 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5e826d0..ef22ae2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2019-02-08 Ilya Leoshkevich <iii@linux.ibm.com> + + * config/s390/constraints.md (jdd): New constraint. + 2019-02-08 H.J. Lu <hongjiu.lu@intel.com> PR target/89229 diff --git a/gcc/config/s390/constraints.md b/gcc/config/s390/constraints.md index 688dd96..4055cbc 100644 --- a/gcc/config/s390/constraints.md +++ b/gcc/config/s390/constraints.md @@ -37,6 +37,7 @@ ;; jKK: constant vector with all elements having the same value and ;; matching K constraint ;; jm6: An integer operand with the lowest order 6 bits all ones. +;; jdd: A constant operand that fits into the data section. ;; t -- Access registers 36 and 37. ;; v -- Vector registers v0-v31. ;; C -- A signed 8-bit constant (-128..127) @@ -567,3 +568,19 @@ (define_constraint "ZL" "LARL operand when in 64-bit mode, otherwise nothing." (match_test "TARGET_64BIT && larl_operand (op, VOIDmode)")) + +;; This constraint must behave like "i", in particular, the matching values +;; must never be placed into registers or memory by +;; cfgexpand.c:expand_asm_stmt. It could be straightforward to start its name +;; with a letter from genpreds.c:const_int_constraints, however it would +;; require using (match_code "const_int"), which is infeasible. To achieve the +;; same effect, that is, setting maybe_allows_reg and maybe_allows_mem to false +;; in genpreds.c:add_constraint, we explicitly exclude reg, subreg and mem +;; codes. +(define_constraint "jdd" + "A constant operand that fits into the data section. + Usage of this constraint might produce a relocation." + (and (not (match_code "reg")) + (not (match_code "subreg")) + (not (match_code "mem")) + (match_test "CONSTANT_P (op)"))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4174857..53ad08a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-02-08 Ilya Leoshkevich <iii@linux.ibm.com> + + * gcc.target/s390/jump-label.c: New test. + 2019-02-08 Richard Biener <rguenther@suse.de> PR testsuite/89250 diff --git a/gcc/testsuite/gcc.target/s390/jump-label.c b/gcc/testsuite/gcc.target/s390/jump-label.c new file mode 100644 index 0000000..3de73f6 --- /dev/null +++ b/gcc/testsuite/gcc.target/s390/jump-label.c @@ -0,0 +1,19 @@ +/* Test jdd constraint, which is used for linux kernel jump labels. */ + +/* { dg-do link } */ +/* { dg-options "-O2 -fPIC -shared" } */ + +__attribute__ ((visibility ("default"))) extern int i; + +void f (void) +{ + asm goto (".pushsection foo\n" +#if defined(__s390x__) + ".quad %0-.\n" +#else + ".long %0-.\n" +#endif + ".popsection\n" + : : "jdd" (&i) : : l); +l:; +} |