On 01/09/2017 07:38 PM, David Malcolm wrote:
The RTL backend code is full of singleton state, so we have to handle
functions as soon as we parse them. This requires various special-casing
in the callgraph code.
gcc/ChangeLog:
* cgraph.h (symtab_node::native_rtl_p): New decl.
* cgraphunit.c (symtab_node::native_rtl_p): New function.
(symtab_node::needed_p): Don't assert for early assembly output
for __RTL functions.
(cgraph_node::finalize_function): Set "force_output" for __RTL
functions.
(cgraph_node::analyze): Bail out early for __RTL functions.
(analyze_functions): Update assertion to support __RTL functions.
(cgraph_node::expand): Bail out early for __RTL functions.
* gimple-expr.c: Include "tree-pass.h".
(gimple_has_body_p): Return false for __RTL functions.
---
gcc/cgraph.h | 4 ++++
gcc/cgraphunit.c | 41 ++++++++++++++++++++++++++++++++++++++---
gcc/gimple-expr.c | 3 ++-
3 files changed, 44 insertions(+), 4 deletions(-)
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 81a3ae9..ed699e1 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -568,6 +591,12 @@ cgraph_node::add_new_function (tree fndecl, bool
lowered)
void
cgraph_node::analyze (void)
{
+ if (native_rtl_p ())
+ {
+ analyzed = true;
+ return;
+ }
So my concern here would be how this interacts with the rest of the
cgraph machinery. Essentially you're saying we've built all the
properties for the given code. But AFAICT that can't be true and cgraph
isn't actually aware of any of the properties of the native RTL code
(even such things as what functions the native RTL code might call).
So I guess my question is how do you ensure that even though cgraph
hasn't looked at code that we're appropriately conservative with how the
file is processed? Particularly if there's other code in the source
file that is expected to interact with the RTL native code?
Jeff