Hi, This patch fixes instrumentation thunk recognition condition in lto_output. This avoids missing required thunks in ltrans modules. Bootstrapped and regtested on x86_64-pc-linux-gnu. Committed to trunk.
Thanks, Ilya -- gcc/ 2016-02-12 Ilya Enkovich <enkovich....@gmail.com> PR target/69729 * lto-streamer-out.c (lto_output): Use thunk.add_pointer_bounds_args to correctly determine instrumentation thunks. gcc/testsuite/ 2016-02-12 Ilya Enkovich <enkovich....@gmail.com> * g++.dg/lto/lto.exp: Include and init mpx. * g++.dg/lto/pr69729_0.C: New test. diff --git a/gcc/lto-streamer-out.c b/gcc/lto-streamer-out.c index 6bb76cc..997a28b 100644 --- a/gcc/lto-streamer-out.c +++ b/gcc/lto-streamer-out.c @@ -2321,7 +2321,7 @@ lto_output (void) { if (lto_symtab_encoder_encode_body_p (encoder, node) && !node->alias - && (!node->thunk.thunk_p || !node->instrumented_version)) + && (!node->thunk.thunk_p || !node->thunk.add_pointer_bounds_args)) { if (flag_checking) { diff --git a/gcc/testsuite/g++.dg/lto/lto.exp b/gcc/testsuite/g++.dg/lto/lto.exp index 8d99418..48f0947 100644 --- a/gcc/testsuite/g++.dg/lto/lto.exp +++ b/gcc/testsuite/g++.dg/lto/lto.exp @@ -31,6 +31,7 @@ if $tracelevel then { load_lib standard.exp load_lib g++.exp load_lib target-libpath.exp +load_lib mpx-dg.exp # Load the language-independent compabibility support procedures. load_lib lto.exp @@ -42,6 +43,7 @@ if { ![check_effective_target_lto] } { g++_init lto_init no-mathlib +mpx_init # Define an identifier for use with this suite to avoid name conflicts # with other lto tests running at the same time. @@ -57,4 +59,5 @@ foreach src [lsort [find $srcdir/$subdir *_0.\[cC\]]] { lto-execute $src $sid } +mpx_finish lto_finish diff --git a/gcc/testsuite/g++.dg/lto/pr69729_0.C b/gcc/testsuite/g++.dg/lto/pr69729_0.C new file mode 100644 index 0000000..b736406 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr69729_0.C @@ -0,0 +1,35 @@ +/* { dg-lto-do link } */ +/* { dg-require-effective-target mpx } */ +/* { dg-lto-options {{-fcheck-pointer-bounds -mmpx -flto -flto-partition=max}} } */ + +class cl1 +{ + public: + virtual ~cl1 () { }; +}; + +class cl2 +{ + public: + virtual ~cl2 () { }; +}; + +class cl3 : cl1, cl2 +{ +}; + +class cl4 : cl3 +{ + public: + ~cl4 (); +}; + +cl4::~cl4 () +{ +} + +int main (int argc, char **argv) +{ + cl4 c; + return 0; +}