Introduce target-specific LDFLAGS, the same way we have CFLAGS for the target.
It seems to be helping gcc somewhat into telling the correct endianness to ld that sticks with little endian even when the target is big (eg armeb-unknown-linux-uclibcgnueabi).
There's still work to do, especially finish the gcc part that is not in this commit.
/trunk/scripts/functions | 9 7 2 0 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
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
6 this = FUNCTION_ARG (cum, Pmode, ptr_type_node, 1);
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)
13 + push (PIC_OFFSET_TABLE_REGNUM);
14 + emit_insn (gen_GOTaddr2picreg ());
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;
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)
28 + emit_move_insn (scratch1,
29 + gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM));
30 + emit_insn (gen_GOTaddr2picreg ());
32 funexp = XEXP (DECL_RTL (function), 0);
33 emit_move_insn (scratch2, funexp);
36 + if (! TARGET_SHCOMPACT)
37 + emit_move_insn (gen_rtx_REG (Pmode, PIC_OFFSET_TABLE_REGNUM),
40 + pop (PIC_OFFSET_TABLE_REGNUM);
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;