public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "ian at airs dot com" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug go/60406] recover.go: test13reflect2 test failure
Date: Wed, 08 Oct 2014 13:44:00 -0000	[thread overview]
Message-ID: <bug-60406-4-poS1GN1TZi@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-60406-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60406

--- Comment #26 from Ian Lance Taylor <ian at airs dot com> ---
(In reply to Dominik Vogt from comment #23)
> 
> 1) We need to call __builtin_extract_return_address(retaddr) in
> __go_set_defer_retaddr() too.  (On s390 (31 bit) this is necessary to remove
> the most significant bit of the address which indicates the addressing mode.)
> 
> I.e.
> 
> --snip--
> -    g->defer->__retaddr = retaddr;
> +    g->defer->__retaddr = __builtin_extract_return_addr (retaddr);
> --snip--

Will do.


> 2) The new patch does not compile for me:
> 
> --
> In file included from ../../../libgo/runtime/go-check-interface.c:8:0:
> ../../../libgo/runtime/go-panic.h:43:13: error: conflicting types for
> ‘__go_makefunc_can_recover’
>  extern void __go_makefunc_can_recover (void *retaddr);
>              ^
> In file included from ../../../libgo/runtime/go-check-interface.c:7:0:
> ../../../libgo/runtime/runtime.h:845:9: note: previous declaration of
> ‘__go_makefunc_can_recover’ was here
>  void    __go_makefunc_can_recover (const void *);
>          ^
> --
> 
> In runtime.h, __go_makefunc_can_recover still has a "const" argument:
> 
> --snip--
> -void    __go_makefunc_can_recover (const void *);
> +void    __go_makefunc_can_recover (void *);
> --snip--

I think that must be a local change in your tree.  In my tree runtime.h does
not declare __go_makefunc_can_recover.


> 3) Couldn't this be written more efficiently by passing a flag?
> 
> +  /* If we are called from __go_makefunc_can_recover, then we need to
> +     look one level higher.  */
> +  if (locs[0].function.len > 0
> +      && __builtin_strcmp ((const char *) locs[0].function.str,
> +			   "__go_makefunc_can_recover") == 0)
> 
> E.g.
> 
>   _Bool __go_can_recover (void *retaddr, _Bool
> called_by_makefunc_can_recover)
>   {
>     ...
>     if (called_by_makefunc_can_recover)
>       { do something }
>     else
>       { do something else }
>     ...
>   }

Yes, but I would rather do that later if it seems useful.  It seems silly to
change the compiler to always pass an extra argument that will always be false.
 Introducing a new function called by both __go_can_recover and
__go_makefunc_can_recover changes the stack layout depending on the compiler's
inlining choices, so must be treated with care.  And it's worth remembering
that this case never ever happens outside of tests.  It only happens when
somebody constructs a function using reflect.MakeFunc and then defers a call to
that function.  That is a bizarre way to code and I am confident that
absolutely no real Go code does it.  Making that case slightly less efficient
is not important.


> 4) With the suggested changes from 1 and 2 above:
> 
> s390x (64 bit):
> 
> * PASS: test/recover.go
> * the test from #4 in my earlier posting works as expected
> * my private defer/recover/panic testsuite works as expected
> 
> s390 (31 bit):
> 
> * PASS: test/recover.go
> * the test from #4 in my earlier posting works as expected
> * my private defer/recover/panic testsuite works as expected

Thanks for testing.


> 5) I find the assumption in the loop at the end of __go_can_recover() that
> if a caller's name begins with "__go_" that means the panic can be
> recovered, a bit hairy.  Even if it is with the current libgo, an unrelated
> change elsewhere could break this logic.

