aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYao Qi <yao.qi@linaro.org>2016-07-05 15:29:20 +0100
committerYao Qi <yao.qi@linaro.org>2016-07-06 08:24:35 +0100
commit1040b979bc46474530fa4fee397b8acc460c01e9 (patch)
treeead2680821410ae5d67e754d9a6b5f9256742f6b
parent42d940118a6372d6e85f71a54fed75fdf5c606bd (diff)
downloadfsf-binutils-gdb-1040b979bc46474530fa4fee397b8acc460c01e9.zip
fsf-binutils-gdb-1040b979bc46474530fa4fee397b8acc460c01e9.tar.gz
fsf-binutils-gdb-1040b979bc46474530fa4fee397b8acc460c01e9.tar.bz2
[ARM] Fix endless recursion on calculating CPRC candidate
When GDB determines whether type T can be part of candidate for passing and returning in VFP registers, it calls arm_vfp_cprc_sub_candidate recursively. However, if type T has self-reference field, like, class C { static C s; }; arm_vfp_cprc_sub_candidate won't return. This fix is to skip calling arm_vfp_cprc_sub_candidate if the field is static. gdb: 2016-07-06 Yao Qi <yao.qi@linaro.org> * arm-tdep.c (arm_vfp_cprc_sub_candidate): Don't call arm_vfp_cprc_sub_candidate for static field.
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/arm-tdep.c7
2 files changed, 10 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 7cec5ad..a2fe153 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,8 @@
+2016-07-06 Yao Qi <yao.qi@linaro.org>
+
+ * arm-tdep.c (arm_vfp_cprc_sub_candidate): Don't call
+ arm_vfp_cprc_sub_candidate for static field.
+
2016-07-06 Manish Goregaokar <manish@mozilla.com>
* rust-lang.c (rust_subscript): Allow subscripting pointers
diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c
index 278f639..d2661cb 100644
--- a/gdb/arm-tdep.c
+++ b/gdb/arm-tdep.c
@@ -3554,8 +3554,11 @@ arm_vfp_cprc_sub_candidate (struct type *t,
int i;
for (i = 0; i < TYPE_NFIELDS (t); i++)
{
- int sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
- base_type);
+ int sub_count = 0;
+
+ if (!field_is_static (&TYPE_FIELD (t, i)))
+ sub_count = arm_vfp_cprc_sub_candidate (TYPE_FIELD_TYPE (t, i),
+ base_type);
if (sub_count == -1)
return -1;
count += sub_count;