This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [GOOGLE] Fix LIPO resolved node reference fixup
- From: Xinliang David Li <davidxl at google dot com>
- To: Teresa Johnson <tejohnson at google dot com>
- Cc: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 24 Oct 2014 10:55:13 -0700
- Subject: Re: [GOOGLE] Fix LIPO resolved node reference fixup
- Authentication-results: sourceware.org; auth=none
- References: <CAAe5K+X6PU5k04_ki+pouuUmgdFiFn75GvLpgJzqvVYmdAm6Qw at mail dot gmail dot com>
When orgin_addr == addr, is there a guarantee that this assert:
gcc_assert (TREE_OPERAND (op,0) == addr);
is always true?
David
On Fri, Oct 24, 2014 at 10:21 AM, Teresa Johnson <tejohnson@google.com> wrote:
> 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?
>
> Thanks,
> Teresa
>
> 2014-10-24 Teresa Johnson <tejohnson@google.com>
>
> 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 | tejohnson@google.com | 408-460-2413