Re: Regression for gdb.cp/exceptprint.exp [Re: [PATCH v6] Make chained function calls in expressions work]

Siva Chandra
2014-11-29T10:16:13Z

[-- Attachment #1: Type: text/plain, Size: 1306 bytes --]

On Sat, Nov 29, 2014 at 12:26 AM, Jan Kratochvil
<jan.kratochvil@redhat.com> wrote:
> On Sat, 29 Nov 2014 01:03:57 +0100, Siva Chandra wrote:
>> I have now pushed this patch
>
> [bash]jkratoch@MOCK-fedora-21-x86_64:/home/jkratoch/redhat/gdb-clean/gdb/testsuite# git log
> commit 6c659fc2c7cd2da6d2b9a3d7c38597ad3821832a
> Author: Siva Chandra <sivachandra@chromium.org>
> Date: Tue Nov 11 05:43:03 2014 -0800
> Enable chained function calls in C++ expressions.
>
> On Fedora 21 x86_64 and x86_64-m32 (i686 not tested due to some unrelated
> regression).
>
> print $_exception^M
> -$1 = 0x400b10 "hi bob"^M
> -(gdb) PASS: gdb.cp/exceptprint.exp: string: print exception value at throw
> -continue^M
> +thread.c:711: internal-error: value_in_thread_stack_temporaries: Assertion `tp != NULL && tp->stack_temporaries_enabled' failed.^M
> +A problem internal to GDB has been detected,^M
> +further debugging may prove unreliable.^M

What my patch did was to make evaluate_subexp non re-entrant. As in,
if evaluate_subexp is called with *pos == 0 while a top level
expression is under evaluation, then it will crash with symptoms
similar to the above. While I setup my VM/fedora box, can I ask you to
test the attached patch which should fix this (and hopefully fix the
regression)?

Thanks,
Siva Chandra

[-- Attachment #2: quick_fix.txt --]
[-- Type: text/plain, Size: 539 bytes --]

diff --git a/gdb/eval.c b/gdb/eval.c
index a13793c..c2ab879 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -69,7 +69,8 @@ evaluate_subexp (struct type *expect_type, struct expression *exp,
int cleanup_temps = 0;

if (*pos == 0 && target_has_execution
- && exp->language_defn->la_language == language_cplus)
+ && exp->language_defn->la_language == language_cplus
+ && !thread_stack_temporaries_enabled_p (inferior_ptid))
{
cleanups = enable_thread_stack_temporaries (inferior_ptid);
cleanup_temps = 1;