I agree that it's imperfect.  However, it's fairly difficult to construct a
case that causes the wrong thing to happen.  No Go function can ever start with
__go.  Very little code in libgo calls a function written in Go; it's easy to
find such code because it must call __go_set_closure (the defer thunks are a
special case that are known to have no closure).  So it can only happen if
somebody writes a Go function that calls recover, and then passes it to C code,
and that C code names a function starting with "__go_" and then calls the Go
function.  And this has to happen from a deferred function called while there
is a panic in progress.  The result will be that the function called by the C
code will incorrectly recover the panic.
>From gcc-bugs-return-463563-listarch-gcc-bugs=gcc.gnu.org@gcc.gnu.org Wed Oct 08 13:51:04 2014
Return-Path: <gcc-bugs-return-463563-listarch-gcc-bugs=gcc.gnu.org@gcc.gnu.org>
Delivered-To: listarch-gcc-bugs@gcc.gnu.org
Received: (qmail 29377 invoked by alias); 8 Oct 2014 13:51:04 -0000
Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm
Precedence: bulk
List-Id: <gcc-bugs.gcc.gnu.org>
List-Archive: <http://gcc.gnu.org/ml/gcc-bugs/>
List-Post: <mailto:gcc-bugs@gcc.gnu.org>
List-Help: <mailto:gcc-bugs-help@gcc.gnu.org>
Sender: gcc-bugs-owner@gcc.gnu.org
Delivered-To: mailing list gcc-bugs@gcc.gnu.org
Received: (qmail 29351 invoked by uid 48); 8 Oct 2014 13:51:00 -0000
From: "trippels at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/63485] New: [5 Regression] ICE: canonical types differ for identical types A<const wchar_t [3]>::type and const char_type [3]
Date: Wed, 08 Oct 2014 13:51:00 -0000
X-Bugzilla-Reason: CC
X-Bugzilla-Type: new
X-Bugzilla-Watch-Reason: None
X-Bugzilla-Product: gcc
X-Bugzilla-Component: c++
X-Bugzilla-Version: 5.0
X-Bugzilla-Keywords:
X-Bugzilla-Severity: normal
X-Bugzilla-Who: trippels at gcc dot gnu.org
X-Bugzilla-Status: UNCONFIRMED
X-Bugzilla-Priority: P3
X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org
X-Bugzilla-Target-Milestone: ---
X-Bugzilla-Flags:
X-Bugzilla-Changed-Fields: bug_id short_desc product version bug_status bug_severity priority component assigned_to reporter
Message-ID: <bug-63485-4@http.gcc.gnu.org/bugzilla/>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/
Auto-Submitted: auto-generated
MIME-Version: 1.0
X-SW-Source: 2014-10/txt/msg00584.txt.bz2
Content-length: 4634

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63485

            Bug ID: 63485
           Summary: [5 Regression] ICE: canonical types differ for
                    identical types A<const wchar_t [3]>::type and const
                    char_type [3]
           Product: gcc
           Version: 5.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: trippels at gcc dot gnu.org

Running the Boost testsuite shows:

markus@x4 /tmp % cat date_time_format_parser.ii
template <typename C> struct A
{
  typedef C type;
};
template <class> class B
{
};
template <class Range> void as_literal (Range &);
template <typename> struct C
{
  typedef wchar_t char_type;
  const char_type on_full_year_placeholder[3];
  void
  on_extended_iso_date ()
  {
    B<A<wchar_t const[3]>::type> a;
    as_literal (on_full_year_placeholder);
  }
};
template <typename> struct date_time_format_parser_callback : C<wchar_t>
{
};
template <typename BaseT> struct D
{
  typedef typename BaseT::char_type char_type;
  char_type
  parse (const char_type *, const char_type *,
         typename BaseT::callback_type p3)
  {
    p3.on_extended_iso_date ();
  }
};
struct F
{
  typedef date_time_format_parser_callback<wchar_t> callback_type;
  typedef wchar_t char_type;
};
template <typename CharT, typename ParserT, typename CallbackT>
void
parse_format (CharT *p1, ParserT p2, CallbackT p3)
{
  CharT p = p2.parse (&p, p1, p3);
}
template <typename CharT>
void
parse_date_time_format (const CharT *, const CharT *p2,
                        date_time_format_parser_callback<CharT> &p3)
{
  D<F> b;
  parse_format (p2, b, p3);
}
template void
parse_date_time_format (const wchar_t *, const wchar_t *,
                        date_time_format_parser_callback<wchar_t> &);



