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/arm/arm.c gcc-3.4.6/gcc/config/arm/arm.c
2 --- gcc-3.4.6.orig/gcc/config/arm/arm.c 2007-08-15 22:56:20.000000000 +0200
3 +++ gcc-3.4.6/gcc/config/arm/arm.c 2007-08-15 22:56:20.000000000 +0200
5 return_used_this_function = 0;
8 +/* Return the number (counting from 0) of
9 + the least significant set bit in MASK. */
15 +number_of_first_bit_set (mask)
21 + (mask & (1 << bit)) == 0;
29 arm_output_epilogue (rtx sibling)
31 @@ -8757,27 +8777,47 @@
32 saved_regs_mask |= (1 << PC_REGNUM);
35 - /* Load the registers off the stack. If we only have one register
36 - to load use the LDR instruction - it is faster. */
37 - if (saved_regs_mask == (1 << LR_REGNUM))
39 - /* The exception handler ignores the LR, so we do
40 - not really need to load it off the stack. */
42 - asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM);
44 - asm_fprintf (f, "\tldr\t%r, [%r], #4\n", LR_REGNUM, SP_REGNUM);
46 - else if (saved_regs_mask)
47 + if (saved_regs_mask)
49 - if (saved_regs_mask & (1 << SP_REGNUM))
50 - /* Note - write back to the stack register is not enabled
51 - (ie "ldmfd sp!..."). We know that the stack pointer is
52 - in the list of registers and if we add writeback the
53 - instruction becomes UNPREDICTABLE. */
54 - print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask);
55 + /* Load the registers off the stack. If we only have one register
56 + to load use the LDR instruction - it is faster. */
57 + if (bit_count (saved_regs_mask) == 1)
59 + int reg = number_of_first_bit_set (saved_regs_mask);
64 + /* Mustn't use base writeback when loading SP. */
65 + asm_fprintf (f, "\tldr\t%r, [%r]\n", SP_REGNUM, SP_REGNUM);
71 + /* The exception handler ignores the LR, so we do
72 + not really need to load it off the stack. */
73 + asm_fprintf (f, "\tadd\t%r, %r, #4\n", SP_REGNUM, SP_REGNUM);
76 + /* else fall through */
79 + asm_fprintf (f, "\tldr\t%r, [%r], #4\n", reg, SP_REGNUM);
84 - print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask);
86 + if (saved_regs_mask & (1 << SP_REGNUM))
87 + /* Note - write back to the stack register is not enabled
88 + (ie "ldmfd sp!..."). We know that the stack pointer is
89 + in the list of registers and if we add writeback the
90 + instruction becomes UNPREDICTABLE. */
91 + print_multi_reg (f, "ldmfd\t%r", SP_REGNUM, saved_regs_mask);
93 + print_multi_reg (f, "ldmfd\t%r!", SP_REGNUM, saved_regs_mask);
97 if (current_function_pretend_args_size)
98 @@ -11405,22 +11445,6 @@
102 -/* Return the number (counting from 0) of
103 - the least significant set bit in MASK. */
106 -number_of_first_bit_set (int mask)
111 - (mask & (1 << bit)) == 0;
118 /* Generate code to return from a thumb function.
119 If 'reg_containing_return_addr' is -1, then the return address is
120 actually on the stack, at the stack pointer. */