This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[GOOGLE] Fix LIPO resolved node reference fixup

This patch makes a fix to the reference fixups performed after LIPO
node resolution, to better handle the case where we are updating the
base address of a reference.

Fixes google benchmark and passes regression tests. Ok for google/4_9?


2014-10-24  Teresa Johnson  <>

        Google ref b/18110567.
        * cgraphbuild.c (get_base_address_expr): New function.
        (fixup_ref): Update the op expression for new base address.

Index: cgraphbuild.c
--- cgraphbuild.c       (revision 216667)
+++ cgraphbuild.c       (working copy)
@@ -665,13 +665,35 @@ record_references_in_initializer (tree decl, bool
   pointer_set_destroy (visited_nodes);

+/* Similar to get_base_address but returns the ADDR_EXPR pointing
+   to the base address corresponding to T.  */
+static tree
+get_base_address_expr (tree t)
+  while (handled_component_p (t))
+    t = TREE_OPERAND (t, 0);
+  if ((TREE_CODE (t) == MEM_REF
+       || TREE_CODE (t) == TARGET_MEM_REF)
+      && TREE_CODE (TREE_OPERAND (t, 0)) == ADDR_EXPR)
+    return TREE_OPERAND (t, 0);
+  return NULL_TREE;
 /* Update any function decl references in base ADDR of operand OP to refer to
    the resolved node.  */

 static bool
 fixup_ref (gimple, tree addr, tree op)
+  tree orig_addr = addr;
   addr = get_base_address (addr);
+  /* If the address was changed, update the operand OP to be the
+     ADDR_EXPR pointing to the new base address.  */
+  if (orig_addr != addr)
+    op = get_base_address_expr (orig_addr);
   if (addr && TREE_CODE (addr) == FUNCTION_DECL)
       gcc_assert (TREE_CODE (op) == ADDR_EXPR);

Teresa Johnson | Software Engineer | | 408-460-2413

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]