markus@x4 /tmp % g++ -c -w -O0 date_time_format_parser.ii
date_time_format_parser.ii: In instantiation of ‘void C<
<template-parameter-1-1> >::on_extended_iso_date() [with
<template-parameter-1-1> = wchar_t]’:
date_time_format_parser.ii:30:5:   required from ‘D<BaseT>::char_type
D<BaseT>::parse(const char_type*, const char_type*, typename
BaseT::callback_type) [with BaseT = F; D<BaseT>::char_type = wchar_t; typename
BaseT::callback_type = date_time_format_parser_callback<wchar_t>]’
date_time_format_parser.ii:42:33:   required from ‘void parse_format(CharT*,
ParserT, CallbackT) [with CharT = const wchar_t; ParserT = D<F>; CallbackT =
date_time_format_parser_callback<wchar_t>]’
date_time_format_parser.ii:50:16:   required from ‘void
parse_date_time_format(const CharT*, const CharT*,
date_time_format_parser_callback<CharT>&) [with CharT = wchar_t]’
date_time_format_parser.ii:54:68:   required from here
date_time_format_parser.ii:17:16: internal compiler error: canonical types
differ for identical types A<const wchar_t [3]>::type and const char_type [3]
{aka A<const wchar_t [3]>::type}
     as_literal (on_full_year_placeholder);
                ^
0x6b6ebe comptypes(tree_node*, tree_node*, int)
        ../../gcc/gcc/cp/typeck.c:1407
0x6b4ffd structural_comptypes
        ../../gcc/gcc/cp/typeck.c:1341
0x6b6e77 comptypes(tree_node*, tree_node*, int)
        ../../gcc/gcc/cp/typeck.c:1399
0x6d1c51 ocp_convert(tree_node*, tree_node*, int, int, int)
        ../../gcc/gcc/cp/cvt.c:686
0x57baf8 convert_like_real
        ../../gcc/gcc/cp/call.c:6471
0x57832c build_over_call
        ../../gcc/gcc/cp/call.c:7209
0x587911 build_new_function_call(tree_node*, vec<tree_node*, va_gc,
vl_embed>**, bool, int)
        ../../gcc/gcc/cp/call.c:4072
0x7060b4 finish_call_expr(tree_node*, vec<tree_node*, va_gc, vl_embed>**, bool,
bool, int)
        ../../gcc/gcc/cp/semantics.c:2366
0x5fb7c6 tsubst_copy_and_build(tree_node*, tree_node*, int, tree_node*, bool,
bool)
        ../../gcc/gcc/cp/pt.c:15095
0x5db9d6 tsubst_expr
        ../../gcc/gcc/cp/pt.c:14272
0x5dbb1f tsubst_expr
        ../../gcc/gcc/cp/pt.c:13683
0x5db34b tsubst_expr
        ../../gcc/gcc/cp/pt.c:13669
0x5dc7e0 tsubst_expr
        ../../gcc/gcc/cp/pt.c:13855
0x5d9a7d instantiate_decl(tree_node*, int, bool)
        ../../gcc/gcc/cp/pt.c:20231
0x620192 instantiate_pending_templates(int)
        ../../gcc/gcc/cp/pt.c:20347
