> On Sep 26, 2018, at 11:02 AM, Jan Hubicka <hubi...@ucw.cz> wrote: > >>> Not sure >>> what 'internal' would mean in this context. >>> >>> But then the implementation looks at callee->externally_visible which >>> matches hidden visibility... externally_visible is probably not >>> the very best thing to look at depending on what we intend to do. >> >> from the comments of callee->externally_visible in cgraph.h: >> >> /* Set when function is visible by other units. */ >> unsigned externally_visible : 1; >> >> My understand of this “externally_visible” is: >> >> this function is visible from other compilation units. >> >> Is this correct? > > Yes, but the catch is that we may "localize" previously visible function into > invisible by clonning, see my previous email.
Yes, these are the cases that we need to take care carefully. >>> Note you shouldn't look at individual cgraph_node fields but use >>> some of the accessors with more well-constrained semantics. >>> Why are you not simply checking !TREE_PUBLIC? >> >> Yes, looks like that TREE_PUBLIC(node->decl) might be better for this >> purpose. > > externally_visible is better approximation, TREE_PUBLIC is false i.e. for > weakref aliases. But we need to check places where externally visible > functions > are turned to local. So, do you suggest to make all the optimizations that might turn external visible functions into local as incompatible with -finline-only-static? (a possible list of such optimizations include cloning, ipa-cp, ipa-sra, etc?) > > What about comdats in general? What is the intended behaviour? If you prevent > inlining them completely, C++ programs will be very slow. > Also we still can analyze the body and derive some facts about them to drive > optimization (such as discovering that they are const/pure etc). Do we want > to disable this too? my current understanding of comdat functions is: they are external visible initially, but under some special situation, (for example, comdat_can_be_unshared_p + in_lto_p), they can be converted to local by the compiler. so, for most of the comdat functions, they are NOT inlined by the current implementation if -finline-only-static is specified due to they are externally_visible. I am not sure whether it’s necessary to change this current behavior for comdat functions, I assume that most of the applications for online patching are not written by C++, not sure whether this assumption is reasonable or not? any suggestion? thanks. Qing > Honza