patches/gcc/3.4.6/190-all_sh-pr16665-fix.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Oct 03 23:10:46 2010 +0200 (2010-10-03)
changeset 2130 b46ecc90d3ab
parent 402 197e1b49586e
permissions -rw-r--r--
complibs: better deduce whether to backup complibs or not

To decide whether we need to backup the companion libraries,
do not rely on the !shared case. In the future other cases
may require not to save the companion libraries (eg. if using
the ones provided by the host distro).

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
     1 diff -durN gcc-3.4.6.orig/gcc/config/sh/sh.c gcc-3.4.6/gcc/config/sh/sh.c
     2 --- gcc-3.4.6.orig/gcc/config/sh/sh.c	2004-09-03 08:51:30.000000000 +0200
     3 +++ gcc-3.4.6/gcc/config/sh/sh.c	2007-08-15 23:01:48.000000000 +0200
     4 @@ -9107,6 +9107,15 @@
     5      }
     6    this = FUNCTION_ARG (cum, Pmode, ptr_type_node, 1);
     7  
     8 +  /* In PIC case, we set PIC register to compute the target address.  We
     9 +     can use a scratch register to save and restore the original value  
    10 +     except for SHcompact.  For SHcompact, use stack.  */
    11 +  if (flag_pic && TARGET_SHCOMPACT)
    12 +    {
    13 +      push (PIC_OFFSET_TABLE_REGNUM);
    14 +      emit_insn (gen_GOTaddr2picreg ());
    15 +    }
    16 +
    17    /* For SHcompact, we only have r0 for a scratch register: r1 is the
    18       static chain pointer (even if you can't have nested virtual functions
    19       right now, someone might implement them sometime), and the rest of the
    20 @@ -9189,8 +9198,24 @@
    21        assemble_external (function);
    22        TREE_USED (function) = 1;
    23      }
    24 +  /* We can use scratch1 to save and restore the original value of
    25 +     PIC register except for SHcompact.  */
    26 +  if (flag_pic && ! TARGET_SHCOMPACT)
    27 +    {
    28 +      emit_move_insn (scratch1,
    29 +		      gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM));
    30 +      emit_insn (gen_GOTaddr2picreg ());
    31 +    }
    32    funexp = XEXP (DECL_RTL (function), 0);
    33    emit_move_insn (scratch2, funexp);
    34 +  if (flag_pic)
    35 +    {
    36 +      if (! TARGET_SHCOMPACT)
    37 +	emit_move_insn (gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM),
    38 +			scratch1);
    39 +      else
    40 +	pop (PIC_OFFSET_TABLE_REGNUM);
    41 +    }
    42    funexp = gen_rtx_MEM (FUNCTION_MODE, scratch2);
    43    sibcall = emit_call_insn (gen_sibcall (funexp, const0_rtx, NULL_RTX));
    44    SIBLING_CALL_P (sibcall) = 1;