Message ID | 20111104171313.E19E2C2525@rong.mtv.corp.google.com |
---|---|
State | New |
Headers | show |
Ok for google branches. David On Fri, Nov 4, 2011 at 10:13 AM, Rong Xu <xur@google.com> wrote: > Don't emit the type info if a function's context type is not > output. > > For google branch only. > > Tested with internal benchmark suite with -g. > > 2011-11-04 Rong Xu <xur@google.com> > > * gcc/dwarf2out.c (dwarf2out_decl): not emit type info > for unreachable functions in LIPO mode. > > Index: gcc/dwarf2out.c > =================================================================== > --- gcc/dwarf2out.c (revision 180964) > +++ gcc/dwarf2out.c (working copy) > @@ -95,6 +95,7 @@ > #include "tree-flow.h" > #include "cfglayout.h" > #include "opts.h" > +#include "l-ipo.h" > > static void dwarf2out_source_line (unsigned int, const char *, int, bool); > static rtx last_var_location_insn; > @@ -19745,6 +19746,39 @@ > void > dwarf2out_decl (tree decl) > { > + /* In LIPO mode, we may output some functions whose type is defined > + in another function that will not be output. This can result in > + undefined location list symbols in the debug type info. > + Here we disable the output of the type info for this case. > + It is safe since this function and its debug info should never > + be referenced. */ > + if (L_IPO_COMP_MODE) > + { > + tree decl_context, orig_decl; > + > + decl_context = DECL_CONTEXT (decl); > + while (decl_context && > + TREE_CODE (decl_context) != TRANSLATION_UNIT_DECL) > + { > + struct cgraph_node *node; > + > + orig_decl = DECL_ORIGIN (decl_context); > + while (orig_decl != DECL_ORIGIN (orig_decl)) > + orig_decl = DECL_ORIGIN (orig_decl); > + > + /* Refer to cgraph_mark_functions_to_output() in cgraphunit.c, > + if cgraph_is_aux_decl_external() is true, > + this function will not be output in LIPO mode. */ > + if (TREE_CODE (decl_context) == FUNCTION_DECL && > + TREE_PUBLIC (decl_context) && > + (node = cgraph_get_node (decl_context)) && > + cgraph_is_aux_decl_external (node)) > + return; > + > + decl_context = DECL_CONTEXT (orig_decl); > + } > + } > + > dw_die_ref context_die = comp_unit_die (); > > switch (TREE_CODE (decl)) > > -- > This patch is available for review at http://codereview.appspot.com/5355042 >
On Fri, Nov 4, 2011 at 13:13, Rong Xu <xur@google.com> wrote: > Don't emit the type info if a function's context type is not > output. > > For google branch only. > > Tested with internal benchmark suite with -g. > > 2011-11-04 Rong Xu <xur@google.com> > > * gcc/dwarf2out.c (dwarf2out_decl): not emit type info > for unreachable functions in LIPO mode. > > Index: gcc/dwarf2out.c > =================================================================== > --- gcc/dwarf2out.c (revision 180964) > +++ gcc/dwarf2out.c (working copy) > @@ -95,6 +95,7 @@ > #include "tree-flow.h" > #include "cfglayout.h" > #include "opts.h" > +#include "l-ipo.h" > > static void dwarf2out_source_line (unsigned int, const char *, int, bool); > static rtx last_var_location_insn; > @@ -19745,6 +19746,39 @@ > void > dwarf2out_decl (tree decl) > { > + /* In LIPO mode, we may output some functions whose type is defined > + in another function that will not be output. This can result in > + undefined location list symbols in the debug type info. > + Here we disable the output of the type info for this case. > + It is safe since this function and its debug info should never > + be referenced. */ > + if (L_IPO_COMP_MODE) > + { > + tree decl_context, orig_decl; > + > + decl_context = DECL_CONTEXT (decl); > + while (decl_context && > + TREE_CODE (decl_context) != TRANSLATION_UNIT_DECL) && goes on the line below. > + { > + struct cgraph_node *node; > + > + orig_decl = DECL_ORIGIN (decl_context); > + while (orig_decl != DECL_ORIGIN (orig_decl)) > + orig_decl = DECL_ORIGIN (orig_decl); > + > + /* Refer to cgraph_mark_functions_to_output() in cgraphunit.c, > + if cgraph_is_aux_decl_external() is true, > + this function will not be output in LIPO mode. */ > + if (TREE_CODE (decl_context) == FUNCTION_DECL && > + TREE_PUBLIC (decl_context) && > + (node = cgraph_get_node (decl_context)) && > + cgraph_is_aux_decl_external (node)) Likewise. Diego.
Index: gcc/dwarf2out.c =================================================================== --- gcc/dwarf2out.c (revision 180964) +++ gcc/dwarf2out.c (working copy) @@ -95,6 +95,7 @@ #include "tree-flow.h" #include "cfglayout.h" #include "opts.h" +#include "l-ipo.h" static void dwarf2out_source_line (unsigned int, const char *, int, bool); static rtx last_var_location_insn; @@ -19745,6 +19746,39 @@ void dwarf2out_decl (tree decl) { + /* In LIPO mode, we may output some functions whose type is defined + in another function that will not be output. This can result in + undefined location list symbols in the debug type info. + Here we disable the output of the type info for this case. + It is safe since this function and its debug info should never + be referenced. */ + if (L_IPO_COMP_MODE) + { + tree decl_context, orig_decl; + + decl_context = DECL_CONTEXT (decl); + while (decl_context && + TREE_CODE (decl_context) != TRANSLATION_UNIT_DECL) + { + struct cgraph_node *node; + + orig_decl = DECL_ORIGIN (decl_context); + while (orig_decl != DECL_ORIGIN (orig_decl)) + orig_decl = DECL_ORIGIN (orig_decl); + + /* Refer to cgraph_mark_functions_to_output() in cgraphunit.c, + if cgraph_is_aux_decl_external() is true, + this function will not be output in LIPO mode. */ + if (TREE_CODE (decl_context) == FUNCTION_DECL && + TREE_PUBLIC (decl_context) && + (node = cgraph_get_node (decl_context)) && + cgraph_is_aux_decl_external (node)) + return; + + decl_context = DECL_CONTEXT (orig_decl); + } + } + dw_die_ref context_die = comp_unit_die (); switch (TREE_CODE (decl))