> On 05/08/13 14:11, Jan Hubicka wrote:
>
> >With LTO we play more of similar tricks, by making use of the resolution
> >file.
> >I.e. for COMMON and EXTERNAL. Does it matter here?
>
> probably. It'd be a missed optimization though, rather than wrong code
> emission.
Well, the resolution info turns !bind_local_p into binds_local_p knowing the
fact that they was bound into non-LTO code from the same module. I think that
may also cause anchors to be confused.
>
> >
> >I would preffer the renaming excercise, since the name confused me few times,
> >too and the other predicate would be useful for IPA code :)
>
> before invoking sed, can we agree on the right names? I propose
>
> * renaming 'binds_local_p' to 'binds_module_p' (and any default
> implementations etc likewise). Keeps the semantics of returning
> true if the symbol is known to bind in the dynamic object or
> executable the current object file ends up in.
Sounds good to me.
>
> * a new function or hook 'binds_here_p' (and any default
> implementations needed). Returns true if the symbol is known to
> bind in the object file being emitted by the current compilation.
Thinking about it again, isn't decl_replaceable_p the thing you are looking for
here?
>
> 'here's not the best name, but sadly 'object' is overloaded and
> could mean the object being queried or the object file being
> emitted. Similarly 'translation unit' is too restrictive in LTO
> mode, where multiple TUs are in play. I'm open to a better name.
Hmm, the whole thing is even slightly more complicated, part of it is already
handles as part of symtab_availability infrastructure. We basicaly want to ask.
1) will be decl bound to current module?
- Now binds_local_p
- Proposed binds_module_p
- LLVM symbol->isLocalLinkage I think.
Useful primarily when generating references (IP relative or GOT/PLT based)
2) will be decl bound to particular definition in current unit
- Now decl_replaceable_p perhaps?
- Proposed binds_here_p.
- LLVM !symbol->isWeakForLinker i think.
this is useful for the anchors and also all optimizations that actually
needs to hack on the definition.
3) will be decl bound to definition that is equivalnet to one I am seeing?
This differs from 1) i.e. for C++ one-decl-rule functions, in particular
inlines.
- Now cgraph_body_availability (node) >= AVAIL_AVAILABLE for functions
const_value_known_p (node) for vairables.
plus there is somewhat confusing
cgraph_variable_initializer_availability
that should be removed.
- Proposed ???
- LLVM symbol->mayBeOverridden()
Useful for constant propagation, inlining and other stuff.
I wonder if we can come with something more clearly named.
When it comes to weird predicates on symbols, we also have
can_refer_decl_in_current_unit_p.
Honza
>
> Clearly these are related in that binds_here_p returning true
> implies binds_module_p being true, and binds_module_p returning
> false implies binds_here_p being false.
>
> Because of how gcc's currently structured the implementation of that
> new hook would be
> if (binds_local_p () && !WEAK ()) return true;
>
> * finally change default_use_anchors_p to use the new hook.
>
> thoughts?
>
> nathan