0x65d4d4 cp_write_global_declarations()
        ../../gcc/gcc/cp/decl2.c:4367
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.
>From gcc-bugs-return-463565-listarch-gcc-bugs=gcc.gnu.org@gcc.gnu.org Wed Oct 08 13:58:58 2014
Return-Path: <gcc-bugs-return-463565-listarch-gcc-bugs=gcc.gnu.org@gcc.gnu.org>
Delivered-To: listarch-gcc-bugs@gcc.gnu.org
Received: (qmail 9270 invoked by alias); 8 Oct 2014 13:58:58 -0000
Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm
Precedence: bulk
List-Id: <gcc-bugs.gcc.gnu.org>
List-Archive: <http://gcc.gnu.org/ml/gcc-bugs/>
List-Post: <mailto:gcc-bugs@gcc.gnu.org>
List-Help: <mailto:gcc-bugs-help@gcc.gnu.org>
Sender: gcc-bugs-owner@gcc.gnu.org
Delivered-To: mailing list gcc-bugs@gcc.gnu.org
Received: (qmail 9234 invoked by uid 55); 8 Oct 2014 13:58:54 -0000
From: "rguenther at suse dot de" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug target/63483] Scheduler performs Invalid move of aliased memory reference
Date: Wed, 08 Oct 2014 13:58:00 -0000
X-Bugzilla-Reason: CC
X-Bugzilla-Type: changed
X-Bugzilla-Watch-Reason: None
X-Bugzilla-Product: gcc
X-Bugzilla-Component: target
X-Bugzilla-Version: 5.0
X-Bugzilla-Keywords:
X-Bugzilla-Severity: normal
X-Bugzilla-Who: rguenther at suse dot de
X-Bugzilla-Status: ASSIGNED
X-Bugzilla-Priority: P3
X-Bugzilla-Assigned-To: ubizjak at gmail dot com
X-Bugzilla-Target-Milestone: ---
X-Bugzilla-Flags:
X-Bugzilla-Changed-Fields:
Message-ID: <bug-63483-4-JvLJIJRU3C@http.gcc.gnu.org/bugzilla/>
In-Reply-To: <bug-63483-4@http.gcc.gnu.org/bugzilla/>
References: <bug-63483-4@http.gcc.gnu.org/bugzilla/>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/
Auto-Submitted: auto-generated
MIME-Version: 1.0
X-SW-Source: 2014-10/txt/msg00586.txt.bz2
Content-length: 5115

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63483

--- Comment #7 from rguenther at suse dot de <rguenther at suse dot de> ---
On Wed, 8 Oct 2014, ubizjak at gmail dot com wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63483
> 
> --- Comment #6 from Uroš Bizjak <ubizjak at gmail dot com> ---
> (In reply to Richard Biener from comment #5)
> > The bug is clearly in
> > 
> > "
> > > Btw, if the mem is MEM_READONLY_P how can it be part of
> > > a {un}aligned_store sequence?
> > 
> > This flag is copied from the original memory operand of the store by
> > alpha_set_memflags to all memory operands in the expanded sequence."
> > 
> > and thus should be fixed there.  What is the "original" memory reference
> > here?  It seems for the read-modify-write you should use the target MEM
> > but somehow a source MEM gets used?  Or rather you should not use either
> > MEMs flags for _all_ MEMs in the sequence but properly distinguish between
> > MEMs generated for the load of the source and MEMs generated for the store
> > to the destination.
> 
> No, this is wrong conclusion. I have new insight into this problem.
> 
> Please consider following test:
> 
> --cut here--
> static char *a;
> static int *b;
> 
> void foo (void)
> {
>   a[1] = 1;
>   b[2] = 1;
> }
> 
> int bar (void)
> {
>   return a && b;
> }
> --cut here--
> 
> (e.g. changing "static char *b" to "static int *b". This way, the problematic
> insn is generated as "native" read:
> 
> (insn 15 14 16 2 (set (reg/f:DI 78)
>         (mem/u/f/c:DI (lo_sum:DI (reg:DI 79)
>                 (symbol_ref:DI ("b") [flags 0x6]  <var_decl 0x2b1d67f5e090 b>))
> [2 b+0 S8 A64])) rmw1.c:7 -1
>      (nil))
> 
> and this is again moved over
> 
> (insn 13 12 14 2 (set (mem:DI (and:DI (plus:DI (reg/f:DI 72)
>                     (const_int 1 [0x1]))
>                 (const_int -8 [0xfffffffffffffff8])) [0  S8 A64])
>         (reg:DI 77)) rmw1.c:6 -1
>      (nil))
> 
> (note that there is no "/u" suffix on the *store* of "a".)
> 
> With this testcase, we have following sequence before sched1 pass:
> 
>     5: r73:DI=high(`a')
>     6: r72:DI=[r73:DI+low(`a')]
>       REG_DEAD r73:DI
>     7: r74:QI=0x1
>     8: r76:DI=[r72:DI+0x1&0xfffffffffffffff8]
>     9: r75:DI=r72:DI+0x1
>    10: r76:DI=!0xff<<r75:DI<<0x3&r76:DI
>    11: r77:DI=zero_extend(r74:QI)<<r75:DI<<0x3
>       REG_DEAD r75:DI
>       REG_DEAD r74:QI
>       REG_EQUAL 0x1<<r75:DI<<0x3
>    12: r77:DI=r77:DI|r76:DI
>       REG_DEAD r76:DI
>    13: [r72:DI+0x1&0xfffffffffffffff8]=r77:DI
>       REG_DEAD r77:DI
>       REG_DEAD r72:DI
>    14: r79:DI=high(`b')
>    15: r78:DI=[r79:DI+low(`b')]
>       REG_DEAD r79:DI
>    16: r80:SI=0x1
>    17: [r78:DI+0x8]=r80:SI
>       REG_DEAD r80:SI
>       REG_DEAD r78:DI
> 
> and sched1 moves (insn 15) all the way up, past (insn 13):
> 
>     5: r73:DI=high(`a')
>    14: r79:DI=high(`b')
>     7: r74:QI=0x1
>     6: r72:DI=[r73:DI+low(`a')]
>       REG_DEAD r73:DI
>    16: r80:SI=0x1
>    15: r78:DI=[r79:DI+low(`b')]
>       REG_DEAD r79:DI
>     9: r75:DI=r72:DI+0x1
>     8: r76:DI=[r72:DI+0x1&0xfffffffffffffff8]
>    11: r77:DI=zero_extend(r74:QI)<<r75:DI<<0x3
>       REG_DEAD r75:DI
>       REG_DEAD r74:QI
>       REG_EQUAL 0x1<<r75:DI<<0x3
>    10: r76:DI=!0xff<<r75:DI<<0x3&r76:DI
>    12: r77:DI=r77:DI|r76:DI
>       REG_DEAD r76:DI
>    13: [r72:DI+0x1&0xfffffffffffffff8]=r77:DI
>       REG_DEAD r77:DI
>       REG_DEAD r72:DI
>    17: [r78:DI+0x8]=r80:SI
>       REG_DEAD r80:SI
>       REG_DEAD r78:DI
>    20: NOTE_INSN_DELETED
> 
> (this particular sequence won't end in a failure, but the insn shouldn't be
> moved past possibly aliasing (insn 13) anyway.
> 
> Patched compiler results in:
> 
>     5: r73:DI=high(`a')
>     7: r74:QI=0x1
>    14: r79:DI=high(`b')
>     6: r72:DI=[r73:DI+low(`a')]
>       REG_DEAD r73:DI
>    16: r80:SI=0x1
>     9: r75:DI=r72:DI+0x1
>     8: r76:DI=[r72:DI+0x1&0xfffffffffffffff8]
>    11: r77:DI=zero_extend(r74:QI)<<r75:DI<<0x3
>       REG_DEAD r75:DI
>       REG_DEAD r74:QI
>       REG_EQUAL 0x1<<r75:DI<<0x3
>    10: r76:DI=!0xff<<r75:DI<<0x3&r76:DI
>    12: r77:DI=r77:DI|r76:DI
>       REG_DEAD r76:DI
>    13: [r72:DI+0x1&0xfffffffffffffff8]=r77:DI
>       REG_DEAD r77:DI
>       REG_DEAD r72:DI
>    15: r78:DI=[r79:DI+low(`b')]
>       REG_DEAD r79:DI
>    17: [r78:DI+0x8]=r80:SI
>       REG_DEAD r80:SI
>       REG_DEAD r78:DI
> 
> As shown, the code further down in true_dependence_1 function blocks the move,
> since the read is detected as aliased with the preceding store involving AND
> alignment.
> 
> There is nothing that can be done in target-dependant code, since the "native"
> read from "b" gets marked as "unchanging" by the generic middle-end code.

Where is that done?  It looks bogus to me.

> Please reconsider the "component" setting. There is nothing that can be fixed
> in target-dependent code.

I'm not sure - copying MEM flags to all MEMs from a single source seems
possibly wrong.
>From gcc-bugs-return-463564-listarch-gcc-bugs=gcc.gnu.org@gcc.gnu.org Wed Oct 08 13:58:15 2014
Return-Path: <gcc-bugs-return-463564-listarch-gcc-bugs=gcc.gnu.org@gcc.gnu.org>
Delivered-To: listarch-gcc-bugs@gcc.gnu.org
Received: (qmail 8466 invoked by alias); 8 Oct 2014 13:58:14 -0000
Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm
Precedence: bulk
List-Id: <gcc-bugs.gcc.gnu.org>
List-Archive: <http://gcc.gnu.org/ml/gcc-bugs/>
List-Post: <mailto:gcc-bugs@gcc.gnu.org>
List-Help: <mailto:gcc-bugs-help@gcc.gnu.org>
Sender: gcc-bugs-owner@gcc.gnu.org
Delivered-To: mailing list gcc-bugs@gcc.gnu.org
Received: (qmail 8435 invoked by uid 48); 8 Oct 2014 13:58:10 -0000
From: "mira.suk at centrum dot cz" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/63486] New: Magic Statics lock guard does not include registration into atexit handler
Date: Wed, 08 Oct 2014 13:58:00 -0000
X-Bugzilla-Reason: CC
X-Bugzilla-Type: new
X-Bugzilla-Watch-Reason: None
X-Bugzilla-Product: gcc
X-Bugzilla-Component: c++
X-Bugzilla-Version: 4.8.2
X-Bugzilla-Keywords:
X-Bugzilla-Severity: normal
X-Bugzilla-Who: mira.suk at centrum dot cz
X-Bugzilla-Status: UNCONFIRMED
X-Bugzilla-Priority: P3
X-Bugzilla-Assigned-To: unassigned at gcc dot gnu.org
X-Bugzilla-Target-Milestone: ---
X-Bugzilla-Flags:
X-Bugzilla-Changed-Fields: bug_id short_desc product version bug_status bug_severity priority component assigned_to reporter
Message-ID: <bug-63486-4@http.gcc.gnu.org/bugzilla/>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/
Auto-Submitted: auto-generated
MIME-Version: 1.0
X-SW-Source: 2014-10/txt/msg00585.txt.bz2
Content-length: 13969

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63486

            Bug ID: 63486
           Summary: Magic Statics lock guard does not include registration
                    into atexit handler
           Product: gcc
           Version: 4.8.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: mira.suk at centrum dot cz

void test()
{                                                                              
  static std::string x;
}

If I'm reading assembly right _cxa_atexit handler is not called inside lock
which could result in static variable being destructed multiple times.

Is compiled into following with -g3

   |0x401312 <test()>       push   %rbp                                        
                                                                        │
   │0x401313 <test()+1>     mov    %rsp,%rbp                                   
                                                                        │
   │0x401316 <test()+4>     push   %r12                                        
                                                                        │
   │0x401318 <test()+6>     push   %rbx                                        
                                                                        │
   |0x401319 <test()+7>     lea    0x202e10(%rip),%rax        # 0x604130
<_ZGVZ4testvE1x>                                                              
│
   │0x401320 <test()+14>    movzbl (%rax),%eax                                 
                                                                        │
   │0x401323 <test()+17>    test   %al,%al                                     
                                                                        │
   │0x401325 <test()+19>    jne    0x401398 <test()+134>                       
                                                                               
        │
   │0x401327 <test()+21>    lea    0x202e02(%rip),%rdi        # 0x604130
<_ZGVZ4testvE1x>                                                               
               │
   │0x40132e <test()+28>    callq  0x400c40 <__cxa_guard_acquire@plt>          
                                                                               
        │
   │0x401333 <test()+33>    test   %eax,%eax                                   
                                                                               
        │
   │0x401335 <test()+35>    setne  %al                                         
                                                                               
        │
   │0x401338 <test()+38>    test   %al,%al                                     
                                                                               
        │
   │0x40133a <test()+40>    je     0x401398 <test()+134>                       
                                                                               
        │
   │0x40133c <test()+42>    mov    $0x0,%r12d                                  
                                                                               
        │
   │0x401342 <test()+48>    lea    0x202dff(%rip),%rdi        # 0x604148
<_ZZ4testvE1x>                                                                 
               │
   │0x401349 <test()+55>    callq  0x400c20 <_ZNSsC1Ev@plt>                    
                                                                               
        │
   │0x40134e <test()+60>    lea    0x202ddb(%rip),%rdi        # 0x604130
<_ZGVZ4testvE1x>                                                               
               │
   │0x401355 <test()+67>    callq  0x400cb0 <__cxa_guard_release@plt>          
                                                                               
        │
   │0x40135a <test()+72>    lea    0x202d87(%rip),%rdx        # 0x6040e8       
                                                                               
        │
   │0x401361 <test()+79>    lea    0x202de0(%rip),%rsi        # 0x604148
<_ZZ4testvE1x>                                                                 
               │
   │0x401368 <test()+86>    mov    0x202c81(%rip),%rax        # 0x603ff0       
                                                                               
        │
   │0x40136f <test()+93>    mov    %rax,%rdi                                   
                                                                               
        │
   │0x401372 <test()+96>    callq  0x400ef1 <__cxa_atexit(void (*)(void*),
void*, void*)>                                                                 
             │
   │0x401377 <test()+101>   jmp    0x401398 <test()+134>                       
                                                                               
        │
   │0x401379 <test()+103>   mov    %rax,%rbx                                   
                                                                               
        │
   │0x40137c <test()+106>   test   %r12b,%r12b                                 
                                                                               
        │
   │0x40137f <test()+109>   jne    0x40138d <test()+123>                       
                                                                               
        │
   │0x401381 <test()+111>   lea    0x202da8(%rip),%rdi        # 0x604130
<_ZGVZ4testvE1x>                                                               
               │
   │0x401388 <test()+118>   callq  0x400d10 <__cxa_guard_abort@plt>            
                                                                               
        │
   │0x40138d <test()+123>   mov    %rbx,%rax                                   
                                                                               
        │
   │0x401390 <test()+126>   mov    %rax,%rdi                                   
                                                                               
        │
   │0x401393 <test()+129>   callq  0x400d70 <_Unwind_Resume@plt>               
                                                                               
        │
   │0x401398 <test()+134>   pop    %rbx                                        
                                                                               
        │
   │0x401399 <test()+135>   pop    %r12                                        
                                                                               
        │
   │0x40139b <test()+137>   pop    %rbp                                        
                                                                               
        │
>From gcc-bugs-return-463566-listarch-gcc-bugs=gcc.gnu.org@gcc.gnu.org Wed Oct 08 14:03:49 2014
Return-Path: <gcc-bugs-return-463566-listarch-gcc-bugs=gcc.gnu.org@gcc.gnu.org>
Delivered-To: listarch-gcc-bugs@gcc.gnu.org
Received: (qmail 16921 invoked by alias); 8 Oct 2014 14:03:49 -0000
Mailing-List: contact gcc-bugs-help@gcc.gnu.org; run by ezmlm
Precedence: bulk
List-Id: <gcc-bugs.gcc.gnu.org>
List-Archive: <http://gcc.gnu.org/ml/gcc-bugs/>
List-Post: <mailto:gcc-bugs@gcc.gnu.org>
List-Help: <mailto:gcc-bugs-help@gcc.gnu.org>
Sender: gcc-bugs-owner@gcc.gnu.org
Delivered-To: mailing list gcc-bugs@gcc.gnu.org
Received: (qmail 16882 invoked by uid 55); 8 Oct 2014 14:03:46 -0000
From: "ian at gcc dot gnu.org" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug go/60406] recover.go: test13reflect2 test failure
Date: Wed, 08 Oct 2014 14:03:00 -0000
X-Bugzilla-Reason: CC
X-Bugzilla-Type: changed
X-Bugzilla-Watch-Reason: None
X-Bugzilla-Product: gcc
X-Bugzilla-Component: go
X-Bugzilla-Version: 4.9.0
X-Bugzilla-Keywords:
X-Bugzilla-Severity: normal
X-Bugzilla-Who: ian at gcc dot gnu.org
X-Bugzilla-Status: NEW
X-Bugzilla-Priority: P3
X-Bugzilla-Assigned-To: ian at airs dot com
X-Bugzilla-Target-Milestone: ---
X-Bugzilla-Flags:
X-Bugzilla-Changed-Fields:
Message-ID: <bug-60406-4-bfj85PJtQh@http.gcc.gnu.org/bugzilla/>
In-Reply-To: <bug-60406-4@http.gcc.gnu.org/bugzilla/>
References: <bug-60406-4@http.gcc.gnu.org/bugzilla/>
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: 7bit
X-Bugzilla-URL: http://gcc.gnu.org/bugzilla/
Auto-Submitted: auto-generated
MIME-Version: 1.0
X-SW-Source: 2014-10/txt/msg00587.txt.bz2
Content-length: 641

https://gcc.gnu.org/bugzilla/show_bug.cgi?id`406

--- Comment #27 from ian at gcc dot gnu.org <ian at gcc dot gnu.org> ---
Author: ian
Date: Wed Oct  8 14:03:13 2014
New Revision: 216003

URL: https://gcc.gnu.org/viewcvs?rev!6003&root=gcc&view=rev
Log:
    PR go/60406
runtime: Check callers in can_recover if return address    doesn't match.

Also use __builtin_extract_return_address and tighten up the
checks in FFI code.

Fixes PR 60406.

Modified:
    trunk/libgo/go/reflect/makefunc_ffi_c.c
    trunk/libgo/runtime/go-defer.c
    trunk/libgo/runtime/go-panic.h
    trunk/libgo/runtime/go-recover.c
    trunk/libgo/runtime/panic.c


  parent reply	other threads:[~2014-10-08 13:44 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-03-04  7:30 [Bug go/60406] New: reflect.go:test13reflect2 " vogt at linux dot vnet.ibm.com
2014-08-06 17:04 ` [Bug go/60406] recover.go: test13reflect2 " ubizjak at gmail dot com
2014-08-07  8:47 ` ubizjak at gmail dot com
2014-08-07 10:34 ` ubizjak at gmail dot com
2014-09-04 15:52 ` ian at airs dot com
2014-09-05  7:15 ` vogt at linux dot vnet.ibm.com
2014-09-16 20:57 ` boger at us dot ibm.com
2014-09-22 20:57 ` boger at us dot ibm.com
2014-09-23 13:34 ` bergner at gcc dot gnu.org
2014-09-29 13:17 ` boger at us dot ibm.com
2014-10-03 22:59 ` ian at airs dot com
2014-10-06 15:43 ` vogt at linux dot vnet.ibm.com
2014-10-06 15:48 ` boger at us dot ibm.com
2014-10-07  9:12 ` vogt at linux dot vnet.ibm.com
2014-10-07 13:56 ` ian at airs dot com
2014-10-07 18:25 ` ian at airs dot com
2014-10-08  5:49 ` ubizjak at gmail dot com
2014-10-08  8:12 ` vogt at linux dot vnet.ibm.com
2014-10-08 10:13 ` vogt at linux dot vnet.ibm.com
2014-10-08 13:28 ` ian at airs dot com
2014-10-08 13:44 ` ian at airs dot com [this message]
2014-10-08 14:15 ` ian at airs dot com
2014-10-28  8:55 ` vogt at linux dot vnet.ibm.com

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-60406-4-poS1GN1TZi@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).