From 8a65c6637211061c5e99a076228daf6761b8df76 Mon Sep 17 00:00:00 2001 From: ramana Date: Fri, 4 Apr 2014 16:10:07 +0000 Subject: [PATCH] Fix PR debug/60655 - part 1 This is a partial fix for PR60655 where dwarf2out.c rejects NOT of a value in const_ok_for_output_1. There is still a problem with the testcase on armhf where we get operations of the form, const (minus (const_int) (symref)) without the -fdata-sections option which is just weird. I'm not yet sure where this is produced from and will not have the time to dig further today. As Jakub said on IRC, const_ok_for_output_1 is called only with partial rtx's and therefore disabling minus (const_int) (symref) might not be the best thing to do especially if this were part of plus (symref) (minus (const int) (symref)) and both symrefs were in the same section. Bootstrapped and regtested on armhf Bootstrap and regression test running on x86_64. Ok to commit ? regards Ramana gcc/ Jakub Jelinek Ramana Radhakrishnan * dwarf2out.c (const_ok_for_output_1): Reject expressions containing a NOT. gcc/testsuite Ramana Radhakrishnan * gcc.c-torture/compile/pr60655-1.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@209121 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 ++++++ gcc/dwarf2out.c | 12 +++++++++- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.c-torture/compile/pr60655-1.c | 31 +++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr60655-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 942b011..ad1d2c1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-04-04 Jakub Jelinek + Ramana Radhakrishnan + + PR debug/60655 + * dwarf2out.c (const_ok_for_output_1): Reject expressions + containing a NOT. + 2014-04-04 Kyrylo Tkachov PR bootstrap/60743 diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 2b584a5..67b37eb 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -11325,8 +11325,18 @@ const_ok_for_output_1 (rtx *rtlp, void *data ATTRIBUTE_UNUSED) return 1; } + /* FIXME: Refer to PR60655. It is possible for simplification + of rtl expressions in var tracking to produce such expressions. + We should really identify / validate expressions + enclosed in CONST that can be handled by assemblers on various + targets and only handle legitimate cases here. */ if (GET_CODE (rtl) != SYMBOL_REF) - return 0; + { + if (GET_CODE (rtl) == NOT) + return 1; + + return 0; + } if (CONSTANT_POOL_ADDRESS_P (rtl)) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a8268b9..11a0a5e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-04-04 Ramana Radhakrishnan + + PR debug/60655 + * gcc.c-torture/compile/pr60655-1.c: New test. + 2014-04-04 Martin Jambor PR ipa/60640 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr60655-1.c b/gcc/testsuite/gcc.c-torture/compile/pr60655-1.c new file mode 100644 index 0000000..5f38701 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr60655-1.c @@ -0,0 +1,31 @@ +/* { dg-options "-fdata-sections" } */ + +typedef unsigned char unit; +typedef unit *unitptr; +extern short global_precision; +typedef unsigned int size_t; +extern void *memcpy (void *dest, const void *src, size_t n); + +short mp_compare(const unit* r1, const unit* r2) +{ + register short precision; + precision = global_precision; + (r1) = ((r1)+(precision)-1); + (r2) = ((r2)+(precision)-1); + do + { if (*r1 < *r2) + return(-1); + if (*((r1)--) > *((r2)--)) + return(1); + } while (--precision); +} + +static unit modulus[((1280+(2*8))/8)]; +static unit d_data[((1280+(2*8))/8)*2]; + +int upton_modmult (unitptr prod, unitptr multiplicand, unitptr multiplier) +{ + unitptr d = d_data; + while (mp_compare(d,modulus) > 0) + memcpy((void*)(prod), (const void*)(d), (global_precision)); +} -- 2.7.4