This is a problem where we reject labels on a jump instruction because they are invalid with pic for the 's' constraint. It seems that the constraint wasn't checked in earlier versions of the compiler.

Fixed by adding a new constraint and using that instead.


Bernd
commit 432e3b7c5e3e47fdc9232805519d54f516c18008
Author: Bernd Schmidt <ber...@codesourcery.com>
Date:   Fri Mar 27 13:32:31 2015 +0100

    Fix c6x-uclinux build failure.
    
    	* config/c6x/constraints.md (S3): New constraint.
    	* config/c6x/c6x.md (real_jump): Use it.

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5cee0a5..8e4b6c1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2015-03-27  Bernd Schmidt  <ber...@codesourcery.com>
+
+	PR target/65052
+        * config/c6x/constraints.md (S3): New constraint.
+        * config/c6x/c6x.md (real_jump): Use it.
+
 2015-03-26  Jan Hubicka  <hubi...@ucw.cz>
 
 	PR middle-end/65595
diff --git a/gcc/config/c6x/c6x.md b/gcc/config/c6x/c6x.md
index 892aac4..fafefa6 100644
--- a/gcc/config/c6x/c6x.md
+++ b/gcc/config/c6x/c6x.md
@@ -1519,7 +1519,7 @@
 ;; -------------------------------------------------------------------------
 
 (define_insn "real_jump"
-  [(unspec [(match_operand 0 "c6x_jump_operand" "a,b,s") (const_int 0)]
+  [(unspec [(match_operand 0 "c6x_jump_operand" "a,b,S3") (const_int 0)]
 	   UNSPEC_REAL_JUMP)]
   ""
 {
diff --git a/gcc/config/c6x/constraints.md b/gcc/config/c6x/constraints.md
index 9d88912..b8cdc0e 100644
--- a/gcc/config/c6x/constraints.md
+++ b/gcc/config/c6x/constraints.md
@@ -160,6 +160,11 @@ not C64X or higher).")
    Any SYMBOL_REF or LABEL_REF."
   (ior (match_code "symbol_ref") (match_code "label_ref")))
 
+(define_constraint "S3"
+  "Matches a symbolic integer constant, even if invalid for PIC."
+  (and (match_test "CONSTANT_P (op)")
+       (match_test "!CONST_SCALAR_INT_P (op)")))
+
 (define_constraint "Si"
   "@internal
    Any immediate value, unless it matches the S0 constraint."

Reply via email to