This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[google] fix for undefined location list symbol in LIPO (issue5355042)
- From: xur at google dot com (Rong Xu)
- To: reply at codereview dot appspotmail dot com, gcc-patches at gcc dot gnu dot org
- Date: Fri, 4 Nov 2011 10:13:13 -0700 (PDT)
- Subject: [google] fix for undefined location list symbol in LIPO (issue5355042)
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