|
|
Created:
12 years, 6 months ago by xur Modified:
12 years, 6 months ago CC:
gcc-patches_gcc.gnu.org Base URL:
svn+ssh://gcc.gnu.org/svn/gcc/branches/google/main/ Visibility:
Public. |
Patch Set 1 #
MessagesTotal messages: 4
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
Sign in to reply to this message.
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 >
Sign in to reply to this message.
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.
Sign in to reply to this message.
>> 2011-11-04 Rong Xu <xur@google.com> >> >> * gcc/dwarf2out.c (dwarf2out_decl): not emit type info >> for unreachable functions in LIPO mode. Here's a follow-on patch to fix the build breakage caused by the declaration in the middle of a block. It also fixes up the style complaints that Diego mentioned. I won't be able to commit this, so could someone else take care of it? I'd check it in as obvious, but I'm about to leave the country, and didn't want to commit and run. -cary Index: dwarf2out.c =================================================================== --- dwarf2out.c (revision 181007) +++ dwarf2out.c (working copy) @@ -21424,8 +21424,10 @@ dwarf2out_imported_module_or_decl (tree void dwarf2out_decl (tree decl) { + dw_die_ref context_die; + /* In LIPO mode, we may output some functions whose type is defined - in another function that will not be output. This can result in + 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 @@ -21435,8 +21437,8 @@ dwarf2out_decl (tree decl) tree decl_context, orig_decl; decl_context = DECL_CONTEXT (decl); - while (decl_context && - TREE_CODE (decl_context) != TRANSLATION_UNIT_DECL) + while (decl_context + && TREE_CODE (decl_context) != TRANSLATION_UNIT_DECL) { struct cgraph_node *node; @@ -21447,17 +21449,17 @@ dwarf2out_decl (tree 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)) + 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 (); + context_die = comp_unit_die (); switch (TREE_CODE (decl)) {
Sign in to reply to this message.
|