[google] fix for undefined location list symbol in LIPO (issue5355042)
Xinliang David Li
davidxl@google.com
Fri Nov 4 17:54:00 GMT 2011
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
>
More information about the Gcc-patches
mailing list