Message ID | 20110704180956.GV16443@tyan-ft48-01.lab.bos.redhat.com |
---|---|
State | New |
Headers | show |
On Mon, Jul 4, 2011 at 8:09 PM, Jakub Jelinek <jakub@redhat.com> wrote: > Hi! > > Before http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=168951 > set_mem_attributes_minus_bitpos would set MEM_NOTRAP_P for decls > based on whether they are DECL_WEAK or not, but now it is set only > from !tree_could_trap_p. > > These patches adjust tree_could_trap_p to say that references > to weak vars/functions may trap (for calls it was doing that already). > > The first version of the patch is intended for 4.7 and only handles > that way weak vars/functions that aren't known to be defined somewhere > (either in current CU, or in the CUs included in -flto build). > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > The second version is simplified one which always treats DECL_WEAK > vars as maybe trapping. Ok for 4.6? The trunk version is ok. For the 4.6 version, don't you need a CALL_EXPR case similar to the trunk version? Thanks, Richard. > Jakub >
On Tue, Jul 05, 2011 at 10:33:28AM +0200, Richard Guenther wrote: > On Mon, Jul 4, 2011 at 8:09 PM, Jakub Jelinek <jakub@redhat.com> wrote: > > The second version is simplified one which always treats DECL_WEAK > > vars as maybe trapping. Ok for 4.6? > > The trunk version is ok. For the 4.6 version, don't you need a CALL_EXPR > case similar to the trunk version? No, as the 4.6 version for FUNCTION_DECLs checks just DECL_WEAK and nothing else, what CALL_EXPR already checks is all that is needed. The reason why I've added recursion for CALL_EXPRs for trunk is so that all the FUNCTION_DECL/VAR_DECL cgraph/varpool lookups don't need to be duplicated. Jakub
On Tue, Jul 5, 2011 at 10:43 AM, Jakub Jelinek <jakub@redhat.com> wrote: > On Tue, Jul 05, 2011 at 10:33:28AM +0200, Richard Guenther wrote: >> On Mon, Jul 4, 2011 at 8:09 PM, Jakub Jelinek <jakub@redhat.com> wrote: >> > The second version is simplified one which always treats DECL_WEAK >> > vars as maybe trapping. Ok for 4.6? >> >> The trunk version is ok. For the 4.6 version, don't you need a CALL_EXPR >> case similar to the trunk version? > > No, as the 4.6 version for FUNCTION_DECLs checks just DECL_WEAK and nothing > else, what CALL_EXPR already checks is all that is needed. > The reason why I've added recursion for CALL_EXPRs for trunk is so that > all the FUNCTION_DECL/VAR_DECL cgraph/varpool lookups don't need to be > duplicated. Ah, yeah. Ok for 4.6 then. Thanks, Richard. > Jakub >
--- gcc/tree-eh.c.jj 2011-06-17 11:02:19.000000000 +0200 +++ gcc/tree-eh.c 2011-07-04 14:27:01.000000000 +0200 @@ -2449,8 +2449,42 @@ tree_could_trap_p (tree expr) case CALL_EXPR: t = get_callee_fndecl (expr); /* Assume that calls to weak functions may trap. */ - if (!t || !DECL_P (t) || DECL_WEAK (t)) + if (!t || !DECL_P (t)) return true; + if (DECL_WEAK (t)) + return tree_could_trap_p (t); + return false; + + case FUNCTION_DECL: + /* Assume that accesses to weak functions may trap, unless we know + they are certainly defined in current TU or in some other + LTO partition. */ + if (DECL_WEAK (expr)) + { + struct cgraph_node *node; + if (!DECL_EXTERNAL (expr)) + return false; + node = cgraph_function_node (cgraph_get_node (expr), NULL); + if (node && node->in_other_partition) + return false; + return true; + } + return false; + + case VAR_DECL: + /* Assume that accesses to weak vars may trap, unless we know + they are certainly defined in current TU or in some other + LTO partition. */ + if (DECL_WEAK (expr)) + { + struct varpool_node *node; + if (!DECL_EXTERNAL (expr)) + return false; + node = varpool_variable_node (varpool_get_node (expr), NULL); + if (node && node->in_other_partition) + return false; + return true; + } return false; default: